aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-04-28 20:27:21 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-04-28 20:27:21 +0000
commiteee365a564b09b6c3bc73a725fec924e552b9bd8 (patch)
treeebe8c7124d97c89aa99d0b3ef30fde8f4938789f
parent3df41cfbcf081b2f2719326b952830cf3d0c773c (diff)
parentcbb2e5b8c17298b127f20b3828d0ee609eea1b91 (diff)
downloadcurl-android12-mainline-tzdata-release.tar.gz
Change-Id: I6a6eaa54cec02ba069d12a61c3c89c89c50c2531
-rw-r--r--CHANGES10389
-rw-r--r--CMake/CurlSymbolHiding.cmake4
-rw-r--r--CMake/CurlTests.c10
-rw-r--r--CMake/FindGSS.cmake8
-rw-r--r--CMake/OtherTests.cmake75
-rw-r--r--CMake/Platforms/WindowsCache.cmake1
-rw-r--r--CMakeLists.txt56
-rw-r--r--METADATA8
-rw-r--r--Makefile.am13
-rw-r--r--OWNERS1
-rw-r--r--README6
-rw-r--r--RELEASE-NOTES495
-rw-r--r--aclocal.m4191
-rwxr-xr-xandroidconfigure4
-rw-r--r--buildconf.bat4
-rwxr-xr-xcompile13
-rwxr-xr-xconfigure2582
-rwxr-xr-xconfigure.ac776
-rwxr-xr-xdepcomp8
-rw-r--r--docs/ALTSVC.md64
-rw-r--r--docs/BINDINGS.md11
-rw-r--r--docs/BUG-BOUNTY.md106
-rw-r--r--docs/BUGS11
-rw-r--r--docs/CIPHERS.md27
-rw-r--r--docs/CODE_STYLE.md6
-rw-r--r--docs/DEPRECATE.md85
-rw-r--r--docs/ESNI.md139
-rw-r--r--docs/EXPERIMENTAL.md22
-rw-r--r--docs/FAQ31
-rw-r--r--docs/HTTP3.md115
-rw-r--r--docs/INSTALL.md70
-rw-r--r--docs/INTERNALS.md426
-rw-r--r--docs/KNOWN_BUGS115
-rw-r--r--docs/Makefile.am5
-rw-r--r--docs/PARALLEL-TRANSFERS.md58
-rw-r--r--docs/RELEASE-PROCEDURE.md11
-rw-r--r--docs/ROADMAP.md65
-rw-r--r--docs/SECURITY-PROCESS.md55
-rw-r--r--docs/SSL-PROBLEMS.md10
-rw-r--r--docs/THANKS129
-rw-r--r--docs/TODO282
-rw-r--r--docs/cmdline-opts/Makefile.inc8
-rw-r--r--docs/cmdline-opts/alt-svc.d2
-rw-r--r--docs/cmdline-opts/config.d14
-rw-r--r--docs/cmdline-opts/data.d2
-rw-r--r--docs/cmdline-opts/doh-url.d1
-rw-r--r--docs/cmdline-opts/dump-header.d2
-rw-r--r--docs/cmdline-opts/http0.9.d3
-rw-r--r--docs/cmdline-opts/http2.d1
-rw-r--r--docs/cmdline-opts/http3.d19
-rw-r--r--docs/cmdline-opts/key.d2
-rw-r--r--docs/cmdline-opts/no-progress-meter.d10
-rw-r--r--docs/cmdline-opts/parallel-max.d9
-rw-r--r--docs/cmdline-opts/parallel.d7
-rw-r--r--docs/cmdline-opts/pinnedpubkey.d6
-rw-r--r--docs/cmdline-opts/proto-redir.d9
-rw-r--r--docs/cmdline-opts/proto.d2
-rw-r--r--docs/cmdline-opts/proxy-tls13-ciphers.d4
-rw-r--r--docs/cmdline-opts/quote.d7
-rw-r--r--docs/cmdline-opts/retry.d3
-rw-r--r--docs/cmdline-opts/sasl-authzid.d11
-rw-r--r--docs/cmdline-opts/tls13-ciphers.d4
-rw-r--r--docs/cmdline-opts/tlsv1.0.d4
-rw-r--r--docs/cmdline-opts/tlsv1.1.d4
-rw-r--r--docs/cmdline-opts/tlsv1.2.d4
-rw-r--r--docs/curl-config.12
-rw-r--r--docs/curl.1121
-rw-r--r--docs/examples/Makefile.inc7
-rw-r--r--docs/examples/altsvc.c56
-rw-r--r--docs/examples/cacertinmem.c39
-rw-r--r--docs/examples/curlgtk.c8
-rw-r--r--docs/examples/curlx.c8
-rw-r--r--docs/examples/ephiperfifo.c62
-rw-r--r--docs/examples/evhiperfifo.c8
-rw-r--r--docs/examples/externalsocket.c2
-rw-r--r--docs/examples/fopen.c2
-rw-r--r--docs/examples/ftp-wildcard.c6
-rw-r--r--docs/examples/ftpgetinfo.c3
-rw-r--r--docs/examples/ghiper.c12
-rw-r--r--docs/examples/hiperfifo.c61
-rw-r--r--docs/examples/htmltidy.c15
-rw-r--r--docs/examples/htmltitle.cpp16
-rw-r--r--docs/examples/http2-download.c2
-rw-r--r--docs/examples/http2-upload.c2
-rw-r--r--docs/examples/http3-present.c47
-rw-r--r--docs/examples/http3.c54
-rw-r--r--docs/examples/imap-append.c13
-rw-r--r--docs/examples/imap-authzid.c71
-rw-r--r--docs/examples/multi-app.c6
-rw-r--r--docs/examples/multi-event.c240
-rw-r--r--docs/examples/multithread.c13
-rw-r--r--docs/examples/pop3-authzid.c70
-rw-r--r--docs/examples/postit2-formadd.c3
-rw-r--r--docs/examples/postit2.c3
-rw-r--r--docs/examples/resolve.c6
-rw-r--r--docs/examples/sampleconv.c5
-rw-r--r--docs/examples/sendrecv.c9
-rw-r--r--docs/examples/sftpuploadresume.c3
-rw-r--r--docs/examples/shared-connection-cache.c8
-rw-r--r--docs/examples/smooth-gtk-thread.c25
-rw-r--r--docs/examples/smtp-authzid.c161
-rw-r--r--docs/examples/smtp-mime.c17
-rw-r--r--docs/examples/sslbackend.c4
-rw-r--r--docs/examples/synctime.c33
-rw-r--r--docs/examples/threaded-shared-conn.c6
-rw-r--r--docs/examples/threaded-ssl.c15
-rw-r--r--docs/examples/usercertinmem.c30
-rw-r--r--docs/libcurl/Makefile.inc1
-rw-r--r--docs/libcurl/curl_easy_cleanup.32
-rw-r--r--docs/libcurl/curl_easy_duphandle.32
-rw-r--r--docs/libcurl/curl_easy_escape.32
-rw-r--r--docs/libcurl/curl_easy_getinfo.39
-rw-r--r--docs/libcurl/curl_easy_init.32
-rw-r--r--docs/libcurl/curl_easy_pause.32
-rw-r--r--docs/libcurl/curl_easy_perform.32
-rw-r--r--docs/libcurl/curl_easy_recv.32
-rw-r--r--docs/libcurl/curl_easy_reset.32
-rw-r--r--docs/libcurl/curl_easy_send.32
-rw-r--r--docs/libcurl/curl_easy_setopt.36
-rw-r--r--docs/libcurl/curl_easy_strerror.32
-rw-r--r--docs/libcurl/curl_easy_unescape.32
-rw-r--r--docs/libcurl/curl_escape.32
-rw-r--r--docs/libcurl/curl_formadd.32
-rw-r--r--docs/libcurl/curl_formfree.32
-rw-r--r--docs/libcurl/curl_formget.32
-rw-r--r--docs/libcurl/curl_free.32
-rw-r--r--docs/libcurl/curl_getdate.32
-rw-r--r--docs/libcurl/curl_getenv.32
-rw-r--r--docs/libcurl/curl_global_cleanup.32
-rw-r--r--docs/libcurl/curl_global_init.32
-rw-r--r--docs/libcurl/curl_global_init_mem.36
-rw-r--r--docs/libcurl/curl_global_sslset.32
-rw-r--r--docs/libcurl/curl_mime_addpart.32
-rw-r--r--docs/libcurl/curl_mime_data.32
-rw-r--r--docs/libcurl/curl_mime_data_cb.32
-rw-r--r--docs/libcurl/curl_mime_encoder.32
-rw-r--r--docs/libcurl/curl_mime_filedata.32
-rw-r--r--docs/libcurl/curl_mime_filename.32
-rw-r--r--docs/libcurl/curl_mime_free.32
-rw-r--r--docs/libcurl/curl_mime_headers.32
-rw-r--r--docs/libcurl/curl_mime_init.32
-rw-r--r--docs/libcurl/curl_mime_name.32
-rw-r--r--docs/libcurl/curl_mime_subparts.32
-rw-r--r--docs/libcurl/curl_mime_type.32
-rw-r--r--docs/libcurl/curl_mprintf.32
-rw-r--r--docs/libcurl/curl_multi_add_handle.32
-rw-r--r--docs/libcurl/curl_multi_assign.32
-rw-r--r--docs/libcurl/curl_multi_cleanup.32
-rw-r--r--docs/libcurl/curl_multi_fdset.32
-rw-r--r--docs/libcurl/curl_multi_info_read.32
-rw-r--r--docs/libcurl/curl_multi_init.32
-rw-r--r--docs/libcurl/curl_multi_perform.36
-rw-r--r--docs/libcurl/curl_multi_poll.3111
-rw-r--r--docs/libcurl/curl_multi_remove_handle.32
-rw-r--r--docs/libcurl/curl_multi_setopt.36
-rw-r--r--docs/libcurl/curl_multi_socket.32
-rw-r--r--docs/libcurl/curl_multi_socket_action.378
-rw-r--r--docs/libcurl/curl_multi_strerror.32
-rw-r--r--docs/libcurl/curl_multi_timeout.32
-rw-r--r--docs/libcurl/curl_multi_wait.36
-rw-r--r--docs/libcurl/curl_share_cleanup.32
-rw-r--r--docs/libcurl/curl_share_init.32
-rw-r--r--docs/libcurl/curl_share_setopt.38
-rw-r--r--docs/libcurl/curl_share_strerror.32
-rw-r--r--docs/libcurl/curl_slist_append.32
-rw-r--r--docs/libcurl/curl_slist_free_all.32
-rw-r--r--docs/libcurl/curl_strequal.32
-rw-r--r--docs/libcurl/curl_unescape.32
-rw-r--r--docs/libcurl/curl_url.32
-rw-r--r--docs/libcurl/curl_url_cleanup.32
-rw-r--r--docs/libcurl/curl_url_dup.32
-rw-r--r--docs/libcurl/curl_url_get.311
-rw-r--r--docs/libcurl/curl_url_set.323
-rw-r--r--docs/libcurl/curl_version.32
-rw-r--r--docs/libcurl/curl_version_info.3105
-rw-r--r--docs/libcurl/libcurl-easy.32
-rw-r--r--docs/libcurl/libcurl-env.32
-rw-r--r--docs/libcurl/libcurl-errors.36
-rw-r--r--docs/libcurl/libcurl-multi.37
-rw-r--r--docs/libcurl/libcurl-security.38
-rw-r--r--docs/libcurl/libcurl-share.32
-rw-r--r--docs/libcurl/libcurl-symbols.328
-rw-r--r--docs/libcurl/libcurl-thread.317
-rw-r--r--docs/libcurl/libcurl-tutorial.310
-rw-r--r--docs/libcurl/libcurl-url.32
-rw-r--r--docs/libcurl/libcurl.32
-rw-r--r--docs/libcurl/opts/CURLINFO_ACTIVESOCKET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONDITION_UNMET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.37
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_COOKIELIST.32
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HEADER_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_VERSION.311
-rw-r--r--docs/libcurl/opts/CURLINFO_LASTSOCKET.32
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_IP.32
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_PORT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_NUM_CONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLINFO_OS_ERRNO.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_IP.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_PORT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIVATE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_URL.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REQUEST_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RESPONSE_CODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RETRY_AFTER.364
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SCHEME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_ENGINES.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SESSION.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.328
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME.36
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.356
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING.312
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.36
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.328
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.37
-rw-r--r--docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.318
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC.36
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.311
-rw-r--r--docs/libcurl/opts/CURLOPT_APPEND.32
-rw-r--r--docs/libcurl/opts/CURLOPT_AUTOREFERER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAINFO.325
-rw-r--r--docs/libcurl/opts/CURLOPT_CAPATH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.331
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_ONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_TO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEJAR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIELIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIESESSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLF.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CURLU.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DIRLISTONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_INTERFACE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SERVERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.38
-rw-r--r--docs/libcurl/opts/CURLOPT_DOH_URL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_EGDSOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ERRORBUFFER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FAILONERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.37
-rw-r--r--docs/libcurl/opts/CURLOPT_FORBID_REUSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FRESH_CONNECT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPSSLAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_PRET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERFUNCTION.39
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADEROPT.36
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.312
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP200ALIASES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPGET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_VERSION.318
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERFACE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IPRESOLVE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEYPASSWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KRBLEVEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT.311
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXAGE_CONN.366
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXREDIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MIMEPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROGRESS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROXY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOSIGNAL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PATH_AS_IS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.314
-rw-r--r--docs/libcurl/opts/CURLOPT_PIPEWAIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POST.37
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTREDIR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PREQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PRE_PROXY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PRIVATE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROTOCOLS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERPWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAPATH.39
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.38
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.39
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.313
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.315
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.38
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_QUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RANDOM_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RANGE.312
-rw-r--r--docs/libcurl/opts/CURLOPT_READDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_READFUNCTION.338
-rw-r--r--docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.313
-rw-r--r--docs/libcurl/opts/CURLOPT_REFERER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_REQUEST.320
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.36
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_AUTHZID.364
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_IR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKDATA.36
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SHARE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLVERSION.39
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.38
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.325
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_FALSESTART.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_OPTIONS.312
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.318
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STDERR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_NODELAY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TELNETOPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMECONDITION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT.321
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.38
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERDATA.316
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.318
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFERTEXT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_URL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERAGENT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USERPWD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_USE_SSL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_VERBOSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WILDCARDMATCH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFODATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.32
-rw-r--r--docs/libcurl/opts/Makefile.inc12
-rw-r--r--docs/libcurl/symbols-in-versions13
-rw-r--r--include/curl/curl.h98
-rw-r--r--include/curl/curlver.h18
-rw-r--r--include/curl/easy.h6
-rw-r--r--include/curl/mprintf.h8
-rw-r--r--include/curl/multi.h26
-rw-r--r--include/curl/stdcheaders.h8
-rw-r--r--include/curl/system.h30
-rw-r--r--include/curl/typecheck-gcc.h569
-rw-r--r--include/curl/urlapi.h11
-rwxr-xr-xinstall-sh36
-rw-r--r--lib/Makefile.am8
-rw-r--r--lib/Makefile.inc26
-rw-r--r--lib/Makefile.netware2
-rw-r--r--lib/altsvc.c89
-rw-r--r--lib/altsvc.h27
-rw-r--r--lib/asyn-ares.c115
-rw-r--r--[-rwxr-xr-x]lib/asyn-thread.c104
-rw-r--r--lib/asyn.h3
-rw-r--r--lib/base64.c9
-rwxr-xr-xlib/checksrc.pl2
-rw-r--r--lib/config-amigaos.h4
-rw-r--r--lib/config-os400.h15
-rw-r--r--lib/config-plan9.h216
-rw-r--r--lib/config-riscos.h8
-rw-r--r--lib/config-symbian.h8
-rw-r--r--lib/config-tpf.h6
-rw-r--r--lib/config-vxworks.h6
-rw-r--r--lib/config-win32.h21
-rw-r--r--lib/conncache.c44
-rw-r--r--lib/conncache.h6
-rw-r--r--lib/connect.c210
-rw-r--r--lib/connect.h3
-rw-r--r--lib/cookie.c81
-rw-r--r--lib/cookie.h3
-rw-r--r--lib/curl_config.h81
-rw-r--r--lib/curl_config.h.cmake42
-rw-r--r--lib/curl_config.h.in81
-rw-r--r--lib/curl_endian.h5
-rw-r--r--lib/curl_fnmatch.c9
-rw-r--r--lib/curl_get_line.c55
-rw-r--r--lib/curl_get_line.h29
-rw-r--r--lib/curl_md4.h10
-rw-r--r--lib/curl_md5.h10
-rw-r--r--lib/curl_memory.h4
-rw-r--r--lib/curl_ntlm_core.c67
-rw-r--r--lib/curl_ntlm_core.h4
-rw-r--r--lib/curl_ntlm_wb.c71
-rw-r--r--lib/curl_ntlm_wb.h11
-rw-r--r--lib/curl_path.c4
-rw-r--r--lib/curl_rtmp.c14
-rw-r--r--lib/curl_sasl.c33
-rw-r--r--lib/curl_setup.h25
-rw-r--r--lib/doh.c69
-rw-r--r--lib/doh.h13
-rw-r--r--lib/easy.c113
-rw-r--r--lib/fileinfo.c5
-rw-r--r--lib/formdata.c14
-rw-r--r--lib/formdata.h11
-rw-r--r--lib/ftp.c446
-rw-r--r--lib/ftp.h6
-rw-r--r--lib/ftplistparser.c7
-rw-r--r--lib/getenv.c4
-rw-r--r--lib/getinfo.c8
-rw-r--r--lib/hash.h4
-rw-r--r--lib/hostcheck.c8
-rw-r--r--lib/hostip.c56
-rw-r--r--lib/hostip.h22
-rw-r--r--lib/hostip6.c8
-rw-r--r--lib/http.c382
-rw-r--r--lib/http.h41
-rw-r--r--lib/http2.c110
-rw-r--r--lib/http2.h4
-rw-r--r--lib/http_chunks.c28
-rw-r--r--lib/http_chunks.h13
-rw-r--r--lib/http_digest.c5
-rw-r--r--lib/http_digest.h12
-rw-r--r--lib/http_negotiate.c50
-rw-r--r--lib/http_negotiate.h6
-rw-r--r--lib/http_ntlm.c37
-rw-r--r--lib/http_ntlm.h10
-rw-r--r--lib/http_proxy.c10
-rw-r--r--lib/if2ip.c23
-rw-r--r--lib/if2ip.h4
-rw-r--r--lib/imap.c42
-rw-r--r--lib/inet_pton.c3
-rw-r--r--lib/krb5.c8
-rw-r--r--lib/ldap.c27
-rw-r--r--lib/libcurl.plist6
-rw-r--r--lib/md4.c344
-rw-r--r--lib/md5.c163
-rw-r--r--lib/memdebug.c7
-rw-r--r--lib/mime.c89
-rw-r--r--lib/mime.h22
-rw-r--r--[-rwxr-xr-x]lib/multi.c768
-rw-r--r--lib/multihandle.h49
-rw-r--r--lib/multiif.h32
-rw-r--r--lib/netrc.c158
-rw-r--r--lib/netrc.h9
-rw-r--r--lib/non-ascii.c2
-rw-r--r--lib/openldap.c33
-rw-r--r--lib/parsedate.c45
-rw-r--r--lib/pingpong.c13
-rw-r--r--lib/pingpong.h5
-rw-r--r--lib/pipeline.c404
-rw-r--r--lib/pipeline.h56
-rw-r--r--lib/pop3.c24
-rw-r--r--lib/progress.c274
-rw-r--r--lib/quic.h53
-rw-r--r--lib/rand.c5
-rw-r--r--lib/rand.h5
-rw-r--r--lib/rtsp.c24
-rw-r--r--lib/security.c25
-rw-r--r--lib/select.h6
-rw-r--r--lib/sendf.c40
-rw-r--r--lib/setopt.c327
-rw-r--r--lib/setopt.h5
-rw-r--r--lib/setup-os400.h6
-rw-r--r--lib/smb.c21
-rw-r--r--lib/smtp.c39
-rw-r--r--lib/socketpair.c118
-rw-r--r--lib/socketpair.h36
-rw-r--r--lib/socks.c86
-rw-r--r--lib/splay.c4
-rw-r--r--lib/splay.h8
-rw-r--r--lib/ssh-libssh.c (renamed from lib/vssh/libssh.c)68
-rw-r--r--lib/ssh.c (renamed from lib/vssh/libssh2.c)79
-rw-r--r--lib/ssh.h13
-rw-r--r--lib/strcase.c86
-rw-r--r--lib/strcase.h4
-rw-r--r--lib/strerror.c3
-rw-r--r--lib/system_win32.c43
-rw-r--r--lib/system_win32.h13
-rw-r--r--lib/tftp.c77
-rw-r--r--lib/timeval.c26
-rw-r--r--lib/timeval.h10
-rw-r--r--lib/transfer.c153
-rw-r--r--lib/transfer.h7
-rw-r--r--lib/url.c1095
-rw-r--r--lib/url.h25
-rw-r--r--lib/urlapi-int.h10
-rw-r--r--lib/urlapi.c267
-rw-r--r--lib/urldata.h526
-rw-r--r--lib/vauth/cleartext.c40
-rw-r--r--lib/vauth/digest.c16
-rw-r--r--lib/vauth/digest_sspi.c15
-rw-r--r--lib/vauth/krb5_gssapi.c16
-rw-r--r--lib/vauth/krb5_sspi.c32
-rw-r--r--lib/vauth/ntlm.c24
-rw-r--r--lib/vauth/ntlm_sspi.c22
-rw-r--r--lib/vauth/oauth2.c56
-rw-r--r--lib/vauth/spnego_gssapi.c13
-rw-r--r--lib/vauth/spnego_sspi.c30
-rw-r--r--lib/vauth/vauth.c42
-rw-r--r--lib/vauth/vauth.h22
-rw-r--r--lib/version.c85
-rw-r--r--lib/vquic/ngtcp2.c1593
-rw-r--r--lib/vquic/ngtcp2.h63
-rw-r--r--lib/vquic/quiche.c783
-rw-r--r--lib/vquic/quiche.h49
-rw-r--r--lib/vtls/cyassl.c (renamed from lib/vtls/wolfssl.c)222
-rw-r--r--lib/vtls/cyassl.h (renamed from lib/vtls/wolfssl.h)14
-rw-r--r--lib/vtls/gskit.c120
-rw-r--r--lib/vtls/gtls.c53
-rw-r--r--lib/vtls/mbedtls.c24
-rw-r--r--lib/vtls/mesalink.c73
-rw-r--r--lib/vtls/nss.c67
-rw-r--r--lib/vtls/openssl.c320
-rw-r--r--lib/vtls/polarssl.c13
-rw-r--r--lib/vtls/polarssl_threadlock.c59
-rw-r--r--lib/vtls/polarssl_threadlock.h9
-rw-r--r--lib/vtls/schannel.c32
-rw-r--r--lib/vtls/schannel_verify.c2
-rw-r--r--lib/vtls/sectransp.c40
-rw-r--r--lib/vtls/vtls.c56
-rw-r--r--lib/vtls/vtls.h5
-rw-r--r--lib/wildcard.c6
-rw-r--r--lib/wildcard.h10
-rw-r--r--lib/x509asn1.c21
-rw-r--r--lib/x509asn1.h6
-rw-r--r--local-configure.patch14
-rw-r--r--ltmain.sh213
-rw-r--r--m4/curl-confopts.m438
-rw-r--r--m4/curl-functions.m4311
-rw-r--r--m4/libtool.m415
-rwxr-xr-xmissing16
-rw-r--r--packages/OS400/README.OS4001
-rw-r--r--packages/OS400/ccsidcurl.c178
-rw-r--r--packages/OS400/ccsidcurl.h8
-rw-r--r--packages/OS400/curl.inc.in8
-rw-r--r--packages/OS400/os400sys.c176
-rw-r--r--packages/vms/config_h.com13
-rw-r--r--packages/vms/curl_crtl_init.c1
-rw-r--r--packages/vms/generate_config_vms_h_curl.com9
-rw-r--r--plan9/BUILD.PLAN9.txt55
-rw-r--r--plan9/include/mkfile34
-rw-r--r--plan9/lib/mkfile39
-rwxr-xr-xplan9/lib/mkfile.inc25
-rw-r--r--plan9/mkfile36
-rw-r--r--plan9/mkfile.proto30
-rw-r--r--plan9/src/mkfile45
-rwxr-xr-xplan9/src/mkfile.inc25
-rw-r--r--projects/README12
-rw-r--r--projects/Windows/VC10/lib/libcurl.vcxproj125
-rw-r--r--projects/Windows/VC10/src/curl.vcxproj114
-rw-r--r--projects/Windows/VC11/lib/libcurl.vcxproj125
-rw-r--r--projects/Windows/VC11/src/curl.vcxproj114
-rw-r--r--projects/Windows/VC12/lib/libcurl.vcxproj125
-rw-r--r--projects/Windows/VC12/src/curl.vcxproj114
-rw-r--r--projects/Windows/VC14/lib/libcurl.vcxproj125
-rw-r--r--projects/Windows/VC14/src/curl.vcxproj114
-rw-r--r--projects/Windows/VC15/lib/libcurl.vcxproj125
-rw-r--r--projects/Windows/VC15/src/curl.vcxproj142
-rw-r--r--projects/Windows/VC6/lib/libcurl.dsp52
-rw-r--r--projects/Windows/VC6/src/curl.dsp8
-rw-r--r--projects/Windows/VC7.1/lib/libcurl.vcproj39
-rw-r--r--projects/Windows/VC7.1/src/curl.vcproj6
-rw-r--r--projects/Windows/VC7/lib/libcurl.vcproj39
-rw-r--r--projects/Windows/VC7/src/curl.vcproj6
-rw-r--r--projects/Windows/VC8/lib/libcurl.vcproj52
-rw-r--r--projects/Windows/VC8/src/curl.vcproj8
-rw-r--r--projects/Windows/VC9/lib/libcurl.vcproj52
-rw-r--r--projects/Windows/VC9/src/curl.vcproj8
-rw-r--r--projects/build-openssl.bat636
-rw-r--r--projects/checksrc.bat2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/Makefile.inc2
-rw-r--r--src/tool_cb_hdr.c12
-rw-r--r--src/tool_cb_prg.c18
-rw-r--r--src/tool_cb_wrt.c18
-rw-r--r--src/tool_cfgable.c9
-rw-r--r--src/tool_cfgable.h30
-rw-r--r--src/tool_doswin.c1
-rw-r--r--src/tool_formparse.c6
-rw-r--r--src/tool_getparam.c101
-rw-r--r--src/tool_getparam.h3
-rw-r--r--src/tool_getpass.c2
-rw-r--r--src/tool_help.c31
-rw-r--r--src/tool_help.h4
-rw-r--r--src/tool_helpers.c4
-rw-r--r--src/tool_hugehelp.c9966
-rw-r--r--src/tool_main.c30
-rw-r--r--src/tool_main.h5
-rw-r--r--src/tool_metalink.c33
-rw-r--r--src/tool_metalink.h6
-rw-r--r--src/tool_operate.c1972
-rw-r--r--src/tool_operate.h48
-rw-r--r--src/tool_operhlp.c32
-rw-r--r--src/tool_operhlp.h4
-rw-r--r--src/tool_paramhlp.c53
-rw-r--r--src/tool_paramhlp.h3
-rw-r--r--src/tool_parsecfg.c132
-rw-r--r--src/tool_progress.c314
-rw-r--r--src/tool_progress.h39
-rw-r--r--src/tool_setopt.c126
-rw-r--r--src/tool_setopt.h43
-rw-r--r--src/tool_urlglob.c6
-rw-r--r--src/tool_version.h2
-rw-r--r--src/tool_writeout.c5
-rw-r--r--tests/FILEFORMAT4
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/README27
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.crl16
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.crt113
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.csr24
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.derbin994 -> 994 bytes
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.key50
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.pem163
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.pub.derbin294 -> 294 bytes
-rw-r--r--tests/certs/Server-localhost-lastSAN-sv.pub.pem14
-rw-r--r--tests/data/Makefile.inc38
-rw-r--r--tests/data/test10011
-rw-r--r--tests/data/test100211
-rw-r--r--tests/data/test10081
-rw-r--r--tests/data/test10104
-rw-r--r--tests/data/test10162
-rw-r--r--tests/data/test10172
-rw-r--r--tests/data/test10182
-rw-r--r--tests/data/test10192
-rw-r--r--tests/data/test10202
-rw-r--r--tests/data/test10211
-rw-r--r--tests/data/test10591
-rw-r--r--tests/data/test10601
-rw-r--r--tests/data/test10611
-rw-r--r--tests/data/test10632
-rw-r--r--tests/data/test10771
-rw-r--r--tests/data/test10783
-rw-r--r--tests/data/test10873
-rw-r--r--tests/data/test10883
-rw-r--r--tests/data/test10913
-rw-r--r--tests/data/test10921
-rw-r--r--tests/data/test10981
-rw-r--r--tests/data/test11043
-rw-r--r--tests/data/test11061
-rw-r--r--tests/data/test11351
-rw-r--r--tests/data/test11361
-rw-r--r--tests/data/test11413
-rw-r--r--tests/data/test11423
-rw-r--r--tests/data/test11492
-rw-r--r--tests/data/test11503
-rw-r--r--tests/data/test11624
-rw-r--r--tests/data/test116525
-rw-r--r--tests/data/test116653
-rw-r--r--tests/data/test117326
-rw-r--r--tests/data/test117450
-rw-r--r--tests/data/test12133
-rw-r--r--tests/data/test12143
-rw-r--r--tests/data/test12151
-rw-r--r--tests/data/test12163
-rw-r--r--tests/data/test12183
-rw-r--r--tests/data/test12202
-rw-r--r--tests/data/test12251
-rw-r--r--tests/data/test12283
-rw-r--r--tests/data/test12301
-rw-r--r--tests/data/test12323
-rw-r--r--tests/data/test12331
-rw-r--r--tests/data/test12413
-rw-r--r--tests/data/test12463
-rw-r--r--tests/data/test12533
-rw-r--r--tests/data/test12543
-rw-r--r--tests/data/test12563
-rw-r--r--tests/data/test12573
-rw-r--r--tests/data/test126934
-rw-r--r--tests/data/test12873
-rw-r--r--tests/data/test12883
-rw-r--r--tests/data/test129110
-rw-r--r--tests/data/test13143
-rw-r--r--tests/data/test13191
-rw-r--r--tests/data/test13201
-rw-r--r--tests/data/test13211
-rw-r--r--tests/data/test13293
-rw-r--r--tests/data/test13313
-rw-r--r--tests/data/test14003
-rw-r--r--tests/data/test14013
-rw-r--r--tests/data/test14023
-rw-r--r--tests/data/test14033
-rw-r--r--tests/data/test14043
-rw-r--r--tests/data/test14053
-rw-r--r--tests/data/test14065
-rw-r--r--tests/data/test14073
-rw-r--r--tests/data/test141218
-rw-r--r--tests/data/test14153
-rw-r--r--tests/data/test141813
-rw-r--r--tests/data/test14204
-rw-r--r--tests/data/test14213
-rw-r--r--tests/data/test14283
-rw-r--r--tests/data/test14296
-rw-r--r--tests/data/test1433
-rw-r--r--tests/data/test14452
-rw-r--r--tests/data/test14471
-rw-r--r--tests/data/test14555
-rw-r--r--tests/data/test14565
-rw-r--r--tests/data/test15064
-rw-r--r--tests/data/test15094
-rw-r--r--tests/data/test151417
-rw-r--r--tests/data/test15192
-rw-r--r--tests/data/test152349
-rw-r--r--tests/data/test15253
-rw-r--r--tests/data/test15263
-rw-r--r--tests/data/test15273
-rw-r--r--tests/data/test15283
-rw-r--r--tests/data/test15293
-rw-r--r--tests/data/test15328
-rw-r--r--tests/data/test15383
-rw-r--r--tests/data/test155944
-rw-r--r--tests/data/test156012
-rw-r--r--tests/data/test156351
-rw-r--r--tests/data/test15912
-rw-r--r--tests/data/test159349
-rw-r--r--tests/data/test159452
-rw-r--r--tests/data/test159551
-rw-r--r--tests/data/test159652
-rw-r--r--tests/data/test163
-rw-r--r--tests/data/test1621
-rw-r--r--tests/data/test1651
-rw-r--r--tests/data/test16547
-rw-r--r--tests/data/test165526
-rw-r--r--tests/data/test1671
-rw-r--r--tests/data/test1681
-rw-r--r--tests/data/test1691
-rw-r--r--tests/data/test1701
-rw-r--r--tests/data/test1713
-rw-r--r--tests/data/test1793
-rw-r--r--tests/data/test1833
-rw-r--r--tests/data/test1843
-rw-r--r--tests/data/test1853
-rw-r--r--tests/data/test1884
-rw-r--r--tests/data/test1894
-rw-r--r--tests/data/test192
-rw-r--r--tests/data/test19043
-rw-r--r--tests/data/test190652
-rw-r--r--tests/data/test190753
-rw-r--r--tests/data/test1961
-rw-r--r--tests/data/test1971
-rw-r--r--tests/data/test1981
-rw-r--r--tests/data/test2002
-rw-r--r--tests/data/test20002
-rw-r--r--tests/data/test20012
-rw-r--r--tests/data/test20022
-rw-r--r--tests/data/test20032
-rw-r--r--tests/data/test20042
-rw-r--r--tests/data/test20052
-rw-r--r--tests/data/test20066
-rw-r--r--tests/data/test20076
-rw-r--r--tests/data/test20086
-rw-r--r--tests/data/test20096
-rw-r--r--tests/data/test20106
-rw-r--r--tests/data/test20112
-rw-r--r--tests/data/test20122
-rw-r--r--tests/data/test20132
-rw-r--r--tests/data/test20142
-rw-r--r--tests/data/test20152
-rw-r--r--tests/data/test20162
-rw-r--r--tests/data/test20172
-rw-r--r--tests/data/test20182
-rw-r--r--tests/data/test20192
-rw-r--r--tests/data/test2022
-rw-r--r--tests/data/test20202
-rw-r--r--tests/data/test20212
-rw-r--r--tests/data/test20222
-rw-r--r--tests/data/test20328
-rw-r--r--tests/data/test2042
-rw-r--r--tests/data/test20472
-rw-r--r--tests/data/test20503
-rw-r--r--tests/data/test20554
-rw-r--r--tests/data/test20581
-rw-r--r--tests/data/test20591
-rw-r--r--tests/data/test2061
-rw-r--r--tests/data/test20601
-rw-r--r--tests/data/test20712
-rw-r--r--tests/data/test207742
-rw-r--r--tests/data/test207854
-rw-r--r--tests/data/test2081
-rw-r--r--tests/data/test2091
-rw-r--r--tests/data/test2100bin1642 -> 1642 bytes
-rw-r--r--tests/data/test2131
-rw-r--r--tests/data/test2173
-rw-r--r--tests/data/test2191
-rw-r--r--tests/data/test2312
-rw-r--r--tests/data/test2333
-rw-r--r--tests/data/test2343
-rw-r--r--tests/data/test2391
-rw-r--r--tests/data/test2431
-rw-r--r--tests/data/test2442
-rw-r--r--tests/data/test2563
-rw-r--r--tests/data/test2574
-rw-r--r--tests/data/test2581
-rw-r--r--tests/data/test2591
-rw-r--r--tests/data/test2631
-rw-r--r--tests/data/test2643
-rw-r--r--tests/data/test2651
-rw-r--r--tests/data/test2753
-rw-r--r--tests/data/test2783
-rw-r--r--tests/data/test2793
-rw-r--r--tests/data/test2873
-rw-r--r--tests/data/test2882
-rw-r--r--tests/data/test2991
-rw-r--r--tests/data/test3173
-rw-r--r--tests/data/test3183
-rw-r--r--tests/data/test3303
-rw-r--r--tests/data/test3313
-rw-r--r--tests/data/test33245
-rw-r--r--tests/data/test33335
-rw-r--r--tests/data/test33444
-rw-r--r--tests/data/test335103
-rw-r--r--tests/data/test33658
-rw-r--r--tests/data/test33758
-rw-r--r--tests/data/test3564
-rw-r--r--tests/data/test433
-rw-r--r--tests/data/test53
-rw-r--r--tests/data/test5034
-rw-r--r--tests/data/test5042
-rw-r--r--tests/data/test506118
-rw-r--r--tests/data/test5233
-rw-r--r--tests/data/test536 (renamed from tests/data/test338)59
-rw-r--r--tests/data/test5392
-rw-r--r--tests/data/test5401
-rw-r--r--tests/data/test5471
-rw-r--r--tests/data/test5481
-rw-r--r--tests/data/test5491
-rw-r--r--tests/data/test5501
-rw-r--r--tests/data/test5511
-rw-r--r--tests/data/test5551
-rw-r--r--tests/data/test5611
-rw-r--r--tests/data/test5634
-rw-r--r--tests/data/test5643
-rw-r--r--tests/data/test5901
-rw-r--r--tests/data/test624
-rw-r--r--tests/data/test633
-rw-r--r--tests/data/test6512
-rw-r--r--tests/data/test6534
-rw-r--r--tests/data/test6593
-rw-r--r--tests/data/test66034
-rw-r--r--tests/data/test66173
-rw-r--r--tests/data/test66278
-rw-r--r--tests/data/test66382
-rw-r--r--tests/data/test7025
-rw-r--r--tests/data/test7035
-rw-r--r--tests/data/test7045
-rw-r--r--tests/data/test7055
-rw-r--r--tests/data/test7092
-rw-r--r--tests/data/test7114
-rw-r--r--tests/data/test7141
-rw-r--r--tests/data/test7151
-rw-r--r--tests/data/test71645
-rw-r--r--tests/data/test71768
-rw-r--r--tests/data/test791
-rw-r--r--tests/data/test803
-rw-r--r--tests/data/test811
-rw-r--r--tests/data/test8194
-rw-r--r--tests/data/test821
-rw-r--r--tests/data/test8252
-rw-r--r--tests/data/test833
-rw-r--r--tests/data/test8334
-rw-r--r--tests/data/test8344
-rw-r--r--tests/data/test8354
-rw-r--r--tests/data/test843
-rw-r--r--tests/data/test8424
-rw-r--r--tests/data/test8432
-rw-r--r--tests/data/test8445
-rw-r--r--tests/data/test8452
-rw-r--r--tests/data/test84856
-rw-r--r--tests/data/test84951
-rw-r--r--tests/data/test853
-rw-r--r--tests/data/test8654
-rw-r--r--tests/data/test8712
-rw-r--r--tests/data/test8794
-rw-r--r--tests/data/test8804
-rw-r--r--tests/data/test8814
-rw-r--r--tests/data/test8874
-rw-r--r--tests/data/test8882
-rw-r--r--tests/data/test8894
-rw-r--r--tests/data/test8902
-rw-r--r--tests/data/test89257
-rw-r--r--tests/data/test89353
-rw-r--r--tests/data/test9034
-rw-r--r--tests/data/test9192
-rw-r--r--tests/data/test933
-rw-r--r--tests/data/test9354
-rw-r--r--tests/data/test9364
-rw-r--r--tests/data/test9374
-rw-r--r--tests/data/test941
-rw-r--r--tests/data/test9464
-rw-r--r--tests/data/test9472
-rw-r--r--tests/data/test9484
-rw-r--r--tests/data/test9492
-rw-r--r--tests/data/test953
-rw-r--r--tests/data/test95356
-rw-r--r--tests/data/test95455
-rwxr-xr-xtests/dictserver.py4
-rwxr-xr-xtests/disable-scan.pl97
-rw-r--r--tests/getpart.pm2
-rw-r--r--tests/libtest/Makefile.inc44
-rw-r--r--tests/libtest/first.c6
-rw-r--r--tests/libtest/lib1156.c6
-rw-r--r--tests/libtest/lib1522.c7
-rw-r--r--tests/libtest/lib1523.c82
-rw-r--r--tests/libtest/lib1541.c4
-rw-r--r--tests/libtest/lib1559.c78
-rw-r--r--tests/libtest/lib1560.c355
-rw-r--r--tests/libtest/lib1593.c79
-rw-r--r--tests/libtest/lib1594.c66
-rw-r--r--tests/libtest/lib1905.c4
-rw-r--r--tests/libtest/lib1906.c72
-rw-r--r--tests/libtest/lib1907.c54
-rw-r--r--tests/libtest/lib506.c3
-rw-r--r--tests/libtest/lib509.c4
-rw-r--r--tests/libtest/lib536.c142
-rw-r--r--tests/libtest/lib541.c4
-rw-r--r--tests/libtest/lib557.c16
-rw-r--r--tests/libtest/lib569.c5
-rw-r--r--tests/libtest/lib571.c5
-rw-r--r--tests/libtest/lib661.c150
-rwxr-xr-xtests/libtest/mk-lib1521.pl16
-rwxr-xr-xtests/manpage-scan.pl4
-rw-r--r--tests/manpage-syntax.pl63
-rw-r--r--tests/python_dependencies/impacket/nmb.py46
-rw-r--r--tests/python_dependencies/impacket/ntlm.py78
-rw-r--r--tests/python_dependencies/impacket/smb.py22
-rw-r--r--tests/python_dependencies/impacket/smb3.py69
-rw-r--r--tests/python_dependencies/impacket/smbserver.py228
-rw-r--r--tests/python_dependencies/impacket/spnego.py154
-rw-r--r--tests/python_dependencies/impacket/structure.py69
-rw-r--r--tests/python_dependencies/impacket/uuid.py21
-rw-r--r--tests/runtests.12
-rwxr-xr-xtests/runtests.pl608
-rw-r--r--tests/server/Makefile.inc10
-rw-r--r--tests/server/disabled.c79
-rw-r--r--tests/server/socksd.c1162
-rw-r--r--tests/server/sws.c89
-rw-r--r--tests/server/util.c6
-rwxr-xr-xtests/smbserver.py11
-rw-r--r--tests/sshhelp.pm10
-rwxr-xr-x[-rw-r--r--]tests/sshserver.pl71
-rwxr-xr-xtests/symbol-scan.pl4
-rw-r--r--tests/testcurl.12
-rw-r--r--tests/unit/CMakeLists.txt1
-rw-r--r--tests/unit/Makefile.inc6
-rw-r--r--tests/unit/README6
-rw-r--r--tests/unit/unit1303.c6
-rw-r--r--tests/unit/unit1304.c6
-rw-r--r--tests/unit/unit1307.c2
-rw-r--r--tests/unit/unit1398.c3
-rw-r--r--tests/unit/unit1399.c4
-rw-r--r--tests/unit/unit1607.c42
-rw-r--r--tests/unit/unit1608.c1
-rw-r--r--tests/unit/unit1609.c49
-rw-r--r--tests/unit/unit1620.c4
-rw-r--r--tests/unit/unit1621.c4
-rw-r--r--tests/unit/unit1651.c2
-rw-r--r--tests/unit/unit1653.c4
-rw-r--r--tests/unit/unit1654.c19
-rw-r--r--tests/unit/unit1655.c113
-rw-r--r--winbuild/BUILD.WINDOWS.txt1
-rw-r--r--winbuild/Makefile.vc30
-rw-r--r--winbuild/MakefileBuild.vc27
-rwxr-xr-xwinbuild/gen_resp_file.bat36
1153 files changed, 22783 insertions, 35198 deletions
diff --git a/CHANGES b/CHANGES
index d35f54199..b924571db 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,7094 +6,8007 @@
Changelog
-Version 7.67.0 (5 Nov 2019)
+Version 7.64.1 (27 Mar 2019)
-Daniel Stenberg (5 Nov 2019)
-- RELEASE-NOTES: synced
+Daniel Stenberg (27 Mar 2019)
+- RELEASE: 7.64.1
+
+- Revert "ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set"
- The 7.67.0 release
+ This reverts commit 9130ead9fcabdb6b8fbdb37c0b38be2d326adb00.
+
+ Fixes #3708
-- THANKS: add new names from 7.67.0
+- [Christian Schmitz brought this change]
-- configure: only say ipv6 enabled when the variable is set
-
- Previously it could say "IPv6: enabled" at the end of the configure run
- but the define wasn't set because of a missing getaddrinfo().
+ ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set
- Reported-by: Marcel Raad
- Fixes #4555
- Closes #4560
+ Closes #3704
-Marcel Raad (2 Nov 2019)
-- certs/Server-localhost-lastSAN-sv: regenerate with sha256
+Jay Satiro (26 Mar 2019)
+- tool_cb_wrt: fix writing to Windows null device NUL
- All other certificates were regenerated in commit ba782baac30, but
- this one was missed.
- Fixes test3001 on modern systems.
+ - Improve console detection.
- Closes https://github.com/curl/curl/pull/4551
-
-Daniel Stenberg (2 Nov 2019)
-- [Vilhelm Prytz brought this change]
-
- copyrights: update all copyright notices to 2019 on files changed this year
+ Prior to this change WriteConsole could be called to write to a handle
+ that may not be a console, which would cause an error. This issue is
+ limited to character devices that are not also consoles such as the null
+ device NUL.
- Closes #4547
+ Bug: https://github.com/curl/curl/issues/3175#issuecomment-439068724
+ Reported-by: Gisle Vanem
-- [Bastien Bouclet brought this change]
+- CURLMOPT_PIPELINING.3: fix typo
- mbedtls: add error message for cert validity starting in the future
+Daniel Stenberg (25 Mar 2019)
+- TODO: config file parsing
- Closes #4552
+ Closes #3698
-Jay Satiro (1 Nov 2019)
-- schannel_verify: Fix concurrent openings of CA file
+Jay Satiro (24 Mar 2019)
+- os400: Disable Alt-Svc by default since it's experimental
+
+ Follow-up to 520f0b4 which added Alt-Svc support and enabled it by
+ default for OS400. Since the feature is experimental, it should be
+ disabled by default.
- - Open the CA file using FILE_SHARE_READ mode so that others can read
- from it as well.
+ Ref: https://github.com/curl/curl/commit/520f0b4#commitcomment-32792332
+ Ref: https://curl.haxx.se/mail/lib-2019-02/0008.html
- Prior to this change our schannel code opened the CA file without
- sharing which meant concurrent openings (eg an attempt from another
- thread or process) would fail during the time it was open without
- sharing, which in curl's case would cause error:
- "schannel: failed to open CA file".
+ Closes https://github.com/curl/curl/pull/3688
+
+Dan Fandrich (24 Mar 2019)
+- tests: Fixed XML validation errors in some test files.
+
+- tests: Fix some incorrect precheck error messages.
- Bug: https://curl.haxx.se/mail/lib-2019-10/0104.html
- Reported-by: Richard Alcock
+ [ci skip]
+
+Daniel Stenberg (22 Mar 2019)
+- curl_url.3: this is not experimental anymore
-Daniel Stenberg (31 Oct 2019)
-- gtls: make gnutls_bye() not wait for response on shutdown
+- travis: bump the used wolfSSL version to 4.0.0
- ... as it can make it wait there for a long time for no good purpose.
+ Test 311 is now fine, leaving only 313 (CRL) disabled.
- Patched-by: Jay Satiro
- Reported-by: Bylon2 on github
- Adviced-by: Nikos Mavrogiannopoulos
+ Test 313 details can be found here:
+ https://github.com/wolfSSL/wolfssl/issues/1546
- Fixes #4487
- Closes #4541
+ Closes #3697
-- [Michał Janiszewski brought this change]
+Daniel Gustafsson (22 Mar 2019)
+- lib: Fix typos in comments
- appveyor: publish artifacts on appveyor
+David Woodhouse (20 Mar 2019)
+- openssl: if cert type is ENG and no key specified, key is ENG too
- This allows obtaining upstream builds of curl directly from appveyor for
- all the available configurations
+ Fixes #3692
+ Closes #3692
+
+Daniel Stenberg (20 Mar 2019)
+- sectransp: tvOS 11 is required for ALPN support
- Closes #4509
+ Reported-by: nianxuejie on github
+ Assisted-by: Nick Zitzmann
+ Assisted-by: Jay Satiro
+ Fixes #3689
+ Closes #3690
-- url: make Curl_close() NULLify the pointer too
+- test1541: threaded connection sharing
+
+ The threaded-shared-conn.c example turned into test case. Only works if
+ pthread was detected.
- This is the common pattern used in the code and by a unified approach we
- avoid mistakes.
+ An attempt to detect future regressions such as e3a53e3efb942a5
- Closes #4534
-
-- [Trivikram Kamat brought this change]
+ Closes #3687
- INSTALL: add missing space for configure commands
+Patrick Monnerat (17 Mar 2019)
+- os400: alt-svc support.
- Closes #4539
+ Although experimental, enable it in the platform config file.
+ Upgrade ILE/RPG binding.
-- url: Curl_free_request_state() should also free doh handles
+Daniel Stenberg (17 Mar 2019)
+- conncache: use conn->data to know if a transfer owns it
+
+ - make sure an already "owned" connection isn't returned unless
+ multiplexed.
- ... or risk DoH memory leaks.
+ - clear ->data when returning the connection to the cache again
- Reported-by: Paul Dreik
- Fixes #4463
- Closes #4527
-
-- examples: remove the "this exact code has not been verified"
+ Regression since 7.62.0 (probably in commit 1b76c38904f0)
+
+ Bug: https://curl.haxx.se/mail/lib-2019-03/0064.html
- ... as really confuses the reader to not know what to believe!
+ Closes #3686
+
+- RELEASE-NOTES: synced
-- [Trivikram Kamat brought this change]
+- [Chris Young brought this change]
- HTTP3: fix typo somehere1 > somewhere1
+ configure: add --with-amissl
- Closes #4535
+ AmiSSL is an Amiga native library which provides a wrapper over OpenSSL.
+ It also requires all programs using it to use bsdsocket.library
+ directly, rather than accessing socket functions through clib, which
+ libcurl was not necessarily doing previously. Configure will now check
+ for the headers and ensure they are included if found.
+
+ Closes #3677
-Jay Satiro (28 Oct 2019)
-- [Javier Blazquez brought this change]
+- [Chris Young brought this change]
- HTTP3: fix invalid use of sendto for connected UDP socket
-
- On macOS/BSD, trying to call sendto on a connected UDP socket fails
- with a EISCONN error. Because the singleipconnect has already called
- connect on the socket when we're trying to use it for QUIC transfers
- we need to use plain send instead.
+ vtls: rename some of the SSL functions
- Fixes #4529
- Closes https://github.com/curl/curl/pull/4533
+ ... in the SSL structure as AmiSSL is using macros for the socket API
+ functions.
-Daniel Stenberg (28 Oct 2019)
-- RELEASE-NOTES: synced
+- [Chris Young brought this change]
-- [Javier Blazquez brought this change]
+ tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr
- HTTP3: fix Windows build
-
- The ngtcp2 QUIC backend was using the MSG_DONTWAIT flag for send/recv
- in order to perform nonblocking operations. On Windows this flag does
- not exist. Instead, the socket must be set to nonblocking mode via
- ioctlsocket.
+- [Chris Young brought this change]
+
+ tool_operate: build on AmigaOS
+
+- makefile: make checksrc and hugefile commands "silent"
- This change sets the nonblocking flag on UDP sockets used for QUIC on
- all platforms so the use of MSG_DONTWAIT is not needed.
+ ... to match the style already used for compiling, linking
+ etc. Acknowledges 'make V=1' to enable verbose.
- Fixes #4531
- Closes #4532
+ Closes #3681
-Marcel Raad (27 Oct 2019)
-- appveyor: add --disable-proxy autotools build
-
- This would have caught issue #3926.
+- curl.1: --user and --proxy-user are hidden from ps output
- Also make formatting more consistent.
+ Suggested-by: Eric Curtin
+ Improved-by: Dan Fandrich
+ Ref: #3680
- Closes https://github.com/curl/curl/pull/4526
+ Closes #3683
-Daniel Stenberg (25 Oct 2019)
-- appveyor: make winbuilds with DEBUG=no/yes and VS 2015/2017
+- curl.1: mark the argument to --cookie as <data|filename>
- ... and invoke "curl -V" once done
+ From a discussion in #3676
- Co-Authored-By: Jay Satiro
+ Suggested-by: Tim Rühsen
- Closes #4523
+ Closes #3682
-- [Francois Rivard brought this change]
+Dan Fandrich (14 Mar 2019)
+- fuzzer: Only clone the latest fuzzer code, for speed.
- schannel: reverse the order of certinfo insertions
-
- Fixes #4518
- Closes #4519
+Daniel Stenberg (14 Mar 2019)
+- [Dominik Hölzl brought this change]
-Marcel Raad (24 Oct 2019)
-- test1591: fix spelling of http feature
+ Negotiate: fix for HTTP POST with Negotiate
- The test never got run because the feature name is `http` in lowercase.
+ * Adjusted unit tests 2056, 2057
+ * do not generally close connections with CURLAUTH_NEGOTIATE after every request
+ * moved negotiatedata from UrlState to connectdata
+ * Added stream rewind logic for CURLAUTH_NEGOTIATE
+ * introduced negotiatedata::GSS_AUTHDONE and negotiatedata::GSS_AUTHSUCC
+ * Consider authproblem state for CURLAUTH_NEGOTIATE
+ * Consider reuse_forbid for CURLAUTH_NEGOTIATE
+ * moved and adjusted negotiate authentication state handling from
+ output_auth_headers into Curl_output_negotiate
+ * Curl_output_negotiate: ensure auth done is always set
+ * Curl_output_negotiate: Set auth done also if result code is
+ GSS_S_CONTINUE_NEEDED/SEC_I_CONTINUE_NEEDED as this result code may
+ also indicate the last challenge request (only works with disabled
+ Expect: 100-continue and CURLOPT_KEEP_SENDING_ON_ERROR -> 1)
+ * Consider "Persistent-Auth" header, detect if not present;
+ Reset/Cleanup negotiate after authentication if no persistent
+ authentication
+ * apply changes introduced with #2546 for negotiate rewind logic
- Closes https://github.com/curl/curl/pull/4520
+ Fixes #1261
+ Closes #1975
-Daniel Stenberg (23 Oct 2019)
-- [Michał Janiszewski brought this change]
+- [Marc Schlatter brought this change]
- appveyor: Use two parallel compilation on appveyor with CMake
-
- Appveyor provides 2 CPUs for each builder[1], make sure to use parallel
- compilation, when running with CMake. CMake learned this new option in
- version 3.12[2] and the version provided by appveyor is fresh enough.
+ http: send payload when (proxy) authentication is done
- Curl doesn't really take that long to build and it is using the slowest
- builder available, msbuild, so expect only a moderate improvement in
- build times.
+ The check that prevents payload from sending in case of authentication
+ doesn't check properly if the authentication is done or not.
- [1] https://www.appveyor.com/docs/build-environment/
- [2] https://cmake.org/cmake/help/v3.12/release/3.12.html
+ They're cases where the proxy respond "200 OK" before sending
+ authentication challenge. This change takes care of that.
- Closes #4508
+ Fixes #2431
+ Closes #3669
-- conn-reuse: requests wanting NTLM can reuse non-NTLM connections
+- file: fix "Checking if unsigned variable 'readcount' is less than zero."
- Added test case 338 to verify.
+ Pointed out by codacy
- Reported-by: Daniel Silverstone
- Fixes #4499
- Closes #4514
+ Closes #3672
-Marcel Raad (23 Oct 2019)
-- tests: add missing proxy features
+- memdebug: log pointer before freeing its data
+
+ Coverity warned for two potentional "Use after free" cases. Both are false
+ positives because the memory wasn't used, it was only the actual pointer
+ value that was logged.
+
+ The fix still changes the order of execution to avoid the warnings.
+
+ Coverity CID 1443033 and 1443034
+
+ Closes #3671
-Daniel Stenberg (22 Oct 2019)
- RELEASE-NOTES: synced
-Marcel Raad (21 Oct 2019)
-- tests: use %FILE_PWD for file:// URLs
+Marcel Raad (12 Mar 2019)
+- travis: actually use updated compiler versions
- This way, we always have exactly one slash after the host name, making
- the tests pass when curl is compiled with the MSYS GCC.
+ For the Linux builds, GCC 8 and 7 and clang 7 were installed, but the
+ new GCC versions were only used for the coverage build and for building
+ nghttp2, while the new clang version was not used at all.
- Closes https://github.com/curl/curl/pull/4512
-
-- tests: add `connect to non-listen` keywords
+ BoringSSL needs to use the default GCC as it respects CC, but not CXX,
+ so it would otherwise pass gcc 8 options to g++ 4.8 and fail.
- These tests try to connect to ports nothing is listening on.
+ Also remove GCC 7, it's not needed anymore.
- Closes https://github.com/curl/curl/pull/4511
-
-- runtests: get textaware info from curl instead of perl
+ Ref: https://docs.travis-ci.com/user/languages/c/#c11c11-and-beyond-and-toolchain-versioning
- The MSYS system on Windows can run the test suite for curl built with
- any toolset. When built with the MSYS GCC, curl uses Unix line endings,
- while it uses Windows line endings when built with the MinGW GCC, and
- `^O` reports 'msys' in both cases. Use the curl executable itself to
- determine the line endings instead, which reports 'x86_64-pc-msys' when
- built with the MSYS GCC.
+ Closes https://github.com/curl/curl/pull/3670
+
+- travis: update clang to version 7
- Closes https://github.com/curl/curl/pull/4506
+ Closes https://github.com/curl/curl/pull/3670
-Daniel Stenberg (20 Oct 2019)
-- [Michał Janiszewski brought this change]
+Jay Satiro (11 Mar 2019)
+- [Andre Guibert de Bruet brought this change]
- appveyor: Add MSVC ARM64 build
+ examples/externalsocket: add missing close socket calls
- Closes #4507
-
-- http2_recv: a closed stream trumps pause state
+ .. and for Windows also call WSACleanup since we call WSAStartup.
- ... and thus should return 0, not EAGAIN.
+ The example is to demonstrate handling the socket independently of
+ libcurl. In this case libcurl is not responsible for creating, opening
+ or closing the socket, it is handled by the application (our example).
- Reported-by: Tom van der Woerdt
- Fixes #4496
- Closes #4505
+ Fixes https://github.com/curl/curl/pull/3663
-- http2: expire a timeout at end of stream
+Daniel Stenberg (11 Mar 2019)
+- multi: removed unused code for request retries
- To make sure that transfer is being dealt with. Streams without
- Content-Length need a final read to notice the end-of-stream state.
+ This code was once used for the non multi-interface using code path, but
+ ever since easy_perform was turned into a wrapper around the multi
+ interface, this code path never runs.
- Reported-by: Tom van der Woerdt
- Fixes #4496
+ Closes #3666
-Dan Fandrich (18 Oct 2019)
-- travis: Add an ARM64 build
+Jay Satiro (11 Mar 2019)
+- doh: inherit some SSL options from user's easy handle
- Test 323 is failing for some reason, so disable it there for now.
-
-Marcel Raad (18 Oct 2019)
-- examples/sslbackend: fix -Wchar-subscripts warning
+ - Inherit SSL options for the doh handle but not SSL client certs,
+ SSL ALPN/NPN, SSL engine, SSL version, SSL issuer cert,
+ SSL pinned public key, SSL ciphers, SSL id cache setting,
+ SSL kerberos or SSL gss-api settings.
+
+ - Fix inheritance of verbose setting.
- With the `isdigit` implementation that comes with MSYS2, the argument
- is used as an array subscript, resulting in a -Wchar-subscripts
- warning. `isdigit`'s behavior is undefined if the argument is negative
- and not EOF [0]. As done in lib/curl_ctype.h, cast the `char` variable
- to `unsigned char` to avoid that.
+ - Inherit NOSIGNAL.
- [0] https://en.cppreference.com/w/c/string/byte/isdigit
+ There is no way for the user to set options for the doh (DNS-over-HTTPS)
+ handles and instead we inherit some options from the user's easy handle.
- Closes https://github.com/curl/curl/pull/4503
-
-Daniel Stenberg (18 Oct 2019)
-- configure: remove all cyassl references
+ My thinking for the SSL options not inherited is they are most likely
+ not intended by the user for the DOH transfer. I did inherit insecure
+ because I think that should still be in control of the user.
- In particular, this removes the case where configure would find an old
- cyall installation rather than a wolfssl one if present. The library is
- named wolfssl in modern days so there's no real need to keep support for
- the former.
+ Prior to this change doh did not work for me because CAINFO was not
+ inherited. Also verbose was set always which AFAICT was a bug (#3660).
- Reported-by: Jacob Barthelmeh
- Closes #4502
+ Fixes https://github.com/curl/curl/issues/3660
+ Closes https://github.com/curl/curl/pull/3661
-Marcel Raad (17 Oct 2019)
-- test1162: disable MSYS2's POSIX path conversion
+Daniel Stenberg (9 Mar 2019)
+- test331: verify set-cookie for dotless host name
- This avoids MSYS2 converting the backslasb in the URL to a slash,
- causing the test to fail.
-
-Daniel Stenberg (17 Oct 2019)
-- RELEASE-NOTES: synced
+ Reproduced bug #3649
+ Closes #3659
-Jay Satiro (16 Oct 2019)
-- CURLOPT_TIMEOUT.3: Clarify transfer timeout time includes queue time
-
- Prior to this change some users did not understand that the "request"
- starts when the handle is added to the multi handle, or probably they
- did not understand that some of those transfers may be queued and that
- time is included in timeout.
+- Revert "cookies: extend domain checks to non psl builds"
- Reported-by: Jeroen Ooms
+ This reverts commit 3773de378d48b06c09931e44dca4d274d0bfdce0.
- Fixes https://github.com/curl/curl/issues/4486
- Closes https://github.com/curl/curl/pull/4489
-
-- [Stian Soiland-Reyes brought this change]
+ Regression shipped in 7.64.0
+ Fixes #3649
- tool_operate: Fix retry sleep time shown to user when Retry-After
-
- - If server header Retry-After is being used for retry sleep time then
- show that value to the user instead of the normal retry sleep time.
+- memdebug: make debug-specific functions use curl_dbg_ prefix
- This is a follow-up to 640b973 (7.66.0) which changed curl tool so that
- the value from Retry-After header overrides other retry timing options.
+ To not "collide" or use up the regular curl_ name space. Also makes them
+ easier to detect in helper scripts.
- Closes https://github.com/curl/curl/pull/4498
+ Closes #3656
-Daniel Stenberg (16 Oct 2019)
-- url: normalize CURLINFO_EFFECTIVE_URL
-
- The URL extracted with CURLINFO_EFFECTIVE_URL was returned as given as
- input in most cases, which made it not get a scheme prefixed like before
- if the URL was given without one, and it didn't remove dotdot sequences
- etc.
+- cmdline-opts/proxytunnel.d: the option tunnnels all protocols
- Added test case 1907 to verify that this now works as intended and as
- before 7.62.0.
+ Clarify the language and simplify.
- Regression introduced in 7.62.0
+ Reported-by: Daniel Lublin
+ Closes #3658
+
+- KNOWN_BUGS: Client cert (MTLS) issues with Schannel
- Reported-by: Christophe Dervieux
- Fixes #4491
- Closes #4493
+ Closes #3145
+
+- ROADMAP: updated to some more current things to work on
+
+- tests: fix multiple may be used uninitialized warnings
-Marcel Raad (16 Oct 2019)
-- tests: line ending fixes for Windows
+- RELEASE-NOTES: synced
+
+- source: fix two 'nread' may be used uninitialized warnings
- Mark some files as text.
+ Both seem to be false positives but we don't like warnings.
- Closes https://github.com/curl/curl/pull/4490
+ Closes #3646
-- tests: use proxy feature
+- gopher: remove check for path == NULL
- This makes the tests succeed when using --disable-proxy.
+ Since it can't be NULL and it makes Coverity believe we lack proper NULL
+ checks. Verified by test 659, landed in commit 15401fa886b.
+
+ Pointed out by Coverity CID 1442746.
- Closes https://github.com/curl/curl/pull/4488
+ Assisted-by: Dan Fandrich
+ Fixes #3617
+ Closes #3642
-- smbserver: fix Python 3 compatibility
+- examples: only include <curl/curl.h>
- Python 2's `ConfigParser` module is spelled `configparser` in Python 3.
+ That's the only public curl header we should encourage use of.
- Closes https://github.com/curl/curl/pull/4484
+ Reviewed-by: Marcel Raad
+ Closes #3645
-- security: silence conversion warning
+- ssh: loop the state machine if not done and not blocking
- With MinGW-w64, `curl_socket_t` is is a 32 or 64 bit unsigned integer,
- while `read` expects a 32 bit signed integer.
- Use `sread` instead of `read` to use the correct parameter type.
+ If the state machine isn't complete, didn't fail and it didn't return
+ due to blocking it can just as well loop again.
+
+ This addresses the problem with SFTP directory listings where we would
+ otherwise return back to the parent and as the multi state machine
+ doesn't have any code for using CURLM_CALL_MULTI_PERFORM for as long the
+ doing phase isn't complete, it would return out when in reality there
+ was more data to deal with.
- Closes https://github.com/curl/curl/pull/4483
+ Fixes #3506
+ Closes #3644
-- connect: silence sign-compare warning
+Jay Satiro (5 Mar 2019)
+- multi: support verbose conncache closure handle
- With MinGW-w64 using WinSock, `curl_socklen_t` is signed, while the
- result of `sizeof` is unsigned.
+ - Change closure handle to receive verbose setting from the easy handle
+ most recently added via curl_multi_add_handle.
- Closes https://github.com/curl/curl/pull/4483
-
-Daniel Stenberg (13 Oct 2019)
-- TODO: Handle growing SFTP files
+ The closure handle is a special easy handle used for closing cached
+ connections. It receives limited settings from the easy handle most
+ recently added to the multi handle. Prior to this change that did not
+ include verbose which was a problem because on connection shutdown
+ verbose mode was not acknowledged.
- Closes #4344
-
-- KNOWN_BUGS: remove "CURLFORM_CONTENTLEN in an array"
+ Ref: https://github.com/curl/curl/pull/3598
- The curl_formadd() function is deprecated and shouldn't be used so the
- real fix for applications is to switch to the curl_mime_* API.
-
-- KNOWN_BUGS: "LDAP on Windows does authentication wrong"
+ Co-authored-by: Daniel Stenberg
- Closes #3116
+ Closes https://github.com/curl/curl/pull/3618
-- appveyor: add a winbuild that uses VS2017
+Daniel Stenberg (4 Mar 2019)
+- CURLU: fix NULL dereference when used over proxy
- Closes #4482
-
-- [Harry Sintonen brought this change]
+ Test 659 verifies
+
+ Also fixed the test 658 name
+
+ Closes #3641
- socketpair: fix include and define for older TCP header systems
+- altsvc_out: check the return code from Curl_gmtime
- fixed build for systems that need netinet/in.h for IPPROTO_TCP and are
- missing INADDR_LOOPBACK
+ Pointed out by Coverity, CID 1442956.
- Closes #4480
+ Closes #3640
-- socketpair: fix double-close in error case
+- docs/ALTSVC.md: docs describing the approach
- Follow-up to bc2dbef0afc08
+ Closes #3498
-- gskit: use the generic Curl_socketpair
+- alt-svc: add a travis build
-- asyn-thread: make use of Curl_socketpair() where available
+- alt-svc: add test 355 and 356 to verify with command line curl
-- socketpair: an implemention for Windows and more
-
- Curl_socketpair() is designed to be used and work everywhere if there's
- no native version or the native version isn't good enough.
-
- Closes #4466
+- alt-svc: the curl command line bits
-- RELEASE-NOTES: synced
+- alt-svc: the libcurl bits
-- connect: return CURLE_OPERATION_TIMEDOUT for errno == ETIMEDOUT
-
- Previosly all connect() failures would return CURLE_COULDNT_CONNECT, no
- matter what errno said.
-
- This makes for example --retry work on these transfer failures.
+- travis: add build using gnutls
- Reported-by: Nathaniel J. Smith
- Fixes #4461
- Clsoes #4462
+ Closes #3637
-- cirrus: switch off blackhole status on the freebsd CI machines
+- RELEASE-NOTES: synced
-- tests: use port 2 instead of 60000 for a safer non-listening port
-
- ... when the tests want "connection refused".
+- [Simon Legner brought this change]
-- KNOWN_BUGS: IDN tests failing on Windows
+ scripts/completion.pl: also generate fish completion file
- Closes #3747
-
-Dan Fandrich (9 Oct 2019)
-- cirrus: Increase the git clone depth.
+ This is the renamed script formerly known as zsh.pl
- If more commits are submitted to master between the time of triggering
- the first Cirrus build and the time the final build gets started, the
- desired commit is no longer at HEAD and the build will error out.
- [skip ci]
-
-Daniel Stenberg (9 Oct 2019)
-- docs: make sure the --no-progress-meter docs file is in dist too
+ Closes #3545
-- docs: document it as --no-progress-meter instead of the reverse
+- gnutls: remove call to deprecated gnutls_compression_get_name
- Follow-up to 93373a960c3bb4
+ It has been deprecated by GnuTLS since a year ago and now causes build
+ warnings.
- Reported-by: infinnovation-dev on github
- Fixes #4474
- Closes #4475
-
-Dan Fandrich (9 Oct 2019)
-- cirrus: Switch the FreeBSD 11.x build to 11.3 and add a 13.0 build.
+ Ref: https://gitlab.com/gnutls/gnutls/commit/b0041897d2846737f5fb0f
+ Docs: https://www.gnutls.org/manual/html_node/Compatibility-API.html
- Also, select the images using image_family to get the latest snapshots
- automatically.
- [skip ci]
+ Closes #3636
-Daniel Stenberg (8 Oct 2019)
-- curl: --no-progress-meter
+Jay Satiro (2 Mar 2019)
+- system_win32: move win32_init here from easy.c
- New option that allows a user to ONLY switch off curl's progress meter
- and leave everything else in "talkative" mode.
+ .. since system_win32 is a more appropriate location for the functions
+ and to extern the globals.
- Reported-by: Piotr Komborski
- Fixes #4422
- Closes #4470
-
-- TODO: Consult %APPDATA% also for .netrc
+ Ref: https://github.com/curl/curl/commit/ca597ad#r32446578
+ Reported-by: Gisle Vanem
- Closes #4016
+ Closes https://github.com/curl/curl/pull/3625
-- CURLOPT_TIMEOUT.3: remove the mention of "minutes"
+Daniel Stenberg (1 Mar 2019)
+- curl_easy_duphandle.3: clarify that a duped handle has no shares
- ... just say that limiting operations risk aborting otherwise fine
- working transfers. If that means seconds, minutes or hours, we leave to
- the user.
+ Reported-by: Sara Golemon
- Reported-by: Martin Gartner
- Closes #4469
+ Fixes #3592
+ Closes #3634
-- [Andrei Valeriu BICA brought this change]
+- 10-at-a-time.c: fix too long line
+
+- [Arnaud Rebillout brought this change]
- docs: added multi-event.c example
+ examples: various fixes in ephiperfifo.c
- Similar to multi-uv.c but using libevent 2. This is a simpler libevent
- integration example then hiperfifo.c.
+ The main change here is the timer value that was wrong, it was given in
+ usecs (ms * 1000), while the itimerspec struct wants nsecs (ms * 1000 *
+ 1000). This resulted in the callback being invoked WAY TOO OFTEN.
- Closes #4471
-
-Jay Satiro (5 Oct 2019)
-- [Nicolas brought this change]
-
- ldap: fix OOM error on missing query string
+ As a quick check you can run this command before and after applying this
+ commit:
- - Allow missing queries, don't return NO_MEMORY error in such a case.
+ # shell 1
+ ./ephiperfifo 2>&1 | tee ephiperfifo.log
+ # shell 2
+ echo http://hacking.elboulangero.com > hiper.fifo
- It is acceptable for there to be no specified query string, for example:
+ Then just compare the size of the logs files.
- curl ldap://ldap.forumsys.com
+ Closes #3633
+ Fixes #3632
+ Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
+
+- urldata: simplify bytecounters
- A regression bug in 1b443a7 caused this issue.
+ - no need to have them protocol specific
+
+ - no need to set pointers to them with the Curl_setup_transfer() call
- This is a partial fix for #4261.
+ - make Curl_setup_transfer() operate on a transfer pointer, not
+ connection
- Bug: https://github.com/curl/curl/issues/4261#issuecomment-525543077
- Reported-by: Jojojov@users.noreply.github.com
- Analyzed-by: Samuel Surtees
+ - switch some counters from long to the more proper curl_off_t type
- Closes https://github.com/curl/curl/pull/4467
+ Closes #3627
-- [Paul B. Omta brought this change]
+- examples/10-at-a-time.c: improve readability and simplify
+
+ - use better variable names to explain their purposes
+ - convert logic to curl_multi_wait()
- build: Remove unused HAVE_LIBSSL and HAVE_LIBCRYPTO defines
+- threaded-resolver: shutdown the resolver thread without error message
+
+ When a transfer is done, the resolver thread will be brought down. That
+ could accidentally generate an error message in the error buffer even
+ though this is not an error situationand the transfer would still return
+ OK. An application that still reads the error buffer could find a
+ "Could not resolve host: [host name]" message there and get confused.
- Closes https://github.com/curl/curl/pull/4460
+ Reported-by: Michael Schmid
+ Fixes #3629
+ Closes #3630
-Daniel Stenberg (5 Oct 2019)
-- RELEASE-NOTES: synced
+- [Ԝеѕ brought this change]
-- [Stian Soiland-Reyes brought this change]
+ docs: update max-redirs.d phrasing
+
+ clarify redir - "in absurdum" doesn't seem to make sense in this context
+
+ Closes #3631
- curl: ensure HTTP 429 triggers --retry
+- ssh: fix Condition '!status' is always true
- This completes #3794.
+ in the same sftp_done function in both SSH backends. Simplify them
+ somewhat.
- Also make sure the new tests from #4195 are enabled
+ Pointed out by Codacy.
- Closes #4465
+ Closes #3628
-Marcel Raad (4 Oct 2019)
-- [apique brought this change]
+- test578: make it read data from the correct test
- winbuild: add ENABLE_UNICODE option
+- Curl_easy: remove req.maxfd - never used!
- Fixes https://github.com/curl/curl/issues/4308
- Closes https://github.com/curl/curl/pull/4309
-
-Daniel Stenberg (4 Oct 2019)
-- ngtcp2: adapt to API change
+ Introduced in 8b6314ccfb, but not used anymore in current code. Unclear
+ since when.
- Closes #4457
+ Closes #3626
-- cookies: change argument type for Curl_flush_cookies
+- http: set state.infilesize when sending formposts
- The second argument is really a 'bool' so use that and pass in TRUE/FALSE
- to make it clear.
+ Without it set, we would unwillingly triger the "HTTP error before end
+ of send, stop sending" condition even if the entire POST body had been
+ sent (since it wouldn't know the expected size) which would
+ unnecessarily log that message and close the connection when it didn't
+ have to.
- Closes #4455
+ Reported-by: Matt McClure
+ Bug: https://curl.haxx.se/mail/archive-2019-02/0023.html
+ Closes #3624
+
+- INSTALL: refer to the current TLS library names and configure options
+
+- FAQ: minor updates and spelling fixes
+
+- GOVERNANCE.md: minor spelling fixes
-- http2: move state-init from creation to pre-transfer
+- Secure Transport: no more "darwinssl"
+
+ Everyone calls it Secure Transport, now we do too.
- To make sure that the HTTP/2 state is initialized correctly for
- duplicated handles. It would otherwise easily generate "spurious"
- PRIORITY frames to get sent over HTTP/2 connections when duplicated easy
- handles were used.
+ Reviewed-by: Nick Zitzmann
- Reported-by: Daniel Silverstone
- Fixes #4303
- Closes #4442
+ Closes #3619
-- urlapi: fix use-after-free bug
+Marcel Raad (27 Feb 2019)
+- AppVeyor: add classic MinGW build
- Follow-up from 2c20109a9b5d04
+ But use the MSYS2 shell rather than the default MSYS shell because of
+ POSIX path conversion issues. Classic MinGW is only available on the
+ Visual Studio 2015 image.
- Added test 663 to verify.
+ Closes https://github.com/curl/curl/pull/3623
+
+- AppVeyor: add MinGW-w64 build
- Reported by OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/17954
+ Add a MinGW-w64 build using CMake's MSYS Makefiles generator.
+ Use the Visual Studio 2015 image as it has GCC 8, while the
+ Visual Studio 2017 image only has GCC 7.2.
- Closes #4453
-
-- [Paul Dreik brought this change]
+ Closes https://github.com/curl/curl/pull/3623
- cookie: avoid harmless use after free
+Daniel Stenberg (27 Feb 2019)
+- cookies: only save the cookie file if the engine is enabled
- This fix removes a use after free which can be triggered by
- the internal cookie fuzzer, but otherwise is probably
- impossible to trigger from an ordinary application.
+ Follow-up to 8eddb8f4259.
- The following program reproduces it:
+ If the cookieinfo pointer is NULL there really is nothing to save.
- curl_global_init(CURL_GLOBAL_DEFAULT);
- CURL* handle=curl_easy_init();
- CookieInfo* info=Curl_cookie_init(handle,NULL,NULL,false);
- curl_easy_setopt(handle, CURLOPT_COOKIEJAR, "/dev/null");
- Curl_flush_cookies(handle, true);
- Curl_cookie_cleanup(info);
- curl_easy_cleanup(handle);
- curl_global_cleanup();
+ Without this fix, we got a problem when a handle was using shared object
+ with cookies and is told to "FLUSH" it to file (which worked) and then
+ the share object was removed and when the easy handle was closed just
+ afterwards it has no cookieinfo and no cookies so it decided to save an
+ empty jar (overwriting the file just flushed).
- This was found through fuzzing.
+ Test 1905 now verifies that this works.
- Closes #4454
-
-- [Denis Chaplygin brought this change]
-
- docs: add note on failed handles not being counted by curl_multi_perform
+ Assisted-by: Michael Wallner
+ Assisted-by: Marcel Raad
- Closes #4446
-
-- CURLMOPT_MAX_CONCURRENT_STREAMS.3: fix SEE ALSO typo
+ Closes #3621
-- [Niall brought this change]
+- [DaVieS brought this change]
- ESNI: initial build/setup
+ cacertinmem.c: use multiple certificates for loading CA-chain
- Closes #4011
-
-- RELEASE-NOTES: synced
+ Closes #3421
-- redirect: when following redirects to an absolute URL, URL encode it
+- urldata: convert bools to bitfields and move to end
- ... to make it handle for example (RFC violating) embeded spaces.
+ This allows the compiler to pack and align the structs better in
+ memory. For a rather feature-complete build on x86_64 Linux, gcc 8.1.2
+ makes the Curl_easy struct 4.9% smaller. From 6312 bytes to 6000.
- Reported-by: momala454 on github
- Fixes #4445
- Closes #4447
-
-- urlapi: fix URL encoding when setting a full URL
-
-- tool_operate: rename functions to make more sense
-
-- curl: create easy handles on-demand and not ahead of time
+ Removed an unused struct field.
- This should again enable crazy-large download ranges of the style
- [1-10000000] that otherwise easily ran out of memory starting in 7.66.0
- when this new handle allocating scheme was introduced.
+ No functionality changes.
- Reported-by: Peter Sumatra
- Fixes #4393
- Closes #4438
+ Closes #3610
-- [Kunal Ekawde brought this change]
+- [Don J Olmstead brought this change]
- CURLMOPT_MAX_CONCURRENT_STREAMS: new setopt
+ curl.h: use __has_declspec_attribute for shared builds
- Closes #4410
+ Closes #3616
-- chunked-encoding: stop hiding the CURLE_BAD_CONTENT_ENCODING error
-
- Unknown content-encoding would get returned as CURLE_WRITE_ERROR if the
- response is chunked-encoded.
+- curl: display --version features sorted alphabetically
- Reported-by: Ilya Kosarev
- Fixes #4310
- Closes #4449
+ Closes #3611
-Marcel Raad (1 Oct 2019)
-- checksrc: fix uninitialized variable warning
+- runtests: detect "schannel" as an alias for "winssl"
- The loop doesn't need to be executed without a file argument.
+ Follow-up to 180501cb02
- Closes https://github.com/curl/curl/pull/4444
+ Reported-by: Marcel Raad
+ Fixes #3609
+ Closes #3620
-- urlapi: fix unused variable warning
+Marcel Raad (26 Feb 2019)
+- AppVeyor: update to Visual Studio 2017
- `dest` is only used with `ENABLE_IPV6`.
+ Switch all Visual Studio 2015 builds to Visual Studio 2017. It's not a
+ moving target anymore as the last update, Update 9, has been released.
- Closes https://github.com/curl/curl/pull/4444
+ Closes https://github.com/curl/curl/pull/3606
-- lib: silence conversion warnings
+- AppVeyor: switch VS 2015 builds to VS 2017 image
- Closes https://github.com/curl/curl/pull/4444
-
-- AppVeyor: add 32-bit MinGW-w64 build
+ The Visual Studio 2017 image has Visual Studio 2015 and 2017 installed.
- With WinSSL and testing enabled so that it would have detected most of
- the warnings fixed in [0] and [1].
+ Closes https://github.com/curl/curl/pull/3606
+
+- AppVeyor: explicitly select worker image
- [0] https://github.com/curl/curl/pull/4398
- [1] https://github.com/curl/curl/pull/4415
+ Currently, we're using the default Visual Studio 2015 image for
+ everything.
- Closes https://github.com/curl/curl/pull/4433
+ Closes https://github.com/curl/curl/pull/3606
-- AppVeyor: remove MSYS2_ARG_CONV_EXCL for winbuild
+Daniel Stenberg (26 Feb 2019)
+- strerror: make the strerror function use local buffers
- It's only used for MSYS2 with MinGW.
+ Instead of using a fixed 256 byte buffer in the connectdata struct.
- Closes
-
-Daniel Stenberg (30 Sep 2019)
-- [Emil Engler brought this change]
-
- git: add tests/server/disabled to .gitignore
+ In my build, this reduces the size of the connectdata struct by 11.8%,
+ from 2160 to 1904 bytes with no functionality or performance loss.
- Closes #4441
-
-- altsvc: accept quoted ma and persist values
+ This also fixes a bug in schannel's Curl_verify_certificate where it
+ called Curl_sspi_strerror when it should have called Curl_strerror for
+ string from GetLastError. the only effect would have been no text or the
+ wrong text being shown for the error.
- As mandated by the spec. Test 1654 is extended to verify.
+ Co-authored-by: Jay Satiro
- Closes #4443
-
-- mailmap: a Lucas fix
-
-Alessandro Ghedini (29 Sep 2019)
-- [Lucas Pardue brought this change]
-
- quiche: update HTTP/3 config creation to new API
-
-Daniel Stenberg (29 Sep 2019)
-- BINDINGS: PureBasic, Net::Curl for perl and Nim
+ Closes #3612
-- BINDINGS: Kapito is an Erlang library, basically a binding
+- [Michael Wallner brought this change]
-- BINDINGS: added clj-curl
+ cookies: fix NULL dereference if flushing cookies with no CookieInfo set
- Reported-by: Lucas Severo
-
-- [Jay Satiro brought this change]
-
- docs: disambiguate CURLUPART_HOST is for host name (ie no port)
+ Regression brought by a52e46f3900fb0 (shipped in 7.63.0)
- Closes #4424
+ Closes #3613
-- cookies: using a share with cookies shouldn't enable the cookie engine
-
- The 'share object' only sets the storage area for cookies. The "cookie
- engine" still needs to be enabled or activated using the normal cookie
- options.
+Marcel Raad (26 Feb 2019)
+- AppVeyor: re-enable test 500
- This caused the curl command line tool to accidentally use cookies
- without having been told to, since curl switched to using shared cookies
- in 7.66.0.
+ It's passing now.
- Test 1166 verifies
+ Closes https://github.com/curl/curl/pull/3615
+
+- AppVeyor: remove redundant builds
- Updated test 506
+ Remove the Visual Studio 2012 and 2013 builds as they add little value.
- Fixes #4429
- Closes #4434
-
-- setopt: handle ALTSVC set to NULL
+ Ref: https://github.com/curl/curl/pull/3606
+ Closes https://github.com/curl/curl/pull/3614
+Daniel Stenberg (25 Feb 2019)
- RELEASE-NOTES: synced
-- [grdowns brought this change]
+- [Bernd Mueller brought this change]
- INSTALL: add vcpkg installation instructions
+ OpenSSL: add support for TLS ASYNC state
- Closes #4435
+ Closes #3591
-- [Zenju brought this change]
+Jay Satiro (25 Feb 2019)
+- [Michael Felt brought this change]
- FTP: add test for FTPFILE_NOCWD: Avoid redundant CWDs
+ acinclude: add additional libraries to check for LDAP support
- Add libtest 661
+ - Add an additional check for LDAP that also checks for OpenSSL since
+ on AIX those libraries may be required to link LDAP properly.
- Closes #4417
-
-- [Zenju brought this change]
+ Fixes https://github.com/curl/curl/issues/3595
+ Closes https://github.com/curl/curl/pull/3596
- FTP: url-decode path before evaluation
-
- Closes #4428
+- [georgeok brought this change]
-Marcel Raad (27 Sep 2019)
-- tests: fix narrowing conversion warnings
+ schannel: support CALG_ECDH_EPHEM algorithm
- `timediff_t` is 64 bits wide also on 32-bit systems since
- commit b1616dad8f0.
+ Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
+ algorithm option when selecting ciphers. This became available on the
+ Win10 SDK.
- Closes https://github.com/curl/curl/pull/4415
-
-Jay Satiro (27 Sep 2019)
-- [julian brought this change]
+ Closes https://github.com/curl/curl/pull/3608
- vtls: Fix comment typo about macosx-version-min compiler flag
+Daniel Stenberg (24 Feb 2019)
+- multi: call multi_done on connect timeouts
- Closes https://github.com/curl/curl/pull/4425
-
-Daniel Stenberg (26 Sep 2019)
-- [Yechiel Kalmenson brought this change]
-
- README: minor grammar fix
+ Failing to do so would make the CURLINFO_TOTAL_TIME timeout to not get
+ updated correctly and could end up getting reported to the application
+ completely wrong (way too small).
- Closes #4431
-
-- [Spezifant brought this change]
+ Reported-by: accountantM on github
+ Fixes #3602
+ Closes #3605
- HTTP3: fix prefix parameter for ngtcp2 build
+- examples: remove recursive calls to curl_multi_socket_action
- Closes #4430
-
-- quiche: don't close connection at end of stream!
-
-- quiche: set 'drain' when returning without having drained the queues
-
-- Revert "FTP: url-decode path before evaluation"
+ From within the timer callbacks. Recursive is problematic for several
+ reasons. They should still work, but this way the examples and the
+ documentation becomes simpler. I don't think we need to encourage
+ recursive calls.
- This reverts commit 2f036a72d543e96128bd75cb0fedd88815fd42e2.
-
-- HTTP3: merged and simplified the two 'running' sections
-
-- HTTP3: show an --alt-svc using example too
-
-- [Zenju brought this change]
+ Discussed in #3537
+ Closes #3601
- FTP: url-decode path before evaluation
+Marcel Raad (23 Feb 2019)
+- configure: remove CURL_CHECK_FUNC_FDOPEN call
+
+ The macro itself has been removed in commit
+ 11974ac859c5d82def59e837e0db56fef7f6794e.
- Closes #4423
+ Closes https://github.com/curl/curl/pull/3604
-- openssl: use strerror on SSL_ERROR_SYSCALL
+Daniel Stenberg (23 Feb 2019)
+- wolfssl: stop custom-adding curves
- Instead of showing the somewhat nonsensical errno number, use strerror()
- to provide a more relatable error message.
+ since wolfSSL PR https://github.com/wolfSSL/wolfssl/pull/717 (shipped in
+ wolfSSL 3.10.2 and later) it sends these curves by default already.
- Closes #4411
-
-- HTTP3: update quic.aiortc.org + add link to server list
+ Pointed-out-by: David Garske
- Reported-by: Jeremy Lainé
+ Closes #3599
-Jay Satiro (26 Sep 2019)
-- url: don't set appconnect time for non-ssl/non-ssh connections
+- configure: remove the unused fdopen macro
- Prior to this change non-ssl/non-ssh connections that were reused set
- TIMER_APPCONNECT [1]. Arguably that was incorrect since no SSL/SSH
- handshake took place.
+ and the two remaining #ifdefs for it
- [1]: TIMER_APPCONNECT is publicly known as CURLINFO_APPCONNECT_TIME in
- libcurl and %{time_appconnect} in the curl tool. It is documented as
- "the time until the SSL/SSH handshake is completed".
+ Closes #3600
+
+Jay Satiro (22 Feb 2019)
+- url: change conn shutdown order to unlink data as last step
- Reported-by: Marcel Hernandez
+ - Split off connection shutdown procedure from Curl_disconnect into new
+ function conn_shutdown.
- Ref: https://github.com/curl/curl/issues/3760
+ - Change the shutdown procedure to close the sockets before
+ disassociating the transfer.
- Closes https://github.com/curl/curl/pull/3773
-
-Daniel Stenberg (25 Sep 2019)
-- ngtcp2: remove fprintf() calls
+ Prior to this change the sockets were closed after disassociating the
+ transfer so SOCKETFUNCTION wasn't called since the transfer was already
+ disassociated. That likely came about from recent work started in
+ Jan 2019 (#3442) to separate transfers from connections.
- - convert some of them to H3BUF() calls to infof()
- - remove some of them completely
- - made DEBUG_HTTP3 defined only if CURLDEBUG is set for now
+ Bug: https://curl.haxx.se/mail/lib-2019-02/0101.html
+ Reported-by: Pavel Löbl
- Closes #4421
-
-- [Jay Satiro brought this change]
+ Closes https://github.com/curl/curl/issues/3597
+ Closes https://github.com/curl/curl/pull/3598
- url: fix the NULL hostname compiler warning case
+Marcel Raad (22 Feb 2019)
+- Fix strict-prototypes GCC warning
- Closes #4403
+ As seen in the MinGW autobuilds. Caused by commit
+ f26bc29cfec0be84c67cf74065cf8e5e78fd68b7.
-- [Jay Satiro brought this change]
+Dan Fandrich (21 Feb 2019)
+- tests: Fixed XML validation errors in some test files.
- travis: move the go install to linux-only
+Daniel Stenberg (20 Feb 2019)
+- TODO: Allow SAN names in HTTP/2 server push
- ... to repair the build again
- Closes #4403
+ Suggested-by: Nicolas Grekas
-- altsvc: correct the #ifdef for the ngtcp2 backend
+- RELEASE-NOTES: synced
-- altsvc: save h3 as h3-23
+- curl: remove MANUAL from -M output
- Follow-up to d176a2c7e5
-
-- urlapi: question mark within fragment is still fragment
+ ... and remove it from the dist tarball. It has served its time, it
+ barely gets updated anymore and "everything curl" is now convering all
+ this document once tried to include, and does it more and better.
- The parser would check for a query part before fragment, which caused it
- to do wrong when the fragment contains a question mark.
+ In the compressed scenario, this removes ~15K data from the binary,
+ which is 25% of the -M output.
- Extended test 1560 to verify.
+ It remains in the git repo for now for as long as the web site builds a
+ page using that as source. It renders poorly on the site (especially for
+ mobile users) so its not even good there.
- Reported-by: Alex Konev
- Fixes #4412
- Closes #4413
+ Closes #3587
-- [Alex Samorukov brought this change]
+- http2: verify :athority in push promise requests
+
+ RFC 7540 says we should verify that the push is for an "authoritative"
+ server. We make sure of this by only allowing push with an :athority
+ header that matches the host that was asked for in the URL.
+
+ Fixes #3577
+ Reported-by: Nicolas Grekas
+ Bug: https://curl.haxx.se/mail/lib-2019-02/0057.html
+ Closes #3581
- HTTP3.md: move -p for mkdir, remove -j for make
+- singlesocket: fix the 'sincebefore' placement
- - mkdir on OSX/Darwin requires `-p` argument before dir
+ The variable wasn't properly reset within the loop and thus could remain
+ set for sockets that hadn't been set before and miss notifying the app.
- - portabbly figuring out number of cores is an exercise for somewhere
- else
+ This is a follow-up to 4c35574 (shipped in curl 7.64.0)
- Closes #4407
+ Reported-by: buzo-ffm on github
+ Detected-by: Jan Alexander Steffens
+ Fixes #3585
+ Closes #3589
-Patrick Monnerat (24 Sep 2019)
-- os400: getpeername() and getsockname() return ebcdic AF_UNIX sockaddr,
+- connection: never reuse CONNECT_ONLY conections
- As libcurl now uses these 2 system functions, wrappers are needed on os400
- to convert returned AF_UNIX sockaddrs to ascii.
+ and make CONNECT_ONLY conections never reuse any existing ones either.
- This is a follow-up to commit 7fb54ef.
- See also #4037.
- Closes #4214
+ Reported-by: Pavel Löbl
+ Bug: https://curl.haxx.se/mail/lib-2019-02/0064.html
+ Closes #3586
-Jay Satiro (24 Sep 2019)
-- [Lucas Pardue brought this change]
+Patrick Monnerat (19 Feb 2019)
+- cli tool: fix mime post with --disable-libcurl-option configure option
+
+ Reported-by: Marcel Raad
+ Fixes #3576
+ Closes #3583
- strcase: fix raw lowercasing the letter X
+Daniel Stenberg (19 Feb 2019)
+- x509asn1: cleanup and unify code layout
- Casing mistake in Curl_raw_tolower 'X' wasn't lowercased as 'x' prior to
- this change.
+ - rename 'n' to buflen in functions, and use size_t for them. Don't pass
+ in negative buffer lengths.
- Follow-up to 0023fce which added the function several days ago.
+ - move most function comments to above the function starts like we use
+ to
- Ref: https://github.com/curl/curl/pull/4401#discussion_r327396546
+ - remove several unnecessary typecasts (especially of NULL)
- Closes https://github.com/curl/curl/pull/4408
+ Reviewed-by: Patrick Monnerat
+ Closes #3582
-Daniel Stenberg (23 Sep 2019)
-- http2: Expression 'stream->stream_id != - 1' is always true
+- curl_multi_remove_handle.3: use at any time, just not from within callbacks
- PVS-Studio warning
- Fixes #4402
+ [ci skip]
-- http2: A value is being subtracted from the unsigned variable
+- http: make adding a blank header thread-safe
- PVS-Studio warning
- Fixes #4402
-
-- libssh: part of conditional expression is always true: !result
+ Previously the function would edit the provided header in-place when a
+ semicolon is used to signify an empty header. This made it impossible to
+ use the same set of custom headers in multiple threads simultaneously.
- PVS-Studio warning
- Fixed #4402
-
-- libssh: part of conditional expression is always true
+ This approach now makes a local copy when it needs to edit the string.
- PVS-Studio warning
- Fixes #4402
+ Reported-by: d912e3 on github
+ Fixes #3578
+ Closes #3579
-- libssh: The expression is excessive or contains a misprint
-
- PVS-Studio warning
- Fixes #4402
+- unit1651: survive curl_easy_init() fails
-- quiche: The expression must be surrounded by parentheses
+- [Frank Gevaerts brought this change]
+
+ rand: Fix a mismatch between comments in source and header.
- PVS-Studio warning
- Fixes #4402
+ Reported-by: Björn Stenberg <bjorn@haxx.se>
+ Closes #3584
-- vauth: The parameter 'status' must be surrounded by parentheses
+Patrick Monnerat (18 Feb 2019)
+- x509asn1: replace single char with an array
+
+ Although safe in this context, using a single char as an array may
+ cause invalid accesses to adjacent memory locations.
- PVS-Studio warning
- Fixes #4402
+ Detected by Coverity.
-- [Paul Dreik brought this change]
+Daniel Stenberg (18 Feb 2019)
+- examples/http2-serverpush: add some sensible error checks
+
+ To avoid NULL pointer dereferences etc in the case of problems.
+
+ Closes #3580
- doh: allow only http and https in debug mode
+Jay Satiro (18 Feb 2019)
+- easy: fix win32 init to work without CURL_GLOBAL_WIN32
- Otherwise curl may be told to use for instance pop3 to
- communicate with the doh server, which most likely
- is not what you want.
+ - Change the behavior of win32_init so that the required initialization
+ procedures are not affected by CURL_GLOBAL_WIN32 flag.
- Found through fuzzing.
+ libcurl via curl_global_init supports initializing for win32 with an
+ optional flag CURL_GLOBAL_WIN32, which if omitted was meant to stop
+ Winsock initialization. It did so internally by skipping win32_init()
+ when that flag was set. Since then win32_init() has been expanded to
+ include required initialization routines that are separate from
+ Winsock and therefore must be called in all cases. This commit fixes
+ it so that CURL_GLOBAL_WIN32 only controls the optional win32
+ initialization (which is Winsock initialization, according to our doc).
- Closes #4406
-
-- [Paul Dreik brought this change]
-
- doh: return early if there is no time left
+ The only users affected by this change are those that don't pass
+ CURL_GLOBAL_WIN32 to curl_global_init. For them this commit removes the
+ risk of a potential crash.
- Closes #4406
-
-- [Barry Pollard brought this change]
-
- http: lowercase headernames for HTTP/2 and HTTP/3
+ Ref: https://github.com/curl/curl/pull/3573
- Closes #4401
- Fixes #4400
+ Fixes https://github.com/curl/curl/issues/3313
+ Closes https://github.com/curl/curl/pull/3575
-Marcel Raad (23 Sep 2019)
-- vtls: fix narrowing conversion warnings
+Daniel Gustafsson (17 Feb 2019)
+- cookie: Add support for cookie prefixes
- Curl_timeleft returns `timediff_t`, which is 64 bits wide also on
- 32-bit systems since commit b1616dad8f0.
+ The draft-ietf-httpbis-rfc6265bis-02 draft, specify a set of prefixes
+ and how they should affect cookie initialization, which has been
+ adopted by the major browsers. This adds support for the two prefixes
+ defined, __Host- and __Secure, and updates the testcase with the
+ supplied examples from the draft.
- Closes https://github.com/curl/curl/pull/4398
-
-Daniel Stenberg (23 Sep 2019)
-- [Joel Depooter brought this change]
+ Closes #3554
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- winbuild: Add manifest to curl.exe for proper OS version detection
+- mbedtls: release sessionid resources on error
- This is a small fix to commit ebd213270a017a6830928ee2e1f4a9cabc799898
- in pull request #1221. That commit added the CURL_EMBED_MANIFEST flag to
- CURL_RC_FLAGS. However, later in the file CURL_RC_FLAGS is
- overwritten. The fix is to append values to CURL_RC_FLAGS instead of
- overwriting
+ If mbedtls_ssl_get_session() fails, it may still have allocated
+ memory that needs to be freed to avoid leaking. Call the library
+ API function to release session resources on this errorpath as
+ well as on Curl_ssl_addsessionid() errors.
- Closes #4399
+ Closes: #3574
+ Reported-by: Michał Antoniak <M.Antoniak@posnet.com>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+Patrick Monnerat (16 Feb 2019)
+- cli tool: refactor encoding conversion sequence for switch case fallthrough.
+
+- version.c: silent scan-build even when librtmp is not enabled
+
+Daniel Stenberg (15 Feb 2019)
- RELEASE-NOTES: synced
-Marcel Raad (22 Sep 2019)
-- openssl: fix compiler warning with LibreSSL
+- Curl_now: figure out windows version in win32_init
- It was already fixed for BoringSSL in commit a0f8fccb1e0.
- LibreSSL has had the second argument to SSL_CTX_set_min_proto_version
- as uint16_t ever since the function was added in [0].
+ ... and avoid use of static variables that aren't thread safe.
- [0] https://github.com/libressl-portable/openbsd/commit/56f107201baefb5533486d665a58d8f57fd3aeda
+ Fixes regression from e9ababd4f5a (present in the 7.64.0 release)
- Closes https://github.com/curl/curl/pull/4397
+ Reported-by: Paul Groke
+ Fixes #3572
+ Closes #3573
-Daniel Stenberg (22 Sep 2019)
-- curl: exit the create_transfers loop on errors
+Marcel Raad (15 Feb 2019)
+- unit1307: just fail without FTP support
- When looping around the ranges and given URLs to create transfers, all
- errors should exit the loop and return. Previously it would keep
- looping.
+ I missed to check this in with commit
+ 71786c0505926aaf7e9b2477b2fb7ee16a915ec6, which only disabled the test.
+ This fixes the actual linker error.
- Reported-by: SumatraPeter on github
- Bug: #4393
- Closes #4396
+ Closes https://github.com/curl/curl/pull/3568
-Jay Satiro (21 Sep 2019)
-- socks: Fix destination host shown on SOCKS5 error
-
- Prior to this change when a server returned a socks5 connect error then
- curl would parse the destination address:port from that data and show it
- to the user as the destination:
-
- curld -v --socks5 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to IPv4 172.217.12.206 (locally resolved)
- * Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
- curl: (7) Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
-
- That's incorrect because the address:port included in the connect error
- is actually a bind address:port (typically unused) and not the
- destination address:port. This fix changes curl to show the destination
- information that curl sent to the server instead:
-
- curld -v --socks5 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to IPv4 172.217.7.14:99 (locally resolved)
- * Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
- curl: (7) Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
-
- curld -v --socks5-hostname 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to google.com:99 (remotely resolved)
- * Can't complete SOCKS5 connection to google.com:99. (1)
- curl: (7) Can't complete SOCKS5 connection to google.com:99. (1)
-
- Ref: https://tools.ietf.org/html/rfc1928#section-6
+Daniel Stenberg (15 Feb 2019)
+- travis: enable valgrind for the iconv tests too
- Closes https://github.com/curl/curl/pull/4394
-
-Daniel Stenberg (21 Sep 2019)
-- travis: enable ngtcp2 h3-23 builds
+ Closes #3571
-- altsvc: both backends run h3-23 now
+- travis: add scan-build
- Closes #4395
+ Closes #3564
-- http: fix warning on conversion from int to bit
+- examples/sftpuploadresume: Value stored to 'result' is never read
- Follow-up from 03ebe66d70
+ Detected by scan-build
-- urldata: use 'bool' for the bit type on MSVC compilers
+- examples/http2-upload: cleaned up
- Closes #4387
- Fixes #4379
+ Fix scan-build warnings, no globals, no silly handle scan. Also remove
+ handles from the multi before cleaning up.
-- appveyor: upgrade VS2017 to VS2019
+- examples/http2-download: cleaned up
- Closes #4383
+ To avoid scan-build warnings and global variables.
-- [Zenju brought this change]
+- examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory'
+
+ Detected by scan-build
- FTP: FTPFILE_NOCWD: avoid redundant CWDs
+- examples/httpcustomheader: Value stored to 'res' is never read
- Closes #4382
+ Detected by scan-build
-- cookie: pass in the correct cookie amount to qsort()
+- examples: remove superfluous null-pointer checks
- As the loop discards cookies without domain set. This bug would lead to
- qsort() trying to sort uninitialized pointers. We have however not found
- it a security problem.
+ in ftpget, ftpsget and sftpget, so that scan-build stops warning for
+ potential NULL pointer dereference below!
+
+ Detected by scan-build
+
+- strip_trailing_dot: make sure NULL is never used for strlen
- Reported-by: Paul Dreik
- Closes #4386
+ scan-build warning: Null pointer passed as an argument to a 'nonnull'
+ parameter
-- [Paul Dreik brought this change]
+- [Jay Satiro brought this change]
- urlapi: avoid index underflow for short ipv6 hostnames
+ connection_check: restore original conn->data after the check
- If the input hostname is "[", hlen will underflow to max of size_t when
- it is subtracted with 2.
+ - Save the original conn->data before it's changed to the specified
+ data transfer for the connection check and then restore it afterwards.
- hostname[hlen] will then cause a warning by ubsanitizer:
+ This is a follow-up to 38d8e1b 2019-02-11.
- runtime error: addition of unsigned offset to 0x<snip> overflowed to
- 0x<snip>
+ History:
- I think that in practice, the generated code will work, and the output
- of hostname[hlen] will be the first character "[".
+ It was discovered a month ago that before checking whether to extract a
+ dead connection that that connection should be associated with a "live"
+ transfer for the check (ie original conn->data ignored and set to the
+ passed in data). A fix was landed in 54b201b which did that and also
+ cleared conn->data after the check. The original conn->data was not
+ restored, so presumably it was thought that a valid conn->data was no
+ longer needed.
- This can be demonstrated by the following program (tested in both clang
- and gcc, with -O3)
+ Several days later it was discovered that a valid conn->data was needed
+ after the check and follow-up fix was landed in bbae24c which partially
+ reverted the original fix and attempted to limit the scope of when
+ conn->data was changed to only when pruning dead connections. In that
+ case conn->data was not cleared and the original conn->data not
+ restored.
- int main() {
- char* hostname=strdup("[");
- size_t hlen = strlen(hostname);
+ A month later it was discovered that the original fix was somewhat
+ correct; a "live" transfer is needed for the check in all cases
+ because original conn->data could be null which could cause a bad deref
+ at arbitrary points in the check. A fix was landed in 38d8e1b which
+ expanded the scope to all cases. conn->data was not cleared and the
+ original conn->data not restored.
- hlen-=2;
- hostname++;
- printf("character is %d\n",+hostname[hlen]);
- free(hostname-1);
- }
+ A day later it was discovered that not restoring the original conn->data
+ may lead to busy loops in applications that use the event interface, and
+ given this observation it's a pretty safe assumption that there is some
+ code path that still needs the original conn->data. This commit is the
+ follow-up fix for that, it restores the original conn->data after the
+ connection check.
- I found this through fuzzing, and even if it seems harmless, the proper
- thing is to return early with an error.
+ Assisted-by: tholin@users.noreply.github.com
+ Reported-by: tholin@users.noreply.github.com
- Closes #4389
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Fixes https://github.com/curl/curl/issues/3542
+ Closes #3559
- ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23
+- memdebug: bring back curl_mark_sclose
- Closes #4392
-
-- THANKS-filter: deal with my typos 'Jat' => 'Jay'
+ Used by debug builds with NSS.
+
+ Reverted from 05b100aee247bb
-- travis: use go master
+Patrick Monnerat (14 Feb 2019)
+- transfer.c: do not compute length of undefined hex buffer.
- ... as the boringssl builds needs a very recent version
+ On non-ascii platforms, the chunked hex header was measured for char code
+ conversion length, even for chunked trailers that do not have an hex header.
+ In addition, the efective length is already known: use it.
+ Since the hex length can be zero, only convert if needed.
- Co-authored-by: Jat Satiro
- Closes #4361
+ Reported by valgrind.
-- tool_operate: removed unused variable 'done'
+Daniel Stenberg (14 Feb 2019)
+- KNOWN_BUGS: Cannot compile against a static build of OpenLDAP
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #2367
-- tool_operate: Expression 'config->resume_from' is always true
+Patrick Monnerat (14 Feb 2019)
+- x509asn1: "Dereference of null pointer"
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Detected by scan-build (false positive).
-- tool_getparam: remove duplicate switch case
+Daniel Stenberg (14 Feb 2019)
+- configure: show features as well in the final summary
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #3569
-- libssh2: part of conditional expression is always true: !result
+- KNOWN_BUGS: curl compiled on OSX 10.13 failed to run on OSX 10.10
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #2905
-- urlapi: Expression 'storep' is always true
+- KNOWN_BUGS: Deflate error after all content was received
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #2719
-- urlapi: 'scheme' is always true
+- gssapi: fix deprecated header warnings
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- urlapi: part of conditional expression is always true: (relurl[0] == '/')
+ Heimdal includes on FreeBSD spewed out lots of them. Less so now.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #3566
-- setopt: store CURLOPT_RTSP_SERVER_CSEQ correctly
+- TODO: Upgrade to websockets
- Fixes bug detected by PVS-Studio
- Fixes #4374
+ Closes #3523
-- mime: make Curl_mime_duppart() assert if called without valid dst
+- TODO: cmake test suite improvements
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #3109
-- http_proxy: part of conditional expression is always true: !error
+Patrick Monnerat (13 Feb 2019)
+- curl: "Dereference of null pointer"
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Rephrase to satisfy scan-build.
-- imap: merged two case-branches performing the same action
+Marcel Raad (13 Feb 2019)
+- unit1307: require FTP support
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- multi: value '2L' is assigned to a boolean
+ This test doesn't link without FTP support after
+ fc7ab4835b5fd09d0a6f57000633bb6bb6edfda1, which made Curl_fnmatch
+ unavailable without FTP support.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes https://github.com/curl/curl/pull/3565
-- easy: part of conditional expression is always true: !result
+Daniel Stenberg (13 Feb 2019)
+- TODO: TFO support on Windows
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- netrc: part of conditional expression is always true: !done
+ Nobody works on this now.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #3378
-- version: Expression 'left > 1' is always true
+- multi: Dereference of null pointer
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- url: remove dead code
+ Mostly a false positive, but this makes the code easier to read anyway.
+
+ Detected by scan-build.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #3563
-- url: part of expression is always true: (bundle->multiuse == 0)
+- urlglob: Argument with 'nonnull' attribute passed null
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Detected by scan-build.
-- ftp: the conditional expression is always true
+Jay Satiro (12 Feb 2019)
+- schannel: restore some debug output but only for debug builds
- ... both !result and (ftp->transfer != FTPTRANSFER_BODY)!
+ Follow-up to 84c10dc from earlier today which wrapped a lot of the noisy
+ debug output in DEBUGF but omitted a few lines.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Ref: https://github.com/curl/curl/commit/84c10dc#r32292900
-- ftp: Expression 'ftpc->wait_data_conn' is always false
+- examples/crawler: Fix the Accept-Encoding setting
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- ftp: Expression 'ftpc->wait_data_conn' is always true
+ - Pass an empty string to CURLOPT_ACCEPT_ENCODING to use the default
+ supported encodings.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Prior to this change the specific encodings of gzip and deflate were set
+ but there's no guarantee they'd be supported by the user's libcurl.
-- ftp: part of conditional expression is always true: !result
+Daniel Stenberg (12 Feb 2019)
+- mime: put the boundary buffer into the curl_mime struct
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ ... instead of allocating it separately and point to it. It is
+ fixed-size and always used for each part.
+
+ Closes #3561
-- http: fix Expression 'http->postdata' is always false
+- schannel: be quiet
+
+ Convert numerous infof() calls into debug-build only messages since they
+ are annoyingly verbose for regular applications. Removed a few.
- Fixes warning detected by PVS-Studio
- Fixes #4374
- Reported-by: Valerii Zapodovnikov
+ Bug: https://curl.haxx.se/mail/lib-2019-02/0027.html
+ Reported-by: Volker Schmid
+ Closes #3552
-- [Niall O'Reilly brought this change]
+- [Romain Geissler brought this change]
- doh: avoid truncating DNS QTYPE to lower octet
+ Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning
- Closes #4381
+ Closes #3562
-- [Jens Finkhaeuser brought this change]
+- http2: multi_connchanged() moved from multi.c, only used for h2
+
+ Closes #3557
- urlapi: CURLU_NO_AUTHORITY allows empty authority/host part
+- curl: "Function call argument is an uninitialized value"
- CURLU_NO_AUTHORITY is intended for use with unknown schemes (i.e. not
- "file:///") to override cURL's default demand that an authority exists.
+ Follow-up to cac0e4a6ad14b42471eb
- Closes #4349
-
-- version: next release will be 7.67.0
-
-- RELEASE-NOTES: synced
+ Detected by scan-build
+ Closes #3560
-- url: only reuse TLS connections with matching pinning
-
- If the requests have different CURLOPT_PINNEDPUBLICKEY strings set, the
- connection should not be reused.
+- pretransfer: don't strlen() POSTFIELDS set for GET requests
- Bug: https://curl.haxx.se/mail/lib-2019-09/0061.html
- Reported-by: Sebastian Haglund
+ ... since that data won't be used in the request anyway.
- Closes #4347
+ Fixes #3548
+ Reported-by: Renaud Allard
+ Close #3549
-- README: add OSS-Fuzz badge [skip ci]
+- multi: remove verbose "Expire in" ... messages
- Closes #4380
-
-Michael Kaufmann (18 Sep 2019)
-- http: merge two "case" statements
-
-Daniel Stenberg (18 Sep 2019)
-- [Zenju brought this change]
+ Reported-by: James Brown
+ Bug: https://curl.haxx.se/mail/archive-2019-02/0013.html
+ Closes #3558
- FTP: remove trailing slash from path for LIST/MLSD
+- mbedtls: make it build even if MBEDTLS_VERSION_C isn't set
- Closes #4348
+ Reported-by: MAntoniak on github
+ Fixes #3553
+ Closes #3556
-- mime: when disabled, avoid C99 macro
+Daniel Gustafsson (12 Feb 2019)
+- non-ascii.c: fix typos in comments
- Closes #4368
+ Fix two occurrences of s/convers/converts/ spotted while reading code.
-- url: cleanup dangling DOH request headers too
-
- Follow-up to 9bc44ff64d9081
-
- Credit to OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/17269
+Daniel Stenberg (12 Feb 2019)
+- fnmatch: disable if FTP is disabled
- Closes #4372
+ Closes #3551
+
+- curl_path: only enabled for SSH builds
-- [Christoph M. Becker brought this change]
+- [Frank Gevaerts brought this change]
- http2: relax verification of :authority in push promise requests
+ tests: add stderr comparison to the test suite
- If the :authority pseudo header field doesn't contain an explicit port,
- we assume it is valid for the default port, instead of rejecting the
- request for all ports.
+ The code is more or less copied from the stdout comparison code, maybe
+ some better reuse is possible.
- Ref: https://curl.haxx.se/mail/lib-2019-09/0041.html
+ test 1457 is adjusted to make the output actually match (by using --silent)
+ test 506 used <stderr> without actually needing it, so that <stderr> block is removed
- Closes #4365
+ Closes #3536
-- doh: clean up dangling DOH handles and memory on easy close
+Patrick Monnerat (11 Feb 2019)
+- cli tool: do not use mime.h private structures.
- If you set the same URL for target as for DoH (and it isn't a DoH
- server), like "https://example.com" in both, the easy handles used for
- the DoH requests could be left "dangling" and end up not getting freed.
+ Option -F generates an intermediate representation of the mime structure
+ that is used later to create the libcurl mime structure and generate
+ the --libcurl statements.
- Reported-by: Paul Dreik
- Closes #4366
+ Reported-by: Daniel Stenberg
+ Fixes #3532
+ Closes #3546
-- unit1655: make it C90 compliant
-
- Unclear why this was not detected in the CI.
-
- Follow-up to b7666027296a
+Daniel Stenberg (11 Feb 2019)
+- curlver: bump to 7.64.1-dev
-- smb: check for full size message before reading message details
-
- To avoid reading of uninitialized data.
+- RELEASE-NOTES: synced
- Assisted-by: Max Dymond
- Bug: https://crbug.com/oss-fuzz/16907
- Closes #4363
+ and bump the version in progress to 7.64.1. If we merge any "change"
+ before the cut-off date, we update again.
-- quiche: persist connection details
+Daniel Gustafsson (11 Feb 2019)
+- curl: follow-up to 3f16990ec84
- ... like we do for other protocols at connect time. This makes "curl -I"
- and other things work.
+ Commit 3f16990ec84cc4b followed-up a bug in b49652ac66cc0 but was
+ inadvertently introducing a new bug in the ternary expression.
- Reported-by: George Liu
- Fixes #4358
- Closes #4360
+ Close #3555
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- openssl: fix warning with boringssl and SSL_CTX_set_min_proto_version
+- dns: release sharelock as soon as possible
- Follow-up to ffe34b7b59
- Closes #4359
-
-- [Paul Dreik brought this change]
+ There is no benefit to holding the data sharelock when freeing the
+ addrinfo in case it fails, so ensure releaseing it as soon as we can
+ rather than holding on to it. This also aligns the code with other
+ consumers of sharelocks.
+
+ Closes #3516
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- doh: fix undefined behaviour and open up for gcc and clang optimization
+Daniel Stenberg (11 Feb 2019)
+- curl: follow-up to b49652ac66cc0
- The undefined behaviour is annoying when running fuzzing with
- sanitizers. The codegen is the same, but the meaning is now not up for
- dispute. See https://cppinsights.io/s/516a2ff4
+ On FreeBSD, return non-zero on error otherwise zero.
- By incrementing the pointer first, both gcc and clang recognize this as
- a bswap and optimizes it to a single instruction. See
- https://godbolt.org/z/994Zpx
+ Reported-by: Marcel Raad
+
+- multi: (void)-prefix when ignoring return values
- Closes #4350
+ ... and added braces to two function calls which fixes warnings if they
+ are replace by empty macros at build-time.
-- [Paul Dreik brought this change]
+- curl: fix FreeBSD compiler warning in the --xattr code
+
+ Closes #3550
- doh: fix (harmless) buffer overrun
+- connection_check: set ->data to the transfer doing the check
- Added unit test case 1655 to verify.
- Close #4352
+ The http2 code for connection checking needs a transfer to use. Make
+ sure a working one is set before handler->connection_check() is called.
- the code correctly finds the flaws in the old code,
- if one temporarily restores doh.c to the old version.
-
-Alessandro Ghedini (15 Sep 2019)
-- docs: remove trailing ':' from section names in CURLOPT_TRAILER* man
-
-- docs: fix typo in CURLOPT_HTTP_VERSION man
-
-GitHub (14 Sep 2019)
-- [Daniel Stenberg brought this change]
+ Reported-by: jnbr on github
+ Fixes #3541
+ Closes #3547
- CI: inintial github action job
+- hostip: make create_hostcache_id avoid alloc + free
- First shot at a CI build on github actions
+ Closes #3544
-Daniel Stenberg (13 Sep 2019)
-- appveyor: add a winbuild
+- scripts/singleuse: script to use to track single-use functions
- Assisted-by: Marcel Raad
- Assisted-by: Jay Satiro
+ That is functions that are declared global but are not used from outside
+ of the file in which it is declared. Such functions should be made
+ static or even at times be removed.
+
+ It also verifies that all used curl_ prefixed functions are "blessed"
- Closes #4324
+ Closes #3538
-- FTP: allow "rubbish" prepended to the SIZE response
+- cleanup: make local functions static
- This is a protocol violation but apparently there are legacy proprietary
- servers doing this.
+ urlapi: turn three local-only functions into statics
- Added test 336 and 337 to verify.
+ conncache: make conncache_find_first_connection static
- Reported-by: Philippe Marguinaud
- Closes #4339
-
-- [Zenju brought this change]
-
- FTP: skip CWD to entry dir when target is absolute
+ multi: make detach_connnection static
- Closes #4332
-
-Kamil Dudka (13 Sep 2019)
-- curl: fix memory leaked by parse_metalink()
+ connect: make getaddressinfo static
- This commit fixes a regression introduced by curl-7_65_3-5-gb88940850.
- Detected by tests 2005, 2008, 2009, 2010, 2011, and 2012 with valgrind
- and libmetalink enabled.
+ curl_ntlm_core: make hmac_md5 static
- Closes #4326
-
-Daniel Stenberg (13 Sep 2019)
-- parsedate: still provide the name arrays when disabled
+ http2: make two functions static
- If FILE or FTP are enabled, since they also use them!
+ http: make http_setup_conn static
- Reported-by: Roland Hieber
- Fixes #4325
- Closes #4343
-
-- [Gilles Vollant brought this change]
-
- curl:file2string: load large files much faster
+ connect: make tcpnodelay static
- ... by using a more efficient realloc scheme.
+ tests: make UNITTEST a thing to mark functions with, so they can be static for
+ normal builds and non-static for unit test builds
- Bug: https://curl.haxx.se/mail/lib-2019-09/0045.html
- Closes #4336
-
-- openssl: close_notify on the FTP data connection doesn't mean closure
+ ... and mark Curl_shuffle_addr accordingly.
- For FTPS transfers, curl gets close_notify on the data connection
- without that being a signal to close the control connection!
+ url: make up_free static
- Regression since 3f5da4e59a556fc (7.65.0)
+ setopt: make vsetopt static
- Reported-by: Zenju on github
- Reviewed-by: Jay Satiro
- Fixes #4329
- Closes #4340
-
-- [Jimmy Gaussen brought this change]
-
- docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag
+ curl_endian: make write32_le static
- Closes #4338
-
-- RELEASE-NOTES: synced
-
-- curlver: bump to 7.66.1
-
-- [Zenju brought this change]
-
- setopt: make it easier to add new enum values
+ rtsp: make rtsp_connisdead static
- ... by using the *_LAST define names better.
+ warnless: remove unused functions
- Closes #4321
+ memdebug: remove one unused function, made another static
-- asyn-thread: s/AF_LOCAL/AF_UNIX for Solaris
+Dan Fandrich (10 Feb 2019)
+- cirrus: Added FreeBSD builds using Cirrus CI.
- Reported-by: Dagobert Michelsen
- Fixes #4328
- Closes #4333
-
-- [Bernhard Walle brought this change]
-
- winbuild/MakefileBuild.vc: Add vssh
+ The build logs will be at https://cirrus-ci.com/github/curl/curl
- Without that modification, the Windows build using the makefiles doesn't
- work.
+ Some tests are currently failing and so disabled for now. The SSH server
+ isn't starting for the SSH tests due to unsupported options used in its
+ config file. The DICT server also is failing on startup.
+
+Daniel Stenberg (9 Feb 2019)
+- url/idnconvert: remove scan for <= 32 ascii values
- Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
+ The check was added back in fa939220df before the URL parser would catch
+ these problems and therefore these will never trigger now.
- Fixes #4322
- Closes #4323
+ Closes #3539
-Bernhard Walle (11 Sep 2019)
-- winbuild/MakefileBuild.vc: Fix line endings
+- urlapi: reduce variable scope, remove unreachable 'break'
- The file had mixed line endings.
+ Both nits pointed out by codacy.com
- Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
+ Closes #3540
-Jay Satiro (11 Sep 2019)
-- ldap: Stop using wide char version of ldapp_err2string
+Alessandro Ghedini (7 Feb 2019)
+- zsh.pl: escape ':' character
- Despite ldapp_err2string being documented by MS as returning a
- PCHAR (char *), when UNICODE it is mapped to ldap_err2stringW and
- returns PWCHAR (wchar_t *).
+ ':' is interpreted as separator by zsh, so if used as part of the argument
+ or option's description it needs to be escaped.
- We have lots of code that expects ldap_err2string to return char *,
- most of it failf used like this:
+ The problem can be reproduced as follows:
- failf(data, "LDAP local: Some error: %s", ldap_err2string(rc));
+ % curl --reso<TAB>
+ % curl -E <TAB>
- Closes https://github.com/curl/curl/pull/4272
+ Bug: https://bugs.debian.org/921452
-Version 7.66.0 (10 Sep 2019)
+- zsh.pl: update regex to better match curl -h output
+
+ The current regex fails to match '<...>' arguments properly (e.g. those
+ with spaces in them), which causes an completion script with wrong
+ descriptions for some options.
+
+ Here's a diff of the generated completion script, comparing the previous
+ version to the one with this fix:
+
+ --- /usr/share/zsh/vendor-completions/_curl 2019-01-15 20:47:40.000000000 +0000
+ +++ _curl 2019-02-05 20:57:29.453349040 +0000
+ @@ -9,48 +9,48 @@
+
+ _arguments -C -S \
+ --happy-eyeballs-timeout-ms'[How long to wait in milliseconds for IPv6 before trying IPv4]':'<milliseconds>' \
+ + --resolve'[Resolve the host+port to this address]':'<host:port:address[,address]...>' \
+ {-c,--cookie-jar}'[Write cookies to <filename> after operation]':'<filename>':_files \
+ {-D,--dump-header}'[Write the received headers to <filename>]':'<filename>':_files \
+ {-y,--speed-time}'[Trigger '\''speed-limit'\'' abort after this time]':'<seconds>' \
+ --proxy-cacert'[CA certificate to verify peer against for proxy]':'<file>':_files \
+ - --tls13-ciphers'[of TLS 1.3 ciphersuites> TLS 1.3 cipher suites to use]':'<list' \
+ + --tls13-ciphers'[TLS 1.3 cipher suites to use]':'<list of TLS 1.3 ciphersuites>' \
+ {-E,--cert}'[Client certificate file and password]':'<certificate[:password]>' \
+ --libcurl'[Dump libcurl equivalent code of this command line]':'<file>':_files \
+ --proxy-capath'[CA directory to verify peer against for proxy]':'<dir>':_files \
+ - --proxy-negotiate'[HTTP Negotiate (SPNEGO) authentication on the proxy]':'Use' \
+ --proxy-pinnedpubkey'[FILE/HASHES public key to verify proxy with]':'<hashes>' \
+ --crlfile'[Get a CRL list in PEM format from the given file]':'<file>':_files \
+ - --proxy-insecure'[HTTPS proxy connections without verifying the proxy]':'Do' \
+ - --proxy-ssl-allow-beast'[security flaw for interop for HTTPS proxy]':'Allow' \
+ + --proxy-negotiate'[Use HTTP Negotiate (SPNEGO) authentication on the proxy]' \
+ --abstract-unix-socket'[Connect via abstract Unix domain socket]':'<path>' \
+ --pinnedpubkey'[FILE/HASHES Public key to verify peer against]':'<hashes>' \
+ + --proxy-insecure'[Do HTTPS proxy connections without verifying the proxy]' \
+ --proxy-pass'[Pass phrase for the private key for HTTPS proxy]':'<phrase>' \
+ + --proxy-ssl-allow-beast'[Allow security flaw for interop for HTTPS proxy]' \
+ {-p,--proxytunnel}'[Operate through an HTTP proxy tunnel (using CONNECT)]' \
+ --socks5-hostname'[SOCKS5 proxy, pass host name to proxy]':'<host[:port]>' \
+ --proto-default'[Use PROTOCOL for any URL missing a scheme]':'<protocol>' \
+ - --proxy-tls13-ciphers'[list> TLS 1.3 proxy cipher suites]':'<ciphersuite' \
+ + --proxy-tls13-ciphers'[TLS 1.3 proxy cipher suites]':'<ciphersuite list>' \
+ --socks5-gssapi-service'[SOCKS5 proxy service name for GSS-API]':'<name>' \
+ --ftp-alternative-to-user'[String to replace USER \[name\]]':'<command>' \
+ - --ftp-ssl-control'[SSL/TLS for FTP login, clear for transfer]':'Require' \
+ {-T,--upload-file}'[Transfer local FILE to destination]':'<file>':_files \
+ --local-port'[Force use of RANGE for local port numbers]':'<num/range>' \
+ --proxy-tlsauthtype'[TLS authentication type for HTTPS proxy]':'<type>' \
+ {-R,--remote-time}'[Set the remote file'\''s time on the local output]' \
+ - --retry-connrefused'[on connection refused (use with --retry)]':'Retry' \
+ - --suppress-connect-headers'[proxy CONNECT response headers]':'Suppress' \
+ - {-j,--junk-session-cookies}'[session cookies read from file]':'Ignore' \
+ - --location-trusted'[--location, and send auth to other hosts]':'Like' \
+ + --ftp-ssl-control'[Require SSL/TLS for FTP login, clear for transfer]' \
+ --proxy-cert-type'[Client certificate type for HTTPS proxy]':'<type>' \
+ {-O,--remote-name}'[Write output to a file named as the remote file]' \
+ + --retry-connrefused'[Retry on connection refused (use with --retry)]' \
+ + --suppress-connect-headers'[Suppress proxy CONNECT response headers]' \
+ --trace-ascii'[Like --trace, but without hex output]':'<file>':_files \
+ --connect-timeout'[Maximum time allowed for connection]':'<seconds>' \
+ --expect100-timeout'[How long to wait for 100-continue]':'<seconds>' \
+ {-g,--globoff}'[Disable URL sequences and ranges using {} and \[\]]' \
+ + {-j,--junk-session-cookies}'[Ignore session cookies read from file]' \
+ {-m,--max-time}'[Maximum time allowed for the transfer]':'<seconds>' \
+ --dns-ipv4-addr'[IPv4 address to use for DNS requests]':'<address>' \
+ --dns-ipv6-addr'[IPv6 address to use for DNS requests]':'<address>' \
+ - --ignore-content-length'[the size of the remote resource]':'Ignore' \
+ {-k,--insecure}'[Allow insecure server connections when using SSL]' \
+ + --location-trusted'[Like --location, and send auth to other hosts]' \
+ --mail-auth'[Originator address of the original email]':'<address>' \
+ --noproxy'[List of hosts which do not use proxy]':'<no-proxy-list>' \
+ --proto-redir'[Enable/disable PROTOCOLS on redirect]':'<protocols>' \
+ @@ -62,18 +62,19 @@
+ --socks5-basic'[Enable username/password auth for SOCKS5 proxies]' \
+ --cacert'[CA certificate to verify peer against]':'<file>':_files \
+ {-H,--header}'[Pass custom header(s) to server]':'<header/@file>' \
+ + --ignore-content-length'[Ignore the size of the remote resource]' \
+ {-i,--include}'[Include protocol response headers in the output]' \
+ --proxy-header'[Pass custom header(s) to proxy]':'<header/@file>' \
+ --unix-socket'[Connect through this Unix domain socket]':'<path>' \
+ {-w,--write-out}'[Use output FORMAT after completion]':'<format>' \
+ - --http2-prior-knowledge'[HTTP 2 without HTTP/1.1 Upgrade]':'Use' \
+ {-o,--output}'[Write to file instead of stdout]':'<file>':_files \
+ - {-J,--remote-header-name}'[the header-provided filename]':'Use' \
+ + --preproxy'[\[protocol://\]host\[:port\] Use this proxy first]' \
+ --socks4a'[SOCKS4a proxy on given host + port]':'<host[:port]>' \
+ {-Y,--speed-limit}'[Stop transfers slower than this]':'<speed>' \
+ {-z,--time-cond}'[Transfer based on a time condition]':'<time>' \
+ --capath'[CA directory to verify peer against]':'<dir>':_files \
+ {-f,--fail}'[Fail silently (no output at all) on HTTP errors]' \
+ + --http2-prior-knowledge'[Use HTTP 2 without HTTP/1.1 Upgrade]' \
+ --proxy-tlspassword'[TLS password for HTTPS proxy]':'<string>' \
+ {-U,--proxy-user}'[Proxy user and password]':'<user:password>' \
+ --proxy1.0'[Use HTTP/1.0 proxy on given port]':'<host[:port]>' \
+ @@ -81,52 +82,49 @@
+ {-A,--user-agent}'[Send User-Agent <name> to server]':'<name>' \
+ --egd-file'[EGD socket path for random data]':'<file>':_files \
+ --fail-early'[Fail on first transfer error, do not continue]' \
+ - --haproxy-protocol'[HAProxy PROXY protocol v1 header]':'Send' \
+ - --preproxy'[Use this proxy first]':'[protocol://]host[:port]' \
+ + {-J,--remote-header-name}'[Use the header-provided filename]' \
+ --retry-max-time'[Retry only within this period]':'<seconds>' \
+ --socks4'[SOCKS4 proxy on given host + port]':'<host[:port]>' \
+ --socks5'[SOCKS5 proxy on given host + port]':'<host[:port]>' \
+ - --socks5-gssapi-nec'[with NEC SOCKS5 server]':'Compatibility' \
+ - --ssl-allow-beast'[security flaw to improve interop]':'Allow' \
+ --cert-status'[Verify the status of the server certificate]' \
+ - --ftp-create-dirs'[the remote dirs if not present]':'Create' \
+ {-:,--next}'[Make next URL use its separate set of options]' \
+ --proxy-key-type'[Private key file type for proxy]':'<type>' \
+ - --remote-name-all'[the remote file name for all URLs]':'Use' \
+ {-X,--request}'[Specify request command to use]':'<command>' \
+ --retry'[Retry request if transient problems occur]':'<num>' \
+ - --ssl-no-revoke'[cert revocation checks (WinSSL)]':'Disable' \
+ --cert-type'[Certificate file type (DER/PEM/ENG)]':'<type>' \
+ --connect-to'[Connect to host]':'<HOST1:PORT1:HOST2:PORT2>' \
+ --create-dirs'[Create necessary local directory hierarchy]' \
+ + --haproxy-protocol'[Send HAProxy PROXY protocol v1 header]' \
+ --max-redirs'[Maximum number of redirects allowed]':'<num>' \
+ {-n,--netrc}'[Must read .netrc for user name and password]' \
+ + {-x,--proxy}'[\[protocol://\]host\[:port\] Use this proxy]' \
+ --proxy-crlfile'[Set a CRL list for proxy]':'<file>':_files \
+ --sasl-ir'[Enable initial response in SASL authentication]' \
+ - --socks5-gssapi'[GSS-API auth for SOCKS5 proxies]':'Enable' \
+ + --socks5-gssapi-nec'[Compatibility with NEC SOCKS5 server]' \
+ + --ssl-allow-beast'[Allow security flaw to improve interop]' \
+ + --ftp-create-dirs'[Create the remote dirs if not present]' \
+ --interface'[Use network INTERFACE (or address)]':'<name>' \
+ --key-type'[Private key file type (DER/PEM/ENG)]':'<type>' \
+ --netrc-file'[Specify FILE for netrc]':'<filename>':_files \
+ {-N,--no-buffer}'[Disable buffering of the output stream]' \
+ --proxy-service-name'[SPNEGO proxy service name]':'<name>' \
+ - --styled-output'[styled output for HTTP headers]':'Enable' \
+ + --remote-name-all'[Use the remote file name for all URLs]' \
+ + --ssl-no-revoke'[Disable cert revocation checks (WinSSL)]' \
+ --max-filesize'[Maximum file size to download]':'<bytes>' \
+ --negotiate'[Use HTTP Negotiate (SPNEGO) authentication]' \
+ --no-keepalive'[Disable TCP keepalive on the connection]' \
+ {-#,--progress-bar}'[Display transfer progress as a bar]' \
+ - {-x,--proxy}'[Use this proxy]':'[protocol://]host[:port]' \
+ - --proxy-anyauth'[any proxy authentication method]':'Pick' \
+ {-Q,--quote}'[Send command(s) to server before transfer]' \
+ - --request-target'[the target for this request]':'Specify' \
+ + --socks5-gssapi'[Enable GSS-API auth for SOCKS5 proxies]' \
+ {-u,--user}'[Server user and password]':'<user:password>' \
+ {-K,--config}'[Read config from a file]':'<file>':_files \
+ {-C,--continue-at}'[Resumed transfer offset]':'<offset>' \
+ --data-raw'[HTTP POST data, '\''@'\'' allowed]':'<data>' \
+ - --disallow-username-in-url'[username in url]':'Disallow' \
+ --krb'[Enable Kerberos with security <level>]':'<level>' \
+ --proxy-ciphers'[SSL ciphers to use for proxy]':'<list>' \
+ --proxy-digest'[Use Digest authentication on the proxy]' \
+ --proxy-tlsuser'[TLS username for HTTPS proxy]':'<name>' \
+ + --styled-output'[Enable styled output for HTTP headers]' \
+ {-b,--cookie}'[Send cookies from string/file]':'<data>' \
+ --data-urlencode'[HTTP POST data url encoded]':'<data>' \
+ --delegation'[GSS-API delegation permission]':'<LEVEL>' \
+ @@ -134,7 +132,10 @@
+ --post301'[Do not switch to GET after following a 301]' \
+ --post302'[Do not switch to GET after following a 302]' \
+ --post303'[Do not switch to GET after following a 303]' \
+ + --proxy-anyauth'[Pick any proxy authentication method]' \
+ + --request-target'[Specify the target for this request]' \
+ --trace-time'[Add time stamps to trace/verbose output]' \
+ + --disallow-username-in-url'[Disallow username in url]' \
+ --dns-servers'[DNS server addrs to use]':'<addresses>' \
+ {-G,--get}'[Put the post data in the URL and use GET]' \
+ --limit-rate'[Limit transfer speed to RATE]':'<speed>' \
+ @@ -148,21 +149,21 @@
+ --metalink'[Process given URLs as metalink XML file]' \
+ --tr-encoding'[Request compressed transfer encoding]' \
+ --xattr'[Store metadata in extended file attributes]' \
+ - --ftp-skip-pasv-ip'[the IP address for PASV]':'Skip' \
+ --pass'[Pass phrase for the private key]':'<phrase>' \
+ --proxy-ntlm'[Use NTLM authentication on the proxy]' \
+ {-S,--show-error}'[Show error even when -s is used]' \
+ - --ciphers'[of ciphers> SSL ciphers to use]':'<list' \
+ + --ciphers'[SSL ciphers to use]':'<list of ciphers>' \
+ --form-string'[Specify multipart MIME data]':'<name=string>' \
+ --login-options'[Server login options]':'<options>' \
+ --tftp-blksize'[Set TFTP BLKSIZE option]':'<value>' \
+ - --tftp-no-options'[not send any TFTP options]':'Do' \
+ {-v,--verbose}'[Make the operation more talkative]' \
+ + --ftp-skip-pasv-ip'[Skip the IP address for PASV]' \
+ --proxy-key'[Private key for HTTPS proxy]':'<key>' \
+ {-F,--form}'[Specify multipart MIME data]':'<name=content>' \
+ --mail-from'[Mail from this address]':'<address>' \
+ --oauth2-bearer'[OAuth 2 Bearer Token]':'<token>' \
+ --proto'[Enable/disable PROTOCOLS]':'<protocols>' \
+ + --tftp-no-options'[Do not send any TFTP options]' \
+ --tlsauthtype'[TLS authentication type]':'<type>' \
+ --doh-url'[Resolve host names over DOH]':'<URL>' \
+ --no-sessionid'[Disable SSL session-ID reusing]' \
+ @@ -173,14 +174,13 @@
+ --ftp-ssl-ccc'[Send CCC after authenticating]' \
+ {-4,--ipv4}'[Resolve names to IPv4 addresses]' \
+ {-6,--ipv6}'[Resolve names to IPv6 addresses]' \
+ - --netrc-optional'[either .netrc or URL]':'Use' \
+ --service-name'[SPNEGO service name]':'<name>' \
+ {-V,--version}'[Show version number and quit]' \
+ --data-ascii'[HTTP POST ASCII data]':'<data>' \
+ --ftp-account'[Account data string]':'<data>' \
+ - --compressed-ssh'[SSH compression]':'Enable' \
+ --disable-eprt'[Inhibit using EPRT or LPRT]' \
+ --ftp-method'[Control CWD usage]':'<method>' \
+ + --netrc-optional'[Use either .netrc or URL]' \
+ --pubkey'[SSH Public key file name]':'<key>' \
+ --raw'[Do HTTP "raw"; no transfer decoding]' \
+ --anyauth'[Pick any authentication method]' \
+ @@ -189,6 +189,7 @@
+ --no-alpn'[Disable the ALPN TLS extension]' \
+ --tcp-nodelay'[Use the TCP_NODELAY option]' \
+ {-B,--use-ascii}'[Use ASCII/text transfer]' \
+ + --compressed-ssh'[Enable SSH compression]' \
+ --digest'[Use HTTP Digest Authentication]' \
+ --proxy-tlsv1'[Use TLSv1 for HTTPS proxy]' \
+ --engine'[Crypto engine to use]':'<name>' \
+
+Marcel Raad (7 Feb 2019)
+- tool_operate: fix typecheck warning
+
+ Use long for CURLOPT_HTTP09_ALLOWED to fix the following warning:
+ tool_operate.c: In function 'operate_do':
+ ../include/curl/typecheck-gcc.h:47:9: error: call to
+ '_curl_easy_setopt_err_long' declared with attribute warning:
+ curl_easy_setopt expects a long argument for this option [-Werror]
+
+ Closes https://github.com/curl/curl/pull/3534
+
+Jay Satiro (6 Feb 2019)
+- [Chris Araman brought this change]
+
+ url: close TLS before removing conn from cache
+
+ - Fix potential crashes in schannel shutdown.
+
+ Ensure any TLS shutdown messages are sent before removing the
+ association between the connection and the easy handle. Reverts
+ @bagder's previous partial fix for #3412.
+
+ Fixes https://github.com/curl/curl/issues/3412
+ Fixes https://github.com/curl/curl/issues/3505
+ Closes https://github.com/curl/curl/pull/3531
+
+Daniel Gustafsson (6 Feb 2019)
+- INTERNALS.md: fix subsection depth and link
+
+ The Kerberos subsection was mistakenly a subsubsection under FTP, and
+ the curlx subsection was missing an anchor for the TOC link.
+
+ Closes #3529
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Daniel Stenberg (10 Sep 2019)
-- RELEASE-NOTES: curl 7.66.0
+Version 7.64.0 (6 Feb 2019)
-- THANKS: from the 7.66.0 release
+Daniel Stenberg (6 Feb 2019)
+- RELEASE-NOTES: 7.64.0
-- curl: make sure the parallel transfers do them all
-
- The logic could erroneously break the loop too early before all
- transfers had been transferred.
-
- Reported-by: Tom van der Woerdt
- Fixes #4316
- Closes #4317
+- RELEASE-PROCEDURE: update the release calendar
-- urlapi: one colon is enough for the strspn() input (typo)
+- THANKS: 7.64.0 status
-- urlapi: verify the IPv6 numerical address
+Daniel Gustafsson (5 Feb 2019)
+- ROADMAP: remove already performed item
- It needs to parse correctly. Otherwise it could be tricked into letting
- through a-f using host names that libcurl would then resolve. Like
- '[ab.be]'.
+ Commit 7a09b52c98ac8d840a8a9907b1a1d9a9e684bcf5 introduced support
+ for the draft-ietf-httpbis-cookie-alone-01 cookie draft, and while
+ the entry was removed from the TODO it was mistakenly left here.
+ Fix by removing and rewording the entry slightly.
- Reported-by: Thomas Vegas
- Closes #4315
+ Closes #3530
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Clément Notin brought this change]
+- [Etienne Simard brought this change]
- openssl: use SSL_CTX_set_<min|max>_proto_version() when available
+ CONTRIBUTE.md: Fix grammatical errors
- OpenSSL 1.1.0 adds SSL_CTX_set_<min|max>_proto_version() that we now use
- when available. Existing code is preserved for older versions of
- OpenSSL.
+ Fix grammatical errors making the document read better. Also fixes
+ a typo.
- Closes #4304
-
-- [Clément Notin brought this change]
-
- openssl: indent, re-organize and add comments
+ Closes #3525
+ Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
-- [migueljcrum brought this change]
+Daniel Stenberg (4 Feb 2019)
+- [Julian Z brought this change]
- sspi: fix memory leaks
+ docs: use $(INSTALL_DATA) to install man page
- Closes #4299
+ Fixes #3518
+ Closes #3522
-- travis: disable ngtcp2 builds (again)
+Jay Satiro (4 Feb 2019)
+- [Ladar Levison brought this change]
-- Curl_fillreadbuffer: avoid double-free trailer buf on error
+ runtests.pl: Fix perl call to include srcdir
- Reviewed-by: Jay Satiro
- Reported-by: Thomas Vegas
+ - Use explicit include opt for perl calls.
- Closes #4307
-
-- tool_setopt: handle a libcurl build without netrc support
+ Prior to this change some scripts couldn't find their dependencies.
- Reported-by: codesniffer13 on github
- Fixes #4302
- Closes #4305
-
-- security:read_data fix bad realloc()
+ At the top, perl is called using with the "-Isrcdir" option, and it
+ works:
+
+ https://github.com/curl/curl/blob/curl-7_63_0/tests/runtests.pl#L183
+
+ But on line 3868, that option is omitted. This caused problems for me,
+ as the symbol-scan.pl script in particular couldn't find its
+ dependencies properly:
- ... that could end up a double-free
+ https://github.com/curl/curl/blob/curl-7_63_0/tests/runtests.pl#L3868
- CVE-2019-5481
- Bug: https://curl.haxx.se/docs/CVE-2019-5481.html
+ This patch fixes that oversight by making calls to perl sub-shells
+ uniform.
+
+ Closes https://github.com/curl/curl/pull/3496
-- [Thomas Vegas brought this change]
+Daniel Stenberg (4 Feb 2019)
+- [Daniel Gustafsson brought this change]
- tftp: Alloc maximum blksize, and use default unless OACK is received
+ smtp: avoid risk of buffer overflow in strtol
+
+ If the incoming len 5, but the buffer does not have a termination
+ after 5 bytes, the strtol() call may keep reading through the line
+ buffer until is exceeds its boundary. Fix by ensuring that we are
+ using a bounded read with a temporary buffer on the stack.
- Fixes potential buffer overflow from 'recvfrom()', should the server
- return an OACK without blksize.
+ Bug: https://curl.haxx.se/docs/CVE-2019-3823.html
+ Reported-by: Brian Carpenter (Geeknik Labs)
+ CVE-2019-3823
+
+- ntlm: fix *_type3_message size check to avoid buffer overflow
- Bug: https://curl.haxx.se/docs/CVE-2019-5482.html
- CVE-2019-5482
+ Bug: https://curl.haxx.se/docs/CVE-2019-3822.html
+ Reported-by: Wenxiang Qian
+ CVE-2019-3822
-- [Thomas Vegas brought this change]
+- NTLM: fix size check condition for type2 received data
+
+ Bug: https://curl.haxx.se/docs/CVE-2018-16890.html
+ Reported-by: Wenxiang Qian
+ CVE-2018-16890
- tftp: return error when packet is too small for options
+Marcel Raad (1 Feb 2019)
+- [georgeok brought this change]
-- KNOWN_BUGS/TODO: cleanup and remove outdated issues
+ spnego_sspi: add support for channel binding
+
+ Attempt to add support for Secure Channel binding when negotiate
+ authentication is used. The problem to solve is that by default IIS
+ accepts channel binding and curl doesn't utilise them. The result was a
+ 401 response. Scope affects only the Schannel(winssl)-SSPI combination.
+
+ Fixes https://github.com/curl/curl/issues/3503
+ Closes https://github.com/curl/curl/pull/3509
+Daniel Stenberg (1 Feb 2019)
- RELEASE-NOTES: synced
-- netrc: free 'home' on error
-
- Follow-up to f9c7ba9096ec2
+- schannel: stop calling it "winssl"
- Coverity CID 1453474
+ Stick to "Schannel" everywhere. The configure option --with-winssl is
+ kept to allow existing builds to work but --with-schannel is added as an
+ alias.
- Closes #4291
+ Closes #3504
-- urldata: avoid 'generic', use dedicated pointers
+- multi: set the EXPIRE_*TIMEOUT timers at TIMER_STARTSINGLE time
- For the 'proto' union within the connectdata struct.
+ To make sure Curl_timeleft() also thinks the timeout has been reached
+ when one of the EXPIRE_*TIMEOUTs expires.
- Closes #4290
+ Bug: https://curl.haxx.se/mail/lib-2019-01/0073.html
+ Reported-by: Zhao Yisha
+ Closes #3501
-- cleanup: move functions out of url.c and make them static
+- [John Marshall brought this change]
+
+ doc: use meaningless port number in CURLOPT_LOCALPORT example
+
+ Use an ephemeral port number here; previously the example had 8080
+ which could be confusing as the common web server port number might
+ be misinterpreted as suggesting this option affects the remote port.
- Closes #4289
+ URL: https://curl.haxx.se/mail/lib-2019-01/0084.html
+ Closes #3513
+
+GitHub (29 Jan 2019)
+- [Gisle Vanem brought this change]
-- smtp: check for and bail out on too short EHLO response
+ Escape the '\'
- Otherwise, a three byte response would make the smtp_state_ehlo_resp()
- function misbehave.
+ A backslash should be escaped in Roff / Troff.
+
+Jay Satiro (29 Jan 2019)
+- TODO: WinSSL: 'Add option to disable client cert auto-send'
- Credit to OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/16918
+ By default WinSSL selects and send a client certificate automatically,
+ but for privacy and consistency we should offer an option to disable the
+ default auto-send behavior.
- Assisted-by: Max Dymond
+ Reported-by: Jeroen Ooms
- Closes #4287
+ Closes https://github.com/curl/curl/issues/2262
+
+Daniel Stenberg (28 Jan 2019)
+- [Jeremie Rapin brought this change]
-- smb: init *msg to NULL in smb_send_and_recv()
+ sigpipe: if mbedTLS is used, ignore SIGPIPE
- ... it might otherwise return OK from this function leaving that pointer
- uninitialized.
+ mbedTLS doesn't have a sigpipe management. If a write/read occurs when
+ the remote closes the socket, the signal is raised and kills the
+ application. Use the curl mecanisms fix this behavior.
- Bug: https://crbug.com/oss-fuzz/16907
+ Signed-off-by: Jeremie Rapin <j.rapin@overkiz.com>
- Closes #4286
+ Closes #3502
-- ROADMAP: updated after recent user poll
-
- In rough prio order
+- unit1653: make it survive torture tests
-- THANKS: remove duplicate
+Jay Satiro (28 Jan 2019)
+- [Michael Kujawa brought this change]
-- Curl_addr2string: take an addrlen argument too
+ timeval: Disable MSVC Analyzer GetTickCount warning
- This allows the function to figure out if a unix domain socket has a
- file name or not associated with it! When a socket is created with
- socketpair(), as done in the fuzzer testing, the path struct member is
- uninitialized and must not be accessed.
+ Compiling with msvc /analyze and a recent Windows SDK warns against
+ using GetTickCount (Suggests to use GetTickCount64 instead.)
- Bug: https://crbug.com/oss-fuzz/16699
+ Since GetTickCount is only being used when GetTickCount64 isn't
+ available, I am disabling that warning.
- Closes #4283
-
-- [Rolf Eike Beer brought this change]
+ Fixes https://github.com/curl/curl/issues/3437
+ Closes https://github.com/curl/curl/pull/3440
- CMake: remove needless newlines at end of gss variables
+Daniel Stenberg (26 Jan 2019)
+- configure: rewrite --enable-code-coverage
+
+ The previously used ax_code_coverage.m4 is not license compatible and
+ must not be used.
+
+ Reported-by: William A. Rowe Jr
+ Fixes #3497
+ Closes #3499
-- [Rolf Eike Beer brought this change]
+- [Felix Hädicke brought this change]
- CI: remove duplicate configure flag for LGTM.com
+ setopt: enable CURLOPT_SSH_KNOWNHOSTS and CURLOPT_SSH_KEYFUNCTION for libssh
+
+ CURLOPT_SSH_KNOWNHOSTS and CURLOPT_SSH_KEYFUNCTION are supported for
+ libssh as well. So accepting these options only when compiling with
+ libssh2 is wrong here.
+
+ Fixes #3493
+ Closes #3494
-- [Rolf Eike Beer brought this change]
+- [Felix Hädicke brought this change]
- CMake: use platform dependent name for dlopen() library
+ libssh: do not let libssh create socket
- Closes #4279
-
-- quiche: expire when poll returned data
+ By default, libssh creates a new socket, instead of using the socket
+ created by curl for SSH connections.
- ... to make sure we continue draining the queue until empty
+ Pass the socket created by curl to libssh using ssh_options_set() with
+ SSH_OPTIONS_FD directly after ssh_new(). So libssh uses our socket
+ instead of creating a new one.
- Closes #4281
-
-- quiche: decrease available buffer size, don't assign it!
+ This approach is very similar to what is done in the libssh2 code, where
+ the socket created by curl is passed to libssh2 when
+ libssh2_session_startup() is called.
- Found-by: Jeremy Lainé
+ Fixes #3491
+ Closes #3495
- RELEASE-NOTES: synced
-- [Kyohei Kadota brought this change]
-
- curl: fix include conditions
+- [Archangel_SDY brought this change]
-- [Kyohei Kadota brought this change]
+ schannel: preserve original certificate path parameter
+
+ Fixes #3480
+ Closes #3487
- plan9: fix installation instructions
+- KNOWN_BUGS: tests not compatible with python3
- Closes #4276
+ Closes #3289
+ [skip ci]
-- ngtcp2: on h3 stream close, call expire
+Daniel Gustafsson (20 Jan 2019)
+- memcmp: avoid doing single char memcmp
- ... to trigger a new read to detect the stream close!
+ There is no real gain in performing memcmp() comparisons on single
+ characters, so change these to array subscript inspections which
+ saves a call and makes the code clearer.
- Closes #4275
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Closes #3486
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
- ngtcp2: build latest ngtcp2 and ngtcp2_crypto_openssl
+Daniel Stenberg (19 Jan 2019)
+- COPYING: it's 2019
- Closes #4278
+ [skip ci]
+
+- [hhb brought this change]
-- ngtcp2: set flow control window to stream buffer size
+ configure: fix recv/send/select detection on Android
+
+ This reverts commit d4f25201fb7da03fc88f90d51101beb3d0026db9.
- Closes #4274
+ The overloadable attribute is removed again starting from
+ NDK17. Actually they only exist in two NDK versions (15 and 16). With
+ overloadable, the first condition tried will succeed. Results in wrong
+ detection result.
+
+ Closes #3484
-- [Christopher Head brought this change]
+Marcel Raad (19 Jan 2019)
+- [georgeok brought this change]
- CURLOPT_HEADERFUNCTION.3: clarify
+ ntlm_sspi: add support for channel binding
+
+ Windows extended potection (aka ssl channel binding) is required
+ to login to ntlm IIS endpoint, otherwise the server returns 401
+ responses.
- Closes #4273
+ Fixes #3280
+ Closes #3321
-- CURLINFO docs: mention that in redirects times are added
+Daniel Stenberg (18 Jan 2019)
+- schannel: on connection close there might not be a transfer
- Suggested-by: Brandon Dong
- Fixes #4250
- Closes #4269
+ Reported-by: Marcel Raad
+ Fixes #3412
+ Closes #3483
-- travis: enable ngtcp2 builds again
+- [Joel Depooter brought this change]
+
+ ssh: log the libssh2 error message when ssh session startup fails
- Switched to the openssl-quic-draft-22 openssl branch.
+ When a ssh session startup fails, it is useful to know why it has
+ failed. This commit changes the message from:
+ "Failure establishing ssh session"
+ to something like this, for example:
+ "Failure establishing ssh session: -5, Unable to exchange encryption keys"
- Closes #4271
+ Closes #3481
-- HTTP3: switched openssl branch to use
+Alessandro Ghedini (16 Jan 2019)
+- Fix typo in manpage
-- [Tatsuhiro Tsujikawa brought this change]
+Daniel Stenberg (16 Jan 2019)
+- RELEASE-NOTES: synced
- ngtcp2: Build with latest ngtcp2 and ngtcp2_crypto_openssl
-
- Closes #4270
+Sergei Nikulov (16 Jan 2019)
+- cmake: updated check for HAVE_POLL_FINE to match autotools
-- http2: when marked for closure and wanted to close == OK
+Daniel Stenberg (16 Jan 2019)
+- curl-compilers.m4: check for __ibmxl__ to detect xlclang
- It could otherwise return an error even when closed correctly if GOAWAY
- had been received previously.
+ Follow-up to 2fa0d57e2e3. The __xlc__ symbol is only defined there if a
+ particular flag is used for legacy macros.
- Reported-by: Tom van der Woerdt
- Fixes #4267
- Closes #4268
-
-- RELEASE-NOTES: synced
+ Fixes #3474
+ Closes #3479
-- build-openssl: fix build with Visual Studio 2019
+- openssl: fix the SSL_get_tlsext_status_ocsp_resp call
- Reviewed-by: Marcel Raad
- Contributed-by: osabc on github
- Fixes #4188
- Closes #4266
+ .... to not pass in a const in the second argument as that's not how it
+ is supposed to be used and might cause compiler warnings.
+
+ Reported-by: Pavel Pavlov
+ Fixes #3477
+ Closes #3478
-Kamil Dudka (26 Aug 2019)
-- vauth: return CURLE_AUTH_ERROR on gss_init_sec_context() failure
+- curl-compilers.m4: detect xlclang
- This is a follow-up to https://github.com/curl/curl/pull/3864 .
+ Since it isn't totally clang compatible, we detect this IBM clang
+ front-end and if detected, avoids some clang specific magic.
- Closes #4224
+ Reported-by: Kees Dekker
+ Fixes #3474
+ Closes #3476
-Daniel Stenberg (26 Aug 2019)
-- KNOWN_BUGS: USE_UNIX_SOCKETS on Windows
+- README: add codacy code quality badge
- Closes #4040
+ [skip ci]
-- quiche: send the HTTP body correctly on callback uploads
+- extract_if_dead: follow-up to 54b201b48c90a
- Closes #4265
-
-- travis: disable ngtcp2 builds (temporarily)
+ extract_if_dead() dead is called from two functions, and only one of
+ them should get conn->data updated and now neither call path clears it.
- Just too many API changes right now
+ scan-build found a case where conn->data would be NULL dereferenced in
+ ConnectionExists() otherwise.
- Closes #4264
+ Closes #3473
-- ngtcp2: add support for SSLKEYLOGFILE
+- multi: remove "Dead assignment"
- Closes #4260
-
-- ngtcp2: improve h3 response receiving
+ Found by scan-build. Follow-up to 4c35574bb785ce.
- Closes #4259
-
-- ngtcp2: use nghttp3_version()
+ Closes #3471
-- ngtcp2: sync with upstream API changes
+- tests: move objnames-* from lib into tests
- Assisted-by: Tatsuhiro Tsujikawa
+ Since they're used purely for testing purposes, I think they should
+ rather be stored there.
+
+ Closes #3470
-- [Kyle Abramowitz brought this change]
+Sergei Nikulov (15 Jan 2019)
+- travis: added cmake build for osx
- scp: fix directory name length used in memcpy
-
- Fix read off end of array due to bad pointer math in getworkingpath for
- SCP home directory case.
+Daniel Stenberg (14 Jan 2019)
+- [Frank Gevaerts brought this change]
+
+ cookie: fix comment typo (url_path_len -> uri_path_len)
- Closes #4258
+ Closes #3469
-- http: the 'closed' struct field is used by both ngh2 and ngh3
+Marcel Raad (14 Jan 2019)
+- winbuild: conditionally use /DZLIB_WINAPI
- and remove 'header_recvbuf', not used for anything
+ zlibwapi.lib (dynamic library) and zlibstat.lib (static library) have
+ the ZLIB_WINAPI define set by default. Using them requires that define
+ too.
- Reported-by: Jeremy Lainé
+ Ref: https://zlib.net/DLL_FAQ.txt
- Closes #4257
+ Fixes https://github.com/curl/curl/issues/3133
+ Closes https://github.com/curl/curl/pull/3460
-- ngtcp2: accept upload via callback
-
- Closes #4256
+Daniel Stenberg (14 Jan 2019)
+- src/Makefile: make 'tidy' target work for metalink builds
-- defines: avoid underscore-prefixed defines
+- extract_if_dead: use a known working transfer when checking connections
- Double-underscored or underscore plus uppercase letter at least.
+ Make sure that this function sets a proper "live" transfer for the
+ connection before calling the protocol-specific connection check
+ function, and then clear it again afterward as a non-used connection has
+ no current transfer.
- ... as they're claimed to be reserved.
+ Reported-by: Jeroen Ooms
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Gustafsson
+ Fixes #3463
+ Closes #3464
+
+- openssl: adapt to 3.0.0, OpenSSL_version_num() is deprecated
- Reported-by: patnyb on github
+ OpenSSL_version() replaces OpenSSL_version_num()
- Fixes #4254
- Closes #4255
+ Closes #3462
-- travis: add a build using ngtcp2 + nghttp3 (and a patched OpenSSL)
+Sergei Nikulov (11 Jan 2019)
+- cmake: added checks for HAVE_VARIADIC_MACROS_C99 and HAVE_VARIADIC_MACROS_GCC
+
+Daniel Stenberg (11 Jan 2019)
+- urldata: rename easy_conn to just conn
- Runs no tests
+ We use "conn" everywhere to be a pointer to the connection.
- Closes #4253
-
-- travis: bump to using nghttp2 version 1.39.2
+ Introduces two functions that "attaches" and "detaches" the connection
+ to and from the transfer.
- Closes #4252
-
-- [Gisle Vanem brought this change]
+ Going forward, we should favour using "data->conn" (since a transfer
+ always only has a single connection or none at all) to "conn->data"
+ (since a connection can have none, one or many transfers associated with
+ it and updating conn->data to be correct is error prone and a frequent
+ reason for internal issues).
+
+ Closes #3442
- docs/examples/curlx: fix errors
+- tool_cb_prg: avoid integer overflow
- Initialise 'mimetype' and require the -p12 arg.
+ When calculating the progress bar width.
- Closes #4248
+ Reported-by: Peng Li
+ Fixes #3456
+ Closes #3458
-- cleanup: remove DOT_CHAR completely
-
- Follow-up to f9c7ba9096ec
+Daniel Gustafsson (11 Jan 2019)
+- travis: turn off copyright year checks in checksrc
- The use of DOT_CHAR for ".ssh" was probably a mistake and is removed
- now.
+ Invoking the maintainer intended COPYRIGHTYEAR check for everyone
+ in the PR pipeline is too invasive, especially at the turn of the
+ year when many files get affected. Remove and leave it as a tool
+ for maintainers to verify patches before commits.
- Pointed-out-by: Gisle Vanem
- Bug: https://github.com/curl/curl/pull/4230#issuecomment-522960638
+ This reverts f7bdf4b2e1d81b2652b81b9b3029927589273b41.
- Closes #4247
+ After discussion with: Daniel Stenberg
-- spnego_sspi: add typecast to fix build warning
+Daniel Stenberg (10 Jan 2019)
+- KNOWN_BUGS: cmake makes unusable tool_hugehelp.c with MinGW
- Reported in build "Win32 target on Debian Stretch (64-bit) -
- i686-w64-mingw32 - gcc-20170516"
-
- Closes #4245
+ Closes #3125
-- openssl: build warning free with boringssl
+- KNOWN_BUGS: Improve --data-urlencode space encoding
- Closes #4244
+ Closes #3229
-- curl: make --libcurl use CURL_HTTP_VERSION_3
+Patrick Monnerat (10 Jan 2019)
+- os400: add a missing closing bracket
+
+ See https://github.com/curl/curl/issues/3453#issuecomment-453054458
- Closes #4243
+ Reported-by: jonrumsey on github
-- ngtcp2: make postfields-set posts work
+- os400: fix extra parameter syntax error.
- Closes #4242
+ Reported-by: jonrumsey on github
+ Closes #3453
-- http: remove chunked-encoding and expect header use for HTTP/3
+Daniel Stenberg (10 Jan 2019)
+- test1558: verify CURLINFO_PROTOCOL on file:// transfer
+
+ Attempt to reproduce issue #3444.
+
+ Closes #3447
-- [Alessandro Ghedini brought this change]
+- RELEASE-NOTES: synced
- configure: use pkg-config to detect quiche
+- xattr: strip credentials from any URL that is stored
- This removes the need to hard-code the quiche target path in
- configure.ac.
+ Both user and password are cleared uncondtitionally.
- This depends on https://github.com/cloudflare/quiche/pull/128
+ Added unit test 1621 to verify.
- Closes #4237
+ Fixes #3423
+ Closes #3433
-- CURLOPT_SSL_VERIFYHOST: treat the value 1 as 2
+- cookies: allow secure override when done over HTTPS
- For a long time (since 7.28.1) we've returned error when setting the
- value to 1 to make applications notice that we stopped supported the old
- behavior for 1. Starting now, we treat 1 and 2 exactly the same.
+ Added test 1562 to verify.
- Closes #4241
+ Reported-by: Jeroen Ooms
+ Fixes #3445
+ Closes #3450
-- curl: use .curlrc (with a dot) on Windows as well
+- multi: multiplexing improvements
- Fall-back to _curlrc if the dot-version is missing.
+ Fixes #3436
+ Closes #3448
- Co-Authored-By: Steve Holme
+ Problem 1
- Closes #4230
-
-- netrc: make the code try ".netrc" on Windows as well
+ After LOTS of scratching my head, I eventually realized that even when doing
+ 10 uploads in parallel, sometimes the socket callback to the application that
+ tells it what to wait for on the socket, looked like it would reflect the
+ status of just the single transfer that just changed state.
- ... but fall back and try "_netrc" too if the dot version didn't work.
+ Digging into the code revealed that this was indeed the truth. When multiple
+ transfers are using the same connection, the application did not correctly get
+ the *combined* flags for all transfers which then could make it switch to READ
+ (only) when in fact most transfers wanted to get told when the socket was
+ WRITEABLE.
- Co-Authored-By: Steve Holme
-
-- ngtcp2: use ngtcp2_version() to get the run-time version
+ Problem 1b
- ... which of course doesn't have to be the same used at build-time.
+ A separate but related regression had also been introduced by me when I
+ cleared connection/transfer association better a while ago, as now the logic
+ couldn't find the connection and see if that was marked as used by more
+ transfers and then it would also prematurely remove the socket from the socket
+ hash table even in times other transfers were still using it!
- Function just recently merged in ngtcp2.
-
-- ngtcp2: move the h3 initing to immediately after the rx key
+ Fix 1
- To fix a segfault and to better deal with 0-RTT
+ Make sure that each socket stored in the socket hash has a "combined" action
+ field of what to ask the application to wait for, that is potentially the ORed
+ action of multiple parallel transfers. And remove that socket hash entry only
+ if there are no transfers left using it.
- Assisted-by: Tatsuhiro Tsujikawa
-
-- [Alessandro Ghedini brought this change]
-
- quiche: register debug callback once and earlier
+ Problem 2
+
+ The socket hash entry stored an association to a single transfer using that
+ socket - and when curl_multi_socket_action() was called to tell libcurl about
+ activities on that specific socket only that transfer was "handled".
+
+ This was WRONG, as a single socket/connection can be used by numerous parallel
+ transfers and not necessarily a single one.
- The quiche debug callback is global and can only be initialized once, so
- make sure we don't do it multiple times (e.g. if multiple requests are
- executed).
+ Fix 2
- In addition this initializes the callback before the connection is
- created, so we get logs for the handshake as well.
+ We now store a list of handles in the socket hashtable entry and when libcurl
+ is told there's traffic for a particular socket, it now iterates over all
+ known transfers using that single socket.
+
+- test1561: improve test name
- Closes #4236
+ [skip ci]
+
+- [Katsuhiko YOSHIDA brought this change]
-- ssh: add a generic Curl_ssh_version function for SSH backends
+ cookies: skip custom cookies when redirecting cross-site
- Closes #4235
+ Closes #3417
-- base64: check for SSH, not specific SSH backends
+- THANKS: fixups and a dedupe
+
+ [skip ci]
-- vssh: move ssh init/cleanup functions into backend code
+- timediff: fix math for unsigned time_t
+
+ Bug: https://curl.haxx.se/mail/lib-2018-12/0088.html
+
+ Closes #3449
-- vssh: create directory for SSH backend code
+- [Bernhard M. Wiedemann brought this change]
-- TODO/ROADMAP: remove "refuse downgrade redirects" and HTTP/3
+ tests: allow tests to pass by 2037-02-12
- HTTP3 is now already in full progress
+ similar to commit f508d29f3902104018
- Downgrade redirects can be achived almost exactly like that by setting
- CURLOPT_REDIR_PROTOCOLS.
+ Closes #3443
- RELEASE-NOTES: synced
-- travis: add a quiche build
-
- Closes #4207
+- [Brad Spencer brought this change]
-- http: fix use of credentials from URL when using HTTP proxy
+ curl_multi_remove_handle() don't block terminating c-ares requests
- When a username and password are provided in the URL, they were wrongly
- removed from the stored URL so that subsequent uses of the same URL
- wouldn't find the crendentials. This made doing HTTP auth with multiple
- connections (like Digest) mishave.
+ Added Curl_resolver_kill() for all three resolver modes, which only
+ blocks when necessary, along with test 1592 to confirm
+ curl_multi_remove_handle() doesn't block unless it must.
- Regression from 46e164069d1a5230 (7.62.0)
+ Closes #3428
+ Fixes #3371
+
+- Revert "http_negotiate: do not close connection until negotiation is completed"
- Test case 335 added to verify.
+ This reverts commit 07ebaf837843124ee670e5b8c218b80b92e06e47.
- Reported-by: Mike Crowe
+ This also reopens PR #3275 which brought the change now reverted.
- Fixes #4228
- Closes #4229
-
-- [Mike Crowe brought this change]
+ Fixes #3384
+ Closes #3439
- tests: Replace outdated test case numbering documentation
-
- Tests are no longer grouped by numeric range[1]. Let's stop saying that
- and provide some alternative advice for numbering tests.
+- curl/urlapi.h: include "curl.h" first
- [1] https://curl.haxx.se/mail/lib-2019-08/0043.html
+ This allows programs to include curl/urlapi.h directly.
- Closes #4227
+ Reviewed-by: Daniel Gustafsson
+ Reported-by: Ben Kohler
+ Fixes #3438
+ Closes #3441
-- travis: reduce number of torture tests in 'coverage'
+Marcel Raad (6 Jan 2019)
+- VS projects: fix build warning
- ... to make it complete in time. This cut seems not almost not affect
- the coverage percentage and yet completes within 35 minutes on travis
- where the previous runs recently always timed out after 50.
+ Starting with Visual Studio 2017 Update 9, Visual Studio doesn't like
+ the MinimalRebuild option anymore and warns:
- Closes #4223
-
-- [Igor Makarov brought this change]
-
- configure: use -lquiche to link to quiche
+ cl : Command line warning D9035: option 'Gm' has been deprecated and
+ will be removed in a future release
- Closes #4226
-
-- ngtcp2: provide the callbacks as a static struct
+ The option can be safely removed so that the default is used.
- ... instead of having them in quicsocket
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Closes https://github.com/curl/curl/pull/3425
- ngtcp2: add missing nghttp3_conn_add_write_offset call
+- schannel: fix compiler warning
- Closes #4225
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: deal with stream close
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: Consume QUIC STREAM data properly
-
-- [Tatsuhiro Tsujikawa brought this change]
+ When building with Unicode on MSVC, the compiler warns about freeing a
+ pointer to const in Curl_unicodefree. Fix this by declaring it as
+ non-const and casting the argument to Curl_convert_UTF8_to_tchar to
+ non-const too, like we do in all other places.
+
+ Closes https://github.com/curl/curl/pull/3435
- ngtcp2: don't reinitialize SSL on Retry
+Daniel Stenberg (4 Jan 2019)
+- [Rikard Falkeborn brought this change]
-- multi: getsock improvements for QUIC connecting
+ printf: introduce CURL_FORMAT_TIMEDIFF_T
-- connect: connections are persistent by default for HTTP/3
+- [Rikard Falkeborn brought this change]
-- quiche: happy eyeballs
+ printf: fix format specifiers
- Closes #4220
-
-- ngtcp2: do QUIC connections happy-eyeballs friendly
+ Closes #3426
-- curl_version: bump string buffer size to 250
+- libtest/stub_gssapi: use "real" snprintf
- With HTTP/3 libs and plenty TLS libs, I manged to hit the limit (which
- causes a truncated output).
-
-- CURLOPT_ALTSVC.3: use a "" file name to not load from a file
-
-Jay Satiro (14 Aug 2019)
-- vauth: Use CURLE_AUTH_ERROR for auth function errors
+ ... since it doesn't link with libcurl.
- - Add new error code CURLE_AUTH_ERROR.
+ Reverts the commit dcd6f81025 changes from this file.
- Prior to this change auth function errors were signaled by
- CURLE_OUT_OF_MEMORY and CURLE_RECV_ERROR, and neither one was
- technically correct.
+ Bug: https://curl.haxx.se/mail/lib-2019-01/0000.html
+ Reported-by: Shlomi Fish
+ Reviewed-by: Daniel Gustafsson
+ Reviewed-by: Kamil Dudka
- Ref: https://github.com/curl/curl/pull/3848
+ Closes #3434
+
+- INTERNALS: correct some outdated function names
- Co-authored-by: Dominik Hölzl
+ Closes #3431
+
+- docs/version.d: mention MultiSSL
- Closes https://github.com/curl/curl/pull/3864
+ Reviewed-by: Daniel Gustafsson
+ Closes #3432
-Daniel Stenberg (13 Aug 2019)
-- curl_version_info: make the quic_version a const
+Daniel Gustafsson (2 Jan 2019)
+- [Rikard Falkeborn brought this change]
+
+ examples: Update .gitignore
- Follow-up from 1a2df1518ad8653f
+ Add a few missing examples to make `make examples` not leave the
+ workspace in a dirty state.
- Closes #4222
+ Closes #3427
+ Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
-- examples: add http3.c, altsvc.c and http3-present.c
+- THANKS: add more missing names
- Closes #4221
+ Add Adrian Burcea who made the artwork for the curl://up 2018 event
+ which was held in Stockholm, Sweden.
-Peter Wu (13 Aug 2019)
-- nss: use TLSv1.3 as default if supported
+- docs: mention potential leak in curl_slist_append
- SSL_VersionRangeGetDefault returns (TLSv1.0, TLSv1.2) as supported
- range in NSS 3.45. It looks like the intention is to raise the minimum
- version rather than lowering the maximum, so adjust accordingly. Note
- that the caller (nss_setup_connect) initializes the version range to
- (TLSv1.0, TLSv1.3), so there is no need to check for >= TLSv1.0 again.
+ When a non-empty list is appended to, and used as the returnvalue,
+ the list pointer can leak in case of an allocation failure in the
+ curl_slist_append() call. This is correctly handled in curl code
+ usage but we weren't explicitly pointing it out in the API call
+ documentation. Fix by extending the RETURNVALUE manpage section
+ and example code.
- Closes #4187
- Reviewed-by: Daniel Stenberg
- Reviewed-by: Kamil Dudka
-
-Daniel Stenberg (13 Aug 2019)
-- quic.h: remove unused proto
+ Closes #3424
+ Reported-by: dnivras on github
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- curl_version_info.3: mentioned ALTSVC and HTTP3
+Marcel Raad (1 Jan 2019)
+- tvnow: silence conversion warnings
- ... and sorted the list alphabetically
+ MinGW-w64 defaults to targeting Windows 7 now, so GetTickCount64 is
+ used and the milliseconds are represented as unsigned long long,
+ leading to a compiler warning when implicitly converting them to long.
-- lib/quic.c: unused - removed
-
-- CURLOPT_ALTSVC_CTRL.3: remove CURLALTSVC_ALTUSED
+Daniel Stenberg (1 Jan 2019)
+- THANKS: dedupe more names
- Follow-up to 98c3f148 that removed it from the header file
+ Researched-by: Tae Wong
-- [Junho Choi brought this change]
+Marcel Raad (1 Jan 2019)
+- [Markus Moeller brought this change]
- docs/HTTP3: simplify quiche build instruction
+ ntlm: update selection of type 3 response
+
+ NTLM2 did not work i.e. no NTLMv2 response was created. Changing the
+ check seems to work.
- Use --recursive to get boringssl in one line
+ Ref: https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-NLMP/[MS-NLMP].pdf
- Closes #4219
+ Fixes https://github.com/curl/curl/issues/3286
+ Closes https://github.com/curl/curl/pull/3287
+ Closes https://github.com/curl/curl/pull/3415
-- altsvc: make it use h3-22 with ngtcp2 as well
+Daniel Stenberg (31 Dec 2018)
+- THANKS: added missing names from year <= 2000
+
+ Due to a report of a missing name in THANKS I manually went through an
+ old CHANGES.0 file and added many previously missing names here.
-- ngtcp2: initial h3 request work
+Daniel Gustafsson (30 Dec 2018)
+- urlapi: fix parsing ipv6 with zone index
- Closes #4217
+ The previous fix for parsing IPv6 URLs with a zone index was a paddle
+ short for URLs without an explicit port. This patch fixes that case
+ and adds a unit test case.
+
+ This bug was highlighted by issue #3408, and while it's not the full
+ fix for the problem there it is an isolated bug that should be fixed
+ regardless.
+
+ Closes #3411
+ Reported-by: GitYuanQu on github
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- curl_version_info: offer quic (and h3) library info
+Daniel Stenberg (30 Dec 2018)
+- THANKS: dedupe Guenter Knauf
- Closes #4216
+ Reported-by: Tae Wong
-- HTTP3: use ngtcp2's draft-22 branch
+- THANKS: missing name from the 6.3.1 release!
+Daniel Gustafsson (27 Dec 2018)
- RELEASE-NOTES: synced
-- CURLOPT_READFUNCTION.3: provide inline example
-
- ... instead of mentioning one in another place
-
-- [Tatsuhiro Tsujikawa brought this change]
+- [Claes Jakobsson brought this change]
- ngtcp2: send HTTP/3 request with nghttp3
+ hostip: support wildcard hosts
- This commit makes sending HTTP/3 request with nghttp3 work. It
- minimally receives HTTP response and calls nghttp3 callbacks, but no
- processing is made at the moment.
+ This adds support for wildcard hosts in CURLOPT_RESOLVE. These are
+ try-last so any non-wildcard entry is resolved first. If specified,
+ any host not matched by another CURLOPT_RESOLVE config will use this
+ as fallback.
- Closes #4215
-
-- nghttp3: initial h3 template code added
-
-- nghttp3: required when ngtcp2 is used for QUIC
+ Example send a.com to 10.0.0.1 and everything else to 10.0.0.2:
+ curl --resolve *:443:10.0.0.2 --resolve a.com:443:10.0.0.1 \
+ https://a.com https://b.com
- - checked for by configure
- - updated docs/HTTP3.md
- - shown in the version string
+ This is probably quite similar to using:
+ --connect-to a.com:443:10.0.0.1:443 --connect-to :443:10.0.0.2:443
- Closes #4210
+ Closes #3406
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Eric Wong brought this change]
+- url: fix incorrect indentation
- asyn-thread: issue CURL_POLL_REMOVE before closing socket
+Patrick Monnerat (26 Dec 2018)
+- os400: upgrade ILE/RPG binding.
- This avoids EBADF errors from EPOLL_CTL_DEL operations in the
- ephiperfifo.c example. EBADF is dangerous in multi-threaded
- applications where I rely on epoll_ctl to operate on the same
- epoll description from different threads.
+ - Trailer function support.
+ - http 0.9 option.
+ - curl_easy_upkeep.
+
+Daniel Gustafsson (25 Dec 2018)
+- FAQ: remove mention of sourceforge for github
- Follow-up to eb9a604f8d7db8
+ The project bug tracker is no longer hosted at sourceforge but is now
+ hosted on the curl Github page. Update the FAQ to reflect.
- Bug: https://curl.haxx.se/mail/lib-2019-08/0026.html
- Closes #4211
+ Closes #3410
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Carlo Marcelo Arenas Belón brought this change]
+- openvms: fix typos in documentation
- configure: avoid undefined check_for_ca_bundle
+- openvms: fix OpenSSL discovery on VAX
- instead of using a "greater than 0" test, check for variable being
- set, as it is always set to 1, and could be left unset if non of
- OPENSSL MBEDTLS GNUTLS WOLFSSL is being configured for.
+ The DCL code had a typo in one of the commands which would make the
+ OpenSSL discovery on VAX fail. The correct syntax is F$ENVIRONMENT.
- Closes #4213
+ Closes #3407
+ Reviewed-by: Viktor Szakats <commit@vszakats.net>
-- [Tatsuhiro Tsujikawa brought this change]
+Daniel Stenberg (24 Dec 2018)
+- [Ruslan Baratov brought this change]
- ngtcp2: Send ALPN h3-22
+ cmake: use lowercase for function name like the rest of the code
- Closes #4212
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: use ngtcp2_settings_default and specify initial_ts
-
-- curl_global_init_mem.3: mention it was added in 7.12.0
+ Reviewed-by: Sergei Nikulov
+
+ closes #3196
-- [Tatsuhiro Tsujikawa brought this change]
+- Revert "libssh: no data pointer == nothing to do"
+
+ This reverts commit c98ee5f67f497195c9 since commit f3ce38739fa fixed the
+ problem in a more generic way.
- ngtcp2: make the QUIC handshake work
+- disconnect: set conn->data for protocol disconnect
+
+ Follow-up to fb445a1e18d: Set conn->data explicitly to point out the
+ current transfer when invoking the protocol-specific disconnect function
+ so that it can work correctly.
- Closes #4209
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12173
-- [Alex Mayorga brought this change]
+Jay Satiro (23 Dec 2018)
+- [Pavel Pavlov brought this change]
- HTTP3.md: Update quiche build instructions
+ timeval: Use high resolution timestamps on Windows
- Added cloning for quiche and BoringSSL and modified the build
- instructions so they work on a clean folder.
+ - Use QueryPerformanceCounter on Windows Vista+
- Closes #4208
-
-- CURLOPT_H3: removed
+ There is confusing info floating around that QueryPerformanceCounter
+ can leap etc, which might have been true long time ago, but no longer
+ the case nowadays (perhaps starting from WinXP?). Also, boost and
+ std::chrono::steady_clock use QueryPerformanceCounter in a similar way.
- There's no use for this anymore and it was never in a release.
+ Prior to this change GetTickCount or GetTickCount64 was used, which has
+ lower resolution. That is still the case for <= XP.
- Closes #4206
+ Fixes https://github.com/curl/curl/issues/3309
+ Closes https://github.com/curl/curl/pull/3318
-- http3: make connection reuse work
-
- Closes #4204
+Daniel Stenberg (22 Dec 2018)
+- libssh: no data pointer == nothing to do
-- quiche: add SSLKEYLOGFILE support
+- conncache_unlock: avoid indirection by changing input argument type
-- cleanup: s/curl_debug/curl_dbg_debug in comments and docs
+- disconnect: separate connections and easy handles better
- Leftovers from the function rename back in 76b63489495
+ Do not assume/store assocation between a given easy handle and the
+ connection if it can be avoided.
- Reported-by: Gisle Vanem
- Bug: https://github.com/curl/curl/commit/f3e0f071b14fcb46a453f69bdf4e062bcaacf362#com
- mitcomment-34601751
+ Long-term, the 'conn->data' pointer should probably be removed as it is a
+ little too error-prone. Still used very widely though.
+
+ Reported-by: masbug on github
+ Fixes #3391
+ Closes #3400
+
+- libssh: free sftp_canonicalize_path() data correctly
+
+ Assisted-by: Harry Sintonen
- Closes #4203
+ Fixes #3402
+ Closes #3403
- RELEASE-NOTES: synced
-- alt-svc: add protocol version selection masking
+- http: added options for allowing HTTP/0.9 responses
- So that users can mask in/out specific HTTP versions when Alt-Svc is
- used.
+ Added CURLOPT_HTTP09_ALLOWED and --http0.9 for this purpose.
- - Removed "h2c" and updated test case accordingly
- - Changed how the altsvc struct is laid out
- - Added ifdefs to make the unittest run even in a quiche-tree
+ For now, both the tool and library allow HTTP/0.9 by default.
+ docs/DEPRECATE.md lays out the plan for when to reverse that default: 6
+ months after the 7.64.0 release. The options are added already now so
+ that applications/scripts can start using them already now.
- Closes #4201
+ Fixes #2873
+ Closes #3383
-- http3: fix the HTTP/3 in the request, make alt-svc set right versions
+- if2ip: remove unused function Curl_if_is_interface_name
- Closes #4200
+ Closes #3401
-- alt-svc: send Alt-Used: in redirected requests
+- http2: clear pause stream id if it gets closed
- RFC 7838 section 5:
+ Reported-by: Florian Pritz
- When using an alternative service, clients SHOULD include an Alt-Used
- header field in all requests.
-
- Removed CURLALTSVC_ALTUSED again (feature is still EXPERIMENTAL thus
- this is deemed ok).
-
- You can disable sending this header just like you disable any other HTTP
- header in libcurl.
-
- Closes #4199
+ Fixes #3392
+ Closes #3399
-- CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly
+Daniel Gustafsson (20 Dec 2018)
+- [David Garske brought this change]
+
+ wolfssl: Perform cleanup
- Even though it cannot fall-back to a lower HTTP version automatically. The
- safer way to upgrade remains via CURLOPT_ALTSVC.
+ This adds a cleanup callback for cyassl. Resolves possible memory leak
+ when using ECC fixed point cache.
- CURLOPT_H3 no longer has any bits that do anything and might be removed
- before we remove the experimental label.
+ Closes #3395
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+
+Daniel Stenberg (20 Dec 2018)
+- mbedtls: follow-up VERIFYHOST fix from f097669248
- Updated the curl tool accordingly to use "--http3".
+ Fix-by: Eric Rosenquist
- Closes #4197
+ Fixes #3376
+ Closes #3390
+
+- curlver: bump to 7.64.0 for next release
-- docs/ALTSVC: remove what works and the experimental explanation
+Daniel Gustafsson (19 Dec 2018)
+- cookies: extend domain checks to non psl builds
- Also, put the TODO items at the bottom.
+ Ensure to perform the checks we have to enforce a sane domain in
+ the cookie request. The check for non-PSL enabled builds is quite
+ basic but it's better than nothing.
- Closes #4198
+ Closes #2964
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- docs/EXPERIMENTAL: explain what it means and what's experimental now
+Daniel Stenberg (19 Dec 2018)
+- [Matus Uzak brought this change]
-- curl: make use of CURLINFO_RETRY_AFTER when retrying
+ smb: fix incorrect path in request if connection reused
- If a Retry-After: header was used in the response, that value overrides
- other retry timing options.
+ Follow-up to 09e401e01bf9. If connection gets reused, then data member
+ will be copied, but not the proto member. As a result, in smb_do(),
+ path has been set from the original proto.share data.
- Fixes #3794
- Closes #4195
+ Closes #3388
-- curl: use CURLINFO_PROTOCOL to check for HTTP(s)
+- curl -J: do not append to the destination file
- ... instead of CURLINFO_EFFECTIVE_URL to avoid string operations.
+ Reported-by: Kamil Dudka
+ Fixes #3380
+ Closes #3381
-- CURLINFO_RETRY_AFTER: parse the Retry-After header value
+- mbedtls: use VERIFYHOST
- This is only the libcurl part that provides the information. There's no
- user of the parsed value. This change includes three new tests for the
- parser.
+ Previously, VERIFYPEER would enable/disable all checks.
- Ref: #3794
+ Reported-by: Eric Rosenquist
+ Fixes #3376
+ Closes #3380
-- docs/ALTSVC.md: first basic file format description
-
-- curl: have -w's 'http_version' show '3' for HTTP/3
+- pingpong: change default response timeout to 120 seconds
- Closes #4196
+ Previously it was 30 minutes
-- curl.h: add CURL_HTTP_VERSION_3 to the version enum
+- pingpong: ignore regular timeout in disconnect phase
- It can't be set for CURLOPT_HTTP_VERSION, but it can be extracted with
- CURLINFO_HTTP_VERSION.
-
-- quiche: make use of the connection timeout API properly
-
-- quiche: make POSTFIELDS posts work
-
-- quiche: improved error handling and memory cleanups
+ The timeout set with CURLOPT_TIMEOUT is no longer used when
+ disconnecting from one of the pingpong protocols (FTP, IMAP, SMTP,
+ POP3).
+
+ Reported-by: jasal82 on github
+
+ Fixes #3264
+ Closes #3374
-- quiche: flush egress in h3_stream_recv() too
+- TODO: Windows: set attribute 'archive' for completed downloads
+
+ Closes #3354
- RELEASE-NOTES: synced
-Jay Satiro (6 Aug 2019)
-- [Patrick Monnerat brought this change]
+- http: minor whitespace cleanup from f464535b
+
+- [Ayoub Boudhar brought this change]
- os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
+ http: Implement trailing headers for chunked transfers
+
+ This adds the CURLOPT_TRAILERDATA and CURLOPT_TRAILERFUNCTION
+ options that allow a callback based approach to sending trailing headers
+ with chunked transfers.
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ The test server (sws) was updated to take into account the detection of the
+ end of transfer in the case of trailing headers presence.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Test 1591 checks that trailing headers can be sent using libcurl.
- Closes https://github.com/curl/curl/pull/4186
+ Closes #3350
-- tests: Fix the line endings for the SASL alt-auth tests
+- darwinssl: accept setting max-tls with default min-tls
- - Change data and protocol sections to CRLF line endings.
+ Reported-by: Andrei Neculau
+ Fixes #3367
+ Closes #3373
+
+- gopher: fix memory leak from 9026083ddb2a9
+
+- [Leonardo Taccari brought this change]
+
+ test1201: Add a trailing `?' to the selector
- Prior to this change the tests would fail or hang, which is because
- certain sections such as protocol require CRLF line endings.
+ This verify that the `?' in the selector is kept as is.
- Follow-up to grandparent commit which added the tests.
+ Verifies the fix in #3370
+
+- [Leonardo Taccari brought this change]
+
+ gopher: always include the entire gopher-path in request
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ After the migration to URL API all octets in the selector after the
+ first `?' were interpreted as query and accidentally discarded and not
+ passed to the server.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Add a gopherpath to always concatenate possible path and query URL
+ pieces.
- Closes https://github.com/curl/curl/pull/4186
+ Fixes #3369
+ Closes #3370
-- [Steve Holme brought this change]
+- [Leonardo Taccari brought this change]
- examples: Added SASL PLAIN authorisation identity (authzid) examples
+ urlapi: distinguish possibly empty query
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ If just a `?' to indicate the query is passed always store a zero length
+ query instead of having a NULL query.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ This permits to distinguish URL with trailing `?'.
- Closes https://github.com/curl/curl/pull/4186
-
-- [Steve Holme brought this change]
+ Fixes #3369
+ Closes #3370
- curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
+Daniel Gustafsson (13 Dec 2018)
+- OS400: handle memory error in list conversion
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ Curl_slist_append_nodup() returns NULL when it fails to create a new
+ item for the specified list, and since the coding here reassigned the
+ new list on top of the old list it would result in a dangling pointer
+ and lost memory. Also, in case we hit an allocation failure at some
+ point during the conversion, with allocation succeeding again on the
+ subsequent call(s) we will return a truncated list around the malloc
+ failure point. Fix by assigning to a temporary list pointer, which can
+ be checked (which is the common pattern for slist appending), and free
+ all the resources on allocation failure.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
-
- Closes https://github.com/curl/curl/pull/4186
+ Closes #3372
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Steve Holme brought this change]
+- cookies: leave secure cookies alone
+
+ Only allow secure origins to be able to write cookies with the
+ 'secure' flag set. This reduces the risk of non-secure origins
+ to influence the state of secure origins. This implements IETF
+ Internet-Draft draft-ietf-httpbis-cookie-alone-01 which updates
+ RFC6265.
+
+ Closes #2956
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
+Daniel Stenberg (13 Dec 2018)
+- docs: fix the --tls-max description
- Added the ability for the calling program to specify the authorisation
- identity (authzid), the identity to act as, in addition to the
- authentication identity (authcid) and password when using SASL PLAIN
- authentication.
+ Reported-by: Tobias Lindgren
+ Pointed out in #3367
- Fixes #3653
- Closes #3790
+ Closes #3368
+
+Daniel Gustafsson (12 Dec 2018)
+- urlapi: Fix port parsing of eol colon
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ A URL with a single colon without a portnumber should use the default
+ port, discarding the colon. Fix, add a testcase and also do little bit
+ of comment wordsmithing.
- Closes https://github.com/curl/curl/pull/4186
+ Closes #3365
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Daniel Stenberg (6 Aug 2019)
-- docs/HTTP3: refreshed as it is now in master and HTTP/3 can be tested
+Version 7.63.0 (12 Dec 2018)
-- [Yiming Jing brought this change]
+Daniel Stenberg (12 Dec 2018)
+- RELEASE-NOTES: 7.63.0
- mesalink: implement client authentication
-
- Closes #4184
+- THANKS: from the curl 7.62.0 cycle
+
+- test1519: use lib1518 and test CURLINFO_REDIRECT_URL more
-- curl_multi_poll: a sister to curl_multi_wait() that waits more
+- Curl_follow: extract the Location: header field unvalidated
- Repeatedly we see problems where using curl_multi_wait() is difficult or
- just awkward because if it has no file descriptor to wait for
- internally, it returns immediately and leaves it to the caller to wait
- for a small amount of time in order to avoid occasional busy-looping.
+ ... when not actually following the redirect. Otherwise we return error
+ for this and an application can't extract the value.
- This is often missed or misunderstood, leading to underperforming
- applications.
+ Test 1518 added to verify.
- This change introduces curl_multi_poll() as a replacement drop-in
- function that accepts the exact same set of arguments. This function
- works identically to curl_multi_wait() - EXCEPT - for the case when
- there's nothing to wait for internally, as then this function will by
- itself wait for a "suitable" short time before it returns. This
- effectiely avoids all risks of busy-looping and should also make it less
- likely that apps "over-wait".
+ Reported-by: Pavel Pavlov
+ Fixes #3340
+ Closes #3364
+
+- multi: convert two timeout variables to timediff_t
- This also changes the curl tool to use this funtion internally when
- doing parallel transfers and changes curl_easy_perform() to use it
- internally.
+ The time_t type is unsigned on some systems and these variables are used
+ to hold return values from functions that return timediff_t
+ already. timediff_t is always a signed type.
- Closes #4163
+ Closes #3363
-- quiche:h3_stream_recv return 0 at end of stream
+- delta: use --diff-filter on the git diff-tree invokes
- ... and remove some verbose messages we don't need. Made transfers from
- facebook.com work better.
+ Suggested-by: Dave Reisner
-- altsvc: make quiche use h3-22 now
+Patrick Monnerat (11 Dec 2018)
+- documentation: curl_formadd field and file names are now escaped
+
+ Prior to 7.56.0, fieldnames and filenames were set in Content-Disposition
+ header without special processing: this may lead to invalid RFC 822
+ quoted-strings.
+ 7.56.0 introduces escaping of backslashes and double quotes in these names:
+ mention it in the documentation.
+
+ Reported-by: daboul on github
+ Closes #3361
-- quiche: show the actual version number
+Daniel Stenberg (11 Dec 2018)
+- scripts/delta: show repo delta info from last release
+
+ ... where "last release" should be the git tag in the repo.
-- quiche: first working HTTP/3 request
+Daniel Gustafsson (11 Dec 2018)
+- tests: add urlapi unittest
- - enable debug log
- - fix use of quiche API
- - use download buffer
- - separate header/body
+ This adds a new unittest intended to cover the internal functions in
+ the urlapi code, starting with parse_port(). In order to avoid name
+ collisions in debug builds, parse_port() is renamed Curl_parse_port()
+ since it will be exported.
- Closes #4193
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-- http09: disable HTTP/0.9 by default in both tool and library
+- urlapi: fix portnumber parsing for ipv6 zone index
- As the plan has been laid out in DEPRECATED. Update docs accordingly and
- verify in test 1174. Now requires the option to be set to allow HTTP/0.9
- responses.
+ An IPv6 URL which contains a zone index includes a '%%25<zode id>'
+ string before the ending ']' bracket. The parsing logic wasn't set
+ up to cope with the zone index however, resulting in a malformed url
+ error being returned. Fix by breaking the parsing into two stages
+ to correctly handle the zone index.
- Closes #4191
-
-- quiche: initial h3 request send/receive
+ Closes #3355
+ Closes #3319
+ Reported-by: tonystz on Github
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-- lib/Makefile.am: make checksrc run in vquic too
+Daniel Stenberg (11 Dec 2018)
+- [Jay Satiro brought this change]
-- altsvc: fix removal of expired cache entry
+ http: fix HTTP auth to include query in URI
+
+ - Include query in the path passed to generate HTTP auth.
+
+ Recent changes to use the URL API internally (46e1640, 7.62.0)
+ inadvertently broke authentication URIs by omitting the query.
- Closes #4192
+ Fixes https://github.com/curl/curl/issues/3353
+ Closes #3356
-- RELEASE-NOTES: synced
+- [Michael Kaufmann brought this change]
-Steve Holme (4 Aug 2019)
-- md4: Use our own MD4 implementation when no crypto libraries are available
+ http: don't set CURLINFO_CONDITION_UNMET for http status code 204
+
+ The http status code 204 (No Content) should not change the "condition
+ unmet" flag. Only the http status code 304 (Not Modified) should do
+ this.
- Closes #3780
+ Closes #359
-- md4: No need to include Curl_md4.h for each TLS library
+- [Samuel Surtees brought this change]
-- md4: No need for the NTLM code to call Curl_md4it() for each TLS library
+ ldap: fix LDAP URL parsing regressions
- As the NTLM code no longer calls any of TLS libraries' specific MD4
- functions, there is no need to call this function for each #ifdef.
+ - Match URL scheme with LDAP and LDAPS
+ - Retrieve attributes, scope and filter from URL query instead
+
+ Regression brought in 46e164069d1a5230 (7.62.0)
+
+ Closes #3362
-- md4: Move the mbed TLS MD4 implementation out of the NTLM code
+- RELEASE-NOTES: synced
-- md4: Move the WinCrypt implementation out of the NTLM code
+- [Stefan Kanthak brought this change]
-- md4: Move the SecureTransport implementation out of the NTLM code
+ (lib)curl.rc: fixup for minor bugs
+
+ All resources defined in lib/libcurl.rc and curl.rc are language
+ neutral.
+
+ winbuild/MakefileBuild.vc ALWAYS defines the macro DEBUGBUILD, so the
+ ifdef's in line 33 of lib/libcurl.rc and src/curl.rc are wrong.
+
+ Replace the hard-coded constants in both *.rc files with #define'd
+ values.
+
+ Thumbs-uped-by: Rod Widdowson, Johannes Schindelin
+ URL: https://curl.haxx.se/mail/lib-2018-11/0000.html
+ Closes #3348
-- md4: Use the Curl_md4it() function for OpenSSL based NTLM
+- test329: verify cookie max-age=0 immediate expiry
-- md4: Move the GNU TLS gcrypt MD4 implementation out of the NTLM code
+- cookies: expire "Max-Age=0" immediately
+
+ Reported-by: Jeroen Ooms
+ Fixes #3351
+ Closes #3352
-- md4: Move the GNU TLS Nettle MD4 implementation out of the NTLM code
+- [Johannes Schindelin brought this change]
-Jay Satiro (4 Aug 2019)
-- OS400: Add CURLOPT_H3 symbols
+ Upon HTTP_1_1_REQUIRED, retry the request with HTTP/1.1
- Follow-up to 3af0e76 which added experimental H3 support.
+ This is a companion patch to cbea2fd2c (NTLM: force the connection to
+ HTTP/1.1, 2018-12-06): with NTLM, we can switch to HTTP/1.1
+ preemptively. However, with other (Negotiate) authentication it is not
+ clear to this developer whether there is a way to make it work with
+ HTTP/2, so let's try HTTP/2 first and fall back in case we encounter the
+ error HTTP_1_1_REQUIRED.
- Closes https://github.com/curl/curl/pull/4185
-
-Daniel Stenberg (3 Aug 2019)
-- url: make use of new HTTP version if alt-svc has one
-
-- url: set conn->transport to default TCP at init time
-
-- altsvc: with quiche, use the quiche h3 alpn string
+ Note: we will still keep the NTLM workaround, as it avoids an extra
+ round trip.
- Closes #4183
-
-- alt-svc: more liberal ALPN name parsing
+ Daniel Stenberg helped a lot with this patch, in particular by
+ suggesting to introduce the Curl_h2_http_1_1_error() function.
- Allow pretty much anything to be part of the ALPN identifier. In
- particular minus, which is used for "h3-20" (in-progress HTTP/3
- versions) etc.
+ Closes #3349
- Updated test 356.
- Closes #4182
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-- quiche: use the proper HTTP/3 ALPN
+- [Ben Greear brought this change]
-- quiche: add failf() calls for two error cases
+ openssl: fix unused variable compiler warning with old openssl
- To aid debugging
+ URL: https://curl.haxx.se/mail/lib-2018-11/0055.html
- Closes #4181
+ Closes #3347
-- mailmap: added Kyohei Kadota
+- [Johannes Schindelin brought this change]
-Kamil Dudka (1 Aug 2019)
-- http_negotiate: improve handling of gss_init_sec_context() failures
+ NTLM: force the connection to HTTP/1.1
- If HTTPAUTH_GSSNEGOTIATE was used for a POST request and
- gss_init_sec_context() failed, the POST request was sent
- with empty body. This commit also restores the original
- behavior of `curl --fail --negotiate`, which was changed
- by commit 6c6035532383e300c712e4c1cd9fdd749ed5cf59.
+ Since v7.62.0, cURL tries to use HTTP/2 whenever the server announces
+ the capability. However, NTLM authentication only works with HTTP/1.1,
+ and will likely remain in that boat (for details, see
+ https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported).
- Add regression tests 2077 and 2078 to cover this.
+ When we just found out that we want to use NTLM, and when the current
+ connection runs in HTTP/2 mode, let's force the connection to be closed
+ and to be re-opened using HTTP/1.1.
- Fixes #3992
- Closes #4171
-
-Daniel Stenberg (1 Aug 2019)
-- mailmap: added 4 more names
+ Fixes https://github.com/curl/curl/issues/3341.
+ Closes #3345
- Evgeny Grin, Peter Pih, Anton Malov and Marquis de Muesli
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-- mailmap: add Giorgos Oikonomou
+- [Johannes Schindelin brought this change]
-- src/makefile: fix uncompressed hugehelp.c generation
+ curl_global_sslset(): id == -1 is not necessarily an error
- Regression from 5cf5d57ab9 (7.64.1)
+ It is allowed to call that function with id set to -1, specifying the
+ backend by the name instead. We should imitate what is done further down
+ in that function to allow for that.
- Fixed-by: Lance Ware
- Fixes #4176
- Closes #4177
-
-- appveyor: pass on -k to make
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+ Closes #3346
-- timediff: make it 64 bit (if possible) even with 32 bit time_t
+Johannes Schindelin (6 Dec 2018)
+- .gitattributes: make tabs in indentation a visible error
- ... to make it hold microseconds too.
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+Daniel Stenberg (6 Dec 2018)
+- RELEASE-NOTES: synced
+
+- doh: fix memory leak in OOM situation
- Fixes #4165
- Closes #4168
+ Reviewed-by: Daniel Gustafsson
+ Closes #3342
-- ROADMAP: parallel transfers are merged now
+- doh: make it work for h2-disabled builds too
+
+ Reported-by: dtmsecurity at github
+ Fixes #3325
+ Closes #3336
-- getenv: support up to 4K environment variable contents on windows
+- packages: remove old leftover files and dirs
- Reported-by: Michal ÄŒaplygin
- Fixes #4174
- Closes #4175
+ This subdir has mostly become an attic of never-used cruft from the
+ past.
+
+ Closes #3331
-- [Kyohei Kadota brought this change]
+- [Gergely Nagy brought this change]
- plan9: add support for running on Plan 9
+ openssl: do not use file BIOs if not requested
+
+ Moves the file handling BIO calls to the branch of the code where they
+ are actually used.
- Closes #3701
+ Closes #3339
-- [Kyohei Kadota brought this change]
+- [Paul Howarth brought this change]
- ntlm: explicit type casting
+ nss: Fix compatibility with nss versions 3.14 to 3.15
-- [Justin brought this change]
+- [Paul Howarth brought this change]
- curl.h: fix outdated comment
+ nss: Improve info message when falling back SSL protocol
- Closes #4167
+ Use descriptive text strings rather than decimal numbers.
-- curl: remove outdated comment
+- [Paul Howarth brought this change]
+
+ nss: Fall back to latest supported SSL version
- Turned bad with commit b8894085000
+ NSS may be built without support for the latest SSL/TLS versions,
+ leading to "SSL version range is not valid" errors when the library
+ code supports a recent version (e.g. TLS v1.3) but it has explicitly
+ been disabled.
- Reported-by: niallor on github
- Fixes #4172
- Closes #4173
-
-- cleanup: remove the 'numsocks' argument used in many places
+ This change adjusts the maximum SSL version requested by libcurl to
+ be the maximum supported version at runtime, as long as that version
+ is at least as high as the minimum version required by libcurl.
- It was used (intended) to pass in the size of the 'socks' array that is
- also passed to these functions, but was rarely actually checked/used and
- the array is defined to a fixed size of MAX_SOCKSPEREASYHANDLE entries
- that should be used instead.
+ Fixes #3261
+
+Daniel Gustafsson (3 Dec 2018)
+- travis: enable COPYRIGHTYEAR extended warning
- Closes #4169
+ The extended warning for checking incorrect COPYRIGHTYEAR is quite
+ expensive to run, so rather than expecting every developer to do it
+ we ensure it's turned on locally for Travis.
-- readwrite_data: repair setting the TIMER_STARTTRANSFER stamp
+- checksrc: add COPYRIGHTYEAR check
- Regression, broken in commit 65eb65fde64bd5f (curl 7.64.1)
+ Forgetting to bump the year in the copyright clause when hacking has
+ been quite common among curl developers, but a traditional checksrc
+ check isn't a good fit as it would penalize anyone hacking on January
+ 1st (among other things). This adds a more selective COPYRIGHTYEAR
+ check which intends to only cover the currently hacked on changeset.
- Reported-by: Jonathan Cardoso Machado
- Assisted-by: Jay Satiro
+ The check for updated copyright year is currently not enforced on all
+ files but only on files edited and/or committed locally. This is due to
+ the amount of files which aren't updated with their correct copyright
+ year at the time of their respective commit.
- Fixes #4136
- Closes #4162
-
-- mailmap: Amit Katyal
+ To further avoid running this expensive check for every developer, it
+ adds a new local override mode for checksrc where a .checksrc file can
+ be used to turn on extended warnings locally.
+
+ Closes #3303
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- asyn-thread: removed unused variable
+Daniel Stenberg (3 Dec 2018)
+- CHECKSRC.md: document more warnings
- Follow-up to eb9a604f. Mistake caused by me when I edited the commit
- before push...
+ Closes #3335
+ [ci skip]
- RELEASE-NOTES: synced
-- [Amit Katyal brought this change]
-
- asyn-thread: create a socketpair to wait on
-
- Closes #4157
-
-- curl: cap the maximum allowed values for retry time arguments
+- SECURITY-PROCESS: bountygraph shuts down
- ... to avoid integer overflows later when multiplying with 1000 to
- convert seconds to milliseconds.
+ This backpedals back the documents to the state before bountygraph.
- Added test 1269 to verify.
-
- Reported-by: Jason Lee
- Closes #4166
+ Closes #3311
-- progress: reset download/uploaded counter
+- curl: fix memory leak reading --writeout from file
- ... to make CURLOPT_MAX_RECV_SPEED_LARGE and
- CURLOPT_MAX_SEND_SPEED_LARGE work correctly on subsequent transfers that
- reuse the same handle.
+ If another string had been set first, the writout function for reading
+ the syntax from file would leak the previously allocated memory.
- Fixed-by: Ironbars13 on github
- Fixes #4084
- Closes #4161
+ Reported-by: Brian Carpenter
+ Fixes #3322
+ Closes #3330
-- http2_recv: trigger another read when the last data is returned
-
- ... so that end-of-stream is detected properly.
+- tool_main: rename function to make it unique and better
- Reported-by: Tom van der Woerdt
- Fixes #4043
- Closes #4160
+ ... there's already another function in the curl tool named
+ free_config_fields!
-- curl: avoid uncessary libcurl timeouts (in parallel mode)
+Daniel Gustafsson (29 Nov 2018)
+- TODO: remove CURLOPT_DNS_USE_GLOBAL_CACHE entry
- When curl_multi_wait() returns OK without file descriptors to wait for,
- it might already have done a long timeout.
+ Commit 7c5837e79280e6abb3ae143dfc49bca5e74cdd11 deprecated the option
+ making it a manual code-edit operation to turn it back on. The removal
+ process has thus started and is now documented in docs/DEPRECATE.md so
+ remove from the TODO to avoid anyone looking for something to pick up
+ spend cycles on an already in-progress entry.
- Closes #4159
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Balazs Kovacsics brought this change]
+Jay Satiro (29 Nov 2018)
+- [Sevan Janiyan brought this change]
- HTTP: use chunked Transfer-Encoding for HTTP_POST if size unknown
+ connect: fix building for recent versions of Minix
- If using the read callback for HTTP_POST, and POSTFIELDSIZE is not set,
- automatically add a Transfer-Encoding: chunked header, same as it is
- already done for HTTP_PUT, HTTP_POST_FORM and HTTP_POST_MIME. Update
- test 1514 according to the new behaviour.
+ EBADIOCTL doesn't exist on more recent Minix.
+ There have also been substantial changes to the network stack.
+ Fixes build on Minix 3.4rc
- Closes #4138
+ Closes https://github.com/curl/curl/pull/3323
-Jay Satiro (29 Jul 2019)
-- [Daniel Stenberg brought this change]
+- [Konstantin Kushnir brought this change]
- winbuild: add vquic to list of build directories
+ CMake: fix MIT/Heimdal Kerberos detection
- This fixes the winbuild build method which broke several days ago
- when experimental quic support was added in 3af0e76.
+ - fix syntax error in FindGSS.cmake
+ - correct krb5 include directory. FindGSS exports
+ "GSS_INCLUDE_DIR" variable.
- Reported-by: Michael Lee
-
- Fixes https://github.com/curl/curl/issues/4158
+ Closes https://github.com/curl/curl/pull/3316
-- easy: resize receive buffer on easy handle reset
-
- - In curl_easy_reset attempt to resize the receive buffer to its default
- size. If realloc fails then continue using the previous size.
-
- Prior to this change curl_easy_reset did not properly handle resetting
- the receive buffer (data->state.buffer). It reset the variable holding
- its size (data->set.buffer_size) to the default size (READBUFFER_SIZE)
- but then did not actually resize the buffer. If a user resized the
- buffer by using CURLOPT_BUFFERSIZE to set the size smaller than the
- default, later called curl_easy_reset and attempted to reuse the handle
- then a heap overflow would very likely occur during that handle's next
- transfer.
+Daniel Stenberg (28 Nov 2018)
+- test328: verify Content-Encoding: none
- Reported-by: Felix Hädicke
+ Because of issue #3315
- Fixes https://github.com/curl/curl/issues/4143
- Closes https://github.com/curl/curl/pull/4145
+ Closes #3317
-- [Brad Spencer brought this change]
+- [James Knight brought this change]
- examples: Avoid reserved names in hiperfifo examples
+ configure: include all libraries in ssl-libs fetch
- - Trade in __attribute__((unused)) for the classic (void)x to silence
- unused symbols.
+ When compiling a collection of SSL libraries to link against (SSL_LIBS),
+ ensure all libraries are included. The call `--libs-only-l` can produce
+ only a subset of found in a `--libs` call (e.x. pthread may be excluded).
+ Adding `--libs-only-other` ensures other libraries are also included in
+ the list. This corrects select build environments compiling against a
+ static version of OpenSSL. Before the change, the following could be
+ observed:
- Because the classic way is not gcc specific. Also because the prior
- method mapped to symbol _Unused, which starts with _ and a capital
- letter which is reserved.
+ checking for openssl options with pkg-config... found
+ configure: pkg-config: SSL_LIBS: "-lssl -lz -ldl -lcrypto -lz -ldl "
+ configure: pkg-config: SSL_LDFLAGS: "-L/home/jdknight/<workdir>/staging/usr/lib -L/home/jdknight/<workdir>/staging/usr/lib "
+ configure: pkg-config: SSL_CPPFLAGS: "-I/home/jdknight/<workdir>/staging/usr/include "
+ checking for HMAC_Update in -lcrypto... no
+ checking for HMAC_Init_ex in -lcrypto... no
+ checking OpenSSL linking with -ldl... no
+ checking OpenSSL linking with -ldl and -lpthread... no
+ configure: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.
+ configure: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this.
+ ...
+ SSL support: no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl} )
+ ...
- Assisted-by: The Infinnovation team
+ And include the other libraries when compiling SSL_LIBS succeeds with:
- Bug: https://github.com/curl/curl/issues/4120#issuecomment-512542108
+ checking for openssl options with pkg-config... found
+ configure: pkg-config: SSL_LIBS: "-lssl -lz -ldl -pthread -lcrypto -lz -ldl -pthread "
+ configure: pkg-config: SSL_LDFLAGS: "-L/home/jdknight/<workdir>/staging/usr/lib -L/home/jdknight/<workdir>/staging/usr/lib "
+ configure: pkg-config: SSL_CPPFLAGS: "-I/home/jdknight/<workdir>/staging/usr/include "
+ checking for HMAC_Update in -lcrypto... yes
+ checking for SSL_connect in -lssl... yes
+ ...
+ SSL support: enabled (OpenSSL)
+ ...
- Closes https://github.com/curl/curl/pull/4153
-
-Daniel Stenberg (25 Jul 2019)
-- RELEASE-NOTES: synced
+ Signed-off-by: James Knight <james.d.knight@live.com>
+ Closes #3193
-- [Felix Hädicke brought this change]
+Daniel Gustafsson (26 Nov 2018)
+- doh: fix typo in infof call
+
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- ssh-libssh: do not specify O_APPEND when not in append mode
+- cmdline-opts/gen.pl: define the correct varname
- Specifying O_APPEND in conjunction with O_TRUNC and O_CREAT does not
- make much sense. And this combination of flags is not accepted by all
- SFTP servers (at least not Apache SSHD).
+ The variable definition had a small typo making it declare another
+ variable then the intended.
- Fixes #4147
- Closes #4148
+ Closes #3304
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Gergely Nagy brought this change]
+Daniel Stenberg (25 Nov 2018)
+- RELEASE-NOTES: synced
- multi: call detach_connection before Curl_disconnect
+- curl_easy_perform: fix timeout handling
- Curl_disconnect bails out if conn->easyq is not empty, detach_connection
- needs to be called first to remove the current easy from the queue.
+ curl_multi_wait() was erroneously used from within
+ curl_easy_perform(). It could lead to it believing there was no socket
+ to wait for and then instead sleep for a while instead of monitoring the
+ socket and then miss acting on that activity as swiftly as it should
+ (causing an up to 1000 ms delay).
- Fixes #4144
- Closes #4151
+ Reported-by: Antoni Villalonga
+ Fixes #3305
+ Closes #3306
+ Closes #3308
-Jay Satiro (23 Jul 2019)
-- tool_operate: fix implicit call to easysrc_cleanup
+- CURLOPT_WRITEFUNCTION.3: spell out that it gets called many times
+
+- cookies: create the cookiejar even if no cookies to save
- easysrc_cleanup is only defined when CURL_DISABLE_LIBCURL_OPTION is not
- defined, and prior to this change would be called regardless.
+ Important for when the file is going to be read again and thus must not
+ contain old contents!
- Bug: https://github.com/curl/curl/pull/3804#issuecomment-513922637
- Reported-by: Marcel Raad
+ Adds test 327 to verify.
- Closes https://github.com/curl/curl/pull/4142
+ Reported-by: daboul on github
+ Fixes #3299
+ Closes #3300
-Daniel Stenberg (22 Jul 2019)
-- curl:create_transfers check return code from curl_easy_setopt
-
- From commit b8894085
+- checksrc: ban snprintf use, add command line flag to override warns
+
+- snprintf: renamed and we now only use msnprintf()
- Pointed out by Coverity CID 1451703
+ The function does not return the same value as snprintf() normally does,
+ so readers may be mislead into thinking the code works differently than
+ it actually does. A different function name makes this easier to detect.
- Closes #4134
+ Reported-by: Tomas Hoger
+ Assisted-by: Daniel Gustafsson
+ Fixes #3296
+ Closes #3297
-- HTTP3: initial (experimental) support
-
- USe configure --with-ngtcp2 or --with-quiche
+- [Tobias Hintze brought this change]
+
+ test: update test20/1322 for eglibc bug workaround
- Using either option will enable a HTTP3 build.
- Co-authored-by: Alessandro Ghedini <alessandro@ghedini.me>
+ The tests 20 and 1322 are using getaddrinfo of libc for resolving. In
+ eglibc-2.19 there is a memory leakage and invalid free bug which
+ surfaces in some special circumstances (PF_UNSPEC hint with invalid or
+ non-existent names). The valgrind runs in testing fail in these
+ situations.
- Closes #3500
+ As the tests 20/1322 are not specific on either protocol (IPv4/IPv6)
+ this commit changes the hints to IPv4 protocol by passing `--ipv4` flag
+ on the tests' command line. This prevents the valgrind failures.
+
+- [Tobias Hintze brought this change]
-- curl: remove dead code
+ host names: allow trailing dot in name resolve, then strip it
- The loop never loops (since b889408500), pointed out by Coverity (CID
- 1451702)
+ Delays stripping of trailing dots to after resolving the hostname.
- Closes #4133
+ Fixes #3022
+ Closes #3222
+
+- [UnknownShadow200 brought this change]
-- docs/PARALLEL-TRANSFERS: correct the version number
+ CURLOPT_HEADERFUNCTION.3: match 'nitems' name in synopsis and description
+
+ Closes #3295
-- docs/PARALLEL-TRANSFERS: added
+Daniel Gustafsson (21 Nov 2018)
+- configure: Fix typo in comment
-- curl: support parallel transfers
+Michael Kaufmann (21 Nov 2018)
+- openssl: support session resume with TLS 1.3
+
+ Session resumption information is not available immediately after a TLS 1.3
+ handshake. The client must wait until the server has sent a session ticket.
+
+ Use OpenSSL's "new session" callback to get the session information and put it
+ into curl's session cache. For TLS 1.3 sessions, this callback will be invoked
+ after the server has sent a session ticket.
+
+ The "new session" callback is invoked only if OpenSSL's session cache is
+ enabled, so enable it and use the "external storage" mode which lets curl manage
+ the contents of the session cache.
+
+ A pointer to the connection data and the sockindex are now saved as "SSL extra
+ data" to make them available to the callback.
+
+ This approach also works for old SSL/TLS versions and old OpenSSL versions.
- This is done by making sure each individual transfer is first added to a
- linked list as then they can be performed serially, or at will, in
- parallel.
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- Closes #3804
+ Fixes #3202
+ Closes #3271
-- docs/MANUAL.md: converted to markdown from plain text
+- ssl: fix compilation with OpenSSL 0.9.7
- ... will make it render as a nicer web page.
+ - ENGINE_cleanup() was used without including "openssl/engine.h"
+ - enable engine support for OpenSSL 0.9.7
- Closes #4131
+ Closes #3266
-- curl_version_info: provide nghttp2 details
+Daniel Stenberg (21 Nov 2018)
+- openssl: disable TLS renegotiation with BoringSSL
+
+ Since we're close to feature freeze, this change disables this feature
+ with an #ifdef. Define ALLOW_RENEG at build-time to enable.
- Introducing CURLVERSION_SIXTH with nghttp2 info.
+ This could be converted to a bit for CURLOPT_SSL_OPTIONS to let
+ applications opt-in this.
- Closes #4121
+ Concern-raised-by: David Benjamin
+ Fixes #3283
+ Closes #3293
-- bump: start working on 7.66.0
+- [Romain Fliedel brought this change]
-- source: remove names from source comments
+ ares: remove fd from multi fd set when ares is about to close the fd
- Several reasons:
+ When using c-ares for asyn dns, the dns socket fd was silently closed
+ by c-ares without curl being aware. curl would then 'realize' the fd
+ has been removed at next call of Curl_resolver_getsock, and only then
+ notify the CURLMOPT_SOCKETFUNCTION to remove fd from its poll set with
+ CURL_POLL_REMOVE. At this point the fd is already closed.
- - we can't add everyone who's helping out so its unfair to just a few
- selected ones.
- - we already list all helpers in THANKS and in RELEASE-NOTES for each
- release
- - we don't want to give the impression that some parts of the code is
- "owned" or "controlled" by specific persons
+ By using ares socket state callback (ARES_OPT_SOCK_STATE_CB), this
+ patch allows curl to be notified that the fd is not longer needed
+ for neither for write nor read. At this point by calling
+ Curl_multi_closed we are able to notify multi with CURL_POLL_REMOVE
+ before the fd is actually closed by ares.
- Assisted-by: Daniel Gustafsson
- Closes #4129
+ In asyn-ares.c Curl_resolver_duphandle we can't use ares_dup anymore
+ since it does not allow passing a different sock_state_cb_data
+
+ Closes #3238
-Version 7.65.3 (19 Jul 2019)
+- [Romain Fliedel brought this change]
-Daniel Stenberg (19 Jul 2019)
-- RELEASE-NOTES: 7.65.3
+ examples/ephiperfifo: report error when epoll_ctl fails
-- THANKS: 7.65.3 status
+Daniel Gustafsson (20 Nov 2018)
+- [pkubaj brought this change]
-- progress: make the progress meter appear again
+ ntlm: Remove redundant ifdef USE_OPENSSL
+
+ lib/curl_ntlm.c had code that read as follows:
+
+ #ifdef USE_OPENSSL
+ # ifdef USE_OPENSSL
+ # else
+ # ..
+ # endif
+ #endif
- Fix regression caused by 21080e1
+ Remove the redundant USE_OPENSSL along with #else (it's not possible to
+ reach it anyway). The removed construction is a leftover from when the
+ SSLeay support was removed.
- Reported-by: Chih-Hsuan Yen
- Fixes #4122
- Closes #4124
+ Closes #3269
+ Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Daniel Stenberg (20 Nov 2018)
+- [Han Han brought this change]
-- version: bump to 7.65.3
+ ssl: replace all internal uses of CURLE_SSL_CACERT
+
+ Closes #3291
+
+Han Han (19 Nov 2018)
+- docs: add more description to unified ssl error codes
-- RELEASE-NOTES: Contributors or now 1990
+- curle: move deprecated error code to ifndef block
-Version 7.65.2 (17 Jul 2019)
+Patrick Monnerat (19 Nov 2018)
+- os400: add CURLOPT_CURLU to ILE/RPG binding.
-Daniel Stenberg (17 Jul 2019)
-- RELEASE-NOTES: 7.65.2
+- os400: Add curl_easy_conn_upkeep() to ILE/RPG binding.
-- THANKS: add contributors from 7.65.2
+- os400: fix return type of curl_easy_pause() in ILE/RPG binding.
-Jay Satiro (17 Jul 2019)
-- [aasivov brought this change]
+Daniel Stenberg (19 Nov 2018)
+- RELEASE-NOTES: synced
- cmake: Fix finding Brotli on case-sensitive file systems
+- impacket: add LICENSE
- - Find package "Brotli" instead of "BROTLI" since the former is the
- casing used for CMake/FindBrotli.cmake, and otherwise find_package
- may fail on a case-sensitive file system.
+ The license for the impacket package was not in our tree.
- Fixes https://github.com/curl/curl/issues/4117
+ Imported now from upstream's
+ https://github.com/SecureAuthCorp/impacket/blob/master/LICENSE
+
+ Reported-by: infinnovation-dev on github
+ Fixes #3276
+ Closes #3277
-- CURLOPT_RANGE.3: Caution against using it for HTTP PUT
+Daniel Gustafsson (18 Nov 2018)
+- tool_doswin: Fix uninitialized field warning
- AFAICT CURLOPT_RANGE does not support ranged HTTP PUT uploads so I've
- cautioned against using it for that purpose and included a workaround.
+ The partial struct initialization in 397664a065abffb7c3445ca9 caused
+ a warning on uninitialized MODULEENTRY32 struct members:
- Bug: https://curl.haxx.se/mail/lib-2019-04/0075.html
- Reported-by: Christopher Head
+ /src/tool_doswin.c:681:3: warning: missing initializer for field
+ 'th32ModuleID' of 'MODULEENTRY32 {aka struct tagMODULEENTRY32}'
+ [-Wmissing-field-initializers]
- Closes https://github.com/curl/curl/issues/3814
-
-- [Stefano Simonelli brought this change]
-
- CURLOPT_SEEKDATA.3: fix variable name
+ This is sort of a bogus warning as the remaining members will be set
+ to zero by the compiler, as all omitted members are. Nevertheless,
+ remove the warning by omitting all members and setting the dwSize
+ members explicitly.
- Closes https://github.com/curl/curl/pull/4118
-
-- [Giorgos Oikonomou brought this change]
+ Closes #3254
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+ Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
- CIPHERS.md: Explain Schannel error SEC_E_ALGORITHM_MISMATCH
+- openssl: Remove SSLEAY leftovers
- If the SSL backend is Schannel and the user specifies an Schannel CALG_
- that is not supported by the protocol or the server then curl returns
- CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH.
+ Commit 709cf76f6bb7dbac deprecated USE_SSLEAY, as curl since long isn't
+ compatible with the SSLeay library. This removes the few leftovers that
+ were omitted in the less frequently used platform targets.
- Fixes https://github.com/curl/curl/issues/3389
- Closes https://github.com/curl/curl/pull/4106
+ Closes #3270
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Daniel Gustafsson brought this change]
+Daniel Stenberg (16 Nov 2018)
+- [Elia Tufarolo brought this change]
- nss: inspect returnvalue of token check
+ http_negotiate: do not close connection until negotiation is completed
- PK11_IsPresent() checks for the token for the given slot is available,
- and sets needlogin flags for the PK11_Authenticate() call. Should it
- return false, we should however treat it as an error and bail out.
+ Fix HTTP POST using CURLAUTH_NEGOTIATE.
- Closes https://github.com/curl/curl/pull/4110
+ Closes #3275
-- docs: Explain behavior change in --tlsv1. options since 7.54
-
- Since 7.54 --tlsv1. options use the specified version or later, however
- older versions of curl documented it as using just the specified version
- which may or may not have happened depending on the TLS library.
- Document this discrepancy to allay confusion for users familiar with the
- old documentation that expect just the specified version.
+- pop3: only do APOP with a valid timestamp
- Fixes https://github.com/curl/curl/issues/4097
- Closes https://github.com/curl/curl/pull/4119
+ Brought-by: bobmitchell1956 on github
+ Fixes #3278
+ Closes #3279
-- libcurl: Restrict redirect schemes (follow-up)
-
- - Allow FTPS on redirect.
+Jay Satiro (16 Nov 2018)
+- [Peter Wu brought this change]
+
+ openssl: do not log excess "TLS app data" lines for TLS 1.3
- - Update default allowed redirect protocols in documentation.
+ The SSL_CTX_set_msg_callback callback is not just called for the
+ Handshake or Alert protocols, but also for the raw record header
+ (SSL3_RT_HEADER) and the decrypted inner record type
+ (SSL3_RT_INNER_CONTENT_TYPE). Be sure to ignore the latter to avoid
+ excess debug spam when using `curl -v` against a TLSv1.3-enabled server:
- Follow-up to 6080ea0.
+ * TLSv1.3 (IN), TLS app data, [no content] (0):
- Ref: https://github.com/curl/curl/pull/4094
+ (Following this message, another callback for the decrypted
+ handshake/alert messages will be be present anyway.)
- Closes https://github.com/curl/curl/pull/4115
+ Closes https://github.com/curl/curl/pull/3281
-Daniel Stenberg (16 Jul 2019)
-- test1173: make it also check all libcurl option man pages
+Marc Hoersken (15 Nov 2018)
+- tests: disable SO_EXCLUSIVEADDRUSE for stunnel on Windows
- ... and adjust those that cause errors
+ SO_EXCLUSIVEADDRUSE is on by default on Vista or newer,
+ but does not work together with SO_REUSEADDR being on.
- Closes #4116
+ The default changes were made with stunnel 5.34 and 5.35.
-- curl: only accept COLUMNS less than 10000
-
- ... as larger values would rather indicate something silly (and could
- potentially cause buffer problems).
-
- Reported-by: pendrek at hackerone
- Closes #4114
+Daniel Stenberg (13 Nov 2018)
+- [Kamil Dudka brought this change]
-- dist: add manpage-syntax.pl
+ nss: remove version selecting dead code
- follow-up to 7fb66c403
+ Closes #3262
-- test1173: detect some basic man page format mistakes
-
- Triggered by PR #4111
+- nss: set default max-tls to 1.3/1.2
- Closes #4113
-
-Jay Satiro (15 Jul 2019)
-- [Bjarni Ingi Gislason brought this change]
+ Fixes #3261
- docs: Fix missing lines caused by undefined macros
+Daniel Gustafsson (13 Nov 2018)
+- tool_cb_wrt: Silence function cast compiler warning
- - Escape apostrophes at line start.
+ Commit 5bfaa86ceb3c2a9ac474a928e748c4a86a703b33 introduced a new
+ compiler warning on Windows cross compilation with GCC. See below
+ for an example of the warning from the autobuild logs (whitespace
+ edited to fit):
- Some lines begin with a "'" (apostrophe, single quote), which is then
- interpreted as a control character in *roff.
+ /src/tool_cb_wrt.c:175:9: warning: cast from function call of type
+ 'intptr_t {aka long long int}' to non-matching type 'void *'
+ [-Wbad-function-cast]
+ (HANDLE) _get_osfhandle(fileno(outs->stream)),
+ ^
- Such lines are interpreted as being a call to a macro, and if
- undefined, the lines are removed from the output.
+ Store the return value from _get_osfhandle() in an intermediate
+ variable and cast the variable in WriteConsoleW() rather than the
+ function call directly to avoid a compiler warning.
- Bug: https://bugs.debian.org/926352
- Signed-off-by: Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+ In passing, also add inspection of the MultiByteToWideChar() return
+ value and return failure in case an error is reported.
- Submitted-by: Alessandro Ghedini
-
- Closes https://github.com/curl/curl/pull/4111
+ Closes #3263
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+ Reviewed-by: Viktor Szakats <commit@vszakats.net>
-Daniel Stenberg (14 Jul 2019)
-- libcurl-security.3: update to new CURLOPT_REDIR_PROTOCOLS defaults
-
- follow-up to 6080ea098
+Daniel Stenberg (12 Nov 2018)
+- nss: fix fallthrough comment to fix picky compiler warning
-- [Linos Giannopoulos brought this change]
+- docs: expanded on some CURLU details
- libcurl: Add testcase for gopher redirects
+- [Tim Rühsen brought this change]
+
+ ftp: avoid two unsigned int overflows in FTP listing parser
- The testcase ensures that redirects to CURLPROTO_GOPHER won't be
- allowed, by default, in the future. Also, curl is being used
- for convenience while keeping the testcases DRY.
+ Curl_ftp_parselist: avoid unsigned integer overflows
- The expected error code is CURLE_UNSUPPORTED_PROTOCOL when the client is
- redirected to CURLPROTO_GOPHER
+ The overflow has no real world impact, just avoid it for "best
+ practice".
- Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
-
-- [Linos Giannopoulos brought this change]
+ Closes #3225
- libcurl: Restrict redirect schemes
+- curl: --local-port range was not "including"
- All protocols except for CURLPROTO_FILE/CURLPROTO_SMB and their TLS
- counterpart were allowed for redirect. This vastly broadens the
- exploitation surface in case of a vulnerability such as SSRF [1], where
- libcurl-based clients are forced to make requests to arbitrary hosts.
+ The end port number in a given range was not included in the range used,
+ as it is documented to be.
+
+ Reported-by: infinnovation-dev on github
+ Fixes #3251
+ Closes #3255
+
+- [Jérémy Rocher brought this change]
+
+ openssl: support BoringSSL TLS renegotiation
- For instance, CURLPROTO_GOPHER can be used to smuggle any TCP-based
- protocol by URL-encoding a payload in the URI. Gopher will open a TCP
- connection and send the payload.
+ As per BoringSSL porting documentation [1], BoringSSL rejects peer
+ renegotiations by default.
- Only HTTP/HTTPS and FTP are allowed. All other protocols have to be
- explicitly enabled for redirects through CURLOPT_REDIR_PROTOCOLS.
+ curl fails when trying to authenticate to server through client
+ certificate if it is requested by server after the initial TLS
+ handshake.
- [1]: https://www.acunetix.com/blog/articles/server-side-request-forgery-vulnerability/
+ Enable renegotiation by default with BoringSSL to get same behavior as
+ with OpenSSL. This is done by calling SSL_set_renegotiate_mode [2]
+ which was introduced in commit 1d5ef3bb1eb9 [3].
- Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
+ 1 - https://boringssl.googlesource.com/boringssl/+/HEAD/PORTING.md#tls-renegotiation
+ 2 - https://boringssl.googlesource.com/boringssl/+/master/include/openssl/ssl.h#3482
+ 3 - https://boringssl.googlesource.com/boringssl/+/1d5ef3bb1eb97848617db5e7d633d735a401df86
- Closes #4094
+ Signed-off-by: Jérémy Rocher <rocher.jeremy@gmail.com>
+ Fixes #3258
+ Closes #3259
-- [Zenju brought this change]
+- HISTORY: add some milestones
+
+ Added a few of the more notable milestones in curl history that were
+ missing. Primarily more recent ones but I also noted some older that
+ could be worth mentioning.
+
+ [ci skip]
+ Closes #3257
- openssl: define HAVE_SSL_GET_SHUTDOWN based on version number
+Daniel Gustafsson (9 Nov 2018)
+- KNOWN_BUGS: add --proxy-any connection issue
+
+ Add the identified issue with --proxy-any and proxy servers which
+ advertise authentication schemes other than the supported one.
- Closes #4100
+ Closes #876
+ Closes #3250
+ Reported-by: NTMan on Github
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- [Peter Simonyi brought this change]
+Daniel Stenberg (9 Nov 2018)
+- [Jim Fuller brought this change]
- http: allow overriding timecond with custom header
+ setopt: add CURLOPT_CURLU
- With CURLOPT_TIMECONDITION set, a header is automatically added (e.g.
- If-Modified-Since). Allow this to be replaced or suppressed with
- CURLOPT_HTTPHEADER.
+ Allows an application to pass in a pre-parsed URL via a URL handle.
- Fixes #4103
- Closes #4109
+ Closes #3227
-Jay Satiro (11 Jul 2019)
-- [Juergen Hoetzel brought this change]
+- [Gisle Vanem brought this change]
- smb: Use the correct error code for access denied on file open
+ docs: ESCape "\n" codes
- - Return CURLE_REMOTE_ACCESS_DENIED for SMB access denied on file open.
+ Groff / Troff will display a:
+ printaf("Errno: %ld\n", error);
+ as:
+ printf("Errno: %ld0, error);
- Prior to this change CURLE_REMOTE_FILE_NOT_FOUND was returned instead.
+ when a "\n" is not escaped. Use "\\n" instead.
- Closes https://github.com/curl/curl/pull/4095
-
-- [Daniel Gustafsson brought this change]
+ Closes #3246
- DEPRECATE: fixup versions and spelling
+- curl: --local-port fix followup
- Correctly set the July 17 version to 7.65.2, and update spelling to
- be consistent. Also fix a typo.
+ Regression by 52db54869e6.
- Closes https://github.com/curl/curl/pull/4107
+ Reported-by: infinnovation-dev on github
+ Fixes #3248
+ Closes #3249
+GitHub (7 Nov 2018)
- [Gisle Vanem brought this change]
- system_win32: fix clang warning
-
- - Declare variable in header as extern.
-
- Bug: https://github.com/curl/curl/commit/48b9ea4#commitcomment-34084597
+ More "\n" ESCaping
-Daniel Gustafsson (10 Jul 2019)
-- headers: Remove no longer exported functions
+Daniel Stenberg (7 Nov 2018)
+- RELEASE-NOTES: synced
+
+- curl: fix --local-port integer overflow
- There were a leftover few prototypes of Curl_ functions that we used to
- export but no longer do, this removes those prototypes and cleans up any
- comments still referring to them.
+ The tool's local port command line range parser didn't check for integer
+ overflows and could pass "weird" data to libcurl for this option.
+ libcurl however, has a strict range check for the values so it rejects
+ anything outside of the accepted range.
- Curl_write32_le(), Curl_strcpy_url(), Curl_strlen_url(), Curl_up_free()
- Curl_concat_url(), Curl_detach_connnection(), Curl_http_setup_conn()
- were made static in 05b100aee247bb9bec8e9a1b0166496aa4248d1c.
- Curl_http_perhapsrewind() made static in 574aecee208f79d391f10d57520b3.
+ Reported-by: Brian Carpenter
+ Closes #3242
+
+- curl: correct the switch() logic in ourWriteOut
- For the remainder, I didn't trawl the Git logs hard enough to capture
- their exact time of deletion, but they were all gone: Curl_splayprint(),
- Curl_http2_send_request(), Curl_global_host_cache_dtor(),
- Curl_scan_cache_used(), Curl_hostcache_destroy(), Curl_second_connect(),
- Curl_http_auth_stage() and Curl_close_connections().
+ Follow-up to e431daf013, as I did the wrong correction for a compiler
+ warning. It should be a break and not a fall-through.
- Closes #4096
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Pointed-out-by: Frank Gevaerts
-- CMake: fix typos and spelling
+- [Frank Gevaerts brought this change]
-- [Kyle Edwards brought this change]
+ curl: add %{stderr} and %{stdout} for --write-out
+
+ Closes #3115
- CMake: Convert errant elseif() to else()
+Daniel Gustafsson (7 Nov 2018)
+- winssl: be consistent in Schannel capitalization
- CMake interprets an elseif() with no arguments as elseif(FALSE),
- resulting in the elseif() block not being executed. That is not what
- was intended here. Change the empty elseif() to an else() as it was
- intended.
+ The productname from Microsoft is "Schannel", but in infof/failf
+ reporting we use "schannel". This removes different versions.
- Closes #4101
- Reported-by: Artalus <artalus-mail@yandex.ru>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Closes #3243
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- buildconf: fix header filename
+Daniel Stenberg (7 Nov 2018)
+- TODO: Have the URL API offer IDN decoding
- The header file inclusion had a typo, it should be .h and not .hd.
- Fix by renaming.
+ Similar to how URL decoding/encoding is done, we could have URL
+ functions to convert IDN host names to punycode.
- Fixes #4102
- Reported-by: AceCrow on Github
-
-- [Jan Chren brought this change]
+ Suggested-by: Alexey Melnichuk
+ Closes #3232
- configure: fix --disable-code-coverage
+- urlapi: only skip encoding the first '=' with APPENDQUERY set
- This fixes the case when --disable-code-coverage supplied to ./configure
- would result in coverage="yes" being set.
+ APPENDQUERY + URLENCODE would skip all equals signs but now it only skip
+ encoding the first to better allow "name=content" for any content.
- Closes #4099
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Reported-by: Alexey Melnichuk
+ Fixes #3231
+ Closes #3231
-- cleanup: fix typo in comment
+- url: a short host name + port is not a scheme
+
+ The function identifying a leading "scheme" part of the URL considered a
+ few letters ending with a colon to be a scheme, making something like
+ "short:80" to become an unknown scheme instead of a short host name and
+ a port number.
+
+ Extended test 1560 to verify.
+
+ Also fixed test203 to use file_pwd to make it get the correct path on
+ windows. Removed test 2070 since it was a duplicate of 203.
+
+ Assisted-by: Marcel Raad
+ Reported-by: Hagai Auro
+ Fixes #3220
+ Fixes #3233
+ Closes #3223
+ Closes #3235
-- RELEASE-NOTES: synced
+- [Sangamkar brought this change]
-Jay Satiro (6 Jul 2019)
-- [Daniel Gustafsson brought this change]
-
- nss: support using libnss on macOS
+ libcurl: stop reading from paused transfers
- The file suffix for dynamically loadable objects on macOS is .dylib,
- which need to be added for the module definitions in order to get the
- NSS TLS backend to work properly on macOS.
+ In the transfer loop it would previously not acknwledge the pause bit
+ and continue until drained or loop ended.
- Closes https://github.com/curl/curl/pull/4046
-
-- [Daniel Gustafsson brought this change]
+ Closes #3240
- nss: don't set unused parameter
+Jay Satiro (6 Nov 2018)
+- tool: add undocumented option --dump-module-paths for win32
- The value of the maxPTDs parameter to PR_Init() has since at least
- NSPR 2.1, which was released sometime in 1998, been marked ignored
- as is accordingly not used in the initialization code. Setting it
- to a value when calling PR_Init() is thus benign, but indicates an
- intent which may be misleading. Reset the value to zero to improve
- clarity.
+ - Add an undocumented diagnostic option for Windows to show the full
+ paths of all loaded modules regardless of whether or not libcurl
+ initialization succeeds.
- Closes https://github.com/curl/curl/pull/4054
+ This is needed so that in the CI we can get a list of all DLL
+ dependencies after initialization (when they're most likely to have
+ finished loading) and then package them as artifacts so that a
+ functioning build can be downloaded. Also I imagine it may have some use
+ as a diagnostic for help requests.
+
+ Ref: https://github.com/curl/curl/pull/3103
+
+ Closes https://github.com/curl/curl/pull/3208
-- [Daniel Gustafsson brought this change]
+- curl_multibyte: fix a malloc overcalculation
+
+ Prior to this change twice as many bytes as necessary were malloc'd when
+ converting wchar to UTF8. To allay confusion in the future I also
+ changed the variable name for the amount of bytes from len to bytes.
+
+ Closes https://github.com/curl/curl/pull/3209
- nss: only cache valid CRL entries
+Michael Kaufmann (5 Nov 2018)
+- netrc: don't ignore the login name specified with "--user"
- Change the logic around such that we only keep CRLs that NSS actually
- ended up caching around for later deletion. If CERT_CacheCRL() fails
- then there is little point in delaying the freeing of the CRL as it
- is not used.
+ - for "--netrc", don't ignore the login/password specified with "--user",
+ only ignore the login/password in the URL.
+ This restores the netrc behaviour of curl 7.61.1 and earlier.
+ - fix the documentation of CURL_NETRC_REQUIRED
+ - improve the detection of login/password changes when reading .netrc
+ - don't read .netrc if both login and password are already set
- Closes https://github.com/curl/curl/pull/4053
+ Fixes #3213
+ Closes #3224
-- [Gergely Nagy brought this change]
+Patrick Monnerat (5 Nov 2018)
+- OS400: add URL API ccsid wrappers and sync ILE/RPG bindings
- lib: Use UTF-8 encoding in comments
+Daniel Stenberg (5 Nov 2018)
+- [Yasuhiro Matsumoto brought this change]
+
+ curl: fixed UTF-8 in current console code page (Windows)
- Some editors and IDEs assume that source files use UTF-8 file encodings.
- It also fixes the build with MSVC when /utf-8 command line option is
- used (this option is mandatory for some other open-source projects, this
- is useful when using the same options is desired for building all
- libraries of a project).
+ Fixes #3211
+ Fixes #3175
+ Closes #3212
+
+- TODO: 2.6 multi upkeep
- Closes https://github.com/curl/curl/pull/4087
+ Closes #3199
-- [Caleb Raitto brought this change]
+Daniel Gustafsson (5 Nov 2018)
+- unittest: make 1652 stable across collations
+
+ The previous coding used a format string whose output depended on the
+ current locale of the environment running the test. Since the gist of
+ the test is to have a format string, with the actual formatting being
+ less important, switch to a more stable formatstring with decimals.
+
+ Reported-by: Marcel Raad
+ Closes #3234
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
- CURLOPT_HEADEROPT.3: Fix example
+Daniel Stenberg (5 Nov 2018)
+- Revert "url: a short host name + port is not a scheme"
- Fix an issue where example builds a curl_slist, but fails to actually
- use it, or free it.
+ This reverts commit 226cfa8264cd979eff3fd52c0f3585ef095e7cf2.
- Closes https://github.com/curl/curl/pull/4090
+ This commit caused test failures on appveyor/windows. Work on fixing them is
+ in #3235.
-- [Shankar Jadhavar brought this change]
+- symbols-in-versions: add missing CURLU_ symbols
+
+ ...and fix symbol-scan.pl to also scan urlapi.h
+
+ Reported-by: Alexey Melnichuk
+ Fixes #3226
+ Closes #3230
- winbuild: Change Makefile to honor ENABLE_OPENSSL_AUTO_LOAD_CONFIG
+Daniel Gustafsson (3 Nov 2018)
+- infof: clearly indicate truncation
- - Made changes so that ENABLE_OPENSSL_AUTO_LOAD_CONFIG will be honored.
+ The internal buffer in infof() is limited to 2048 bytes of payload plus
+ an additional byte for NULL termination. Servers with very long error
+ messages can however cause truncation of the string, which currently
+ isn't very clear, and leads to badly formatted output.
- - Also removed some ^M chars from file.
+ This appends a "...\n" (or just "..." in case the format didn't with a
+ newline char) marker to the end of the string to clearly show
+ that it has been truncated.
- Prior to this change while building on Windows platform even if we pass
- the ENABLE_OPENSSL_AUTO_LOAD_CONFIG option with value as "no" it does
- not set the CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG flag.
+ Also include a unittest covering infof() to try and catch any bugs
+ introduced in this quite important function.
- Closes https://github.com/curl/curl/pull/4086
+ Closes #3216
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-Daniel Stenberg (4 Jul 2019)
-- doh-url.d: added in 7.62.0
+Michael Kaufmann (3 Nov 2018)
+- tool_getparam: fix some comments
-Jay Satiro (30 Jun 2019)
-- docs: Fix links to OpenSSL docs
+Daniel Stenberg (3 Nov 2018)
+- url: a short host name + port is not a scheme
- OpenSSL changed their manual locations and does not redirect to the new
- locations.
+ The function identifying a leading "scheme" part of the URL considered a few
+ letters ending with a colon to be a scheme, making something like "short:80"
+ to become an unknown scheme instead of a short host name and a port number.
- Bug: https://curl.haxx.se/mail/lib-2019-06/0056.html
- Reported-by: Daniel Stenberg
-
-Daniel Stenberg (26 Jun 2019)
-- [Gaël PORTAY brought this change]
+ Extended test 1560 to verify.
+
+ Reported-by: Hagai Auro
+ Fixes #3220
+ Closes #3223
- curl_multi_wait.3: escape backslash in example
+- URL: fix IPv6 numeral address parser
- The backslash in the character Line Feed must be escaped.
+ Regression from 46e164069d1a52. Extended test 1560 to verify.
- The current man-page outputs the code as following:
+ Reported-by: tpaukrt on github
+ Fixes #3218
+ Closes #3219
+
+- travis: remove curl before a normal build
- fprintf(stderr, "curl_multi failed, code %d.0, mc);
+ on Linux. To make sure the test suite runs with its newly build tool and
+ doesn't require an external one present.
- The commit fixes it as follow:
+ Bug: #3198
+ Closes #3200
+
+- [Tim Rühsen brought this change]
+
+ mprintf: avoid unsigned integer overflow warning
- fprintf(stderr, "curl_multi failed, code %d\n", mc);
+ The overflow has no real world impact.
+ Just avoid it for "best practice".
- Closes #4079
+ Code change suggested by "The Infinnovation Team" and Daniel Stenberg.
+ Closes #3184
-- openssl: disable engine if OPENSSL_NO_UI_CONSOLE is defined
+- Curl_follow: accept non-supported schemes for "fake" redirects
- ... since that needs UI_OpenSSL() which isn't provided when OpenSSL is
- built with OPENSSL_NO_UI_CONSOLE which happens when OpenSSL is built for
- UWP (with "VC-WIN32-UWP").
+ When not actually following the redirect and the target URL is only
+ stored for later retrieval, curl always accepted "non-supported"
+ schemes. This was a regression from 46e164069d1a5230.
- Reported-by: Vasily Lobaskin
- Fixes #4073
- Closes #4077
+ Reported-by: Brad King
+ Fixes #3210
+ Closes #3215
-- test1521: adapt to SLISTPOINT
-
- The header now has the slist-using options marked as SLISTPOINT so this
- makes sure test 1521 understands that.
+Daniel Gustafsson (2 Nov 2018)
+- openvms: fix example name
- Follow-up to ae99b4de1c443ae989
+ Commit efc696a2e09225bfeab4 renamed persistant.c to persistent.c to
+ fix the typo in the name, but missed to update the OpenVMS package
+ files which still looked for the old name.
- Closes #4074
+ Closes #3217
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Viktor Szakats <commit@vszakats.net>
-- win32: make DLL loading a no-op for UWP
+Daniel Stenberg (1 Nov 2018)
+- configure: show CFLAGS, LDFLAGS etc in summary
- Reported-by: Michael Brehm
- Fixes #4060
- Closes #4072
-
-- [1ocalhost brought this change]
-
- configure: fix typo '--disable-http-uath'
+ To make it easier to understand other people's and remote builds etc.
- Closes #4076
+ Closes #3207
-- [Niklas Hambüchen brought this change]
+- version: bump for next cycle
- docs: fix string suggesting HTTP/2 is not the default
+- axtls: removed
- Commit 25fd1057c9c86e3 made HTTP2 the default, and further down in the
- man page that new default is mentioned, but the section at the top
- contradicted it until now.
+ As has been outlined in the DEPRECATE.md document, the axTLS code has
+ been disabled for 6 months and is hereby removed.
- Also remove claim that setting the HTTP version is not sensible.
+ Use a better supported TLS library!
- Closes #4075
+ Assisted-by: Daniel Gustafsson
+ Closes #3194
-- RELEASE-NOTES: synced
+- [marcosdiazr brought this change]
-- [Stephan Szabo brought this change]
+ schannel: make CURLOPT_CERTINFO support using Issuer chain
+
+ Closes #3197
- tests: update fixed IP for hostip/clientip split
+- travis: build with sanitize=address,undefined,signed-integer-overflow
- These tests give differences for me on linux when using a hostip
- pointing to the external ip address for the local machine.
+ ... using clang
- Closes #4070
+ Closes #3190
-Daniel Gustafsson (24 Jun 2019)
-- http: clarify header buffer size calculation
+- schannel: use Curl_ prefix for global private symbols
- The header buffer size calculation can from static analysis seem to
- overlow as it performs an addition between two size_t variables and
- stores the result in a size_t variable. Overflow is however guarded
- against elsewhere since the input to the addition is regulated by
- the maximum read buffer size. Clarify this with a comment since the
- question was asked.
+ Curl_verify_certificate() must use the Curl_ prefix since it is globally
+ available in the lib and otherwise steps outside of our namespace!
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #3201
-Daniel Stenberg (24 Jun 2019)
-- KNOWN_BUGS: Don't clear digest for single realm
+Kamil Dudka (1 Nov 2018)
+- tests: drop http_pipe.py script no longer used
- Closes #3267
-
-- KNOWN_BUGS: Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+ It is unused since commit f7208df7d9d5cd5e15e2d89237e828f32b63f135.
- Closes #3284
+ Closes #3204
-- http2: call done_sending on end of upload
+Daniel Stenberg (31 Oct 2018)
+- runtests: use the local curl for verifying
- To make sure a HTTP/2 stream registers the end of stream.
+ ... revert the mistaken change brought in commit 8440616f53.
- Bug #4043 made me find this problem but this fix doesn't correct the
- reported issue.
+ Reported-by: Alessandro Ghedini
+ Bug: https://curl.haxx.se/mail/lib-2018-10/0118.html
- Closes #4068
+ Closes #3198
+
+Version 7.62.0 (30 Oct 2018)
+
+Daniel Stenberg (30 Oct 2018)
+- RELEASE-NOTES: 7.62.0
-- [James Brown brought this change]
+- THANKS: 7.62.0 status
- c-ares: honor port numbers in CURLOPT_DNS_SERVERS
+Daniel Gustafsson (30 Oct 2018)
+- vtls: add MesaLink to curl_sslbackend enum
- By using ares_set_servers_ports_csv on new enough c-ares.
+ MesaLink support was added in commit 57348eb97d1b8fc3742e02c but the
+ backend was never added to the curl_sslbackend enum in curl/curl.h.
+ This adds the new backend to the enum and updates the relevant docs.
- Fixes #4066
- Closes #4067
-
-Daniel Gustafsson (24 Jun 2019)
-- CURLMOPT_SOCKETFUNCTION.3: fix typo
+ Closes #3195
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Daniel Stenberg (24 Jun 2019)
-- [Koen Dergent brought this change]
+Daniel Stenberg (30 Oct 2018)
+- [Ruslan Baratov brought this change]
- curl: skip CURLOPT_PROXY_CAPATH for disabled-proxy builds
+ cmake: Remove unused CURL_CONFIG_HAS_BEEN_RUN_BEFORE variable
- Closes #4061
+ Closes #3191
+
+- test2080: verify the fix for CVE-2018-16842
-- test153: fix content-length to avoid occasional hang
+- voutf: fix bad arethmetic when outputting warnings to stderr
- Closes #4065
+ CVE-2018-16842
+ Reported-by: Brian Carpenter
+ Bug: https://curl.haxx.se/docs/CVE-2018-16842.html
-- RELEASE-NOTES: synced
+- [Tuomo Rinne brought this change]
-- multi: enable multiplexing by default (again)
-
- It was originally made default in d7c4213bd0c (7.62.0) but mistakenly
- reverted in commit 2f44e94efb3d (7.65.0). Now enabled again.
+ cmake: uniform ZLIB to use USE_ variable and clean curl-config.cmake.in
- Closes #4051
+ Closes #3123
-- typecheck: add 3 missing strings and a callback data pointer
-
- Closes #4050
+- [Tuomo Rinne brought this change]
+
+ cmake: add find_dependency call for ZLIB to CMake config file
+
+- [Tuomo Rinne brought this change]
+
+ cmake: add support for transitive ZLIB target
-- tests: add disable-scan.pl to dist
+- unit1650: fix "null pointer passed as argument 1 to memcmp"
- follow-up from 29177f422a5
+ Detected by UndefinedBehaviorSanitizer
- Closes #4059
+ Closes #3187
-- http2: don't call stream-close on already closed streams
+- travis: add a "make tidy" build that runs clang-tidy
- Closes #4055
+ Closes #3182
-Marcel Raad (20 Jun 2019)
-- travis: enable alt-svc for coverage build
+- unit1300: fix stack-use-after-scope AddressSanitizer warning
- Closes
+ Closes #3186
-- travis: enable libssh2 for coverage build
+- Curl_auth_create_plain_message: fix too-large-input-check
- It was enabled by default before commit c92d2e14cfb.
-
- Disable torture tests 600 and 601 because of
- https://github.com/curl/curl/issues/1678.
-
- Closes
+ CVE-2018-16839
+ Reported-by: Harry Sintonen
+ Bug: https://curl.haxx.se/docs/CVE-2018-16839.html
-- travis: disable threaded resolver for coverage build
+- Curl_close: clear data->multi_easy on free to avoid use-after-free
- This enables more tests.
+ Regression from b46cfbc068 (7.59.0)
+ CVE-2018-16840
+ Reported-by: Brian Carpenter (Geeknik Labs)
- Closes
+ Bug: https://curl.haxx.se/docs/CVE-2018-16840.html
+
+- [randomswdev brought this change]
-- travis: enable brotli for all xenial jobs
+ system.h: use proper setting with Sun C++ as well
- There's no need for a separate job, and no need to build it from source
- with Xenial.
+ system.h selects the proper Sun settings when __SUNPRO_C is defined. The
+ Sun compiler does not define it when compiling C++ files. I'm adding a
+ check also on __SUNPRO_CC to allow curl to work properly also when used
+ in a C++ project on Sun Solaris.
- Closes
+ Closes #3181
-- travis: enable warnings-as-errors for coverage build
-
- Closes
+- rand: add comment to skip a clang-tidy false positive
-GitHub (20 Jun 2019)
-- [Gisle Vanem brought this change]
+- test1651: unit test Curl_extract_certinfo()
+
+ The version used for Gskit, NSS, GnuTLS, WolfSSL and schannel.
- system_win32: fix typo
+- x509asn1: always check return code from getASN1Element()
-Daniel Stenberg (20 Jun 2019)
-- typecheck: CURLOPT_CONNECT_TO takes an slist too
+- Makefile: add 'tidy' target that runs clang-tidy
- Additionally, add an alias in curl.h for slist-using options so that
- we can grep/parse those out at will.
+ Available in the root, src and lib dirs.
- Closes #4042
+ Closes #3163
-- [Stephan Szabo brought this change]
+- RELEASE-PROCEDURE: adjust the release dates
+
+ See: https://curl.haxx.se/mail/lib-2018-10/0107.html
- tests: support non-localhost HOSTIP for dict/smb servers
+Patrick Monnerat (27 Oct 2018)
+- x509asn1: suppress left shift on signed value
- smbserver.py/dictserver.py were explicitly using localhost/127.0.0.1 for
- binding the server which when we were running the tests with a separate
- HOSTIP and CLIENTIP had failures verifying the server from the device we
- were testing.
+ Use an unsigned variable: as the signed operation behavior is undefined,
+ this change silents clang-tidy about it.
- This changes them to take the address from runtests.py and default to
- localhost/127.0.0.1 if none is given.
+ Ref: https://github.com/curl/curl/pull/3163
+ Reported-By: Daniel Stenberg
+
+Michael Kaufmann (27 Oct 2018)
+- multi: Fix error handling in the SENDPROTOCONNECT state
+
+ If Curl_protocol_connect() returns an error code,
+ handle the error instead of switching to the next state.
- Closes #4048
+ Closes #3170
-- test1523: basic test of CURLOPT_LOW_SPEED_LIMIT
+Daniel Stenberg (27 Oct 2018)
+- RELEASE-NOTES: synced
-- configure: --disable-progress-meter
+- openssl: output the correct cipher list on TLS 1.3 error
- Builds libcurl without support for the built-in progress meter.
+ When failing to set the 1.3 cipher suite, the wrong string pointer would
+ be used in the error message. Most often saying "(nil)".
- Closes #4023
+ Reported-by: Ricky-Tigg on github
+ Fixes #3178
+ Closes #3180
-- curl: improved skip-setopt-options when built with disabled features
+- docs/CIPHERS: fix the TLS 1.3 cipher names
- Reduces #ifdefs in src/tool_operate.c
+ ... picked straight from the OpenSSL man page:
+ https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html
- Follow-up from 4e86f2fc4e6
- Closes #3936
+ Reported-by: Ricky-Tigg on github
+ Bug: #3178
-Steve Holme (18 Jun 2019)
-- netrc: Return the correct error code when out of memory
+Marcel Raad (27 Oct 2018)
+- travis: install gnutls-bin package
- Introduced in 763c5178.
+ This is required for gnutls-serv, which enables a few more tests.
- Closes #4036
+ Closes https://github.com/curl/curl/pull/2958
-Daniel Stenberg (18 Jun 2019)
-- config-os400: add getpeername and getsockname defines
+Daniel Gustafsson (26 Oct 2018)
+- ssh: free the session on init failures
- Reported-by: jonrumsey on github
- Fixes #4037
- Closes #4039
-
-- runtests: keep logfiles around by default
+ Ensure to clear the session object in case the libssh2 initialization
+ fails.
- Make '-k' a no-op. The singletest function now clears the log directory
- BEFORE each individual test and not after, which makes it possible to
- always keep the logfiles around after a test has been run. No need to
- specify -k anymore. Keeping the option parsing around to work with users
- of old habits.
+ It could be argued that the libssh2 error function should be called to
+ get a proper error message in this case. But since the only error path
+ in libssh2_knownhost_init() is memory a allocation failure it's safest
+ to avoid since the libssh2 error handling allocates memory.
- Some tests also didn't work properly when -k was used (since the old
- logs would be kep when a new test starts) which this change also fixes.
+ Closes #3179
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Daniel Stenberg (26 Oct 2018)
+- docs/RELEASE-PROCEDURE: remove old entries, modify the Dec 2018 date
- Closes #4035
+ ... I'm moving it up one week due to travels. The rest stays.
-- [Gergely Nagy brought this change]
+- [Daniel Gustafsson brought this change]
- openssl: fix pubkey/signature algorithm detection in certinfo
+ openssl: make 'done' a proper boolean
- Certinfo gives the same result for all OpenSSL versions.
- Also made printing RSA pubkeys consistent with older versions.
-
- Reported-by: Michael Wallner
- Fixes #3706
- Closes #4030
+ Closes #3176
-- conn_maxage: move the check to prune_dead_connections()
+- gtls: Values stored to but never read
- ... and avoid the locking issue.
+ Detected by clang-tidy
- Reported-by: Kunal Ekawde
- Fixes #4029
- Closes #4032
+ Closes #3176
-- tests: have runtests figure out disabled features
-
- ... so that runtests can skip individual test cases that test features
- that are explicitly disabled in this build. This new logic is intended
- for disabled features that aren't otherwise easily visible through the
- curl_version_info() or other API calls.
-
- tests/server/disabled is a newly built executable that will output a
- list of disabled features. Outputs nothing for a default build.
+- [Alexey Eremikhin brought this change]
+
+ curl.1: --ipv6 mutexes ipv4 (fixed typo)
- Closes #3950
+ Fixes #3171
+ Closes #3172
-- test188/189: fix Content-Length
+- tool_main: make TerminalSettings static
- This cures the flaky test results
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/becfe1233ff2b6b0c3e1b6a10048b55b68c2539f#commitcomment-31008819
+ Closes #3161
+
+- curl-config.in: remove dependency on bc
- Closes #4034
+ Reported-by: Dima Pasechnik
+ Fixes #3143
+ Closes #3174
-- [Thomas Gamper brought this change]
+- [Gisle Vanem brought this change]
- winbuild: use WITH_PREFIX if given
+ rtmp: fix for compiling with lwIP
- Closes #4031
+ Compiling on _WIN32 and with USE_LWIPSOCK, causes this error:
+ curl_rtmp.c(223,3): error: use of undeclared identifier 'setsockopt'
+ setsockopt(r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO,
+ ^
+ curl_rtmp.c(41,32): note: expanded from macro 'setsockopt'
+ #define setsockopt(a,b,c,d,e) (setsockopt)(a,b,c,(const char *)d,(int)e)
+ ^
+ Closes #3155
-Daniel Gustafsson (17 Jun 2019)
-- openssl: remove outdated comment
+- configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T
- OpenSSL used to call exit(1) on syntax errors in OPENSSL_config(),
- which is why we switched to CONF_modules_load_file() and introduced
- a comment stating why. This behavior was however changed in OpenSSL
- commit abdd677125f3a9e3082f8c5692203590fdb9b860, so remove the now
- outdated and incorrect comment. The mentioned commit also declares
- OPENSSL_config() deprecated so keep the current coding.
+ Follow-up to #3166 which did the cmake part of this. This type/define is
+ not used.
- Closes #4033
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #3168
-Daniel Stenberg (16 Jun 2019)
-- RELEASE-NOTES: synced
+- [Ruslan Baratov brought this change]
-Patrick Monnerat (16 Jun 2019)
-- os400: make vsetopt() non-static as Curl_vsetopt() for os400 support.
+ cmake: remove unused variables
- Use it in curl_easy_setopt_ccsid().
+ Remove variables:
+ * HAVE_SOCKLEN_T
+ * CURL_SIZEOF_CURL_SOCKLEN_T
+ * CURL_TYPEOF_CURL_SOCKLEN_T
- Reported-by: jonrumsey on github
- Fixes #3833
- Closes #4028
+ Closes #3166
-Daniel Stenberg (15 Jun 2019)
-- runtests: report single test time + total duration
-
- ... after each successful test.
+Michael Kaufmann (25 Oct 2018)
+- urldata: Fix comment in header
- Closes #4027
+ The "connecting" function is used by multiple protocols, not only FTP
-- multi: fix the transfer hash function
+- netrc: free temporary strings if memory allocation fails
- Follow-up from 8b987cc7eb
+ - Change the inout parameters after all needed memory has been
+ allocated. Do not change them if something goes wrong.
+ - Free the allocated temporary strings if strdup() fails.
- Reported-by: Tom van der Woerdt
- Fixes #4018
- Closes #4024
+ Closes #3122
-- unit1654: cleanup on memory failure
-
- ... to make it handle torture tests properly.
+Daniel Stenberg (24 Oct 2018)
+- [Ruslan Baratov brought this change]
+
+ config: Remove unused SIZEOF_VOIDP
- Reported-by: Marcel Raad
- Fixes #4021
- Closes #4022
+ Closes #3162
+
+- RELEASE-NOTES: synced
+
+GitHub (23 Oct 2018)
+- [Gisle Vanem brought this change]
-Marcel Raad (13 Jun 2019)
-- krb5: fix compiler warning
+ Fix for compiling with lwIP (3)
- Even though the variable was used in a DEBUGASSERT, GCC 8 warned in
- debug mode:
- krb5.c:324:17: error: unused variable 'maj' [-Werror=unused-variable]
+ lwIP on Windows does not have a WSAIoctl() function.
+ But it do have a SO_SNDBUF option to lwip_setsockopt(). But it currently does nothing.
+
+Daniel Stenberg (23 Oct 2018)
+- Curl_follow: return better errors on URL problems
- Just suppress the warning and declare the variable unconditionally
- instead of only for DEBUGBUILD (which also missed the check for
- HAVE_ASSERT_H).
+ ... by making the converter function global and accessible.
- Closes https://github.com/curl/curl/pull/4020
+ Closes #3153
-Daniel Stenberg (13 Jun 2019)
-- quote.d: asterisk prefix works for SFTP as well
+- Curl_follow: remove remaining free(newurl)
+
+ Follow-up to 05564e750e8f0c. This function no longer frees the passed-in
+ URL.
- Reported-by: Ben Voris
- Fixes #4017
- Closes #4019
+ Reported-by: Michael Kaufmann
+ Bug: https://github.com/curl/curl/commit/05564e750e8f0c79016c680f301ce251e6e86155#commitcomm
+ ent-30985666
-- multi: fix the transfer hashes in the socket hash entries
+Daniel Gustafsson (23 Oct 2018)
+- headers: end all headers with guard comment
- - The transfer hashes weren't using the correct keys so removing entries
- failed.
+ Most headerfiles end with a /* <headerguard> */ comment, but it was
+ missing from some. The comment isn't the most important part of our
+ code documentation but consistency has an intrinsic value in itself.
+ This adds header guard comments to the files that were lacking it.
- - Simplified the iteration logic over transfers sharing the same socket and
- they now simply are set to expire and thus get handled in the "regular"
- timer loop instead.
+ Closes #3158
+ Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Jay Satiro (23 Oct 2018)
+- CIPHERS.md: Mention the options used to set TLS 1.3 ciphers
- Reported-by: Tom van der Woerdt
- Fixes #4012
- Closes #4014
+ Closes https://github.com/curl/curl/pull/3159
-Jay Satiro (12 Jun 2019)
-- [Cliff Crosland brought this change]
+Daniel Stenberg (20 Oct 2018)
+- docs/BUG-BOUNTY: the sponsors actually decide the amount
+
+ Retract the previous approach as the sponsors will be the ones to set the
+ final amounts.
+
+ Closes #3152
+ [ci skip]
- url: Fix CURLOPT_MAXAGE_CONN time comparison
+- multi: avoid double-free
+
+ Curl_follow() no longer frees the string. Make sure it happens in the
+ caller function, like we normally handle allocations.
- Old connections are meant to expire from the connection cache after
- CURLOPT_MAXAGE_CONN seconds. However, they actually expire after 1000x
- that value. This occurs because a time value measured in milliseconds is
- accidentally divided by 1M instead of by 1,000.
+ This bug was introduced with the use of the URL API internally, it has
+ never been in a release version
- Closes https://github.com/curl/curl/pull/4013
+ Reported-by: Dario Weißer
+ Closes #3149
-Daniel Stenberg (11 Jun 2019)
-- test1165: verify that CURL_DISABLE_ symbols are in sync
+- multi: make the closure handle "inherit" CURLOPT_NOSIGNAL
+
+ Otherwise, closing that handle can still cause surprises!
- between configure.ac and source code. They should be possible to switch
- on/off in configure AND be used in source code.
+ Reported-by: Martin Ankerl
+ Fixes #3138
+ Closes #3147
-- configure: remove CURL_DISABLE_TLS_SRP
+Marcel Raad (19 Oct 2018)
+- VS projects: add USE_IPV6
- It isn't used by code so stop providing the define.
+ The Visual Studio builds didn't use IPv6. Add it to all projects since
+ Visual Studio 2008, which is verified to build via AppVeyor.
- Closes #4010
+ Closes https://github.com/curl/curl/pull/3137
-- Revert "cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified"
+- config_win32: enable LDAPS
- This reverts commit 36738caeb78603ce24e3ea089a167b8c216fb938.
+ As done in the autotools and CMake builds by default.
- Apparently several of the appveyor windows builds broke.
+ Closes https://github.com/curl/curl/pull/3137
-- [sergey-raevskiy brought this change]
+Daniel Stenberg (18 Oct 2018)
+- travis: add build for "configure --disable-verbose"
+
+ Closes #3144
- cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified
+Kamil Dudka (17 Oct 2018)
+- tool_cb_hdr: handle failure of rename()
- Reviewed-by: Jakub Zakrzewski
- Closes #3770
+ Detected by Coverity.
+
+ Closes #3140
+ Reviewed-by: Jay Satiro
+Daniel Stenberg (17 Oct 2018)
- RELEASE-NOTES: synced
-- http2: remove CURL_DISABLE_TYPECHECK define
+- docs/SECURITY-PROCESS: the hackerone IBB program drops curl
- ... in http2-less builds as it served no use.
+ ... now there's only BountyGraph.
-- configure: more --disable switches to toggle off individual features
-
- ... actual support in the code for disabling these has already landed.
-
- Closes #4009
+Jay Satiro (16 Oct 2018)
+- [Matthew Whitehead brought this change]
-- wolfssl: fix key pinning build error
+ x509asn1: Fix SAN IP address verification
- follow-up from deb9462ff2de8
-
-- CURLMOPT_SOCKETFUNCTION.3: clarified
+ For IP addresses in the subject alternative name field, the length
+ of the IP address (and hence the number of bytes to perform a
+ memcmp on) is incorrectly calculated to be zero. The code previously
+ subtracted q from name.end. where in a successful case q = name.end
+ and therefore addrlen equalled 0. The change modifies the code to
+ subtract name.beg from name.end to calculate the length correctly.
- Moved away the callback explanation from curl_multi_socket_action.3 and
- expanded it somewhat.
+ The issue only affects libcurl with GSKit SSL, not other SSL backends.
+ The issue is not a security issue as IP verification would always fail.
- Closes #4006
+ Fixes #3102
+ Closes #3141
-- wolfssl: fixup for SNI use
+Daniel Gustafsson (15 Oct 2018)
+- INSTALL: mention mesalink in TLS section
- follow-up from deb9462ff2de8
+ Commit 57348eb97d1b8fc3742e02c6587d2d02ff592da5 added support for the
+ MesaLink vtls backend, but missed updating the TLS section containing
+ supported backends in the docs.
- Closes #4007
+ Closes #3134
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- CURLOPT_CAINFO.3: polished wording
-
- Clarify the functionality when built to use Schannel and Secure
- Transport and stop calling it the "recommended" or "preferred" way and
- instead rather call it the default.
+Marcel Raad (14 Oct 2018)
+- nonblock: fix unused parameter warning
- Removed the reference to the ssl comparison table as it isn't necessary.
+ If USE_BLOCKING_SOCKETS is defined, curlx_nonblock's arguments are not
+ used.
+
+Michael Kaufmann (13 Oct 2018)
+- Curl_follow: Always free the passed new URL
- Reported-by: Richard Alcock
- Bug: https://curl.haxx.se/mail/lib-2019-06/0019.html
- Closes #4005
+ Closes #3124
-GitHub (10 Jun 2019)
-- [Daniel Stenberg brought this change]
+Viktor Szakats (12 Oct 2018)
+- replace rawgit links [ci skip]
+
+ Ref: https://rawgit.com/ "RawGit has reached the end of its useful life"
+ Ref: https://news.ycombinator.com/item?id=18202481
+ Closes https://github.com/curl/curl/pull/3131
- SECURITY.md: created
+Daniel Stenberg (12 Oct 2018)
+- docs/BUG-BOUNTY.md: for vulns published since Aug 1st 2018
- Brief security policy description for use/display on github.
+ [ci skip]
-Daniel Gustafsson (10 Jun 2019)
-- tool_cb_prg: Fix integer overflow in progress bar
+- travis: make distcheck scan for BOM markers
- Commit 61faa0b420c236480bc9ef6fd52b4ecc1e0f8d17 fixed the progress bar
- width calculation to avoid integer overflow, but failed to account for
- the fact that initial_size is initialized to -1 when the file size is
- retrieved from the remote on an upload, causing another signed integer
- overflow. Fix by separately checking for this case before the width
- calculation.
+ and remove BOM from projects/wolfssl_override.props
- Closes #3984
- Reported-by: Brian Carpenter (Geeknik Labs)
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #3126
-Daniel Stenberg (10 Jun 2019)
-- wolfssl: refer to it as wolfSSL only
-
- Remove support for, references to and use of "cyaSSL" from the source
- and docs. wolfSSL is the current name and there's no point in keeping
- references to ancient history.
+Marcel Raad (11 Oct 2018)
+- CMake: remove BOM
- Assisted-by: Daniel Gustafsson
+ Accidentally aded in commit 1bb86057ff07083deeb0b00f8ad35879ec4d03ea.
- Closes #3903
+ Reported-by: Viktor Szakats
+ Ref: https://github.com/curl/curl/pull/3120#issuecomment-428673136
-- RELEASE-NOTES: synced
+Daniel Gustafsson (10 Oct 2018)
+- transfer: fix typo in comment
-- bindlocal: detect and avoid IP version mismatches in bind()
+Michael Kaufmann (10 Oct 2018)
+- docs: add "see also" links for SSL options
- Reported-by: Alex Grebenschikov
- Fixes #3993
- Closes #4002
+ - link TLS 1.2 and TLS 1.3 options
+ - link proxy and non-proxy options
+
+ Closes #3121
+
+Marcel Raad (10 Oct 2018)
+- AppVeyor: remove BDIR variable that sneaked in again
+
+ Removed in ae762e1abebe3a5fe75658583c85059a0957ef6e, accidentally added
+ again in 9f3be5672dc4dda30ab43e0152e13d714a84d762.
-- multi: make sure 'data' can present in several sockhash entries
+- CMake: disable -Wpedantic-ms-format
- Since more than one socket can be used by each transfer at a given time,
- each sockhash entry how has its own hash table with transfers using that
- socket.
+ As done in the autotools build. This is required for MinGW, which
+ supports only %I64 for printing 64-bit values, but warns about it.
- In addition, the sockhash entry can now be marked 'blocked = TRUE'"
- which then makes the delete function just set 'removed = TRUE' instead
- of removing it "for real", as a way to not rip out the carpet under the
- feet of a parent function that iterates over the transfers of that same
- sockhash entry.
+ Closes https://github.com/curl/curl/pull/3120
+
+Viktor Szakats (9 Oct 2018)
+- ldap: show precise LDAP call in error message on Windows
+
+ Also add a unique but common text ('bind via') to make it
+ easy to grep this specific failure regardless of platform.
- Reported-by: Tom van der Woerdt
- Fixes #3961
- Fixes #3986
- Fixes #3995
- Fixes #4004
- Closes #3997
+ Ref: https://github.com/curl/curl/pull/878/files#diff-7a636f08047c4edb53a240f540b4ecf6R468
+ Closes https://github.com/curl/curl/pull/3118
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-- [Sorcus brought this change]
+Daniel Stenberg (9 Oct 2018)
+- docs/DEPRECATE: minor reformat to render nicer on web
- libcurl-tutorial.3: Fix small typo (mutipart -> multipart)
+Daniel Gustafsson (9 Oct 2018)
+- CURLOPT_SSL_VERIFYSTATUS: Fix typo
- Fixed-by: MrSorcus on github
- Closes #4000
+ Changes s/OSCP/OCSP/ and bumps the copyright year due to the change.
-- unpause: trigger a timeout for event-based transfers
+Marcel Raad (9 Oct 2018)
+- curl_setup: define NOGDI on Windows
- ... so that timeouts or other state machine actions get going again
- after a changing pause state. For example, if the last delivery was
- paused there's no pending socket activity.
+ This avoids an ERROR macro clash between <wingdi.h> and <arpa/tftp.h>
+ on MinGW.
- Reported-by: sstruchtrup on github
- Fixes #3994
- Closes #4001
+ Closes https://github.com/curl/curl/pull/3113
-Marcel Raad (9 Jun 2019)
-- travis: use xenial LLVM package for scan-build
+- Windows: fixes for MinGW targeting Windows Vista
- I missed that in commit 99a49d6.
-
-- travis: update scan-build job to xenial
+ Classic MinGW has neither InitializeCriticalSectionEx nor
+ GetTickCount64, independent of the target Windows version.
- Closes https://github.com/curl/curl/pull/3999
+ Closes https://github.com/curl/curl/pull/3113
-Daniel Stenberg (8 Jun 2019)
-- bump: start working on 7.65.2
+Daniel Stenberg (8 Oct 2018)
+- TODO: fixed 'API for URL parsing/splitting'
-Marcel Raad (5 Jun 2019)
-- examples/htmltitle: use C++ casts between pointer types
-
- Compilers and static analyzers warn about using C-style casts here.
+Daniel Gustafsson (8 Oct 2018)
+- KNOWN_BUGS: Fix various typos
- Closes https://github.com/curl/curl/pull/3975
+ Closes #3112
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- examples/fopen: fix comparison
+Viktor Szakats (8 Oct 2018)
+- spelling fixes [ci skip]
- As want is size_t, (file->buffer_pos - want) is unsigned, so checking
- if it's less than zero makes no sense.
- Check if file->buffer_pos is less than want instead to avoid the
- unsigned integer wraparound.
+ as detected by codespell 1.14.0
- Closes https://github.com/curl/curl/pull/3975
+ Closes https://github.com/curl/curl/pull/3114
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+
+Daniel Stenberg (8 Oct 2018)
+- RELEASE-NOTES: synced
-- build: fix Codacy warnings
+- curl_ntlm_wb: check aprintf() return codes
- Reduce variable scopes and remove redundant variable stores.
+ ... when they return NULL we're out of memory and MUST return failure.
- Closes https://github.com/curl/curl/pull/3975
+ closes #3111
-- sws: remove unused variables
+- docs/BUG-BOUNTY: proposed additional docs
- Unused since commit 2f44e94.
+ Bug bounty explainer. See https://bountygraph.com/programs/curl
- Closes https://github.com/curl/curl/pull/3975
-
-Version 7.65.1 (4 Jun 2019)
-
-Daniel Stenberg (4 Jun 2019)
-- RELEASE-NOTES: 7.65.1
+ Closes #3067
-- THANKS: new contributors from 7.65.1
+- [Rick Deist brought this change]
-Steve Holme (4 Jun 2019)
-- [Frank Gevaerts brought this change]
+ hostip: fix check on Curl_shuffle_addr return value
+
+ Closes #3110
- ssl: Update outdated "openssl-only" comments for supported backends
+- FILE: fix CURLOPT_NOBODY and CURLOPT_HEADER output
- These are for features that used to be openssl-only but were expanded
- over time to support other SSL backends.
+ Now FILE transfers send headers to the header callback like HTTP and
+ other protocols. Also made curl_easy_getinfo(...CURLINFO_PROTOCOL...)
+ work for FILE in the callbacks.
- Closes #3985
-
-Daniel Stenberg (4 Jun 2019)
-- curl_share_setopt.3: improve wording [ci ship]
+ Makes "curl -i file://.." and "curl -I file://.." work like before
+ again. Applied the bold header logic to them too.
- Reported-by: Carlos ORyan
+ Regression from c1c2762 (7.61.0)
+
+ Reported-by: Shaun Jackman
+ Fixes #3083
+ Closes #3101
-Steve Holme (4 Jun 2019)
-- tool_parsecfg: Use correct return type for GetModuleFileName()
+Daniel Gustafsson (7 Oct 2018)
+- gskit: make sure to terminate version string
- GetModuleFileName() returns a DWORD which is a typedef of an unsigned
- long and not an int.
+ In case a very small buffer was passed to the version function, it could
+ result in the buffer not being NULL-terminated since strncpy() doesn't
+ guarantee a terminator on an overflowed buffer. Rather than adding code
+ to terminate (and handle zero-sized buffers), move to using snprintf()
+ instead like all the other vtls backends.
- Closes #3980
+ Closes #3105
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Viktor Szakats <commit@vszakats.net>
-Daniel Stenberg (3 Jun 2019)
-- TODO: "at least N milliseconds between requests" [ci skip]
+- TODO: add LD_PRELOAD support on macOS
- Suggested-by: dkwolfe4 on github
- Closes #3920
+ Add DYLD_INSERT_LIBRARIES support to the TODO list. Reported in #2394.
-Steve Holme (2 Jun 2019)
-- tests/server/.gitignore: Add socksd to the ignore list
+- runtests: skip ld_preload tests on macOS
- Missed in 04fd6755.
+ The LD_PRELOAD functionality doesn't exist on macOS, so skip any tests
+ requiring it.
- Closes #3978
+ Fixes #2394
+ Closes #3106
+ Reported-by: Github user @jakirkham
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- tool_parsecfg: Fix control flow issue (DEADCODE)
+Marcel Raad (7 Oct 2018)
+- AppVeyor: use Debug builds to run tests
- Follow-up to 8144ba38.
-
- Detected by Coverity CID 1445663
- Closes #3976
-
-Daniel Stenberg (2 Jun 2019)
-- [Sergey Ogryzkov brought this change]
-
- NTLM: reset proxy "multipass" state when CONNECT request is done
+ This enables more tests.
- Closes #3972
+ Closes https://github.com/curl/curl/pull/3104
-- test334: verify HTTP 204 response with chunked coding header
+- AppVeyor: add HTTP_ONLY build
- Verifies that a bodyless response don't parse this content-related
- header.
-
-- [Michael Kaufmann brought this change]
+ Closes https://github.com/curl/curl/pull/3104
- http: don't parse body-related headers bodyless responses
+- AppVeyor: add WinSSL builds
- Responses with status codes 1xx, 204 or 304 don't have a response body. For
- these, don't parse these headers:
+ Use the oldest and latest Windows SDKs for them.
+ Also, remove all but one OpenSSL build.
- - Content-Encoding
- - Content-Length
- - Content-Range
- - Last-Modified
- - Transfer-Encoding
+ Closes https://github.com/curl/curl/pull/3104
+
+- AppVeyor: add remaining Visual Studio versions
- This change ensures that HTTP/2 upgrades work even if a
- "Content-Length: 0" or a "Transfer-Encoding: chunked" header is present.
+ This adds Visual Studio 9 and 10 builds.
+ There's no 64-bit VC9 compiler on AppVeyor, so use it as the Win32
+ build. Also, VC9 cannot be used for running the test suite.
- Co-authored-by: Daniel Stenberg
- Closes #3702
- Fixes #3968
- Closes #3977
+ Closes https://github.com/curl/curl/pull/3104
-- tls13-docs: mention it is only for OpenSSL >= 1.1.1
+- AppVeyor: break long line
- Reported-by: Jay Satiro
- Co-authored-by: Jay Satiro
- Fixes #3938
- Closes #3946
+ Closes https://github.com/curl/curl/pull/3104
-- dump-header.d: spell out that no headers == empty file [ci skip]
+- AppVeyor: remove unused BDIR variable
- Reported-by: wesinator at github
- Fixes #3964
- Closes #3974
+ Closes https://github.com/curl/curl/pull/3104
-- singlesocket: use separate variable for inner loop
+Daniel Stenberg (6 Oct 2018)
+- test2100: test DoH using IPv4-only
- An inner loop within the singlesocket() function wrongly re-used the
- variable for the outer loop which then could cause an infinite
- loop. Change to using a separate variable!
+ To make it only send one DoH request and avoid the race condition that
+ could lead to the requests getting sent in reversed order and thus
+ making it hard to compare in the test case.
- Reported-by: Eric Wu
- Fixes #3970
- Closes #3973
+ Fixes #3107
+ Closes #3108
+
+- tests/FILEFORMAT: mention how to use <fileN> and <stripfileN> too
+
+ [ci skip]
- RELEASE-NOTES: synced
-- [Josie Huddleston brought this change]
+- [Dmitry Kostjuchenko brought this change]
- http2: Stop drain from being permanently set on
+ timeval: fix use of weak symbol clock_gettime() on Apple platforms
- Various functions called within Curl_http2_done() can have the
- side-effect of setting the Easy connection into drain mode (by calling
- drain_this()). However, the last time we unset this for a transfer (by
- calling drained_transfer()) is at the beginning of Curl_http2_done().
- If the Curl_easy is reused for another transfer, it is then stuck in
- drain mode permanently, which in practice makes it unable to write any
- data in the new transfer.
-
- This fix moves the last call to drained_transfer() to later in
- Curl_http2_done(), after the functions that could potentially call for a
- drain.
-
- Fixes #3966
- Closes #3967
- Reported-by: Josie-H
+ Closes #3048
-Steve Holme (29 May 2019)
-- conncache: Remove the DEBUGASSERT on length check
+- doh: keep the IPv4 address in (original) network byte order
+
+ Ideally this will fix the reversed order shown in SPARC tests:
- We trust the calling code as this is an internal function.
+ resp 8: Expected 127.0.0.1 got 1.0.0.127
- Closes #3962
+ Closes #3091
-Jay Satiro (29 May 2019)
-- [Gisle Vanem brought this change]
+Jay Satiro (5 Oct 2018)
+- INTERNALS.md: wrap lines longer than 79
- system_win32: fix function prototype
-
- - Change if_nametoindex parameter type from char * to const char *.
+Daniel Gustafsson (5 Oct 2018)
+- INTERNALS: escape reference to parameter
- Follow-up to 09eef8af from this morning.
+ The parameter reference <string> was causing rendering issues in the
+ generated HTML page, as <string> isn't a valid HTML tag. Fix by back-
+ tick escaping it.
- Bug: https://github.com/curl/curl/commit/09eef8af#r33716067
+ Closes #3099
+ Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Marcel Raad (29 May 2019)
-- appveyor: add Visual Studio solution build
+- checksrc: handle zero scoped ignore commands
- Closes https://github.com/curl/curl/pull/3941
-
-- appveyor: add support for other build systems
+ If a !checksrc! disable command specified to ignore zero errors, it was
+ still added to the ignore block even though nothing was ignored. While
+ there were no blocks ignored that shouldn't be ignored, the processing
+ ended with with a warning:
- Introduce BUILD_SYSTEM variable, which is currently always CMake.
+ <filename>:<line>:<col>: warning: Unused ignore: LONGLINE (UNUSEDIGNORE)
+ /* !checksrc! disable LONGLINE 0 */
+ ^
+ Fix by instead treating a zero ignore as a a badcommand and throw a
+ warning for that one.
- Closes https://github.com/curl/curl/pull/3941
+ Closes #3096
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Steve Holme (29 May 2019)
-- url: Load if_nametoindex() dynamically from iphlpapi.dll on Windows
+- checksrc: enable strict mode and warnings
- This fixes the static dependency on iphlpapi.lib and allows curl to
- build for targets prior to Windows Vista.
+ Enable strict and warnings mode for checksrc to ensure we aren't missing
+ anything due to bugs in the checking code. This uncovered a few things
+ which are all fixed in this commit:
- This partially reverts 170bd047.
+ * several variables were used uninitialized
+ * several variables were not defined in the correct scope
+ * the whitelist filehandle was read even if the file didn't exist
+ * the enable_warn() call when a disable counter had expired was passing
+ incorrect variables, but since the checkwarn() call is unlikely to hit
+ (the counter is only decremented to zero on actual ignores) it didn't
+ manifest a problem.
- Fixes #3960
- Closes #3958
-
-Daniel Stenberg (29 May 2019)
-- http: fix "error: equality comparison with extraneous parentheses"
+ Closes #3090
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-- parse_proxy: make sure portptr is initialized
-
- Reported-by: Benbuck Nason
+Marcel Raad (5 Oct 2018)
+- CMake: suppress MSVC warning C4127 for libtest
- fixes #3959
+ It's issued by older Windows SDKs (prior to version 8.0).
-- url: default conn->port to the same as conn->remote_port
+Sergei Nikulov (5 Oct 2018)
+- Merge branch 'dmitrykos-fix_missing_CMake_defines'
+
+- [Dmitry Kostjuchenko brought this change]
+
+ cmake: test and set missed defines during configuration
- ... so that it has a sensible value when ConnectionExists() is called which
- needs it set to differentiate host "bundles" correctly on port number!
+ Added configuration checks for HAVE_BUILTIN_AVAILABLE and HAVE_CLOCK_GETTIME_MONOTONIC.
- Also, make conncache:hashkey() use correct port for bundles that are proxy vs
- host connections.
+ Closes #3097
+
+Marcel Raad (5 Oct 2018)
+- AppVeyor: disable test 500
- Probably a regression from 7.62.0
+ It almost always results in
+ "starttransfer vs total: 0.000001 0.000000".
+ I cannot reproduce this locally, so disable it for now.
- Reported-by: Tom van der Woerdt
- Fixes #3956
- Closes #3957
+ Closes https://github.com/curl/curl/pull/3100
-- conncache: make "bundles" per host name when doing proxy tunnels
+- AppVeyor: set custom install prefix
- Only HTTP proxy use where multiple host names can be used over the same
- connection should use the proxy host name for bundles.
+ CMake's default has spaces and in 32-bit mode parentheses, which result
+ in syntax errors in curl-config.
- Reported-by: Tom van der Woerdt
- Fixes #3951
- Closes #3955
+ Closes https://github.com/curl/curl/pull/3100
-- multi: track users of a socket better
+- AppVeyor: Remove non-SSL non-test builds
- They need to be removed from the socket hash linked list with more care.
+ They don't add much value.
- When sh_delentry() is called to remove a sockethash entry, remove all
- individual transfers from the list first. To enable this, each Curl_easy struct
- now stores a pointer to the sockethash entry to know how to remove itself.
+ Closes https://github.com/curl/curl/pull/3100
+
+- AppVeyor: run test suite
- Reported-by: Tom van der Woerdt and Kunal Ekawde
+ Use the preinstalled MSYS2 bash for that.
+ Disable test 1139 as the CMake build doesn't generate curl.1.
- Fixes #3952
- Fixes #3904
- Closes #3953
+ Ref: https://github.com/curl/curl/issues/3070#issuecomment-425922224
+ Closes https://github.com/curl/curl/pull/3100
-Steve Holme (28 May 2019)
-- curl-win32.h: Enable Unix Domain Sockets based on the Windows SDK version
+- AppVeyor: use in-tree build
- Microsoft added support for Unix Domain Sockets in Windows 10 1803
- (RS4). Rather than expect the user to enable Unix Domain Sockets by
- uncommenting the #define that was added in 0fd6221f we use the RS4
- pre-processor variable that is present in newer versions of the
- Windows SDK.
+ Required to run the tests.
- Closes #3939
-
-Daniel Stenberg (28 May 2019)
-- [Jonas Vautherin brought this change]
+ Closes https://github.com/curl/curl/pull/3100
- cmake: support CMAKE_OSX_ARCHITECTURES when detecting SIZEOF variables
+Daniel Stenberg (4 Oct 2018)
+- doh: make sure TTL isn't re-inited by second (discarded?) response
- Closes #3945
+ Closes #3092
-Marcel Raad (27 May 2019)
-- HAProxy tests: add keywords
+- test320: strip out more HTML when comparing
- Add the proxy and haproxy keywords in order to be able to exclude or
- run these specific tests.
+ To make the test case work with different gnutls-serv versions better.
- Closes https://github.com/curl/curl/pull/3949
-
-Daniel Stenberg (27 May 2019)
-- [Maksim Stsepanenka brought this change]
+ Reported-by: Kamil Dudka
+ Fixes #3093
+ Closes #3094
- tests: make test 1420 and 1406 work with rtsp-disabled libcurl
+Marcel Raad (4 Oct 2018)
+- runtests: use Windows paths for Windows curl
- Closes #3948
+ curl generated by CMake's Visual Studio generator has "Windows" in the
+ version number.
-Kamil Dudka (27 May 2019)
-- [Hubert Kario brought this change]
+Daniel Stenberg (4 Oct 2018)
+- [Colin Hogben brought this change]
- nss: allow to specify TLS 1.3 ciphers if supported by NSS
+ tests/negtelnetserver.py: fix Python2-ism in neg TELNET server
- Closes #3916
-
-Daniel Stenberg (26 May 2019)
-- RELEASE-NOTES: synced
-
-- [Jay Satiro brought this change]
+ Fix problems caused by differences in treatment of bytes objects between
+ python2 and python3.
+
+ Fixes #2929
+ Closes #3080
- Revert all SASL authzid (new feature) commits
+Daniel Gustafsson (3 Oct 2018)
+- memory: ensure to check allocation results
- - Revert all commits related to the SASL authzid feature since the next
- release will be a patch release, 7.65.1.
+ The result of a memory allocation should always be checked, as we may
+ run under memory pressure where even a small allocation can fail. This
+ adds checking and error handling to a few cases where the allocation
+ wasn't checked for success. In the ftp case, the freeing of the path
+ variable is moved ahead of the allocation since there is little point
+ in keeping it around across the strdup, and the separation makes for
+ more readable code. In nwlib, the lock is aslo freed in the error path.
- Prior to this change CURLOPT_SASL_AUTHZID / --sasl-authzid was destined
- for the next release, assuming it would be a feature release 7.66.0.
- However instead the next release will be a patch release, 7.65.1 and
- will not contain any new features.
+ Also bumps the copyright years on affected files.
- After the patch release after the reverted commits can be restored by
- using cherry-pick:
+ Closes #3084
+ Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+- comment: Fix multiple typos in function parameters
- git cherry-pick a14d72c a9499ff 8c1cc36 c2a8d52 0edf690
+ Ensure that the parameters in the comment match the actual names in the
+ prototype.
- Details for all reverted commits:
+ Closes #3079
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+- CURLOPT_SSLVERSION.3: fix typos and consistent spelling
- Revert "os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid()."
+ Use TLS vX.Y throughout the document, instead of TLS X.Y, as that was
+ already done in all but a few cases. Also fix a few typos.
- This reverts commit 0edf6907ae37e2020722e6f61229d8ec64095b0a.
+ Closes #3076
+ Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+- SECURITY-PROCESS: make links into hyperlinks
- Revert "tests: Fix the line endings for the SASL alt-auth tests"
+ Use proper Markdown hyperlink format for the Bountygraph links in order
+ for the generated website page to be more user friendly. Also link to
+ the sponsors to give them a little extra credit.
- This reverts commit c2a8d52a1356a722ff9f4aeb983cd4eaf80ef221.
+ Closes #3082
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Jay Satiro (3 Oct 2018)
+- CURLOPT_HEADER.3: fix typo
+
+- nss: fix nssckbi module loading on Windows
- Revert "examples: Added SASL PLAIN authorisation identity (authzid) examples"
+ - Use .DLL extension instead of .so to load modules on Windows.
- This reverts commit 8c1cc369d0c7163c6dcc91fd38edfea1f509ae75.
+ Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
+ Reported-by: Maxime Legros
- Revert "curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool"
+ Ref: https://github.com/curl/curl/pull/3016/#issuecomment-423069442
- This reverts commit a9499ff136d89987af885e2d7dff0a066a3e5817.
+ Closes https://github.com/curl/curl/pull/3086
+
+- data-binary.d: clarify default content-type is x-www-form-urlencoded
- Revert "sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID"
+ - Advise user that --data-binary sends a default content type of
+ x-www-form-urlencoded, and to have the data treated as arbitrary
+ binary data by the server set the content-type header to octet-stream.
- This reverts commit a14d72ca2fec5d4eb5a043936e4f7ce08015c177.
-
-- [dbrowndan brought this change]
-
- FAQ: more minor updates and spelling fixes
+ Ref: https://github.com/curl/curl/pull/2852#issuecomment-426465094
- Closes #3937
+ Closes https://github.com/curl/curl/pull/3085
-- RELEASE-NOTES: synced
-
-- sectransp: handle errSSLPeerAuthCompleted from SSLRead()
+Marcel Raad (2 Oct 2018)
+- test1299: use single quotes around asterisk
- Reported-by: smuellerDD on github
- Fixes #3932
- Closes #3933
-
-GitHub (24 May 2019)
-- [Gisle Vanem brought this change]
-
- Fix typo.
+ Ref: https://github.com/curl/curl/issues/1751#issuecomment-321522580
-Daniel Stenberg (23 May 2019)
-- tool_setopt: for builds with disabled-proxy, skip all proxy setopts()
+Daniel Stenberg (2 Oct 2018)
+- docs/CIPHERS: mention the colon separation for OpenSSL
- Reported-by: Marcel Raad
- Fixes #3926
- Closes #3929
+ Bug: #3077
-Steve Holme (23 May 2019)
-- winbuild: Use two space indentation
+- runtests: ignore disabled even when ranges are given
- Closes #3930
-
-GitHub (23 May 2019)
-- [Gisle Vanem brought this change]
-
- tool_parse_cfg: Avoid 2 fopen() for WIN32
+ runtests.pl support running a range of tests, like "44 to 127". Starting
+ now, the code makes sure that even such given ranges will ignore tests
+ that are marked as disabled.
- Using the memdebug.h mem-leak feature, I noticed 2 calls like:
- FILE tool_parsecfg.c:70 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
- FILE tool_parsecfg.c:114 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
+ Disabled tests can still be run by explictly specifying that test
+ number.
- No need for 'fopen(), 'fclose()' and a 'fopen()' yet again.
+ Closes #3075
-Daniel Stenberg (23 May 2019)
-- md4: include the mbedtls config.h to get the MD4 info
-
-- md4: build correctly with openssl without MD4
+- urlapi: starting with a drive letter on win32 is not an abs url
+
+ ... and libcurl doesn't support any single-letter URL schemes (if there
+ even exist any) so it should be fairly risk-free.
+
+ Reported-by: Marcel Raad
- Reported-by: elsamuko at github
- Fixes #3921
- Closes #3922
+ Fixes #3070
+ Closes #3071
-Patrick Monnerat (23 May 2019)
-- os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
+Marcel Raad (2 Oct 2018)
+- doh: fix curl_easy_setopt argument type
+
+ CURLOPT_POSTFIELDSIZE is long. Fixes a compiler warning on 64-bit
+ MinGW.
-Daniel Stenberg (23 May 2019)
-- .github/FUNDING: mention our opencollective "home" [ci skip]
+Daniel Stenberg (2 Oct 2018)
+- RELEASE-NOTES: synced
-Marcel Raad (23 May 2019)
-- [Zenju brought this change]
+Jay Satiro (1 Oct 2018)
+- [Ruslan Baratov brought this change]
- config-win32: add support for if_nametoindex and getsockname
+ CMake: Improve config installation
- Closes https://github.com/curl/curl/pull/3923
-
-Jay Satiro (23 May 2019)
-- tests: Fix the line endings for the SASL alt-auth tests
+ Use 'GNUInstallDirs' standard module to set destinations of installed
+ files.
- - Change data and protocol sections to CRLF line endings.
+ Use uppercase "CURL" names instead of lowercase "curl" to match standard
+ 'FindCURL.cmake' CMake module:
+ * https://cmake.org/cmake/help/latest/module/FindCURL.html
- Prior to this change the tests would fail or hang, which is because
- certain sections such as protocol require CRLF line endings.
+ Meaning:
+ * Install 'CURLConfig.cmake' instead of 'curl-config.cmake'
+ * User should call 'find_package(CURL)' instead of 'find_package(curl)'
- Follow-up to a9499ff from today which added the tests.
+ Use 'configure_package_config_file' function to generate
+ 'CURLConfig.cmake' file. This will make 'curl-config.cmake.in' template
+ file smaller and handle components better. E.g. current configuration
+ report no error if user specified unknown components (note: new
+ configuration expects no components, report error if user will try to
+ specify any).
- Ref: https://github.com/curl/curl/pull/3790
+ Closes https://github.com/curl/curl/pull/2849
-Daniel Stenberg (23 May 2019)
-- url: fix bad #ifdef
+Daniel Stenberg (1 Oct 2018)
+- test1650: make it depend on http/2
- Regression since e91e48161235272ff485.
+ Follow-up to 570008c99da0ccbb as it gets link errors.
- Reported-by: Tom Greenslade
- Fixes #3924
- Closes #3925
+ Reported-by: Michael Kaufmann
+ Closes #3068
+
+- [Nate Prewitt brought this change]
-- Revert "progress: CURL_DISABLE_PROGRESS_METER"
+ MANUAL: minor grammar fix
- This reverts commit 3b06e68b7734cb10a555f9d7e804dd5d808236a4.
+ Noticed a typo reading through the docs.
- Clearly this change wasn't good enough as it broke CURLOPT_LOW_SPEED_LIMIT +
- CURLOPT_LOW_SPEED_TIME
+ Closes #3069
+
+- doh: only build if h2 enabled
- Reported-by: Dave Reisner
+ The DoH spec says "HTTP/2 [RFC7540] is the minimum RECOMMENDED version
+ of HTTP for use with DoH".
- Fixes #3927
- Closes #3928
-
-Steve Holme (22 May 2019)
-- examples: Added SASL PLAIN authorisation identity (authzid) examples
+ Reported-by: Marcel Raad
+ Closes #3066
-- curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
+- test2100: require http2 to run
+
+ Reported-by: Marcel Raad
+ Fixes #3064
+ Closes #3065
-- sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
+- multi: fix memory leak in content encoding related error path
- Added the ability for the calling program to specify the authorisation
- identity (authzid), the identity to act as, in addition to the
- authentication identity (authcid) and password when using SASL PLAIN
- authentication.
+ ... a missing multi_done() call.
- Fixed #3653
- Closes #3790
+ Credit to OSS-Fuzz
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10728
+ Closes #3063
-Marc Hoersken (22 May 2019)
-- tests: add support to test against OpenSSH for Windows
+- travis: bump the Secure Transport build to use xcode 10
- Testing against OpenSSH for Windows requires v7.7.0.0 or newer
- due to the use of AllowUsers and DenyUsers. For more info see:
- https://github.com/PowerShell/Win32-OpenSSH/wiki/sshd_config
+ Due to an issue with travis
+ (https://github.com/travis-ci/travis-ci/issues/9956) we've been using
+ Xcode 9.2 for darwinssl builds for a while. Now xcode 10 is offered as
+ an alternative and as it builds curl+darwinssl fine that seems like a
+ better choice.
+
+ Closes #3062
-Daniel Stenberg (22 May 2019)
-- bump: start on the next release
+- [Rich Turner brought this change]
-Marcel Raad (22 May 2019)
-- examples: fix "clarify calculation precedence" warnings
+ curl: enabled Windows VT Support and UTF-8 output
- Closes https://github.com/curl/curl/pull/3919
-
-- hiperfifo: remove unused variable
+ Enabled Console VT support (if running OS supports VT) in tool_main.c.
- Closes https://github.com/curl/curl/pull/3919
+ Fixes #3008
+ Closes #3011
-- examples: remove dead variable stores
+- multi: fix location URL memleak in error path
- Closes https://github.com/curl/curl/pull/3919
+ Follow-up to #3044 - fix a leak OSS-Fuzz detected
+ Closes #3057
-- examples: reduce variable scopes
-
- Closes https://github.com/curl/curl/pull/3919
+Sergei Nikulov (28 Sep 2018)
+- cmake: fixed path used in generation of docs/tests during curl build through add_subdicectory(...)
-- http2-download: fix format specifier
-
- Closes https://github.com/curl/curl/pull/3919
+- [Brad King brought this change]
-Daniel Stenberg (22 May 2019)
-- PolarSSL: deprecate support step 1. Removed from configure.
-
- Also removed mentions from most docs.
+ cmake: Backport to work with CMake 3.0 again
- Discussed: https://curl.haxx.se/mail/lib-2019-05/0045.html
+ Changes in commit 7867aaa9a0 (cmake: link curl to the OpenSSL targets
+ instead of lib absolute paths, 2018-07-17) and commit f826b4ce98 (cmake:
+ bumped minimum version to 3.4, 2018-07-19) required CMake 3.4 to fix
+ issue #2746. This broke support for users on older versions of CMake
+ even if they just want to build curl and do not care whether transitive
+ dependencies work.
- Closes #3888
+ Backport the logic to work with CMake 3.0 again by implementing the
+ fix only when the version of CMake is at least 3.4.
-- configure/cmake: check for if_nametoindex()
+Marcel Raad (27 Sep 2018)
+- curl_threads: fix classic MinGW compile break
- - adds the check to cmake
+ Classic MinGW still has _beginthreadex's return type as unsigned long
+ instead of uintptr_t [0]. uintptr_t is not even defined because of [1].
- - fixes the configure check to work for cross-compiled windows builds
+ [0] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l167
+ [1] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l90
- Closes #3917
+ Bug: https://github.com/curl/curl/issues/2924#issuecomment-424334807
+ Closes https://github.com/curl/curl/pull/3051
-- parse_proxy: use the IPv6 zone id if given
-
- If the proxy string is given as an IPv6 numerical address with a zone
- id, make sure to use that for the connect to the proxy.
+Daniel Stenberg (26 Sep 2018)
+- configure: s/AC_RUN_IFELSE/CURL_RUN_IFELSE
- Reported-by: Edmond Yu
+ fix a few leftovers
- Fixes #3482
- Closes #3918
+ Fixes #3006
+ Closes #3049
-Version 7.65.0 (22 May 2019)
+- [Doron Behar brought this change]
-Daniel Stenberg (22 May 2019)
-- RELEASE-NOTES: 7.65.0 release
-
-- THANKS: from the 7.65.0 release-notes
-
-- url: convert the zone id from a IPv6 URL to correct scope id
+ example/htmltidy: fix include paths of tidy libraries
- Reported-by: GitYuanQu on github
- Fixes #3902
- Closes #3914
+ Closes #3050
-- configure: detect getsockname and getpeername on windows too
+- RELEASE-NOTES: synced
+
+- Curl_http2_done: fix memleak in error path
- Made detection macros for these two functions in the same style as other
- functions possibly in winsock in the hope this will work better to
- detect these functions when cross-compiling for Windows.
+ Free 'header_recvbuf' unconditionally even if 'h2' isn't (yet) set, for
+ early failures.
- Follow-up to e91e4816123
+ Detected by OSS-Fuzz
- Fixes #3913
- Closes #3915
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10669
+ Closes #3046
-Marcel Raad (21 May 2019)
-- examples: remove unused variables
+- http: fix memleak in rewind error path
+
+ If the rewind would fail, a strdup() would not get freed.
- Fixes Codacy/CppCheck warnings.
+ Detected by OSS-Fuzz
- Closes
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10665
+ Closes #3044
-Daniel Gustafsson (21 May 2019)
-- udpateconninfo: mark variable unused
+Viktor Szakats (24 Sep 2018)
+- test320: fix regression in [ci skip]
- When compiling without getpeername() or getsockname(), the sockfd
- paramter to Curl_udpateconninfo() became unused after commit e91e481612
- added ifdef guards.
+ The value in question is coming directly from `gnutls-serv`, so it cannot
+ be modified freely.
- Closes #3910
- Fixes https://curl.haxx.se/dev/log.cgi?id=20190520172441-32196
- Reviewed-by: Marcel Raad, Daniel Stenberg
+ Reported-by: Marcel Raad
+ Ref: https://github.com/curl/curl/commit/6ae6b2a533e8630afbb21f570305bd4ceece6348#commitcomment-30621004
-- ftp: move ftp_ccc in under featureflag
+Daniel Stenberg (24 Sep 2018)
+- Curl_retry_request: fix memory leak
- Commit e91e48161235272ff485ff32bd048c53af731f43 moved ftp_ccc in under
- the FTP featureflag in the UserDefined struct, but vtls callsites were
- still using it unprotected.
+ Detected by OSS-Fuzz
- Closes #3912
- Fixes: https://curl.haxx.se/dev/log.cgi?id=20190520044705-29865
- Reviewed-by: Daniel Stenberg, Marcel Raad
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10648
+ Closes #3042
-Daniel Stenberg (20 May 2019)
-- curl: report error for "--no-" on non-boolean options
+- openssl: load built-in engines too
+
+ Regression since 38203f1
- Reported-by: Olen Andoni
- Fixes #3906
- Closes #3907
+ Reported-by: Jean Fabrice
+ Fixes #3023
+ Closes #3040
-- [Guy Poizat brought this change]
+- [Christian Heimes brought this change]
- mbedtls: enable use of EC keys
+ OpenSSL: enable TLS 1.3 post-handshake auth
- Closes #3892
-
-- lib1560: add tests for parsing URL with too long scheme
+ OpenSSL 1.1.1 requires clients to opt-in for post-handshake
+ authentication.
+
+ Fixes: https://github.com/curl/curl/issues/3026
+ Signed-off-by: Christian Heimes <christian@python.org>
- Ref: #3905
+ Closes https://github.com/curl/curl/pull/3027
-- [Omar Ramadan brought this change]
+- [Even Rouault brought this change]
- urlapi: increase supported scheme length to 40 bytes
-
- The longest currently registered URI scheme at IANA is 36 bytes long.
+ Curl_dedotdotify(): always nul terminate returned string.
+
+ This fixes potential out-of-buffer access on "file:./" URL
+
+ $ valgrind curl "file:./"
+ ==24516== Memcheck, a memory error detector
+ ==24516== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
+ ==24516== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
+ ==24516== Command: /home/even/install-curl-git/bin/curl file:./
+ ==24516==
+ ==24516== Conditional jump or move depends on uninitialised value(s)
+ ==24516== at 0x4C31F9C: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
+ ==24516== by 0x4EBB315: seturl (urlapi.c:801)
+ ==24516== by 0x4EBB568: parseurl (urlapi.c:861)
+ ==24516== by 0x4EBC509: curl_url_set (urlapi.c:1199)
+ ==24516== by 0x4E644C6: parseurlandfillconn (url.c:2044)
+ ==24516== by 0x4E67AEF: create_conn (url.c:3613)
+ ==24516== by 0x4E68A4F: Curl_connect (url.c:4119)
+ ==24516== by 0x4E7F0A4: multi_runsingle (multi.c:1440)
+ ==24516== by 0x4E808E5: curl_multi_perform (multi.c:2173)
+ ==24516== by 0x4E7558C: easy_transfer (easy.c:686)
+ ==24516== by 0x4E75801: easy_perform (easy.c:779)
+ ==24516== by 0x4E75868: curl_easy_perform (easy.c:798)
+
+ Was originally spotted by
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10637
+ Credit to OSS-Fuzz
- Closes #3905
- Closes #3900
+ Closes #3039
-Marcel Raad (20 May 2019)
-- lib: reduce variable scopes
+Viktor Szakats (23 Sep 2018)
+- update URLs in tests
- Fixes Codacy/CppCheck warnings.
+ - and one in docs/MANUAL as well
- Closes https://github.com/curl/curl/pull/3872
+ Closes https://github.com/curl/curl/pull/3038
-- tool_formparse: remove redundant assignment
+- whitespace fixes
- Just initialize word_begin with the correct value.
+ - replace tabs with spaces where possible
+ - remove line ending spaces
+ - remove double/triple newlines at EOF
+ - fix a non-UTF-8 character
+ - cleanup a few indentations/line continuations
+ in manual examples
- Closes https://github.com/curl/curl/pull/3873
+ Closes https://github.com/curl/curl/pull/3037
-- ssh: move variable declaration to where it's used
+Daniel Stenberg (23 Sep 2018)
+- http: add missing return code check
+
+ Detected by Coverity. CID 1439610.
- This way, we need only one call to free.
+ Follow-up from 46e164069d1a523
- Closes https://github.com/curl/curl/pull/3873
+ Closes #3034
-- ssh-libssh: remove unused variable
+- ftp: don't access pointer before NULL check
- sock was only used to be assigned to fd_read.
+ Detected by Coverity. CID 1439611.
- Closes https://github.com/curl/curl/pull/3873
+ Follow-up from 46e164069d1a523
-Daniel Stenberg (20 May 2019)
-- test332: verify the blksize fix
-
-- tftp: use the current blksize for recvfrom()
+- unit1650: fix out of boundary access
- bug: https://curl.haxx.se/docs/CVE-2019-5436.html
- Reported-by: l00p3r on hackerone
- CVE-2019-5436
+ Fixes #2987
+ Closes #3035
-Daniel Gustafsson (19 May 2019)
-- version: make ssl_version buffer match for multi_ssl
+Viktor Szakats (23 Sep 2018)
+- docs/examples: URL updates
- When running a multi TLS backend build the version string needs more
- buffer space. Make the internal ssl_buffer stack buffer match the one
- in Curl_multissl_version() to allow for the longer string. For single
- TLS backend builds there is no use in extended to buffer. This is a
- fallout from #3863 which fixes up the multi_ssl string generation to
- avoid a buffer overflow when the buffer is too small.
+ - also update two URLs outside of docs/examples
+ - fix spelling of filename persistant.c
+ - fix three long lines that started failing checksrc.pl
- Closes #3875
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes https://github.com/curl/curl/pull/3036
-Steve Holme (18 May 2019)
-- http_ntlm_wb: Handle auth for only a single request
+- examples/Makefile.m32: sync with core [ci skip]
- Currently when the server responds with 401 on NTLM authenticated
- connection (re-used) we consider it to have failed. However this is
- legitimate and may happen when for example IIS is set configured to
- 'authPersistSingleRequest' or when the request goes thru a proxy (with
- 'via' header).
+ also:
+ - fix two warnings in synctime.c (one of them Windows-specific)
+ - upgrade URLs in synctime.c and remove a broken one
- Implemented by imploying an additional state once a connection is
- re-used to indicate that if we receive 401 we need to restart
- authentication.
+ Closes https://github.com/curl/curl/pull/3033
+
+Daniel Stenberg (22 Sep 2018)
+- examples/parseurl.c: show off the URL API a bit
- Missed in fe6049f0.
+ Closes #3030
-- http_ntlm_wb: Cleanup handshake after clean NTLM failure
+- SECURITY-PROCESS: mention the bountygraph program [ci skip]
- Missed in 50b87c4e.
+ Closes #3032
-- http_ntlm_wb: Return the correct error on receiving an empty auth message
+- url: use the URL API internally as well
- Missed in fe20826b as it wasn't implemented in http.c in b4d6db83.
+ ... to make it a truly unified URL parser.
- Closes #3894
+ Closes #3017
-Daniel Stenberg (18 May 2019)
-- curl: make code work with protocol-disabled libcurl
+Viktor Szakats (22 Sep 2018)
+- URL and mailmap updates, remove an obsolete directory [ci skip]
- Closes #3844
-
-- libcurl: #ifdef away more code for disabled features/protocols
+ Closes https://github.com/curl/curl/pull/3031
-- progress: CURL_DISABLE_PROGRESS_METER
+Daniel Stenberg (22 Sep 2018)
+- RELEASE-NOTES: synced
-- hostip: CURL_DISABLE_SHUFFLE_DNS
+- configure: force-use -lpthreads on HPUX
+
+ When trying to detect pthreads use on HPUX the checks will succeed
+ without the correct -l option but then end up failing at run-time.
+
+ Reported-by: Eason-Yu on github
+ Fixes #2697
+ Closes #3025
-- netrc: CURL_DISABLE_NETRC
+- [Erik Minekus brought this change]
-Viktor Szakats (16 May 2019)
-- docs: Markdown and misc improvements [ci skip]
+ Curl_saferealloc: Fixed typo in docblock
- Approved-by: Daniel Stenberg
- Closes #3896
+ Closes #3029
-- docs/RELEASE-PROCEDURE: link to live iCalendar [ci skip]
+- urlapi: fix support for address scope in IPv6 numerical addresses
- Ref: https://github.com/curl/curl/commit/0af41b40b2c7bd379b2251cbe7cd618e21fa0ea1#commitcomment-33563135
- Approved-by: Daniel Stenberg
- Closes #3895
+ Closes #3024
+
+- [Loganaden Velvindron brought this change]
-Daniel Stenberg (16 May 2019)
-- travis: add an osx http-only build
+ GnutTLS: TLS 1.3 support
- Closes #3887
+ Closes #2971
-- cleanup: remove FIXME and TODO comments
+- TODO: c-ares and CURLOPT_OPENSOCKETFUNCTION
- They serve very little purpose and mostly just add noise. Most of them
- have been around for a very long time. I read them all before removing
- or rephrasing them.
+ Removed DoH.
- Ref: #3876
- Closes #3883
+ Closes #2734
-- curl: don't set FTP options for FTP-disabled builds
+Jay Satiro (20 Sep 2018)
+- vtls: fix ssl version "or later" behavior change for many backends
- ... since libcurl has started to be totally unaware of options for
- disabled protocols they now return error.
+ - Treat CURL_SSLVERSION_MAX_NONE the same as
+ CURL_SSLVERSION_MAX_DEFAULT. Prior to this change NONE would mean use
+ the minimum version also as the maximum.
- Bug: https://github.com/curl/curl/commit/c9c5304dd4747cbe75d2f24be85920d572fcb5b8#commitcomment-33533937
+ This is a follow-up to 6015cef which changed the behavior of setting
+ the SSL version so that the requested version would only be the minimum
+ and not the maximum. It appears it was (mostly) implemented in OpenSSL
+ but not other backends. In other words CURL_SSLVERSION_TLSv1_0 used to
+ mean use just TLS v1.0 and now it means use TLS v1.0 *or later*.
- Reported-by: Marcel Raad
- Closes #3886
-
-Steve Holme (16 May 2019)
-- http_ntlm_wb: Move the type-2 message processing into a dedicated function
+ - Fix CURL_SSLVERSION_MAX_DEFAULT for OpenSSL.
- This brings the code inline with the other HTTP authentication mechanisms.
+ Prior to this change CURL_SSLVERSION_MAX_DEFAULT with OpenSSL was
+ erroneously treated as always TLS 1.3, and would cause an error if
+ OpenSSL was built without TLS 1.3 support.
- Closes #3890
-
-Daniel Stenberg (15 May 2019)
-- RELEASE-NOTES: synced
+ Co-authored-by: Daniel Gustafsson
+
+ Fixes https://github.com/curl/curl/issues/2969
+ Closes https://github.com/curl/curl/pull/3012
-- docs/RELEASE-PROCEDURE: updated coming releases dates [ci skip]
+Daniel Stenberg (20 Sep 2018)
+- certs: generate tests certs with sha256 digest algorithm
+
+ As OpenSSL 1.1.1 starts to complain and fail on sha1 CAs:
+
+ "SSL certificate problem: CA signature digest algorithm too weak"
+
+ Closes #3014
-- CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [ci skip]
+- urlapi: document the error codes, remove two unused ones
- Reported-by: Roy Bellingan
- Bug: #3885
+ Assisted-by: Daniel Gustafsson
+ Closes #3019
-- parse_proxy: use the URL parser API
+- urlapi: add CURLU_GUESS_SCHEME and fix hostname acceptance
- As we treat a given proxy as a URL we should use the unified URL parser
- to extract the parts out of it.
+ In order for this API to fully work for libcurl itself, it now offers a
+ CURLU_GUESS_SCHEME flag that makes it "guess" scheme based on the host
+ name prefix just like libcurl always did. If there's no known prefix, it
+ will guess "http://".
- Closes #3878
-
-Steve Holme (15 May 2019)
-- http_negotiate: Move the Negotiate state out of the negotiatedata structure
+ Separately, it relaxes the check of the host name so that IDN host names
+ can be passed in as well.
- Given that this member variable is not used by the SASL based protocols
- there is no need to have it here.
+ Both these changes are necessary for libcurl itself to use this API.
- Closes #3882
+ Assisted-by: Daniel Gustafsson
+ Closes #3018
-- http_ntlm: Move the NTLM state out of the ntlmdata structure
+Kamil Dudka (19 Sep 2018)
+- nss: try to connect even if libnssckbi.so fails to load
- Given that this member variable is not used by the SASL based protocols
- there is no need to have it here.
-
-- url: Move the negotiate state type into a dedicated enum
-
-- url: Remove duplicate clean up of the winbind variables in conn_shutdown()
+ One can still use CA certificates stored in NSS database.
- Given that Curl_disconnect() calls Curl_http_auth_cleanup_ntlm() prior
- to calling conn_shutdown() and it in turn performs this, there is no
- need to perform the same action in conn_shutdown().
+ Reported-by: Maxime Legros
+ Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
- Closes #3881
+ Closes #3016
-Daniel Stenberg (14 May 2019)
-- urlapi: require a non-zero host name length when parsing URL
+Daniel Gustafsson (19 Sep 2018)
+- urlapi: don't set value which is never read
- Updated test 1560 to verify.
+ In the CURLUPART_URL case, there is no codepath which invokes url
+ decoding so remove the assignment of the urldecode variable. This
+ fixes the deadstore bug-report from clang static analysis.
- Closes #3880
+ Closes #3015
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- configure: error out if OpenSSL wasn't detected when asked for
+- todo: Update reference to already done item
- If --with-ssl is used and configure still couldn't enable SSL this
- creates an error instead of just silently ignoring the fact.
+ TODO item 1.1 was implemented in commit 946ce5b61f, update reference
+ to it with instead referencing the implemented option.
- Suggested-by: Isaiah Norton
- Fixes #3824
- Closes #3830
+ Closes #3013
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Daniel Gustafsson (14 May 2019)
-- imap: Fix typo in comment
+Daniel Stenberg (18 Sep 2018)
+- RELEASE-NOTES: synced
+
+- [slodki brought this change]
-Steve Holme (14 May 2019)
-- url: Remove unnecessary initialisation from allocate_conn()
+ cmake: don't require OpenSSL if USE_OPENSSL=OFF
- No need to set variables to zero as calloc() does this for us.
+ User must have OpenSSL installed even if not used by libcurl at all
+ since 7.61.1 release. Broken at
+ 7867aaa9a01decf93711428462335be8cef70212
- Closes #3879
+ Reviewed-by: Sergei Nikulov
+ Closes #3001
-Daniel Stenberg (14 May 2019)
-- CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [ci skip]
+- curl_multi_wait: call getsock before figuring out timeout
- Clues-provided-by: Jay Satiro
- Clues-provided-by: Jeroen Ooms
- Fixes #3711
- Closes #3874
-
-Daniel Gustafsson (13 May 2019)
-- vtls: fix potential ssl_buffer stack overflow
+ .... since getsock may update the expiry timer.
- In Curl_multissl_version() it was possible to overflow the passed in
- buffer if the generated version string exceeded the size of the buffer.
- Fix by inverting the logic, and also make sure to not exceed the local
- buffer during the string generation.
+ Fixes #2996
+ Closes #3000
+
+- examples/http2-pushinmemory: receive HTTP/2 pushed files in memory
- Closes #3863
- Reported-by: nevv on HackerOne/curl
- Reviewed-by: Jay Satiro
- Reviewed-by: Daniel Stenberg
+ Closes #3004
-Daniel Stenberg (13 May 2019)
-- RELEASE-NOTES: synced
+Daniel Gustafsson (18 Sep 2018)
+- darwinssl: Fix realloc memleak
+
+ The reallocation was using the input pointer for the return value, which
+ leads to a memory leak on reallication failure. Fix by instead use the
+ safe internal API call Curl_saferealloc().
+
+ Closes #3005
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Nick Zitzmann <nickzman@gmail.com>
-- appveyor: also build "/ci" branches like travis
+- [Kruzya brought this change]
-- pingpong: disable more when no pingpong enabled
+ examples: Fix memory leaks from realloc errors
+
+ Make sure to not overwrite the reallocated pointer in realloc() calls
+ to avoid a memleak on memory errors.
-- proxy: acknowledge DISABLE_PROXY more
+- memory: add missing curl_printf header
+
+ ftp_send_command() was using vsnprintf() without including the libcurl
+ *rintf() replacement header. Fix by including curl_printf.h and also
+ add curl_memory.h while at it since memdebug.h depends on it.
+
+ Closes #2999
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- parsedate: CURL_DISABLE_PARSEDATE
+Daniel Stenberg (16 Sep 2018)
+- [Si brought this change]
-- sasl: only enable if there's a protocol enabled using it
+ curl: update --tlsv* descriptions in --help output
+
+ Closes #2994
-- mime: acknowledge CURL_DISABLE_MIME
+- http: made Curl_add_buffer functions take a pointer-pointer
+
+ ... so that they can clear the original pointer on failure, which makes
+ the error-paths and their cleanups easier.
+
+ Closes #2992
-- wildcard: disable from build when FTP isn't present
+- http2: fix memory leaks on error-path
-- http: CURL_DISABLE_HTTP_AUTH
+- [Rikard Falkeborn brought this change]
-- base64: build conditionally if there are users
+ libtest: Add chkdecimalpoint to .gitignore
+
+ Closes #2998
-- doh: CURL_DISABLE_DOH
+Viktor Szakats (14 Sep 2018)
+- secure Openwall URLs
-Steve Holme (12 May 2019)
-- auth: Rename the various authentication clean up functions
+Daniel Stenberg (14 Sep 2018)
+- openssl: show "proper" version number for libressl builds
- For consistency and to a avoid confusion.
-
- Closes #3869
+ Closes #2989
-Daniel Stenberg (12 May 2019)
-- [Jay Satiro brought this change]
+- [Rainer Jung brought this change]
- docs/INSTALL: fix broken link [ci skip]
+ openssl: assume engine support in 0.9.8 or later
- Reported-by: Joombalaya on github
- Fixes #3818
+ Fixes #2983
+ Closes #2988
-Marcel Raad (12 May 2019)
-- easy: fix another "clarify calculation precedence" warning
+Daniel Gustafsson (13 Sep 2018)
+- sendf: use failf() rather than Curl_failf()
+
+ The failf() macro is the name used for invoking Curl_failf(). While
+ there isn't a way to turn off failf like there is for infof, but it's
+ still a good idea to use the macro.
- I missed this one in commit 6b3dde7fe62ea5a557fd1fd323fac2bcd0c2e9be.
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- build: fix "clarify calculation precedence" warnings
+- sendf: Fix whitespace in infof/failf concatenation
- Codacy/CppCheck warns about this. Consistently use parentheses as we
- already do in some places to silence the warning.
+ Strings broken on multiple rows in the .c file need to have appropriate
+ whitespace padding on either side of the concatenation point to render
+ a correct amalgamated string. Fix by adding a space at the occurrences
+ found.
- Closes https://github.com/curl/curl/pull/3866
+ Closes #2986
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- cmake: restore C89 compatibility of CurlTests.c
+- krb5: fix memory leak in krb_auth
- I broke it in d1b5cf830bfe169745721b21245d2217d2c2453e and
- 97de97daefc2ed084c91eff34af2426f2e55e134.
+ The FTP command allocated by aprintf() must be freed after usage.
- Reported-by: Viktor Szakats
- Ref: https://github.com/curl/curl/commit/97de97daefc2ed084c91eff34af2426f2e55e134#commitcomment-33499044
- Closes https://github.com/curl/curl/pull/3868
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Steve Holme (11 May 2019)
-- http_ntlm: Corrected the name of the include guard
+- ftp: include command in Curl_ftpsend sendbuffer
- Missed in f0bdd72c.
+ Commit 8238ba9c5f10414a88f502bf3f5d5a42d632984c inadvertently removed
+ the actual command to be sent from the send buffer in a refactoring.
+ Add back copying the command into the buffer. Also add more guards
+ against malformed input while at it.
- Closes #3867
+ Closes #2985
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- http_digest: Don't expose functions when HTTP and Crypto Auth are disabled
+- ntlm_wb: Fix memory leaks in ntlm_wb_response
+
+ When erroring out on a request being too large, the existing buffer was
+ leaked. Fix by explicitly freeing on the way out.
- Closes #3861
+ Closes #2966
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-- http_negotiate: Don't expose functions when HTTP is disabled
+Daniel Stenberg (13 Sep 2018)
+- [Yiming Jing brought this change]
-Daniel Stenberg (11 May 2019)
-- SECURITY-PROCESS: fix links [ci skip]
+ travis: build the MesaLink vtls backend with MesaLink 0.7.1
-Marcel Raad (11 May 2019)
-- CMake: suppress unused variable warnings
+- [Yiming Jing brought this change]
+
+ runtests.pl: run tests against the MesaLink vtls backend
+
+- [Yiming Jing brought this change]
+
+ vtls: add a MesaLink vtls backend
- I missed these in commit d1b5cf830bfe169745721b21245d2217d2c2453e.
+ Closes #2984
+
+- [Yiming Jing brought this change]
+
+ configure.ac: add a MesaLink vtls backend
+
+- [Dave Reisner brought this change]
-Daniel Stenberg (11 May 2019)
-- doh: disable DOH for the cases it doesn't work
+ curl_url_set.3: properly escape \n in example code
- Due to limitations in Curl_resolver_wait_resolv(), it doesn't work for
- DOH resolves. This fix disables DOH for those.
+ This yields
- Limitation added to KNOWN_BUGS.
+ "the scheme is %s\n"
- Fixes #3850
- Closes #3857
-
-Jay Satiro (11 May 2019)
-- checksrc.bat: Ignore snprintf warnings in docs/examples
+ instead of
- .. because we allow snprintf use in docs/examples.
+ "the scheme is %s0
- Closes https://github.com/curl/curl/pull/3862
+ Closes #2970
-Steve Holme (10 May 2019)
-- vauth: Fix incorrect function description for Curl_auth_user_contains_domain()
-
- ...and misalignment of these comments. From a78c61a4.
-
- Closes #3860
+- [Dave Reisner brought this change]
-Jay Satiro (10 May 2019)
-- Revert "multi: support verbose conncache closure handle"
-
- This reverts commit b0972bc.
-
- - No longer show verbose output for the conncache closure handle.
+ curl_url_set.3: fix typo in reference to CURLU_APPENDQUERY
+
+- urlglob: improve error message
- The offending commit was added so that the conncache closure handle
- would inherit verbose mode from the user's easy handle. (Note there is
- no way for the user to set options for the closure handle which is why
- that was necessary.) Other debug settings such as the debug function
- were not also inherited since we determined that could lead to crashes
- if the user's per-handle private data was used on an unexpected handle.
+ to help user understand what the problem is
- The reporter here says he has a debug function to capture the verbose
- output, and does not expect or want any output to stderr; however
- because the conncache closure handle does not inherit the debug function
- the verbose output for that handle does go to stderr.
+ Reported-by: Daniel Shahaf
- There are other plausible scenarios as well such as the user redirects
- stderr on their handle, which is also not inherited since it could lead
- to crashes when used on an unexpected handle.
+ Fixes #2763
+ Closes #2977
+
+- [Yiming Jing brought this change]
+
+ tests/certs: rebuild certs with 2048-bit RSA keys
- Short of allowing the user to set options for the conncache closure
- handle I don't think there's much we can safely do except no longer
- inherit the verbose setting.
+ The previous test certificates contained RSA keys of only 1024 bits.
+ However, RSA claims that 1024-bit RSA keys are likely to become
+ crackable some time before 2010. The NIST recommends at least 2048-bit
+ keys for RSA for now.
- Bug: https://curl.haxx.se/mail/lib-2019-05/0021.html
- Reported-by: Kristoffer Gleditsch
+ Better use full 2048 also for testing.
- Ref: https://github.com/curl/curl/pull/3598
- Ref: https://github.com/curl/curl/pull/3618
+ Closes #2973
+
+Daniel Gustafsson (12 Sep 2018)
+- TODO: fix typo in item
- Closes https://github.com/curl/curl/pull/3856
+ Closes #2968
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Steve Holme (10 May 2019)
-- ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup()
+Marcel Raad (12 Sep 2018)
+- anyauthput: fix compiler warning on 64-bit Windows
- From 6012fa5a.
+ On Windows, the read function from <io.h> is used, which has its byte
+ count parameter as unsigned int instead of size_t.
- Closes #3858
-
-Daniel Stenberg (9 May 2019)
-- BUG-BOUNTY: minor formatting fixes [ci skip]
-
-- RELEASE-NOTES: synced
+ Closes https://github.com/curl/curl/pull/2972
-- BUG-BOUNTY.md: add the Dropbox "bonus" extra payout ability [ci skip]
+Viktor Szakats (12 Sep 2018)
+- lib: fix gcc8 warning on Windows
- Closes #3839
+ Closes https://github.com/curl/curl/pull/2979
-Kamil Dudka (9 May 2019)
-- http_negotiate: do not treat failure of gss_init_sec_context() as fatal
+Jay Satiro (12 Sep 2018)
+- openssl: fix gcc8 warning
- Fixes #3726
- Closes #3849
+ - Use memcpy instead of strncpy to copy a string without termination,
+ since gcc8 warns about using strncpy to copy as many bytes from a
+ string as its length.
+
+ Suggested-by: Viktor Szakats
+
+ Closes https://github.com/curl/curl/issues/2980
-- spnego_gssapi: fix return code on gss_init_sec_context() failure
+Daniel Stenberg (10 Sep 2018)
+- libcurl-url.3: overview man page for the URL API
- Fixes #3726
- Closes #3849
+ Closes #2967
-Steve Holme (9 May 2019)
-- gen_resp_file.bat: Removed unnecessary @ from all but the first command
+- example/asiohiper: insert warning comment about its status
- There is need to use @ on every command once echo has been turned off.
+ This example is simply not working correctly but there's nobody around
+ with the skills and energy to fix it.
- Closes #3854
+ Closes #2407
-Jay Satiro (8 May 2019)
-- http: Ignore HTTP/2 prior knowledge setting for HTTP proxies
-
- - Do not switch to HTTP/2 for an HTTP proxy that is not tunnelling to
- the destination host.
+Kamil Dudka (10 Sep 2018)
+- docs/cmdline-opts: update the documentation of --tlsv1.0
- We already do something similar for HTTPS proxies by not sending h2. [1]
+ ... to reflect the changes in 6015cefb1b2cfde4b4850121c42405275e5e77d9
- Prior to this change setting CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE would
- incorrectly use HTTP/2 to talk to the proxy, which is not something we
- support (yet?). Also it's debatable whether or not that setting should
- apply to HTTP/2 proxies.
+ Closes #2955
+
+- docs/examples: do not wait when no transfers are running
- [1]: https://github.com/curl/curl/commit/17c5d05
+ Closes #2948
+
+Daniel Stenberg (10 Sep 2018)
+- [Daniel Gustafsson brought this change]
+
+ cookies: Move failure case label to end of function
- Bug: https://github.com/curl/curl/issues/3570
- Bug: https://github.com/curl/curl/issues/3832
+ Rather than jumping backwards to where failure cleanup happens
+ to be performed, move the failure case to end of the function
+ where it is expected per existing coding convention.
- Closes https://github.com/curl/curl/pull/3853
+ Closes #2965
+
+- [Daniel Gustafsson brought this change]
-Marcel Raad (8 May 2019)
-- travis: update mesalink build to xenial
+ misc: fix typos in comments
- Closes https://github.com/curl/curl/pull/3842
+ Closes #2963
-Daniel Stenberg (8 May 2019)
-- [Ricky Leverence brought this change]
+- [Daniel Gustafsson brought this change]
- OpenSSL: Report -fips in version if OpenSSL is built with FIPS
+ cookies: fix leak when writing cookies to file
- Older versions of OpenSSL report FIPS availabilty via an OPENSSL_FIPS
- define. It uses this define to determine whether to publish -fips at
- the end of the version displayed. Applications that utilize the version
- reported by OpenSSL will see a mismatch if they compare it to what curl
- reports, as curl is not modifying the version in the same way. This
- change simply adds a check to see if OPENSSL_FIPS is defined, and will
- alter the reported version to match what OpenSSL itself provides. This
- only appears to be applicable in versions of OpenSSL <1.1.1
+ If the formatting fails, we error out on a fatal error and
+ clean up on the way out. The array was however freed within
+ the wrong scope and was thus never freed in case the cookies
+ were written to a file instead of STDOUT.
- Closes #3771
+ Closes #2957
-Kamil Dudka (7 May 2019)
-- [Frank Gevaerts brought this change]
+- [Daniel Gustafsson brought this change]
- nss: allow fifos and character devices for certificates.
+ cookies: Remove redundant expired check
- Currently you can do things like --cert <(cat ./cert.crt) with (at least) the
- openssl backend, but that doesn't work for nss because is_file rejects fifos.
+ Expired cookies have already been purged at a later expiration time
+ before this check, so remove the redundant check.
- I don't actually know if this is sufficient, nss might do things internally
- (like seeking back) that make this not work, so actual testing is needed.
+ closes #2962
+
+- ntlm_wb: bail out if the response gets overly large
+
+ Exit the realloc() loop if the response turns out ridiculously large to
+ avoid worse problems.
- Closes #3807
+ Reported-by: Harry Sintonen
+ Closes #2959
+
+- [Daniel Gustafsson brought this change]
-Daniel Gustafsson (6 May 2019)
-- test2100: Fix typos in test description
+ url.c: fix comment typo and indentation
+
+ Closes #2960
-Daniel Stenberg (6 May 2019)
-- ssh: define USE_SSH if SSH is enabled (any backend)
+- urlapi: avoid derefencing a possible NULL pointer
- Closes #3846
+ Coverity CID 1439134
-Steve Holme (5 May 2019)
-- winbuild: Add our standard copyright header to the winbuild batch files
+- RELEASE-NOTES: synced
-- makedebug: Fix ERRORLEVEL detection after running where.exe
+Marcel Raad (8 Sep 2018)
+- test324: fix after 3f3b26d6feb0667714902e836af608094235fca2
- Closes #3838
+ The expected error code is now 60. 51 is dead.
-Daniel Stenberg (5 May 2019)
-- urlapi: add CURLUPART_ZONEID to set and get
+Daniel Stenberg (8 Sep 2018)
+- curl_url_set.3: correct description
+
+- curl_url-docs: fix AVAILABILITY as Added in curl 7.62.0
+
+- URL-API
+
+ See header file and man pages for API. All documented API details work
+ and are tested in the 1560 test case.
- The zoneid can be used with IPv6 numerical addresses.
+ Closes #2842
+
+- curl_easy_upkeep: removed 'conn' from the name
- Updated test 1560 to verify.
+ ... including the associated option.
- Closes #3834
+ Fixes #2951
+ Closes #2952
-- [Taiyu Len brought this change]
+- [Max Dymond brought this change]
- WRITEFUNCTION: add missing set_in_callback around callback
+ upkeep: add a connection upkeep API: curl_easy_conn_upkeep()
+
+ Add functionality so that protocols can do custom keepalive on their
+ connections, when an external API function is called.
+
+ Add docs for the new options in 7.62.0
- Closes #3837
+ Closes #1641
-- RELEASE-NOTES: synced
+- [Philipp Waehnert brought this change]
-- CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [ci skip]
+ configure: add option to disable automatic OpenSSL config loading
+
+ Sometimes it may be considered a security risk to load an external
+ OpenSSL configuration automatically inside curl_global_init(). The
+ configuration option --disable-ssl-auto-load-config disables this
+ automatism. The Windows build scripts winbuild/Makefile.vs provide a
+ corresponding option ENABLE_SSL_AUTO_LOAD_CONFIG accepting a boolean
+ value.
- Reported-by: Ricardo Gomes
+ Setting neither of these options corresponds to the previous behavior
+ loading the external OpenSSL configuration automatically.
- Bug: #3537
- Closes #3836
+ Fixes #2724
+ Closes #2791
-- CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value
+- doh: minor edits to please Coverity
- The time field in the curl_fileinfo struct will always be zero. No code
- was ever implemented to actually convert the date string to a time_t.
+ The gcc typecheck macros and coverity combined made it warn on the 2nd
+ argument for ERROR_CHECK_SETOPT(). Here's minor rearrange to please it.
- Fixes #3829
- Closes #3835
-
-- OS400/ccsidcurl.c: code style fixes
+ Coverity CID 1439115 and CID 1439114.
-- OS400/ccsidcurl: replace use of Curl_vsetopt
+- schannel: avoid switch-cases that go to default anyway
- (and make the code style comply)
+ SEC_E_APPLICATION_PROTOCOL_MISMATCH isn't defined in some versions of
+ mingw and would require an ifdef otherwise.
- Fixes #3833
+ Reported-by: Thomas Glanzmann
+ Approved-by: Marc Hörsken
+ Bug: https://curl.haxx.se/mail/lib-2018-09/0020.html
+ Closes #2950
-- urlapi: strip off scope id from numerical IPv6 addresses
+- [Nicklas Avén brought this change]
+
+ imap: change from "FETCH" to "UID FETCH"
- ... to make the host name "usable". Store the scope id and put it back
- when extracting a URL out of it.
+ ... and add "MAILINDEX".
- Also makes curl_url_set() syntax check CURLUPART_HOST.
+ As described in #2789, this is a suggested solution. Changing UID=xx to
+ actually get mail with UID xx and add "MAILINDEX" to get a mail with a
+ special index in the mail box (old behavior). So MAILINDEX=1 gives the
+ first non deleted mail in the mail box.
- Fixes #3817
- Closes #3822
-
-- RELEASE-NOTES: synced
+ Fixes #2789
+ Closes #2815
-- multiif.h: remove unused protos
+- CURLOPT_UPLOAD_BUFFERSIZE: set upload buffer size
- ... for functions related to pipelining. Those functions were removed in
- 2f44e94efb3df.
+ This is step 3 of #2888.
- Closes #3828
+ Fixes #2888
+ Closes #2896
-- [Yiming Jing brought this change]
+- travis: add the DOH tests to the torture testing
- travis: mesalink: temporarily disable test 3001
-
- ... due to SHA-1 signatures in test certs
+- DOH: add test case 1650 and 2100
-- [Yiming Jing brought this change]
+- curl: --doh-url added
- travis: upgrade the MesaLink TLS backend to v1.0.0
+- setopt: add CURLOPT_DOH_URL
- Closes #3823
- Closes #3776
+ Closes #2668
-- ConnectionExists: improve non-multiplexing use case
+- [Han Han brought this change]
+
+ ssl: deprecate CURLE_SSL_CACERT in favour of a unified error code
- - better log output
+ Long live CURLE_PEER_FAILED_VERIFICATION
+
+- [Han Han brought this change]
+
+ x509asn1: return CURLE_PEER_FAILED_VERIFICATION on failure to parse cert
- - make sure multiplex is enabled for it to be used
+ CURLE_PEER_FAILED_VERIFICATION makes more sense because Curl_parseX509
+ does not allocate memory internally as its first argument is a pointer
+ to the certificate structure. The same error code is also returned by
+ Curl_verifyhost when its call to Curl_parseX509 fails so the change
+ makes error handling more consistent.
-- multi: provide Curl_multiuse_state to update information
+- [Han Han brought this change]
+
+ openssl: return CURLE_PEER_FAILED_VERIFICATION on failure to parse issuer
- As soon as a TLS backend gets ALPN conformation about the specific HTTP
- version it can now set the multiplex situation for the "bundle" and
- trigger moving potentially queued up transfers to the CONNECT state.
+ Failure to extract the issuer name from the server certificate should
+ return a more specific error code like on other TLS backends.
+
+- [Han Han brought this change]
-- process_pending_handles: mark queued transfers as previously pending
+ schannel: unified error code handling
- With transfers being queued up, we only move one at a a time back to the
- CONNECT state but now we mark moved transfers so that when a moved
- transfer is confirmed "successful" (it connected) it will trigger the
- move of another pending transfer. Previously, it would otherwise wait
- until the transfer was done before doing this. This makes queued up
- pending transfers get processed (much) faster.
+ Closes #2901
+
+- [Han Han brought this change]
-- http: mark bundle as not for multiuse on < HTTP/2 response
+ darwinssl: more specific and unified error codes
- Fixes #3813
- Closes #3815
+ Closes #2901
-Daniel Gustafsson (1 May 2019)
-- cookie: Guard against possible NULL ptr deref
+- CURLOPT_DNS_USE_GLOBAL_CACHE: deprecated
- In case the name pointer isn't set (due to memory pressure most likely)
- we need to skip the prefix matching and reject with a badcookie to avoid
- a possible NULL pointer dereference.
+ Disable the CURLOPT_DNS_USE_GLOBAL_CACHE option and mark it for
+ deprecation and complete removal in six months.
- Closes #3820 #3821
- Reported-by: Jonathan Moerman
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Bug: https://curl.haxx.se/mail/lib-2018-09/0010.html
+ Closes #2942
-Patrick Monnerat (30 Apr 2019)
-- os400: Add CURLOPT_MAXAGE_CONN to ILE/RPG bindings
+- url: default to CURL_HTTP_VERSION_2TLS if built h2-enabled
+
+ Closes #2709
-Kamil Dudka (29 Apr 2019)
-- nss: provide more specific error messages on failed init
+- multiplex: enable by default
- Closes #3808
+ Starting 7.62.0, multiplexing is enabled by default in multi handles.
-Daniel Stenberg (29 Apr 2019)
-- [Reed Loden brought this change]
+- [Jim Fuller brought this change]
- docs: minor polish to the bug bounty / security docs
+ tests: add unit tests for url.c
- Closes #3811
+ Approved-by: Daniel Gustafsson
+ Closes #2937
-- CURL_MAX_INPUT_LENGTH: largest acceptable string input size
+- test1452: mark as flaky
+
+ makes it not run in the CI builds
- This limits all accepted input strings passed to libcurl to be less than
- CURL_MAX_INPUT_LENGTH (8000000) bytes, for these API calls:
- curl_easy_setopt() and curl_url_set().
+ Closes #2941
+
+- pipelining: deprecated
- The 8000000 number is arbitrary picked and is meant to detect mistakes
- or abuse, not to limit actual practical use cases. By limiting the
- acceptable string lengths we also reduce the risk of integer overflows
- all over.
+ Transparently. The related curl_multi_setopt() options all still returns
+ OK when pipelining is selected.
- NOTE: This does not apply to `CURLOPT_POSTFIELDS`.
+ To re-enable the support, the single line change in lib/multi.c needs to
+ be reverted.
- Test 1559 verifies.
+ See docs/DEPRECATE.md
- Closes #3805
+ Closes #2705
-- [Tseng Jun brought this change]
+- RELEASE-NOTES: start working on 7.62.0
- curlver.h: use parenthesis in CURL_VERSION_BITS macro
-
- Closes #3809
+Version 7.61.1 (4 Sep 2018)
+
+Daniel Stenberg (4 Sep 2018)
+- THANKS: 7.61.1 status
-Marcel Raad (27 Apr 2019)
-- [Simon Warta brought this change]
+- RELEASE-NOTES: 7.61.1
- cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP
+- Curl_getoff_all_pipelines: ignore unused return values
- Closes https://github.com/curl/curl/pull/3769
+ Since scan-build would warn on the dead "Dead store/Dead increment"
-Steve Holme (23 Apr 2019)
-- ntlm: Missed pre-processor || (or) during rebase for cd15acd0
+Viktor Szakats (4 Sep 2018)
+- sftp: fix indentation
-- ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4
-
- Just like we do for mbed TLS, use our local implementation of MD4 when
- OpenSSL doesn't support it. This allows a type-3 message to include the
- NT response.
+Daniel Stenberg (4 Sep 2018)
+- [Przemysław Tomaszewski brought this change]
-Daniel Gustafsson (23 Apr 2019)
-- INTERNALS: fix misindentation of ToC item
+ sftp: don't send post-qoute sequence when retrying a connection
- Kerberos was incorrectly indented as a subsection under FTP, which is
- incorrect as they are both top level sections. A fix for this was first
- attempted in commit fef38a0898322f285401c5ff2f5e7c90dbf3be63 but that
- was a few paddles short of being complete.
-
-- [Aron Bergman brought this change]
+ Fixes #2939
+ Closes #2940
- INTERNALS: Add structs to ToC
+Kamil Dudka (3 Sep 2018)
+- url, vtls: make CURLOPT{,_PROXY}_TLS13_CIPHERS work
- Add the subsections under "Structs in libcurl" to the table of contents.
+ This is a follow-up to PR #2607 and PR #2926.
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Closes #2936
-- [Aron Bergman brought this change]
+Daniel Stenberg (3 Sep 2018)
+- [Jay Satiro brought this change]
- INTERNALS: Add code highlighting
+ tool_operate: Add http code 408 to transient list for --retry
- Make all struct members under the Curl_handler section
- print in monospace font.
+ - Treat 408 request timeout as transient so that curl will retry the
+ request if --retry was used.
- Closes #3801
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Closes #2925
-Daniel Stenberg (22 Apr 2019)
-- docs/BUG-BOUNTY: bug bounty time [skip ci]
-
- Introducing the curl bug bounty program on hackerone. We now recommend
- filing security issues directly in the hackerone ticket system which
- only is readable to curl security team members.
+- [Jay Satiro brought this change]
+
+ openssl: Fix setting TLS 1.3 cipher suites
- Assisted-by: Daniel Gustafsson
+ The flag indicating TLS 1.3 cipher support in the OpenSSL backend was
+ missing.
- Closes #3488
-
-Steve Holme (22 Apr 2019)
-- sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616
+ Bug: https://github.com/curl/curl/pull/2607#issuecomment-417283187
+ Reported-by: Kamil Dudka
- RFC 4616 specifies the authzid is optional in the client authentication
- message and that the server will derive the authorisation identity
- (authzid) from the authentication identity (authcid) when not specified
- by the client.
+ Closes #2926
-Jay Satiro (22 Apr 2019)
-- [Gisle Vanem brought this change]
-
- memdebug: fix variable name
+- Curl_ntlm_core_mk_nt_hash: return error on too long password
- Follow-up to 76b6348 which renamed logfile as curl_dbg_logfile.
+ ... since it would cause an integer overflow if longer than (max size_t
+ / 2).
- Ref: https://github.com/curl/curl/commit/76b6348#r33259088
-
-Steve Holme (21 Apr 2019)
-- vauth/cleartext: Don't send the authzid if it is empty
+ This is CVE-2018-14618
- Follow up to 762a292f.
+ Bug: https://curl.haxx.se/docs/CVE-2018-14618.html
+ Closes #2756
+ Reported-by: Zhaoyang Wu
-Daniel Stenberg (21 Apr 2019)
-- test 196,197,198: add 'retry' keyword [skip ci]
+- [Rikard Falkeborn brought this change]
-- RELEASE-NOTES: synced
+ http2: Use correct format identifier for stream_id
+
+ Closes #2928
-- CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse
+Marcel Raad (2 Sep 2018)
+- test1148: fix precheck output
- ... and disconnect too old ones instead of trying to reuse.
+ "precheck command error" is not very helpful.
+
+Daniel Stenberg (1 Sep 2018)
+- all: s/int/size_t cleanup
- Default max age is set to 118 seconds.
+ Assisted-by: Rikard Falkeborn
- Ref: #3722
- Closes #3782
+ Closes #2922
-Daniel Gustafsson (20 Apr 2019)
-- [Po-Chuan Hsieh brought this change]
+- ssh-libssh: use FALLTHROUGH to silence gcc8
- altsvc: Fix building with cookies disables
-
- ALTSVC requires Curl_get_line which is defined in lib/cookie.c inside a #if
- check of HTTP and COOKIES. That makes Curl_get_line undefined if COOKIES is
- disabled. Fix by splitting out the function into a separate file which can
- be included where needed.
-
- Closes #3717
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
- Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+Jay Satiro (31 Aug 2018)
+- tool_operate: Fix setting proxy TLS 1.3 ciphers
-Daniel Stenberg (20 Apr 2019)
-- test1002: correct the name [skip ci]
+Daniel Stenberg (31 Aug 2018)
+- [Daniel Gustafsson brought this change]
-- test660: verify CONNECT_ONLY with IMAP
+ cookies: support creation-time attribute for cookies
- which basically just makes sure LOGOUT is *not* issued on disconnect
+ According to RFC6265 section 5.4, cookies with equal path lengths
+ SHOULD be sorted by creation-time (earlier first). This adds a
+ creation-time record to the cookie struct in order to make cookie
+ sorting more deterministic. The creation-time is defined as the
+ order of the cookies in the jar, the first cookie read fro the
+ jar being the oldest. The creation-time is thus not serialized
+ into the jar. Also remove the strcmp() matching in the sorting as
+ there is no lexicographic ordering in RFC6265. Existing tests are
+ updated to match.
+
+ Closes #2524
-- Curl_disconnect: treat all CONNECT_ONLY connections as "dead"
+Marcel Raad (31 Aug 2018)
+- Don't use Windows path %PWD for SSH tests
- Since the connection has been used by the "outside" we don't know the
- state of it anymore and curl should not use it anymore.
+ All these tests failed on Windows because something like
+ sftp://%HOSTIP:%SSHPORT%PWD/
+ expanded to
+ sftp://127.0.0.1:1234c:/msys64/home/bla/curl
+ and then curl complained about the port number ending with a letter.
- Bug: https://curl.haxx.se/mail/lib-2019-04/0052.html
+ Use the original POSIX path instead of the Windows path created in
+ checksystem to fix this.
- Closes #3795
+ Closes https://github.com/curl/curl/pull/2920
-- multi: fix the statenames (follow-up fix from 2f44e94efb3df8e)
+Jay Satiro (29 Aug 2018)
+- CURLOPT_SSL_CTX_FUNCTION.3: clarify connection reuse warning
- The list of names must be in sync with the defined states in the header
- file!
-
-Steve Holme (16 Apr 2019)
-- openvms: Remove pre-processors for Windows as VMS cannot support them
-
-- openvms: Remove pre-processor for SecureTransport as VMS cannot support it
+ Reported-by: Daniel Stenberg
- Fixes #3768
- Closes #3785
+ Closes https://github.com/curl/curl/issues/2916
-Jay Satiro (16 Apr 2019)
-- TODO: Add issue link to an existing entry
+Daniel Stenberg (28 Aug 2018)
+- THANKS-filter: dedup Daniel Jeliński
-Daniel Stenberg (16 Apr 2019)
- RELEASE-NOTES: synced
-Jay Satiro (16 Apr 2019)
-- tool_help: Warn if curl and libcurl versions do not match
-
- .. because functionality may be affected if the versions differ.
+- CURLOPT_ACCEPT_ENCODING.3: list them comma-separated [ci skip]
+
+- CURLOPT_SSL_CTX_FUNCTION.3: might cause unintended connection reuse [ci skip]
- This commit implements TODO 18.7 "warning if curl version is not in sync
- with libcurl version".
+ Added a warning!
- Ref: https://github.com/curl/curl/blob/curl-7_64_1/docs/TODO#L1028-L1033
+ Closes #2915
+
+- curl: fix time-of-check, time-of-use race in dir creation
- Closes https://github.com/curl/curl/pull/3774
+ Patch-by: Jay Satiro
+ Detected by Coverity
+ Fixes #2739
+ Closes #2912
-Steve Holme (16 Apr 2019)
-- md5: Update the function signature following d84da52d
+- cmdline-opts/page-footer: fix edit mistake
+
+ There was a missing newline.
+
+ follow-up to a7ba60bb7250
-- md5: Forgot to update the code alignment in d84da52d
+- docs: clarify NO_PROXY env variable functionality
+
+ Reported-by: Kirill Marchuk
+ Fixes #2773
+ Closes #2911
-- md5: Return CURLcode from the internally accessible functions
+Marcel Raad (24 Aug 2018)
+- lib1522: fix curl_easy_setopt argument type
- Following 28f826b3 to return CURLE_OK instead of numeric 0.
+ CURLOPT_POSTFIELDSIZE is a long option.
-Daniel Gustafsson (15 Apr 2019)
-- tests: Run global cleanup at end of tests
+- curl_threads: silence bad-function-cast warning
- Make sure to run curl_global_cleanup() when shutting down the test
- suite to release any resources allocated in the SSL setup. This is
- clearly visible when running tests with PolarSSL where the thread
- lock calloc() memory which isn't released when not running cleanup.
- Below is an excerpt from the autobuild logs:
+ As uintptr_t and HANDLE are always the same size, this warning is
+ harmless. Just silence it using an intermediate uintptr_t variable.
- ==12368== 96 bytes in 1 blocks are possibly lost in loss record 1 of 2
- ==12368== at 0x4837B65: calloc (vg_replace_malloc.c:752)
- ==12368== by 0x11A76E: curl_dbg_calloc (memdebug.c:205)
- ==12368== by 0x145CDF: Curl_polarsslthreadlock_thread_setup
- (polarssl_threadlock.c:54)
- ==12368== by 0x145B37: Curl_polarssl_init (polarssl.c:865)
- ==12368== by 0x14129D: Curl_ssl_init (vtls.c:171)
- ==12368== by 0x118B4C: global_init (easy.c:158)
- ==12368== by 0x118BF5: curl_global_init (easy.c:221)
- ==12368== by 0x118D0B: curl_easy_init (easy.c:299)
- ==12368== by 0x114E96: test (lib1906.c:32)
- ==12368== by 0x115495: main (first.c:174)
+ Closes https://github.com/curl/curl/pull/2908
+
+Daniel Stenberg (24 Aug 2018)
+- README: add appveyor build badge [ci skip]
- Closes #3783
- Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #2913
+
+- [Ihor Karpenko brought this change]
-Marcel Raad (15 Apr 2019)
-- travis: use mbedtls from Xenial
+ schannel: client certificate store opening fix
- No need to build it from source anymore.
+ 1) Using CERT_STORE_OPEN_EXISTING_FLAG ( or CERT_STORE_READONLY_FLAG )
+ while opening certificate store would be sufficient in this scenario and
+ less-demanding in sense of required user credentials ( for example,
+ IIS_IUSRS will get "Access Denied" 0x05 error for existing CertOpenStore
+ call without any of flags mentioned above ),
- Closes https://github.com/curl/curl/pull/3779
-
-- travis: use libpsl from Xenial
+ 2) as 'cert_store_name' is a DWORD, attempt to format its value like a
+ string ( in "Failed to open cert store" error message ) will throw null
+ pointer exception
- This makes building libpsl and libidn2 from source unnecessary and
- removes the need for the autopoint and libunistring-dev packages.
+ 3) adding GetLastError(), in my opinion, will make error message more
+ useful.
- Closes https://github.com/curl/curl/pull/3779
+ Bug: https://curl.haxx.se/mail/lib-2018-08/0198.html
+
+ Closes #2909
+
+- [Leonardo Taccari brought this change]
-Daniel Stenberg (15 Apr 2019)
-- runtests: start socksd like other servers
+ gopher: Do not translate `?' to `%09'
- ... without a $srcdir prefix. Triggered by the failures in several
- autobuilds.
+ Since GOPHER support was added in curl `?' character was automatically
+ translated to `%09' (`\t').
- Closes #3781
+ However, this behaviour does not seems documented in RFC 4266 and for
+ search selectors it is documented to directly use `%09' in the URL.
+ Apart that several gopher servers in the current gopherspace have CGI
+ support where `?' is used as part of the selector and translating it to
+ `%09' often leads to surprising results.
+
+ Closes #2910
-Daniel Gustafsson (14 Apr 2019)
-- socksd: Fix typos
+Marcel Raad (23 Aug 2018)
+- cookie tests: treat files as text
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Fixes test failures because of wrong line endings on Windows.
-- socksd: Properly decorate static variables
+Daniel Stenberg (23 Aug 2018)
+- libcurl-thread.3: expand somewhat on the NO_SIGNAL motivation
- Mark global variables static to avoid compiler warning in Clang when
- using -Wmissing-variable-declarations.
+ Multi-threaded applictions basically MUST set CURLOPT_NO_SIGNAL to 1L to
+ avoid the risk of getting a SIGPIPE.
- Closes #3778
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Steve Holme (14 Apr 2019)
-- md(4|5): Fixed indentation oddities with the importation of replacement code
+ Either way, a multi-threaded application that uses libcurl/openssl needs
+ to have a signhandler for or ignore SIGPIPE on its own.
- The indentation from 211d5329 and 57d6d253 was a little strange as
- parts didn't align correctly, uses 4 spaces rather than 2. Checked
- the indentation of the original source so it aligns, albeit, using
- curl style.
+ Based on discussions in #2800
+ Closes #2904
-- md5: Code style to return CURLE_OK rather than numeric 0
+- RELEASE-NOTES: synced
-- md5: Corrected code style for some pointer arguments
+Marcel Raad (22 Aug 2018)
+- Tests: fixes for Windows
+
+ - test 1268 requires unix sockets
+ - test 2072 must be disabled also for MSYS/MinGW
-Marcel Raad (13 Apr 2019)
-- travis: update some builds to xenial
+Daniel Stenberg (22 Aug 2018)
+- http2: abort the send_callback if not setup yet
- Xenial comes with more up-to-date software versions and more available
- packages, some of which we currently build from source. Unfortunately,
- some builds would fail with Xenial because of assertion failures in
- Valgrind when using OpenSSL, so leave these at Trusty.
+ When Curl_http2_done() gets called before the http2 data is setup all
+ the way, we cannot send anything and this should just return an error.
- Closes https://github.com/curl/curl/pull/3777
+ Detected by OSS-Fuzz
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10012
-Daniel Stenberg (13 Apr 2019)
-- test: make tests and test scripts use socksd for SOCKS
+- http2: remove four unused nghttp2 callbacks
- Make all SOCKS tests use socksd instead of ssh.
+ Closes #2903
-- socksd: new SOCKS 4+5 server for tests
+- x509asn1: use FALLTHROUGH
- Closes #3752
+ ... as no other comments are accepted since 014ed7c22f51463
-- singleipconnect: show port in the verbose "Trying ..." message
+Marcel Raad (21 Aug 2018)
+- test1148: disable if decimal separator is not point
- To aid debugging better.
-
-- [tmilburn brought this change]
+ Modifying the locale with environment variables doesn't work for native
+ Windows applications. Just disable the test in this case if the decimal
+ separator is something different than a point. Use a precheck with a
+ small C program to achieve that.
+
+ Closes https://github.com/curl/curl/pull/2786
- CURLOPT_ADDRESS_SCOPE: fix range check and more
+- Enable more GCC warnings
+
+ This enables the following additional warnings:
+ -Wold-style-definition
+ -Warray-bounds=2 instead of the default 1
+ -Wformat=2, but only for GCC 4.8+ as Wno-format-nonliteral is not
+ respected for older versions
+ -Wunused-const-variable, which enables level 2 instead of the default 1
+ -Warray-bounds also in debug mode through -ftree-vrp
+ -Wnull-dereference also in debug mode through
+ -fdelete-null-pointer-checks
- Commit 9081014 fixed most of the confusing issues between scope id and
- scope however 844896d added bad limits checking assuming that the scope
- is being set and not the scope id.
+ Closes https://github.com/curl/curl/pull/2747
+
+- curl-compilers: enable -Wimplicit-fallthrough=4 for GCC
- I have fixed the documentation so it all refers to scope ids.
+ This enables level 4 instead of the default level 3, which of the
+ currently used comments only allows /* FALLTHROUGH */ to silence the
+ warning.
- In addition Curl_if2ip refered to the scope id as remote_scope_id which
- is incorrect, so I renamed it to local_scope_id.
+ Closes https://github.com/curl/curl/pull/2747
+
+- curl-compilers: enable -Wbad-function-cast on GCC
- Adjusted-by: Daniel Stenberg
+ This warning used to be enabled only for clang as it's a bit stricter
+ on GCC. Silence the remaining occurrences and enable it on GCC too.
- Closes #3655
- Closes #3765
- Fixes #3713
+ Closes https://github.com/curl/curl/pull/2747
-- urlapi: stricter CURLUPART_PORT parsing
+- configure: conditionally enable pedantic-errors
- Only allow well formed decimal numbers in the input.
+ Enable pedantic-errors for GCC >= 5 with --enable-werror. Before GCC 5,
+ pedantic-errors was synonymous to -Werror=pedantic [0], which is still
+ the case for clang [1]. With GCC 5, it became complementary [2].
- Document that the number MUST be between 1 and 65535.
+ Also fix a resulting error in acinclude.m4 as main's return type was
+ missing, which is illegal in C99.
- Add tests to test 1560 to verify the above.
+ [0] https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Warning-Options.html
+ [1] https://clang.llvm.org/docs/UsersManual.html#options-to-control-error-and-warning-messages
+ [2] https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Warning-Options.html
- Ref: https://github.com/curl/curl/issues/3753
- Closes #3762
-
-Jay Satiro (13 Apr 2019)
-- [Jan Ehrhardt brought this change]
+ Closes https://github.com/curl/curl/pull/2747
- winbuild: Support MultiSSL builds
+- Remove unused definitions
- - Remove the lines in winbuild/Makefile.vc that generate an error with
- multiple SSL backends.
+ Closes https://github.com/curl/curl/pull/2747
+
+Daniel Stenberg (21 Aug 2018)
+- x509asn1: make several functions static
- - Add /DCURL_WITH_MULTI_SSL in winbuild/MakefileBuild.vc if multiple SSL
- backends are set.
+ and remove the private SIZE_T_MAX define and use the generic one.
- Closes https://github.com/curl/curl/pull/3772
+ Closes #2902
-Daniel Stenberg (12 Apr 2019)
-- travis: remove mesalink builds (temporarily?)
+- INTERNALS: require GnuTLS >= 2.11.3
- Since the mesalink build started to fail on travis, even though we build
- a fixed release version, we disable it to prevent it from blocking
- progress.
+ Since the public pinning support was brought in e644866caf4. GnuTLS
+ 2.11.3 was released in October 2010.
- Closes #3767
+ Figured out in #2890
-- openssl: mark connection for close on TLS close_notify
+- http2: avoid set_stream_user_data() before stream is assigned
+
+ ... before the stream is started, we have it set to -1.
- Without this, detecting and avoid reusing a closed TLS connection
- (without a previous GOAWAY) when doing HTTP/2 is tricky.
+ Fixes #2894
+ Closes #2898
+
+- SSLCERTS: improve the openssl command line
- Reported-by: Tom van der Woerdt
- Fixes #3750
- Closes #3763
+ ... for extracting certs from a live HTTPS server to make a cacerts.pem
+ from them.
+
+- docs/SECURITY-PROCESS: now we name the files after the CVE id
- RELEASE-NOTES: synced
-Steve Holme (11 Apr 2019)
-- vauth/cleartext: Update the PLAIN login function signature to match RFC 4616
+- upload: change default UPLOAD_BUFSIZE to 64KB
- Functionally this doesn't change anything as we still use the username
- for both the authorisation identity and the authentication identity.
+ To make uploads significantly faster in some circumstances.
- Closes #3757
+ Part 2 of #2888
+ Closes #2892
-Daniel Stenberg (11 Apr 2019)
-- test1906: verify CURLOPT_CURLU + CURLOPT_PORT usage
+- upload: allocate upload buffer on-demand
- Based-on-code-by: Poul T Lomholt
-
-- url: always clone the CUROPT_CURLU handle
+ Saves 16KB on the easy handle for operations that don't need that
+ buffer.
- Since a few code paths actually update that data.
+ Part 1 of #2888
+
+- [Laurent Bonnans brought this change]
+
+ vtls: reinstantiate engine on duplicated handles
- Fixes #3753
- Closes #3761
+ Handles created with curl_easy_duphandle do not use the SSL engine set
+ up in the original handle. This fixes the issue by storing the engine
+ name in the internal url state and setting the engine from its name
+ inside curl_easy_duphandle.
- Reported-by: Poul T Lomholt
+ Reported-by: Anton Gerasimov
+ Signed-of-by: Laurent Bonnans
+ Fixes #2829
+ Closes #2833
-- CURLOPT_DNS_USE_GLOBAL_CACHE: remove
+- http2: make sure to send after RST_STREAM
- Remove the code too. The functionality has been disabled in code since
- 7.62.0. Setting this option will from now on simply be ignored and have
- no function.
+ If this is the last stream on this connection, the RST_STREAM might not
+ get pushed to the wire otherwise.
- Closes #3654
+ Fixes #2882
+ Closes #2887
+ Researched-by: Michael Kaufmann
-Marcel Raad (11 Apr 2019)
-- travis: install libgnutls28-dev only for --with-gnutls build
+- test1268: check the stderr output as "text"
- Reduces the time needed for the other jobs a little.
+ Follow-up to 099f37e9c57
- Closes https://github.com/curl/curl/pull/3721
+ Pointed-out-by: Marcel Raad
-- travis: install libnss3-dev only for --with-nss build
+- urldata: remove unused pipe_broke struct field
- Reduces the time needed for the other jobs a little.
+ This struct field is never set TRUE in any existing code path. This
+ change removes the field completely.
- Closes https://github.com/curl/curl/pull/3721
+ Closes #2871
-- travis: install libssh2-dev only for --with-libssh2 build
+- curl: warn the user if a given file name looks like an option
+
+ ... simply because this is usually a sign of the user having omitted the
+ file name and the next option is instead "eaten" by the parser as a file
+ name.
- Reduces the time needed for the other jobs a little.
+ Add test1268 to verify
- Closes https://github.com/curl/curl/pull/3721
+ Closes #2885
-- travis: install libssh-dev only for --with-libssh build
+- http2: check nghttp2_session_set_stream_user_data return code
- Reduces the time needed for the other jobs a little.
+ Might help bug #2688 debugging
- Closes https://github.com/curl/curl/pull/3721
+ Closes #2880
-- travis: install krb5-user only for --with-gssapi build
+- travis: revert back to gcc-7 for coverage builds
- Reduces the time needed for the other jobs a little.
+ ... since the gcc-8 ones seem to fail frequently.
- Closes https://github.com/curl/curl/pull/3721
-
-- travis: install lcov only for the coverage job
+ Follow-up from b85207199544ca
- Reduces the time needed for the other jobs a little.
+ Closes #2886
+
+- RELEASE-NOTES: synced
- Closes https://github.com/curl/curl/pull/3721
+ ... and now listed in alphabetical order!
+
+- [Adrien brought this change]
-- travis: install clang only when needed
+ CMake: CMake config files are defining CURL_STATICLIB for static builds
- This reduces the GCC job runtimes a little and it's needed to
- selectively update clang builds to xenial.
+ This change allows to use the CMake config files generated by Curl's
+ CMake scripts for static builds of the library.
+ The symbol CURL_STATIC lib must be defined to compile downstream,
+ thus the config package is the perfect place to do so.
- Closes https://github.com/curl/curl/pull/3721
+ Fixes #2817
+ Closes #2823
+ Reported-by: adnn on github
+ Reviewed-by: Sergei Nikulov
-- AppVeyor: enable testing for WinSSL build
-
- Closes https://github.com/curl/curl/pull/3725
+- TODO: host name sections in config files
-- build: fix Codacy/CppCheck warnings
+Kamil Dudka (14 Aug 2018)
+- ssh-libssh: fix infinite connect loop on invalid private key
- - remove unused variables
- - declare conditionally used variables conditionally
- - suppress unused variable warnings in the CMake tests
- - remove dead variable stores
- - consistently use WIN32 macro to detect Windows
+ Added test 656 (based on test 604) to verify the fix.
- Closes https://github.com/curl/curl/pull/3739
-
-- polarssl_threadlock: remove conditionally unused code
+ Bug: https://bugzilla.redhat.com/1595135
- Make functions no-ops if neither both USE_THREADS_POSIX and
- HAVE_PTHREAD_H nor both USE_THREADS_WIN32 and HAVE_PROCESS_H are
- defined. Previously, if only one of them was defined, there was either
- code compiled that did nothing useful or the wrong header included for
- the functions used.
+ Closes #2879
+
+- ssh-libssh: reduce excessive verbose output about pubkey auth
- Also, move POLARSSL_MUTEX_T define to implementation file as it's not
- used externally.
+ The verbose message "Authentication using SSH public key file" was
+ printed each time the ssh_userauth_publickey_auto() was called, which
+ meant each time a packet was transferred over network because the API
+ operates in non-blocking mode.
- Closes https://github.com/curl/curl/pull/3739
+ This patch makes sure that the verbose message is printed just once
+ (when the authentication state is entered by the SSH state machine).
-- lib557: initialize variables
+Daniel Stenberg (14 Aug 2018)
+- travis: disable h2 torture tests for "coverage"
- These variables are only conditionally initialized.
+ Since they started to fail almost 100% since a few days.
- Closes https://github.com/curl/curl/pull/3739
+ Closes #2876
-- lib509: add missing include for strdup
+Marcel Raad (14 Aug 2018)
+- travis: update to GCC 8
- Closes https://github.com/curl/curl/pull/3739
+ Closes https://github.com/curl/curl/pull/2869
-- README.md: fix no-consecutive-blank-lines Codacy warning
+Daniel Stenberg (13 Aug 2018)
+- http: fix for tiny "HTTP/0.9" response
- Consistently use one blank line between blocks.
+ Deal with tiny "HTTP/0.9" (header-less) responses by checking the
+ status-line early, even before a full "HTTP/" is received to allow
+ detecting 0.9 properly.
- Closes https://github.com/curl/curl/pull/3739
+ Test 1266 and 1267 added to verify.
+
+ Fixes #2420
+ Closes #2872
-- tests/server/util: fix Windows Unicode build
+Kamil Dudka (13 Aug 2018)
+- docs: add disallow-username-in-url.d and haproxy-protocol.d on the list
- Always use the ANSI version of FormatMessage as we don't have the
- curl_multibyte gear available here.
+ ... to make make the files appear in distribution tarballs
- Closes https://github.com/curl/curl/pull/3758
-
-Daniel Stenberg (11 Apr 2019)
-- curl_easy_getinfo.3: fix minor formatting mistake
+ Closes #2856
-Daniel Gustafsson (11 Apr 2019)
-- xattr: skip unittest on unsupported platforms
+- .travis.yml: verify that man pages can be regenerated
- The stripcredentials unittest fails to compile on platforms without
- xattr support, for example the Solaris member in the buildfarm which
- fails with the following:
+ ... when curl is built from distribution tarball
- CC unit1621-unit1621.o
- CC ../libtest/unit1621-first.o
- CCLD unit1621
- Undefined first referenced
- symbol in file
- stripcredentials unit1621-unit1621.o
- goto problem 2
- ld: fatal: symbol referencing errors. No output written to .libs/unit1621
- collect2: error: ld returned 1 exit status
- gmake[2]: *** [Makefile:996: unit1621] Error 1
+ Closes #2856
+
+Marcel Raad (11 Aug 2018)
+- Split non-portable part off test 1133
- Fix by excluding the test on such platforms by using the reverse
- logic from where stripcredentials() is defined.
+ Split off testing file names with double quotes into new test 1158.
+ Disable it for MSYS using a precheck as it doesn't support file names
+ with double quotes (but Cygwin does, for example).
- Closes #3759
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Steve Holme (11 Apr 2019)
-- emailL Added reference to RFC8314 for implicit TLS
+ Fixes https://github.com/curl/curl/issues/2796
+ Closes https://github.com/curl/curl/pull/2854
-- README: Schannel, stop calling it "winssl"
+Jay Satiro (11 Aug 2018)
+- projects: Improve Windows perl detection in batch scripts
- Stick to "Schannel" everywhere - follow up to 180501cb.
-
-Jakub Zakrzewski (10 Apr 2019)
-- cmake: clear CMAKE_REQUIRED_LIBRARIES after each use
+ - Determine if perl is in the user's PATH by running perl.exe.
- This fixes GSSAPI builds with the libraries in a non-standard location.
- The testing for recv() were failing because it failed to link
- the Kerberos libraries, which are not needed for this or subsequent
- tests.
+ Prior to this change detection was done by checking the PATH for perl/
+ but that did not work in all cases (eg git install includes perl but
+ not in perl/ path).
- fixes #3743
- closes #3744
+ Bug: https://github.com/curl/curl/pull/2865
+ Reported-by: Daniel Jeliński
-- cmake: avoid linking executable for some tests with cmake 3.6+
-
- With CMAKE_TRY_COMPILE_TARGET_TYPE set to STATIC_LIBRARY, the try_compile()
- (which is used by check_c_source_compiles()) will build static library
- instead of executable. This avoids linking additional libraries in and thus
- speeds up those checks a little.
+- [Michael Kaufmann brought this change]
+
+ docs: Improve the manual pages of some callbacks
- This commit also avoids #3743 (GSSAPI build errors) on itself with cmake
- 3.6 or above. That issue was fixed separately for all versions.
+ - CURLOPT_HEADERFUNCTION: add newlines
+ - CURLOPT_INTERLEAVEFUNCTION: fix the description of 'userdata'
+ - CURLOPT_READDATA: mention crashes, same as in CURLOPT_WRITEDATA
+ - CURLOPT_READFUNCTION: rename 'instream' to 'userdata' and explain
+ how to set it
- Ref: #3744
+ Closes https://github.com/curl/curl/pull/2868
-- cmake: minor cleanup
+Marcel Raad (11 Aug 2018)
+- GCC: silence -Wcast-function-type uniformly
- - Remove nneeded include_regular_expression.
- It was setting what is already a default.
+ Pointed-out-by: Rikard Falkeborn
+ Closes https://github.com/curl/curl/pull/2860
+
+- Silence GCC 8 cast-function-type warnings
- - Remove duplicated include.
+ On Windows, casting between unrelated function types is fine and
+ sometimes even necessary, so just use an intermediate cast to
+ (void (*) (void)) to silence the warning as described in [0].
- - Don't check for pre-3.0.0 CMake version.
- We already require at least 3.0.0, so it's just clutter.
+ [0] https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Warning-Options.html
- Ref: #3744
-
-Steve Holme (8 Apr 2019)
-- build-openssl.bat: Fixed support for OpenSSL v1.1.0+
-
-- build-openssl.bat: Perfer the use of if statements rather than goto (where possible)
+ Closes https://github.com/curl/curl/pull/2860
-- build-openssl.bat: Perform the install for each build type directly after the build
-
-- build-openssl.bat: Split the install of static and shared build types
-
-- build-openssl.bat: Split the building of static and shared build types
-
-- build-openssl.bat: Move the installation into a separate function
-
-- build-openssl.bat: Move the build step into a separate function
-
-- build-openssl.bat: Move the OpenSSL configuration into a separate function
-
-- build-openssl.bat: Fixed the BUILD_CONFIG variable not being initialised
+Daniel Stenberg (11 Aug 2018)
+- CURLINFO_SIZE_UPLOAD: fix missing counter update
- Should the parent environment set this variable then the build might
- not be performed as the user intended.
+ Adds test 1522 for verification.
+
+ Reported-by: cjmsoregan
+ Fixes #2847
+ Closes #2864
-Daniel Stenberg (8 Apr 2019)
-- socks: fix error message
+- [Daniel Jelinski brought this change]
-- config.d: clarify that initial : and = might need quoting [skip ci]
+ Documentation: fix CURLOPT_SSH_COMPRESSION copy/paste bug
- Fixes #3738
- Closes #3749
+ Closes #2867
- RELEASE-NOTES: synced
+
+- openssl: fix potential NULL pointer deref in is_pkcs11_uri
- bumped to 7.65.0 for next release
+ Follow-up to 298d2565e
+ Coverity CID 1438387
-- socks5: user name and passwords must be shorter than 256
+Marcel Raad (10 Aug 2018)
+- travis: execute "set -eo pipefail" for coverage build
- bytes... since the protocol needs to store the length in a single byte field.
+ Follow-up to 2de63ab179eb78630ee039ad94fb2a5423df522d and
+ 0b87c963252d3504552ee0c8cf4402bd65a80af5.
- Reported-by: XmiliaH on github
- Fixes #3737
- Closes #3740
+ Closes https://github.com/curl/curl/pull/2862
-- [Jakub Zakrzewski brought this change]
+Daniel Stenberg (10 Aug 2018)
+- lib1502: fix memory leak in torture test
+
+ Reported-by: Marcel Raad
+ Fixes #2861
+ Closes #2863
- test: urlapi: urlencode characters above 0x7f correctly
+- docs: mention NULL is fine input to several functions
+
+ Fixes #2837
+ Closes #2858
+ Reported-by: Markus Elfring
-- [Jakub Zakrzewski brought this change]
+- [Bas van Schaik brought this change]
- urlapi: urlencode characters above 0x7f correctly
+ README.md: add LGTM.com code quality grade for C/C++
- fixes #3741
- Closes #3742
+ Closes #2857
-- [Even Rouault brought this change]
+- [Rikard Falkeborn brought this change]
- multi_runsingle(): fix use-after-free
-
- Fixes #3745
- Closes #3746
-
- The following snippet
- ```
-
- int main()
- {
- CURL* hCurlHandle = curl_easy_init();
- curl_easy_setopt(hCurlHandle, CURLOPT_URL, "http://example.com");
- curl_easy_setopt(hCurlHandle, CURLOPT_PROXY, "1");
- curl_easy_perform(hCurlHandle);
- curl_easy_cleanup(hCurlHandle);
- return 0;
- }
- ```
- triggers the following Valgrind warning
+ test1531: Add timeout
- ```
- ==4125== Invalid read of size 8
- ==4125== at 0x4E7D1EE: Curl_llist_remove (llist.c:97)
- ==4125== by 0x4E7EF5C: detach_connnection (multi.c:798)
- ==4125== by 0x4E80545: multi_runsingle (multi.c:1451)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ==4125== Address 0x9b3d1d0 is 1,120 bytes inside a block of size 1,600 free'd
- ==4125== at 0x4C2ECF0: free (vg_replace_malloc.c:530)
- ==4125== by 0x4E62C36: conn_free (url.c:756)
- ==4125== by 0x4E62D34: Curl_disconnect (url.c:818)
- ==4125== by 0x4E48DF9: Curl_once_resolved (hostip.c:1097)
- ==4125== by 0x4E8052D: multi_runsingle (multi.c:1446)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ==4125== Block was alloc'd at
- ==4125== at 0x4C2F988: calloc (vg_replace_malloc.c:711)
- ==4125== by 0x4E6438E: allocate_conn (url.c:1654)
- ==4125== by 0x4E685B4: create_conn (url.c:3496)
- ==4125== by 0x4E6968F: Curl_connect (url.c:4023)
- ==4125== by 0x4E802E7: multi_runsingle (multi.c:1368)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ```
-
- This has been bisected to commit 2f44e94
+ Previously, the macro TEST_HANG_TIMEOUT was unused, but since there is
+ looping going on, we might as well add timing instead of removing it.
- Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14109
- Credit to OSS Fuzz
+ Closes #2853
-- pipelining: removed
+- [Rikard Falkeborn brought this change]
+
+ test1540: Remove unused macro TEST_HANG_TIMEOUT
- As previously planned and documented in DEPRECATE.md, all pipelining
- code is removed.
+ The macro has never been used, and it there is not really any place
+ where it would make sense to add timing checks.
- Closes #3651
+ Closes #2852
-- [cclauss brought this change]
+- [Rikard Falkeborn brought this change]
- tests: make Impacket (SMB server) Python 3 compatible
+ asyn-thread: Remove unused macro
- Closes #3731
- Fixes #3289
+ The macro seems to never have been used.
+
+ Closes #2852
-Marcel Raad (6 Apr 2019)
-- [Simon Warta brought this change]
+- [Rikard Falkeborn brought this change]
- cmake: set SSL_BACKENDS
+ http_proxy: Remove unused macro SELECT_TIMEOUT
- This groups all SSL backends into the feature "SSL" and sets the
- SSL_BACKENDS analogue to configure.ac
+ Usage was removed in 5113ad0424044458ac497fa1458ebe0101356b22.
- Closes https://github.com/curl/curl/pull/3736
+ Closes #2852
-- [Simon Warta brought this change]
+- [Rikard Falkeborn brought this change]
- cmake: don't run SORT on empty list
+ formdata: Remove unused macro HTTPPOST_CONTENTTYPE_DEFAULT
- In case of an empty list, SORTing leads to the cmake error "list
- sub-command SORT requires list to be present."
+ Its usage was removed in
+ 84ad1fd3047815f9c6e78728bb351b828eac10b1.
- Closes https://github.com/curl/curl/pull/3736
+ Closes #2852
-Daniel Gustafsson (5 Apr 2019)
-- [Eli Schwartz brought this change]
+- [Rikard Falkeborn brought this change]
- configure: fix default location for fish completions
+ telnet: Remove unused macros TELOPTS and TELCMDS
- Fish defines a vendor completions directory for completions that are not
- installed as part of the fish project itself, and the vendor completions
- are preferred if they exist. This prevents trying to overwrite the
- builtin curl.fish completion (or creating file conflicts in distro
- packaging).
+ Their usage was removed in 3a145180cc754a5959ca971ef3cd243c5c83fc51.
- Prefer the pkg-config defined location exported by fish, if it can be
- found, and fall back to the correct directory defined by most systems.
+ Closes #2852
+
+- [Daniel Jelinski brought this change]
+
+ openssl: fix debug messages
- Closes #3723
- Reviewed-by: Daniel Gustafsson
+ Fixes #2806
+ Closes #2843
-Marcel Raad (5 Apr 2019)
-- ftplistparser: fix LGTM alert "Empty block without comment"
+- configure: fix for -lpthread detection with OpenSSL and pkg-config
- Removing the block is consistent with line 954/957.
+ ... by making sure it uses the -I provided by pkg-config!
- Closes https://github.com/curl/curl/pull/3732
+ Reported-by: pszemus on github
+ Fixes #2848
+ Closes #2850
+
+- RELEASE-NOTES: synced
-- transfer: fix LGTM alert "Comparison is always true"
+- windows: follow up to the buffer-tuning 1ba1dba7
- Just remove the redundant condition, which also makes it clear that
- k->buf is always 0-terminated if this break is not hit.
+ Somehow I didn't include the amended version of the previous fix. This
+ is the missing piece.
- Closes https://github.com/curl/curl/pull/3732
+ Pointed-out-by: Viktor Szakats
-Jay Satiro (4 Apr 2019)
-- [Rikard Falkeborn brought this change]
+- [Daniel Jelinski brought this change]
- smtp: fix compiler warning
-
- - Fix clang string-plus-int warning.
+ windows: implement send buffer tuning
- Clang 8 warns about adding a string to an int does not append to the
- string. Indeed it doesn't, but that was not the intention either. Use
- array indexing as suggested to silence the warning. There should be no
- functional changes.
+ Significantly enhances upload performance on modern Windows versions.
- (In other words clang warns about "foo"+2 but not &"foo"[2] so use the
- latter.)
+ Bug: https://curl.haxx.se/mail/lib-2018-07/0080.html
+ Closes #2762
+ Fixes #2224
+
+- [Anderson Toshiyuki Sasaki brought this change]
+
+ ssl: set engine implicitly when a PKCS#11 URI is provided
- smtp.c:1221:29: warning: adding 'int' to a string does not append to the
- string [-Wstring-plus-int]
- eob = strdup(SMTP_EOB + 2);
- ~~~~~~~~~~~~~~~~^~~~
+ This allows the use of PKCS#11 URI for certificates and keys without
+ setting the corresponding type as "ENG" and the engine as "pkcs11"
+ explicitly. If a PKCS#11 URI is provided for certificate, key,
+ proxy_certificate or proxy_key, the corresponding type is set as "ENG"
+ if not provided and the engine is set to "pkcs11" if not provided.
- Closes https://github.com/curl/curl/pull/3729
+ Acked-by: Nikos Mavrogiannopoulos
+ Closes #2333
+
+- [Ruslan Baratov brought this change]
-Marcel Raad (4 Apr 2019)
-- VS projects: use Unicode for VC10+
+ CMake: Respect BUILD_SHARED_LIBS
- All Windows APIs have been natively UTF-16 since Windows 2000 and the
- non-Unicode variants are just wrappers around them. Only Windows 9x
- doesn't understand Unicode without the UnicoWS DLL. As later Visual
- Studio versions cannot target Windows 9x anyway, using the ANSI API
- doesn't really have any benefit there.
+ Use standard CMake variable BUILD_SHARED_LIBS instead of introducing
+ custom option CURL_STATICLIB.
- This avoids issues like KNOWN_BUGS 6.5.
+ Use '-DBUILD_SHARED_LIBS=%SHARED%' in appveyor.yml.
- Ref: https://github.com/curl/curl/issues/2120
- Closes https://github.com/curl/curl/pull/3720
+ Reviewed-by: Sergei Nikulov
+ Closes #2755
-Daniel Gustafsson (3 Apr 2019)
-- RELEASE-NOTES: synced
+- [John Butterfield brought this change]
+
+ cmake: bumped minimum version to 3.4
- Bump the version in progress to 7.64.2, if we merge any "change"
- before the cut-off date we can update the version.
+ Closes #2753
-- [Tim Rühsen brought this change]
+- [John Butterfield brought this change]
- documentation: Fix several typos
+ cmake: link curl to the OpenSSL targets instead of lib absolute paths
- Closes #3724
Reviewed-by: Jakub Zakrzewski
- Reviewed-by: Daniel Gustafsson
+ Reviewed-by: Sergei Nikulov
+ Closes #2753
-Jay Satiro (2 Apr 2019)
-- [Mert Yazıcıoğlu brought this change]
-
- vauth/oauth2: Fix OAUTHBEARER token generation
+- travis: build darwinssl on macos 10.12
- OAUTHBEARER tokens were incorrectly generated in a format similar to
- XOAUTH2 tokens. These changes make OAUTHBEARER tokens conform to the
- RFC7628.
+ ... as building on 10.13.x before 10.13.4 leads to link errors.
- Fixes: #2487
- Reported-by: Paolo Mossino
+ Assisted-by: Nick Zitzmann
+ Fixes #2835
+ Closes #2845
+
+- DEPRECATE: remove release date from 7.62.0
- Closes https://github.com/curl/curl/pull/3377
+ Since it will slip and the version is the important part there, not the
+ date.
-Marcel Raad (2 Apr 2019)
-- tool_cb_wrt: fix bad-function-cast warning
+- lib/Makefile: only do symbol hiding if told to
- Commit f5bc578f4cdfdc6c708211dfc2962a0e9d79352d reintroduced the
- warning fixed in commit 2f5f31bb57d68b54e03bffcd9648aece1fe564f8.
- Extend fhnd's scope and reuse that variable instead of calling
- _get_osfhandle a second time to fix the warning again.
+ This restores the ability to build a static lib with
+ --disable-symbol-hiding to keep non-curl_ symbols.
- Closes https://github.com/curl/curl/pull/3718
+ Researched-by: Dan Fandrich
+ Reported-by: Ran Mozes
+ Fixes #2830
+ Closes #2831
-- VC15 project: remove MinimalRebuild
+Marcel Raad (2 Aug 2018)
+- hostip: fix unused variable warning
- Already done in commit d5cfefd0ea8e331b884186bff484210fad36e345 for the
- library project, but I forgot the tool project template. Now also
- removed for that.
+ addresses is only used in an infof call, which is a macro expanding to
+ nothing if CURL_DISABLE_VERBOSE_STRINGS is set.
-Dan Fandrich (1 Apr 2019)
-- cirrus: Customize the disabled tests per FreeBSD version
+Daniel Stenberg (2 Aug 2018)
+- test1307: disabled
- Try to run as many test cases as possible on each OS version.
- 12.0 passes 13 more tests than the older versions, so we might as well
- run them.
+ Turns out that since we're using the native fnmatch function now when
+ available, and they simply disagree on a huge number of test patterns
+ that make it hard to test this function like this...
+
+ Fixes #2825
-Daniel Stenberg (1 Apr 2019)
-- tool_help: include <strings.h> for strcasecmp
+- smb: don't mark it done in smb_do
+
+ Follow-up to 09e401e01bf9. The SMB protocol handler needs to use its
+ doing function too, which requires smb_do() to not mark itself as
+ done...
- Reported-by: Wyatt O'Day
- Fixes #3715
- Closes #3716
+ Closes #2822
-Daniel Gustafsson (31 Mar 2019)
-- scripts: fix typos
+- [Rikard Falkeborn brought this change]
-Dan Fandrich (28 Mar 2019)
-- travis: allow builds on branches named "ci"
+ general: fix printf specifiers
- This allows a way to test changes other than through PRs.
+ Closes #2818
-Daniel Stenberg (27 Mar 2019)
-- [Brad Spencer brought this change]
+- RELEASE-NOTES: synced
+
+- mailmap: Daniel Jelinski
+
+- [Harry Sintonen brought this change]
- resolve: apply Happy Eyeballs philosophy to parallel c-ares queries
+ HTTP: Don't attempt to needlessly decompress redirect body
+
+ This change fixes a regression where redirect body would needlessly be
+ decompressed even though it was to be ignored anyway. As it happens this
+ causes secondary issues since there appears to be a bug in apache2 that
+ it in certain conditions generates a corrupt zlib response. The
+ regression was created by commit:
+ dbcced8e32b50c068ac297106f0502ee200a1ebd
- Closes #3699
+ Discovered-by: Harry Sintonen
+ Closes #2798
-- multi: improved HTTP_1_1_REQUIRED handling
+- curl: use Content-Disposition before the "URL end" for -OJ
- Make sure to downgrade to 1.1 even when we get this HTTP/2 stream error
- on first flight.
+ Regression introduced in 7.61.0
- Reported-by: niner on github
- Fixes #3696
- Closes #3707
+ Reported-by: Thomas Klausner
+ Fixes #2783
+ Closes #2813
-- [Leonardo Taccari brought this change]
+- [Daniel Jelinski brought this change]
- configure: avoid unportable `==' test(1) operator
+ retry: return error if rewind was necessary but didn't happen
- Closes #3709
+ Fixes #2801
+ Closes #2812
-Version 7.64.1 (27 Mar 2019)
+- http2: clear the drain counter in Curl_http2_done
+
+ Reported-by: Andrei Virtosu
+ Fixes #2800
+ Closes #2809
-Daniel Stenberg (27 Mar 2019)
-- RELEASE: 7.64.1
+- smb: fix memory leak on early failure
+
+ ... by making sure connection related data (->share) is stored in the
+ connection and not in the easy handle.
+
+ Detected by OSS-fuzz
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9369
+ Fixes #2769
+ Closes #2810
-- Revert "ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set"
+- travis: run a 'make checksrc' too
- This reverts commit 9130ead9fcabdb6b8fbdb37c0b38be2d326adb00.
+ ... to make sure the examples are all checked.
- Fixes #3708
+ Closes #2811
-- [Christian Schmitz brought this change]
+Jay Satiro (29 Jul 2018)
+- examples/ephiperfifo: checksrc compliance
- ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set
-
- Closes #3704
+- [Michael Kaufmann brought this change]
-Jay Satiro (26 Mar 2019)
-- tool_cb_wrt: fix writing to Windows null device NUL
-
- - Improve console detection.
+ sws: handle EINTR when calling select()
- Prior to this change WriteConsole could be called to write to a handle
- that may not be a console, which would cause an error. This issue is
- limited to character devices that are not also consoles such as the null
- device NUL.
+ Closes https://github.com/curl/curl/pull/2808
+
+Daniel Stenberg (29 Jul 2018)
+- test1157: follow-up to 35ecffb9
- Bug: https://github.com/curl/curl/issues/3175#issuecomment-439068724
- Reported-by: Gisle Vanem
+ Ignore the user-agent line.
+ Pointed-out-by: Marcel Raad
-- CURLMOPT_PIPELINING.3: fix typo
+Michael Kaufmann (29 Jul 2018)
+- tests/http_pipe.py: Use /usr/bin/env to find python
-Daniel Stenberg (25 Mar 2019)
-- TODO: config file parsing
+Daniel Stenberg (28 Jul 2018)
+- TODO: Support Authority Information Access certificate extension (AIA)
- Closes #3698
+ Closes #2793
-Jay Satiro (24 Mar 2019)
-- os400: Disable Alt-Svc by default since it's experimental
-
- Follow-up to 520f0b4 which added Alt-Svc support and enabled it by
- default for OS400. Since the feature is experimental, it should be
- disabled by default.
-
- Ref: https://github.com/curl/curl/commit/520f0b4#commitcomment-32792332
- Ref: https://curl.haxx.se/mail/lib-2019-02/0008.html
+- conn_free: updated comment to clarify
- Closes https://github.com/curl/curl/pull/3688
+ Let's call it disassociate instead of disconnect since the latter term
+ is used so much for (TCP) connections already.
-Dan Fandrich (24 Mar 2019)
-- tests: Fixed XML validation errors in some test files.
-
-- tests: Fix some incorrect precheck error messages.
+- test1157: test -H from empty file
- [ci skip]
+ Verifies bugfix #2797
-Daniel Stenberg (22 Mar 2019)
-- curl_url.3: this is not experimental anymore
+- [Tobias Blomberg brought this change]
-- travis: bump the used wolfSSL version to 4.0.0
+ curl: Fix segfault when -H @headerfile is empty
- Test 311 is now fine, leaving only 313 (CRL) disabled.
+ The curl binary would crash if the -H command line option was given a
+ filename to read using the @filename syntax but that file was empty.
- Test 313 details can be found here:
- https://github.com/wolfSSL/wolfssl/issues/1546
+ Closes #2797
+
+- mime: check Curl_rand_hex's return code
- Closes #3697
+ Bug: https://curl.haxx.se/mail/archive-2018-07/0015.html
+ Reported-by: Jeffrey Walton
+ Closes #2795
-Daniel Gustafsson (22 Mar 2019)
-- lib: Fix typos in comments
+- [Josh Bialkowski brought this change]
-David Woodhouse (20 Mar 2019)
-- openssl: if cert type is ENG and no key specified, key is ENG too
+ docs/examples: add hiperfifo example using linux epoll/timerfd
- Fixes #3692
- Closes #3692
+ Closes #2804
-Daniel Stenberg (20 Mar 2019)
-- sectransp: tvOS 11 is required for ALPN support
-
- Reported-by: nianxuejie on github
- Assisted-by: Nick Zitzmann
- Assisted-by: Jay Satiro
- Fixes #3689
- Closes #3690
+- [Darío Hereñú brought this change]
-- test1541: threaded connection sharing
+ docs/INSTALL.md: minor formatting fixes
- The threaded-shared-conn.c example turned into test case. Only works if
- pthread was detected.
+ Closes #2794
+
+- [Christopher Head brought this change]
+
+ docs/CURLOPT_URL: fix indentation
- An attempt to detect future regressions such as e3a53e3efb942a5
+ The statement, “The application does not have to keep the string around
+ after setting this option,†appears to be indented under the RTMP
+ paragraph. It actually applies to all protocols, not just RTMP.
+ Eliminate the extra indentation.
- Closes #3687
+ Closes #2788
-Patrick Monnerat (17 Mar 2019)
-- os400: alt-svc support.
-
- Although experimental, enable it in the platform config file.
- Upgrade ILE/RPG binding.
+- [Christopher Head brought this change]
-Daniel Stenberg (17 Mar 2019)
-- conncache: use conn->data to know if a transfer owns it
+ docs/CURLOPT_WRITEFUNCTION: size is always 1
- - make sure an already "owned" connection isn't returned unless
- multiplexed.
+ For compatibility with `fwrite`, the `CURLOPT_WRITEFUNCTION` callback is
+ passed two `size_t` parameters which, when multiplied, designate the
+ number of bytes of data passed in. In practice, CURL always sets the
+ first parameter (`size`) to 1.
- - clear ->data when returning the connection to the cache again
+ This practice is also enshrined in documentation and cannot be changed
+ in future. The documentation states that the default callback is
+ `fwrite`, which means `fwrite` must be a suitable function for this
+ purpose. However, the documentation also states that the callback must
+ return the number of *bytes* it successfully handled, whereas ISO C
+ `fwrite` returns the number of items (each of size `size`) which it
+ wrote. The only way these numbers can be equal is if `size` is 1.
- Regression since 7.62.0 (probably in commit 1b76c38904f0)
+ Since `size` is 1 and can never be changed in future anyway, document
+ that fact explicitly and let users rely on it.
- Bug: https://curl.haxx.se/mail/lib-2019-03/0064.html
-
- Closes #3686
-
-- RELEASE-NOTES: synced
+ Closes #2787
-- [Chris Young brought this change]
+- [Carie Pointer brought this change]
- configure: add --with-amissl
+ wolfSSL/CyaSSL: Fix memory leak in Curl_cyassl_random
- AmiSSL is an Amiga native library which provides a wrapper over OpenSSL.
- It also requires all programs using it to use bsdsocket.library
- directly, rather than accessing socket functions through clib, which
- libcurl was not necessarily doing previously. Configure will now check
- for the headers and ensure they are included if found.
+ RNG structure must be freed by call to FreeRng after its use in
+ Curl_cyassl_random. This call fixes Valgrind failures when running the
+ test suite with wolfSSL.
- Closes #3677
+ Closes #2784
-- [Chris Young brought this change]
+- [Even Rouault brought this change]
- vtls: rename some of the SSL functions
+ reuse_conn(): free old_conn->options
- ... in the SSL structure as AmiSSL is using macros for the socket API
- functions.
-
-- [Chris Young brought this change]
+ This fixes a memory leak when CURLOPT_LOGIN_OPTIONS is used, together with
+ connection reuse.
+
+ I found this with oss-fuzz on GDAL and curl master:
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9582
+ I couldn't reproduce with the oss-fuzz original test case, but looking
+ at curl source code pointed to this well reproducable leak.
+
+ Closes #2790
- tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr
+Marcel Raad (25 Jul 2018)
+- [Daniel Jelinski brought this change]
-- [Chris Young brought this change]
+ system_win32: fix version checking
+
+ In the current version, VERSION_GREATER_THAN_EQUAL 6.3 will return false
+ when run on windows 10.0. This patch addresses that error.
+
+ Closes https://github.com/curl/curl/pull/2792
- tool_operate: build on AmigaOS
+Daniel Stenberg (24 Jul 2018)
+- [Johannes Schindelin brought this change]
-- makefile: make checksrc and hugefile commands "silent"
+ auth: pick Bearer authentication whenever a token is available
- ... to match the style already used for compiling, linking
- etc. Acknowledges 'make V=1' to enable verbose.
+ So far, the code tries to pick an authentication method only if
+ user/password credentials are available, which is not the case for
+ Bearer authentictation...
- Closes #3681
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+ Closes #2754
-- curl.1: --user and --proxy-user are hidden from ps output
+- [Johannes Schindelin brought this change]
+
+ auth: only ever pick CURLAUTH_BEARER if we *have* a Bearer token
- Suggested-by: Eric Curtin
- Improved-by: Dan Fandrich
- Ref: #3680
+ The Bearer authentication was added to cURL 7.61.0, but there is a
+ problem: if CURLAUTH_ANY is selected, and the server supports multiple
+ authentication methods including the Bearer method, we strongly prefer
+ that latter method (only CURLAUTH_NEGOTIATE beats it), and if the Bearer
+ authentication fails, we will never even try to attempt any other
+ method.
- Closes #3683
-
-- curl.1: mark the argument to --cookie as <data|filename>
+ This is particularly unfortunate when we already know that we do not
+ have any Bearer token to work with.
- From a discussion in #3676
+ Such a scenario happens e.g. when using Git to push to Visual Studio
+ Team Services (which supports Basic and Bearer authentication among
+ other methods) and specifying the Personal Access Token directly in the
+ URL (this aproach is frequently taken by automated builds).
- Suggested-by: Tim Rühsen
+ Let's make sure that we have a Bearer token to work with before we
+ select the Bearer authentication among the available authentication
+ methods.
- Closes #3682
-
-Dan Fandrich (14 Mar 2019)
-- fuzzer: Only clone the latest fuzzer code, for speed.
-
-Daniel Stenberg (14 Mar 2019)
-- [Dominik Hölzl brought this change]
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+ Closes #2754
- Negotiate: fix for HTTP POST with Negotiate
+Marcel Raad (22 Jul 2018)
+- test320: treat curl320.out file as binary
- * Adjusted unit tests 2056, 2057
- * do not generally close connections with CURLAUTH_NEGOTIATE after every request
- * moved negotiatedata from UrlState to connectdata
- * Added stream rewind logic for CURLAUTH_NEGOTIATE
- * introduced negotiatedata::GSS_AUTHDONE and negotiatedata::GSS_AUTHSUCC
- * Consider authproblem state for CURLAUTH_NEGOTIATE
- * Consider reuse_forbid for CURLAUTH_NEGOTIATE
- * moved and adjusted negotiate authentication state handling from
- output_auth_headers into Curl_output_negotiate
- * Curl_output_negotiate: ensure auth done is always set
- * Curl_output_negotiate: Set auth done also if result code is
- GSS_S_CONTINUE_NEEDED/SEC_I_CONTINUE_NEEDED as this result code may
- also indicate the last challenge request (only works with disabled
- Expect: 100-continue and CURLOPT_KEEP_SENDING_ON_ERROR -> 1)
- * Consider "Persistent-Auth" header, detect if not present;
- Reset/Cleanup negotiate after authentication if no persistent
- authentication
- * apply changes introduced with #2546 for negotiate rewind logic
+ Otherwise, LF line endings are converted to CRLF on Windows,
+ but no conversion is done for the reply, so the test case fails.
- Fixes #1261
- Closes #1975
-
-- [Marc Schlatter brought this change]
+ Closes https://github.com/curl/curl/pull/2776
- http: send payload when (proxy) authentication is done
+Daniel Stenberg (22 Jul 2018)
+- vtls: set conn->data when closing TLS
- The check that prevents payload from sending in case of authentication
- doesn't check properly if the authentication is done or not.
-
- They're cases where the proxy respond "200 OK" before sending
- authentication challenge. This change takes care of that.
+ Follow-up to 1b76c38904f0. The VTLS backends that close down the TLS
+ layer for a connection still needs a Curl_easy handle for the session_id
+ cache etc.
- Fixes #2431
- Closes #3669
+ Fixes #2764
+ Closes #2771
-- file: fix "Checking if unsigned variable 'readcount' is less than zero."
+Marcel Raad (21 Jul 2018)
+- tests: fixes for Windows line endlings
- Pointed out by codacy
+ Set mode="text" when line endings depend on the system representation.
- Closes #3672
+ Closes https://github.com/curl/curl/pull/2772
-- memdebug: log pointer before freeing its data
+- test214: disable MSYS2's POSIX path conversion for URL
- Coverity warned for two potentional "Use after free" cases. Both are false
- positives because the memory wasn't used, it was only the actual pointer
- value that was logged.
+ By default, the MSYS2 bash converts all backslashes to forward slashes
+ in URLs. Disable this with MSYS2_ARG_CONV_EXCL for the test to pass.
- The fix still changes the order of execution to avoid the warnings.
+ Ref https://github.com/msys2/msys2/wiki/Porting#filesystem-namespaces
+
+Daniel Stenberg (20 Jul 2018)
+- http2: several cleanups
- Coverity CID 1443033 and 1443034
+ - separate easy handle from connections better
+ - added asserts on a number of places
+ - added sanity check of pipelines for debug builds
- Closes #3671
+ Closes #2751
-- RELEASE-NOTES: synced
-
-Marcel Raad (12 Mar 2019)
-- travis: actually use updated compiler versions
+- smb_getsock: always wait for write socket too
- For the Linux builds, GCC 8 and 7 and clang 7 were installed, but the
- new GCC versions were only used for the coverage build and for building
- nghttp2, while the new clang version was not used at all.
+ ... the protocol is doing read/write a lot, so it needs to write often
+ even when downloading. A more proper fix could check for eactly when it
+ wants to write and only ask for it then.
- BoringSSL needs to use the default GCC as it respects CC, but not CXX,
- so it would otherwise pass gcc 8 options to g++ 4.8 and fail.
+ Without this fix, an SMB download could easily get stuck when the event-driven
+ API was used.
- Also remove GCC 7, it's not needed anymore.
+ Closes #2768
+
+Marcel Raad (20 Jul 2018)
+- test1143: disable MSYS2's POSIX path conversion
- Ref: https://docs.travis-ci.com/user/languages/c/#c11c11-and-beyond-and-toolchain-versioning
+ By default, the MSYS2 bash interprets http:/%HOSTIP:%HTTPPORT/want/1143
+ as a POSIX file list and converts it to a Windows file list.
+ Disable this with MSYS2_ARG_CONV_EXCL for the test to pass.
- Closes https://github.com/curl/curl/pull/3670
+ Ref https://github.com/msys2/msys2/wiki/Porting#filesystem-namespaces
+ Closes https://github.com/curl/curl/pull/2765
-- travis: update clang to version 7
+Daniel Stenberg (18 Jul 2018)
+- RELEASE-NOTES: sync
- Closes https://github.com/curl/curl/pull/3670
+ ... and work toward 7.61.1
-Jay Satiro (11 Mar 2019)
-- [Andre Guibert de Bruet brought this change]
+- [Ruslan Baratov brought this change]
- examples/externalsocket: add missing close socket calls
+ CMake: Update scripts to use consistent style
- .. and for Windows also call WSACleanup since we call WSAStartup.
-
- The example is to demonstrate handling the socket independently of
- libcurl. In this case libcurl is not responsible for creating, opening
- or closing the socket, it is handled by the application (our example).
-
- Fixes https://github.com/curl/curl/pull/3663
+ Closes #2727
+ Reviewed-by: Sergei Nikulov
-Daniel Stenberg (11 Mar 2019)
-- multi: removed unused code for request retries
+- header output: switch off all styles, not just unbold
- This code was once used for the non multi-interface using code path, but
- ever since easy_perform was turned into a wrapper around the multi
- interface, this code path never runs.
+ ... the "unbold" sequence doesn't work on the mac Terminal.
- Closes #3666
+ Reported-by: Zero King
+ Fixes #2736
+ Closes #2738
-Jay Satiro (11 Mar 2019)
-- doh: inherit some SSL options from user's easy handle
-
- - Inherit SSL options for the doh handle but not SSL client certs,
- SSL ALPN/NPN, SSL engine, SSL version, SSL issuer cert,
- SSL pinned public key, SSL ciphers, SSL id cache setting,
- SSL kerberos or SSL gss-api settings.
-
- - Fix inheritance of verbose setting.
+Nick Zitzmann (14 Jul 2018)
+- [Rodger Combs brought this change]
+
+ darwinssl: add support for ALPN negotiation
+
+Marcel Raad (14 Jul 2018)
+- test1422: add required file feature
- - Inherit NOSIGNAL.
+ curl configured with --enable-debug --disable-file currently complains
+ on test1422:
+ Info: Protocol "file" not supported or disabled in libcurl
- There is no way for the user to set options for the doh (DNS-over-HTTPS)
- handles and instead we inherit some options from the user's easy handle.
+ Make test1422 dependend on enabled FILE protocol to fix this.
- My thinking for the SSL options not inherited is they are most likely
- not intended by the user for the DOH transfer. I did inherit insecure
- because I think that should still be in control of the user.
+ Fixes https://github.com/curl/curl/issues/2741
+ Closes https://github.com/curl/curl/pull/2742
+
+Patrick Monnerat (12 Jul 2018)
+- content_encoding: accept up to 4 unknown trailer bytes after raw deflate data
- Prior to this change doh did not work for me because CAINFO was not
- inherited. Also verbose was set always which AFAICT was a bug (#3660).
+ Some servers issue raw deflate data that may be followed by an undocumented
+ trailer. This commit makes curl tolerate such a trailer of up to 4 bytes
+ before considering the data is in error.
- Fixes https://github.com/curl/curl/issues/3660
- Closes https://github.com/curl/curl/pull/3661
+ Reported-by: clbr on github
+ Fixes #2719
-Daniel Stenberg (9 Mar 2019)
-- test331: verify set-cookie for dotless host name
+Daniel Stenberg (12 Jul 2018)
+- smb: fix memory-leak in URL parse error path
- Reproduced bug #3649
- Closes #3659
+ Detected by OSS-Fuzz
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9369
+ Closes #2740
-- Revert "cookies: extend domain checks to non psl builds"
-
- This reverts commit 3773de378d48b06c09931e44dca4d274d0bfdce0.
+Marcel Raad (12 Jul 2018)
+- schannel: enable CALG_TLS1PRF for w32api >= 5.1
- Regression shipped in 7.64.0
- Fixes #3649
+ The definition of CALG_TLS1PRF has been fixed in the 5.1 branch:
+ https://osdn.net/projects/mingw/scm/git/mingw-org-wsl/commits/73aedcc0f2e6ba370de0d86ab878ad76a0dda7b5
-- memdebug: make debug-specific functions use curl_dbg_ prefix
+Daniel Stenberg (12 Jul 2018)
+- docs/SECURITY-PROCESS: mention bounty, drop pre-notify
- To not "collide" or use up the regular curl_ name space. Also makes them
- easier to detect in helper scripts.
+ + The hackerone bounty and its process
- Closes #3656
+ - We don't and can't handle pre-notification
-- cmdline-opts/proxytunnel.d: the option tunnnels all protocols
+- multi: always do the COMPLETED procedure/state
- Clarify the language and simplify.
+ It was previously erroneously skipped in some situations.
- Reported-by: Daniel Lublin
- Closes #3658
+ libtest/libntlmconnect.c wrongly depended on wrong behavior (that it
+ would get a zero timeout) when no handles are "running" in a multi
+ handle. That behavior is no longer present with this fix. Now libcurl
+ will always return a -1 timeout when all handles are completed.
+
+ Closes #2733
-- KNOWN_BUGS: Client cert (MTLS) issues with Schannel
+- Curl_getoff_all_pipelines: improved for multiplexed
- Closes #3145
+ On multiplexed connections, transfers can be removed from anywhere not
+ just at the head as for pipelines.
-- ROADMAP: updated to some more current things to work on
+- ares: check for NULL in completed-callback
-- tests: fix multiple may be used uninitialized warnings
+- conn: remove the boolean 'inuse' field
+
+ ... as the usage needs to be counted.
-- RELEASE-NOTES: synced
+- [Paul Howarth brought this change]
-- source: fix two 'nread' may be used uninitialized warnings
+ openssl: assume engine support in 1.0.0 or later
- Both seem to be false positives but we don't like warnings.
+ Commit 38203f1585da changed engine detection to be version-based,
+ with a baseline of openssl 1.0.1. This does in fact break builds
+ with openssl 1.0.0, which has engine support - the configure script
+ detects that ENGINE_cleanup() is available - but <openssl/engine.h>
+ doesn't get included to declare it.
- Closes #3646
+ According to upstream documentation, engine support was added to
+ mainstream openssl builds as of version 0.9.7:
+ https://github.com/openssl/openssl/blob/master/README.ENGINE
+
+ This commit drops the version test down to 1.0.0 as version 1.0.0d
+ is the oldest version I have to test with.
+
+ Closes #2732
-- gopher: remove check for path == NULL
+Marcel Raad (11 Jul 2018)
+- schannel: fix MinGW compile break
- Since it can't be NULL and it makes Coverity believe we lack proper NULL
- checks. Verified by test 659, landed in commit 15401fa886b.
+ Original MinGW's w32api has a sytax error in its definition of
+ CALG_TLS1PRF [0]. Don't use original MinGW w32api's CALG_TLS1PRF
+ until this bug [1] is fixed.
- Pointed out by Coverity CID 1442746.
+ [0] https://osdn.net/projects/mingw/scm/git/mingw-org-wsl/blobs/d1d4a17e51a2b78e252ef0147d483267d56c90cc/w32api/include/wincrypt.h
+ [1] https://osdn.net/projects/mingw/ticket/38391
- Assisted-by: Dan Fandrich
- Fixes #3617
- Closes #3642
+ Fixes https://github.com/curl/curl/pull/2721#issuecomment-403636043
+ Closes https://github.com/curl/curl/pull/2728
-- examples: only include <curl/curl.h>
+Daniel Stenberg (11 Jul 2018)
+- examples/crawler.c: move #ifdef to column 0
- That's the only public curl header we should encourage use of.
+ Apparently the C => HTML converter on the web site doesn't quite like it
+ otherwise.
- Reviewed-by: Marcel Raad
- Closes #3645
+ Reported-by: Jeroen Ooms
-- ssh: loop the state machine if not done and not blocking
+Version 7.61.0 (11 Jul 2018)
+
+Daniel Stenberg (11 Jul 2018)
+- release: 7.61.0
+
+- TODO: Configurable loading of OpenSSL configuration file
- If the state machine isn't complete, didn't fail and it didn't return
- due to blocking it can just as well loop again.
+ Closes #2724
+
+- post303.d: clarify that this is an RFC violation
- This addresses the problem with SFTP directory listings where we would
- otherwise return back to the parent and as the multi state machine
- doesn't have any code for using CURLM_CALL_MULTI_PERFORM for as long the
- doing phase isn't complete, it would return out when in reality there
- was more data to deal with.
+ ... and not the other way around, which this previously said.
- Fixes #3506
- Closes #3644
+ Reported-by: Vasiliy Faronov
+ Fixes #2723
+ Closes #2726
-Jay Satiro (5 Mar 2019)
-- multi: support verbose conncache closure handle
+- [Ruslan Baratov brought this change]
+
+ CMake: remove redundant and old end-of-block syntax
- - Change closure handle to receive verbose setting from the easy handle
- most recently added via curl_multi_add_handle.
+ Reviewed-by: Jakub Zakrzewski
+ Closes #2715
+
+Jay Satiro (9 Jul 2018)
+- lib/curl_setup.h: remove unicode character
- The closure handle is a special easy handle used for closing cached
- connections. It receives limited settings from the easy handle most
- recently added to the multi handle. Prior to this change that did not
- include verbose which was a problem because on connection shutdown
- verbose mode was not acknowledged.
+ Follow-up to 82ce416.
- Ref: https://github.com/curl/curl/pull/3598
+ Ref: https://github.com/curl/curl/commit/8272ec5#commitcomment-29646818
+
+Daniel Stenberg (9 Jul 2018)
+- lib/curl_setup.h: remove unicode bom from 8272ec50f02
+
+Marcel Raad (9 Jul 2018)
+- schannel: fix -Wsign-compare warning
- Co-authored-by: Daniel Stenberg
+ MinGW warns:
+ /lib/vtls/schannel.c:219:64: warning: signed and unsigned type in
+ conditional expression [-Wsign-compare]
- Closes https://github.com/curl/curl/pull/3618
+ Fix this by casting the ptrdiff_t to size_t as we know it's positive.
+
+ Closes https://github.com/curl/curl/pull/2721
-Daniel Stenberg (4 Mar 2019)
-- CURLU: fix NULL dereference when used over proxy
+- schannel: workaround for wrong function signature in w32api
- Test 659 verifies
+ Original MinGW's w32api has CryptHashData's second parameter as BYTE *
+ instead of const BYTE *.
- Also fixed the test 658 name
+ Closes https://github.com/curl/curl/pull/2721
+
+- schannel: make more cipher options conditional
- Closes #3641
+ They are not defined in the original MinGW's <wincrypt.h>.
+
+ Closes https://github.com/curl/curl/pull/2721
-- altsvc_out: check the return code from Curl_gmtime
+- curl_setup: include <winerror.h> before <windows.h>
- Pointed out by Coverity, CID 1442956.
+ Otherwise, only part of it gets pulled in through <windows.h> on
+ original MinGW.
- Closes #3640
+ Fixes https://github.com/curl/curl/issues/2361
+ Closes https://github.com/curl/curl/pull/2721
-- docs/ALTSVC.md: docs describing the approach
+- examples: fix -Wformat warnings
- Closes #3498
+ When size_t is not a typedef for unsigned long (as usually the case on
+ Windows), GCC emits -Wformat warnings when using lu and lx format
+ specifiers with size_t. Silence them with explicit casts to
+ unsigned long.
+
+ Closes https://github.com/curl/curl/pull/2721
-- alt-svc: add a travis build
+Daniel Stenberg (9 Jul 2018)
+- smtp: use the upload buffer size for scratch buffer malloc
+
+ ... not the read buffer size, as that can be set smaller and thus cause
+ a buffer overflow! CVE-2018-0500
+
+ Reported-by: Peter Wu
+ Bug: https://curl.haxx.se/docs/adv_2018-70a2.html
-- alt-svc: add test 355 and 356 to verify with command line curl
+- [Dave Reisner brought this change]
-- alt-svc: the curl command line bits
+ scripts: include _curl as part of CLEANFILES
+
+ Closes #2718
-- alt-svc: the libcurl bits
+- [Nick Zitzmann brought this change]
-- travis: add build using gnutls
+ darwinssl: allow High Sierra users to build the code using GCC
- Closes #3637
+ ...but GCC users lose out on TLS 1.3 support, since we can't weak-link
+ enumeration constants.
+
+ Fixes #2656
+ Closes #2703
-- RELEASE-NOTES: synced
+- [Ruslan Baratov brought this change]
-- [Simon Legner brought this change]
-
- scripts/completion.pl: also generate fish completion file
-
- This is the renamed script formerly known as zsh.pl
+ CMake: Remove unused 'output_var' from 'collect_true'
- Closes #3545
+ Variable 'output_var' is not used and can be removed.
+ Function 'collect_true' renamed to 'count_true'.
-- gnutls: remove call to deprecated gnutls_compression_get_name
+- [Ruslan Baratov brought this change]
+
+ CMake: Remove unused functions
- It has been deprecated by GnuTLS since a year ago and now causes build
- warnings.
+ Closes #2711
+
+- KNOWN_BUGS: Stick to same family over SOCKS proxy
+
+- libssh: goto DISCONNECT state on error, not SSH_SESSION_FREE
- Ref: https://gitlab.com/gnutls/gnutls/commit/b0041897d2846737f5fb0f
- Docs: https://www.gnutls.org/manual/html_node/Compatibility-API.html
+ ... because otherwise not everything get closed down correctly.
- Closes #3636
+ Fixes #2708
+ Closes #2712
-Jay Satiro (2 Mar 2019)
-- system_win32: move win32_init here from easy.c
+- libssh: include line number in state change debug messages
- .. since system_win32 is a more appropriate location for the functions
- and to extern the globals.
+ Closes #2713
+
+- KNOWN_BUGS: Borland support is dropped, AIX problem is too old
+
+- [Jeroen Ooms brought this change]
+
+ example/crawler.c: simple crawler based on libxml2
- Ref: https://github.com/curl/curl/commit/ca597ad#r32446578
- Reported-by: Gisle Vanem
+ Closes #2706
+
+- RELEASE-NOTES: synced
+
+- DEPRECATE: include year when specifying date
+
+- DEPRECATE: linkified
+
+- DEPRECATE: mention the PR that disabled axTLS
+
+- docs/DEPRECATE.md: spelling and minor formatting
+
+- DEPRECATE: new doc describing planned item removals
- Closes https://github.com/curl/curl/pull/3625
+ Closes #2704
-Daniel Stenberg (1 Mar 2019)
-- curl_easy_duphandle.3: clarify that a duped handle has no shares
+- [Gisle Vanem brought this change]
+
+ telnet: fix clang warnings
- Reported-by: Sara Golemon
+ telnet.c(1401,28): warning: cast from function call of type 'int' to
+ non-matching type 'HANDLE' (aka 'void *') [-Wbad-function-cast]
- Fixes #3592
- Closes #3634
+ Fixes #2696
+ Closes #2700
-- 10-at-a-time.c: fix too long line
+- docs: fix missed option name markups
-- [Arnaud Rebillout brought this change]
+- [Gaurav Malhotra brought this change]
- examples: various fixes in ephiperfifo.c
+ openssl: Remove some dead code
- The main change here is the timer value that was wrong, it was given in
- usecs (ms * 1000), while the itimerspec struct wants nsecs (ms * 1000 *
- 1000). This resulted in the callback being invoked WAY TOO OFTEN.
+ Closes #2698
+
+- openssl: make the requested TLS version the *minimum* wanted
- As a quick check you can run this command before and after applying this
- commit:
+ The code treated the set version as the *exact* version to require in
+ the TLS handshake, which is not what other TLS backends do and probably
+ not what most people expect either.
- # shell 1
- ./ephiperfifo 2>&1 | tee ephiperfifo.log
- # shell 2
- echo http://hacking.elboulangero.com > hiper.fifo
+ Reported-by: Andreas Olsson
+ Assisted-by: Gaurav Malhotra
+ Fixes #2691
+ Closes #2694
+
+- RELEASE-NOTES: synced
+
+- openssl: allow TLS 1.3 by default
- Then just compare the size of the logs files.
+ Reported-by: Andreas Olsson
+ Fixes #2692
+ Closes #2693
+
+- [Adrian Peniak brought this change]
+
+ CURLINFO_TLS_SSL_PTR.3: improve the example
- Closes #3633
- Fixes #3632
- Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
+ The previous example was a little bit confusing, because SSL* structure
+ (or other "in use" SSL connection pointer) is not accessible after the
+ transfer is completed, therefore working with the raw TLS library
+ specific pointer needs to be done during transfer.
+
+ Closes #2690
-- urldata: simplify bytecounters
+- travis: add a build using the synchronous name resolver
- - no need to have them protocol specific
+ ... since default uses the threaded one and we test the c-ares build
+ already.
- - no need to set pointers to them with the Curl_setup_transfer() call
+ Closes #2689
+
+- configure: remove CURL_CHECK_NI_WITHSCOPEID too
- - make Curl_setup_transfer() operate on a transfer pointer, not
- connection
+ Since it isn't used either and requires the getnameinfo check
- - switch some counters from long to the more proper curl_off_t type
+ Follow-up to 0aeca41702d2
+
+- getnameinfo: not used
- Closes #3627
+ Closes #2687
-- examples/10-at-a-time.c: improve readability and simplify
+- easy_perform: use *multi_timeout() to get wait times
- - use better variable names to explain their purposes
- - convert logic to curl_multi_wait()
+ ... and trim the threaded Curl_resolver_getsock() to return zero
+ millisecond wait times during the first three milliseconds so that
+ localhost or names in the OS resolver cache gets detected and used
+ faster.
+
+ Closes #2685
-- threaded-resolver: shutdown the resolver thread without error message
+Max Dymond (27 Jun 2018)
+- configure: Add dependent libraries after crypto
- When a transfer is done, the resolver thread will be brought down. That
- could accidentally generate an error message in the error buffer even
- though this is not an error situationand the transfer would still return
- OK. An application that still reads the error buffer could find a
- "Could not resolve host: [host name]" message there and get confused.
+ The linker is pretty dumb and processes things left to right, keeping a
+ tally of symbols it hasn't resolved yet. So, we need -ldl to appear
+ after -lcrypto otherwise the linker won't find the dl functions.
- Reported-by: Michael Schmid
- Fixes #3629
- Closes #3630
+ Closes #2684
-- [Ԝеѕ brought this change]
+Daniel Stenberg (27 Jun 2018)
+- GOVERNANCE: linkify, changed some titles
- docs: update max-redirs.d phrasing
+- GOVERNANCE: add maintainer details/duties
+
+- url: check Curl_conncache_add_conn return code
- clarify redir - "in absurdum" doesn't seem to make sense in this context
+ ... it was previously unchecked in two places and thus errors could
+ remain undetected and cause trouble.
- Closes #3631
+ Closes #2681
-- ssh: fix Condition '!status' is always true
+- include/README: remove "hacking" advice, not the right place
+
+- RELEASE-NOTES: synced
+
+- CURLOPT_SSL_VERIFYPEER.3: fix syntax mistake
- in the same sftp_done function in both SSH backends. Simplify them
- somewhat.
+ Follow-up to b6a16afa0aa5
+
+- netrc: use a larger buffer
- Pointed out by Codacy.
+ ... to work with longer passwords etc. Grow it from a 256 to a 4096
+ bytes buffer.
- Closes #3628
+ Reported-by: Dario Nieuwenhuis
+ Fixes #2676
+ Closes #2680
-- test578: make it read data from the correct test
+- [Patrick Schlangen brought this change]
-- Curl_easy: remove req.maxfd - never used!
+ CURLOPT_SSL_VERIFYPEER.3: Add performance note
- Introduced in 8b6314ccfb, but not used anymore in current code. Unclear
- since when.
+ Closes #2673
+
+- [Javier Blazquez brought this change]
+
+ multi: fix crash due to dangling entry in connect-pending list
- Closes #3626
+ Fixes #2677
+ Closes #2679
-- http: set state.infilesize when sending formposts
+- ConnectionExists: make sure conn->data is set when "taking" a connection
- Without it set, we would unwillingly triger the "HTTP error before end
- of send, stop sending" condition even if the entire POST body had been
- sent (since it wouldn't know the expected size) which would
- unnecessarily log that message and close the connection when it didn't
- have to.
+ Follow-up to 2c15693.
- Reported-by: Matt McClure
- Bug: https://curl.haxx.se/mail/archive-2019-02/0023.html
- Closes #3624
+ Bug #2674
+ Closes #2675
-- INSTALL: refer to the current TLS library names and configure options
+- [Kevin R. Bulgrien brought this change]
-- FAQ: minor updates and spelling fixes
+ system.h: fix for gcc on 32 bit OpenServer
+
+ Bug: https://curl.haxx.se/mail/lib-2018-06/0100.html
-- GOVERNANCE.md: minor spelling fixes
+- [Raphael Gozzo brought this change]
-- Secure Transport: no more "darwinssl"
+ cmake: allow multiple SSL backends
- Everyone calls it Secure Transport, now we do too.
-
- Reviewed-by: Nick Zitzmann
+ This will make possible to select the SSL backend (using
+ curl_global_sslset()) even when the libcurl is built using CMake
- Closes #3619
+ Closes #2665
-Marcel Raad (27 Feb 2019)
-- AppVeyor: add classic MinGW build
+- url: fix dangling conn->data pointer
- But use the MSYS2 shell rather than the default MSYS shell because of
- POSIX path conversion issues. Classic MinGW is only available on the
- Visual Studio 2015 image.
+ By masking sure to use the *current* easy handle with extracted
+ connections from the cache, and make sure to NULLify the ->data pointer
+ when the connection is put into the cache to make this mistake easier to
+ detect in the future.
- Closes https://github.com/curl/curl/pull/3623
+ Reported-by: Will Dietz
+ Fixes #2669
+ Closes #2672
-- AppVeyor: add MinGW-w64 build
+- CURLOPT_INTERFACE.3: interface names not supported on Windows
+
+- travis: run more tests for coverage check
- Add a MinGW-w64 build using CMake's MSYS Makefiles generator.
- Use the Visual Studio 2015 image as it has GCC 8, while the
- Visual Studio 2017 image only has GCC 7.2.
+ ... run a few more tortured based and run all tests event-based.
- Closes https://github.com/curl/curl/pull/3623
+ Closes #2664
-Daniel Stenberg (27 Feb 2019)
-- cookies: only save the cookie file if the engine is enabled
+- multi: fix memory leak when stopped during name resolve
- Follow-up to 8eddb8f4259.
+ When the application just started the transfer and then stops it while
+ the name resolve in the background thread hasn't completed, we need to
+ wait for the resolve to complete and then cleanup data accordingly.
- If the cookieinfo pointer is NULL there really is nothing to save.
+ Enabled test 1553 again and added test 1590 to also check when the host
+ name resolves successfully.
- Without this fix, we got a problem when a handle was using shared object
- with cookies and is told to "FLUSH" it to file (which worked) and then
- the share object was removed and when the easy handle was closed just
- afterwards it has no cookieinfo and no cookies so it decided to save an
- empty jar (overwriting the file just flushed).
-
- Test 1905 now verifies that this works.
+ Detected by OSS-fuzz.
+ Closes #1968
+
+Viktor Szakats (15 Jun 2018)
+- maketgz: delete .bak files, fix indentation
- Assisted-by: Michael Wallner
- Assisted-by: Marcel Raad
+ Ref: https://github.com/curl/curl/pull/2660
- Closes #3621
+ Closes https://github.com/curl/curl/pull/2662
-- [DaVieS brought this change]
+Daniel Stenberg (15 Jun 2018)
+- runtests.pl: remove debug leftover from bb9a340c73f3
- cacertinmem.c: use multiple certificates for loading CA-chain
+- curl-confopts.m4: fix typo from ed224f23d5beb
- Closes #3421
+ Fixes my local configure to detect a custom installed c-ares without
+ pkgconfig.
-- urldata: convert bools to bitfields and move to end
+- docs/RELEASE-PROCEDURE.md: renamed to use .md extension
- This allows the compiler to pack and align the structs better in
- memory. For a rather feature-complete build on x86_64 Linux, gcc 8.1.2
- makes the Curl_easy struct 4.9% smaller. From 6312 bytes to 6000.
+ Closes #2663
+
+- RELEASE-PROCEDURE: gpg sign the tags
+
+- RELEASE-NOTES: synced
+
+- CURLOPT_HTTPAUTH.3: CURLAUTH_BEARER was added in 7.61.0
+
+- [Mamta Upadhyay brought this change]
+
+ maketgz: fix sed issues on OSX
- Removed an unused struct field.
+ maketgz creates release tarballs and removes the -DEV string in curl
+ version (e.g. 7.58.0-DEV), else -DEV shows up on command line when curl
+ is run. maketgz works fine on linux but fails on OSX. Problem is with
+ the sed commands that use option -i without an extension. Maketgz
+ expects GNU sed instead of BSD and this simply won't work on OSX. Adding
+ a backup extension .bak after -i fixes this issue
- No functionality changes.
+ Running the script as if on OSX gives this error:
- Closes #3610
-
-- [Don J Olmstead brought this change]
-
- curl.h: use __has_declspec_attribute for shared builds
+ sed: -e: No such file or directory
- Closes #3616
-
-- curl: display --version features sorted alphabetically
+ Adding a .bak extension resolves it
- Closes #3611
+ Closes #2660
-- runtests: detect "schannel" as an alias for "winssl"
+- configure: enhance ability to detect/build with static openssl
- Follow-up to 180501cb02
+ Fix the -ldl and -ldl + -lpthread checks for OpenSSL, necessary for
+ building with static libs without pkg-config.
Reported-by: Marcel Raad
- Fixes #3609
- Closes #3620
+ Fixes #2199
+ Closes #2659
-Marcel Raad (26 Feb 2019)
-- AppVeyor: update to Visual Studio 2017
+- configure: use pkg-config for c-ares detection
- Switch all Visual Studio 2015 builds to Visual Studio 2017. It's not a
- moving target anymore as the last update, Update 9, has been released.
+ First check if there's c-ares information given as pkg-config info and use
+ that as first preference.
- Closes https://github.com/curl/curl/pull/3606
+ Reported-by: pszemus on github
+ Fixes #2203
+ Closes #2658
-- AppVeyor: switch VS 2015 builds to VS 2017 image
-
- The Visual Studio 2017 image has Visual Studio 2015 and 2017 installed.
+- GOVERNANCE.md: explains how this project is run
- Closes https://github.com/curl/curl/pull/3606
+ Closes #2657
-- AppVeyor: explicitly select worker image
+- KNOWN_BUGS: NTLM doen't support password with § character
- Currently, we're using the default Visual Studio 2015 image for
- everything.
+ Closes #2120
+
+- KNOWN_BUGS: slow connect to localhost on Windows
- Closes https://github.com/curl/curl/pull/3606
+ Closes #2281
-Daniel Stenberg (26 Feb 2019)
-- strerror: make the strerror function use local buffers
+- [Matteo Bignotti brought this change]
+
+ mk-ca-bundle.pl: make -u delete certdata.txt if found not changed
- Instead of using a fixed 256 byte buffer in the connectdata struct.
+ certdata.txt should be deleted also when the process is interrupted by
+ "same certificate downloaded, exiting"
- In my build, this reduces the size of the connectdata struct by 11.8%,
- from 2160 to 1904 bytes with no functionality or performance loss.
+ The certdata.txt is currently kept on disk even if you give the -u
+ option
- This also fixes a bug in schannel's Curl_verify_certificate where it
- called Curl_sspi_strerror when it should have called Curl_strerror for
- string from GetLastError. the only effect would have been no text or the
- wrong text being shown for the error.
+ Closes #2655
+
+- progress: remove a set of unused defines
- Co-authored-by: Jay Satiro
+ Reported-by: Peter Wu
+ Closes #2654
+
+- TODO: "Option to refuse usernames in URLs" done
- Closes #3612
+ Implemented by Björn in 946ce5b61f
-- [Michael Wallner brought this change]
+- [Lyman Epp brought this change]
- cookies: fix NULL dereference if flushing cookies with no CookieInfo set
-
- Regression brought by a52e46f3900fb0 (shipped in 7.63.0)
+ Curl_init_do: handle NULL connection pointer passed in
- Closes #3613
+ Closes #2653
-Marcel Raad (26 Feb 2019)
-- AppVeyor: re-enable test 500
+- runtests: support variables in <strippart>
- It's passing now.
+ ... and make use of that to make 1455 work better without using a fixed
+ local port number.
- Closes https://github.com/curl/curl/pull/3615
+ Fixes #2649
+ Closes #2650
-- AppVeyor: remove redundant builds
+- Curl_debug: remove dead printhost code
- Remove the Visual Studio 2012 and 2013 builds as they add little value.
+ The struct field is never set (since 5e0d9aea3) so remove the use of it
+ and remove the connectdata pointer from the prototype.
- Ref: https://github.com/curl/curl/pull/3606
- Closes https://github.com/curl/curl/pull/3614
-
-Daniel Stenberg (25 Feb 2019)
-- RELEASE-NOTES: synced
-
-- [Bernd Mueller brought this change]
+ Reported-by: Tejas
+ Bug: https://curl.haxx.se/mail/lib-2018-06/0054.html
+ Closes #2647
- OpenSSL: add support for TLS ASYNC state
+Viktor Szakats (12 Jun 2018)
+- schannel: avoid incompatible pointer warning
- Closes #3591
+ with clang-6.0:
+ ```
+ vtls/schannel_verify.c: In function 'add_certs_to_store':
+ vtls/schannel_verify.c:212:30: warning: passing argument 11 of 'CryptQueryObject' from incompatible pointer type [-Wincompatible-pointer-types]
+ &cert_context)) {
+ ^
+ In file included from /usr/share/mingw-w64/include/schannel.h:10:0,
+ from /usr/share/mingw-w64/include/schnlsp.h:9,
+ from vtls/schannel.h:29,
+ from vtls/schannel_verify.c:40:
+ /usr/share/mingw-w64/include/wincrypt.h:4437:26: note: expected 'const void **' but argument is of type 'CERT_CONTEXT ** {aka struct _CERT_CONTEXT **}'
+ WINIMPM WINBOOL WINAPI CryptQueryObject (DWORD dwObjectType, const void *pvObject, DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags, DWORD dwFlags,
+ ^~~~~~~~~~~~~~~~
+ ```
+ Ref: https://msdn.microsoft.com/library/windows/desktop/aa380264
+
+ Closes https://github.com/curl/curl/pull/2648
-Jay Satiro (25 Feb 2019)
-- [Michael Felt brought this change]
+Daniel Stenberg (12 Jun 2018)
+- [Robert Prag brought this change]
- acinclude: add additional libraries to check for LDAP support
+ schannel: support selecting ciphers
- - Add an additional check for LDAP that also checks for OpenSSL since
- on AIX those libraries may be required to link LDAP properly.
+ Given the contstraints of SChannel, I'm exposing these as the algorithms
+ themselves instead; while replicating the ciphersuite as specified by
+ OpenSSL would have been preferable, I found no way in the SChannel API
+ to do so.
- Fixes https://github.com/curl/curl/issues/3595
- Closes https://github.com/curl/curl/pull/3596
+ To use this from the commandline, you need to pass the names of contants
+ defining the desired algorithms. For example, curl --ciphers
+ "CALG_SHA1:CALG_RSA_SIGN:CALG_RSA_KEYX:CALG_AES_128:CALG_DH_EPHEM"
+ https://github.com The specific names come from wincrypt.h
+
+ Closes #2630
-- [Giorgos Oikonomou brought this change]
+- [Bernhard M. Wiedemann brought this change]
- schannel: support CALG_ECDH_EPHEM algorithm
+ test 46: make test pass after 2025
- Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
- algorithm option when selecting ciphers. This became available on the
- Win10 SDK.
-
- Closes https://github.com/curl/curl/pull/3608
-
-Daniel Stenberg (24 Feb 2019)
-- multi: call multi_done on connect timeouts
+ shifting the expiry date to 2037 for now
+ to be before the possibly problematic year 2038
- Failing to do so would make the CURLINFO_TOTAL_TIME timeout to not get
- updated correctly and could end up getting reported to the application
- completely wrong (way too small).
+ similar in spirit to commit e6293cf8764e9eecb
- Reported-by: accountantM on github
- Fixes #3602
- Closes #3605
+ Closes #2646
-- examples: remove recursive calls to curl_multi_socket_action
-
- From within the timer callbacks. Recursive is problematic for several
- reasons. They should still work, but this way the examples and the
- documentation becomes simpler. I don't think we need to encourage
- recursive calls.
-
- Discussed in #3537
- Closes #3601
+- [Marian Klymov brought this change]
-Marcel Raad (23 Feb 2019)
-- configure: remove CURL_CHECK_FUNC_FDOPEN call
+ cppcheck: fix warnings
- The macro itself has been removed in commit
- 11974ac859c5d82def59e837e0db56fef7f6794e.
+ - Get rid of variable that was generating false positive warning
+ (unitialized)
- Closes https://github.com/curl/curl/pull/3604
-
-Daniel Stenberg (23 Feb 2019)
-- wolfssl: stop custom-adding curves
+ - Fix issues in tests
- since wolfSSL PR https://github.com/wolfSSL/wolfssl/pull/717 (shipped in
- wolfSSL 3.10.2 and later) it sends these curves by default already.
+ - Reduce scope of several variables all over
- Pointed-out-by: David Garske
+ etc
- Closes #3599
+ Closes #2631
-- configure: remove the unused fdopen macro
+- openssl: assume engine support in 1.0.1 or later
- and the two remaining #ifdefs for it
-
- Closes #3600
-
-Jay Satiro (22 Feb 2019)
-- url: change conn shutdown order to unlink data as last step
+ Previously it was checked for in configure/cmake, but that would then
+ leave other build systems built without engine support.
- - Split off connection shutdown procedure from Curl_disconnect into new
- function conn_shutdown.
+ While engine support probably existed prior to 1.0.1, I decided to play
+ safe. If someone experience a problem with this, we can widen the
+ version check.
- - Change the shutdown procedure to close the sockets before
- disassociating the transfer.
+ Fixes #2641
+ Closes #2644
+
+- RELEASE-NOTES: synced
+
+- RELEASE-PROCEDURE: update the release calendar for 2019
+
+- [Gisle Vanem brought this change]
+
+ boringssl + schannel: undef X509_NAME in lib/schannel.h
- Prior to this change the sockets were closed after disassociating the
- transfer so SOCKETFUNCTION wasn't called since the transfer was already
- disassociated. That likely came about from recent work started in
- Jan 2019 (#3442) to separate transfers from connections.
+ Fixes the build problem when both boringssl and schannel are enabled.
- Bug: https://curl.haxx.se/mail/lib-2019-02/0101.html
- Reported-by: Pavel Löbl
+ Fixes #2634
+ Closes #2643
+
+- [Vladimir Kotal brought this change]
+
+ mk-ca-bundle.pl: leave certificate name untouched in decode()
- Closes https://github.com/curl/curl/issues/3597
- Closes https://github.com/curl/curl/pull/3598
+ Closes #2640
-Marcel Raad (22 Feb 2019)
-- Fix strict-prototypes GCC warning
+- [Rikard Falkeborn brought this change]
+
+ tests/libtests/Makefile.am: Add lib1521.c to CLEANFILES
- As seen in the MinGW autobuilds. Caused by commit
- f26bc29cfec0be84c67cf74065cf8e5e78fd68b7.
+ This removes the generated lib1521.c when running make clean.
+
+ Closes #2633
-Dan Fandrich (21 Feb 2019)
-- tests: Fixed XML validation errors in some test files.
+- [Rikard Falkeborn brought this change]
-Daniel Stenberg (20 Feb 2019)
-- TODO: Allow SAN names in HTTP/2 server push
+ tests/libtest: Add lib1521 to nodist_SOURCES
- Suggested-by: Nicolas Grekas
+ Since 467da3af0, lib1521.c is generated instead of checked in. According
+ to the commit message, the intention was to remove it from the tarball
+ as well. However, it is still present when running make dist. To remove
+ it, add it to nodist_lib1521_SOURCES. This also means there is no need
+ for the manually added dist-rule in the Makefile.
+
+ Also update CMakelists.txt to handle the fact that we now may have
+ nodist_SOURCES.
-- RELEASE-NOTES: synced
+- [Stephan Mühlstrasser brought this change]
-- curl: remove MANUAL from -M output
+ system.h: add support for IBM xlc C compiler
- ... and remove it from the dist tarball. It has served its time, it
- barely gets updated anymore and "everything curl" is now convering all
- this document once tried to include, and does it more and better.
+ Added a section to system.h guarded with __xlc__ for the IBM xml C
+ compiler. Before this change the section titled 'generic "safe guess" on
+ old 32 bit style' was used, which resulted in a wrong definition of
+ CURL_TYPEOF_CURL_SOCKLEN_T, and for 64-bit also CURL_TYPEOF_CURL_OFF_T
+ was wrong.
- In the compressed scenario, this removes ~15K data from the binary,
- which is 25% of the -M output.
+ Compilation warnings fixed with this change:
- It remains in the git repo for now for as long as the web site builds a
- page using that as source. It renders poorly on the site (especially for
- mobile users) so its not even good there.
+ CC libcurl_la-ftp.lo
+ "ftp.c", line 290.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "ftp.c", line 293.48: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "ftp.c", line 1070.49: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "ftp.c", line 1154.53: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "ftp.c", line 1187.51: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ CC libcurl_la-connect.lo
+ "connect.c", line 448.56: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "connect.c", line 516.66: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "connect.c", line 687.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ "connect.c", line 696.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+ CC libcurl_la-tftp.lo
+ "tftp.c", line 1115.33: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
- Closes #3587
+ Closes #2637
-- http2: verify :athority in push promise requests
+- cmdline-opts/cert-type.d: mention "p12" as a recognized type as well
+
+Viktor Szakats (3 Jun 2018)
+- spelling fixes
- RFC 7540 says we should verify that the push is for an "authoritative"
- server. We make sure of this by only allowing push with an :athority
- header that matches the host that was asked for in the URL.
+ Detected using the `codespell` tool (version 1.13.0).
- Fixes #3577
- Reported-by: Nicolas Grekas
- Bug: https://curl.haxx.se/mail/lib-2019-02/0057.html
- Closes #3581
+ Also secure and fix an URL.
-- singlesocket: fix the 'sincebefore' placement
+Daniel Stenberg (2 Jun 2018)
+- axtls: follow-up spell fix of comment
+
+- axTLS: not considered fit for use
- The variable wasn't properly reset within the loop and thus could remain
- set for sockets that hadn't been set before and miss notifying the app.
+ URL: https://curl.haxx.se/mail/lib-2018-06/0000.html
- This is a follow-up to 4c35574 (shipped in curl 7.64.0)
+ This is step one. It adds #error statements that require source edits to
+ make curl build again if asked to use axTLS. At a later stage we might
+ remove the axTLS specific code completely.
- Reported-by: buzo-ffm on github
- Detected-by: Jan Alexander Steffens
- Fixes #3585
- Closes #3589
+ Closes #2628
-- connection: never reuse CONNECT_ONLY conections
+- build: remove the Borland specific makefiles
- and make CONNECT_ONLY conections never reuse any existing ones either.
+ According to the user survey 2018, not even one out of 670 users use
+ them. Nobody on the mailing list spoke up for them either.
- Reported-by: Pavel Löbl
- Bug: https://curl.haxx.se/mail/lib-2019-02/0064.html
- Closes #3586
+ Closes #2629
-Patrick Monnerat (19 Feb 2019)
-- cli tool: fix mime post with --disable-libcurl-option configure option
+- curl_addrinfo: use same #ifdef conditions in source as header
- Reported-by: Marcel Raad
- Fixes #3576
- Closes #3583
+ ... for curl_dofreeaddrinfo
-Daniel Stenberg (19 Feb 2019)
-- x509asn1: cleanup and unify code layout
-
- - rename 'n' to buflen in functions, and use size_t for them. Don't pass
- in negative buffer lengths.
+- multi: remove a DEBUGF()
- - move most function comments to above the function starts like we use
- to
-
- - remove several unnecessary typecasts (especially of NULL)
+ ... it might call infof() with a NULL first argument that isn't harmful
+ but makes it not do anything. The infof() line is not very useful
+ anymore, it has served it purpose. Good riddance!
- Reviewed-by: Patrick Monnerat
- Closes #3582
+ Fixes #2627
-- curl_multi_remove_handle.3: use at any time, just not from within callbacks
-
- [ci skip]
+- [Alibek.Jorajev brought this change]
-- http: make adding a blank header thread-safe
-
- Previously the function would edit the provided header in-place when a
- semicolon is used to signify an empty header. This made it impossible to
- use the same set of custom headers in multiple threads simultaneously.
+ CURLOPT_RESOLVE: always purge old entry first
- This approach now makes a local copy when it needs to edit the string.
+ If there's an existing entry using the selected name.
- Reported-by: d912e3 on github
- Fixes #3578
- Closes #3579
+ Closes #2622
-- unit1651: survive curl_easy_init() fails
-
-- [Frank Gevaerts brought this change]
-
- rand: Fix a mismatch between comments in source and header.
+- fnmatch: use the system one if available
- Reported-by: Björn Stenberg <bjorn@haxx.se>
- Closes #3584
-
-Patrick Monnerat (18 Feb 2019)
-- x509asn1: replace single char with an array
+ If configure detects fnmatch to be available, use that instead of our
+ custom one for FTP wildcard pattern matching. For standard compliance,
+ to reduce our footprint and to use already well tested and well
+ exercised code.
- Although safe in this context, using a single char as an array may
- cause invalid accesses to adjacent memory locations.
+ A POSIX fnmatch behaves slightly different than the internal function
+ for a few test patterns currently and the macOS one yet slightly
+ different. Test case 1307 is adjusted for these differences.
- Detected by Coverity.
+ Closes #2626
-Daniel Stenberg (18 Feb 2019)
-- examples/http2-serverpush: add some sensible error checks
+Patrick Monnerat (31 May 2018)
+- os400: add new option in ILE/RPG binding
- To avoid NULL pointer dereferences etc in the case of problems.
+ Follow-up to commit 946ce5b
+
+Daniel Stenberg (31 May 2018)
+- tests/libtest/.gitignore: follow-up fix to ignore lib5* too
+
+- KNOWN_BUGS: CURL_GLOBAL_SSL
- Closes #3580
+ Closes #2276
-Jay Satiro (18 Feb 2019)
-- easy: fix win32 init to work without CURL_GLOBAL_WIN32
+- [Bernhard Walle brought this change]
+
+ configure: check for declaration of getpwuid_r
- - Change the behavior of win32_init so that the required initialization
- procedures are not affected by CURL_GLOBAL_WIN32 flag.
+ On our x86 Android toolchain, getpwuid_r is implemented but the header
+ is missing:
- libcurl via curl_global_init supports initializing for win32 with an
- optional flag CURL_GLOBAL_WIN32, which if omitted was meant to stop
- Winsock initialization. It did so internally by skipping win32_init()
- when that flag was set. Since then win32_init() has been expanded to
- include required initialization routines that are separate from
- Winsock and therefore must be called in all cases. This commit fixes
- it so that CURL_GLOBAL_WIN32 only controls the optional win32
- initialization (which is Winsock initialization, according to our doc).
-
- The only users affected by this change are those that don't pass
- CURL_GLOBAL_WIN32 to curl_global_init. For them this commit removes the
- risk of a potential crash.
+ netrc.c:81:7: error: implicit declaration of function 'getpwuid_r' [-Werror=implicit-function-declaration]
- Ref: https://github.com/curl/curl/pull/3573
+ Unfortunately, the function is used in curl_ntlm_wb.c, too, so I moved
+ the prototype to curl_setup.h.
- Fixes https://github.com/curl/curl/issues/3313
- Closes https://github.com/curl/curl/pull/3575
+ Signed-off-by: Bernhard Walle <bernhard@bwalle.de>
+ Closes #2609
-Daniel Gustafsson (17 Feb 2019)
-- cookie: Add support for cookie prefixes
+- [Rikard Falkeborn brought this change]
+
+ tests: update .gitignore for libtests
- The draft-ietf-httpbis-rfc6265bis-02 draft, specify a set of prefixes
- and how they should affect cookie initialization, which has been
- adopted by the major browsers. This adds support for the two prefixes
- defined, __Host- and __Secure, and updates the testcase with the
- supplied examples from the draft.
+ Closes #2624
+
+- [Rikard Falkeborn brought this change]
+
+ strictness: correct {infof, failf} format specifiers
- Closes #3554
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #2623
-- mbedtls: release sessionid resources on error
+- [Björn Stenberg brought this change]
+
+ option: disallow username in URL
- If mbedtls_ssl_get_session() fails, it may still have allocated
- memory that needs to be freed to avoid leaking. Call the library
- API function to release session resources on this errorpath as
- well as on Curl_ssl_addsessionid() errors.
+ Adds CURLOPT_DISALLOW_USERNAME_IN_URL and --disallow-username-in-url. Makes
+ libcurl reject URLs with a username in them.
- Closes: #3574
- Reported-by: Michał Antoniak <M.Antoniak@posnet.com>
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Patrick Monnerat (16 Feb 2019)
-- cli tool: refactor encoding conversion sequence for switch case fallthrough.
+ Closes #2340
-- version.c: silent scan-build even when librtmp is not enabled
+- libcurl-security.3: improved layout for two rememdy lists
-Daniel Stenberg (15 Feb 2019)
-- RELEASE-NOTES: synced
+- libcurl-security.3: refer to URL instead of in-source markdown file
-- Curl_now: figure out windows version in win32_init
-
- ... and avoid use of static variables that aren't thread safe.
+Viktor Szakats (30 May 2018)
+- curl.rc: embed manifest for correct Windows version detection
- Fixes regression from e9ababd4f5a (present in the 7.64.0 release)
+ * enable it in `src/Makefile.m32`
+ * enable it in `winbuild/MakefileBuild.vc` if a custom manifest is
+ _not_ enabled via the existing `EMBED_MANIFEST` option
+ * enable it for all Windows CMake builds (also disable the built-in
+ minimal manifest, added by CMake by default.)
- Reported-by: Paul Groke
- Fixes #3572
- Closes #3573
-
-Marcel Raad (15 Feb 2019)
-- unit1307: just fail without FTP support
+ For other build systems, add the `-DCURL_EMBED_MANIFEST` option to
+ the list of RC (Resource Compiler) flags to enable the manifest
+ included in `src/curl.rc`. This may require to disable whatever
+ automatic or other means in which way another manifest is added to
+ `curl.exe`.
- I missed to check this in with commit
- 71786c0505926aaf7e9b2477b2fb7ee16a915ec6, which only disabled the test.
- This fixes the actual linker error.
+ Notice that Borland C doesn't support this method due to a
+ long-pending resource compiler bug. Watcom C may also not handle
+ it correctly when the `-zm` `wrc` option is used (this option may
+ be unnecessary though) and regardless of options in certain earlier
+ revisions of the 2.0 beta version.
- Closes https://github.com/curl/curl/pull/3568
+ Closes https://github.com/curl/curl/pull/1221
+ Fixes https://github.com/curl/curl/issues/2591
-Daniel Stenberg (15 Feb 2019)
-- travis: enable valgrind for the iconv tests too
-
- Closes #3571
+Patrick Monnerat (30 May 2018)
+- os400: sync EBCDIC wrappers and ILE/RPG binding with latest options
-- travis: add scan-build
+- os400: implement mime api EBCDIC wrappers
- Closes #3564
+ Also sync ILE/RPG binding to define the new functions.
-- examples/sftpuploadresume: Value stored to 'result' is never read
+Daniel Stenberg (29 May 2018)
+- setopt: add TLS 1.3 ciphersuites
- Detected by scan-build
-
-- examples/http2-upload: cleaned up
+ Adds CURLOPT_TLS13_CIPHERS and CURLOPT_PROXY_TLS13_CIPHERS.
- Fix scan-build warnings, no globals, no silly handle scan. Also remove
- handles from the multi before cleaning up.
-
-- examples/http2-download: cleaned up
+ curl: added --tls13-ciphers and --proxy-tls13-ciphers
- To avoid scan-build warnings and global variables.
+ Fixes #2435
+ Reported-by: zzq1015 on github
+ Closes #2607
-- examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory'
+- configure: override AR_FLAGS to silence warning
- Detected by scan-build
-
-- examples/httpcustomheader: Value stored to 'res' is never read
+ The automake default ar flags are 'cru', but the 'u' flag in there
+ causes warnings on many modern Linux distros. Removing 'u' may have a
+ minor performance impact on older distros but should not cause harm.
- Detected by scan-build
-
-- examples: remove superfluous null-pointer checks
+ Explained on the automake mailing list already back in April 2015:
- in ftpget, ftpsget and sftpget, so that scan-build stops warning for
- potential NULL pointer dereference below!
+ https://www.mail-archive.com/automake-patches@gnu.org/msg07705.html
- Detected by scan-build
+ Reported-by: elephoenix on github
+ Fixes #2617
+ Closes #2619
-- strip_trailing_dot: make sure NULL is never used for strlen
+Sergei Nikulov (29 May 2018)
+- cmake: fixed comments in compile checks code
+
+Daniel Stenberg (29 May 2018)
+- INSTALL: LDFLAGS=-Wl,-R/usr/local/ssl/lib
- scan-build warning: Null pointer passed as an argument to a 'nonnull'
- parameter
+ ... the older description doesn't work
+
+ Reported-by: Peter Varga
+ Fixes #2615
+ Closes #2616
-- [Jay Satiro brought this change]
+- [Will Dietz brought this change]
- connection_check: restore original conn->data after the check
+ KNOWN_BUGS: restore text regarding #2101.
- - Save the original conn->data before it's changed to the specified
- data transfer for the connection check and then restore it afterwards.
+ This was added earlier but appears to have been removed accidentally.
- This is a follow-up to 38d8e1b 2019-02-11.
+ AFAICT this is very much still an issue.
- History:
+ -----
- It was discovered a month ago that before checking whether to extract a
- dead connection that that connection should be associated with a "live"
- transfer for the check (ie original conn->data ignored and set to the
- passed in data). A fix was landed in 54b201b which did that and also
- cleared conn->data after the check. The original conn->data was not
- restored, so presumably it was thought that a valid conn->data was no
- longer needed.
+ I say "accidentally" because the text seems to have harmlessly snuck
+ into [1] (which makes no mention of it). [1] was later reverted for
+ unspecified reasons in [2], presumably because the mentioned issue was
+ fixed or invalid.
- Several days later it was discovered that a valid conn->data was needed
- after the check and follow-up fix was landed in bbae24c which partially
- reverted the original fix and attempted to limit the scope of when
- conn->data was changed to only when pruning dead connections. In that
- case conn->data was not cleared and the original conn->data not
- restored.
+ [1] de9fac00c40db321d44fa6fbab6eb62ec4c83998
+ [2] 16d1f369403cbb04bd7b085eabbeebf159473fc2
- A month later it was discovered that the original fix was somewhat
- correct; a "live" transfer is needed for the check in all cases
- because original conn->data could be null which could cause a bad deref
- at arbitrary points in the check. A fix was landed in 38d8e1b which
- expanded the scope to all cases. conn->data was not cleared and the
- original conn->data not restored.
+ Closes #2618
+
+- fnmatch: insist on escaped bracket to match
- A day later it was discovered that not restoring the original conn->data
- may lead to busy loops in applications that use the event interface, and
- given this observation it's a pretty safe assumption that there is some
- code path that still needs the original conn->data. This commit is the
- follow-up fix for that, it restores the original conn->data after the
- connection check.
+ A non-escaped bracket ([) is for a character group - as documented. It
+ will *not* match an individual bracket anymore. Test case 1307 updated
+ accordingly to match.
- Assisted-by: tholin@users.noreply.github.com
- Reported-by: tholin@users.noreply.github.com
+ Problem detected by OSS-Fuzz, although this fix is probably not a final
+ fix for the notorious timeout issues.
- Fixes https://github.com/curl/curl/issues/3542
- Closes #3559
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8525
+ Closes #2614
-- memdebug: bring back curl_mark_sclose
+Patrick Monnerat (28 May 2018)
+- psl: use latest psl and refresh it periodically
- Used by debug builds with NSS.
+ The latest psl is cached in the multi or share handle. It is refreshed
+ before use after 72 hours.
+ New share lock CURL_LOCK_DATA_PSL controls the psl cache sharing.
+ If the latest psl is not available, the builtin psl is used.
- Reverted from 05b100aee247bb
+ Reported-by: Yaakov Selkowitz
+ Fixes #2553
+ Closes #2601
-Patrick Monnerat (14 Feb 2019)
-- transfer.c: do not compute length of undefined hex buffer.
+Daniel Stenberg (28 May 2018)
+- [Fabrice Fontaine brought this change]
+
+ configure: fix ssh2 linking when built with a static mbedtls
- On non-ascii platforms, the chunked hex header was measured for char code
- conversion length, even for chunked trailers that do not have an hex header.
- In addition, the efective length is already known: use it.
- Since the hex length can be zero, only convert if needed.
+ The ssh2 pkg-config file could contain the following lines when build
+ with a static version of mbedtls:
+ Libs: -L${libdir} -lssh2 /xxx/libmbedcrypto.a
+ Libs.private: /xxx/libmbedcrypto.a
- Reported by valgrind.
-
-Daniel Stenberg (14 Feb 2019)
-- KNOWN_BUGS: Cannot compile against a static build of OpenLDAP
+ This static mbedtls library must be used to correctly detect ssh2
+ support and this library must be copied in libcurl.pc otherwise
+ compilation of any application (such as upmpdcli) with libcurl will fail
+ when trying to found mbedtls functions included in libssh2. So, replace
+ pkg-config --libs-only-l by pkg-config --libs.
- Closes #2367
-
-Patrick Monnerat (14 Feb 2019)
-- x509asn1: "Dereference of null pointer"
+ Fixes:
+ - http://autobuild.buildroot.net/results/43e24b22a77f616d6198c10435dcc23cc3b9088a
- Detected by scan-build (false positive).
+ Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+ Closes #2613
-Daniel Stenberg (14 Feb 2019)
-- configure: show features as well in the final summary
-
- Closes #3569
+- RELEASE-NOTES: synced
-- KNOWN_BUGS: curl compiled on OSX 10.13 failed to run on OSX 10.10
-
- Closes #2905
+- [Bernhard Walle brought this change]
-- KNOWN_BUGS: Deflate error after all content was received
+ cmake: check for getpwuid_r
- Closes #2719
+ The autotools-based build system does it, so we do it also in CMake.
+
+ Bug: #2609
+ Signed-off-by: Bernhard Walle <bernhard@bwalle.de>
-- gssapi: fix deprecated header warnings
+- cmdline-opts/gen.pl: warn if mutexes: or see-also: list non-existing options
+
+- [Frank Gevaerts brought this change]
+
+ curl.1: Fix cmdline-opts reference errors.
- Heimdal includes on FreeBSD spewed out lots of them. Less so now.
+ --data, --form, and --ntlm were declared to be mutually exclusive with
+ non-existing options. --data and --form referred to --upload (which is
+ short for --upload-file and therefore did work, so this one was merely
+ a bit confusing), --ntlm referred to --negotiated instead of --negotiate.
- Closes #3566
+ Closes #2612
-- TODO: Upgrade to websockets
-
- Closes #3523
+- [Frank Gevaerts brought this change]
-- TODO: cmake test suite improvements
+ docs: fix cmdline-opts metadata headers case consistency.
- Closes #3109
+ Almost all headers start with an uppercase letter, but some didn't.
-Patrick Monnerat (13 Feb 2019)
-- curl: "Dereference of null pointer"
-
- Rephrase to satisfy scan-build.
+- mailmap: Max Savenkov
-Marcel Raad (13 Feb 2019)
-- unit1307: require FTP support
-
- This test doesn't link without FTP support after
- fc7ab4835b5fd09d0a6f57000633bb6bb6edfda1, which made Curl_fnmatch
- unavailable without FTP support.
-
- Closes https://github.com/curl/curl/pull/3565
+Sergei Nikulov (28 May 2018)
+- [Max Savenkov brought this change]
-Daniel Stenberg (13 Feb 2019)
-- TODO: TFO support on Windows
-
- Nobody works on this now.
-
- Closes #3378
+ Fix the test for fsetxattr and strerror_r tests in CMake to work without compiling
-- multi: Dereference of null pointer
-
- Mostly a false positive, but this makes the code easier to read anyway.
-
- Detected by scan-build.
-
- Closes #3563
+Daniel Stenberg (27 May 2018)
+- mailmap: a Richard Alcock fixup
-- urlglob: Argument with 'nonnull' attribute passed null
+- [Richard Alcock brought this change]
+
+ schannel: add failf calls for client certificate failures
- Detected by scan-build.
+ Closes #2604
-Jay Satiro (12 Feb 2019)
-- schannel: restore some debug output but only for debug builds
+- [Richard Alcock brought this change]
+
+ winbuild: In MakefileBuild.vc fix typo DISTDIR->DIRDIST
- Follow-up to 84c10dc from earlier today which wrapped a lot of the noisy
- debug output in DEBUGF but omitted a few lines.
+ Change requirement from $(DISTDIR) to $(DIRDIST)
- Ref: https://github.com/curl/curl/commit/84c10dc#r32292900
+ closes #2603
-- examples/crawler: Fix the Accept-Encoding setting
+- [Richard Alcock brought this change]
+
+ winbuild: only delete OUTFILE if it exists
- - Pass an empty string to CURLOPT_ACCEPT_ENCODING to use the default
- supported encodings.
+ This removes the slightly annoying "Could not file LIBCURL_OBJS.inc" and
+ "Could not find CURL_OBJS.inc.inc" message when building into a clean
+ folder.
- Prior to this change the specific encodings of gzip and deflate were set
- but there's no guarantee they'd be supported by the user's libcurl.
+ closes #2602
-Daniel Stenberg (12 Feb 2019)
-- mime: put the boundary buffer into the curl_mime struct
+- [Alejandro R. Sedeño brought this change]
+
+ content_encoding: handle zlib versions too old for Z_BLOCK
- ... instead of allocating it separately and point to it. It is
- fixed-size and always used for each part.
+ Fallback on Z_SYNC_FLUSH when Z_BLOCK is not available.
- Closes #3561
+ Fixes #2606
+ Closes #2608
-- schannel: be quiet
+- multi: provide a socket to wait for in Curl_protocol_getsock
- Convert numerous infof() calls into debug-build only messages since they
- are annoyingly verbose for regular applications. Removed a few.
+ ... even when there's no protocol specific handler setup.
- Bug: https://curl.haxx.se/mail/lib-2019-02/0027.html
- Reported-by: Volker Schmid
- Closes #3552
+ Bug: https://curl.haxx.se/mail/lib-2018-05/0062.html
+ Reported-by: Sean Miller
+ Closes #2600
-- [Romain Geissler brought this change]
+- [Linus Lewandowski brought this change]
- Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning
+ httpauth: add support for Bearer tokens
- Closes #3562
+ Closes #2102
-- http2: multi_connchanged() moved from multi.c, only used for h2
+- TODO: CURLINFO_PAUSE_STATE
- Closes #3557
+ Closes #2588
-- curl: "Function call argument is an uninitialized value"
+Sergei Nikulov (24 May 2018)
+- cmake: set -d postfix for debug builds if not specified
+ using -DCMAKE_DEBUG_POSTFIX explicitly
- Follow-up to cac0e4a6ad14b42471eb
-
- Detected by scan-build
- Closes #3560
+ fixes #2121, obsoletes #2384
-- pretransfer: don't strlen() POSTFIELDS set for GET requests
+Daniel Stenberg (23 May 2018)
+- configure: add basic test of --with-ssl prefix
- ... since that data won't be used in the request anyway.
+ When given a prefix, the $PREFIX_OPENSSL/lib/openssl.pc or
+ $PREFIX_OPENSSL/include/openssl/ssl.h files must be present or cause an
+ error. Helps users detect when giving configure the wrong path.
- Fixes #3548
- Reported-by: Renaud Allard
- Close #3549
+ Reported-by: Oleg Pudeyev
+ Assisted-by: Per Malmberg
+ Fixes #2580
-- multi: remove verbose "Expire in" ... messages
+Patrick Monnerat (22 May 2018)
+- http resume: skip body if http code 416 (range error) is ignored.
- Reported-by: James Brown
- Bug: https://curl.haxx.se/mail/archive-2019-02/0013.html
- Closes #3558
-
-- mbedtls: make it build even if MBEDTLS_VERSION_C isn't set
+ This avoids appending error data to already existing good data.
- Reported-by: MAntoniak on github
- Fixes #3553
- Closes #3556
-
-Daniel Gustafsson (12 Feb 2019)
-- non-ascii.c: fix typos in comments
+ Test 92 is updated to match this change.
+ New test 1156 checks all combinations of --range/--resume, --fail,
+ Content-Range header and http status code 200/416.
- Fix two occurrences of s/convers/converts/ spotted while reading code.
+ Fixes #1163
+ Reported-By: Ithubg on github
+ Closes #2578
-Daniel Stenberg (12 Feb 2019)
-- fnmatch: disable if FTP is disabled
-
- Closes #3551
+Daniel Stenberg (22 May 2018)
+- tftp: make sure error is zero terminated before printfing it
-- curl_path: only enabled for SSH builds
+- configure: add missing m4/ax_compile_check_sizeof.m4
+
+ follow-up to mistake in 6876ccf90b4
-- [Frank Gevaerts brought this change]
+Jay Satiro (22 May 2018)
+- [Johannes Schindelin brought this change]
- tests: add stderr comparison to the test suite
+ schannel: make CAinfo parsing resilient to CR/LF
- The code is more or less copied from the stdout comparison code, maybe
- some better reuse is possible.
+ OpenSSL has supported --cacert for ages, always accepting LF-only line
+ endings ("Unix line endings") as well as CR/LF line endings ("Windows
+ line endings").
- test 1457 is adjusted to make the output actually match (by using --silent)
- test 506 used <stderr> without actually needing it, so that <stderr> block is removed
+ When we introduced support for --cacert also with Secure Channel (or in
+ cURL speak: "WinSSL"), we did not take care to support CR/LF line
+ endings, too, even if we are much more likely to receive input in that
+ form when using Windows.
- Closes #3536
-
-Patrick Monnerat (11 Feb 2019)
-- cli tool: do not use mime.h private structures.
+ Let's fix that.
- Option -F generates an intermediate representation of the mime structure
- that is used later to create the libcurl mime structure and generate
- the --libcurl statements.
+ Happily, CryptQueryObject(), the function we use to parse the ca-bundle,
+ accepts CR/LF input already, and the trailing LF before the END
+ CERTIFICATE marker catches naturally any CR/LF line ending, too. So all
+ we need to care about is the BEGIN CERTIFICATE marker. We do not
+ actually need to verify here that the line ending is CR/LF. Just
+ checking for a CR or an LF is really plenty enough.
- Reported-by: Daniel Stenberg
- Fixes #3532
- Closes #3546
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+ Closes https://github.com/curl/curl/pull/2592
-Daniel Stenberg (11 Feb 2019)
-- curlver: bump to 7.64.1-dev
+Daniel Stenberg (22 May 2018)
+- CURLOPT_ACCEPT_ENCODING.3: add brotli and clarify a bit
- RELEASE-NOTES: synced
+
+- KNOWN_BUGS: mention the -O with %-encoded file names
- and bump the version in progress to 7.64.1. If we merge any "change"
- before the cut-off date, we update again.
+ Closes #2573
-Daniel Gustafsson (11 Feb 2019)
-- curl: follow-up to 3f16990ec84
+- checksrc: make sure sizeof() is used *with* parentheses
- Commit 3f16990ec84cc4b followed-up a bug in b49652ac66cc0 but was
- inadvertently introducing a new bug in the ternary expression.
+ ... and unify the source code to adhere.
- Close #3555
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #2563
-- dns: release sharelock as soon as possible
+- curl: added --styled-output
- There is no benefit to holding the data sharelock when freeing the
- addrinfo in case it fails, so ensure releaseing it as soon as we can
- rather than holding on to it. This also aligns the code with other
- consumers of sharelocks.
+ It is enabled by default, so --no-styled-output will switch off the
+ detection/use of bold headers.
- Closes #3516
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #2538
-Daniel Stenberg (11 Feb 2019)
-- curl: follow-up to b49652ac66cc0
+- curl: show headers in bold
- On FreeBSD, return non-zero on error otherwise zero.
+ The feature is only enabled if the output is believed to be a tty.
- Reported-by: Marcel Raad
+ -J: There's some minor differences and improvements in -J handling, as
+ now J should work with -i and it actually creates a file first using the
+ initial name and then *renames* that to the one found in
+ Content-Disposition (if any).
+
+ -i: only shows headers for HTTP transfers now (as documented).
+ Previously it would also show for pieces of the transfer that were HTTP
+ (for example when doing FTP over a HTTP proxy).
+
+ -i: now shows trailers as well. Previously they were not shown at all.
+
+ --libcurl: the CURLOPT_HEADER is no longer set, as the header output is
+ now done in the header callback.
-- multi: (void)-prefix when ignoring return values
+- configure: compile-time SIZEOF checks
- ... and added braces to two function calls which fixes warnings if they
- are replace by empty macros at build-time.
+ ... instead of exeucting code to get the size. Removes the use of
+ LD_LIBRARY_PATH for this.
+
+ Fixes #2586
+ Closes #2589
+ Reported-by: Bernhard Walle
-- curl: fix FreeBSD compiler warning in the --xattr code
+- configure: replace AC_TRY_RUN with CURL_RUN_IFELSE
- Closes #3550
+ ... and export LD_LIBRARY_PATH properly. This is a follow-up from
+ 2d4c215.
+
+ Fixes #2586
+ Reported-by: Bernhard Walle
-- connection_check: set ->data to the transfer doing the check
+- docs: clarify CURLOPT_HTTPGET somewhat
- The http2 code for connection checking needs a transfer to use. Make
- sure a working one is set before handler->connection_check() is called.
+ Reported-by: bsammon on github
+ Fixes #2590
+
+- curl_fnmatch: only allow two asterisks for matching
- Reported-by: jnbr on github
- Fixes #3541
- Closes #3547
+ The previous limit of 5 can still end up in situation that takes a very
+ long time and consumes a lot of CPU.
+
+ If there is still a rare use case for this, a user can provide their own
+ fnmatch callback for a version that allows a larger set of wildcards.
+
+ This commit was triggered by yet another OSS-Fuzz timeout due to this.
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8369
+
+ Closes #2587
-- hostip: make create_hostcache_id avoid alloc + free
+- checksrc: fix too long line
- Closes #3544
+ follow-up to e05ad5d
-- scripts/singleuse: script to use to track single-use functions
+- [Aleks brought this change]
+
+ docs: mention HAproxy protocol "version 1"
- That is functions that are declared global but are not used from outside
- of the file in which it is declared. Such functions should be made
- static or even at times be removed.
+ ...as there's also a version 2.
- It also verifies that all used curl_ prefixed functions are "blessed"
+ Closes #2579
+
+- examples/progressfunc: make it build on older libcurls
- Closes #3538
+ This example was changed in ce2140a8c1 to use the new microsecond based
+ getinfo option. This change makes it conditionally keep using the older
+ option so that the example still builds with older libcurl versions.
+
+ Closes #2584
-- cleanup: make local functions static
+- stub_gssapi: fix numerous 'unused parameter' warnings
- urlapi: turn three local-only functions into statics
+ follow-up to d9e92fd9fd1d
+
+- [Philip Prindeville brought this change]
+
+ getinfo: add microsecond precise timers for various intervals
- conncache: make conncache_find_first_connection static
+ Provide a set of new timers that return the time intervals using integer
+ number of microseconds instead of floats.
- multi: make detach_connnection static
+ The new info names are as following:
- connect: make getaddressinfo static
+ CURLINFO_APPCONNECT_TIME_T
+ CURLINFO_CONNECT_TIME_T
+ CURLINFO_NAMELOOKUP_TIME_T
+ CURLINFO_PRETRANSFER_TIME_T
+ CURLINFO_REDIRECT_TIME_T
+ CURLINFO_STARTTRANSFER_TIME_T
+ CURLINFO_TOTAL_TIME_T
- curl_ntlm_core: make hmac_md5 static
+ Closes #2495
+
+- openssl: acknowledge --tls-max for default version too
- http2: make two functions static
+ ... previously it only used the max setting if a TLS version was also
+ explicitly asked for.
- http: make http_setup_conn static
+ Reported-by: byte_bucket
+ Fixes #2571
+ Closes #2572
+
+- bump: start working on the pending 7.61.0
+
+- [Dagobert Michelsen brought this change]
+
+ tests/libtest/Makefile: Do not unconditionally add gcc-specific flags
- connect: make tcpnodelay static
+ The warning flag leads e.g. Sun Studio compiler to bail out.
- tests: make UNITTEST a thing to mark functions with, so they can be static for
- normal builds and non-static for unit test builds
+ Closes #2576
+
+- schannel_verify: fix build for non-schannel
+
+Jay Satiro (16 May 2018)
+- rand: fix typo
+
+- schannel: disable manual verify if APIs not available
- ... and mark Curl_shuffle_addr accordingly.
+ .. because original MinGW and old compilers do not have the Windows API
+ definitions needed to support manual verification.
+
+- [Archangel_SDY brought this change]
+
+ schannel: disable client cert option if APIs not available
- url: make up_free static
+ Original MinGW targets Windows 2000 by default, which lacks some APIs and
+ definitions for this feature. Disable it if these APIs are not available.
- setopt: make vsetopt static
+ Closes https://github.com/curl/curl/pull/2522
+
+Version 7.60.0 (15 May 2018)
+
+Daniel Stenberg (15 May 2018)
+- RELEASE-NOTES: 7.60.0 release
+
+- THANKS: added people from the curl 7.60.0 release
+
+- docs/libcurl/index.html: removed
- curl_endian: make write32_le static
+ The HTML files are long gone from the dist, now remove the last HTML
+ file pointing to those missing files.
- rtsp: make rtsp_connisdead static
+ d
+
+- [steini2000 brought this change]
+
+ http2: remove unused variable
- warnless: remove unused functions
+ Closes #2570
+
+- [steini2000 brought this change]
+
+ http2: use easy handle of stream for logging
+
+- gcc: disable picky gcc-8 function pointer warnings in two places
- memdebug: remove one unused function, made another static
+ Reported-by: Rikard Falkeborn
+ Bug: #2560
+ Closes #2569
-Dan Fandrich (10 Feb 2019)
-- cirrus: Added FreeBSD builds using Cirrus CI.
+- http2: use the correct function pointer typedef
- The build logs will be at https://cirrus-ci.com/github/curl/curl
+ Fixes gcc-8 picky compiler warnings
+ Reported-by: Rikard Falkeborn
+ Bug: #2560
+ Closes #2568
+
+- CODE_STYLE: mention return w/o parens, but sizeof with
- Some tests are currently failing and so disabled for now. The SSH server
- isn't starting for the SSH tests due to unsupported options used in its
- config file. The DICT server also is failing on startup.
+ ... and remove the github markdown syntax so that it renders better on
+ the web site. Also, don't use back-ticks inlined to allow the CSS to
+ highlight source code better.
-Daniel Stenberg (9 Feb 2019)
-- url/idnconvert: remove scan for <= 32 ascii values
+- [Rikard Falkeborn brought this change]
+
+ examples: Fix format specifiers
- The check was added back in fa939220df before the URL parser would catch
- these problems and therefore these will never trigger now.
+ Closes #2561
+
+- [Rikard Falkeborn brought this change]
+
+ tool: Fix format specifiers
+
+- [Rikard Falkeborn brought this change]
+
+ ntlm: Fix format specifiers
+
+- [Rikard Falkeborn brought this change]
+
+ tests: Fix format specifiers
+
+- [Rikard Falkeborn brought this change]
+
+ lib: Fix format specifiers
+
+- contributors.sh: use "on github", not at
+
+- http2: getsock fix for uploads
- Closes #3539
+ When there's an upload in progress, make sure to wait for the socket to
+ become writable.
+
+ Detected-by: steini2000 on github
+ Bug: #2520
+ Closes #2567
-- urlapi: reduce variable scope, remove unreachable 'break'
+- pingpong: fix response cache memcpy overflow
- Both nits pointed out by codacy.com
+ Response data for a handle with a large buffer might be cached and then
+ used with the "closure" handle when it has a smaller buffer and then the
+ larger cache will be copied and overflow the new smaller heap based
+ buffer.
- Closes #3540
+ Reported-by: Dario Weisser
+ CVE: CVE-2018-1000300
+ Bug: https://curl.haxx.se/docs/adv_2018-82c2.html
-Alessandro Ghedini (7 Feb 2019)
-- zsh.pl: escape ':' character
+- http: restore buffer pointer when bad response-line is parsed
- ':' is interpreted as separator by zsh, so if used as part of the argument
- or option's description it needs to be escaped.
+ ... leaving the k->str could lead to buffer over-reads later on.
- The problem can be reproduced as follows:
+ CVE: CVE-2018-1000301
+ Assisted-by: Max Dymond
- % curl --reso<TAB>
- % curl -E <TAB>
+ Detected by OSS-Fuzz.
+ Bug: https://curl.haxx.se/docs/adv_2018-b138.html
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7105
+
+Patrick Monnerat (13 May 2018)
+- cookies: do not take cookie name as a parameter
- Bug: https://bugs.debian.org/921452
+ RFC 6265 section 4.2.1 does not set restrictions on cookie names.
+ This is a follow-up to commit 7f7fcd0.
+ Also explicitly check proper syntax of cookie name/value pair.
+
+ New test 1155 checks that cookie names are not reserved words.
+
+ Reported-By: anshnd at github
+ Fixes #2564
+ Closes #2566
+
+Daniel Stenberg (12 May 2018)
+- smb: reject negative file sizes
+
+ Assisted-by: Max Dymond
+
+ Detected by OSS-Fuzz
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8245
diff --git a/CMake/CurlSymbolHiding.cmake b/CMake/CurlSymbolHiding.cmake
index 224755a31..15ba46e46 100644
--- a/CMake/CurlSymbolHiding.cmake
+++ b/CMake/CurlSymbolHiding.cmake
@@ -29,7 +29,7 @@ if(CURL_HIDDEN_SYMBOLS)
set(_CFLAG_SYMBOLS_HIDE "-xldscope=hidden")
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0)
# note: this should probably just check for version 9.1.045 but I'm not 100% sure
- # so let's do it the same way autotools do.
+ # so let's to it the same way autotools do.
set(SUPPORTS_SYMBOL_HIDING TRUE)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden")
@@ -53,7 +53,7 @@ elseif(MSVC)
message(WARNING "Hiding private symbols regardless CURL_HIDDEN_SYMBOLS being disabled.")
set(HIDES_CURL_PRIVATE_SYMBOLS TRUE)
endif()
-else()
+elseif()
set(HIDES_CURL_PRIVATE_SYMBOLS FALSE)
endif()
diff --git a/CMake/CurlTests.c b/CMake/CurlTests.c
index 3ef35f025..0756b2a31 100644
--- a/CMake/CurlTests.c
+++ b/CMake/CurlTests.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -125,7 +125,6 @@ int main(void)
#if defined(HAVE_GETHOSTBYADDR_R_5) || \
defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT)
rc = gethostbyaddr_r(address, length, type, &h, &hdata);
- (void)rc;
#elif defined(HAVE_GETHOSTBYADDR_R_7) || \
defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT)
hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop);
@@ -133,7 +132,6 @@ int main(void)
#elif defined(HAVE_GETHOSTBYADDR_R_8) || \
defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT)
rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop);
- (void)rc;
#endif
#if defined(HAVE_GETHOSTBYNAME_R_3) || \
@@ -242,7 +240,6 @@ int main()
#ifndef inet_ntoa_r
func_type func;
func = (func_type)inet_ntoa_r;
- (void)func;
#endif
return 0;
}
@@ -258,7 +255,6 @@ int main()
#ifndef inet_ntoa_r
func_type func;
func = (func_type)&inet_ntoa_r;
- (void)func;
#endif
return 0;
}
@@ -587,8 +583,6 @@ int
main() {
int res3 = c99_vmacro3(1, 2, 3);
int res2 = c99_vmacro2(1, 2);
- (void)res3;
- (void)res2;
return 0;
}
#endif
@@ -610,8 +604,6 @@ int
main() {
int res3 = gcc_vmacro3(1, 2, 3);
int res2 = gcc_vmacro2(1, 2);
- (void)res3;
- (void)res2;
return 0;
}
#endif
diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake
index a2f150cda..8a28f2fb6 100644
--- a/CMake/FindGSS.cmake
+++ b/CMake/FindGSS.cmake
@@ -62,7 +62,6 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
OUTPUT_VARIABLE _GSS_CFLAGS
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
- OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
@@ -85,7 +84,6 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
OUTPUT_VARIABLE _GSS_LIB_FLAGS
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
- OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")
@@ -112,7 +110,6 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
OUTPUT_VARIABLE _GSS_VERSION
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
- OUTPUT_STRIP_TRAILING_WHITESPACE
)
# older versions may not have the "--version" parameter. In this case we just don't care.
@@ -124,7 +121,6 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
OUTPUT_VARIABLE _GSS_VENDOR
RESULT_VARIABLE _GSS_CONFIGURE_FAILED
- OUTPUT_STRIP_TRAILING_WHITESPACE
)
# older versions may not have the "--vendor" parameter. In this case we just don't care.
@@ -138,7 +134,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
endif()
endif()
- else() # either there is no config script or we are on a platform that doesn't provide one (Windows?)
+ else() # either there is no config script or we are on platform that doesn't provide one (Windows?)
find_path(_GSS_INCLUDE_DIR
NAMES
@@ -168,7 +164,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
set(CMAKE_REQUIRED_DEFINITIONS "")
endif()
else()
- # I'm not convinced if this is the right way but this is what autotools do at the moment
+ # I'm not convienced if this is the right way but this is what autotools do at the moment
find_path(_GSS_INCLUDE_DIR
NAMES
"gssapi.h"
diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake
index c1c9aa32a..c180a5888 100644
--- a/CMake/OtherTests.cmake
+++ b/CMake/OtherTests.cmake
@@ -24,8 +24,6 @@ else()
add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h")
endif()
-set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
-
check_c_source_compiles("${_source_epilogue}
int main(void) {
recv(0, 0, 0, 0);
@@ -179,44 +177,6 @@ int main(void) {
return 0;
}" HAVE_STRUCT_TIMEVAL)
-set(HAVE_SIG_ATOMIC_T 1)
-set(CMAKE_REQUIRED_FLAGS)
-if(HAVE_SIGNAL_H)
- set(CMAKE_REQUIRED_FLAGS "-DHAVE_SIGNAL_H")
- set(CMAKE_EXTRA_INCLUDE_FILES "signal.h")
-endif()
-check_type_size("sig_atomic_t" SIZEOF_SIG_ATOMIC_T)
-if(HAVE_SIZEOF_SIG_ATOMIC_T)
- check_c_source_compiles("
- #ifdef HAVE_SIGNAL_H
- # include <signal.h>
- #endif
- int main(void) {
- static volatile sig_atomic_t dummy = 0;
- (void)dummy;
- return 0;
- }" HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
- if(NOT HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
- set(HAVE_SIG_ATOMIC_T_VOLATILE 1)
- endif()
-endif()
-
-if(HAVE_WINDOWS_H)
- set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h)
-else()
- set(CMAKE_EXTRA_INCLUDE_FILES)
- if(HAVE_SYS_SOCKET_H)
- set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
- endif()
-endif()
-
-check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE)
-if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE)
- set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
-endif()
-
-unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
-
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
# if not cross-compilation...
include(CheckCSourceRuns)
@@ -262,3 +222,38 @@ if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
}" HAVE_POLL_FINE)
endif()
+set(HAVE_SIG_ATOMIC_T 1)
+set(CMAKE_REQUIRED_FLAGS)
+if(HAVE_SIGNAL_H)
+ set(CMAKE_REQUIRED_FLAGS "-DHAVE_SIGNAL_H")
+ set(CMAKE_EXTRA_INCLUDE_FILES "signal.h")
+endif()
+check_type_size("sig_atomic_t" SIZEOF_SIG_ATOMIC_T)
+if(HAVE_SIZEOF_SIG_ATOMIC_T)
+ check_c_source_compiles("
+ #ifdef HAVE_SIGNAL_H
+ # include <signal.h>
+ #endif
+ int main(void) {
+ static volatile sig_atomic_t dummy = 0;
+ (void)dummy;
+ return 0;
+ }" HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
+ if(NOT HAVE_SIG_ATOMIC_T_NOT_VOLATILE)
+ set(HAVE_SIG_ATOMIC_T_VOLATILE 1)
+ endif()
+endif()
+
+if(HAVE_WINDOWS_H)
+ set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h)
+else()
+ set(CMAKE_EXTRA_INCLUDE_FILES)
+ if(HAVE_SYS_SOCKET_H)
+ set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
+ endif()
+endif()
+
+check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE)
+if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE)
+ set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
+endif()
diff --git a/CMake/Platforms/WindowsCache.cmake b/CMake/Platforms/WindowsCache.cmake
index ead4115a3..cafaec216 100644
--- a/CMake/Platforms/WindowsCache.cmake
+++ b/CMake/Platforms/WindowsCache.cmake
@@ -7,6 +7,7 @@ if(NOT UNIX)
set(HAVE_LIBNSL 0)
set(HAVE_GETHOSTNAME 1)
set(HAVE_LIBZ 0)
+ set(HAVE_LIBCRYPTO 0)
set(HAVE_DLOPEN 0)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 20b9bd011..edb1cec21 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -57,6 +57,7 @@ string(REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS})
string(REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM})
+include_regular_expression("^.*$") # Sukender: Is it necessary?
# Setup package meta-data
# SET(PACKAGE "curl")
@@ -103,7 +104,11 @@ endif()
if(ENABLE_DEBUG)
# DEBUGBUILD will be defined only for Debug builds
- set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
+ if(NOT CMAKE_VERSION VERSION_LESS 3.0)
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
+ else()
+ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
+ endif()
set(ENABLE_CURLDEBUG ON)
endif()
@@ -241,6 +246,7 @@ include(CheckLibraryExists)
include(CheckSymbolExists)
include(CheckTypeSize)
include(CheckCSourceCompiles)
+include(CMakeDependentOption)
# On windows preload settings
if(WIN32)
@@ -260,7 +266,7 @@ if(ENABLE_THREADED_RESOLVER)
endif()
# Check for all needed libraries
-check_library_exists_concat("${CMAKE_DL_LIBS}" dlopen HAVE_LIBDL)
+check_library_exists_concat("dl" dlopen HAVE_LIBDL)
check_library_exists_concat("socket" connect HAVE_LIBSOCKET)
check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
@@ -287,7 +293,7 @@ endif()
# TODO support GNUTLS, NSS, POLARSSL, CYASSL
if(APPLE)
- option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF)
+ option(CMAKE_USE_DARWINSSL "enable Apple OS native SSL/TLS" OFF)
endif()
if(WIN32)
option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
@@ -297,14 +303,14 @@ endif()
option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
set(openssl_default ON)
-if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
+if(WIN32 OR CMAKE_USE_DARWINSSL OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
set(openssl_default OFF)
endif()
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
count_true(enabled_ssl_options_count
CMAKE_USE_WINSSL
- CMAKE_USE_SECTRANSP
+ CMAKE_USE_DARWINSSL
CMAKE_USE_OPENSSL
CMAKE_USE_MBEDTLS
)
@@ -324,10 +330,6 @@ if(CURL_WINDOWS_SSPI)
endif()
if(CMAKE_USE_DARWINSSL)
- message(FATAL_ERROR "The cmake option CMAKE_USE_DARWINSSL was renamed to CMAKE_USE_SECTRANSP.")
-endif()
-
-if(CMAKE_USE_SECTRANSP)
find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation")
if(NOT COREFOUNDATION_FRAMEWORK)
message(FATAL_ERROR "CoreFoundation framework not found")
@@ -339,7 +341,7 @@ if(CMAKE_USE_SECTRANSP)
endif()
set(SSL_ENABLED ON)
- set(USE_SECTRANSP ON)
+ set(USE_DARWINSSL ON)
list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}")
endif()
@@ -347,6 +349,8 @@ if(CMAKE_USE_OPENSSL)
find_package(OpenSSL REQUIRED)
set(SSL_ENABLED ON)
set(USE_OPENSSL ON)
+ set(HAVE_LIBCRYPTO ON)
+ set(HAVE_LIBSSL ON)
# Depend on OpenSSL via imported targets if supported by the running
# version of CMake. This allows our dependents to get our dependencies
@@ -471,7 +475,6 @@ if(NOT CURL_DISABLE_LDAP)
list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
endif()
check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
- unset(CMAKE_REQUIRED_LIBRARIES)
if(NOT_NEED_LBER_H)
set(NEED_LBER_H OFF)
@@ -528,7 +531,7 @@ endif()
option(CURL_BROTLI "Set to ON to enable building curl with brotli support." OFF)
set(HAVE_BROTLI OFF)
if(CURL_BROTLI)
- find_package(Brotli QUIET)
+ find_package(BROTLI QUIET)
if(BROTLI_FOUND)
set(HAVE_BROTLI ON)
list(APPEND CURL_LIBS ${BROTLI_LIBRARIES})
@@ -567,7 +570,6 @@ if(CMAKE_USE_LIBSSH2)
check_function_exists(libssh2_scp_send64 HAVE_LIBSSH2_SCP_SEND64)
check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE)
set(CMAKE_EXTRA_INCLUDE_FILES "")
- unset(CMAKE_REQUIRED_LIBRARIES)
endif()
endif()
@@ -615,7 +617,6 @@ if(CMAKE_USE_GSSAPI)
if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE)
set(HAVE_OLD_GSSMIT ON)
endif()
- unset(CMAKE_REQUIRED_LIBRARIES)
endif()
@@ -858,7 +859,6 @@ check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT)
check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID)
check_symbol_exists(getpwuid_r "${CURL_INCLUDES}" HAVE_GETPWUID_R)
check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID)
-check_symbol_exists(usleep "${CURL_INCLUDES}" HAVE_USLEEP)
check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME)
check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
@@ -884,9 +884,6 @@ check_symbol_exists(freeifaddrs "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
check_symbol_exists(pipe "${CURL_INCLUDES}" HAVE_PIPE)
check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE)
check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
-check_symbol_exists(getpeername "${CURL_INCLUDES}" HAVE_GETPEERNAME)
-check_symbol_exists(getsockname "${CURL_INCLUDES}" HAVE_GETSOCKNAME)
-check_symbol_exists(if_nametoindex "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX)
check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT)
check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE)
check_symbol_exists(setmode "${CURL_INCLUDES}" HAVE_SETMODE)
@@ -1182,7 +1179,10 @@ endfunction()
# Clear list and try to detect available features
set(_items)
-_add_if("SSL" SSL_ENABLED)
+_add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
+_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
+_add_if("DarwinSSL" SSL_ENABLED AND USE_DARWINSSL)
+_add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS)
_add_if("IPv6" ENABLE_IPV6)
_add_if("unix-sockets" USE_UNIX_SOCKETS)
_add_if("libz" HAVE_LIBZ)
@@ -1200,7 +1200,7 @@ _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
# NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_SECTRANSP OR USE_MBEDTLS))
+if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS))
_add_if("NTLM" 1)
# TODO missing option (autoconf: --enable-ntlm-wb)
_add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
@@ -1239,24 +1239,10 @@ _add_if("SCP" USE_LIBSSH2)
_add_if("SFTP" USE_LIBSSH2)
_add_if("RTSP" NOT CURL_DISABLE_RTSP)
_add_if("RTMP" USE_LIBRTMP)
-if(_items)
- list(SORT _items)
-endif()
+list(SORT _items)
string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
-# Clear list and collect SSL backends
-set(_items)
-_add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
-_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
-_add_if("Secure Transport" SSL_ENABLED AND USE_SECTRANSP)
-_add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS)
-if(_items)
- list(SORT _items)
-endif()
-string(REPLACE ";" " " SSL_BACKENDS "${_items}")
-message(STATUS "Enabled SSL backends: ${SSL_BACKENDS}")
-
# curl-config needs the following options to be set.
set(CC "${CMAKE_C_COMPILER}")
# TODO probably put a -D... options here?
diff --git a/METADATA b/METADATA
index 550afee48..7610b959d 100644
--- a/METADATA
+++ b/METADATA
@@ -7,12 +7,12 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://github.com/curl/curl/releases/download/curl-7_67_0/curl-7.67.0.tar.xz"
+ value: "https://github.com/curl/curl/releases/download/curl-7_64_1/curl-7.64.1.tar.xz"
}
- version: "curl-7_67_0"
+ version: "curl-7_64_1"
last_upgrade_date {
year: 2019
- month: 11
- day: 6
+ month: 3
+ day: 27
}
}
diff --git a/Makefile.am b/Makefile.am
index 3116e1053..ac5eca3ba 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -154,20 +154,9 @@ VC_DIST = projects/README \
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
winbuild/MakefileBuild.vc winbuild/Makefile.vc
-PLAN9_DIST = plan9/include/mkfile \
- plan9/include/mkfile \
- plan9/mkfile.proto \
- plan9/mkfile \
- plan9/BUILD.PLAN9.txt \
- plan9/lib/mkfile.inc \
- plan9/lib/mkfile \
- plan9/src/mkfile.inc \
- plan9/src/mkfile
-
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
- scripts/updatemanpages.pl $(CMAKE_DIST) \
- $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \
+ scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \
lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
diff --git a/OWNERS b/OWNERS
index e5c08d3e3..0fd8d1ed9 100644
--- a/OWNERS
+++ b/OWNERS
@@ -3,4 +3,5 @@
enh@google.com
deymo@google.com
senj@google.com
+tbao@google.com
hhb@google.com
diff --git a/README b/README
index c439dab9e..f0b3b9393 100644
--- a/README
+++ b/README
@@ -42,12 +42,6 @@ GIT
(you'll get a directory named curl created, filled with the source code)
-SECURITY PROBLEMS
-
- Report suspected security problems via our HackerOne page and not in public!
-
- https://hackerone.com/curl
-
NOTICE
Curl contains pieces of source code that is Copyright (c) 1998, 1999
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cea2debda..644b6d78d 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,144 +1,134 @@
-curl and libcurl 7.67.0
+curl and libcurl 7.64.1
- Public curl releases: 186
- Command line options: 226
- curl_easy_setopt() options: 269
- Public functions in libcurl: 81
- Contributors: 2056
+ Public curl releases: 180
+ Command line options: 221
+ curl_easy_setopt() options: 267
+ Public functions in libcurl: 80
+ Contributors: 1929
This release includes the following changes:
- o curl: added --no-progress-meter [73]
- o setopt: CURLMOPT_MAX_CONCURRENT_STREAMS is new [55]
- o urlapi: CURLU_NO_AUTHORITY allows empty authority/host part [22]
+ o alt-svc: experiemental support added [74]
+ o configure: add --with-amissl [84]
This release includes the following bugfixes:
- o BINDINGS: five new bindings addded
- o CURLOPT_TIMEOUT.3: Clarify transfer timeout time includes queue time [78]
- o CURLOPT_TIMEOUT.3: remove the mention of "minutes" [74]
- o ESNI: initial build/setup support [71]
- o FTP: FTPFILE_NOCWD: avoid redundant CWDs [28]
- o FTP: allow "rubbish" prepended to the SIZE response [15]
- o FTP: remove trailing slash from path for LIST/MLSD [6]
- o FTP: skip CWD to entry dir when target is absolute [16]
- o FTP: url-decode path before evaluation [36]
- o HTTP3.md: move -p for mkdir, remove -j for make [46]
- o HTTP3: fix invalid use of sendto for connected UDP socket [109]
- o HTTP3: fix ngtcp2 Windows build [93]
- o HTTP3: fix prefix parameter for ngtcp2 build [40]
- o HTTP3: fix typo somehere1 > somewhere1 [108]
- o HTTP3: show an --alt-svc using example too
- o INSTALL: add missing space for configure commands [106]
- o INSTALL: add vcpkg installation instructions [35]
- o README: minor grammar fix [39]
- o altsvc: accept quoted ma and persist values [60]
- o altsvc: both backends run h3-23 now [31]
- o appveyor: Add MSVC ARM64 build [87]
- o appveyor: Use two parallel compilation on appveyor with CMake [98]
- o appveyor: add --disable-proxy autotools build [94]
- o appveyor: add 32-bit MinGW-w64 build [58]
- o appveyor: add a winbuild [14]
- o appveyor: add a winbuild that uses VS2017 [84]
- o appveyor: make winbuilds with DEBUG=no/yes and VS 2015/2017 [95]
- o appveyor: publish artifacts on appveyor [105]
- o appveyor: upgrade VS2017 to VS2019 [29]
- o asyn-thread: make use of Curl_socketpair() where available [85]
- o asyn-thread: s/AF_LOCAL/AF_UNIX for Solaris [3]
- o build: Remove unused HAVE_LIBSSL and HAVE_LIBCRYPTO defines [77]
- o checksrc: fix uninitialized variable warning [57]
- o chunked-encoding: stop hiding the CURLE_BAD_CONTENT_ENCODING error [56]
- o cirrus: Increase the git clone depth
- o cirrus: Switch the FreeBSD 11.x build to 11.3 and add a 13.0 build
- o cirrus: switch off blackhole status on the freebsd CI machines [72]
- o cleanups: 21 various PVS-Studio warnings [24]
- o configure: only say ipv6 enabled when the variable is set [110]
- o configure: remove all cyassl references [90]
- o conn-reuse: requests wanting NTLM can reuse non-NTLM connections [99]
- o connect: return CURLE_OPERATION_TIMEDOUT for errno == ETIMEDOUT [72]
- o connect: silence sign-compare warning [83]
- o cookie: avoid harmless use after free [69]
- o cookie: pass in the correct cookie amount to qsort() [27]
- o cookies: change argument type for Curl_flush_cookies [67]
- o cookies: using a share with cookies shouldn't enable the cookie engine [63]
- o copyrights: update copyright notices to 2019 [101]
- o curl: create easy handles on-demand and not ahead of time [54]
- o curl: ensure HTTP 429 triggers --retry [64]
- o curl: exit the create_transfers loop on errors [33]
- o curl: fix memory leaked by parse_metalink() [17]
- o curl: load large files with -d @ much faster [19]
- o docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag [21]
- o docs: added multi-event.c example [75]
- o docs: disambiguate CURLUPART_HOST is for host name (ie no port) [62]
- o docs: note on failed handles not being counted by curl_multi_perform [70]
- o doh: allow only http and https in debug mode [48]
- o doh: avoid truncating DNS QTYPE to lower octet [23]
- o doh: clean up dangling DOH memory on easy close [9]
- o doh: fix (harmless) buffer overrun [13]
- o doh: fix undefined behaviour and open up for gcc and clang optimization [12]
- o doh: return early if there is no time left [48]
- o examples/sslbackend: fix -Wchar-subscripts warning [89]
- o examples: remove the "this exact code has not been verified"
- o git: add tests/server/disabled to .gitignore [59]
- o gnutls: make gnutls_bye() not wait for response on shutdown [104]
- o http2: expire a timeout at end of stream [88]
- o http2: prevent dup'ed handles to send dummy PRIORITY frames [68]
- o http2: relax verification of :authority in push promise requests [8]
- o http2_recv: a closed stream trumps pause state [88]
- o http: lowercase headernames for HTTP/2 and HTTP/3 [49]
- o ldap: Stop using wide char version of ldapp_err2string [1]
- o ldap: fix OOM error on missing query string [76]
- o mbedtls: add error message for cert validity starting in the future [102]
- o mime: when disabled, avoid C99 macro [7]
- o ngtcp2: adapt to API change [66]
- o ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23 [25]
- o ngtcp2: remove fprintf() calls [43]
- o openssl: close_notify on the FTP data connection doesn't mean closure [20]
- o openssl: fix compiler warning with LibreSSL [34]
- o openssl: use strerror on SSL_ERROR_SYSCALL [41]
- o os400: getpeername() and getsockname() return ebcdic AF_UNIX sockaddr [47]
- o parsedate: fix date parsing disabled builds [18]
- o quiche: don't close connection at end of stream
- o quiche: persist connection details (fixes -I with --http3) [11]
- o quiche: set 'drain' when returning without having drained the queues
- o quiche: update HTTP/3 config creation to new API [61]
- o redirect: handle redirects to absolute URLs containing spaces [52]
- o runtests: get textaware info from curl instead of perl [86]
- o schannel: reverse the order of certinfo insertions [96]
- o schannel_verify: Fix concurrent openings of CA file [103]
- o security: silence conversion warning [83]
- o setopt: handle ALTSVC set to NULL
- o setopt: make it easier to add new enum values [4]
- o setopt: store CURLOPT_RTSP_SERVER_CSEQ correctly [24]
- o smb: check for full size message before reading message details [10]
- o smbserver: fix Python 3 compatibility [82]
- o socks: Fix destination host shown on SOCKS5 error [32]
- o test1162: disable MSYS2's POSIX path conversion
- o test1591: fix spelling of http feature [97]
- o tests: add `connect to non-listen` keywords [91]
- o tests: fix narrowing conversion warnings [37]
- o tests: fix the test 3001 cert failures [100]
- o tests: makes tests succeed when using --disable-proxy [81]
- o tests: use %FILE_PWD for file:// URLs [92]
- o tests: use port 2 instead of 60000 for a safer non-listening port [72]
- o tool_operate: Fix retry sleep time shown to user when Retry-After [79]
- o travis: Add an ARM64 build
- o url: Curl_free_request_state() should also free doh handles [107]
- o url: don't set appconnect time for non-ssl/non-ssh connections [42]
- o url: fix the NULL hostname compiler warning [44]
- o url: normalize CURLINFO_EFFECTIVE_URL [80]
- o url: only reuse TLS connections with matching pinning [5]
- o urlapi: avoid index underflow for short ipv6 hostnames [26]
- o urlapi: fix URL encoding when setting a full URL [53]
- o urlapi: fix unused variable warning [57]
- o urlapi: question mark within fragment is still fragment [45]
- o urldata: use 'bool' for the bit type on MSVC compilers [30]
- o vtls: Fix comment typo about macosx-version-min compiler flag [38]
- o vtls: fix narrowing conversion warnings [50]
- o winbuild/MakefileBuild.vc: Add vssh [2]
- o winbuild/MakefileBuild.vc: Fix line endings
- o winbuild: Add manifest to curl.exe for proper OS version detection [51]
- o winbuild: add ENABLE_UNICODE option [65]
+ o AppVeyor: add MinGW-w64 and classic Mingw builds [55]
+ o AppVeyor: switch VS 2015 builds to VS 2017 image [49]
+ o CURLU: fix NULL dereference when used over proxy [73]
+ o Curl_easy: remove req.maxfd - never used! [58]
+ o Curl_now: figure out windows version in win32_init: [11]
+ o Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning [20]
+ o DoH: inherit some SSL options from user's easy handle [80]
+ o Secure Transport: no more "darwinssl" [56]
+ o Secure Transport: tvOS 11 is required for ALPN support [94]
+ o cirrus: Added FreeBSD builds using Cirrus CI
+ o cleanup: make local functions static [5]
+ o cli tool: do not use mime.h private structures [27]
+ o cmdline-opts/proxytunnel.d: the option tunnnels all protocols [83]
+ o configure: add additional libraries to check for LDAP support [45]
+ o configure: remove the unused fdopen macro [40]
+ o configure: show features as well in the final summary [15]
+ o conncache: use conn->data to know if a transfer owns it [95]
+ o connection: never reuse CONNECT_ONLY connections [35]
+ o connection_check: restore original conn->data after the check [14]
+ o connection_check: set ->data to the transfer doing the check [3]
+ o cookie: Add support for cookie prefixes [29]
+ o cookies: dotless names can set cookies again [81]
+ o cookies: fix NULL dereference if flushing cookies with no CookieInfo set [47]
+ o curl.1: --user and --proxy-user are hidden from ps output [86]
+ o curl.1: mark the argument to --cookie as <data|filename> [87]
+ o curl.h: use __has_declspec_attribute for shared builds [52]
+ o curl: display --version features sorted alphabetically [51]
+ o curl: fix FreeBSD compiler warning in the --xattr code [2]
+ o curl: remove MANUAL from -M output [38]
+ o curl_easy_duphandle.3: clarify that a duped handle has no shares [64]
+ o curl_multi_remove_handle.3: use at any time, just not from within callbacks
+ o curl_url.3: this API is not experimental anymore
+ o dns: release sharelock as soon as possible [1]
+ o docs: update max-redirs.d phrasing [59]
+ o easy: fix win32 init to work without CURL_GLOBAL_WIN32 [30]
+ o examples/10-at-a-time.c: improve readability and simplify
+ o examples/cacertinmem.c: use multiple certificates for loading CA-chain [54]
+ o examples/crawler: Fix the Accept-Encoding setting
+ o examples/ephiperfifo.c: various fixes [63]
+ o examples/externalsocket: add missing close socket calls [78]
+ o examples/http2-download: cleaned up
+ o examples/http2-serverpush: add some sensible error checks [31]
+ o examples/http2-upload: cleaned up
+ o examples/httpcustomheader: Value stored to 'res' is never read
+ o examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory'
+ o examples/sftpuploadresume: Value stored to 'result' is never read
+ o examples: only include <curl/curl.h> [70]
+ o examples: remove recursive calls to curl_multi_socket_action [42]
+ o examples: remove superfluous null-pointer checks
+ o file: fix "Checking if unsigned variable 'readcount' is less than zero." [90]
+ o fnmatch: disable if FTP is disabled [25]
+ o gnutls: remove call to deprecated gnutls_compression_get_name [66]
+ o gopher: remove check for path == NULL [69]
+ o gssapi: fix deprecated header warnings [16]
+ o hostip: make create_hostcache_id avoid alloc + free [4]
+ o http2: multi_connchanged() moved from multi.c, only used for h2 [21]
+ o http2: verify :athority in push promise requests [37]
+ o http: make adding a blank header thread-safe [33]
+ o http: send payload when (proxy) authentication is done [89]
+ o http: set state.infilesize when sending multipart formposts [57]
+ o makefile: make checksrc and hugefile commands "silent" [85]
+ o mbedtls: make it build even if MBEDTLS_VERSION_C isn't set [24]
+ o mbedtls: release sessionid resources on error [28]
+ o memdebug: log pointer before freeing its data [91]
+ o memdebug: make debug-specific functions use curl_dbg_ prefix [82]
+ o mime: put the boundary buffer into the curl_mime struct [18]
+ o multi: call multi_done on connect timeouts, fixes CURLINFO_TOTAL_TIME [43]
+ o multi: remove verbose "Expire in" ... messages [23]
+ o multi: removed unused code for request retries [79]
+ o multi: support verbose conncache closure handle [72]
+ o negotiate: fix for HTTP POST with Negotiate [88]
+ o openssl: add support for TLS ASYNC state [46]
+ o openssl: if cert type is ENG and no key specified, key is ENG too [93]
+ o pretransfer: don't strlen() POSTFIELDS set for GET requests [22]
+ o rand: Fix a mismatch between comments in source and header [32]
+ o runtests: detect "schannel" as an alias for "winssl" [50]
+ o schannel: be quiet - remove verbose output [19]
+ o schannel: close TLS before removing conn from cache [10]
+ o schannel: support CALG_ECDH_EPHEM algorithm [44]
+ o scripts/completion.pl: also generate fish completion file [67]
+ o singlesocket: fix the 'sincebefore' placement [36]
+ o source: fix two 'nread' may be used uninitialized warnings [68]
+ o ssh: fix Condition '!status' is always true [60]
+ o ssh: loop the state machine if not done and not blocking [71]
+ o strerror: make the strerror function use local buffers [48]
+ o system_win32: move win32_init here from easy.c [65]
+ o test578: make it read data from the correct test
+ o tests: Fixed XML validation errors in some test files
+ o tests: add stderr comparison to the test suite [26]
+ o tests: fix multiple may be used uninitialized warnings
+ o threaded-resolver: shutdown the resolver thread without error message [61]
+ o tool_cb_wrt: fix writing to Windows null device NUL [96]
+ o tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr [84]
+ o tool_operate: build on AmigaOS [84]
+ o tool_operate: fix typecheck warning [9]
+ o transfer.c: do not compute length of undefined hex buffer
+ o travis: add build using gnutls [75]
+ o travis: add scan-build [13]
+ o travis: bump the used wolfSSL version to 4.0.0 [92]
+ o travis: enable valgrind for the iconv tests [12]
+ o travis: use updated compiler versions: clang 7 and gcc 8 [77]
+ o unit1307: require FTP support [17]
+ o unit1651: survive curl_easy_init() fails
+ o url/idnconvert: remove scan for <= 32 ascii values [6]
+ o url: change conn shutdown order to ensure SOCKETFUNCTION callbacks [39]
+ o urlapi: reduce variable scope, remove unreachable 'break' [7]
+ o urldata: convert bools to bitfields and move to end [53]
+ o urldata: simplify bytecounters [62]
+ o urlglob: Argument with 'nonnull' attribute passed null
+ o version.c: silent scan-build even when librtmp is not enabled
+ o vtls: rename some of the SSL functions [84]
+ o wolfssl: stop custom-adding curves [41]
+ o x509asn1: "Dereference of null pointer"
+ o x509asn1: cleanup and unify code layout [34]
+ o zsh.pl: escape ':' character [8]
+ o zsh.pl: update regex to better match curl -h output [8]
This release includes the following known bugs:
@@ -147,136 +137,117 @@ This release includes the following known bugs:
This release would not have looked like this without help, code, reports and
advice from friends like these:
- Alessandro Ghedini, Alex Konev, Alex Samorukov, Andrei Valeriu BICA,
- Barry Pollard, Bastien Bouclet, Bernhard Walle, Bylon2 on github,
- Christophe Dervieux, Christoph M. Becker, Dagobert Michelsen, Dan Fandrich,
- Daniel Silverstone, Daniel Stenberg, Denis Chaplygin, Emil Engler,
- Francois Rivard, George Liu, Gilles Vollant, Griffin Downs, Harry Sintonen,
- Ilya Kosarev, infinnovation-dev on github, Jacob Barthelmeh, Javier Blazquez,
- Jens Finkhaeuser, Jeremy Lainé, Jeroen Ooms, Jimmy Gaussen, Joel Depooter,
- Jojojov on github, jzinn on github, Kamil Dudka, Kunal Ekawde, Lucas Pardue,
- Lucas Severo, Marcel Hernandez, Marcel Raad, Martin Gartner, Max Dymond,
- Michael Kaufmann, Michał Janiszewski, momala454 on github,
- Nathaniel J. Smith, Niall O'Reilly, nico-abram on github,
- Nikos Mavrogiannopoulos, Patrick Monnerat, Paul B. Omta, Paul Dreik,
- Peter Sumatra, Philippe Marguinaud, Piotr Komborski, Ray Satiro,
- Richard Alcock, Roland Hieber, Samuel Surtees, Sebastian Haglund,
- Spezifant on github, Stian Soiland-Reyes, SumatraPeter on github,
- Tatsuhiro Tsujikawa, Tom van der Woerdt, Trivikram Kamat,
- Valerii Zapodovnikov, Vilhelm Prytz, Yechiel Kalmenson, Zenju on github,
- (68 contributors)
+ accountantM on github, Alessandro Ghedini, Andre Guibert de Bruet,
+ Arnaud Rebillout, Bernd Mueller, Björn Stenberg, buzo-ffm on github,
+ Chris Araman, Christian Schmitz, Chris Young, d912e3 on github, Dan Fandrich,
+ Daniel Gustafsson, Daniel Lublin, Daniel Stenberg, David Garske,
+ David Woodhouse, Dominik Hölzl, Don J Olmstead, Eric Curtin, Frank Gevaerts,
+ Gisle Vanem, James Brown, Jan Alexander Steffens, jnbr on github,
+ MAntoniak on github, Marcel Raad, Marc Schlatter, Matt McClure, Michael Felt,
+ Michael Schmid, Michael Wallner, Michał Antoniak, nedres on github,
+ nianxuejie on github, Nick Zitzmann, Nicolas Grekas, Patrick Monnerat,
+ Paul Groke, Pavel Löbl, Ray Satiro, Renaud Allard, Romain Geissler,
+ Sara Golemon, Simon Legner, tholin on github, Tim Rühsen, Volker Schmid,
+ wesinator on github,
+ (49 contributors)
Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues:
- [1] = https://curl.haxx.se/bug/?i=4272
- [2] = https://curl.haxx.se/bug/?i=4322
- [3] = https://curl.haxx.se/bug/?i=4328
- [4] = https://curl.haxx.se/bug/?i=4321
- [5] = https://curl.haxx.se/mail/lib-2019-09/0061.html
- [6] = https://curl.haxx.se/bug/?i=4348
- [7] = https://curl.haxx.se/bug/?i=4368
- [8] = https://curl.haxx.se/bug/?i=4365
- [9] = https://curl.haxx.se/bug/?i=4366
- [10] = https://curl.haxx.se/bug/?i=4363
- [11] = https://curl.haxx.se/bug/?i=4358
- [12] = https://curl.haxx.se/bug/?i=4350
- [13] = https://curl.haxx.se/bug/?i=4352
- [14] = https://curl.haxx.se/bug/?i=4324
- [15] = https://curl.haxx.se/bug/?i=4339
- [16] = https://curl.haxx.se/bug/?i=4332
- [17] = https://curl.haxx.se/bug/?i=4326
- [18] = https://curl.haxx.se/bug/?i=4325
- [19] = https://curl.haxx.se/bug/?i=4336
- [20] = https://curl.haxx.se/bug/?i=4329
- [21] = https://curl.haxx.se/bug/?i=4338
- [22] = https://curl.haxx.se/bug/?i=4349
- [23] = https://curl.haxx.se/bug/?i=4381
- [24] = https://curl.haxx.se/bug/?i=4374
- [25] = https://curl.haxx.se/bug/?i=4392
- [26] = https://curl.haxx.se/bug/?i=4389
- [27] = https://curl.haxx.se/bug/?i=4386
- [28] = https://curl.haxx.se/bug/?i=4382
- [29] = https://curl.haxx.se/bug/?i=4383
- [30] = https://curl.haxx.se/bug/?i=4387
- [31] = https://curl.haxx.se/bug/?i=4395
- [32] = https://curl.haxx.se/bug/?i=4394
- [33] = https://curl.haxx.se/bug/?i=4393
- [34] = https://curl.haxx.se/bug/?i=4397
- [35] = https://curl.haxx.se/bug/?i=4435
- [36] = https://curl.haxx.se/bug/?i=4428
- [37] = https://curl.haxx.se/bug/?i=4415
- [38] = https://curl.haxx.se/bug/?i=4425
- [39] = https://curl.haxx.se/bug/?i=4431
- [40] = https://curl.haxx.se/bug/?i=4430
- [41] = https://curl.haxx.se/bug/?i=4411
- [42] = https://curl.haxx.se/bug/?i=3760
- [43] = https://curl.haxx.se/bug/?i=4421
- [44] = https://curl.haxx.se/bug/?i=4403
- [45] = https://curl.haxx.se/bug/?i=4412
- [46] = https://curl.haxx.se/bug/?i=4407
- [47] = https://curl.haxx.se/bug/?i=4214
- [48] = https://curl.haxx.se/bug/?i=4406
- [49] = https://curl.haxx.se/bug/?i=4400
- [50] = https://curl.haxx.se/bug/?i=4398
- [51] = https://curl.haxx.se/bug/?i=4399
- [52] = https://curl.haxx.se/bug/?i=4445
- [53] = https://curl.haxx.se/bug/?i=4447
- [54] = https://curl.haxx.se/bug/?i=4393
- [55] = https://curl.haxx.se/bug/?i=4410
- [56] = https://curl.haxx.se/bug/?i=4310
- [57] = https://curl.haxx.se/bug/?i=4444
- [58] = https://curl.haxx.se/bug/?i=4433
- [59] = https://curl.haxx.se/bug/?i=4441
- [60] = https://curl.haxx.se/bug/?i=4443
- [61] = https://curl.haxx.se/bug/?i=4437
- [62] = https://curl.haxx.se/bug/?i=4424
- [63] = https://curl.haxx.se/bug/?i=4429
- [64] = https://curl.haxx.se/bug/?i=4465
- [65] = https://curl.haxx.se/bug/?i=4308
- [66] = https://curl.haxx.se/bug/?i=4457
- [67] = https://curl.haxx.se/bug/?i=4455
- [68] = https://curl.haxx.se/bug/?i=4303
- [69] = https://curl.haxx.se/bug/?i=4454
- [70] = https://curl.haxx.se/bug/?i=4446
- [71] = https://curl.haxx.se/bug/?i=4011
- [72] = https://curl.haxx.se/bug/?i=4461
- [73] = https://curl.haxx.se/bug/?i=4422
- [74] = https://curl.haxx.se/bug/?i=4469
- [75] = https://curl.haxx.se/bug/?i=4471
- [76] = https://curl.haxx.se/bug/?i=4467
- [77] = https://curl.haxx.se/bug/?i=4460
- [78] = https://curl.haxx.se/bug/?i=4486
- [79] = https://curl.haxx.se/bug/?i=4498
- [80] = https://curl.haxx.se/bug/?i=4491
- [81] = https://curl.haxx.se/bug/?i=4488
- [82] = https://curl.haxx.se/bug/?i=4484
- [83] = https://curl.haxx.se/bug/?i=4483
- [84] = https://curl.haxx.se/bug/?i=4482
- [85] = https://curl.haxx.se/bug/?i=4466
- [86] = https://curl.haxx.se/bug/?i=4506
- [87] = https://curl.haxx.se/bug/?i=4507
- [88] = https://curl.haxx.se/bug/?i=4496
- [89] = https://curl.haxx.se/bug/?i=4503
- [90] = https://curl.haxx.se/bug/?i=4502
- [91] = https://curl.haxx.se/bug/?i=4511
- [92] = https://curl.haxx.se/bug/?i=4512
- [93] = https://curl.haxx.se/bug/?i=4531
- [94] = https://curl.haxx.se/bug/?i=4526
- [95] = https://curl.haxx.se/bug/?i=4523
- [96] = https://curl.haxx.se/bug/?i=4518
- [97] = https://curl.haxx.se/bug/?i=4520
- [98] = https://curl.haxx.se/bug/?i=4508
- [99] = https://curl.haxx.se/bug/?i=4499
- [100] = https://curl.haxx.se/bug/?i=4551
- [101] = https://curl.haxx.se/bug/?i=4547
- [102] = https://curl.haxx.se/bug/?i=4552
- [103] = https://curl.haxx.se/mail/lib-2019-10/0104.html
- [104] = https://curl.haxx.se/bug/?i=4487
- [105] = https://curl.haxx.se/bug/?i=4509
- [106] = https://curl.haxx.se/bug/?i=4539
- [107] = https://curl.haxx.se/bug/?i=4463
- [108] = https://curl.haxx.se/bug/?i=4535
- [109] = https://curl.haxx.se/bug/?i=4529
- [110] = https://curl.haxx.se/bug/?i=4555
+ [1] = https://curl.haxx.se/bug/?i=3516
+ [2] = https://curl.haxx.se/bug/?i=3550
+ [3] = https://curl.haxx.se/bug/?i=3541
+ [4] = https://curl.haxx.se/bug/?i=3544
+ [5] = https://curl.haxx.se/bug/?i=3538
+ [6] = https://curl.haxx.se/bug/?i=3539
+ [7] = https://curl.haxx.se/bug/?i=3540
+ [8] = https://bugs.debian.org/921452
+ [9] = https://curl.haxx.se/bug/?i=3534
+ [10] = https://curl.haxx.se/bug/?i=3412
+ [11] = https://curl.haxx.se/bug/?i=3572
+ [12] = https://curl.haxx.se/bug/?i=3571
+ [13] = https://curl.haxx.se/bug/?i=3564
+ [14] = https://curl.haxx.se/bug/?i=3542
+ [15] = https://curl.haxx.se/bug/?i=3569
+ [16] = https://curl.haxx.se/bug/?i=3566
+ [17] = https://curl.haxx.se/bug/?i=3565
+ [18] = https://curl.haxx.se/bug/?i=3561
+ [19] = https://curl.haxx.se/bug/?i=3552
+ [20] = https://curl.haxx.se/bug/?i=3562
+ [21] = https://curl.haxx.se/bug/?i=3557
+ [22] = https://curl.haxx.se/bug/?i=3548
+ [23] = https://curl.haxx.se/mail/archive-2019-02/0013.html
+ [24] = https://curl.haxx.se/bug/?i=3553
+ [25] = https://curl.haxx.se/bug/?i=3551
+ [26] = https://curl.haxx.se/bug/?i=3536
+ [27] = https://curl.haxx.se/bug/?i=3532
+ [28] = https://curl.haxx.se/bug/?i=3574
+ [29] = https://curl.haxx.se/bug/?i=3554
+ [30] = https://curl.haxx.se/bug/?i=3313
+ [31] = https://curl.haxx.se/bug/?i=3580
+ [32] = https://curl.haxx.se/bug/?i=3584
+ [33] = https://curl.haxx.se/bug/?i=3578
+ [34] = https://curl.haxx.se/bug/?i=3582
+ [35] = https://curl.haxx.se/mail/lib-2019-02/0064.html
+ [36] = https://curl.haxx.se/bug/?i=3585
+ [37] = https://curl.haxx.se/bug/?i=3577
+ [38] = https://curl.haxx.se/bug/?i=3587
+ [39] = https://curl.haxx.se/mail/lib-2019-02/0101.html
+ [40] = https://curl.haxx.se/bug/?i=3600
+ [41] = https://curl.haxx.se/bug/?i=3599
+ [42] = https://curl.haxx.se/bug/?i=3537
+ [43] = https://curl.haxx.se/bug/?i=3602
+ [44] = https://curl.haxx.se/bug/?i=3608
+ [45] = https://curl.haxx.se/bug/?i=3595
+ [46] = https://curl.haxx.se/bug/?i=3591
+ [47] = https://curl.haxx.se/bug/?i=3613
+ [48] = https://curl.haxx.se/bug/?i=3612
+ [49] = https://curl.haxx.se/bug/?i=3606
+ [50] = https://curl.haxx.se/bug/?i=3609
+ [51] = https://curl.haxx.se/bug/?i=3611
+ [52] = https://curl.haxx.se/bug/?i=3616
+ [53] = https://curl.haxx.se/bug/?i=3610
+ [54] = https://curl.haxx.se/bug/?i=3421
+ [55] = https://curl.haxx.se/bug/?i=3623
+ [56] = https://curl.haxx.se/bug/?i=3619
+ [57] = https://curl.haxx.se/mail/archive-2019-02/0023.html
+ [58] = https://curl.haxx.se/bug/?i=3626
+ [59] = https://curl.haxx.se/bug/?i=3631
+ [60] = https://curl.haxx.se/bug/?i=3628
+ [61] = https://curl.haxx.se/bug/?i=3629
+ [62] = https://curl.haxx.se/bug/?i=3627
+ [63] = https://curl.haxx.se/bug/?i=3632
+ [64] = https://curl.haxx.se/bug/?i=3592
+ [65] = https://curl.haxx.se/bug/?i=3625
+ [66] = https://curl.haxx.se/bug/?i=3636
+ [67] = https://curl.haxx.se/bug/?i=3545
+ [68] = https://curl.haxx.se/bug/?i=3546
+ [69] = https://curl.haxx.se/bug/?i=3617
+ [70] = https://curl.haxx.se/bug/?i=3645
+ [71] = https://curl.haxx.se/bug/?i=3506
+ [72] = https://curl.haxx.se/bug/?i=3618
+ [73] = https://curl.haxx.se/bug/?i=3641
+ [74] = https://curl.haxx.se/bug/?i=3498
+ [76] = https://curl.haxx.se/bug/?i=3637
+ [77] = https://curl.haxx.se/bug/?i=3670
+ [78] = https://curl.haxx.se/bug/?i=3663
+ [79] = https://curl.haxx.se/bug/?i=3666
+ [80] = https://curl.haxx.se/bug/?i=3660
+ [81] = https://curl.haxx.se/bug/?i=3649
+ [82] = https://curl.haxx.se/bug/?i=3656
+ [83] = https://curl.haxx.se/bug/?i=3658
+ [84] = https://curl.haxx.se/bug/?i=3677
+ [85] = https://curl.haxx.se/bug/?i=3681
+ [86] = https://curl.haxx.se/bug/?i=3680
+ [87] = https://curl.haxx.se/bug/?i=3682
+ [88] = https://curl.haxx.se/bug/?i=1261
+ [89] = https://curl.haxx.se/bug/?i=2431
+ [90] = https://curl.haxx.se/bug/?i=3672
+ [91] = https://curl.haxx.se/bug/?i=3671
+ [92] = https://curl.haxx.se/bug/?i=3697
+ [93] = https://curl.haxx.se/bug/?i=3692
+ [94] = https://curl.haxx.se/bug/?i=3689
+ [95] = https://curl.haxx.se/bug/?i=3686
+ [96] = https://github.com/curl/curl/issues/3175#issuecomment-439068724
+
diff --git a/aclocal.m4 b/aclocal.m4
index edb17e401..a061f5b8a 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.16'
+[am__api_version='1.15'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.16.1], [],
+m4_if([$1], [1.15.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.1])dnl
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -332,12 +332,13 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
@@ -345,41 +346,49 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
- # TODO: see whether this extra hack can be removed once we start
- # requiring Autoconf 2.70 or later.
- AS_CASE([$CONFIG_FILES],
- [*\'*], [eval set x "$CONFIG_FILES"],
- [*], [set x $CONFIG_FILES])
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
shift
- # Used to flag and report bootstrapping failures.
- am_rc=0
- for am_mf
+ for mf
do
# Strip MF so we end up with the name of the file.
- am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile which includes
- # dependency-tracking related rules and includes.
- # Grep'ing the whole file directly is not great: AIX grep has a line
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
# limit of 2048, but all sed's we know have understand at least 4000.
- sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
- || continue
- am_dirpart=`AS_DIRNAME(["$am_mf"])`
- am_filepart=`AS_BASENAME(["$am_mf"])`
- AM_RUN_LOG([cd "$am_dirpart" \
- && sed -e '/# am--include-marker/d' "$am_filepart" \
- | $MAKE -f - am--depfiles]) || am_rc=$?
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
done
- if test $am_rc -ne 0; then
- AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
- for automatic dependency tracking. Try re-running configure with the
- '--disable-dependency-tracking' option to at least be able to build
- the package (albeit without support for automatic dependency tracking).])
- fi
- AS_UNSET([am_dirpart])
- AS_UNSET([am_filepart])
- AS_UNSET([am_mf])
- AS_UNSET([am_rc])
- rm -f conftest-deps.mk
}
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
@@ -388,17 +397,18 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# -----------------------------
# This macro should only be invoked once -- use via AC_REQUIRE.
#
-# This code is only required when automatic dependency tracking is enabled.
-# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
-# order to bootstrap the dependency handling code.
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
- [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -485,8 +495,8 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
# For better backward compatibility. To be removed once Automake 1.9.x
# dies out for good. For more background, see:
-# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
# We need awk for the "check" target (and possibly the TAP driver). The
# system "awk" is bad on some platforms.
@@ -553,7 +563,7 @@ END
Aborting the configuration process, to ensure you take notice of the issue.
You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <https://www.gnu.org/software/coreutils/>.
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
If you want to complete the configuration process using your problematic
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -595,7 +605,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -616,7 +626,7 @@ if test x"${install_sh+set}" != xset; then
fi
AC_SUBST([install_sh])])
-# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -638,7 +648,7 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -673,7 +683,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -681,42 +691,49 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
# AM_MAKE_INCLUDE()
# -----------------
-# Check whether make has an 'include' directive that can support all
-# the idioms we need for our automatic dependency tracking code.
+# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
-[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
-cat > confinc.mk << 'END'
+[am_make=${MAKE-make}
+cat > confinc << 'END'
am__doit:
- @echo this is the am__doit target >confinc.out
+ @echo this is the am__doit target
.PHONY: am__doit
END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
am__include="#"
am__quote=
-# BSD make does it like this.
-echo '.include "confinc.mk" # ignored' > confmf.BSD
-# Other make implementations (GNU, Solaris 10, AIX) do it like this.
-echo 'include confinc.mk # ignored' > confmf.GNU
-_am_result=no
-for s in GNU BSD; do
- AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
- AS_CASE([$?:`cat confinc.out 2>/dev/null`],
- ['0:this is the am__doit target'],
- [AS_CASE([$s],
- [BSD], [am__include='.include' am__quote='"'],
- [am__include='include' am__quote=''])])
- if test "$am__include" != "#"; then
- _am_result="yes ($s style)"
- break
- fi
-done
-rm -f confinc.* confmf.*
-AC_MSG_RESULT([${_am_result}])
-AC_SUBST([am__include])])
-AC_SUBST([am__quote])])
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -755,7 +772,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -784,7 +801,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -831,7 +848,7 @@ AC_LANG_POP([C])])
# For backward compatibility.
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -850,7 +867,7 @@ AC_DEFUN([AM_RUN_LOG],
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -931,7 +948,7 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file
])
-# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -991,7 +1008,7 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1019,7 +1036,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1038,7 +1055,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/androidconfigure b/androidconfigure
index 387e5881d..cb2d031c6 100755
--- a/androidconfigure
+++ b/androidconfigure
@@ -13,8 +13,8 @@ cd $(dirname "$0")
HOST="arm-linux-androideabi"
T="${ANDROID_BUILD_TOP}"
-export CC="${T}/prebuilts/clang/host/linux-x86/clang-r365631c/bin/clang"
-export LD="${T}/prebuilts/clang/host/linux-x86/clang-r365631c/bin/lld"
+export CC="${T}/prebuilts/clang/host/linux-x86/clang-r353983/bin/clang"
+export LD="${T}/prebuilts/clang/host/linux-x86/clang-r353983/bin/lld"
CFLAGS=(
"-isystem ${T}/external/libcxx/include"
diff --git a/buildconf.bat b/buildconf.bat
index 043523315..a6bded34b 100644
--- a/buildconf.bat
+++ b/buildconf.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+rem * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
rem *
rem * This software is licensed as described in the file COPYING, which
rem * you should have received as part of this distribution. The terms
@@ -212,7 +212,7 @@ rem
copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c 1>NUL 2>&1
) else (
echo #include "tool_setup.h"> src\tool_hugehelp.c
- echo #include "tool_hugehelp.h">> src\tool_hugehelp.c
+ echo #include "tool_hugehelp.hd">> src\tool_hugehelp.c
echo.>> src\tool_hugehelp.c
echo void hugehelp(void^)>> src\tool_hugehelp.c
echo {>> src\tool_hugehelp.c
diff --git a/compile b/compile
index 99e50524b..a85b723c7 100755
--- a/compile
+++ b/compile
@@ -1,9 +1,9 @@
#! /bin/sh
# Wrapper for compilers which do not understand '-c -o'.
-scriptversion=2018-03-07.03; # UTC
+scriptversion=2012-10-14.11; # UTC
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
@@ -17,7 +17,7 @@ scriptversion=2018-03-07.03; # UTC
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -255,8 +255,7 @@ EOF
echo "compile $scriptversion"
exit $?
;;
- cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
- icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
func_cl_wrapper "$@" # Doesn't return...
;;
esac
@@ -340,9 +339,9 @@ exit $ret
# Local Variables:
# mode: shell-script
# sh-indentation: 2
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
diff --git a/configure b/configure
index 45c2bd730..0eeb12c0a 100755
--- a/configure
+++ b/configure
@@ -905,10 +905,6 @@ PERL
IPV6_ENABLED
FISH_FUNCTIONS_DIR
ZSH_FUNCTIONS_DIR
-USE_QUICHE
-USE_NGHTTP3
-USE_NGTCP2_CRYPTO_OPENSSL
-USE_NGTCP2
USE_NGHTTP2
IDN_ENABLED
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE
@@ -928,8 +924,9 @@ SSL_ENABLED
NSS_LIBS
USE_NSS
USE_MESALINK
-USE_WOLFSSL
+USE_CYASSL
USE_MBEDTLS
+USE_POLARSSL
HAVE_GNUTLS_SRP
USE_GNUTLS_NETTLE
USE_GNUTLS
@@ -1024,6 +1021,7 @@ am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
+am__quote
am__include
DEPDIR
am__untar
@@ -1111,8 +1109,7 @@ PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
SHELL
-PATH_SEPARATOR
-am__quote'
+PATH_SEPARATOR'
ac_subst_files=''
ac_user_opts='
enable_option_checking
@@ -1127,7 +1124,6 @@ enable_symbol_hiding
enable_hidden_symbols
enable_ares
enable_rt
-enable_esni
enable_code_coverage
enable_dependency_tracking
enable_largefile
@@ -1176,7 +1172,9 @@ with_egd_socket
with_random
enable_openssl_auto_load_config
with_gnutls
+with_polarssl
with_mbedtls
+with_cyassl
with_wolfssl
with_mesalink
with_nss
@@ -1192,9 +1190,6 @@ enable_versioned_symbols
with_winidn
with_libidn2
with_nghttp2
-with_ngtcp2
-with_nghttp3
-with_quiche
with_zsh_functions_dir
with_fish_functions_dir
enable_threaded_resolver
@@ -1206,13 +1201,6 @@ enable_ntlm_wb
enable_tls_srp
enable_unix_sockets
enable_cookies
-enable_http_auth
-enable_doh
-enable_mime
-enable_dateparse
-enable_netrc
-enable_progress_meter
-enable_dnsshuffle
enable_alt_svc
'
ac_precious_vars='build_alias
@@ -1877,8 +1865,6 @@ Optional Features:
--enable-ares[=PATH] Enable c-ares for DNS lookups
--disable-ares Disable c-ares for DNS lookups
--disable-rt disable dependency on -lrt
- --enable-esni Enable ESNI support
- --disable-esni Disable ESNI support
--enable-code-coverage Provide code coverage
--enable-dependency-tracking
do not reject slow dependency extractors
@@ -1959,21 +1945,6 @@ Optional Features:
--disable-unix-sockets Disable Unix domain sockets
--enable-cookies Enable cookies support
--disable-cookies Disable cookies support
- --enable-http-auth Enable HTTP authentication support
- --disable-http-auth Disable HTTP authentication support
- --enable-doh Enable DoH support
- --disable-doh Disable DoH support
- --enable-mime Enable mime API support
- --disable-mime Disable mime API support
- --enable-dateparse Enable date parsing
- --disable-dateparse Disable date parsing
- --enable-netrc Enable netrc parsing
- --disable-netrc Disable netrc parsing
- --enable-progress-meter Enable progress-meter
- --disable-progress-meter
- Disable progress-meter
- --enable-dnsshuffle Enable DNS shuffling
- --disable-dnsshuffle Disable DNS shufflinf
--enable-alt-svc Enable alt-svc support
--disable-alt-svc Disable alt-svc support
@@ -2025,9 +1996,15 @@ Optional Packages:
--with-gnutls=PATH where to look for GnuTLS, PATH points to the
installation root
--without-gnutls disable GnuTLS detection
+ --with-polarssl=PATH where to look for PolarSSL, PATH points to the
+ installation root
+ --without-polarssl disable PolarSSL detection
--with-mbedtls=PATH where to look for mbedTLS, PATH points to the
installation root
--without-mbedtls disable mbedTLS detection
+ --with-cyassl=PATH where to look for CyaSSL, PATH points to the
+ installation root (default: system lib default)
+ --without-cyassl disable CyaSSL detection
--with-wolfssl=PATH where to look for WolfSSL, PATH points to the
installation root (default: system lib default)
--without-wolfssl disable WolfSSL detection
@@ -2073,12 +2050,6 @@ Optional Packages:
--without-libidn2 Disable libidn2 usage
--with-nghttp2=PATH Enable nghttp2 usage
--without-nghttp2 Disable nghttp2 usage
- --with-ngtcp2=PATH Enable ngtcp2 usage
- --without-ngtcp2 Disable ngtcp2 usage
- --with-nghttp3=PATH Enable nghttp3 usage
- --without-nghttp3 Disable nghttp3 usage
- --with-quiche=PATH Enable quiche usage
- --without-quiche Disable quiche usage
--with-zsh-functions-dir=PATH
Install zsh completions to PATH
--without-zsh-functions-dir
@@ -3330,37 +3301,6 @@ $as_echo "no" >&6; }
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ESNI support" >&5
-$as_echo_n "checking whether to enable ESNI support... " >&6; }
- OPT_ESNI="default"
- # Check whether --enable-esni was given.
-if test "${enable_esni+set}" = set; then :
- enableval=$enable_esni; OPT_ESNI=$enableval
-fi
-
- case "$OPT_ESNI" in
- no)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- default)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- *)
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-
-
#
# Check that 'XC_CONFIGURE_PREAMBLE' has already run.
#
@@ -5041,7 +4981,9 @@ $as_echo_n "checking for code coverage support... " >&6; }
# Check whether --enable-code-coverage was given.
if test "${enable_code_coverage+set}" = set; then :
- enableval=$enable_code_coverage; coverage="$enableval"
+ enableval=$enable_code_coverage; coverage="yes"
+else
+ coverage="no"
fi
@@ -5196,7 +5138,7 @@ fi
fi
-am__api_version='1.16'
+am__api_version='1.15'
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
@@ -5529,45 +5471,45 @@ DEPDIR="${am__leading_dot}deps"
ac_config_commands="$ac_config_commands depfiles"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
-$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
-cat > confinc.mk << 'END'
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
am__doit:
- @echo this is the am__doit target >confinc.out
+ @echo this is the am__doit target
.PHONY: am__doit
END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
am__include="#"
am__quote=
-# BSD make does it like this.
-echo '.include "confinc.mk" # ignored' > confmf.BSD
-# Other make implementations (GNU, Solaris 10, AIX) do it like this.
-echo 'include confinc.mk # ignored' > confmf.GNU
-_am_result=no
-for s in GNU BSD; do
- { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
- (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
- case $?:`cat confinc.out 2>/dev/null` in #(
- '0:this is the am__doit target') :
- case $s in #(
- BSD) :
- am__include='.include' am__quote='"' ;; #(
- *) :
- am__include='include' am__quote='' ;;
-esac ;; #(
- *) :
- ;;
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
esac
- if test "$am__include" != "#"; then
- _am_result="yes ($s style)"
- break
- fi
-done
-rm -f confinc.* confmf.*
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
-$as_echo "${_am_result}" >&6; }
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
# Check whether --enable-dependency-tracking was given.
if test "${enable_dependency_tracking+set}" = set; then :
@@ -5644,8 +5586,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
# For better backward compatibility. To be removed once Automake 1.9.x
# dies out for good. For more background, see:
-# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
mkdir_p='$(MKDIR_P)'
# We need awk for the "check" target (and possibly the TAP driver). The
@@ -5824,7 +5766,7 @@ END
Aborting the configuration process, to ensure you take notice of the issue.
You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <https://www.gnu.org/software/coreutils/>.
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
If you want to complete the configuration process using your problematic
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -5857,7 +5799,7 @@ PKGADD_VENDOR="curl.haxx.se"
- curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl} )"
+ curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,schannel,secure-transport,mesalink,amissl} )"
curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)"
curl_brotli_msg="no (--with-brotli)"
@@ -9264,8 +9206,11 @@ _LT_EOF
test $ac_status = 0; }; then
# Now try to grab the symbols.
nlist=conftest.nm
- $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5
- if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
@@ -21839,6 +21784,10 @@ fi
fi
+if test "$ipv6" = "yes"; then
+ curl_ipv6_msg="enabled"
+fi
+
# Check if struct sockaddr_in6 have sin6_scope_id member
if test "$ipv6" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct sockaddr_in6 has sin6_scope_id member" >&5
@@ -22300,7 +22249,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Amiga native SSL/TLS (AmiSSL)" >&5
$as_echo_n "checking whether to enable Amiga native SSL/TLS (AmiSSL)... " >&6; }
-if test "$HAVE_PROTO_BSDSOCKET_H" = "1"; then
+if test "$HAVE_PROTO_BSDSOCKET_H" == "1"; then
if test -z "$ssl_backends" -o "x$OPT_AMISSL" != xno; then
ssl_msg=
if test "x$OPT_AMISSL" != "xno"; then
@@ -22904,6 +22853,7 @@ done
if test X"$OPENSSL_ENABLED" = X"1"; then
for ac_func in RAND_egd \
+ SSL_get_shutdown \
SSLv2_client_method \
OpenSSL_version
do :
@@ -23669,16 +23619,6 @@ $as_echo "$as_me: WARNING: $tst_warns" >&2;}
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-if test X"$OPT_SSL" != Xoff &&
- test X"$OPT_SSL" != Xno &&
- test "$OPENSSL_ENABLED" != "1"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: OPT_SSL: $OPT_SSL" >&5
-$as_echo "$as_me: OPT_SSL: $OPT_SSL" >&6;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: OPENSSL_ENABLED: $OPENSSL_ENABLED" >&5
-$as_echo "$as_me: OPENSSL_ENABLED: $OPENSSL_ENABLED" >&6;}
- as_fn_error $? "--with-ssl was given but OpenSSL could not be detected" "$LINENO" 5
-fi
-
if test X"$OPENSSL_ENABLED" = X"1"; then
@@ -24306,6 +24246,167 @@ fi
fi
+OPT_POLARSSL=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+
+# Check whether --with-polarssl was given.
+if test "${with_polarssl+set}" = set; then :
+ withval=$with_polarssl; OPT_POLARSSL=$withval
+fi
+
+
+if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
+ ssl_msg=
+
+ if test X"$OPT_POLARSSL" != Xno; then
+
+ if test "$OPT_POLARSSL" = "yes"; then
+ OPT_POLARSSL=""
+ fi
+
+ if test -z "$OPT_POLARSSL" ; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for havege_init in -lpolarssl" >&5
+$as_echo_n "checking for havege_init in -lpolarssl... " >&6; }
+if ${ac_cv_lib_polarssl_havege_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpolarssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char havege_init ();
+int main (void)
+{
+return havege_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_polarssl_havege_init=yes
+else
+ ac_cv_lib_polarssl_havege_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_havege_init" >&5
+$as_echo "$ac_cv_lib_polarssl_havege_init" >&6; }
+if test "x$ac_cv_lib_polarssl_havege_init" = xyes; then :
+
+
+$as_echo "#define USE_POLARSSL 1" >>confdefs.h
+
+ USE_POLARSSL=1
+
+ POLARSSL_ENABLED=1
+ USE_POLARSSL="yes"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+fi
+
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+ polarssllib=""
+
+ if test "x$USE_POLARSSL" != "xyes"; then
+ addld=-L$OPT_POLARSSL/lib$libsuff
+ addcflags=-I$OPT_POLARSSL/include
+ polarssllib=$OPT_POLARSSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssl_init in -lpolarssl" >&5
+$as_echo_n "checking for ssl_init in -lpolarssl... " >&6; }
+if ${ac_cv_lib_polarssl_ssl_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpolarssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char ssl_init ();
+int main (void)
+{
+return ssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_polarssl_ssl_init=yes
+else
+ ac_cv_lib_polarssl_ssl_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_ssl_init" >&5
+$as_echo "$ac_cv_lib_polarssl_ssl_init" >&6; }
+if test "x$ac_cv_lib_polarssl_ssl_init" = xyes; then :
+
+
+$as_echo "#define USE_POLARSSL 1" >>confdefs.h
+
+ USE_POLARSSL=1
+
+ POLARSSL_ENABLED=1
+ USE_POLARSSL="yes"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+else
+
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+
+fi
+
+ fi
+
+ if test "x$USE_POLARSSL" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: detected PolarSSL" >&5
+$as_echo "$as_me: detected PolarSSL" >&6;}
+ check_for_ca_bundle=1
+ LIBS="-lpolarssl $LIBS"
+
+ if test -n "$polarssllib"; then
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$polarssllib"
+ export CURL_LIBRARY_PATH
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $polarssllib to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $polarssllib to CURL_LIBRARY_PATH" >&6;}
+ fi
+ fi
+ fi
+
+ fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+
OPT_MBEDTLS=no
_cppflags=$CPPFLAGS
@@ -24468,46 +24569,177 @@ $as_echo "$as_me: Added $mbedtlslib to CURL_LIBRARY_PATH" >&6;}
fi
-OPT_WOLFSSL=no
+OPT_CYASSL=no
_cppflags=$CPPFLAGS
_ldflags=$LDFLAGS
+# Check whether --with-cyassl was given.
+if test "${with_cyassl+set}" = set; then :
+ withval=$with_cyassl; OPT_CYASSL=$withval
+fi
+
+
# Check whether --with-wolfssl was given.
if test "${with_wolfssl+set}" = set; then :
- withval=$with_wolfssl; OPT_WOLFSSL=$withval
+ withval=$with_wolfssl; OPT_CYASSL=$withval
fi
-if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
ssl_msg=
- if test X"$OPT_WOLFSSL" != Xno; then
+ if test X"$OPT_CYASSL" != Xno; then
+
+ if test "$OPT_CYASSL" = "yes"; then
+ OPT_CYASSL=""
+ fi
+
+
+ cyassllibname=cyassl
+
+ if test -z "$OPT_CYASSL" ; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lcyassl" >&5
+$as_echo_n "checking for CyaSSL_Init in -lcyassl... " >&6; }
+if ${ac_cv_lib_cyassl_CyaSSL_Init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcyassl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char CyaSSL_Init ();
+int main (void)
+{
+return CyaSSL_Init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cyassl_CyaSSL_Init=yes
+else
+ ac_cv_lib_cyassl_CyaSSL_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cyassl_CyaSSL_Init" >&5
+$as_echo "$ac_cv_lib_cyassl_CyaSSL_Init" >&6; }
+if test "x$ac_cv_lib_cyassl_CyaSSL_Init" = xyes; then :
+
+
+$as_echo "#define USE_CYASSL 1" >>confdefs.h
+
+ USE_CYASSL=1
+
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+fi
+
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+ cyassllib=""
+
+ if test "x$USE_CYASSL" != "xyes"; then
+ addld=-L$OPT_CYASSL/lib$libsuff
+ addcflags=-I$OPT_CYASSL/include
+ cyassllib=$OPT_CYASSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lcyassl" >&5
+$as_echo_n "checking for CyaSSL_Init in -lcyassl... " >&6; }
+if ${ac_cv_lib_cyassl_CyaSSL_Init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcyassl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char CyaSSL_Init ();
+int main (void)
+{
+return CyaSSL_Init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_cyassl_CyaSSL_Init=yes
+else
+ ac_cv_lib_cyassl_CyaSSL_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cyassl_CyaSSL_Init" >&5
+$as_echo "$ac_cv_lib_cyassl_CyaSSL_Init" >&6; }
+if test "x$ac_cv_lib_cyassl_CyaSSL_Init" = xyes; then :
+
+
+$as_echo "#define USE_CYASSL 1" >>confdefs.h
+
+ USE_CYASSL=1
+
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+else
+
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+ cyassllib=""
+
+fi
- if test "$OPT_WOLFSSL" = "yes"; then
- OPT_WOLFSSL=""
fi
addld=""
addlib=""
addcflags=""
- if test "x$USE_WOLFSSL" != "xyes"; then
- addld=-L$OPT_WOLFSSL/lib$libsuff
- addcflags=-I$OPT_WOLFSSL/include
- wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
+ if test "x$USE_CYASSL" != "xyes"; then
+ addld=-L$OPT_CYASSL/lib$libsuff
+ addcflags=-I$OPT_CYASSL/include
+ cyassllib=$OPT_CYASSL/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
+ cyassllibname=wolfssl
my_ac_save_LIBS="$LIBS"
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="-l$cyassllibname -lm $LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wolfSSL_Init in -lwolfssl" >&5
-$as_echo_n "checking for wolfSSL_Init in -lwolfssl... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lwolfssl" >&5
+$as_echo_n "checking for CyaSSL_Init in -lwolfssl... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -24516,12 +24748,12 @@ $as_echo_n "checking for wolfSSL_Init in -lwolfssl... " >&6; }
They are set up properly later if it is detected. */
#undef SIZEOF_LONG
#undef SIZEOF_LONG_LONG
-#include <wolfssl/ssl.h>
+#include <cyassl/ssl.h>
int main (void)
{
- return wolfSSL_Init();
+ return CyaSSL_Init();
;
return 0;
@@ -24533,14 +24765,14 @@ if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
-$as_echo "#define USE_WOLFSSL 1" >>confdefs.h
+$as_echo "#define USE_CYASSL 1" >>confdefs.h
- USE_WOLFSSL=1
+ USE_CYASSL=1
- WOLFSSL_ENABLED=1
- USE_WOLFSSL="yes"
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
ssl_msg="WolfSSL"
- test wolfssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
else
@@ -24548,7 +24780,7 @@ else
$as_echo "no" >&6; }
CPPFLAGS=$_cppflags
LDFLAGS=$_ldflags
- wolfssllibpath=""
+ cyassllib=""
fi
rm -f core conftest.err conftest.$ac_objext \
@@ -24556,9 +24788,9 @@ rm -f core conftest.err conftest.$ac_objext \
LIBS="$my_ac_save_LIBS"
fi
- if test "x$USE_WOLFSSL" = "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: detected wolfSSL" >&5
-$as_echo "$as_me: detected wolfSSL" >&6;}
+ if test "x$USE_CYASSL" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: detected $cyassllibname" >&5
+$as_echo "$as_me: detected $cyassllibname" >&6;}
check_for_ca_bundle=1
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
@@ -24601,11 +24833,38 @@ _ACEOF
- LIBS="-lwolfssl -lm $LIBS"
+ for ac_header in cyassl/options.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "cyassl/options.h" "ac_cv_header_cyassl_options_h" "$ac_includes_default"
+if test "x$ac_cv_header_cyassl_options_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_CYASSL_OPTIONS_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ for ac_header in cyassl/error-ssl.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "cyassl/error-ssl.h" "ac_cv_header_cyassl_error_ssl_h" "$ac_includes_default"
+if test "x$ac_cv_header_cyassl_error_ssl_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_CYASSL_ERROR_SSL_H 1
+_ACEOF
+
+fi
+
+done
+
- for ac_func in wolfSSLv3_client_method \
- wolfSSL_get_peer_certificate \
- wolfSSL_UseALPN
+ LIBS="-l$cyassllibname -lm $LIBS"
+
+ if test "x$cyassllibname" = "xwolfssl"; then
+ for ac_func in wolfSSLv3_client_method \
+ wolfSSL_get_peer_certificate \
+ wolfSSL_UseALPN
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -24617,13 +24876,28 @@ _ACEOF
fi
done
+ else
+ for ac_func in CyaSSL_CTX_UseSupportedCurve \
+ CyaSSL_get_peer_certificate
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
- if test -n "$wolfssllibpath"; then
+fi
+done
+
+ fi
+
+ if test -n "$cyassllib"; then
if test "x$cross_compiling" != "xyes"; then
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath"
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$cyassllib"
export CURL_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: Added $wolfssllibpath to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $wolfssllibpath to CURL_LIBRARY_PATH" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $cyassllib to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $cyassllib to CURL_LIBRARY_PATH" >&6;}
fi
fi
@@ -25231,12 +25505,12 @@ $as_echo "$as_me: Added $nssprefix/lib$libsuff to CURL_LIBRARY_PATH" >&6;}
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
x)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&5
$as_echo "$as_me: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&5
-$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&5
+$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&2;}
;;
x1)
# one SSL backend is enabled
@@ -25281,7 +25555,7 @@ _ACEOF
fi
-if test -n "$check_for_ca_bundle"; then
+if test "$check_for_ca_bundle" -gt 0; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking default CA cert bundle/path" >&5
@@ -26682,8 +26956,10 @@ $as_echo "yes" >&6; }
versioned_symbols_flavour="GNUTLS_"
elif test "x$NSS_ENABLED" = "x1"; then
versioned_symbols_flavour="NSS_"
- elif test "x$WOLFSSL_ENABLED" = "x1"; then
- versioned_symbols_flavour="WOLFSSL_"
+ elif test "x$POLARSSL_ENABLED" = "x1"; then
+ versioned_symbols_flavour="POLARSSL_"
+ elif test "x$CYASSL_ENABLED" = "x1"; then
+ versioned_symbols_flavour="CYASSL_"
elif test "x$WINSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="SCHANNEL_"
elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
@@ -27531,1067 +27807,6 @@ fi
fi
-OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
-
-if test "x$disable_http" = "xyes"; then
- # without HTTP, ngtcp2 is no use
- OPT_TCP2="no"
-fi
-
-
-# Check whether --with-ngtcp2 was given.
-if test "${with_ngtcp2+set}" = set; then :
- withval=$with_ngtcp2; OPT_TCP2=$withval
-fi
-
-case "$OPT_TCP2" in
- no)
- want_tcp2="no"
- ;;
- yes)
- want_tcp2="default"
- want_tcp2_path=""
- ;;
- *)
- want_tcp2="yes"
- want_tcp2_path="$withval/lib/pkgconfig"
- ;;
-esac
-
-curl_tcp2_msg="disabled (--with-ngtcp2)"
-if test X"$want_tcp2" != Xno; then
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
-
- if test -n "$PKG_CONFIG"; then
- PKGCONFIG="$PKG_CONFIG"
- else
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKGCONFIG=$ac_cv_path_PKGCONFIG
-if test -n "$PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
-$as_echo "$PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKGCONFIG"; then
- ac_pt_PKGCONFIG=$PKGCONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
-if test -n "$ac_pt_PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
-$as_echo "$ac_pt_PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKGCONFIG" = x; then
- PKGCONFIG="no"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKGCONFIG=$ac_pt_PKGCONFIG
- fi
-else
- PKGCONFIG="$ac_cv_path_PKGCONFIG"
-fi
-
- fi
-
- if test "x$PKGCONFIG" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2 options with pkg-config" >&5
-$as_echo_n "checking for libngtcp2 options with pkg-config... " >&6; }
- itexists=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --exists libngtcp2 >/dev/null 2>&1 && echo 1`
-
- if test -z "$itexists"; then
- PKGCONFIG="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- fi
- fi
-
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_TCP2=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-l libngtcp2`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_TCP2" >&5
-$as_echo "$as_me: -l is $LIB_TCP2" >&6;}
-
- CPP_TCP2=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --cflags-only-I libngtcp2`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_TCP2" >&5
-$as_echo "$as_me: -I is $CPP_TCP2" >&6;}
-
- LD_TCP2=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-L libngtcp2`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_TCP2" >&5
-$as_echo "$as_me: -L is $LD_TCP2" >&6;}
-
- LDFLAGS="$LDFLAGS $LD_TCP2"
- CPPFLAGS="$CPPFLAGS $CPP_TCP2"
- LIBS="$LIB_TCP2 $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_conn_client_new in -lngtcp2" >&5
-$as_echo_n "checking for ngtcp2_conn_client_new in -lngtcp2... " >&6; }
-if ${ac_cv_lib_ngtcp2_ngtcp2_conn_client_new+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lngtcp2 $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char ngtcp2_conn_client_new ();
-int main (void)
-{
-return ngtcp2_conn_client_new ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=yes
-else
- ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&5
-$as_echo "$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&6; }
-if test "x$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" = xyes; then :
-
- for ac_header in ngtcp2/ngtcp2.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2.h" "ac_cv_header_ngtcp2_ngtcp2_h" "$ac_includes_default"
-if test "x$ac_cv_header_ngtcp2_ngtcp2_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_NGTCP2_NGTCP2_H 1
-_ACEOF
- NGTCP2_ENABLED=1
-
-$as_echo "#define USE_NGTCP2 1" >>confdefs.h
-
- USE_NGTCP2=1
-
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
- export CURL_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&6;}
-
-fi
-
-done
-
-
-else
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
-
-fi
-
-
- else
- if test X"$want_tcp2" != Xdefault; then
- as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file." "$LINENO" 5
- fi
- fi
-
-fi
-
-if test "x$NGTCP2_ENABLED" = "x1"; then
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
-
- if test -n "$PKG_CONFIG"; then
- PKGCONFIG="$PKG_CONFIG"
- else
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKGCONFIG=$ac_cv_path_PKGCONFIG
-if test -n "$PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
-$as_echo "$PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKGCONFIG"; then
- ac_pt_PKGCONFIG=$PKGCONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
-if test -n "$ac_pt_PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
-$as_echo "$ac_pt_PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKGCONFIG" = x; then
- PKGCONFIG="no"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKGCONFIG=$ac_pt_PKGCONFIG
- fi
-else
- PKGCONFIG="$ac_cv_path_PKGCONFIG"
-fi
-
- fi
-
- if test "x$PKGCONFIG" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2_crypto_openssl options with pkg-config" >&5
-$as_echo_n "checking for libngtcp2_crypto_openssl options with pkg-config... " >&6; }
- itexists=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --exists libngtcp2_crypto_openssl >/dev/null 2>&1 && echo 1`
-
- if test -z "$itexists"; then
- PKGCONFIG="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- fi
- fi
-
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_NGTCP2_CRYPTO_OPENSSL=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&5
-$as_echo "$as_me: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&6;}
-
- CPP_NGTCP2_CRYPTO_OPENSSL=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&5
-$as_echo "$as_me: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&6;}
-
- LD_NGTCP2_CRYPTO_OPENSSL=`
- if test -n "$want_tcp2_path"; then
- PKG_CONFIG_LIBDIR="$want_tcp2_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&5
-$as_echo "$as_me: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&6;}
-
- LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
- CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
- LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl" >&5
-$as_echo_n "checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl... " >&6; }
-if ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lngtcp2_crypto_openssl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char ngtcp2_crypto_ctx_initial ();
-int main (void)
-{
-return ngtcp2_crypto_ctx_initial ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=yes
-else
- ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&5
-$as_echo "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&6; }
-if test "x$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" = xyes; then :
-
- for ac_header in ngtcp2/ngtcp2_crypto.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2_crypto.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_h" "$ac_includes_default"
-if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_NGTCP2_NGTCP2_CRYPTO_H 1
-_ACEOF
- NGTCP2_ENABLED=1
-
-$as_echo "#define USE_NGTCP2_CRYPTO_OPENSSL 1" >>confdefs.h
-
- USE_NGTCP2_CRYPTO_OPENSSL=1
-
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
- export CURL_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&6;}
-
-fi
-
-done
-
-
-else
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
-
-fi
-
-
- else
- if test X"$want_tcp2" != Xdefault; then
- as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file." "$LINENO" 5
- fi
- fi
-fi
-
-
-OPT_NGHTTP3="yes"
-
-if test "x$NGTCP2_ENABLED" = "x"; then
- # without ngtcp2, nghttp3 is of no use for us
- OPT_NGHTTP3="no"
-fi
-
-
-# Check whether --with-nghttp3 was given.
-if test "${with_nghttp3+set}" = set; then :
- withval=$with_nghttp3; OPT_NGHTTP3=$withval
-fi
-
-case "$OPT_NGHTTP3" in
- no)
- want_nghttp3="no"
- ;;
- yes)
- want_nghttp3="default"
- want_nghttp3_path=""
- ;;
- *)
- want_nghttp3="yes"
- want_nghttp3_path="$withval/lib/pkgconfig"
- ;;
-esac
-
-curl_http3_msg="disabled (--with-nghttp3)"
-if test X"$want_nghttp3" != Xno; then
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
-
- if test -n "$PKG_CONFIG"; then
- PKGCONFIG="$PKG_CONFIG"
- else
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKGCONFIG=$ac_cv_path_PKGCONFIG
-if test -n "$PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
-$as_echo "$PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKGCONFIG"; then
- ac_pt_PKGCONFIG=$PKGCONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
-if test -n "$ac_pt_PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
-$as_echo "$ac_pt_PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKGCONFIG" = x; then
- PKGCONFIG="no"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKGCONFIG=$ac_pt_PKGCONFIG
- fi
-else
- PKGCONFIG="$ac_cv_path_PKGCONFIG"
-fi
-
- fi
-
- if test "x$PKGCONFIG" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnghttp3 options with pkg-config" >&5
-$as_echo_n "checking for libnghttp3 options with pkg-config... " >&6; }
- itexists=`
- if test -n "$want_nghttp3_path"; then
- PKG_CONFIG_LIBDIR="$want_nghttp3_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --exists libnghttp3 >/dev/null 2>&1 && echo 1`
-
- if test -z "$itexists"; then
- PKGCONFIG="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- fi
- fi
-
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_NGHTTP3=`
- if test -n "$want_nghttp3_path"; then
- PKG_CONFIG_LIBDIR="$want_nghttp3_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-l libnghttp3`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGHTTP3" >&5
-$as_echo "$as_me: -l is $LIB_NGHTTP3" >&6;}
-
- CPP_NGHTTP3=`
- if test -n "$want_nghttp3_path"; then
- PKG_CONFIG_LIBDIR="$want_nghttp3_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --cflags-only-I libnghttp3`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGHTTP3" >&5
-$as_echo "$as_me: -I is $CPP_NGHTTP3" >&6;}
-
- LD_NGHTTP3=`
- if test -n "$want_nghttp3_path"; then
- PKG_CONFIG_LIBDIR="$want_nghttp3_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-L libnghttp3`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGHTTP3" >&5
-$as_echo "$as_me: -L is $LD_NGHTTP3" >&6;}
-
- LDFLAGS="$LDFLAGS $LD_NGHTTP3"
- CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
- LIBS="$LIB_NGHTTP3 $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp3_conn_client_new in -lnghttp3" >&5
-$as_echo_n "checking for nghttp3_conn_client_new in -lnghttp3... " >&6; }
-if ${ac_cv_lib_nghttp3_nghttp3_conn_client_new+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnghttp3 $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char nghttp3_conn_client_new ();
-int main (void)
-{
-return nghttp3_conn_client_new ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_nghttp3_nghttp3_conn_client_new=yes
-else
- ac_cv_lib_nghttp3_nghttp3_conn_client_new=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&5
-$as_echo "$ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&6; }
-if test "x$ac_cv_lib_nghttp3_nghttp3_conn_client_new" = xyes; then :
-
- for ac_header in nghttp3/nghttp3.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "nghttp3/nghttp3.h" "ac_cv_header_nghttp3_nghttp3_h" "$ac_includes_default"
-if test "x$ac_cv_header_nghttp3_nghttp3_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_NGHTTP3_NGHTTP3_H 1
-_ACEOF
- curl_h3_msg="enabled (ngtcp2 + nghttp3)"
- NGHTTP3_ENABLED=1
-
-$as_echo "#define USE_NGHTTP3 1" >>confdefs.h
-
- USE_NGHTTP3=1
-
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
- export CURL_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&6;}
- experimental="$experimental HTTP3"
-
-fi
-
-done
-
-
-else
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
-
-fi
-
-
- else
- if test X"$want_nghttp3" != Xdefault; then
- as_fn_error $? "--with-nghttp3 was specified but could not find nghttp3 pkg-config file." "$LINENO" 5
- fi
- fi
-
-fi
-
-
-OPT_QUICHE="yes"
-
-if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
- # without HTTP or with ngtcp2, quiche is no use
- OPT_QUICHE="no"
-fi
-
-
-# Check whether --with-quiche was given.
-if test "${with_quiche+set}" = set; then :
- withval=$with_quiche; OPT_QUICHE=$withval
-fi
-
-case "$OPT_QUICHE" in
- no)
- want_quiche="no"
- ;;
- yes)
- want_quiche="default"
- want_quiche_path=""
- ;;
- *)
- want_quiche="yes"
- want_quiche_path="$withval"
- ;;
-esac
-
-if test X"$want_quiche" != Xno; then
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
-
- if test -n "$PKG_CONFIG"; then
- PKGCONFIG="$PKG_CONFIG"
- else
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKGCONFIG=$ac_cv_path_PKGCONFIG
-if test -n "$PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
-$as_echo "$PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKGCONFIG"; then
- ac_pt_PKGCONFIG=$PKGCONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
-if test -n "$ac_pt_PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
-$as_echo "$ac_pt_PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKGCONFIG" = x; then
- PKGCONFIG="no"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKGCONFIG=$ac_pt_PKGCONFIG
- fi
-else
- PKGCONFIG="$ac_cv_path_PKGCONFIG"
-fi
-
- fi
-
- if test "x$PKGCONFIG" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche options with pkg-config" >&5
-$as_echo_n "checking for quiche options with pkg-config... " >&6; }
- itexists=`
- if test -n "$want_quiche_path"; then
- PKG_CONFIG_LIBDIR="$want_quiche_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --exists quiche >/dev/null 2>&1 && echo 1`
-
- if test -z "$itexists"; then
- PKGCONFIG="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- fi
- fi
-
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_QUICHE=`
- if test -n "$want_quiche_path"; then
- PKG_CONFIG_LIBDIR="$want_quiche_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-l quiche`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_QUICHE" >&5
-$as_echo "$as_me: -l is $LIB_QUICHE" >&6;}
-
- CPP_QUICHE=`
- if test -n "$want_quiche_path"; then
- PKG_CONFIG_LIBDIR="$want_quiche_path"
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --cflags-only-I quiche`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_QUICHE" >&5
-$as_echo "$as_me: -I is $CPP_QUICHE" >&6;}
-
- LD_QUICHE=`
- if test -n "$want_quiche_path"; then
- PKG_CONFIG_LIBDIR="$want_quiche_path"
- export PKG_CONFIG_LIBDIR
- fi
-
- $PKGCONFIG --libs-only-L quiche`
- { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_QUICHE" >&5
-$as_echo "$as_me: -L is $LD_QUICHE" >&6;}
-
- LDFLAGS="$LDFLAGS $LD_QUICHE"
- CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
- LIBS="$LIB_QUICHE $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche_connect in -lquiche" >&5
-$as_echo_n "checking for quiche_connect in -lquiche... " >&6; }
-if ${ac_cv_lib_quiche_quiche_connect+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lquiche $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char quiche_connect ();
-int main (void)
-{
-return quiche_connect ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_quiche_quiche_connect=yes
-else
- ac_cv_lib_quiche_quiche_connect=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quiche_quiche_connect" >&5
-$as_echo "$ac_cv_lib_quiche_quiche_connect" >&6; }
-if test "x$ac_cv_lib_quiche_quiche_connect" = xyes; then :
-
- for ac_header in quiche.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "quiche.h" "ac_cv_header_quiche_h" "$ac_includes_default"
-if test "x$ac_cv_header_quiche_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_QUICHE_H 1
-_ACEOF
- experimental="$experimental HTTP3"
- { $as_echo "$as_me:${as_lineno-$LINENO}: HTTP3 support is experimental" >&5
-$as_echo "$as_me: HTTP3 support is experimental" >&6;}
- curl_h3_msg="enabled (quiche)"
- QUICHE_ENABLED=1
-
-$as_echo "#define USE_QUICHE 1" >>confdefs.h
-
- USE_QUICHE=1
-
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
- export CURL_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&6;}
-fi
-
-done
-
-
-else
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
-
-fi
-
- else
- if test X"$want_quiche" != Xdefault; then
- as_fn_error $? "--with-quiche was specified but could not find quiche pkg-config file." "$LINENO" 5
- fi
- fi
-fi
-
-
OPT_ZSH_FPATH=default
# Check whether --with-zsh-functions-dir was given.
@@ -28624,137 +27839,7 @@ case "$OPT_FISH_FPATH" in
no)
;;
default|yes)
-
- if test -n "$PKG_CONFIG"; then
- PKGCONFIG="$PKG_CONFIG"
- else
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-PKGCONFIG=$ac_cv_path_PKGCONFIG
-if test -n "$PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
-$as_echo "$PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKGCONFIG"; then
- ac_pt_PKGCONFIG=$PKGCONFIG
- # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKGCONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/bin:/usr/local/bin"
-for as_dir in $as_dummy
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
-if test -n "$ac_pt_PKGCONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
-$as_echo "$ac_pt_PKGCONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKGCONFIG" = x; then
- PKGCONFIG="no"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKGCONFIG=$ac_pt_PKGCONFIG
- fi
-else
- PKGCONFIG="$ac_cv_path_PKGCONFIG"
-fi
-
- fi
-
- if test "x$PKGCONFIG" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fish options with pkg-config" >&5
-$as_echo_n "checking for fish options with pkg-config... " >&6; }
- itexists=`
- if test -n ""; then
- PKG_CONFIG_LIBDIR=""
- export PKG_CONFIG_LIBDIR
- fi
- $PKGCONFIG --exists fish >/dev/null 2>&1 && echo 1`
-
- if test -z "$itexists"; then
- PKGCONFIG="no"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
- fi
- fi
-
- if test "$PKGCONFIG" != "no" ; then
- FISH_FUNCTIONS_DIR="$($PKGCONFIG --variable completionsdir fish)"
- else
- FISH_FUNCTIONS_DIR="$datarootdir/fish/vendor_completions.d"
- fi
+ FISH_FUNCTIONS_DIR="$datarootdir/fish/completions"
;;
*)
@@ -34642,460 +33727,6 @@ $as_echo "no" >&6; }
fi
- #
- tst_links_getpeername="unknown"
- tst_proto_getpeername="unknown"
- tst_compi_getpeername="unknown"
- tst_allow_getpeername="unknown"
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername can be linked" >&5
-$as_echo_n "checking if getpeername can be linked... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-int main (void)
-{
-
- if(0 != getpeername(0, (void *)0, (void *)0))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_links_getpeername="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_links_getpeername="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- #
- if test "$tst_links_getpeername" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername is prototyped" >&5
-$as_echo_n "checking if getpeername is prototyped... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "getpeername" >/dev/null 2>&1; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_proto_getpeername="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_proto_getpeername="no"
-
-fi
-rm -f conftest*
-
- fi
- #
- if test "$tst_proto_getpeername" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername is compilable" >&5
-$as_echo_n "checking if getpeername is compilable... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-int main (void)
-{
-
- if(0 != getpeername(0, (void *)0, (void *)0))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_compi_getpeername="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_compi_getpeername="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- #
- if test "$tst_compi_getpeername" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername usage allowed" >&5
-$as_echo_n "checking if getpeername usage allowed... " >&6; }
- if test "x$curl_disallow_getpeername" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_allow_getpeername="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_allow_getpeername="no"
- fi
- fi
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername might be used" >&5
-$as_echo_n "checking if getpeername might be used... " >&6; }
- if test "$tst_links_getpeername" = "yes" &&
- test "$tst_proto_getpeername" = "yes" &&
- test "$tst_compi_getpeername" = "yes" &&
- test "$tst_allow_getpeername" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GETPEERNAME 1
-_ACEOF
-
- curl_cv_func_getpeername="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- curl_cv_func_getpeername="no"
- fi
-
-
- #
- tst_links_getsockname="unknown"
- tst_proto_getsockname="unknown"
- tst_compi_getsockname="unknown"
- tst_allow_getsockname="unknown"
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname can be linked" >&5
-$as_echo_n "checking if getsockname can be linked... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-int main (void)
-{
-
- if(0 != getsockname(0, (void *)0, (void *)0))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_links_getsockname="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_links_getsockname="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- #
- if test "$tst_links_getsockname" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname is prototyped" >&5
-$as_echo_n "checking if getsockname is prototyped... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "getsockname" >/dev/null 2>&1; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_proto_getsockname="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_proto_getsockname="no"
-
-fi
-rm -f conftest*
-
- fi
- #
- if test "$tst_proto_getsockname" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname is compilable" >&5
-$as_echo_n "checking if getsockname is compilable... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
-
-int main (void)
-{
-
- if(0 != getsockname(0, (void *)0, (void *)0))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_compi_getsockname="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_compi_getsockname="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- #
- if test "$tst_compi_getsockname" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname usage allowed" >&5
-$as_echo_n "checking if getsockname usage allowed... " >&6; }
- if test "x$curl_disallow_getsockname" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_allow_getsockname="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_allow_getsockname="no"
- fi
- fi
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname might be used" >&5
-$as_echo_n "checking if getsockname might be used... " >&6; }
- if test "$tst_links_getsockname" = "yes" &&
- test "$tst_proto_getsockname" = "yes" &&
- test "$tst_compi_getsockname" = "yes" &&
- test "$tst_allow_getsockname" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GETSOCKNAME 1
-_ACEOF
-
- curl_cv_func_getsockname="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- curl_cv_func_getsockname="no"
- fi
-
-
-curl_includes_netif="\
-/* includes start */
-#ifdef HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-/* includes end */"
- for ac_header in net/if.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$curl_includes_netif
-"
-if test "x$ac_cv_header_net_if_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_NET_IF_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
- #
- tst_links_if_nametoindex="unknown"
- tst_proto_if_nametoindex="unknown"
- tst_compi_if_nametoindex="unknown"
- tst_allow_if_nametoindex="unknown"
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex can be linked" >&5
-$as_echo_n "checking if if_nametoindex can be linked... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- #include <net/if.h>
-
-int main (void)
-{
-
- if(0 != if_nametoindex(""))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_links_if_nametoindex="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_links_if_nametoindex="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- #
- if test "$tst_links_if_nametoindex" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex is prototyped" >&5
-$as_echo_n "checking if if_nametoindex is prototyped... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $curl_includes_winsock2
- $curl_includes_netif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "if_nametoindex" >/dev/null 2>&1; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_proto_if_nametoindex="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_proto_if_nametoindex="no"
-
-fi
-rm -f conftest*
-
- fi
- #
- if test "$tst_proto_if_nametoindex" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex is compilable" >&5
-$as_echo_n "checking if if_nametoindex is compilable... " >&6; }
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
- $curl_includes_winsock2
- $curl_includes_netif
-
-int main (void)
-{
-
- if(0 != if_nametoindex(""))
- return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_compi_if_nametoindex="yes"
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_compi_if_nametoindex="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- #
- if test "$tst_compi_if_nametoindex" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex usage allowed" >&5
-$as_echo_n "checking if if_nametoindex usage allowed... " >&6; }
- if test "x$curl_disallow_if_nametoindex" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- tst_allow_if_nametoindex="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- tst_allow_if_nametoindex="no"
- fi
- fi
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex might be used" >&5
-$as_echo_n "checking if if_nametoindex might be used... " >&6; }
- if test "$tst_links_if_nametoindex" = "yes" &&
- test "$tst_proto_if_nametoindex" = "yes" &&
- test "$tst_compi_if_nametoindex" = "yes" &&
- test "$tst_allow_if_nametoindex" = "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_IF_NAMETOINDEX 1
-_ACEOF
-
- curl_cv_func_if_nametoindex="yes"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- curl_cv_func_if_nametoindex="no"
- fi
-
-
#
tst_links_getifaddrs="unknown"
tst_proto_getifaddrs="unknown"
@@ -41271,7 +39902,6 @@ for ac_func in fnmatch \
setlocale \
setmode \
setrlimit \
- usleep \
utime \
utimes
@@ -41338,7 +39968,6 @@ $as_echo "#define ENABLE_IPV6 1" >>confdefs.h
IPV6_ENABLED=1
- curl_ipv6_msg="enabled"
fi
fi
@@ -42227,6 +40856,9 @@ if test "${enable_tls_srp+set}" = set; then :
no)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_TLS_SRP 1" >>confdefs.h
+
want_tls_srp=no
;;
*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -42297,8 +40929,8 @@ fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support cookies" >&5
-$as_echo_n "checking whether to support cookies... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable support for cookies" >&5
+$as_echo_n "checking whether to enable support for cookies... " >&6; }
# Check whether --enable-cookies was given.
if test "${enable_cookies+set}" = set; then :
enableval=$enable_cookies; case "$enableval" in
@@ -42320,167 +40952,6 @@ $as_echo "yes" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support HTTP authentication" >&5
-$as_echo_n "checking whether to support HTTP authentication... " >&6; }
-# Check whether --enable-http-auth was given.
-if test "${enable_http_auth+set}" = set; then :
- enableval=$enable_http_auth; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_HTTP_AUTH 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support DoH" >&5
-$as_echo_n "checking whether to support DoH... " >&6; }
-# Check whether --enable-doh was given.
-if test "${enable_doh+set}" = set; then :
- enableval=$enable_doh; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_DOH 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support the MIME API" >&5
-$as_echo_n "checking whether to support the MIME API... " >&6; }
-# Check whether --enable-mime was given.
-if test "${enable_mime+set}" = set; then :
- enableval=$enable_mime; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_MIME 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support date parsing" >&5
-$as_echo_n "checking whether to support date parsing... " >&6; }
-# Check whether --enable-dateparse was given.
-if test "${enable_dateparse+set}" = set; then :
- enableval=$enable_dateparse; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_PARSEDATE 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support netrc parsing" >&5
-$as_echo_n "checking whether to support netrc parsing... " >&6; }
-# Check whether --enable-netrc was given.
-if test "${enable_netrc+set}" = set; then :
- enableval=$enable_netrc; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_NETRC 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support progress-meter" >&5
-$as_echo_n "checking whether to support progress-meter... " >&6; }
-# Check whether --enable-progress-meter was given.
-if test "${enable_progress_meter+set}" = set; then :
- enableval=$enable_progress_meter; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_PROGRESS_METER 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support DNS shuffling" >&5
-$as_echo_n "checking whether to support DNS shuffling... " >&6; }
-# Check whether --enable-dnsshuffle was given.
-if test "${enable_dnsshuffle+set}" = set; then :
- enableval=$enable_dnsshuffle; case "$enableval" in
- no)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_SHUFFLE_DNS 1" >>confdefs.h
-
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- ;;
- esac
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-fi
-
-
curl_altsvc_msg="no (--enable-alt-svc)";
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support alt-svc" >&5
$as_echo_n "checking whether to support alt-svc... " >&6; }
@@ -42495,6 +40966,7 @@ $as_echo "no" >&6; }
$as_echo "yes" >&6; }
curl_altsvc_msg="enabled";
enable_altsvc="yes"
+ experimental="alt-svc"
;;
esac
else
@@ -42508,42 +40980,7 @@ if test "$enable_altsvc" = "yes"; then
$as_echo "#define USE_ALTSVC 1" >>confdefs.h
- experimental="$experimental alt-svc"
-fi
-
-if test "x$want_esni" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ESNI support is available" >&5
-$as_echo_n "checking whether ESNI support is available... " >&6; }
-
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
-
- if test "x$OPENSSL_ENABLED" == "x1"; then
- for ac_func in SSL_get_esni_status
-do :
- ac_fn_c_check_func "$LINENO" "SSL_get_esni_status" "ac_cv_func_SSL_get_esni_status"
-if test "x$ac_cv_func_SSL_get_esni_status" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_SSL_GET_ESNI_STATUS 1
-_ACEOF
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1
-fi
-done
-
-
- fi
-
- if test "x$ESNI_ENABLED" == "x1"; then
-
-$as_echo "#define USE_ESNI 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESNI_SUPPORT" >&5
-$as_echo "$ESNI_SUPPORT" >&6; }
- experimental="$experimental ESNI"
- else
- as_fn_error $? "--enable-esni ignored: No ESNI support found" "$LINENO" 5
- fi
+ experimental="alt-svc"
fi
@@ -42675,10 +41112,6 @@ if test "x$USE_NGHTTP2" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi
-if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
-fi
-
if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
@@ -42688,10 +41121,6 @@ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
-fi
-
if test "x$CURL_DISABLE_HTTP" != "x1"; then
@@ -43748,7 +42177,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
-AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
# The HP-UX ksh and POSIX shell print the target directory to stdout
@@ -44668,35 +43097,29 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
# Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
- # TODO: see whether this extra hack can be removed once we start
- # requiring Autoconf 2.70 or later.
- case $CONFIG_FILES in #(
- *\'*) :
- eval set x "$CONFIG_FILES" ;; #(
- *) :
- set x $CONFIG_FILES ;; #(
- *) :
- ;;
-esac
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
shift
- # Used to flag and report bootstrapping failures.
- am_rc=0
- for am_mf
+ for mf
do
# Strip MF so we end up with the name of the file.
- am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile which includes
- # dependency-tracking related rules and includes.
- # Grep'ing the whole file directly is not great: AIX grep has a line
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
# limit of 2048, but all sed's we know have understand at least 4000.
- sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
- || continue
- am_dirpart=`$as_dirname -- "$am_mf" ||
-$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$am_mf" : 'X\(//\)[^/]' \| \
- X"$am_mf" : 'X\(//\)$' \| \
- X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$am_mf" |
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -44714,48 +43137,53 @@ $as_echo X"$am_mf" |
q
}
s/.*/./; q'`
- am_filepart=`$as_basename -- "$am_mf" ||
-$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
- X"$am_mf" : 'X\(//\)$' \| \
- X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$am_mf" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
- /^X\/\(\/\/\)$/{
+ /^X\(\/\/\)[^/].*/{
s//\1/
q
}
- /^X\/\(\/\).*/{
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
- { echo "$as_me:$LINENO: cd "$am_dirpart" \
- && sed -e '/# am--include-marker/d' "$am_filepart" \
- | $MAKE -f - am--depfiles" >&5
- (cd "$am_dirpart" \
- && sed -e '/# am--include-marker/d' "$am_filepart" \
- | $MAKE -f - am--depfiles) >&5 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } || am_rc=$?
+ as_dir=$dirpart/$fdir; as_fn_mkdir_p
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
done
- if test $am_rc -ne 0; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "Something went wrong bootstrapping makefile fragments
- for automatic dependency tracking. Try re-running configure with the
- '--disable-dependency-tracking' option to at least be able to build
- the package (albeit without support for automatic dependency tracking).
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- { am_dirpart=; unset am_dirpart;}
- { am_filepart=; unset am_filepart;}
- { am_mf=; unset am_mf;}
- { am_rc=; unset am_rc;}
- rm -f conftest-deps.mk
}
;;
"libtool":C)
@@ -45662,8 +44090,6 @@ done
PSL: ${curl_psl_msg}
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
- HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&5
@@ -45705,13 +44131,11 @@ $as_echo "$as_me: Configured to build curl/libcurl:
PSL: ${curl_psl_msg}
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
- HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&6;}
if test -n "$experimental"; then
cat >&2 << _EOF
- WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
+ WARNING: $experimental is enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi
diff --git a/configure.ac b/configure.ac
index cb8f4943e..6d5ec2c0f 100755
--- a/configure.ac
+++ b/configure.ac
@@ -49,7 +49,6 @@ CURL_CHECK_OPTION_CURLDEBUG
CURL_CHECK_OPTION_SYMBOL_HIDING
CURL_CHECK_OPTION_ARES
CURL_CHECK_OPTION_RT
-CURL_CHECK_OPTION_ESNI
XC_CHECK_PATH_SEPARATOR
@@ -156,7 +155,7 @@ AC_SUBST(PKGADD_VENDOR)
dnl
dnl initialize all the info variables
- curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl} )"
+ curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,schannel,secure-transport,mesalink,amissl} )"
curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)"
curl_brotli_msg="no (--with-brotli)"
@@ -1227,6 +1226,10 @@ main()
ipv6=yes
))
+if test "$ipv6" = "yes"; then
+ curl_ipv6_msg="enabled"
+fi
+
# Check if struct sockaddr_in6 have sin6_scope_id member
if test "$ipv6" = yes; then
AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member])
@@ -1566,7 +1569,7 @@ AC_HELP_STRING([--without-amissl], [disable Amiga native SSL/TLS (AmiSSL)]),
OPT_AMISSL=$withval)
AC_MSG_CHECKING([whether to enable Amiga native SSL/TLS (AmiSSL)])
-if test "$HAVE_PROTO_BSDSOCKET_H" = "1"; then
+if test "$HAVE_PROTO_BSDSOCKET_H" == "1"; then
if test -z "$ssl_backends" -o "x$OPT_AMISSL" != xno; then
ssl_msg=
if test "x$OPT_AMISSL" != "xno"; then
@@ -1823,9 +1826,13 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
if test X"$OPENSSL_ENABLED" = X"1"; then
dnl These can only exist if OpenSSL exists
+ dnl Older versions of Cyassl (some time before 2.9.4) don't have
+ dnl SSL_get_shutdown (but this check won't actually detect it there
+ dnl as it's a macro that needs the header files be included)
dnl OpenSSL_version is introduced in 3.0.0
AC_CHECK_FUNCS( RAND_egd \
+ SSL_get_shutdown \
SSLv2_client_method \
OpenSSL_version )
@@ -1882,14 +1889,6 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-if test X"$OPT_SSL" != Xoff &&
- test X"$OPT_SSL" != Xno &&
- test "$OPENSSL_ENABLED" != "1"; then
- AC_MSG_NOTICE([OPT_SSL: $OPT_SSL])
- AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED])
- AC_MSG_ERROR([--with-ssl was given but OpenSSL could not be detected])
-fi
-
dnl **********************************************************************
dnl Check for the random seed preferences
dnl **********************************************************************
@@ -2112,6 +2111,98 @@ if test "$GNUTLS_ENABLED" = "1"; then
fi
dnl ----------------------------------------------------
+dnl check for PolarSSL
+dnl ----------------------------------------------------
+
+dnl Default to compiler & linker defaults for PolarSSL files & libraries.
+OPT_POLARSSL=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+AC_ARG_WITH(polarssl,dnl
+AC_HELP_STRING([--with-polarssl=PATH],[where to look for PolarSSL, PATH points to the installation root])
+AC_HELP_STRING([--without-polarssl], [disable PolarSSL detection]),
+ OPT_POLARSSL=$withval)
+
+if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
+ ssl_msg=
+
+ if test X"$OPT_POLARSSL" != Xno; then
+
+ if test "$OPT_POLARSSL" = "yes"; then
+ OPT_POLARSSL=""
+ fi
+
+ if test -z "$OPT_POLARSSL" ; then
+ dnl check for lib first without setting any new path
+
+ AC_CHECK_LIB(polarssl, havege_init,
+ dnl libpolarssl found, set the variable
+ [
+ AC_DEFINE(USE_POLARSSL, 1, [if PolarSSL is enabled])
+ AC_SUBST(USE_POLARSSL, [1])
+ POLARSSL_ENABLED=1
+ USE_POLARSSL="yes"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ])
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+ polarssllib=""
+
+ if test "x$USE_POLARSSL" != "xyes"; then
+ dnl add the path and test again
+ addld=-L$OPT_POLARSSL/lib$libsuff
+ addcflags=-I$OPT_POLARSSL/include
+ polarssllib=$OPT_POLARSSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ AC_CHECK_LIB(polarssl, ssl_init,
+ [
+ AC_DEFINE(USE_POLARSSL, 1, [if PolarSSL is enabled])
+ AC_SUBST(USE_POLARSSL, [1])
+ POLARSSL_ENABLED=1
+ USE_POLARSSL="yes"
+ ssl_msg="PolarSSL"
+ test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ],
+ [
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+ ])
+ fi
+
+ if test "x$USE_POLARSSL" = "xyes"; then
+ AC_MSG_NOTICE([detected PolarSSL])
+ check_for_ca_bundle=1
+ LIBS="-lpolarssl $LIBS"
+
+ if test -n "$polarssllib"; then
+ dnl when shared libs were found in a path that the run-time
+ dnl linker doesn't search through, we need to add it to
+ dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
+ dnl due to this
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$polarssllib"
+ export CURL_LIBRARY_PATH
+ AC_MSG_NOTICE([Added $polarssllib to CURL_LIBRARY_PATH])
+ fi
+ fi
+ fi
+
+ fi dnl PolarSSL not disabled
+
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+dnl ----------------------------------------------------
dnl check for mbedTLS
dnl ----------------------------------------------------
@@ -2204,105 +2295,175 @@ if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
fi
dnl ----------------------------------------------------
-dnl check for wolfSSL
+dnl check for CyaSSL
dnl ----------------------------------------------------
-dnl Default to compiler & linker defaults for wolfSSL files & libraries.
-OPT_WOLFSSL=no
+dnl Default to compiler & linker defaults for CyaSSL files & libraries.
+OPT_CYASSL=no
_cppflags=$CPPFLAGS
_ldflags=$LDFLAGS
+AC_ARG_WITH(cyassl,dnl
+AC_HELP_STRING([--with-cyassl=PATH],[where to look for CyaSSL, PATH points to the installation root (default: system lib default)])
+AC_HELP_STRING([--without-cyassl], [disable CyaSSL detection]),
+ OPT_CYASSL=$withval)
+dnl provide --with-wolfssl as an alias for --with-cyassl
AC_ARG_WITH(wolfssl,dnl
AC_HELP_STRING([--with-wolfssl=PATH],[where to look for WolfSSL, PATH points to the installation root (default: system lib default)])
AC_HELP_STRING([--without-wolfssl], [disable WolfSSL detection]),
- OPT_WOLFSSL=$withval)
+ OPT_CYASSL=$withval)
-if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
ssl_msg=
- if test X"$OPT_WOLFSSL" != Xno; then
+ if test X"$OPT_CYASSL" != Xno; then
+
+ if test "$OPT_CYASSL" = "yes"; then
+ OPT_CYASSL=""
+ fi
- if test "$OPT_WOLFSSL" = "yes"; then
- OPT_WOLFSSL=""
+ dnl This should be reworked to use pkg-config instead
+
+ cyassllibname=cyassl
+
+ if test -z "$OPT_CYASSL" ; then
+ dnl check for lib in system default first
+
+ AC_CHECK_LIB(cyassl, CyaSSL_Init,
+ dnl libcyassl found, set the variable
+ [
+ AC_DEFINE(USE_CYASSL, 1, [if CyaSSL is enabled])
+ AC_SUBST(USE_CYASSL, [1])
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ])
fi
addld=""
addlib=""
addcflags=""
+ cyassllib=""
- if test "x$USE_WOLFSSL" != "xyes"; then
- addld=-L$OPT_WOLFSSL/lib$libsuff
- addcflags=-I$OPT_WOLFSSL/include
- wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
+ if test "x$USE_CYASSL" != "xyes"; then
+ dnl add the path and test again
+ addld=-L$OPT_CYASSL/lib$libsuff
+ addcflags=-I$OPT_CYASSL/include
+ cyassllib=$OPT_CYASSL/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
+ AC_CHECK_LIB(cyassl, CyaSSL_Init,
+ [
+ AC_DEFINE(USE_CYASSL, 1, [if CyaSSL is enabled])
+ AC_SUBST(USE_CYASSL, [1])
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
+ ssl_msg="CyaSSL"
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ],
+ [
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+ cyassllib=""
+ ])
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+
+ if test "x$USE_CYASSL" != "xyes"; then
+ dnl libcyassl renamed to libwolfssl as of 3.4.0
+ addld=-L$OPT_CYASSL/lib$libsuff
+ addcflags=-I$OPT_CYASSL/include
+ cyassllib=$OPT_CYASSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ cyassllibname=wolfssl
my_ac_save_LIBS="$LIBS"
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="-l$cyassllibname -lm $LIBS"
- AC_MSG_CHECKING([for wolfSSL_Init in -lwolfssl])
+ AC_MSG_CHECKING([for CyaSSL_Init in -lwolfssl])
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
/* These aren't needed for detection and confuse WolfSSL.
They are set up properly later if it is detected. */
#undef SIZEOF_LONG
#undef SIZEOF_LONG_LONG
-#include <wolfssl/ssl.h>
+#include <cyassl/ssl.h>
]],[[
- return wolfSSL_Init();
+ return CyaSSL_Init();
]])
],[
AC_MSG_RESULT(yes)
- AC_DEFINE(USE_WOLFSSL, 1, [if wolfSSL is enabled])
- AC_SUBST(USE_WOLFSSL, [1])
- WOLFSSL_ENABLED=1
- USE_WOLFSSL="yes"
+ AC_DEFINE(USE_CYASSL, 1, [if CyaSSL/WolfSSL is enabled])
+ AC_SUBST(USE_CYASSL, [1])
+ CYASSL_ENABLED=1
+ USE_CYASSL="yes"
ssl_msg="WolfSSL"
- test wolfssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
],
[
AC_MSG_RESULT(no)
CPPFLAGS=$_cppflags
LDFLAGS=$_ldflags
- wolfssllibpath=""
+ cyassllib=""
])
LIBS="$my_ac_save_LIBS"
fi
- if test "x$USE_WOLFSSL" = "xyes"; then
- AC_MSG_NOTICE([detected wolfSSL])
+ if test "x$USE_CYASSL" = "xyes"; then
+ AC_MSG_NOTICE([detected $cyassllibname])
check_for_ca_bundle=1
- dnl wolfssl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
+ dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
AX_COMPILE_CHECK_SIZEOF(long long)
- LIBS="-lwolfssl -lm $LIBS"
+ dnl Versions since at least 2.6.0 may have options.h
+ AC_CHECK_HEADERS(cyassl/options.h)
- dnl Recent WolfSSL versions build without SSLv3 by default
- dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
- AC_CHECK_FUNCS(wolfSSLv3_client_method \
- wolfSSL_get_peer_certificate \
- wolfSSL_UseALPN)
+ dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h
+ AC_CHECK_HEADERS(cyassl/error-ssl.h)
- if test -n "$wolfssllibpath"; then
+ LIBS="-l$cyassllibname -lm $LIBS"
+
+ if test "x$cyassllibname" = "xwolfssl"; then
+ dnl Recent WolfSSL versions build without SSLv3 by default
+ dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
+ AC_CHECK_FUNCS(wolfSSLv3_client_method \
+ wolfSSL_get_peer_certificate \
+ wolfSSL_UseALPN)
+ else
+ dnl Cyassl needs configure --enable-opensslextra to have *get_peer*
+ AC_CHECK_FUNCS(CyaSSL_CTX_UseSupportedCurve \
+ CyaSSL_get_peer_certificate)
+ fi
+
+ if test -n "$cyassllib"; then
dnl when shared libs were found in a path that the run-time
dnl linker doesn't search through, we need to add it to
dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
dnl due to this
if test "x$cross_compiling" != "xyes"; then
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath"
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$cyassllib"
export CURL_LIBRARY_PATH
- AC_MSG_NOTICE([Added $wolfssllibpath to CURL_LIBRARY_PATH])
+ AC_MSG_NOTICE([Added $cyassllib to CURL_LIBRARY_PATH])
fi
fi
fi
- fi dnl wolfSSL not disabled
+ fi dnl CyaSSL not disabled
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
@@ -2529,10 +2690,10 @@ if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
x)
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
- AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this.])
+ AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this.])
;;
x1)
# one SSL backend is enabled
@@ -2572,7 +2733,7 @@ dnl **********************************************************************
dnl Check for the CA bundle
dnl **********************************************************************
-if test -n "$check_for_ca_bundle"; then
+if test "$check_for_ca_bundle" -gt 0; then
CURL_CHECK_CA_BUNDLE
fi
@@ -2956,8 +3117,10 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar
versioned_symbols_flavour="GNUTLS_"
elif test "x$NSS_ENABLED" = "x1"; then
versioned_symbols_flavour="NSS_"
- elif test "x$WOLFSSL_ENABLED" = "x1"; then
- versioned_symbols_flavour="WOLFSSL_"
+ elif test "x$POLARSSL_ENABLED" = "x1"; then
+ versioned_symbols_flavour="POLARSSL_"
+ elif test "x$CYASSL_ENABLED" = "x1"; then
+ versioned_symbols_flavour="CYASSL_"
elif test "x$WINSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="SCHANNEL_"
elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
@@ -3277,331 +3440,6 @@ if test X"$want_h2" != Xno; then
fi
dnl **********************************************************************
-dnl Check for ngtcp2 (QUIC)
-dnl **********************************************************************
-
-OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
-
-if test "x$disable_http" = "xyes"; then
- # without HTTP, ngtcp2 is no use
- OPT_TCP2="no"
-fi
-
-AC_ARG_WITH(ngtcp2,
-AC_HELP_STRING([--with-ngtcp2=PATH],[Enable ngtcp2 usage])
-AC_HELP_STRING([--without-ngtcp2],[Disable ngtcp2 usage]),
- [OPT_TCP2=$withval])
-case "$OPT_TCP2" in
- no)
- dnl --without-ngtcp2 option used
- want_tcp2="no"
- ;;
- yes)
- dnl --with-ngtcp2 option used without path
- want_tcp2="default"
- want_tcp2_path=""
- ;;
- *)
- dnl --with-ngtcp2 option used with path
- want_tcp2="yes"
- want_tcp2_path="$withval/lib/pkgconfig"
- ;;
-esac
-
-curl_tcp2_msg="disabled (--with-ngtcp2)"
-if test X"$want_tcp2" != Xno; then
- dnl backup the pre-ngtcp2 variables
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
- CURL_CHECK_PKGCONFIG(libngtcp2, $want_tcp2_path)
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
- $PKGCONFIG --libs-only-l libngtcp2`
- AC_MSG_NOTICE([-l is $LIB_TCP2])
-
- CPP_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
- $PKGCONFIG --cflags-only-I libngtcp2`
- AC_MSG_NOTICE([-I is $CPP_TCP2])
-
- LD_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
- $PKGCONFIG --libs-only-L libngtcp2`
- AC_MSG_NOTICE([-L is $LD_TCP2])
-
- LDFLAGS="$LDFLAGS $LD_TCP2"
- CPPFLAGS="$CPPFLAGS $CPP_TCP2"
- LIBS="$LIB_TCP2 $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
- fi
- AC_CHECK_LIB(ngtcp2, ngtcp2_conn_client_new,
- [
- AC_CHECK_HEADERS(ngtcp2/ngtcp2.h,
- NGTCP2_ENABLED=1
- AC_DEFINE(USE_NGTCP2, 1, [if ngtcp2 is in use])
- AC_SUBST(USE_NGTCP2, [1])
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
- export CURL_LIBRARY_PATH
- AC_MSG_NOTICE([Added $DIR_TCP2 to CURL_LIBRARY_PATH])
- )
- ],
- dnl not found, revert back to clean variables
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
- )
-
- else
- dnl no ngtcp2 pkg-config found, deal with it
- if test X"$want_tcp2" != Xdefault; then
- dnl To avoid link errors, we do not allow --with-ngtcp2 without
- dnl a pkgconfig file
- AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file.])
- fi
- fi
-
-fi
-
-if test "x$NGTCP2_ENABLED" = "x1"; then
- dnl backup the pre-ngtcp2_crypto_openssl variables
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
- CURL_CHECK_PKGCONFIG(libngtcp2_crypto_openssl, $want_tcp2_path)
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
- $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
- AC_MSG_NOTICE([-l is $LIB_NGTCP2_CRYPTO_OPENSSL])
-
- CPP_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
- $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
- AC_MSG_NOTICE([-I is $CPP_NGTCP2_CRYPTO_OPENSSL])
-
- LD_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
- $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
- AC_MSG_NOTICE([-L is $LD_NGTCP2_CRYPTO_OPENSSL])
-
- LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
- CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
- LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
- fi
- AC_CHECK_LIB(ngtcp2_crypto_openssl, ngtcp2_crypto_ctx_initial,
- [
- AC_CHECK_HEADERS(ngtcp2/ngtcp2_crypto.h,
- NGTCP2_ENABLED=1
- AC_DEFINE(USE_NGTCP2_CRYPTO_OPENSSL, 1, [if ngtcp2_crypto_openssl is in use])
- AC_SUBST(USE_NGTCP2_CRYPTO_OPENSSL, [1])
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
- export CURL_LIBRARY_PATH
- AC_MSG_NOTICE([Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH])
- )
- ],
- dnl not found, revert back to clean variables
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
- )
-
- else
- dnl no ngtcp2_crypto_openssl pkg-config found, deal with it
- if test X"$want_tcp2" != Xdefault; then
- dnl To avoid link errors, we do not allow --with-ngtcp2 without
- dnl a pkgconfig file
- AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file.])
- fi
- fi
-fi
-
-dnl **********************************************************************
-dnl Check for nghttp3 (HTTP/3 with ngtcp2)
-dnl **********************************************************************
-
-OPT_NGHTTP3="yes"
-
-if test "x$NGTCP2_ENABLED" = "x"; then
- # without ngtcp2, nghttp3 is of no use for us
- OPT_NGHTTP3="no"
-fi
-
-AC_ARG_WITH(nghttp3,
-AC_HELP_STRING([--with-nghttp3=PATH],[Enable nghttp3 usage])
-AC_HELP_STRING([--without-nghttp3],[Disable nghttp3 usage]),
- [OPT_NGHTTP3=$withval])
-case "$OPT_NGHTTP3" in
- no)
- dnl --without-nghttp3 option used
- want_nghttp3="no"
- ;;
- yes)
- dnl --with-nghttp3 option used without path
- want_nghttp3="default"
- want_nghttp3_path=""
- ;;
- *)
- dnl --with-nghttp3 option used with path
- want_nghttp3="yes"
- want_nghttp3_path="$withval/lib/pkgconfig"
- ;;
-esac
-
-curl_http3_msg="disabled (--with-nghttp3)"
-if test X"$want_nghttp3" != Xno; then
- dnl backup the pre-nghttp3 variables
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
- CURL_CHECK_PKGCONFIG(libnghttp3, $want_nghttp3_path)
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
- $PKGCONFIG --libs-only-l libnghttp3`
- AC_MSG_NOTICE([-l is $LIB_NGHTTP3])
-
- CPP_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) dnl
- $PKGCONFIG --cflags-only-I libnghttp3`
- AC_MSG_NOTICE([-I is $CPP_NGHTTP3])
-
- LD_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
- $PKGCONFIG --libs-only-L libnghttp3`
- AC_MSG_NOTICE([-L is $LD_NGHTTP3])
-
- LDFLAGS="$LDFLAGS $LD_NGHTTP3"
- CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
- LIBS="$LIB_NGHTTP3 $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
- fi
- AC_CHECK_LIB(nghttp3, nghttp3_conn_client_new,
- [
- AC_CHECK_HEADERS(nghttp3/nghttp3.h,
- curl_h3_msg="enabled (ngtcp2 + nghttp3)"
- NGHTTP3_ENABLED=1
- AC_DEFINE(USE_NGHTTP3, 1, [if nghttp3 is in use])
- AC_SUBST(USE_NGHTTP3, [1])
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
- export CURL_LIBRARY_PATH
- AC_MSG_NOTICE([Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH])
- experimental="$experimental HTTP3"
- )
- ],
- dnl not found, revert back to clean variables
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
- )
-
- else
- dnl no nghttp3 pkg-config found, deal with it
- if test X"$want_nghttp3" != Xdefault; then
- dnl To avoid link errors, we do not allow --with-nghttp3 without
- dnl a pkgconfig file
- AC_MSG_ERROR([--with-nghttp3 was specified but could not find nghttp3 pkg-config file.])
- fi
- fi
-
-fi
-
-dnl **********************************************************************
-dnl Check for quiche (QUIC)
-dnl **********************************************************************
-
-OPT_QUICHE="yes"
-
-if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
- # without HTTP or with ngtcp2, quiche is no use
- OPT_QUICHE="no"
-fi
-
-AC_ARG_WITH(quiche,
-AC_HELP_STRING([--with-quiche=PATH],[Enable quiche usage])
-AC_HELP_STRING([--without-quiche],[Disable quiche usage]),
- [OPT_QUICHE=$withval])
-case "$OPT_QUICHE" in
- no)
- dnl --without-quiche option used
- want_quiche="no"
- ;;
- yes)
- dnl --with-quiche option used without path
- want_quiche="default"
- want_quiche_path=""
- ;;
- *)
- dnl --with-quiche option used with path
- want_quiche="yes"
- want_quiche_path="$withval"
- ;;
-esac
-
-if test X"$want_quiche" != Xno; then
- dnl backup the pre-quiche variables
- CLEANLDFLAGS="$LDFLAGS"
- CLEANCPPFLAGS="$CPPFLAGS"
- CLEANLIBS="$LIBS"
-
- CURL_CHECK_PKGCONFIG(quiche, $want_quiche_path)
-
- if test "$PKGCONFIG" != "no" ; then
- LIB_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
- $PKGCONFIG --libs-only-l quiche`
- AC_MSG_NOTICE([-l is $LIB_QUICHE])
-
- CPP_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) dnl
- $PKGCONFIG --cflags-only-I quiche`
- AC_MSG_NOTICE([-I is $CPP_QUICHE])
-
- LD_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
- $PKGCONFIG --libs-only-L quiche`
- AC_MSG_NOTICE([-L is $LD_QUICHE])
-
- LDFLAGS="$LDFLAGS $LD_QUICHE"
- CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
- LIBS="$LIB_QUICHE $LIBS"
-
- if test "x$cross_compiling" != "xyes"; then
- DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
- fi
- AC_CHECK_LIB(quiche, quiche_connect,
- [
- AC_CHECK_HEADERS(quiche.h,
- experimental="$experimental HTTP3"
- AC_MSG_NOTICE([HTTP3 support is experimental])
- curl_h3_msg="enabled (quiche)"
- QUICHE_ENABLED=1
- AC_DEFINE(USE_QUICHE, 1, [if quiche is in use])
- AC_SUBST(USE_QUICHE, [1])
- CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
- export CURL_LIBRARY_PATH
- AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]),
- )
- ],
- dnl not found, revert back to clean variables
- LDFLAGS=$CLEANLDFLAGS
- CPPFLAGS=$CLEANCPPFLAGS
- LIBS=$CLEANLIBS
- )
- else
- dnl no nghttp3 pkg-config found, deal with it
- if test X"$want_quiche" != Xdefault; then
- dnl To avoid link errors, we do not allow --with-nghttp3 without
- dnl a pkgconfig file
- AC_MSG_ERROR([--with-quiche was specified but could not find quiche pkg-config file.])
- fi
- fi
-fi
-
-dnl **********************************************************************
dnl Check for zsh completion path
dnl **********************************************************************
@@ -3641,12 +3479,7 @@ case "$OPT_FISH_FPATH" in
;;
default|yes)
dnl --with-fish-functions-dir option used without path
- CURL_CHECK_PKGCONFIG(fish)
- if test "$PKGCONFIG" != "no" ; then
- FISH_FUNCTIONS_DIR="$($PKGCONFIG --variable completionsdir fish)"
- else
- FISH_FUNCTIONS_DIR="$datarootdir/fish/vendor_completions.d"
- fi
+ FISH_FUNCTIONS_DIR="$datarootdir/fish/completions"
AC_SUBST(FISH_FUNCTIONS_DIR)
;;
*)
@@ -3873,9 +3706,6 @@ CURL_CHECK_FUNC_GETHOSTBYADDR_R
CURL_CHECK_FUNC_GETHOSTBYNAME
CURL_CHECK_FUNC_GETHOSTBYNAME_R
CURL_CHECK_FUNC_GETHOSTNAME
-CURL_CHECK_FUNC_GETPEERNAME
-CURL_CHECK_FUNC_GETSOCKNAME
-CURL_CHECK_FUNC_IF_NAMETOINDEX
CURL_CHECK_FUNC_GETIFADDRS
CURL_CHECK_FUNC_GETSERVBYPORT_R
CURL_CHECK_FUNC_GMTIME_R
@@ -3935,7 +3765,6 @@ AC_CHECK_FUNCS([fnmatch \
setlocale \
setmode \
setrlimit \
- usleep \
utime \
utimes
],[
@@ -3965,7 +3794,6 @@ if test "$ipv6" = "yes"; then
AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
IPV6_ENABLED=1
AC_SUBST(IPV6_ENABLED)
- curl_ipv6_msg="enabled"
fi
fi
@@ -4219,6 +4047,7 @@ AC_HELP_STRING([--disable-tls-srp],[Disable TLS-SRP authentication]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_TLS_SRP, 1, [to disable TLS-SRP authentication])
want_tls_srp=no
;;
*) AC_MSG_RESULT(yes)
@@ -4271,7 +4100,7 @@ fi
dnl ************************************************************
dnl disable cookies support
dnl
-AC_MSG_CHECKING([whether to support cookies])
+AC_MSG_CHECKING([whether to enable support for cookies])
AC_ARG_ENABLE(cookies,
AC_HELP_STRING([--enable-cookies],[Enable cookies support])
AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
@@ -4287,132 +4116,6 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
)
dnl ************************************************************
-dnl disable HTTP authentication support
-dnl
-AC_MSG_CHECKING([whether to support HTTP authentication])
-AC_ARG_ENABLE(http-auth,
-AC_HELP_STRING([--enable-http-auth],[Enable HTTP authentication support])
-AC_HELP_STRING([--disable-http-auth],[Disable HTTP authentication support]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_HTTP_AUTH, 1, [disable HTTP authentication])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable DoH support
-dnl
-AC_MSG_CHECKING([whether to support DoH])
-AC_ARG_ENABLE(doh,
-AC_HELP_STRING([--enable-doh],[Enable DoH support])
-AC_HELP_STRING([--disable-doh],[Disable DoH support]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_DOH, 1, [disable DoH])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable mime API support
-dnl
-AC_MSG_CHECKING([whether to support the MIME API])
-AC_ARG_ENABLE(mime,
-AC_HELP_STRING([--enable-mime],[Enable mime API support])
-AC_HELP_STRING([--disable-mime],[Disable mime API support]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_MIME, 1, [disable mime API])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable date parsing
-dnl
-AC_MSG_CHECKING([whether to support date parsing])
-AC_ARG_ENABLE(dateparse,
-AC_HELP_STRING([--enable-dateparse],[Enable date parsing])
-AC_HELP_STRING([--disable-dateparse],[Disable date parsing]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_PARSEDATE, 1, [disable date parsing])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable netrc
-dnl
-AC_MSG_CHECKING([whether to support netrc parsing])
-AC_ARG_ENABLE(netrc,
-AC_HELP_STRING([--enable-netrc],[Enable netrc parsing])
-AC_HELP_STRING([--disable-netrc],[Disable netrc parsing]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_NETRC, 1, [disable netrc parsing])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable progress-meter
-dnl
-AC_MSG_CHECKING([whether to support progress-meter])
-AC_ARG_ENABLE(progress-meter,
-AC_HELP_STRING([--enable-progress-meter],[Enable progress-meter])
-AC_HELP_STRING([--disable-progress-meter],[Disable progress-meter]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_PROGRESS_METER, 1, [disable progress-meter])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
-dnl disable shuffle DNS support
-dnl
-AC_MSG_CHECKING([whether to support DNS shuffling])
-AC_ARG_ENABLE(dnsshuffle,
-AC_HELP_STRING([--enable-dnsshuffle],[Enable DNS shuffling])
-AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shufflinf]),
-[ case "$enableval" in
- no)
- AC_MSG_RESULT(no)
- AC_DEFINE(CURL_DISABLE_SHUFFLE_DNS, 1, [disable DNS shuffling])
- ;;
- *) AC_MSG_RESULT(yes)
- ;;
- esac ],
- AC_MSG_RESULT(yes)
-)
-
-dnl ************************************************************
dnl switch on/off alt-svc
dnl
curl_altsvc_msg="no (--enable-alt-svc)";
@@ -4427,6 +4130,7 @@ AC_HELP_STRING([--disable-alt-svc],[Disable alt-svc support]),
*) AC_MSG_RESULT(yes)
curl_altsvc_msg="enabled";
enable_altsvc="yes"
+ experimental="alt-svc"
;;
esac ],
AC_MSG_RESULT(no)
@@ -4434,37 +4138,7 @@ AC_HELP_STRING([--disable-alt-svc],[Disable alt-svc support]),
if test "$enable_altsvc" = "yes"; then
AC_DEFINE(USE_ALTSVC, 1, [to enable alt-svc])
- experimental="$experimental alt-svc"
-fi
-
-dnl *************************************************************
-dnl check whether ESNI support, if desired, is actually available
-dnl
-if test "x$want_esni" != "xno"; then
- AC_MSG_CHECKING([whether ESNI support is available])
-
- dnl assume NOT and look for sufficient condition
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
-
- dnl OpenSSL with a chosen ESNI function should be enough
- dnl so more exhaustive checking seems unnecessary for now
- if test "x$OPENSSL_ENABLED" == "x1"; then
- AC_CHECK_FUNCS(SSL_get_esni_status,
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1)
-
- dnl add 'elif' chain here for additional implementations
- fi
-
- dnl now deal with whatever we found
- if test "x$ESNI_ENABLED" == "x1"; then
- AC_DEFINE(USE_ESNI, 1, [if ESNI support is available])
- AC_MSG_RESULT($ESNI_SUPPORT)
- experimental="$experimental ESNI"
- else
- AC_MSG_ERROR([--enable-esni ignored: No ESNI support found])
- fi
+ experimental="alt-svc"
fi
dnl ************************************************************
@@ -4575,10 +4249,6 @@ if test "x$USE_NGHTTP2" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi
-if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
-fi
-
if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
@@ -4588,10 +4258,6 @@ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
-fi
-
AC_SUBST(SUPPORT_FEATURES)
dnl For supported protocols in pkg-config file
@@ -4774,13 +4440,11 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
PSL: ${curl_psl_msg}
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
- HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
])
if test -n "$experimental"; then
cat >&2 << _EOF
- WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
+ WARNING: $experimental is enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi
diff --git a/depcomp b/depcomp
index 65cbf7093..b39f98f9a 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2018-03-07.03; # UTC
+scriptversion=2016-01-11.22; # UTC
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@ scriptversion=2018-03-07.03; # UTC
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -783,7 +783,7 @@ exit 0
# Local Variables:
# mode: shell-script
# sh-indentation: 2
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC0"
diff --git a/docs/ALTSVC.md b/docs/ALTSVC.md
index 48401415b..5aca1c950 100644
--- a/docs/ALTSVC.md
+++ b/docs/ALTSVC.md
@@ -2,6 +2,21 @@
curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.
+## Experimental
+
+Experimental support in curl means:
+
+1. Experimental features are provided to allow users to try them out and
+ provide feedback on functionality and API etc before they ship and get
+ "carved in stone".
+2. You must enable the feature when invoking configure as otherwise curl will
+ not be built with the feature present.
+3. We strongly advice against using this feature in production.
+4. **We reserve the right to change behavior** of the feature without sticking
+ to our API/ABI rules as we do for regular features, as long as it is marked
+ experimental.
+5. Experimental features are clearly marked so in documentation. Beware.
+
## Enable Alt-Svc in build
`./configure --enable-alt-svc`
@@ -10,30 +25,35 @@ curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.
[RFC 7838](https://tools.ietf.org/html/rfc7838)
-# Alt-Svc cache file format
-
-This a text based file with one line per entry and each line consists of nine
-space separated fields.
-
-## Example
-
- h2 quic.tech 8443 h3-22 quic.tech 8443 "20190808 06:18:37" 0 0
-
-## Fields
-
-1. The ALPN id for the source origin
-2. The host name for the source origin
-3. The port number for the source origin
-4. The ALPN id for the destination host
-5. The host name for the destination host
-6. The host number for the destination host
-7. The expiration date and time of this entry withing double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT.
-8. Boolean (1 or 0) if "persist" was set for this entry
-9. Integer priority value (not currently used)
-
-# TODO
+## What works
+
+- read alt-svc file from disk
+- write alt-svc file from disk
+- parse `Alt-Svc:` response headers, including `ma`, `clear` and `persist`.
+- replaces old entries when new alternatives are received
+- unit tests to verify most of this functionality (test 1654)
+- act on `Alt-Svc:` response headers
+- build conditionally on `configure --enable-alt-svc` only, feature marked as
+ **EXPERIMENTAL**
+- implement `CURLOPT_ALTSVC_CTRL`
+- implement `CURLOPT_ALTSVC`
+- document `CURLOPT_ALTSVC_CTRL`
+- document `CURLOPT_ALTSVC`
+- document `--alt-svc`
+- add `CURL_VERSION_ALTSVC`
+- make `curl -V` show 'alt-svc' as a feature if built-in
+- support `curl --alt-svc [file]` to enable caching, using that file
+- make `tests/runtests.pl` able to filter tests on the feature `alt-svc`
+- actually use the existing in-memory alt-svc cache for outgoing connections
+- alt-svc cache expiry
+- test 355 and 356 verify curl acting on Alt-Svc, received from header and
+ loaded from cache. The latter needs a debug build since it enables Alt-Svc
+ for plain HTTP.
+
+## What is left
- handle multiple response headers, when one of them says `clear` (should
override them all)
- using `Age:` value for caching age as per spec
- `CURLALTSVC_IMMEDIATELY` support
+- `CURLALTSVC_ALTUSED` support
diff --git a/docs/BINDINGS.md b/docs/BINDINGS.md
index d0e80b8ac..b3624b1cb 100644
--- a/docs/BINDINGS.md
+++ b/docs/BINDINGS.md
@@ -23,8 +23,6 @@ Requests](https://github.com/whoshuu/cpr) by Huu Nguyen
Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho
[curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood
-Clojure: [clj-curl](https://github.com/lsevero/clj-curl) by Lucas Severo
-
[D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert
[Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev
@@ -55,8 +53,6 @@ Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang
[Julia](https://github.com/forio/Curl.jl) Written by Paul Howe
-[Kapito](https://github.com/puzza007/katipo) is an Erlang HTTP library around libcurl.
-
[Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy
Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel
@@ -65,8 +61,6 @@ Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](ht
[.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips
-[Nim](https://nimble.directory/pkg/libcurl) wrapper for libcurl
-
[node.js](https://github.com/JCMais/node-libcurl) node-libcurl by Jonathan Cardoso Machado
[Object-Pascal](https://web.archive.org/web/20020610214926/www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern.
@@ -75,17 +69,14 @@ Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](ht
[Pascal](https://web.archive.org/web/20030804091414/houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer.
-Perl: [WWW::Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris
+Perl: [WWW--Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris
Bailiff and Bálint Szilakszi,
[perl6-net-curl](https://github.com/azawawi/perl6-net-curl) by Ahmad M. Zawawi
-[NET::Curl](https://metacpan.org/pod/Net::Curl) by Przemyslaw Iskra
[PHP](https://php.net/curl) Originally written by Sterling Hughes
[PostgreSQL](https://github.com/pramsey/pgsql-http) - HTTP client for PostgreSQL
-[PureBasic](https://www.purebasic.com/documentation/http/index.html) uses libcurl in its "native" HTTP subsystem
-
[Python](http://pycurl.io/) PycURL by Kjetil Jacobsen
[R](https://cran.r-project.org/package=curl)
diff --git a/docs/BUG-BOUNTY.md b/docs/BUG-BOUNTY.md
deleted file mode 100644
index 8ee9ac62f..000000000
--- a/docs/BUG-BOUNTY.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# The curl bug bounty
-
-The curl project runs a bug bounty program in association with
-[HackerOne](https://www.hackerone.com) and the [Internet Bug
-Bounty](https://internetbugbounty.org).
-
-# How does it work?
-
-Start out by posting your suspected security vulnerability directly to [curl's
-HackerOne program](https://hackerone.com/curl).
-
-After you have reported a security issue, it has been deemed credible, and a
-patch and advisory has been made public, you may be eligible for a bounty from
-this program.
-
-See all details at [https://hackerone.com/curl](https://hackerone.com/curl)
-
-This bounty is relying on funds from sponsors. If you use curl professionally,
-consider help funding this! See
-[https://opencollective.com/curl](https://opencollective.com/curl) for
-details.
-
-# What are the reward amounts?
-
-The curl projects offer monetary compensation for reported and published
-security vulnerabilities. The amount of money that is rewarded depends on how
-serious the flaw is determined to be.
-
-We offer reward money *up to* a certain amount per severity. The curl security
-team determines the severity of each reported flaw on a case by case basis and
-the exact amount rewarded to the reporter is then decided.
-
-Check out the current award amounts at [https://hackerone.com/curl](https://hackerone.com/curl)
-
-# Who is eligible for a reward?
-
-Everyone and anyone who reports a security problem in a released curl version
-that hasn't already been reported can ask for a bounty.
-
-Vulnerabilities in features that are off by default and documented as
-experimental are not eligible for a reward.
-
-The vulnerability has to be fixed and publicly announced (by the curl project)
-before a bug bounty will be considered.
-
-Bounties need to be requested within twelve months from the publication of the
-vulnerability.
-
-The vulnerabilities must not have been made public before February 1st, 2019.
-We do not retroactively pay for old, already known, or published security
-problems.
-
-# Product vulnerabilities only
-
-This bug bounty only concerns the curl and libcurl products and thus their
-respective source codes - when running on existing hardware. It does not
-include documentation, websites, or other infrastructure.
-
-The curl security team will be the sole arbiter if a reported flaw can be
-subject to a bounty or not.
-
-# How are vulnerabilities graded?
-
-The grading of each reported vulnerability that makes a reward claim will be
-performed by the curl security team. The grading will be based on the CVSS
-(Common Vulnerability Scoring System) 3.0.
-
-# How are reward amounts determined?
-
-The curl security team first gives the vulnerability a score, as mentioned
-above, and based on that level we set an amount depending on the specifics of
-the individual case. Other sponsors of the program might also get involved and
-can raise the amounts depending on the particular issue.
-
-# What happens if the bounty fund is drained?
-
-The bounty fund depends on sponsors. If we pay out more bounties than we add,
-the fund will eventually drain. If that end up happening, we will simply not
-be able to pay out as high bounties as we would like and hope that we can
-convince new sponsors to help us top up the fund again.
-
-# Regarding taxes, etc. on the bounties
-
-In the event that the individual receiving a curl bug bounty needs to pay
-taxes on the reward money, the responsibility lies with the receiver. The
-curl project or its security team never actually receive any of this money,
-hold the money, or pay out the money.
-
-## Bonus levels
-
-In cooperation with [Dropbox](https://www.dropbox.com) the curl bug bounty can
-offer the highest levels of rewards if the issue covers one of the interest
-areas of theirs - and only if the bug is graded *high* or *critical*. A
-non-exhaustive list of vulnerabilities Dropbox is interested in are:
-
- - RCE
- - URL parsing vulnerabilities with demonstrable security impact
-
-Dropbox would generally hand out rewards for critical vulnerabilities ranging
-from 12k-32k USD where RCE is on the upper end of the spectrum.
-
-URL parsing vulnerabilities with demonstrable security impact might include
-incorrectly determining the authority of a URL when a special character is
-inserted into the path of the URL (as a hypothetical). This type of
-vulnerability would likely yield 6k-12k unless further impact could be
-demonstrated.
diff --git a/docs/BUGS b/docs/BUGS
index 480e0caec..7322d9b21 100644
--- a/docs/BUGS
+++ b/docs/BUGS
@@ -61,14 +61,9 @@ BUGS
using our security development process.
Security related bugs or bugs that are suspected to have a security impact,
- should be reported on the curl security tracker at HackerOne:
-
- https://hackerone.com/curl
-
- This ensures that the report reaches the curl security team so that they
- first can be deal with the report away from the public to minimize the harm
- and impact it will have on existing users out there who might be using the
- vulnerable versions.
+ should be reported by email to curl-security@haxx.se so that they first can
+ be dealt with away from the public to minimize the harm and impact it will
+ have on existing users out there who might be using the vulnerable versions.
The curl project's process for handling security related issues is
documented here:
diff --git a/docs/CIPHERS.md b/docs/CIPHERS.md
index 19aedf36f..c01180426 100644
--- a/docs/CIPHERS.md
+++ b/docs/CIPHERS.md
@@ -6,12 +6,11 @@ and
[`--ciphers`](https://curl.haxx.se/docs/manpage.html#--ciphers)
users can control which ciphers to consider when negotiating TLS connections.
-TLS 1.3 ciphers are supported since curl 7.61 for OpenSSL 1.1.1+ with options
+TLS 1.3 ciphers are supported since curl 7.61 with options
[`CURLOPT_TLS13_CIPHERS`](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html)
and
[`--tls13-ciphers`](https://curl.haxx.se/docs/manpage.html#--tls13-ciphers)
-. If you are using a different SSL backend you can try setting TLS 1.3 cipher
-suites by using the respective regular cipher option.
+.
The names of the known ciphers differ depending on which TLS backend that
libcurl was built to use. This is an attempt to list known cipher names.
@@ -270,16 +269,9 @@ When specifying multiple cipher names, separate them with colon (`:`).
`ecdhe_ecdsa_chacha20_poly1305_sha_256`
`dhe_rsa_chacha20_poly1305_sha_256`
-### TLS 1.3 cipher suites
-
-`aes_128_gcm_sha_256`
-`aes_256_gcm_sha_384`
-`chacha20_poly1305_sha_256`
-
## GSKit
-Ciphers are internally defined as
-[numeric codes](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm),
+Ciphers are internally defined as numeric codes (https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm),
but libcurl maps them to the following case-insensitive names.
### SSL2 cipher suites (insecure: disabled by default)
@@ -454,18 +446,9 @@ but libcurl maps them to the following case-insensitive names.
`DHE-PSK-CHACHA20-POLY1305`,
`EDH-RSA-DES-CBC3-SHA`,
-## Schannel
-
-Schannel allows the enabling and disabling of encryption algorithms, but not
-specific ciphersuites. They are
-[defined](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id) by
-Microsoft.
+## WinSSL
-There is also the case that the selected algorithm is not supported by the
-protocol or does not match the ciphers offered by the server during the SSL
-negotiation. In this case curl will return error
-`CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH`
-and the request will fail.
+WinSSL allows the enabling and disabling of encryption algorithms, but not specific ciphersuites. They are defined by Microsoft (https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx)
`CALG_MD2`,
`CALG_MD4`,
diff --git a/docs/CODE_STYLE.md b/docs/CODE_STYLE.md
index 0ceb5b9ad..2d275cd7d 100644
--- a/docs/CODE_STYLE.md
+++ b/docs/CODE_STYLE.md
@@ -9,8 +9,8 @@ style is more important than individual contributors having their own personal
tastes satisfied.
Our C code has a few style rules. Most of them are verified and upheld by the
-`lib/checksrc.pl` script. Invoked with `make checksrc` or even by default by
-the build system when built after `./configure --enable-debug` has been used.
+"lib/checksrc.pl" script. Invoked with "make checksrc" or even by default by
+the build system when built after "./configure --enable-debug" has been used.
It is normally not a problem for anyone to follow the guidelines, as you just
need to copy the style already used in the source code and there are no
@@ -227,7 +227,7 @@ Align with the "current open" parenthesis:
Use **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for
particular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE
shall be generated by the configure script for unix-like systems and they are
-hard-coded in the `config-[system].h` files for the others.
+hard-coded in the config-[system].h files for the others.
We also encourage use of macros/functions that possibly are empty or defined
to constants when libcurl is built without that feature, to make the code
diff --git a/docs/DEPRECATE.md b/docs/DEPRECATE.md
index 4f4ef8ab6..27bd22ff7 100644
--- a/docs/DEPRECATE.md
+++ b/docs/DEPRECATE.md
@@ -5,32 +5,77 @@ email the curl-library mailing list as soon as possible and explain to us why
this is a problem for you and how your use case can't be satisfied properly
using a work around.
-## PolarSSL
+## HTTP pipelining
-The polarssl TLS library has not had an update in over three years. The last
-release was done on [January 7
-2016](https://tls.mbed.org/tech-updates/releases). This library has been
-superseded by the mbedTLS library, which is the current incarnation of
-PolarSSL. curl has supported mbedTLS since 2015.
+HTTP pipelining is badly supported by curl in the sense that we have bugs and
+it is a fragile feature without enough tests. Also, when something turns out
+to have problems it is really tricky to debug due to the timing sensitivity so
+very often enabling debug outputs or similar completely changes the nature of
+the behavior and things are not reproducing anymore!
-It seems unlikely that this library is a good choice for users to get proper
-TLS security and support today and at the same time there are plenty of good
-and updated alternatives.
+HTTP pipelining was never enabled by default by the large desktop browsers due
+to all the issues with it. Both Firefox and Chrome have also dropped
+pipelining support entirely since a long time back now. We are in fact over
+time becoming more and more lonely in supporting pipelining.
-I consider it likely that the existing users of curl + polarssl out there are
-stuck on old curl versions and when they eventually manage to update curl they
-should also be able to update their TLS library.
+The bad state of HTTP pipelining was a primary driving factor behind HTTP/2
+and its multiplexing feature. HTTP/2 multiplexing is truly and really
+"pipelining done right". It is way more solid, practical and solves the use
+case in a better way with better performance and fewer downsides and problems.
+
+In 2018, pipelining *should* be abandoned and HTTP/2 should be used instead.
+
+### State
+
+In 7.62.0, we will add code that ignores the "enable pipeline" option
+setting). The *setopt() function would still return "OK" though so the
+application couldn't tell that this is happening.
+
+Users who truly need pipelining from that version will need to modify the code
+(ever so slightly) and rebuild.
+
+### Removal
+
+Six months later, in sync with the planned release happen in April 2019,
+(might be 7.66.0), assuming no major riots have occurred due to this in the
+mean time, we rip out the pipelining code. It is in the order of 1000 lines of
+libcurl code.
+
+Left to answer: should the *setopt() function start to return error when these
+options are set to be able to tell when they're trying to use options that are
+no longer around or should we maintain behavior as much as possible?
+
+## `CURLOPT_DNS_USE_GLOBAL_CACHE`
+
+This option makes libcurl use a global non-thread-safe cache for DNS if
+enabled. The option has been marked as "obsolete" in the header file and in
+documentation for several years already.
+
+There's proper and safe method alternative provided since many years: the
+share API.
+
+### State
+
+In curl 7.62.0 setting this option to TRUE will not have any effect. The
+global cache will not be enabled. The code still remains so it is easy to
+revert if need be.
+
+### Removal
+
+Remove all global-cache related code from curl around April 2019 (might be
+7.66.0).
+
+## HTTP/0.9
+
+Supporting this is non-obvious and might even come as a surprise to some
+users. Potentially even being a security risk in some cases.
### State
-In the curl 7.65.2 release (July 17, 2019) the ability to build with this TLS
-backend is removed from the configure script. The code remains and can be
-built and used going forward, but it has to be manually enabled in a build (or
-the configure removal reverted).
+curl 7.64.0 introduces options to disable/enable support for this protocol
+version. The default remains supported for now.
### Removal
-The support for PolarSSL and all code for it will be completely removed from
-the curl code base six months after it ships disabled in configure in a
-release. In the release on or near February 27, 2020. (possibly called curl
-7.70.0).
+The support for HTTP/0.9 will be switched to disabled by default in 6 months,
+in the September 2019 release (possibly called curl 7.68.0).
diff --git a/docs/ESNI.md b/docs/ESNI.md
deleted file mode 100644
index eefb6662b..000000000
--- a/docs/ESNI.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# TLS: ESNI support in curl and libcurl
-
-## Summary
-
-**ESNI** means **Encrypted Server Name Indication**, a TLS 1.3
-extension which is currently the subject of an
-[IETF Draft][tlsesni].
-
-This file is intended to show the latest current state of ESNI support
-in **curl** and **libcurl**.
-
-At end of August 2019, an [experimental fork of curl][niallorcurl],
-built using an [experimental fork of OpenSSL][sftcdopenssl], which in
-turn provided an implementation of ESNI, was demonstrated
-interoperating with a server belonging to the [DEfO
-Project][defoproj].
-
-Further sections here describe
-
-- resources needed for building and demonstrating **curl** support
- for ESNI,
-
-- progress to date,
-
-- TODO items, and
-
-- additional details of specific stages of the progress.
-
-## Resources needed
-
-To build and demonstrate ESNI support in **curl** and/or **libcurl**,
-you will need
-
-- a TLS library, supported by **libcurl**, which implements ESNI;
-
-- an edition of **curl** and/or **libcurl** which supports the ESNI
- implementation of the chosen TLS library;
-
-- an environment for building and running **curl**, and at least
- building **OpenSSL**;
-
-- a server, supporting ESNI, against which to run a demonstration
- and perhaps a specific target URL;
-
-- some instructions.
-
-The following set of resources is currently known to be available.
-
-| Set | Component | Location | Remarks |
-|:-----|:-------------|:------------------------------|:-------------------------------------------|
-| DEfO | TLS library | [sftcd/openssl][sftcdopenssl] | Tag *esni-2019-08-30* avoids bleeding edge |
-| | curl fork | [niallor/curl][niallorcurl] | Tag *esni-2019-08-30* likewise |
-| | instructions | [ESNI-README][niallorreadme] | |
-
-## Progress
-
-### PR 4011 (Jun 2019) expected in curl release 7.67.0 (Oct 2019)
-
-- Details [below](#pr4011);
-
-- New **curl** feature: `CURL_VERSION_ESNI`;
-
-- New configuration option: `--enable-esni`;
-
-- Build-time check for availability of resources needed for ESNI
- support;
-
-- Pre-processor symbol `USE_ESNI` for conditional compilation of
- ESNI support code, subject to configuration option and
- availability of needed resources.
-
-## TODO
-
-- (next PR) Add libcurl options to set ESNI parameters.
-
-- (next PR) Add curl tool command line options to set ESNI parameters.
-
-- (WIP) Extend DoH functions so that published ESNI parameters can be
- retrieved from DNS instead of being required as options.
-
-- (WIP) Work with OpenSSL community to finalize ESNI API.
-
-- Track OpenSSL ESNI API in libcurl
-
-- Identify and implement any changes needed for CMake.
-
-- Optimize build-time checking of available resources.
-
-- Encourage ESNI support work on other TLS/SSL backends.
-
-## Additional detail
-
-### PR 4011
-
-**TLS: Provide ESNI support framework for curl and libcurl**
-
-The proposed change provides a framework to facilitate work to
-implement ESNI support in curl and libcurl. It is not intended
-either to provide ESNI functionality or to favour any particular
-TLS-providing backend. Specifically, the change reserves a
-feature bit for ESNI support (symbol `CURL_VERSION_ESNI`),
-implements setting and reporting of this bit, includes dummy
-book-keeping for the symbol, adds a build-time configuration
-option (`--enable-esni`), provides an extensible check for
-resources available to provide ESNI support, and defines a
-compiler pre-processor symbol (`USE_ESNI`) accordingly.
-
-Proposed-by: @niallor (Niall O'Reilly)\
-Encouraged-by: @sftcd (Stephen Farrell)\
-See-also: [this message](https://curl.haxx.se/mail/lib-2019-05/0108.html)
-
-Limitations:
-- Book-keeping (symbols-in-versions) needs real release number, not 'DUMMY'.
-
-- Framework is incomplete, as it covers autoconf, but not CMake.
-
-- Check for available resources, although extensible, refers only to
- specific work in progress ([described
- here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to
- implement ESNI for OpenSSL, as this is the immediate motivation
- for the proposed change.
-
-## References
-
-CloudFlare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug]
-
-Cloudflare blog: [Encrypt it or lose it: how encrypted SNI works][esniworks]
-
-IETF Draft: [Encrypted Server Name Indication for TLS 1.3][tlsesni]
-
----
-
-[tlsesni]: https://datatracker.ietf.org/doc/draft-ietf-tls-esni/
-[esniworks]: https://blog.cloudflare.com/encrypted-sni/
-[corebug]: https://blog.cloudflare.com/esni/
-[defoproj]: https://defo.ie/
-[sftcdopenssl]: https://github.com/sftcd/openssl/
-[niallorcurl]: https://github.com/niallor/curl/
-[niallorreadme]: https://github.com/niallor/curl/blob/master/ESNI-README.md
diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md
deleted file mode 100644
index 6c33bcf53..000000000
--- a/docs/EXPERIMENTAL.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Experimental
-
-Some features and functionality in curl and libcurl are considered
-**EXPERIMENTAL**.
-
-Experimental support in curl means:
-
-1. Experimental features are provided to allow users to try them out and
- provide feedback on functionality and API etc before they ship and get
- "carved in stone".
-2. You must enable the feature when invoking configure as otherwise curl will
- not be built with the feature present.
-3. We strongly advice against using this feature in production.
-4. **We reserve the right to change behavior** of the feature without sticking
- to our API/ABI rules as we do for regular features, as long as it is marked
- experimental.
-5. Experimental features are clearly marked so in documentation. Beware.
-
-## Experimental features right now
-
- - HTTP/3 support and options
- - alt-svc support and options
diff --git a/docs/FAQ b/docs/FAQ
index 4136b9170..c1bc9bea5 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -43,8 +43,8 @@ FAQ
3.9 How do I use curl in my favorite programming language?
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
3.11 How do I POST with a different Content-Type?
- 3.12 Why do FTP-specific features over HTTP proxy fail?
- 3.13 Why do my single/double quotes fail?
+ 3.12 Why do FTP specific features over HTTP proxy fail?
+ 3.13 Why does my single/double quotes fail?
3.14 Does curl support Javascript or PAC (automated proxy config)?
3.15 Can I do recursive fetches with curl?
3.16 What certificates do I need when I use SSL?
@@ -72,7 +72,7 @@ FAQ
4.8 I found a bug!
4.9 Curl can't authenticate to the server that requires NTLM?
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
- 4.11 Why do my HTTP range requests return the full document?
+ 4.11 Why does my HTTP range requests return the full document?
4.12 Why do I get "certificate verify failed" ?
4.13 Why is curl -R on Windows one hour off?
4.14 Redirects work in browser but not with curl!
@@ -557,9 +557,10 @@ FAQ
3.9 How do I use curl in my favorite programming language?
- Many programming languages have interfaces/bindings that allow you to use
- curl without having to use the command line tool. If you are fluent in such
- a language, you may prefer to use one of these interfaces instead.
+ There exist many language interfaces/bindings for curl that integrates it
+ better with various languages. If you are fluid in a script language, you
+ may very well opt to use such an interface instead of using the command line
+ tool.
Find out more about which languages that support curl directly, and how to
install and use them, in the libcurl section of the curl web site:
@@ -597,11 +598,11 @@ FAQ
curl -d "datatopost" -H "Content-Type: text/xml" [URL]
- 3.12 Why do FTP-specific features over HTTP proxy fail?
+ 3.12 Why do FTP specific features over HTTP proxy fail?
Because when you use a HTTP proxy, the protocol spoken on the network will
be HTTP, even if you specify a FTP URL. This effectively means that you
- normally can't use FTP-specific features such as FTP upload and FTP quote
+ normally can't use FTP specific features such as FTP upload and FTP quote
etc.
There is one exception to this rule, and that is if you can "tunnel through"
@@ -609,7 +610,7 @@ FAQ
and is generally not available as proxy admins usually disable tunneling to
ports other than 443 (which is used for HTTPS access through proxies).
- 3.13 Why do my single/double quotes fail?
+ 3.13 Why does my single/double quotes fail?
To specify a command line option that includes spaces, you might need to
put the entire option within quotes. Like in:
@@ -894,7 +895,7 @@ FAQ
<H1>Moved Permanently</H1> The document has moved <A
HREF="http://same_url_now_with_a_trailing_slash/">here</A>.
- it might be because you requested a directory URL but without the trailing
+ it might be because you request a directory URL but without the trailing
slash. Try the same operation again _with_ the trailing URL, or use the
-L/--location option to follow the redirection.
@@ -925,8 +926,8 @@ FAQ
anyone would call security.
Also note that regular HTTP (using Basic authentication) and FTP passwords
- are sent as cleartext across the network. All it takes for anyone to fetch
- them is to listen on the network. Eavesdropping is very easy. Use more secure
+ are sent in clear across the network. All it takes for anyone to fetch them
+ is to listen on the network. Eavesdropping is very easy. Use more secure
authentication methods (like Digest, Negotiate or even NTLM) or consider the
SSL-based alternatives HTTPS and FTPS.
@@ -961,7 +962,7 @@ FAQ
software you're trying to interact with. This is not anything curl can do
anything about.
- 4.11 Why do my HTTP range requests return the full document?
+ 4.11 Why does my HTTP range requests return the full document?
Because the range may not be supported by the server, or the server may
choose to ignore it and return the full document anyway.
@@ -1011,8 +1012,8 @@ FAQ
redirects the browser to another given URL.
There is no way to make curl follow these redirects. You must either
- manually figure out what the page is set to do, or write a script that parses
- the results and fetches the new URL.
+ manually figure out what the page is set to do, or you write a script that
+ parses the results and fetches the new URL.
4.15 FTPS doesn't work
diff --git a/docs/HTTP3.md b/docs/HTTP3.md
deleted file mode 100644
index 2dbd25688..000000000
--- a/docs/HTTP3.md
+++ /dev/null
@@ -1,115 +0,0 @@
-# HTTP3 (and QUIC)
-
-## Resources
-
-[HTTP/3 Explained](https://daniel.haxx.se/http3-explained/) - the online free
-book describing the protocols involved.
-
-[QUIC implementation](https://github.com/curl/curl/wiki/QUIC-implementation) -
-the wiki page describing the plan for how to support QUIC and HTTP/3 in curl
-and libcurl.
-
-[quicwg.org](https://quicwg.org/) - home of the official protocol drafts
-
-## QUIC libraries
-
-QUIC libraries we're experiementing with:
-
-[ngtcp2](https://github.com/ngtcp2/ngtcp2)
-
-[quiche](https://github.com/cloudflare/quiche)
-
-## Experimental!
-
-HTTP/3 and QUIC support in curl is considered **EXPERIMENTAL** until further
-notice. It needs to be enabled at build-time.
-
-Further development and tweaking of the HTTP/3 support in curl will happen in
-in the master branch using pull-requests, just like ordinary changes.
-
-# ngtcp2 version
-
-## Build
-
-Build (patched) OpenSSL
-
- % git clone --depth 1 -b openssl-quic-draft-23 https://github.com/tatsuhiro-t/openssl
- % cd openssl
- % ./config enable-tls1_3 --prefix=<somewhere1>
- % make
- % make install_sw
-
-Build nghttp3
-
- % cd ..
- % git clone https://github.com/ngtcp2/nghttp3
- % cd nghttp3
- % autoreconf -i
- % ./configure --prefix=<somewhere2> --enable-lib-only
- % make
- % make install
-
-Build ngtcp2
-
- % cd ..
- % git clone https://github.com/ngtcp2/ngtcp2
- % cd ngtcp2
- % autoreconf -i
- % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3>
- % make
- % make install
-
-Build curl
-
- % cd ..
- % git clone https://github.com/curl/curl
- % cd curl
- % ./buildconf
- % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3>
- % make
-
-# quiche version
-
-## build
-
-Clone quiche and BoringSSL:
-
- % git clone --recursive https://github.com/cloudflare/quiche
-
-Build BoringSSL (it needs to be built manually so it can be reused with curl):
-
- % cd quiche/deps/boringssl
- % mkdir build
- % cd build
- % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
- % make
- % cd ..
- % mkdir -p .openssl/lib
- % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
- % ln -s $PWD/include .openssl
-
-Build quiche:
-
- % cd ../..
- % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta
-
-Clone and build curl:
-
- % cd ..
- % git clone https://github.com/curl/curl
- % cd curl
- % ./buildconf
- % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release
- % make
-
-## Run
-
-Use HTTP/3 directly:
-
- curl --http3 https://nghttp2.org:8443/
-
-Upgrade via Alt-Svc:
-
- curl --alt-svc altsvc.cache https://quic.aiortc.org/
-
-See this [list of public HTTP/3 servers](https://bagder.github.io/HTTP3-test/)
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
index 78d632c70..f2f93227a 100644
--- a/docs/INSTALL.md
+++ b/docs/INSTALL.md
@@ -7,18 +7,6 @@ document does not describe how to install curl or libcurl using such a binary
package. This document describes how to compile, build and install curl and
libcurl from source code.
-## Building using vcpkg
-
-You can download and install curl and libcurl using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:
-
- git clone https://github.com/Microsoft/vcpkg.git
- cd vcpkg
- ./bootstrap-vcpkg.sh
- ./vcpkg integrate install
- vcpkg install curl[tool]
-
-The curl port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
-
## Building from git
If you get your code off a git repository instead of a release tarball, see
@@ -68,15 +56,15 @@ you have pkg-config installed, set the pkg-config path first, like this:
Without pkg-config installed, use this:
- ./configure --with-ssl=/opt/OpenSSL
+ ./configure --with-ssl=/opt/OpenSSL
If you insist on forcing a build without SSL support, even though you may
have OpenSSL installed in your system, you can run configure like this:
- ./configure --without-ssl
+ ./configure --without-ssl
If you have OpenSSL installed, but with the libraries in one place and the
-header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS`
+header files somewhere else, you have to set the LDFLAGS and CPPFLAGS
environment variables prior to running configure. Something like this should
work:
@@ -133,9 +121,9 @@ libressl.
KB140584 is a must for any Windows developer. Especially important is full
understanding if you are not going to follow the advice given above.
- - [How To Use the C Run-Time](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time)
- - [Run-Time Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library)
- - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries)
+ - [How To Use the C Run-Time](https://support.microsoft.com/kb/94248/en-us)
+ - [How to link with the correct C Run-Time CRT library](https://support.microsoft.com/kb/140584/en-us)
+ - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://msdn.microsoft.com/en-us/library/ms235460)
If your app is misbehaving in some strange way, or it is suffering from
memory corruption, before asking for further help, please try first to
@@ -160,7 +148,7 @@ make targets available to build libcurl with more features, use:
and SSPI support.
If you have any problems linking libraries or finding header files, be sure
-to verify that the provided `Makefile.m32` files use the proper paths, and
+to verify that the provided "Makefile.m32" files use the proper paths, and
adjust as necessary. It is also possible to override these paths with
environment variables, for example:
@@ -184,8 +172,8 @@ If you want to enable LDAPS support then set LDAPS=1.
## Cygwin
Almost identical to the unix installation. Run the configure script in the
-curl source tree root with `sh configure`. Make sure you have the `sh`
-executable in `/bin/` or you'll see the configure fail toward the end.
+curl source tree root with `sh configure`. Make sure you have the sh
+executable in /bin/ or you'll see the configure fail toward the end.
Run `make`
@@ -212,9 +200,9 @@ protocols:
If you want to set any of these defines you have the following options:
- - Modify `lib/config-win32.h`
- - Modify `lib/curl_setup.h`
- - Modify `winbuild/Makefile.vc`
+ - Modify lib/config-win32.h
+ - Modify lib/curl_setup.h
+ - Modify winbuild/Makefile.vc
- Modify the "Preprocessor Definitions" in the libcurl project
Note: The pre-processor settings can be found using the Visual Studio IDE
@@ -225,12 +213,12 @@ versions.
## Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds
In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is
-necessary to make definition of preprocessor symbol `USE_LWIPSOCK` visible to
+necessary to make definition of preprocessor symbol USE_LWIPSOCK visible to
libcurl and curl compilation processes. To set this definition you have the
following alternatives:
- - Modify `lib/config-win32.h` and `src/config-win32.h`
- - Modify `winbuild/Makefile.vc`
+ - Modify lib/config-win32.h and src/config-win32.h
+ - Modify winbuild/Makefile.vc
- Modify the "Preprocessor Definitions" in the libcurl project
Note: The pre-processor settings can be found using the Visual Studio IDE
@@ -260,13 +248,13 @@ look for dynamic import symbols.
## Legacy Windows and SSL
-Schannel (from Windows SSPI), is the native SSL library in Windows. However,
-Schannel in Windows <= XP is unable to connect to servers that
+WinSSL (specifically Schannel from Windows SSPI), is the native SSL library in
+Windows. However, WinSSL in Windows <= XP is unable to connect to servers that
no longer support the legacy handshakes and algorithms used by those
versions. If you will be using curl in one of those earlier versions of
Windows you should choose another SSL backend such as OpenSSL.
-# Apple iOS and macOS
+# Apple iOS and Mac OS X
On modern Apple operating systems, curl can be built to use Apple's SSL/TLS
implementation, Secure Transport, instead of OpenSSL. To build with Secure
@@ -281,12 +269,12 @@ the server. This, of course, includes the root certificates that ship with the
OS. The `--cert` and `--engine` options, and their libcurl equivalents, are
currently unimplemented in curl with Secure Transport.
-For macOS users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul
-to the Secure Transport API that, among other things, added support for the
-newer TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you
-must build curl on Mountain Lion or later, or by using the equivalent SDK. If
-you set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier
-version of macOS prior to building curl, then curl will use the new Secure
+For OS X users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul to
+the Secure Transport API that, among other things, added support for the newer
+TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you must
+build curl on Mountain Lion or later, or by using the equivalent SDK. If you
+set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier
+version of OS X prior to building curl, then curl will use the new Secure
Transport API on Mountain Lion and later, and fall back on the older API when
the same curl binary is executed on older cats. For example, running these
commands in curl's directory in the shell will build the code such that it
@@ -300,7 +288,7 @@ will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash):
Download and unpack the curl package.
-`cd` to the new directory. (e.g. `cd curl-7.12.3`)
+'cd' to the new directory. (e.g. `cd curl-7.12.3`)
Set environment variables to point to the cross-compile toolchain and call
configure with any options you need. Be sure and specify the `--host` and
@@ -339,7 +327,7 @@ In some cases, you may be able to simplify the above commands to as little as:
There are a number of configure options that can be used to reduce the size of
libcurl for embedded applications where binary size is an important factor.
-First, be sure to set the `CFLAGS` variable when configuring with any relevant
+First, be sure to set the CFLAGS variable when configuring with any relevant
compiler optimization flags to reduce the size of the binary. For gcc, this
would mean at minimum the -Os option, and potentially the `-march=X`,
`-mdynamic-no-pic` and `-flto` options as well, e.g.
@@ -372,8 +360,8 @@ use, here are some other flags that can reduce the size of the library:
The GNU compiler and linker have a number of options that can reduce the
size of the libcurl dynamic libraries on some platforms even further.
-Specify them by providing appropriate `CFLAGS` and `LDFLAGS` variables on
-the configure command-line, e.g.
+Specify them by providing appropriate CFLAGS and LDFLAGS variables on the
+configure command-line, e.g.
CFLAGS="-Os -ffunction-sections -fdata-sections
-fno-unwind-tables -fno-asynchronous-unwind-tables -flto"
@@ -395,7 +383,7 @@ in a lower total size than dynamically linking.
Note that the curl test harness can detect the use of some, but not all, of
the `--disable` statements suggested above. Use will cause tests relying on
those features to fail. The test harness can be manually forced to skip the
-relevant tests by specifying certain key words on the `runtests.pl` command
+relevant tests by specifying certain key words on the runtests.pl command
line. Following is a list of appropriate key words:
- `--disable-cookies` !cookies
diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md
index 9ae722898..69b92d4e2 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -13,7 +13,7 @@ curl internals
- [`Curl_disconnect`](#Curl_disconnect)
- [HTTP(S)](#http)
- [FTP](#ftp)
- - [Kerberos](#kerberos)
+ - [Kerberos](#kerberos)
- [TELNET](#telnet)
- [FILE](#file)
- [SMB](#smb)
@@ -34,17 +34,10 @@ curl internals
- [`curl_off_t`](#curl_off_t)
- [curlx](#curlx)
- [Content Encoding](#contentencoding)
- - [`hostip.c` explained](#hostip)
+ - [hostip.c explained](#hostip)
- [Track Down Memory Leaks](#memoryleak)
- [`multi_socket`](#multi_socket)
- [Structs in libcurl](#structs)
- - [Curl_easy](#Curl_easy)
- - [connectdata](#connectdata)
- - [Curl_multi](#Curl_multi)
- - [Curl_handler](#Curl_handler)
- - [conncache](#conncache)
- - [Curl_share](#Curl_share)
- - [CookieInfo](#CookieInfo)
<a name="intro"></a>
Intro
@@ -73,7 +66,7 @@ git
Portability
===========
- We write curl and libcurl to compile with C89 compilers. On 32-bit and up
+ We write curl and libcurl to compile with C89 compilers. On 32bit and up
machines. Most of libcurl assumes more or less POSIX compliance but that's
not a requirement.
@@ -90,7 +83,7 @@ Dependencies
- libssh2 0.16
- c-ares 1.6.0
- libidn2 2.0.0
- - wolfSSL 2.0.0
+ - cyassl 2.0.0
- openldap 2.0
- MIT Kerberos 1.2.4
- GSKit V5R3M0
@@ -125,7 +118,7 @@ Build tools
- GNU M4 1.4
- perl 5.004
- roffit 0.5
- - groff ? (any version that supports `groff -Tps -man [in] [out]`)
+ - groff ? (any version that supports "groff -Tps -man [in] [out]")
- ps2pdf (gs) ?
<a name="winvsunix"></a>
@@ -139,7 +132,7 @@ Windows vs Unix
In curl, this is solved with defines and macros, so that the source looks
the same in all places except for the header file that defines them. The
- macros in use are `sclose()`, `sread()` and `swrite()`.
+ macros in use are sclose(), sread() and swrite().
2. Windows requires a couple of init calls for the socket stuff.
@@ -178,14 +171,14 @@ Library
There are plenty of entry points to the library, namely each publicly defined
function that libcurl offers to applications. All of those functions are
rather small and easy-to-follow. All the ones prefixed with `curl_easy` are
- put in the `lib/easy.c` file.
+ put in the lib/easy.c file.
`curl_global_init()` and `curl_global_cleanup()` should be called by the
application to initialize and clean up global stuff in the library. As of
today, it can handle the global SSL initing if SSL is enabled and it can init
the socket layer on windows machines. libcurl itself has no "global" scope.
- All printf()-style functions use the supplied clones in `lib/mprintf.c`. This
+ All printf()-style functions use the supplied clones in lib/mprintf.c. This
makes sure we stay absolutely platform independent.
[ `curl_easy_init()`][2] allocates an internal struct and makes some
@@ -204,8 +197,8 @@ Library
`curl_multi_wait()`, and `curl_multi_perform()` until the transfer is done
and then returns.
- Some of the most important key functions in `url.c` are called from
- `multi.c` when certain key steps are to be made in the transfer operation.
+ Some of the most important key functions in url.c are called from multi.c
+ when certain key steps are to be made in the transfer operation.
<a name="Curl_connect"></a>
Curl_connect()
@@ -213,15 +206,15 @@ Curl_connect()
Analyzes the URL, it separates the different components and connects to the
remote host. This may involve using a proxy and/or using SSL. The
- `Curl_resolv()` function in `lib/hostip.c` is used for looking up host
- names (it does then use the proper underlying method, which may vary
- between platforms and builds).
+ `Curl_resolv()` function in lib/hostip.c is used for looking up host names
+ (it does then use the proper underlying method, which may vary between
+ platforms and builds).
When `Curl_connect` is done, we are connected to the remote site. Then it
is time to tell the server to get a document/file. `Curl_do()` arranges
this.
- This function makes sure there's an allocated and initiated `connectdata`
+ This function makes sure there's an allocated and initiated 'connectdata'
struct that is used for this particular connection only (although there may
be several requests performed on the same connect). A bunch of things are
inited/inherited from the `Curl_easy` struct.
@@ -230,15 +223,15 @@ Curl_connect()
multi_do()
---------
- `multi_do()` makes sure the proper protocol-specific function is called.
- The functions are named after the protocols they handle.
+ `multi_do()` makes sure the proper protocol-specific function is called. The
+ functions are named after the protocols they handle.
The protocol-specific functions of course deal with protocol-specific
negotiations and setup. They have access to the `Curl_sendf()` (from
- `lib/sendf.c`) function to send printf-style formatted data to the remote
+ lib/sendf.c) function to send printf-style formatted data to the remote
host and when they're ready to make the actual file transfer they call the
- `Curl_setup_transfer()` function (in `lib/transfer.c`) to setup the
- transfer and returns.
+ `Curl_setup_transfer()` function (in lib/transfer.c) to setup the transfer
+ and returns.
If this DO function fails and the connection is being re-used, libcurl will
then close this connection, setup a new connection and re-issue the DO
@@ -252,9 +245,9 @@ Curl_readwrite()
Called during the transfer of the actual protocol payload.
- During transfer, the progress functions in `lib/progress.c` are called at
+ During transfer, the progress functions in lib/progress.c are called at
frequent intervals (or at the user's choice, a specified callback might get
- called). The speedcheck functions in `lib/speedcheck.c` are also used to
+ called). The speedcheck functions in lib/speedcheck.c are also used to
verify that the transfer is as fast as required.
<a name="multi_done"></a>
@@ -286,12 +279,11 @@ HTTP(S)
=======
HTTP offers a lot and is the protocol in curl that uses the most lines of
- code. There is a special file `lib/formdata.c` that offers all the
- multipart post functions.
+ code. There is a special file (lib/formdata.c) that offers all the multipart
+ post functions.
- base64-functions for user+password stuff (and more) is in `lib/base64.c`
- and all functions for parsing and sending cookies are found in
- `lib/cookie.c`.
+ base64-functions for user+password stuff (and more) is in (lib/base64.c) and
+ all functions for parsing and sending cookies are found in (lib/cookie.c).
HTTPS uses in almost every case the same procedure as HTTP, with only two
exceptions: the connect procedure is different and the function used to read
@@ -313,18 +305,18 @@ FTP
===
The `Curl_if2ip()` function can be used for getting the IP number of a
- specified network interface, and it resides in `lib/if2ip.c`.
+ specified network interface, and it resides in lib/if2ip.c.
`Curl_ftpsendf()` is used for sending FTP commands to the remote server. It
was made a separate function to prevent us programmers from forgetting that
- they must be CRLF terminated. They must also be sent in one single `write()`
- to make firewalls and similar happy.
+ they must be CRLF terminated. They must also be sent in one single write() to
+ make firewalls and similar happy.
<a name="kerberos"></a>
Kerberos
========
- Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also
+ Kerberos support is mainly in lib/krb5.c and lib/security.c but also
`curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and
`socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics.
@@ -332,57 +324,55 @@ Kerberos
TELNET
======
- Telnet is implemented in `lib/telnet.c`.
+ Telnet is implemented in lib/telnet.c.
<a name="file"></a>
FILE
====
- The `file://` protocol is dealt with in `lib/file.c`.
+ The file:// protocol is dealt with in lib/file.c.
<a name="smb"></a>
SMB
===
- The `smb://` protocol is dealt with in `lib/smb.c`.
+ The smb:// protocol is dealt with in lib/smb.c.
<a name="ldap"></a>
LDAP
====
- Everything LDAP is in `lib/ldap.c` and `lib/openldap.c`.
+ Everything LDAP is in lib/ldap.c and lib/openldap.c
<a name="email"></a>
E-mail
======
- The e-mail related source code is in `lib/imap.c`, `lib/pop3.c` and
- `lib/smtp.c`.
+ The e-mail related source code is in lib/imap.c, lib/pop3.c and lib/smtp.c.
<a name="general"></a>
General
=======
URL encoding and decoding, called escaping and unescaping in the source code,
- is found in `lib/escape.c`.
+ is found in lib/escape.c.
- While transferring data in `Transfer()` a few functions might get used.
- `curl_getdate()` in `lib/parsedate.c` is for HTTP date comparisons (and
- more).
+ While transferring data in Transfer() a few functions might get used.
+ `curl_getdate()` in lib/parsedate.c is for HTTP date comparisons (and more).
- `lib/getenv.c` offers `curl_getenv()` which is for reading environment
+ lib/getenv.c offers `curl_getenv()` which is for reading environment
variables in a neat platform independent way. That's used in the client, but
- also in `lib/url.c` when checking the proxy environment variables. Note that
- contrary to the normal unix `getenv()`, this returns an allocated buffer that
- must be `free()`ed after use.
+ also in lib/url.c when checking the proxy environment variables. Note that
+ contrary to the normal unix getenv(), this returns an allocated buffer that
+ must be free()ed after use.
- `lib/netrc.c` holds the `.netrc` parser.
+ lib/netrc.c holds the .netrc parser
- `lib/timeval.c` features replacement functions for systems that don't have
- `gettimeofday()` and a few support functions for timeval conversions.
+ lib/timeval.c features replacement functions for systems that don't have
+ gettimeofday() and a few support functions for timeval conversions.
A function named `curl_version()` that returns the full curl version string
- is found in `lib/version.c`.
+ is found in lib/version.c.
<a name="persistent"></a>
Persistent Connections
@@ -396,7 +386,7 @@ Persistent Connections
as well as all the options etc that the library-user may choose.
- The `Curl_easy` struct holds the "connection cache" (an array of
- pointers to `connectdata` structs).
+ pointers to 'connectdata' structs).
- This enables the 'curl handle' to be reused on subsequent transfers.
@@ -444,10 +434,10 @@ SSL libraries
in future libcurl versions.
To deal with this internally in the best way possible, we have a generic SSL
- function API as provided by the `vtls/vtls.[ch]` system, and they are the only
+ function API as provided by the vtls/vtls.[ch] system, and they are the only
SSL functions we must use from within libcurl. vtls is then crafted to use
the appropriate lower-level function calls to whatever SSL library that is in
- use. For example `vtls/openssl.[ch]` for the OpenSSL library.
+ use. For example vtls/openssl.[ch] for the OpenSSL library.
<a name="symbols"></a>
Library Symbols
@@ -466,7 +456,7 @@ Return Codes and Informationals
I've made things simple. Almost every function in libcurl returns a CURLcode,
that must be `CURLE_OK` if everything is OK or otherwise a suitable error
- code as the `curl/curl.h` include file defines. The very spot that detects an
+ code as the curl/curl.h include file defines. The very spot that detects an
error must use the `Curl_failf()` function to set the human-readable error
description.
@@ -488,20 +478,20 @@ API/ABI
Client
======
- `main()` resides in `src/tool_main.c`.
+ main() resides in `src/tool_main.c`.
- `src/tool_hugehelp.c` is automatically generated by the `mkhelp.pl` perl
- script to display the complete "manual" and the `src/tool_urlglob.c` file
- holds the functions used for the URL-"globbing" support. Globbing in the
- sense that the `{}` and `[]` expansion stuff is there.
+ `src/tool_hugehelp.c` is automatically generated by the mkhelp.pl perl script
+ to display the complete "manual" and the `src/tool_urlglob.c` file holds the
+ functions used for the URL-"globbing" support. Globbing in the sense that the
+ {} and [] expansion stuff is there.
- The client mostly sets up its `config` struct properly, then
+ The client mostly sets up its 'config' struct properly, then
it calls the `curl_easy_*()` functions of the library and when it gets back
control after the `curl_easy_perform()` it cleans up the library, checks
status and exits.
- When the operation is done, the `ourWriteOut()` function in `src/writeout.c`
- may be called to report about the operation. That function is using the
+ When the operation is done, the ourWriteOut() function in src/writeout.c may
+ be called to report about the operation. That function is using the
`curl_easy_getinfo()` function to extract useful information from the curl
session.
@@ -512,32 +502,30 @@ Client
Memory Debugging
================
- The file `lib/memdebug.c` contains debug-versions of a few functions.
- Functions such as `malloc()`, `free()`, `fopen()`, `fclose()`, etc that
- somehow deal with resources that might give us problems if we "leak" them.
- The functions in the memdebug system do nothing fancy, they do their normal
- function and then log information about what they just did. The logged data
- can then be analyzed after a complete session,
+ The file lib/memdebug.c contains debug-versions of a few functions. Functions
+ such as malloc, free, fopen, fclose, etc that somehow deal with resources
+ that might give us problems if we "leak" them. The functions in the memdebug
+ system do nothing fancy, they do their normal function and then log
+ information about what they just did. The logged data can then be analyzed
+ after a complete session,
- `memanalyze.pl` is the perl script present in `tests/` that analyzes a log
- file generated by the memory tracking system. It detects if resources are
+ memanalyze.pl is the perl script present in tests/ that analyzes a log file
+ generated by the memory tracking system. It detects if resources are
allocated but never freed and other kinds of errors related to resource
management.
- Internally, definition of preprocessor symbol `DEBUGBUILD` restricts code
- which is only compiled for debug enabled builds. And symbol `CURLDEBUG` is
- used to differentiate code which is _only_ used for memory
- tracking/debugging.
+ Internally, definition of preprocessor symbol DEBUGBUILD restricts code which
+ is only compiled for debug enabled builds. And symbol CURLDEBUG is used to
+ differentiate code which is _only_ used for memory tracking/debugging.
- Use `-DCURLDEBUG` when compiling to enable memory debugging, this is also
- switched on by running configure with `--enable-curldebug`. Use
- `-DDEBUGBUILD` when compiling to enable a debug build or run configure with
- `--enable-debug`.
+ Use -DCURLDEBUG when compiling to enable memory debugging, this is also
+ switched on by running configure with --enable-curldebug. Use -DDEBUGBUILD
+ when compiling to enable a debug build or run configure with --enable-debug.
- `curl --version` will list 'Debug' feature for debug enabled builds, and
+ curl --version will list 'Debug' feature for debug enabled builds, and
will list 'TrackMemory' feature for curl debug memory tracking capable
builds. These features are independent and can be controlled when running
- the configure script. When `--enable-debug` is given both features will be
+ the configure script. When --enable-debug is given both features will be
enabled, unless some restriction prevents memory tracking from being used.
<a name="test"></a>
@@ -548,12 +536,12 @@ Test Suite
curl archive tree, and it contains a bunch of scripts and a lot of test case
data.
- The main test script is `runtests.pl` that will invoke test servers like
- `httpserver.pl` and `ftpserver.pl` before all the test cases are performed.
- The test suite currently only runs on Unix-like platforms.
+ The main test script is runtests.pl that will invoke test servers like
+ httpserver.pl and ftpserver.pl before all the test cases are performed. The
+ test suite currently only runs on Unix-like platforms.
- You'll find a description of the test suite in the `tests/README` file, and
- the test case data files in the `tests/FILEFORMAT` file.
+ You'll find a description of the test suite in the tests/README file, and the
+ test case data files in the tests/FILEFORMAT file.
The test suite automatically detects if curl was built with the memory
debugging enabled, and if it was, it will detect memory leaks, too.
@@ -581,7 +569,7 @@ Asynchronous name resolves
prevent linking errors later on). Then I simply build the areslib project
(the other projects adig/ahost seem to fail under MSVC).
- Next was libcurl. I opened `lib/config-win32.h` and I added a:
+ Next was libcurl. I opened lib/config-win32.h and I added a:
`#define USE_ARES 1`
Next thing I did was I added the path for the ares includes to the include
@@ -590,8 +578,8 @@ Asynchronous name resolves
Lastly, I also changed libcurl to be single-threaded rather than
multi-threaded, again this was to prevent some duplicate symbol errors. I'm
not sure why I needed to change everything to single-threaded, but when I
- didn't I got redefinition errors for several CRT functions (`malloc()`,
- `stricmp()`, etc.)
+ didn't I got redefinition errors for several CRT functions (malloc, stricmp,
+ etc.)
<a name="curl_off_t"></a>
`curl_off_t`
@@ -599,7 +587,7 @@ Asynchronous name resolves
`curl_off_t` is a data type provided by the external libcurl include
headers. It is the type meant to be used for the [`curl_easy_setopt()`][1]
- options that end with LARGE. The type is 64-bit large on most modern
+ options that end with LARGE. The type is 64bit large on most modern
platforms.
<a name="curlx"></a>
@@ -612,15 +600,15 @@ curlx
additional functions.
We provide them through a single header file for easy access for apps:
- `curlx.h`
+ "curlx.h"
`curlx_strtoofft()`
-------------------
A macro that converts a string containing a number to a `curl_off_t` number.
This might use the `curlx_strtoll()` function which is provided as source
code in strtoofft.c. Note that the function is only provided if no
- `strtoll()` (or equivalent) function exist on your platform. If `curl_off_t`
- is only a 32-bit number on your platform, this macro uses `strtol()`.
+ strtoll() (or equivalent) function exist on your platform. If `curl_off_t`
+ is only a 32 bit number on your platform, this macro uses strtol().
Future
------
@@ -654,28 +642,27 @@ Content Encoding
[HTTP/1.1][4] specifies that a client may request that a server encode its
response. This is usually used to compress a response using one (or more)
encodings from a set of commonly available compression techniques. These
- schemes include `deflate` (the zlib algorithm), `gzip`, `br` (brotli) and
- `compress`. A client requests that the server perform an encoding by including
- an `Accept-Encoding` header in the request document. The value of the header
- should be one of the recognized tokens `deflate`, ... (there's a way to
+ schemes include 'deflate' (the zlib algorithm), 'gzip' 'br' (brotli) and
+ 'compress'. A client requests that the server perform an encoding by including
+ an Accept-Encoding header in the request document. The value of the header
+ should be one of the recognized tokens 'deflate', ... (there's a way to
register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor
the client's encoding request. When a response is encoded, the server
- includes a `Content-Encoding` header in the response. The value of the
- `Content-Encoding` header indicates which encodings were used to encode the
+ includes a Content-Encoding header in the response. The value of the
+ Content-Encoding header indicates which encodings were used to encode the
data, in the order in which they were applied.
It's also possible for a client to attach priorities to different schemes so
that the server knows which it prefers. See sec 14.3 of RFC 2616 for more
- information on the `Accept-Encoding` header. See sec
- [3.1.2.2 of RFC 7231][15] for more information on the `Content-Encoding`
- header.
+ information on the Accept-Encoding header. See sec [3.1.2.2 of RFC 7231][15]
+ for more information on the Content-Encoding header.
## Supported content encodings
- The `deflate`, `gzip` and `br` content encodings are supported by libcurl.
+ The 'deflate', 'gzip' and 'br' content encodings are supported by libcurl.
Both regular and chunked transfers work fine. The zlib library is required
- for the `deflate` and `gzip` encodings, while the brotli decoding library is
- for the `br` encoding.
+ for the 'deflate' and 'gzip' encodings, while the brotli decoding library is
+ for the 'br' encoding.
## The libcurl interface
@@ -683,45 +670,45 @@ Content Encoding
[`curl_easy_setopt`][1](curl, [`CURLOPT_ACCEPT_ENCODING`][5], string)
- where string is the intended value of the `Accept-Encoding` header.
+ where string is the intended value of the Accept-Encoding header.
Currently, libcurl does support multiple encodings but only
- understands how to process responses that use the `deflate`, `gzip` and/or
- `br` content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
- that will work (besides `identity`, which does nothing) are `deflate`,
- `gzip` and `br`. If a response is encoded using the `compress` or methods,
+ understands how to process responses that use the "deflate", "gzip" and/or
+ "br" content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
+ that will work (besides "identity," which does nothing) are "deflate",
+ "gzip" and "br". If a response is encoded using the "compress" or methods,
libcurl will return an error indicating that the response could
- not be decoded. If `<string>` is NULL no `Accept-Encoding` header is
- generated. If `<string>` is a zero-length string, then an `Accept-Encoding`
- header containing all supported encodings will be generated.
+ not be decoded. If `<string>` is NULL no Accept-Encoding header is generated.
+ If `<string>` is a zero-length string, then an Accept-Encoding header
+ containing all supported encodings will be generated.
The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for
content to be automatically decoded. If it is not set and the server still
sends encoded content (despite not having been asked), the data is returned
- in its raw form and the `Content-Encoding` type is not checked.
+ in its raw form and the Content-Encoding type is not checked.
## The curl interface
- Use the [`--compressed`][6] option with curl to cause it to ask servers to
+ Use the [--compressed][6] option with curl to cause it to ask servers to
compress responses using any format supported by curl.
<a name="hostip"></a>
-`hostip.c` explained
-====================
+hostip.c explained
+==================
- The main compile-time defines to keep in mind when reading the `host*.c`
- source file are these:
+ The main compile-time defines to keep in mind when reading the host*.c source
+ file are these:
## `CURLRES_IPV6`
- this host has `getaddrinfo()` and family, and thus we use that. The host may
+ this host has getaddrinfo() and family, and thus we use that. The host may
not be able to resolve IPv6, but we don't really have to take that into
account. Hosts that aren't IPv6-enabled have `CURLRES_IPV4` defined.
## `CURLRES_ARES`
is defined if libcurl is built to use c-ares for asynchronous name
- resolves. This can be Windows or \*nix.
+ resolves. This can be Windows or *nix.
## `CURLRES_THREADED`
@@ -734,20 +721,20 @@ Content Encoding
libcurl is not built to use an asynchronous resolver, `CURLRES_SYNCH` is
defined.
-## `host*.c` sources
+## host*.c sources
- The `host*.c` sources files are split up like this:
+ The host*.c sources files are split up like this:
- - `hostip.c` - method-independent resolver functions and utility functions
- - `hostasyn.c` - functions for asynchronous name resolves
- - `hostsyn.c` - functions for synchronous name resolves
- - `asyn-ares.c` - functions for asynchronous name resolves using c-ares
- - `asyn-thread.c` - functions for asynchronous name resolves using threads
- - `hostip4.c` - IPv4 specific functions
- - `hostip6.c` - IPv6 specific functions
+ - hostip.c - method-independent resolver functions and utility functions
+ - hostasyn.c - functions for asynchronous name resolves
+ - hostsyn.c - functions for synchronous name resolves
+ - asyn-ares.c - functions for asynchronous name resolves using c-ares
+ - asyn-thread.c - functions for asynchronous name resolves using threads
+ - hostip4.c - IPv4 specific functions
+ - hostip6.c - IPv6 specific functions
- The `hostip.h` is the single united header file for all this. It defines the
- `CURLRES_*` defines based on the `config*.h` and `curl_setup.h` defines.
+ The hostip.h is the single united header file for all this. It defines the
+ `CURLRES_*` defines based on the config*.h and `curl_setup.h` defines.
<a name="memoryleak"></a>
Track Down Memory Leaks
@@ -759,13 +746,14 @@ Track Down Memory Leaks
than one thread. If you want/need to use it in a multi-threaded app. Please
adjust accordingly.
+
## Build
- Rebuild libcurl with `-DCURLDEBUG` (usually, rerunning configure with
- `--enable-debug` fixes this). `make clean` first, then `make` so that all
+ Rebuild libcurl with -DCURLDEBUG (usually, rerunning configure with
+ --enable-debug fixes this). 'make clean' first, then 'make' so that all
files are actually rebuilt properly. It will also make sense to build
- libcurl with the debug option (usually `-g` to the compiler) so that
- debugging it will be easier if you actually do find a leak in the library.
+ libcurl with the debug option (usually -g to the compiler) so that debugging
+ it will be easier if you actually do find a leak in the library.
This will create a library that has memory debugging enabled.
@@ -773,7 +761,7 @@ Track Down Memory Leaks
Add a line in your application code:
- `curl_dbg_memdebug("dump");`
+ `curl_memdebug("dump");`
This will make the malloc debug system output a full trace of all resource
using functions to the given file name. Make sure you rebuild your program
@@ -789,7 +777,7 @@ Track Down Memory Leaks
## Analyze the Flow
- Use the `tests/memanalyze.pl` perl script to analyze the dump file:
+ Use the tests/memanalyze.pl perl script to analyze the dump file:
tests/memanalyze.pl dump
@@ -805,46 +793,45 @@ Track Down Memory Leaks
Implementation of the `curl_multi_socket` API
- The main ideas of this API are simply:
-
- 1. The application can use whatever event system it likes as it gets info
- from libcurl about what file descriptors libcurl waits for what action
- on. (The previous API returns `fd_sets` which is very
- `select()`-centric).
-
- 2. When the application discovers action on a single socket, it calls
- libcurl and informs that there was action on this particular socket and
- libcurl can then act on that socket/transfer only and not care about
- any other transfers. (The previous API always had to scan through all
- the existing transfers.)
-
- The idea is that [`curl_multi_socket_action()`][7] calls a given callback
- with information about what socket to wait for what action on, and the
- callback only gets called if the status of that socket has changed.
-
- We also added a timer callback that makes libcurl call the application when
- the timeout value changes, and you set that with [`curl_multi_setopt()`][9]
- and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work,
- Internally, there's an added struct to each easy handle in which we store
- an "expire time" (if any). The structs are then "splay sorted" so that we
- can add and remove times from the linked list and yet somewhat swiftly
- figure out both how long there is until the next nearest timer expires
- and which timer (handle) we should take care of now. Of course, the upside
- of all this is that we get a [`curl_multi_timeout()`][8] that should also
- work with old-style applications that use [`curl_multi_perform()`][11].
-
- We created an internal "socket to easy handles" hash table that given
- a socket (file descriptor) returns the easy handle that waits for action on
- that socket. This hash is made using the already existing hash code
- (previously only used for the DNS cache).
-
- To make libcurl able to report plain sockets in the socket callback, we had
- to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that
- the conversion from sockets to `fd_sets` for that function is only done in
- the last step before the data is returned. I also had to extend c-ares to
- get a function that can return plain sockets, as that library too returned
- only `fd_sets` and that is no longer good enough. The changes done to c-ares
- are available in c-ares 1.3.1 and later.
+ The main ideas of this API are simply:
+
+ 1 - The application can use whatever event system it likes as it gets info
+ from libcurl about what file descriptors libcurl waits for what action
+ on. (The previous API returns `fd_sets` which is very select()-centric).
+
+ 2 - When the application discovers action on a single socket, it calls
+ libcurl and informs that there was action on this particular socket and
+ libcurl can then act on that socket/transfer only and not care about
+ any other transfers. (The previous API always had to scan through all
+ the existing transfers.)
+
+ The idea is that [`curl_multi_socket_action()`][7] calls a given callback
+ with information about what socket to wait for what action on, and the
+ callback only gets called if the status of that socket has changed.
+
+ We also added a timer callback that makes libcurl call the application when
+ the timeout value changes, and you set that with [`curl_multi_setopt()`][9]
+ and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work,
+ Internally, there's an added struct to each easy handle in which we store
+ an "expire time" (if any). The structs are then "splay sorted" so that we
+ can add and remove times from the linked list and yet somewhat swiftly
+ figure out both how long there is until the next nearest timer expires
+ and which timer (handle) we should take care of now. Of course, the upside
+ of all this is that we get a [`curl_multi_timeout()`][8] that should also
+ work with old-style applications that use [`curl_multi_perform()`][11].
+
+ We created an internal "socket to easy handles" hash table that given
+ a socket (file descriptor) returns the easy handle that waits for action on
+ that socket. This hash is made using the already existing hash code
+ (previously only used for the DNS cache).
+
+ To make libcurl able to report plain sockets in the socket callback, we had
+ to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that
+ the conversion from sockets to `fd_sets` for that function is only done in
+ the last step before the data is returned. I also had to extend c-ares to
+ get a function that can return plain sockets, as that library too returned
+ only `fd_sets` and that is no longer good enough. The changes done to c-ares
+ are available in c-ares 1.3.1 and later.
<a name="structs"></a>
Structs in libcurl
@@ -853,42 +840,40 @@ Structs in libcurl
This section should cover 7.32.0 pretty accurately, but will make sense even
for older and later versions as things don't change drastically that often.
-<a name="Curl_easy"></a>
## Curl_easy
The `Curl_easy` struct is the one returned to the outside in the external API
- as a `CURL *`. This is usually known as an easy handle in API documentations
+ as a "CURL *". This is usually known as an easy handle in API documentations
and examples.
Information and state that is related to the actual connection is in the
- `connectdata` struct. When a transfer is about to be made, libcurl will
+ 'connectdata' struct. When a transfer is about to be made, libcurl will
either create a new connection or re-use an existing one. The particular
connectdata that is used by this handle is pointed out by
`Curl_easy->easy_conn`.
Data and information that regard this particular single transfer is put in
- the `SingleRequest` sub-struct.
+ the SingleRequest sub-struct.
When the `Curl_easy` struct is added to a multi handle, as it must be in
- order to do any transfer, the `->multi` member will point to the `Curl_multi`
- struct it belongs to. The `->prev` and `->next` members will then be used by
- the multi code to keep a linked list of `Curl_easy` structs that are added to
- that same multi handle. libcurl always uses multi so `->multi` *will* point
- to a `Curl_multi` when a transfer is in progress.
+ order to do any transfer, the ->multi member will point to the `Curl_multi`
+ struct it belongs to. The ->prev and ->next members will then be used by the
+ multi code to keep a linked list of `Curl_easy` structs that are added to
+ that same multi handle. libcurl always uses multi so ->multi *will* point to
+ a `Curl_multi` when a transfer is in progress.
- `->mstate` is the multi state of this particular `Curl_easy`. When
+ ->mstate is the multi state of this particular `Curl_easy`. When
`multi_runsingle()` is called, it will act on this handle according to which
state it is in. The mstate is also what tells which sockets to return for a
specific `Curl_easy` when [`curl_multi_fdset()`][12] is called etc.
- The libcurl source code generally use the name `data` for the variable that
+ The libcurl source code generally use the name 'data' for the variable that
points to the `Curl_easy`.
When doing multiplexed HTTP/2 transfers, each `Curl_easy` is associated with
an individual stream, sharing the same connectdata struct. Multiplexing
makes it even more important to keep things associated with the right thing!
-<a name="connectdata"></a>
## connectdata
A general idea in libcurl is to keep connections around in a connection
@@ -896,16 +881,16 @@ for older and later versions as things don't change drastically that often.
re-use an existing one instead of creating a new as it creates a significant
performance boost.
- Each `connectdata` identifies a single physical connection to a server. If
+ Each 'connectdata' identifies a single physical connection to a server. If
the connection can't be kept alive, the connection will be closed after use
and then this struct can be removed from the cache and freed.
Thus, the same `Curl_easy` can be used multiple times and each time select
- another `connectdata` struct to use for the connection. Keep this in mind,
- as it is then important to consider if options or choices are based on the
+ another connectdata struct to use for the connection. Keep this in mind, as
+ it is then important to consider if options or choices are based on the
connection or the `Curl_easy`.
- Functions in libcurl will assume that `connectdata->data` points to the
+ Functions in libcurl will assume that connectdata->data points to the
`Curl_easy` that uses this connection (for the moment).
As a special complexity, some protocols supported by libcurl require a
@@ -920,16 +905,15 @@ for older and later versions as things don't change drastically that often.
this single struct and thus can be considered a single connection for most
internal concerns.
- The libcurl source code generally use the name `conn` for the variable that
+ The libcurl source code generally use the name 'conn' for the variable that
points to the connectdata.
-<a name="Curl_multi"></a>
## Curl_multi
Internally, the easy interface is implemented as a wrapper around multi
interface functions. This makes everything multi interface.
- `Curl_multi` is the multi handle struct exposed as `CURLM *` in external
+ `Curl_multi` is the multi handle struct exposed as "CURLM *" in external
APIs.
This struct holds a list of `Curl_easy` structs that have been added to this
@@ -956,19 +940,18 @@ for older and later versions as things don't change drastically that often.
`->conn_cache` points to the connection cache. It keeps track of all
connections that are kept after use. The cache has a maximum size.
- `->closure_handle` is described in the `connectdata` section.
+ `->closure_handle` is described in the 'connectdata' section.
- The libcurl source code generally use the name `multi` for the variable that
+ The libcurl source code generally use the name 'multi' for the variable that
points to the `Curl_multi` struct.
-<a name="Curl_handler"></a>
## Curl_handler
Each unique protocol that is supported by libcurl needs to provide at least
one `Curl_handler` struct. It defines what the protocol is called and what
functions the main code should call to deal with protocol specific issues.
- In general, there's a source file named `[protocol].c` in which there's a
- `struct Curl_handler Curl_handler_[protocol]` declared. In `url.c` there's
+ In general, there's a source file named [protocol].c in which there's a
+ "struct `Curl_handler` `Curl_handler_[protocol]`" declared. In url.c there's
then the main array with all individual `Curl_handler` structs pointed to
from a single array which is scanned through when a URL is given to libcurl
to work with.
@@ -980,9 +963,9 @@ for older and later versions as things don't change drastically that often.
`->setup_connection` is called to allow the protocol code to allocate
protocol specific data that then gets associated with that `Curl_easy` for
the rest of this transfer. It gets freed again at the end of the transfer.
- It will be called before the `connectdata` for the transfer has been
+ It will be called before the 'connectdata' for the transfer has been
selected/created. Most protocols will allocate its private
- `struct [PROTOCOL]` here and assign `Curl_easy->req.protop` to point to it.
+ 'struct [PROTOCOL]' here and assign `Curl_easy->req.protop` to point to it.
`->connect_it` allows a protocol to do some specific actions after the TCP
connect is done, that can still be considered part of the connection phase.
@@ -1009,25 +992,25 @@ for older and later versions as things don't change drastically that often.
`->do_more` gets called during the `DO_MORE` state. The FTP protocol uses
this state when setting up the second connection.
- `->proto_getsock`
- `->doing_getsock`
- `->domore_getsock`
- `->perform_getsock`
+ ->`proto_getsock`
+ ->`doing_getsock`
+ ->`domore_getsock`
+ ->`perform_getsock`
Functions that return socket information. Which socket(s) to wait for which
action(s) during the particular multi state.
- `->disconnect` is called immediately before the TCP connection is shutdown.
+ ->disconnect is called immediately before the TCP connection is shutdown.
- `->readwrite` gets called during transfer to allow the protocol to do extra
+ ->readwrite gets called during transfer to allow the protocol to do extra
reads/writes
- `->defport` is the default report TCP or UDP port this protocol uses
+ ->defport is the default report TCP or UDP port this protocol uses
- `->protocol` is one or more bits in the `CURLPROTO_*` set. The SSL versions
+ ->protocol is one or more bits in the `CURLPROTO_*` set. The SSL versions
have their "base" protocol set and then the SSL variation. Like
"HTTP|HTTPS".
- `->flags` is a bitmask with additional information about the protocol that will
+ ->flags is a bitmask with additional information about the protocol that will
make it get treated differently by the generic engine:
- `PROTOPT_SSL` - will make it connect and negotiate SSL
@@ -1042,7 +1025,7 @@ for older and later versions as things don't change drastically that often.
limit which "direction" of socket actions that the main engine will
concern itself with.
- - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read `file:`)
+ - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read file:)
- `PROTOPT_NEEDSPWD` - this protocol needs a password and will use a default
one unless one is provided
@@ -1050,18 +1033,16 @@ for older and later versions as things don't change drastically that often.
- `PROTOPT_NOURLQUERY` - this protocol can't handle a query part on the URL
(?foo=bar)
-<a name="conncache"></a>
## conncache
Is a hash table with connections for later re-use. Each `Curl_easy` has a
pointer to its connection cache. Each multi handle sets up a connection
cache that all added `Curl_easy`s share by default.
-<a name="Curl_share"></a>
## Curl_share
The libcurl share API allocates a `Curl_share` struct, exposed to the
- external API as `CURLSH *`.
+ external API as "CURLSH *".
The idea is that the struct can have a set of its own versions of caches and
pools and then by providing this struct in the `CURLOPT_SHARE` option, those
@@ -1074,11 +1055,10 @@ for older and later versions as things don't change drastically that often.
The `Curl_share` struct can currently hold cookies, DNS cache and the SSL
session cache.
-<a name="CookieInfo"></a>
## CookieInfo
This is the main cookie struct. It holds all known cookies and related
- information. Each `Curl_easy` has its own private `CookieInfo` even when
+ information. Each `Curl_easy` has its own private CookieInfo even when
they are added to a multi handle. They can be made to share cookies by using
the share API.
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index 5134e7367..875456f19 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -12,13 +12,15 @@ check the changelog of the current development status, as one or more of these
problems may have been fixed or changed somewhat since this was written!
1. HTTP
+ 1.1 CURLFORM_CONTENTLEN in an array
+ 1.2 Disabling HTTP Pipelining
1.3 STARTTRANSFER time is wrong for HTTP POSTs
1.4 multipart formposts file name encoding
1.5 Expect-100 meets 417
1.6 Unnecessary close when 401 received waiting for 100
1.7 Deflate error after all content was received
- 1.8 DoH isn't used for all name resolves when enabled
1.9 HTTP/2 frames while in the connection pool kill reuse
+ 1.10 Strips trailing dot from host name
1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
2. TLS
@@ -29,7 +31,6 @@ problems may have been fixed or changed somewhat since this was written!
2.5 Client cert handling with Issuer DN differs between backends
2.6 CURL_GLOBAL_SSL
2.7 Client cert (MTLS) issues with Schannel
- 2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
3. Email protocols
3.1 IMAP SEARCH ALL truncated response
@@ -45,7 +46,7 @@ problems may have been fixed or changed somewhat since this was written!
4.5 Improve --data-urlencode space encoding
5. Build and portability issues
- 5.1 USE_UNIX_SOCKETS on Windows
+ 5.1 tests not compatible with python3
5.2 curl-config --libs contains private details
5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
5.4 Cannot compile against a static build of OpenLDAP
@@ -54,7 +55,6 @@ problems may have been fixed or changed somewhat since this was written!
5.7 Visual Studio project gaps
5.8 configure finding libs in wrong directory
5.9 Utilize Requires.private directives in libcurl.pc
- 5.10 IDN tests failing on Windows / MSYS2
6. Authentication
6.1 NTLM authentication and unicode
@@ -63,7 +63,6 @@ problems may have been fixed or changed somewhat since this was written!
6.4 Negotiate and Kerberos V5 need a fake user name
6.5 NTLM doesn't support password with § character
6.6 libcurl can fail to try alternatives with --proxy-any
- 6.7 Don't clear digest for single realm
7. FTP
7.1 FTP without or slow 220 response
@@ -97,11 +96,9 @@ problems may have been fixed or changed somewhat since this was written!
11.4 HTTP test server 'connection-monitor' problems
11.5 Connection information when using TCP Fast Open
11.6 slow connect to localhost on Windows
- 11.7 signal-based resolver timeouts
12. LDAP and OpenLDAP
12.1 OpenLDAP hangs after returning results
- 12.2 LDAP on Windows does authentication wrong?
13. TCP/IP
13.1 --interface for ipv6 binds to unusable IP address
@@ -113,6 +110,23 @@ problems may have been fixed or changed somewhat since this was written!
1. HTTP
+1.1 CURLFORM_CONTENTLEN in an array
+
+ It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with
+ CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit
+ integers. This is because the underlying structure 'curl_forms' uses a dual
+ purpose char* for storing these values in via casting. For more information
+ see the now closed related issue:
+ https://github.com/curl/curl/issues/608
+
+1.2 Disabling HTTP Pipelining
+
+ Disabling HTTP Pipelining when there are ongoing transfers can lead to
+ heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411
+
+ Similarly, removing a handle when pipelining corrupts data:
+ https://github.com/curl/curl/issues/2101
+
1.3 STARTTRANSFER time is wrong for HTTP POSTs
Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
@@ -148,21 +162,11 @@ problems may have been fixed or changed somewhat since this was written!
There's a situation where we can get an error in a HTTP response that is
compressed, when that error is detected after all the actual body contents
- have been received and delivered to the application. This is tricky, but is
+ have been received and delivered to the appliction. This is tricky, but is
ultimately a broken server.
See https://github.com/curl/curl/issues/2719
-1.8 DoH isn't used for all name resolves when enabled
-
- Even if DoH is specified to be used, there are some name resolves that are
- done without it. This should be fixed. When the internal function
- `Curl_resolver_wait_resolv()` is called, it doesn't use DoH to complete the
- resolve as it otherwise should.
-
- See https://github.com/curl/curl/pull/3857 and
- https://github.com/curl/curl/pull/3850
-
1.9 HTTP/2 frames while in the connection pool kill reuse
If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to
@@ -173,6 +177,42 @@ problems may have been fixed or changed somewhat since this was written!
This is *best* fixed by adding monitoring to connections while they are kept
in the pool so that pings can be responded to appropriately.
+1.10 Strips trailing dot from host name
+
+ When given a URL with a trailing dot for the host name part:
+ "https://example.com./", libcurl will strip off the dot and use the name
+ without a dot internally and send it dot-less in HTTP Host: headers and in
+ the TLS SNI field. For the purpose of resolving the name to an address
+ the hostname is used as is without any change.
+
+ The HTTP part violates RFC 7230 section 5.4 but the SNI part is accordance
+ with RFC 6066 section 3.
+
+ URLs using these trailing dots are very rare in the wild and we have not seen
+ or gotten any real-world problems with such URLs reported. The popular
+ browsers seem to have stayed with not stripping the dot for both uses (thus
+ they violate RFC 6066 instead of RFC 7230).
+
+ Daniel took the discussion to the HTTPbis mailing list in March 2016:
+ https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html but
+ there was not major rush or interest to fix this. The impression I get is
+ that most HTTP people rather not rock the boat now and instead prioritize web
+ compatibility rather than to strictly adhere to these RFCs.
+
+ Our current approach allows a knowing client to send a custom HTTP header
+ with the dot added.
+
+ In a few cases there is a difference in name resolving to IP addresses with
+ a trailing dot, but it can be noted that many HTTP servers will not happily
+ accept the trailing dot there unless that has been specifically configured
+ to be a fine virtual host.
+
+ If URLs with trailing dots for host names become more popular or even just
+ used more than for just plain fun experiments, I'm sure we will have reason
+ to go back and reconsider.
+
+ See https://github.com/curl/curl/issues/716 for the discussion.
+
1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM
@@ -249,11 +289,6 @@ problems may have been fixed or changed somewhat since this was written!
See https://github.com/curl/curl/issues/3145
-2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
-
- This seems to be a limitation in the underlying Schannel API.
-
- https://github.com/curl/curl/issues/3284
3. Email protocols
@@ -337,12 +372,11 @@ problems may have been fixed or changed somewhat since this was written!
5. Build and portability issues
-5.1 USE_UNIX_SOCKETS on Windows
+5.1 tests not compatible with python3
- Due to incorrect CMake checks for the presense of the feature, it will never
- be enabled for windows in a cmake build.
+ The smb test server still needs python2.
- See https://github.com/curl/curl/issues/4040
+ See https://github.com/curl/curl/issues/3289
5.2 curl-config --libs contains private details
@@ -420,13 +454,6 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/864
-5.10 IDN tests failing on Windows / MSYS2
-
- It seems like MSYS2 does some UTF-8-to-something-else conversion for Windows
- compatibility.
-
- https://github.com/curl/curl/issues/3747
-
6. Authentication
6.1 NTLM authentication and unicode
@@ -479,10 +506,6 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/876
-6.7 Don't clear digest for single realm
-
- https://github.com/curl/curl/issues/3267
-
7. FTP
7.1 FTP without or slow 220 response
@@ -690,19 +713,6 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/2281
-11.7 signal-based resolver timeouts
-
- libcurl built without an asynchronous resolver library uses alarm() to time
- out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
- signal handler back into the library with a sigsetjmp, which effectively
- causes libcurl to continue running within the signal handler. This is
- non-portable and could cause problems on some platforms. A discussion on the
- problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
-
- Also, alarm() provides timeout resolution only to the nearest second. alarm
- ought to be replaced by setitimer on systems that support it.
-
-
12. LDAP and OpenLDAP
12.1 OpenLDAP hangs after returning results
@@ -724,9 +734,6 @@ problems may have been fixed or changed somewhat since this was written!
See https://github.com/curl/curl/issues/622 and
https://curl.haxx.se/mail/lib-2016-01/0101.html
-12.2 LDAP on Windows does authentication wrong?
-
- https://github.com/curl/curl/issues/3116
13. TCP/IP
diff --git a/docs/Makefile.am b/docs/Makefile.am
index b26967024..8eeabd478 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -44,7 +44,6 @@ EXTRA_DIST = \
$(noinst_man_MANS) \
ALTSVC.md \
BINDINGS.md \
- BUG-BOUNTY.md \
BUGS \
CHECKSRC.md \
CIPHERS.md \
@@ -53,8 +52,6 @@ EXTRA_DIST = \
CODE_STYLE.md \
CONTRIBUTE.md \
DEPRECATE.md \
- ESNI.md \
- EXPERIMENTAL.md \
FAQ \
FEATURES \
GOVERNANCE.md \
@@ -62,7 +59,6 @@ EXTRA_DIST = \
HISTORY.md \
HTTP-COOKIES.md \
HTTP2.md \
- HTTP3.md \
INSTALL \
INSTALL.cmake \
INSTALL.md \
@@ -70,7 +66,6 @@ EXTRA_DIST = \
KNOWN_BUGS \
LICENSE-MIXING.md \
MAIL-ETIQUETTE \
- PARALLEL-TRANSFERS.md \
README.cmake \
README.md \
README.netware \
diff --git a/docs/PARALLEL-TRANSFERS.md b/docs/PARALLEL-TRANSFERS.md
deleted file mode 100644
index d3b38aee1..000000000
--- a/docs/PARALLEL-TRANSFERS.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Parallel transfers
-
-curl 7.66.0 introduces support for doing multiple transfers simultaneously; in
-parallel.
-
-## -Z, --parallel
-
-When this command line option is used, curl will perform the transfers given
-to it at the same time. It will do up to `--parallel-max` concurrent
-transfers, with a default value of 50.
-
-## Progress meter
-
-The progress meter that is displayed when doing parallel transfers is
-completely different than the regular one used for each single transfer.
-
- It shows:
-
- o percent download (if known, which means *all* transfers need to have a
- known size)
- o precent upload (if known, with the same caveat as for download)
- o total amount of downloaded data
- o total amount of uploaded data
- o number of transfers to perform
- o number of concurrent transfers being transferred right now
- o number of transfers queued up waiting to start
- o total time all transfers are expected to take (if sizes are known)
- o current time the transfers have spent so far
- o estimated time left (if sizes are known)
- o current transfer speed (the faster of UL/DL speeds measured over the last
- few seconds)
-
-Example:
-
- DL% UL% Dled Uled Xfers Live Qd Total Current Left Speed
- 72 -- 37.9G 0 101 30 23 0:00:55 0:00:34 0:00:22 2752M
-
-## Behavior differences
-
-Connections are shared fine between different easy handles, but the
-"authentication contexts" are not. So for example doing HTTP Digest auth with
-one handle for a particular transfer and then continue on with another handle
-that reuses the same connection, the second handle can't send the necessary
-Authorization header at once since the context is only kept in the original
-easy handle.
-
-To fix this, the authorization state could be made possible to share with the
-share API as well, as a context per origin + path (realm?) basically.
-
-Visible in test 153, 1412 and more.
-
-## Feedback!
-
-This is early days for parallel transfer support. Keep your eyes open for
-unintended side effects or downright bugs.
-
-Tell us what you think and how you think we could improve this feature!
-
diff --git a/docs/RELEASE-PROCEDURE.md b/docs/RELEASE-PROCEDURE.md
index 70609fd70..c7a883357 100644
--- a/docs/RELEASE-PROCEDURE.md
+++ b/docs/RELEASE-PROCEDURE.md
@@ -16,7 +16,7 @@ in the source code repo
- run "./maketgz 7.34.0" to build the release tarballs. It is important that
you run this on a machine with the correct set of autotools etc installed
- as this is what then will be shipped and used by most users on \*nix like
+ as this is what then will be shipped and used by most users on *nix like
systems.
- push the git commits and the new tag
@@ -84,15 +84,8 @@ Coming dates
Based on the description above, here are some planned release dates (at the
time of this writing):
+- March 27, 2019
- May 22, 2019
- July 17, 2019
- September 11, 2019
- November 6, 2019
-- January 8, 2020 (moved)
-- February 27, 2020
-- April 22, 2020
-- June 17, 2020
-
-The above (and more) curl-related dates are published in
-[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics)
-as well.
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 1d47682bf..10e7effee 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -5,19 +5,10 @@ Roadmap of things Daniel Stenberg wants to work on next. It is intended to
serve as a guideline for others for information, feedback and possible
participation.
-HSTS
-----
-
- Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
-
- Loading a huge preload file is probably not too interesting to most people,
- but using a custom file and reacting to HSTS response header probably are
- good features.
+HTTP/3
+------
-DNS-over-TLS
-------------
-
- Similar to DNS-over-HTTPS. Could share quite a lot of generic code.
+ See the [QUIC and HTTP/3 wiki page](https://github.com/curl/curl/wiki/QUIC).
ESNI (Encrypted SNI)
--------------------
@@ -25,32 +16,44 @@ ESNI (Encrypted SNI)
See Daniel's post on [Support of Encrypted
SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.
- Initial work exists in https://github.com/curl/curl/pull/4011
+HSTS
+----
-tiny-curl
----------
+Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
- There's no immediate action for this but users seem keen on being able to
- building custom minimized versions of libcurl for their products. Make sure
- new features that are "niche" can still be disabled at build-time.
+Parallel transfers for the curl tool
+------------------------------------
-MQTT
-----
+This will require several new command line options to enable and control.
+
+ 1. switch to creating a list of all the transfers first before any transfer
+ is done
+ 2. make the transfers using the multi interface
+ 3. optionally fire up more transfers before the previous has completed
+
+Option to refuse HTTPS => HTTP redirects
+----------------------------------------
+
+Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?
+
+Option to let CURLOPT_CUSTOMREQUEST be overridden on redirect
+-------------------------------------------------------------
+
+(This is a common problem for people using `-X` and `-L` together.)
- Support receiving and sending MQTT messages. Initial work exists in
- https://github.com/curl/curl/pull/3514
+Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?
Hardcode “localhostâ€
--------------------
- No need to resolve it. Avoid a risk where this is resolved over the network
- and actually responds with something else than a local address. Some
- operating systems already do this. Also:
- https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
+No need to resolve it. Avoid a risk where this is resolved over the network
+and actually responds with something else than a local address. Some operating
+systems already do this. Also:
+https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
-"menu config"-style build feature selection
--------------------------------------------
+Consider "menu config"-style build feature selection
+----------------------------------------------------
- Allow easier building of custom libcurl versions with only a selected feature
- where the available features are easily browsable and toggle-able ON/OFF or
- similar.
+Allow easier building of custom libcurl versions with only a selected feature
+where the available features are easily browsable and toggle-able ON/OFF or
+similar.
diff --git a/docs/SECURITY-PROCESS.md b/docs/SECURITY-PROCESS.md
index e844a9a90..6cae5036b 100644
--- a/docs/SECURITY-PROCESS.md
+++ b/docs/SECURITY-PROCESS.md
@@ -10,8 +10,9 @@ Publishing Information
All known and public curl or libcurl related vulnerabilities are listed on
[the curl web site security page](https://curl.haxx.se/docs/security.html).
-Security vulnerabilities **should not** be entered in the project's public bug
-tracker.
+Security vulnerabilities should not be entered in the project's public bug
+tracker unless the necessary configuration is in place to limit access to the
+issue to only the reporter and the project's security team.
Vulnerability Handling
----------------------
@@ -22,20 +23,20 @@ No information should be made public about a vulnerability until it is
formally announced at the end of this process. That means, for example that a
bug tracker entry must NOT be created to track the issue since that will make
the issue public and it should not be discussed on any of the project's public
-mailing lists. Also messages associated with any commits should not make any
-reference to the security nature of the commit if done prior to the public
+mailing lists. Also messages associated with any commits should not make
+any reference to the security nature of the commit if done prior to the public
announcement.
-- The person discovering the issue, the reporter, reports the vulnerability on
- [https://hackerone.com/curl](https://hackerone.com/curl). Issues filed there
- reach a handful of selected and trusted people.
+- The person discovering the issue, the reporter, reports the vulnerability
+ privately to `curl-security@haxx.se`. That's an email alias that reaches a
+ handful of selected and trusted people.
- Messages that do not relate to the reporting or managing of an undisclosed
security vulnerability in curl or libcurl are ignored and no further action
is required.
-- A person in the security team responds to the original report to acknowledge
- that a human has seen the report.
+- A person in the security team sends an e-mail to the original reporter to
+ acknowledge the report.
- The security team investigates the report and either rejects it or accepts
it.
@@ -50,9 +51,9 @@ announcement.
should involve the reporter as much as possible.
- The release of the information should be "as soon as possible" and is most
- often synchronized with an upcoming release that contains the fix. If the
- reporter, or anyone else involved, thinks the next planned release is too
- far away, then a separate earlier release should be considered.
+ often synced with an upcoming release that contains the fix. If the
+ reporter, or anyone else, thinks the next planned release is too far away
+ then a separate earlier release for security reasons should be considered.
- Write a security advisory draft about the problem that explains what the
problem is, its impact, which versions it affects, solutions or workarounds,
@@ -60,14 +61,12 @@ announcement.
Figure out the CWE (Common Weakness Enumeration) number for the flaw.
- Request a CVE number from
- [HackerOne](https://docs.hackerone.com/programs/cve-requests.html)
-
-- Consider informing
[distros@openwall](https://oss-security.openwall.org/wiki/mailing-lists/distros)
- to prepare them about the upcoming public security vulnerability
- announcement - attach the advisory draft for information. Note that
- 'distros' won't accept an embargo longer than 14 days and they do not care
- for Windows-specific flaws.
+ when also informing and preparing them for the upcoming public security
+ vulnerability announcement - attach the advisory draft for information. Note
+ that 'distros' won't accept an embargo longer than 14 days and they do not
+ care for Windows-specific flaws. For windows-specific flaws, request CVE
+ directly from MITRE.
- Update the "security advisory" with the CVE number.
@@ -94,9 +93,6 @@ announcement.
curl-security (at haxx dot se)
------------------------------
-This is a private mailing list for discussions on and about curl security
-issues.
-
Who is on this list? There are a couple of criteria you must meet, and then we
might ask you to join the list or you can ask to join it. It really isn't very
formal. We basically only require that you have a long-term presence in the
@@ -125,8 +121,15 @@ Publishing Security Advisories
6. On security advisory release day, push the changes on the curl-www
repository's remote master branch.
-Bug Bounty
-----------
+Hackerone Internet Bug Bounty
+-----------------------------
+
+The curl project does not run any bounty program on its own, but there are
+outside organizations that do. First report your issue the normal way and
+proceed as described in this document.
+
+Then, if the issue is [critical](https://hackerone.com/ibb-data), you are
+eligible to apply for a bounty from Hackerone for your find.
-See [BUG-BOUNTY](https://curl.haxx.se/docs/bugbounty.html) for details on the
-bug bounty program.
+Once your reported vulnerability has been publicly disclosed by the curl
+project, you can submit a [report to them](https://hackerone.com/ibb-data). \ No newline at end of file
diff --git a/docs/SSL-PROBLEMS.md b/docs/SSL-PROBLEMS.md
index aaf7bdb59..91803e22d 100644
--- a/docs/SSL-PROBLEMS.md
+++ b/docs/SSL-PROBLEMS.md
@@ -53,9 +53,9 @@
Note that these weak ciphers are identified as flawed. For example, this
includes symmetric ciphers with less than 128 bit keys and RC4.
- Schannel in Windows XP is not able to connect to servers that no longer
+ WinSSL in Windows XP is not able to connect to servers that no longer
support the legacy handshakes and algorithms used by those versions, so we
- advice against building curl to use Schannel on really old Windows versions.
+ advice against building curl to use WinSSL on really old Windows versions.
References:
@@ -77,9 +77,9 @@
Some SSL backends may do certificate revocation checks (CRL, OCSP, etc)
depending on the OS or build configuration. The --ssl-no-revoke option was
introduced in 7.44.0 to disable revocation checking but currently is only
- supported for Schannel (the native Windows SSL library), with an exception
- in the case of Windows' Untrusted Publishers blacklist which it seems can't
- be bypassed. This option may have broader support to accommodate other SSL
+ supported for WinSSL (the native Windows SSL library), with an exception in
+ the case of Windows' Untrusted Publishers blacklist which it seems can't be
+ bypassed. This option may have broader support to accommodate other SSL
backends in the future.
References:
diff --git a/docs/THANKS b/docs/THANKS
index 884906ae2..bf6ad755c 100644
--- a/docs/THANKS
+++ b/docs/THANKS
@@ -6,13 +6,11 @@
"Captain Basil"
"Spoon Man"
-1ocalhost on github
Aaro Koskinen
Aaron Oneal
Aaron Orenstein
Aaron Scarisbrick
Abram Pousada
-AceCrow on Github
Adam Barclay
Adam Brown
Adam Coyne
@@ -49,17 +47,13 @@ Alex Baines
Alex Bligh
Alex Chan
Alex Fishman
-Alex Grebenschikov
Alex Gruz
-Alex Konev
Alex Malinovich
-Alex Mayorga
Alex McLellan
Alex Neblett
Alex Nichols
Alex Potapenko
Alex Rousskov
-Alex Samorukov
Alex Suykov
Alex Vinnik
Alex aka WindEagle
@@ -87,7 +81,6 @@ Alfonso Martone
Alfred Gebert
Allen Pulsifer
Alona Rossen
-Amit Katyal
Amol Pattekar
Amr Shahin
Anatol Belski
@@ -118,7 +111,6 @@ Andrei Karas
Andrei Kurushin
Andrei Neculau
Andrei Sedoi
-Andrei Valeriu BICA
Andrei Virtosu
Andrej E Baranov
Andrew Benham
@@ -177,14 +169,11 @@ Ayoub Boudhar
Balaji Parasuram
Balaji S Rao
Balaji Salunke
-Balazs Kovacsics
Balint Szilakszi
Barry Abrahamson
-Barry Pollard
Bart Whiteley
Bas Mevissen
Bas van Schaik
-Bastien Bouclet
Basuke Suzuki
Ben Boeckel
Ben Darnell
@@ -193,7 +182,6 @@ Ben Kohler
Ben Madsen
Ben Noordhuis
Ben Van Hof
-Ben Voris
Ben Winslow
Benbuck Nason
Benjamin Gerard
@@ -220,7 +208,6 @@ Bill Hoffman
Bill Middlecamp
Bill Nagel
Bill Pyne
-Bjarni Ingi Gislason
Bjoern Sikora
Bjorn Augustsson
Bjorn Reese
@@ -238,7 +225,6 @@ Brad King
Brad Spencer
Bradford Bruce
Brandon Casey
-Brandon Dong
Brandon Wang
Brendan Jurd
Brent Beardsley
@@ -262,19 +248,15 @@ Bruno Thomsen
Bruno de Carvalho
Bryan Henderson
Bryan Kemp
-Bylon2 on github
Byrial Jensen
-Caleb Raitto
Cameron Kaiser
Cameron MacMinn
Camille Moncelier
Caolan McNamara
Carie Pointer
Carlo Cannas
-Carlo Marcelo Arenas Belón
Carlo Teubner
Carlo Wood
-Carlos ORyan
Carsten Lange
Casey O'Donnell
Catalin Patulea
@@ -285,7 +267,6 @@ Charles Romestant
Chen Prog
Chester Liu
Chih-Chung Chang
-Chih-Hsuan Yen
Chris "Bob Bob"
Chris Araman
Chris Carlmar
@@ -310,9 +291,7 @@ Christian Schmitz
Christian Stewart
Christian Vogt
Christian Weisgerber
-Christoph M. Becker
Christophe Demory
-Christophe Dervieux
Christophe Legry
Christopher Conroy
Christopher Head
@@ -325,10 +304,8 @@ Claes Jakobsson
Clarence Gardner
Claudio Neves
Clemens Gruber
-Cliff Crosland
Clifford Wolf
Clint Clayton
-Clément Notin
Cody Jones
Cody Mack
Colby Ranger
@@ -390,7 +367,6 @@ Daniel Romero
Daniel Schauenberg
Daniel Seither
Daniel Shahaf
-Daniel Silverstone
Daniel Steinberg
Daniel Stenberg
Daniel Theron
@@ -445,7 +421,6 @@ David Woodhouse
David Wright
David Yan
Dengminwen
-Denis Chaplygin
Denis Feklushkin
Denis Ollier
Dennis Clarke
@@ -514,7 +489,6 @@ Eason-Yu on github
Ebenezer Ikonne
Ed Morley
Edin Kadribasic
-Edmond Yu
Eduard Bloch
Edward Kimmel
Edward Rudd
@@ -524,13 +498,11 @@ Eelco Dolstra
Eetu Ojanen
Egon Eckert
Eldar Zaitov
-Eli Schwartz
Elia Tufarolo
Elliot Saba
Ellis Pritchard
Elmira A Semenova
Emanuele Bovisio
-Emil Engler
Emil Lerner
Emil Romanus
Emiliano Ida
@@ -555,7 +527,6 @@ Eric S. Raymond
Eric Thelin
Eric Vergnaud
Eric Wong
-Eric Wu
Eric Young
Erick Nuwendam
Erik Jacobsen
@@ -600,7 +571,6 @@ Forrest Cahoon
Francisco Moraes
Francisco Sedano
Francois Petitjean
-Francois Rivard
Frank Denis
Frank Gevaerts
Frank Hempel
@@ -634,7 +604,6 @@ Georg Horn
Georg Huettenegger
Georg Lippitsch
Georg Wicherski
-George Liu
Gerd v. Egidy
Gergely Nagy
Gerhard Herre
@@ -646,7 +615,6 @@ Gil Weber
Gilad
Gilbert Ramirez Jr.
Gilles Blanc
-Gilles Vollant
Giorgos Oikonomou
Gisle Vanem
GitYuanQu on github
@@ -671,7 +639,6 @@ Greg Rowe
Greg Zavertnik
Gregory Nicholls
Gregory Szorc
-Griffin Downs
Grigory Entin
Guenole Bescon
Guido Berhoerster
@@ -679,7 +646,6 @@ Guillaume Arluison
Gunter Knauf
Gustaf Hui
Gustavo Grieco
-Guy Poizat
GwanYeong Kim
Gwenole Beauchesne
Gökhan Şengün
@@ -735,24 +701,20 @@ Ian Wilkes
Ignacio Vazquez-Abrams
Igor Franchuk
Igor Khristophorov
-Igor Makarov
Igor Novoseltsev
Igor Polyakov
Ihor Karpenko
Iida Yosiaki
Ilguiz Latypov
Ilja van Sprundel
-Ilya Kosarev
Immanuel Gregoire
Inca R
Ingmar Runge
Ingo Ralf Blum
Ingo Wilken
Irfan Adilovic
-Ironbars13 on github
Irving Wolfe
Isaac Boukris
-Isaiah Norton
Ishan SinghLevett
Ithubg on github
Ivan Avdeev
@@ -760,7 +722,6 @@ Ivo Bellin Salarin
Jack Zhang
Jackarain on github
Jacky Lam
-Jacob Barthelmeh
Jacob Meuser
Jacob Moshenko
Jactry Zeng
@@ -785,7 +746,6 @@ Jamie Lokier
Jamie Newton
Jamie Wilkinson
Jan Alexander Steffens
-Jan Chren
Jan Ehrhardt
Jan Koen Annot
Jan Kunder
@@ -800,7 +760,6 @@ Jari Sundell
Jason Baietto
Jason Glasgow
Jason Juang
-Jason Lee
Jason Liu
Jason McDonald
Jason S. Priebe
@@ -830,13 +789,11 @@ Jeff Phillips
Jeff Pohlmeyer
Jeff Weber
Jeffrey Walton
-Jens Finkhaeuser
Jens Rantil
Jens Schleusener
Jeremie Rapin
Jeremy Friesner
Jeremy Huddleston
-Jeremy Lainé
Jeremy Lin
Jeremy Pearson
Jeremy Tan
@@ -858,7 +815,6 @@ Jim Freeman
Jim Fuller
Jim Hollinger
Jim Meyering
-Jimmy Gaussen
Jiri Dvorak
Jiri Hruska
Jiri Jaburek
@@ -909,7 +865,6 @@ John Weismiller
John Wilkinson
John-Mark Bell
Johnny Luong
-Jojojov on github
Jon DeVree
Jon Grubbs
Jon Nelson
@@ -922,15 +877,12 @@ Jon Turner
Jonas Forsman
Jonas Minnberg
Jonas Schnelli
-Jonas Vautherin
Jonatan Lander
Jonatan Vela
Jonathan Cardoso Machado
Jonathan Hseu
-Jonathan Moerman
Jonathan Nieder
Jongki Suwandi
-Joombalaya on github
Joonas Kuorilehto
Jose Alf
Jose Kahan
@@ -939,7 +891,6 @@ Josh Bialkowski
Josh Kapell
Joshua Kwan
Joshua Swink
-Josie Huddleston
Josue Andrade Gomes
Jozef Kralik
Juan Barreto
@@ -947,7 +898,6 @@ Juan F. Codagnone
Juan Ignacio Hervás
Juan RP
Judson Bishop
-Juergen Hoetzel
Juergen Wilke
Jukka Pihl
Julian Noble
@@ -959,7 +909,6 @@ Julien Chaffraix
Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino
-Junho Choi
Jurij Smakov
Juro Bystricky
Justin Clift
@@ -1015,7 +964,6 @@ Kjetil Jacobsen
Klaus Stein
Klevtsov Vadim
Kobi Gurkan
-Koen Dergent
Konstantin Isakov
Konstantin Kushnir
Kris Kennaway
@@ -1024,19 +972,13 @@ Krister Johansen
Kristian Gunstone
Kristian Köhntopp
Kristiyan Tsaklev
-Kristoffer Gleditsch
-Kunal Ekawde
Kurt Fankhauser
-Kyle Abramowitz
-Kyle Edwards
Kyle J. McKay
Kyle L. Huff
Kyle Sallee
-Kyohei Kadota
Kyselgov E.N
Lachlan O'Dea
Ladar Levison
-Lance Ware
Larry Campbell
Larry Fahnoe
Larry Lin
@@ -1072,7 +1014,6 @@ Lijo Antony
Linas Vepstas
Lindley French
Ling Thio
-Linos Giannopoulos
Linus Lewandowski
Linus Nielsen Feltzing
Linus Nordberg
@@ -1090,7 +1031,6 @@ Luca Altea
Luca Boccassi
Lucas Adamski
Lucas Pardue
-Lucas Severo
Ludek Finstrle
Ludovico Cavedon
Ludwig Nussel
@@ -1128,7 +1068,6 @@ Marc Kleine-Budde
Marc Renault
Marc Schlatter
Marc-Antoine Perennou
-Marcel Hernandez
Marcel Raad
Marcel Roelofs
Marcelo Echeverria
@@ -1173,7 +1112,6 @@ Martin Drasar
Martin Dreher
Martin Frodl
Martin Galvan
-Martin Gartner
Martin Hager
Martin Hedenfalk
Martin Jansen
@@ -1225,11 +1163,9 @@ Maxime Legros
Mehmet Bozkurt
Mekonikum
Melissa Mears
-Mert Yazıcıoğlu
Mettgut Jamalla
Michael Anti
Michael Benedict
-Michael Brehm
Michael Calmer
Michael Cronenworth
Michael Curtis
@@ -1244,7 +1180,6 @@ Michael Kaufmann
Michael Kilburn
Michael Kujawa
Michael König
-Michael Lee
Michael Maltese
Michael Mealling
Michael Mueller
@@ -1258,7 +1193,6 @@ Michael Wallner
Michal Bonino
Michal Marek
Michal Trybus
-Michal ÄŒaplygin
Michał Antoniak
Michał Fita
Michał Górny
@@ -1296,7 +1230,6 @@ Mohammad AlSaleh
Mohun Biswas
Mostyn Bramley-Moore
Moti Avrahami
-MrSorcus on github
Muz Dima
Myk Taylor
NTMan on Github
@@ -1306,7 +1239,6 @@ Nate Prewitt
Nathan Coulter
Nathan O'Sullivan
Nathanael Nerode
-Nathaniel J. Smith
Nathaniel Waisbrot
Naveen Chandran
Naveen Noel
@@ -1316,7 +1248,6 @@ Neil Bowers
Neil Dunbar
Neil Kolban
Neil Spring
-Niall O'Reilly
Nic Roets
Nicholas Maniscalco
Nick Draffen
@@ -1335,7 +1266,6 @@ Niels van Tongeren
Nikita Schmidt
Nikitinskit Dmitriy
Niklas Angebrand
-Niklas Hambüchen
Nikolai Kondrashov
Nikos Mavrogiannopoulos
Nikos Tsipinakis
@@ -1354,7 +1284,6 @@ Ola Mork
Olaf Flebbe
Olaf Stüben
Oleg Pudeyev
-Olen Andoni
Oli Kingshott
Oliver Gondža
Oliver Graute
@@ -1362,7 +1291,6 @@ Oliver Kuckertz
Oliver Schindler
Olivier Berger
Olivier Brunel
-Omar Ramadan
Orange Tsai
Oren Souroujon
Oren Tirosh
@@ -1374,7 +1302,6 @@ Oskar Liljeblad
Oumph on github
P R Schaffner
Palo Markovic
-Paolo Mossino
Paolo Piacentini
Paras Sethia
Pascal Gaudette
@@ -1395,9 +1322,7 @@ Patrick Smith
Patrick Watson
Patrik Thunstrom
Pau Garcia i Quiles
-Paul B. Omta
Paul Donohue
-Paul Dreik
Paul Groke
Paul Harrington
Paul Harris
@@ -1440,9 +1365,7 @@ Peter O'Gorman
Peter Pentchev
Peter Piekarski
Peter Silva
-Peter Simonyi
Peter Su
-Peter Sumatra
Peter Sylvester
Peter Todd
Peter Varga
@@ -1466,7 +1389,6 @@ Philip Langdale
Philip Prindeville
Philipp Waehnert
Philippe Hameau
-Philippe Marguinaud
Philippe Raoult
Philippe Vaucher
Pierre
@@ -1475,10 +1397,7 @@ Pierre Chapuis
Pierre Joye
Pierre Ynard
Piotr Dobrogost
-Piotr Komborski
-Po-Chuan Hsieh
Pooyan McSporran
-Poul T Lomholt
Pramod Sharma
Prash Dush
Praveen Pvs
@@ -1514,7 +1433,6 @@ Ray Dassen
Ray Pekowski
Ray Satiro
Razvan Cojocaru
-Reed Loden
Reinhard Max
Reinout van Schouwen
Remco van Hooff
@@ -1531,10 +1449,8 @@ Rene Rebe
Reuven Wachtfogel
Reza Arbab
Ricardo Cadime
-Ricardo Gomes
Rich Burridge
Rich Gray
-Rich Mirch
Rich Rauenzahn
Rich Turner
Richard Adams
@@ -1559,7 +1475,6 @@ Rick Jones
Rick Richardson
Rick Welykochy
Ricki Hirner
-Ricky Leverence
Ricky-Tigg on github
Rider Linden
Rikard Falkeborn
@@ -1593,10 +1508,8 @@ Rodric Glaser
Rodrigo Silva
Roger Leigh
Roland Blom
-Roland Hieber
Roland Krikava
Roland Zimmermann
-Rolf Eike Beer
Rolland Dudemaine
Romain Coltel
Romain Fliedel
@@ -1609,7 +1522,6 @@ Ron Parker
Ron Zapp
Ronnie Mose
Rosimildo da Silva
-Roy Bellingan
Roy Shan
Rune Kleveland
Ruslan Baratov
@@ -1657,14 +1569,12 @@ Sean Burford
Sean MacLennan
Sean Miller
Sebastiaan van Erk
-Sebastian Haglund
Sebastian Mundry
Sebastian Pohlschmidt
Sebastian Rasmussen
Senthil Raja Velu
Sergei Kuzmin
Sergei Nikulov
-Sergey Ogryzkov
Sergey Tatarincev
Sergii Kavunenko
Sergii Pylypenko
@@ -1677,7 +1587,6 @@ Seth Mos
Sevan Janiyan
Sh Diao
Shachaf Ben-Kiki
-Shankar Jadhavar
Shao Shuchao
Sharad Gupta
Shard
@@ -1701,7 +1610,6 @@ Somnath Kundu
Song Ma
Sonia Subramanian
Spacen Jasset
-Spezifant on github
Spiridonoff A.V
Spork Schivago
Stadler Stephan
@@ -1719,19 +1627,18 @@ Stefan Neis
Stefan Teleman
Stefan Tomanek
Stefan Ulrich
-Stefano Simonelli
Steinar H. Gunderson
Stepan Broz
Stephan Bergmann
Stephan Lagerholm
Stephan Mühlstrasser
-Stephan Szabo
Stephen Brokenshire
Stephen Collyer
Stephen Kick
Stephen More
Stephen Toub
Sterling Hughes
+Steve Brokenshire
Steve Green
Steve H Truong
Steve Havelka
@@ -1747,10 +1654,8 @@ Steven G. Johnson
Steven Gu
Steven M. Schweda
Steven Parkes
-Stian Soiland-Reyes
Stoned Elipot
Stuart Henderson
-SumatraPeter on github
Sune Ahlgren
Sunny Purushe
Sven Anders
@@ -1766,7 +1671,6 @@ T. Yamada
TJ Saunders
Tae Hyoung Ahn
Tae Wong
-Taiyu Len
Taneli Vähäkangas
Tanguy Fautre
Tatsuhiro Tsujikawa
@@ -1774,11 +1678,9 @@ Teemu Yli-Elsila
Temprimus
Terri Oda
Terry Wu
-The Infinnovation team
TheAssassin on github
Theodore Dubois
Thomas Braun
-Thomas Gamper
Thomas Glanzmann
Thomas J. Moore
Thomas Klausner
@@ -1788,7 +1690,6 @@ Thomas Petazzoni
Thomas Ruecker
Thomas Schwinge
Thomas Tonino
-Thomas Vegas
Thomas van Hesteren
Thorsten Schöning
Tiit Pikma
@@ -1828,7 +1729,6 @@ Todd Vierling
Tom Benoist
Tom Donovan
Tom Grace
-Tom Greenslade
Tom Lee
Tom Mattison
Tom Moers
@@ -1862,10 +1762,8 @@ Toshiyuki Maezawa
Traian Nicolescu
Travis Burtrum
Travis Obenhaus
-Trivikram Kamat
Troels Walsted Hansen
Troy Engel
-Tseng Jun
Tuomo Rinne
Tupone Alfredo
Tyler Hall
@@ -1876,9 +1774,7 @@ Ulrich Doehner
Ulrich Telle
Ulrich Zadow
Valentin David
-Valerii Zapodovnikov
Vasiliy Faronov
-Vasily Lobaskin
Vasy Okhin
Venkat Akella
Venkataramana Mokkapati
@@ -1887,7 +1783,6 @@ Victor Snezhko
Vijay Panghal
Vikram Saxena
Viktor Szakats
-Vilhelm Prytz
Ville Skyttä
Vilmos Nebehaj
Vincas Razma
@@ -1912,7 +1807,6 @@ Walter J. Mack
Ward Willats
Warren Menzer
Wayne Haigh
-Wenchao Li
Wenxiang Qian
Werner Koch
Wesley Laxton
@@ -1931,13 +1825,11 @@ Wyatt O'Day
Xavier Bouchoux
XhstormR on github
Xiangbin Li
-XmiliaH on github
Yaakov Selkowitz
Yang Tse
Yarram Sunil
Yasuharu Yamada
Yasuhiro Matsumoto
-Yechiel Kalmenson
Yehezkel Horowitz
Yehoshua Hershberg
Yi Huang
@@ -1962,7 +1854,6 @@ Zhibiao Wu
Zhouyihai Ding
Zmey Petroff
Zvi Har'El
-aasivov on github
accountantM on github
adnn on github
afrind on github
@@ -1975,24 +1866,19 @@ bobmitchell1956 on github
bsammon on github
buzo-ffm on github
cbartl on github
-cclauss on github
clbr on github
cmfrolick on github
-codesniffer13 on github
d912e3 on github
daboul on github
dasimx on github
-dbrowndan on github
destman on github
dkjjr89 on github
-dkwolfe4 on github
dnivras on github
dpull on github
dtmsecurity on github
eXeC64 on github
elelel on github
elephoenix on github
-elsamuko on github
guitared on github
hsiao yi
imilli on github
@@ -2005,41 +1891,28 @@ jonrumsey on github
joshhe on github
jungle-boogie on github
jveazey on github
-jzinn on github
ka7 on github
kreshano on github
-l00p3r on Hackerone
lijian996 on github
lukaszgn on github
madblobfish on github
marc-groundctl on github
masbug on github
mccormickt12 on github
-migueljcrum on github
mkzero on github
-momala454 on github
moohoorama on github
nedres on github
neex on github
neheb on github
-nevv on HackerOne/curl
-niallor on github
nianxuejie on github
-nico-abram on github
-niner on github
nk
nopjmp on github
olesteban on github
omau on github
-osabc on github
ovidiu-benea on github
patelvivekv1993 on github
-patnyb on github
-pendrek at hackerone
pszemus on github
silveja1 on github
-smuellerDD on github
-sstruchtrup on github
steelman on github
steini2000 on github
stootill on github
diff --git a/docs/TODO b/docs/TODO
index 42d37c1bc..40bc726fc 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -18,9 +18,11 @@
1. libcurl
1.1 TFO support on Windows
- 1.2 Consult %APPDATA% also for .netrc
+ 1.2 More data sharing
1.3 struct lifreq
+ 1.4 signal-based resolver timeouts
1.5 get rid of PATH_MAX
+ 1.6 Modified buffer size approach
1.7 Support HTTP/2 for HTTP(S) proxies
1.8 CURLOPT_RESOLVE for any port number
1.9 Cache negative name resolves
@@ -33,11 +35,14 @@
1.16 Try to URL encode given URL
1.17 Add support for IRIs
1.18 try next proxy if one doesn't work
+ 1.19 Timeout idle connections from the pool
1.20 SRV and URI DNS records
+ 1.21 Have the URL API offer IDN decoding
1.22 CURLINFO_PAUSE_STATE
1.23 Offer API to flush the connection pool
1.24 TCP Fast Open for windows
1.25 Expose tried IP addresses that failed
+ 1.26 CURL_REFUSE_CLEARTEXT
1.27 hardcode the "localhost" addresses
1.28 FD_CLOEXEC
1.29 Upgrade to websockets
@@ -58,6 +63,7 @@
4.1 HOST
4.2 Alter passive/active on failure and retry
4.3 Earlier bad letter detection
+ 4.4 REST for large files
4.5 ASCII support
4.6 GSSAPI via Windows SSPI
4.7 STAT for LIST without data connection
@@ -65,9 +71,12 @@
5. HTTP
5.1 Better persistency for HTTP 1.0
+ 5.2 support FF3 sqlite cookie files
5.3 Rearrange request header order
5.4 Allow SAN names in HTTP/2 server push
5.5 auth= in URLs
+ 5.6 Refuse "downgrade" redirects
+ 5.7 QUIC
6. TELNET
6.1 ditch stdin
@@ -75,10 +84,12 @@
6.3 feature negotiation debug data
7. SMTP
+ 7.1 Pipelining
7.2 Enhanced capability support
7.3 Add CURLOPT_MAIL_CLIENT option
8. POP3
+ 8.1 Pipelining
8.2 Enhanced capability support
9. IMAP
@@ -94,8 +105,10 @@
11.4 Create remote directories
12. New protocols
+ 12.1 RSYNC
13. SSL
+ 13.1 Disable specific versions
13.2 Provide mutex locking API
13.3 Support in-memory certs/ca certs/keys
13.4 Cache/share OpenSSL contexts
@@ -103,12 +116,15 @@
13.6 Provide callback for cert verification
13.7 improve configure --with-ssl
13.8 Support DANE
+ 13.9 Configurable loading of OpenSSL configuration file
13.10 Support Authority Information Access certificate extension (AIA)
13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
13.12 Support HSTS
+ 13.13 Support HPKP
13.14 Support the clienthello extension
14. GnuTLS
+ 14.1 SSL engine stuff
14.2 check connection
15. WinSSL/SChannel
@@ -123,7 +139,7 @@
17. SSH protocols
17.1 Multiplexing
- 17.2 Handle growing SFTP files
+ 17.2 SFTP performance
17.3 Support better than MD5 hostkey hash
17.4 Support CURLOPT_PREQUOTE
@@ -131,12 +147,17 @@
18.1 sync
18.2 glob posts
18.3 prevent file overwriting
+ 18.4 simultaneous parallel transfers
18.5 UTF-8 filenames in Content-Disposition
- 18.7 at least N milliseconds between requests
+ 18.6 warning when setting an option
+ 18.7 warning if curl version is not in sync with libcurl version
+ 18.8 offer color-coded HTTP header output
18.9 Choose the name of file in braces for complex URLs
18.10 improve how curl works in a windows console window
18.11 Windows: set attribute 'archive' for completed downloads
18.12 keep running, read instructions from pipe/socket
+ 18.13 support metalink in http headers
+ 18.14 --fail without --location should treat 3xx as a failure
18.15 --retry should resume
18.16 send only part of --data
18.17 consider file name from the redirected URL with -O ?
@@ -183,11 +204,10 @@
See https://github.com/curl/curl/pull/3378
-1.2 Consult %APPDATA% also for .netrc
+1.2 More data sharing
- %APPDATA%\.netrc is not considered when running on Windows. Shouldn't it?
-
- See https://github.com/curl/curl/issues/4016
+ curl_share_* functions already exist and work, and they can be extended to
+ share more. For example, enable sharing of the ares channel.
1.3 struct lifreq
@@ -195,21 +215,52 @@
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
To support IPv6 interface addresses for network interfaces properly.
+1.4 signal-based resolver timeouts
+
+ libcurl built without an asynchronous resolver library uses alarm() to time
+ out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
+ signal handler back into the library with a sigsetjmp, which effectively
+ causes libcurl to continue running within the signal handler. This is
+ non-portable and could cause problems on some platforms. A discussion on the
+ problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
+
+ Also, alarm() provides timeout resolution only to the nearest second. alarm
+ ought to be replaced by setitimer on systems that support it.
+
1.5 get rid of PATH_MAX
Having code use and rely on PATH_MAX is not nice:
https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
- Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
- there we need libssh2 to properly tell us when we pass in a too small buffer
- and its current API (as of libssh2 1.2.7) doesn't.
+ Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
+ we need libssh2 to properly tell us when we pass in a too small buffer and
+ its current API (as of libssh2 1.2.7) doesn't.
+
+1.6 Modified buffer size approach
+
+ Current libcurl allocates a fixed 16K size buffer for download and an
+ additional 16K for upload. They are always unconditionally part of the easy
+ handle. If CRLF translations are requested, an additional 32K "scratch
+ buffer" is allocated. A total of 64K transfer buffers in the worst case.
+
+ First, while the handles are not actually in use these buffers could be freed
+ so that lingering handles just kept in queues or whatever waste less memory.
+
+ Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
+ since each need to be individually acked and therefore libssh2 must be
+ allowed to send (or receive) many separate ones in parallel to achieve high
+ transfer speeds. A current libcurl build with a 16K buffer makes that
+ impossible, but one with a 512K buffer will reach MUCH faster transfers. But
+ allocating 512K unconditionally for all buffers just in case they would like
+ to do fast SFTP transfers at some point is not a good solution either.
+
+ Dynamically allocate buffer size depending on protocol in use in combination
+ with freeing it after each individual transfer? Other suggestions?
1.7 Support HTTP/2 for HTTP(S) proxies
Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
- See https://github.com/curl/curl/issues/3570
-
1.8 CURLOPT_RESOLVE for any port number
This option allows applications to set a replacement IP address for a given
@@ -321,11 +372,27 @@
https://github.com/curl/curl/issues/896
+1.19 Timeout idle connections from the pool
+
+ libcurl currently keeps connections in its connection pool for an indefinite
+ period of time, until it either gets reused, gets noticed that it has been
+ closed by the server or gets pruned to make room for a new connection.
+
+ To reduce overhead (especially for when we add monitoring of the connections
+ in the pool), we should introduce a timeout so that connections that have
+ been idle for N seconds get closed.
+
1.20 SRV and URI DNS records
Offer support for resolving SRV and URI DNS records for libcurl to know which
server to connect to for various protocols (including HTTP!).
+1.21 Have the URL API offer IDN decoding
+
+ Similar to how URL decoding/encoding is done, we could have URL functions to
+ convert IDN host names to punycode (probably not the reverse).
+ https://github.com/curl/curl/issues/3232
+
1.22 CURLINFO_PAUSE_STATE
Return information about the transfer's current pause state, in both
@@ -350,6 +417,21 @@
https://github.com/curl/curl/issues/2126
+1.26 CURL_REFUSE_CLEARTEXT
+
+ An environment variable that when set will make libcurl refuse to use any
+ cleartext network protocol. That's all non-encrypted ones (FTP, HTTP, Gopher,
+ etc). By adding the check to libcurl and not just curl, this environment
+ variable can then help users to block all libcurl-using programs from
+ accessing the network using unsafe protocols.
+
+ The variable could be given some sort of syntax or different levels and be
+ used to also allow for example users to refuse libcurl to do transfers with
+ HTTPS certificate checks disabled.
+
+ It could also automatically refuse usernames in URLs when set
+ (see CURLOPT_DISALLOW_USERNAME_IN_URL)
+
1.27 hardcode the "localhost" addresses
There's this new spec getting adopted that says "localhost" should always and
@@ -467,6 +549,12 @@
Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
process to avoid doing a resolve and connect in vain.
+4.4 REST for large files
+
+ REST fix for servers not behaving well on >2GB requests. This should fail if
+ the server doesn't set the pointer to the requested index. The tricky
+ (impossible?) part is to figure out if the server did the right thing or not.
+
4.5 ASCII support
FTP ASCII transfers do not follow RFC959. They don't convert the data
@@ -499,6 +587,12 @@
"Better" support for persistent connections over HTTP 1.0
https://curl.haxx.se/bug/feature.cgi?id=1089001
+5.2 support FF3 sqlite cookie files
+
+ Firefox 3 is changing from its former format to a a sqlite database instead.
+ We should consider how (lib)curl can/should support this.
+ https://curl.haxx.se/bug/feature.cgi?id=1871388
+
5.3 Rearrange request header order
Server implementors often make an effort to detect browser and to reject
@@ -513,7 +607,7 @@
5.4 Allow SAN names in HTTP/2 server push
- curl only allows HTTP/2 push promise if the provided :authority header value
+ curl only allows HTTP/2 push promise if the provided :autority header value
exactly matches the host name given in the URL. It could be extended to allow
any name that would match the Subject Alternative Names in the server's TLS
certificate.
@@ -527,19 +621,36 @@
For example:
- http://test:pass;auth=NTLM@example.com would be equivalent to specifying
- --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
+ http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
+ test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
Additionally this should be implemented for proxy base URLs as well.
+5.6 Refuse "downgrade" redirects
+
+ See https://github.com/curl/curl/issues/226
+
+ Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
+ and/or possibly a bit that refuses redirect to change protocol completely.
+
+5.7 QUIC
+
+ The standardization process of QUIC has been taken to the IETF and can be
+ followed on the [IETF QUIC Mailing
+ list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
+ bandwagon. Ideally, this would be done with a separate library/project to
+ handle the binary/framing layer in a similar fashion to how HTTP/2 is
+ implemented. This, to allow other projects to benefit from the work and to
+ thus broaden the interest and chance of others to participate.
+
6. TELNET
6.1 ditch stdin
- Reading input (to send to the remote server) on stdin is a crappy solution
- for library purposes. We need to invent a good way for the application to be
- able to provide the data to send.
+Reading input (to send to the remote server) on stdin is a crappy solution for
+library purposes. We need to invent a good way for the application to be able
+to provide the data to send.
6.2 ditch telnet-specific select
@@ -549,11 +660,15 @@
6.3 feature negotiation debug data
- Add telnet feature negotiation data to the debug callback as header data.
+ Add telnet feature negotiation data to the debug callback as header data.
7. SMTP
+7.1 Pipelining
+
+ Add support for pipelining emails.
+
7.2 Enhanced capability support
Add the ability, for an application that uses libcurl, to obtain the list of
@@ -572,6 +687,10 @@
8. POP3
+8.1 Pipelining
+
+ Add support for pipelining commands.
+
8.2 Enhanced capability support
Add the ability, for an application that uses libcurl, to obtain the list of
@@ -616,8 +735,18 @@ that doesn't exist on the server, just like --ftp-create-dirs.
12. New protocols
+12.1 RSYNC
+
+ There's no RFC for the protocol or an URI/URL format. An implementation
+ should most probably use an existing rsync library, such as librsync.
+
13. SSL
+13.1 Disable specific versions
+
+ Provide an option that allows for disabling specific SSL versions, such as
+ SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276
+
13.2 Provide mutex locking API
Provide a libcurl API for setting mutex callbacks in the underlying SSL
@@ -682,6 +811,17 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Björn Stenberg wrote a separate initial take on DANE that was never
completed.
+13.9 Configurable loading of OpenSSL configuration file
+
+ libcurl calls the OpenSSL function CONF_modules_load_file() in openssl.c,
+ Curl_ossl_init(). "We regard any changes in the OpenSSL configuration as a
+ security risk or at least as unnecessary."
+
+ Please add a configuration switch or something similar to disable the
+ CONF_modules_load_file() call.
+
+ See https://github.com/curl/curl/issues/2724
+
13.10 Support Authority Information Access certificate extension (AIA)
AIA can provide various things like CRLs but more importantly information
@@ -714,6 +854,21 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
RFC 6797: https://tools.ietf.org/html/rfc6797
+13.13 Support HPKP
+
+ "HTTP Public Key Pinning" is TOFU (trust on first use), time-based
+ features indicated by a HTTP header send by the webserver. It's purpose is
+ to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins
+ to specify which CAs/certificates/public keys to trust when connection to
+ their websites.
+
+ It can be build based on PINNEDPUBLICKEY.
+
+ Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning
+ OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
+ Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning
+ RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21
+
13.14 Support the clienthello extension
Certain stupid networks and middle boxes have a problem with SSL handshake
@@ -726,6 +881,10 @@ that doesn't exist on the server, just like --ftp-create-dirs.
14. GnuTLS
+14.1 SSL engine stuff
+
+ Is this even possible?
+
14.2 check connection
Add a way to check if the connection seems to be alive, to correspond to the
@@ -800,15 +959,10 @@ that doesn't exist on the server, just like --ftp-create-dirs.
To fix this, libcurl would have to detect an existing connection and "attach"
the new transfer to the existing one.
-17.2 Handle growing SFTP files
-
- The SFTP code in libcurl checks the file size *before* a transfer starts and
- then proceeds to transfer exactly that amount of data. If the remote file
- grows while the tranfer is in progress libcurl won't notice and will not
- adapt. The OpenSSH SFTP command line tool does and libcurl could also just
- attempt to download more to see if there is more to get...
+17.2 SFTP performance
- https://github.com/curl/curl/issues/4344
+ libcurl's SFTP transfer performance is sub par and can be improved, mostly by
+ the approach mentioned in "1.6 Modified buffer size approach".
17.3 Support better than MD5 hostkey hash
@@ -848,6 +1002,16 @@ that doesn't exist on the server, just like --ftp-create-dirs.
existing). So that index.html becomes first index.html.1 and then
index.html.2 etc.
+18.4 simultaneous parallel transfers
+
+ The client could be told to use maximum N simultaneous parallel transfers and
+ then just make sure that happens. It should of course not make more than one
+ connection to the same remote host. This would require the client to use the
+ multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595
+
+ Using the multi interface would also allow properly using parallel transfers
+ with HTTP/2 and supporting HTTP/2 server push from the command line.
+
18.5 UTF-8 filenames in Content-Disposition
RFC 6266 documents how UTF-8 names can be passed to a client in the
@@ -855,16 +1019,24 @@ that doesn't exist on the server, just like --ftp-create-dirs.
https://github.com/curl/curl/issues/1888
-18.7 at least N milliseconds between requests
+18.6 warning when setting an option
+
+ Display a warning when libcurl returns an error when setting an option.
+ This can be useful to tell when support for a particular feature hasn't been
+ compiled into the library.
- Allow curl command lines issue a lot of request against services that limit
- users to no more than N requests/second or similar. Could be implemented with
- an option asking that at least a certain time has elapsed since the previous
- request before the next one will be performed. Example:
+18.7 warning if curl version is not in sync with libcurl version
- $ curl "https://example.com/api?input=[1-1000]" -d yadayada --after 500
+ This is usually a sign of a funny, weird or unexpected install situations
+ that aren't always quickly nor easily detected by users. curl and libcurl are
+ always released in sync and should use the same version numbers unless very
+ special situations.
- See https://github.com/curl/curl/issues/3920
+18.8 offer color-coded HTTP header output
+
+ By offering different color output on the header name and the header
+ contents, they could be made more readable and thus help users working on
+ HTTP services.
18.9 Choose the name of file in braces for complex URLs
@@ -903,6 +1075,30 @@ that doesn't exist on the server, just like --ftp-create-dirs.
invoke can talk to the still running instance and ask for transfers to get
done, and thus maintain its connection pool, DNS cache and more.
+18.13 support metalink in http headers
+
+ Curl has support for downloading a metalink xml file, processing it, and then
+ downloading the target of the metalink. This is done via the --metalink option.
+ It would be nice if metalink also supported downloading via metalink
+ information that is stored in HTTP headers (RFC 6249). Theoretically this could
+ also be supported with the --metalink option.
+
+ See https://tools.ietf.org/html/rfc6249
+
+ See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for
+ an implematation of this in wget.
+
+18.14 --fail without --location should treat 3xx as a failure
+
+ To allow a command line like this to detect a redirect and consider it a
+ failure:
+
+ curl -v --fail -O https://example.com/curl-7.48.0.tar.gz
+
+ ... --fail must treat 3xx responses as failures too. The least problematic
+ way to implement this is probably to add that new logic in the command line
+ tool only and not in the underlying CURLOPT_FAILONERROR logic.
+
18.15 --retry should resume
When --retry is used and curl actually retries transfer, it should use the
@@ -1018,17 +1214,17 @@ that doesn't exist on the server, just like --ftp-create-dirs.
20.5 Add support for concurrent connections
- Tests 836, 882 and 938 were designed to verify that separate connections
- aren't used when using different login credentials in protocols that
- shouldn't re-use a connection under such circumstances.
+ Tests 836, 882 and 938 were designed to verify that separate connections aren't
+ used when using different login credentials in protocols that shouldn't re-use
+ a connection under such circumstances.
Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
- connections. The read while() loop seems to loop until it receives a
- disconnect from the client, where it then enters the waiting for connections
- loop. When the client opens a second connection to the server, the first
- connection hasn't been dropped (unless it has been forced - which we
- shouldn't do in these tests) and thus the wait for connections loop is never
- entered to receive the second connection.
+ connections. The read while() loop seems to loop until it receives a disconnect
+ from the client, where it then enters the waiting for connections loop. When
+ the client opens a second connection to the server, the first connection hasn't
+ been dropped (unless it has been forced - which we shouldn't do in these tests)
+ and thus the wait for connections loop is never entered to receive the second
+ connection.
20.6 Use the RFC6265 test suite
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index c90e9c5fb..7a8af6f9e 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -65,7 +65,6 @@ DPAGES = \
http1.0.d \
http1.1.d http2.d \
http2-prior-knowledge.d \
- http3.d \
ignore-content-length.d \
include.d \
insecure.d \
@@ -97,15 +96,11 @@ DPAGES = \
no-buffer.d \
no-keepalive.d \
no-npn.d \
- no-progress-meter.d \
no-sessionid.d \
noproxy.d \
ntlm.d ntlm-wb.d \
oauth2-bearer.d \
- output.d \
- parallel.d \
- pass.d \
- parallel-max.d \
+ output.d pass.d \
path-as-is.d \
pinnedpubkey.d \
post301.d \
@@ -159,7 +154,6 @@ DPAGES = \
retry-delay.d \
retry-max-time.d \
retry.d \
- sasl-authzid.d \
sasl-ir.d \
service-name.d \
show-error.d \
diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d
index ba2ded11c..dfe636cfc 100644
--- a/docs/cmdline-opts/alt-svc.d
+++ b/docs/cmdline-opts/alt-svc.d
@@ -10,7 +10,7 @@ This option enables the alt-svc parser in curl. If the file name points to an
existing alt-svc cache file, that will be used. After a completed transfer,
the cache will be saved to the file name again if it has been modified.
-Specify a "" file name (zero length) to avoid loading/saving and make curl
+Specifiy a "" file name (zero length) to avoid loading/saving and make curl
just handle the cache in memory.
If this option is used several times, curl will load contents from all the
diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d
index df3d39220..105d62828 100644
--- a/docs/cmdline-opts/config.d
+++ b/docs/cmdline-opts/config.d
@@ -15,12 +15,12 @@ if so, the colon or equals characters can be used as separators. If the option
is specified with one or two dashes, there can be no colon or equals character
between the option and its parameter.
-If the parameter contains whitespace (or starts with : or =), the parameter
-must be enclosed within quotes. Within double quotes, the following escape
-sequences are available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash
-preceding any other letter is ignored. If the first column of a config line is
-a '#' character, the rest of the line will be treated as a comment. Only write
-one option per physical line in the config file.
+If the parameter is to contain whitespace, the parameter must be enclosed
+within quotes. Within double quotes, the following escape sequences are
+available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash preceding any other
+letter is ignored. If the first column of a config line is a '#' character,
+the rest of the line will be treated as a comment. Only write one option per
+physical line in the config file.
Specify the filename to --config as '-' to make curl read the file from stdin.
@@ -40,7 +40,7 @@ Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) On windows, if there is no _curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
diff --git a/docs/cmdline-opts/data.d b/docs/cmdline-opts/data.d
index d18312aaa..7d499665e 100644
--- a/docs/cmdline-opts/data.d
+++ b/docs/cmdline-opts/data.d
@@ -24,7 +24,7 @@ chunk that looks like \&'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to
read the data from, or - if you want curl to read the data from
stdin. Multiple files can also be specified. Posting data from a file named
-\&'foobar' would thus be done with --data @foobar. When --data is told to read
+'foobar' would thus be done with --data @foobar. When --data is told to read
from a file like that, carriage returns and newlines will be stripped out. If
you don't want the @ character to have a special interpretation use --data-raw
instead.
diff --git a/docs/cmdline-opts/doh-url.d b/docs/cmdline-opts/doh-url.d
index c871c4d22..8fa42c1b2 100644
--- a/docs/cmdline-opts/doh-url.d
+++ b/docs/cmdline-opts/doh-url.d
@@ -2,7 +2,6 @@ Long: doh-url
Arg: <URL>
Help: Resolve host names over DOH
Protocols: all
-Added: 7.62.0
---
Specifies which DNS-over-HTTPS (DOH) server to use to resolve hostnames,
instead of using the default name resolver mechanism. The URL must be HTTPS.
diff --git a/docs/cmdline-opts/dump-header.d b/docs/cmdline-opts/dump-header.d
index 33c6674e8..05c10affd 100644
--- a/docs/cmdline-opts/dump-header.d
+++ b/docs/cmdline-opts/dump-header.d
@@ -12,8 +12,6 @@ site sends to you. Cookies from the headers could then be read in a second
curl invocation by using the --cookie option! The --cookie-jar option is a
better way to store cookies.
-If no headers are received, the use of this option will create an empty file.
-
When used in FTP, the FTP server response lines are considered being "headers"
and thus are saved there.
diff --git a/docs/cmdline-opts/http0.9.d b/docs/cmdline-opts/http0.9.d
index 7e783f696..33fe72d18 100644
--- a/docs/cmdline-opts/http0.9.d
+++ b/docs/cmdline-opts/http0.9.d
@@ -10,4 +10,5 @@ HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.
-Since curl 7.66.0, HTTP/0.9 is disabled by default.
+A future curl version will deny continuing if the response isn't at least
+HTTP/1.0 unless this option is used.
diff --git a/docs/cmdline-opts/http2.d b/docs/cmdline-opts/http2.d
index cf8f2988e..04cff00a4 100644
--- a/docs/cmdline-opts/http2.d
+++ b/docs/cmdline-opts/http2.d
@@ -6,6 +6,5 @@ Mutexed: http1.1 http1.0 http2-prior-knowledge
Requires: HTTP/2
See-also: no-alpn
Help: Use HTTP 2
-See-also: http1.1 http3
---
Tells curl to use HTTP version 2.
diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d
deleted file mode 100644
index ca85e3a64..000000000
--- a/docs/cmdline-opts/http3.d
+++ /dev/null
@@ -1,19 +0,0 @@
-Long: http3
-Tags: Versions
-Protocols: HTTP
-Added: 7.66.0
-Mutexed: http1.1 http1.0 http2 http2-prior-knowledge
-Requires: HTTP/3
-Help: Use HTTP v3
-See-also: http1.1 http2
----
-
-WARNING: this option is experiemental. Do not use in production.
-
-Tells curl to use HTTP version 3 directly to the host and port number used in
-the URL. A normal HTTP/3 transaction will be done to a host and then get
-redirected via Alt-SVc, but this option allows a user to circumvent that when
-you know that the target speaks HTTP/3 on the given host and port.
-
-This option will make curl fail if a QUIC connection cannot be established, it
-cannot fall back to a lower HTTP version on its own.
diff --git a/docs/cmdline-opts/key.d b/docs/cmdline-opts/key.d
index 855e2f7b6..4877b4238 100644
--- a/docs/cmdline-opts/key.d
+++ b/docs/cmdline-opts/key.d
@@ -5,7 +5,7 @@ Help: Private key file name
---
Private key file name. Allows you to provide your private key in this separate
file. For SSH, if not specified, curl tries the following candidates in order:
-\&'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
+'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
If curl is built against OpenSSL library, and the engine pkcs11 is available,
then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a
diff --git a/docs/cmdline-opts/no-progress-meter.d b/docs/cmdline-opts/no-progress-meter.d
deleted file mode 100644
index aff0717d3..000000000
--- a/docs/cmdline-opts/no-progress-meter.d
+++ /dev/null
@@ -1,10 +0,0 @@
-Long: no-progress-meter
-Help: Do not show the progress meter
-See-also: verbose silent
-Added: 7.67.0
----
-Option to switch off the progress meter output without muting or otherwise
-affecting warning and informational messages like --silent does.
-
-Note that this is the negated option name documented. You can thus use
---progress-meter to enable the progress meter again.
diff --git a/docs/cmdline-opts/parallel-max.d b/docs/cmdline-opts/parallel-max.d
deleted file mode 100644
index a8c79c743..000000000
--- a/docs/cmdline-opts/parallel-max.d
+++ /dev/null
@@ -1,9 +0,0 @@
-Long: parallel-max
-Help: Maximum concurrency for parallel transfers
-Added: 7.66.0
-See-also: parallel
----
-When asked to do parallel transfers, using --parallel, this option controls
-the maximum amount of transfers to do simultaneously.
-
-The default is 50.
diff --git a/docs/cmdline-opts/parallel.d b/docs/cmdline-opts/parallel.d
deleted file mode 100644
index fac84e624..000000000
--- a/docs/cmdline-opts/parallel.d
+++ /dev/null
@@ -1,7 +0,0 @@
-Short: Z
-Long: parallel
-Help: Perform transfers in parallel
-Added: 7.66.0
----
-Makes curl perform its transfers in parallel as compared to the regular serial
-manner.
diff --git a/docs/cmdline-opts/pinnedpubkey.d b/docs/cmdline-opts/pinnedpubkey.d
index cd21911f8..0657e6e79 100644
--- a/docs/cmdline-opts/pinnedpubkey.d
+++ b/docs/cmdline-opts/pinnedpubkey.d
@@ -15,11 +15,13 @@ abort the connection before sending or receiving any data.
PEM/DER support:
7.39.0: OpenSSL, GnuTLS and GSKit
- 7.43.0: NSS and wolfSSL
+ 7.43.0: NSS and wolfSSL/CyaSSL
7.47.0: mbedtls
+ 7.49.0: PolarSSL
sha256 support:
- 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
+ 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.
7.47.0: mbedtls
+ 7.49.0: PolarSSL
Other SSL backends not supported.
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/proto-redir.d b/docs/cmdline-opts/proto-redir.d
index a1205dd03..c9eeeab1d 100644
--- a/docs/cmdline-opts/proto-redir.d
+++ b/docs/cmdline-opts/proto-redir.d
@@ -11,8 +11,7 @@ Example, allow only HTTP and HTTPS on redirect:
curl --proto-redir -all,http,https http://example.com
-By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
-Older versions of curl allowed all protocols on redirect except several
-disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
-since 7.40.0 SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP
-enables all protocols on redirect, including those disabled for security.
+By default curl will allow all protocols on redirect except several disabled
+for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
+SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP enables all
+protocols on redirect, including those disabled for security.
diff --git a/docs/cmdline-opts/proto.d b/docs/cmdline-opts/proto.d
index e1ece1788..1513fdc05 100644
--- a/docs/cmdline-opts/proto.d
+++ b/docs/cmdline-opts/proto.d
@@ -6,7 +6,7 @@ Added: 7.20.2
---
Tells curl to limit what protocols it may use in the transfer. Protocols are
evaluated left to right, are comma separated, and are each a protocol name or
-\&'all', optionally prefixed by zero or more modifiers. Available modifiers are:
+'all', optionally prefixed by zero or more modifiers. Available modifiers are:
.RS
.TP 3
.B +
diff --git a/docs/cmdline-opts/proxy-tls13-ciphers.d b/docs/cmdline-opts/proxy-tls13-ciphers.d
index 08961b72e..3e35b0764 100644
--- a/docs/cmdline-opts/proxy-tls13-ciphers.d
+++ b/docs/cmdline-opts/proxy-tls13-ciphers.d
@@ -9,8 +9,4 @@ ciphers. Read up on TLS 1.3 cipher suite details on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the --proxy-ciphers option.
-
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/quote.d b/docs/cmdline-opts/quote.d
index 59a98eafb..cdd3ca6bd 100644
--- a/docs/cmdline-opts/quote.d
+++ b/docs/cmdline-opts/quote.d
@@ -16,10 +16,9 @@ If the server returns failure for one of the commands, the entire operation
will be aborted. You must send syntactically correct FTP commands as RFC 959
defines to FTP servers, or one of the commands listed below to SFTP servers.
-Prefix the command with an asterisk (*) to make curl continue even if the
-command fails as by default curl will stop at first failure.
-
-This option can be used multiple times.
+This option can be used multiple times. When speaking to an FTP server, prefix
+the command with an asterisk (*) to make curl continue even if the command
+fails as by default curl will stop at first failure.
SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP quote commands
itself before sending them to the server. File names may be quoted
diff --git a/docs/cmdline-opts/retry.d b/docs/cmdline-opts/retry.d
index 3db89b71c..32d1c799b 100644
--- a/docs/cmdline-opts/retry.d
+++ b/docs/cmdline-opts/retry.d
@@ -14,7 +14,4 @@ for all forthcoming retries it will double the waiting time until it reaches
using --retry-delay you disable this exponential backoff algorithm. See also
--retry-max-time to limit the total time allowed for retries.
-Since curl 7.66.0, curl will comply with the Retry-After: response header if
-one was present to know when to issue the next retry.
-
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/sasl-authzid.d b/docs/cmdline-opts/sasl-authzid.d
deleted file mode 100644
index b34db97fc..000000000
--- a/docs/cmdline-opts/sasl-authzid.d
+++ /dev/null
@@ -1,11 +0,0 @@
-Long: sasl-authzid
-Help: Use this identity to act as during SASL PLAIN authentication
-Added: 7.66.0
----
-Use this authorisation identity (authzid), during SASL PLAIN authentication,
-in addition to the authentication identity (authcid) as specified by --user.
-
-If the option isn't specified, the server will derive the authzid from the
-authcid, but if specified, and depending on the server implementation, it may
-be used to access another user's inbox, that the user has been granted access
-to, or a shared mailbox for example.
diff --git a/docs/cmdline-opts/tls13-ciphers.d b/docs/cmdline-opts/tls13-ciphers.d
index 654a25b4c..add161595 100644
--- a/docs/cmdline-opts/tls13-ciphers.d
+++ b/docs/cmdline-opts/tls13-ciphers.d
@@ -9,8 +9,4 @@ cipher suite details on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the --ciphers option.
-
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/tlsv1.0.d b/docs/cmdline-opts/tlsv1.0.d
index 2b1f0156a..312b67b3f 100644
--- a/docs/cmdline-opts/tlsv1.0.d
+++ b/docs/cmdline-opts/tlsv1.0.d
@@ -4,7 +4,3 @@ Protocols: TLS
Added: 7.34.0
---
Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
-
-In old versions of curl this option was documented to allow _only_ TLS 1.0,
-but behavior was inconsistent depending on the TLS library. Use --tls-max if
-you want to set a maximum TLS version.
diff --git a/docs/cmdline-opts/tlsv1.1.d b/docs/cmdline-opts/tlsv1.1.d
index 405d552bb..8182ac6d5 100644
--- a/docs/cmdline-opts/tlsv1.1.d
+++ b/docs/cmdline-opts/tlsv1.1.d
@@ -4,7 +4,3 @@ Protocols: TLS
Added: 7.34.0
---
Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
-
-In old versions of curl this option was documented to allow _only_ TLS 1.1,
-but behavior was inconsistent depending on the TLS library. Use --tls-max if
-you want to set a maximum TLS version.
diff --git a/docs/cmdline-opts/tlsv1.2.d b/docs/cmdline-opts/tlsv1.2.d
index bdf1fcf62..7ba440225 100644
--- a/docs/cmdline-opts/tlsv1.2.d
+++ b/docs/cmdline-opts/tlsv1.2.d
@@ -4,7 +4,3 @@ Protocols: TLS
Added: 7.34.0
---
Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
-
-In old versions of curl this option was documented to allow _only_ TLS 1.2,
-but behavior was inconsistent depending on the TLS library. Use --tls-max if
-you want to set a maximum TLS version.
diff --git a/docs/curl-config.1 b/docs/curl-config.1
index 9711f4bb0..dd2cf116e 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl-config 1 "November 30, 2017" "Curl 7.67.0" "curl-config manual"
+.TH curl-config 1 "November 30, 2017" "Curl 7.64.1" "curl-config manual"
.SH NAME
curl-config \- Get information about a libcurl installation
diff --git a/docs/curl.1 b/docs/curl.1
index 94ac9706a..2b7a58951 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -22,7 +22,7 @@
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
-.TH curl 1 "November 16, 2016" "Curl 7.67.0" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.64.1" "Curl Manual"
.SH NAME
curl \- transfer a URL
@@ -153,7 +153,7 @@ This option enables the alt-svc parser in curl. If the file name points to an
existing alt-svc cache file, that will be used. After a completed transfer,
the cache will be saved to the file name again if it has been modified.
-Specify a "" file name (zero length) to avoid loading/saving and make curl
+Specifiy a "" file name (zero length) to avoid loading/saving and make curl
just handle the cache in memory.
If this option is used several times, curl will load contents from all the
@@ -321,12 +321,12 @@ if so, the colon or equals characters can be used as separators. If the option
is specified with one or two dashes, there can be no colon or equals character
between the option and its parameter.
-If the parameter contains whitespace (or starts with : or =), the parameter
-must be enclosed within quotes. Within double quotes, the following escape
-sequences are available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash
-preceding any other letter is ignored. If the first column of a config line is
-a '#' character, the rest of the line will be treated as a comment. Only write
-one option per physical line in the config file.
+If the parameter is to contain whitespace, the parameter must be enclosed
+within quotes. Within double quotes, the following escape sequences are
+available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash preceding any other
+letter is ignored. If the first column of a config line is a '#' character,
+the rest of the line will be treated as a comment. Only write one option per
+physical line in the config file.
Specify the filename to \fI-K, --config\fP as '-' to make curl read the file from stdin.
@@ -346,7 +346,7 @@ Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) On windows, if there is no _curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
@@ -542,7 +542,7 @@ chunk that looks like \&'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to
read the data from, or - if you want curl to read the data from
stdin. Multiple files can also be specified. Posting data from a file named
-\&'foobar' would thus be done with \fI-d, --data\fP @foobar. When --data is told to read
+'foobar' would thus be done with \fI-d, --data\fP @foobar. When --data is told to read
from a file like that, carriage returns and newlines will be stripped out. If
you don't want the @ character to have a special interpretation use \fI--data-raw\fP
instead.
@@ -635,8 +635,6 @@ address.
instead of using the default name resolver mechanism. The URL must be HTTPS.
If this option is used several times, the last one will be used.
-
-Added in 7.62.0.
.IP "-D, --dump-header <filename>"
(HTTP FTP) Write the received protocol headers to the specified file.
@@ -645,8 +643,6 @@ site sends to you. Cookies from the headers could then be read in a second
curl invocation by using the \fI-b, --cookie\fP option! The \fI-c, --cookie-jar\fP option is a
better way to store cookies.
-If no headers are received, the use of this option will create an empty file.
-
When used in FTP, the FTP server response lines are considered being "headers"
and thus are saved there.
@@ -1062,7 +1058,8 @@ HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.
-Since curl 7.66.0, HTTP/0.9 is disabled by default.
+A future curl version will deny continuing if the response isn't at least
+HTTP/1.0 unless this option is used.
.IP "-0, --http1.0"
(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally preferred
HTTP version.
@@ -1082,20 +1079,7 @@ protocol version in the TLS handshake.
.IP "--http2"
(HTTP) Tells curl to use HTTP version 2.
-See also \fI--http1.1\fP and \fI--http3\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
-.IP "--http3"
-(HTTP)
-WARNING: this option is experiemental. Do not use in production.
-
-Tells curl to use HTTP version 3 directly to the host and port number used in
-the URL. A normal HTTP/3 transaction will be done to a host and then get
-redirected via Alt-SVc, but this option allows a user to circumvent that when
-you know that the target speaks HTTP/3 on the given host and port.
-
-This option will make curl fail if a QUIC connection cannot be established, it
-cannot fall back to a lower HTTP version on its own.
-
-See also \fI--http1.1\fP and \fI--http2\fP. \fI--http3\fP requires that the underlying libcurl was built to support HTTP/3. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2\fP and \fI--http2-prior-knowledge\fP. Added in 7.66.0.
+See also \fI--no-alpn\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
.IP "--ignore-content-length"
(FTP HTTP) For HTTP, Ignore the Content-Length header. This is particularly useful for
servers running Apache 1.x, which will report incorrect Content-Length for
@@ -1174,7 +1158,7 @@ If this option is used several times, the last one will be used.
.IP "--key <key>"
(TLS SSH) Private key file name. Allows you to provide your private key in this separate
file. For SSH, if not specified, curl tries the following candidates in order:
-\&'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
+'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
If curl is built against OpenSSL library, and the engine pkcs11 is available,
then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a
@@ -1445,14 +1429,6 @@ with an SSL library that supports NPN. NPN is used by a libcurl that supports
HTTP/2 to negotiate HTTP/2 support with the server during https sessions.
See also \fI--no-alpn\fP and \fI--http2\fP. \fI--no-npn\fP requires that the underlying libcurl was built to support TLS. Added in 7.36.0.
-.IP "--no-progress-meter"
-Option to switch off the progress meter output without muting or otherwise
-affecting warning and informational messages like \fI-s, --silent\fP does.
-
-Note that this is the negated option name documented. You can thus use
---progress-meter to enable the progress meter again.
-
-See also \fI-v, --verbose\fP and \fI-s, --silent\fP. Added in 7.67.0.
.IP "--no-sessionid"
(TLS) Disable curl's use of SSL session-ID caching. By default all transfers are
done using the cache. Note that while nothing should ever get hurt by
@@ -1533,18 +1509,6 @@ dynamically. Specifying the output as '-' (a single dash) will force the
output to be done to stdout.
See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
-.IP "--parallel-max"
-When asked to do parallel transfers, using \fI-Z, --parallel\fP, this option controls
-the maximum amount of transfers to do simultaneously.
-
-The default is 50.
-
-See also \fI-Z, --parallel\fP. Added in 7.66.0.
-.IP "-Z, --parallel"
-Makes curl perform its transfers in parallel as compared to the regular serial
-manner.
-
-Added in 7.66.0.
.IP "--pass <phrase>"
(SSH TLS) Passphrase for the private key
@@ -1568,11 +1532,13 @@ abort the connection before sending or receiving any data.
PEM/DER support:
7.39.0: OpenSSL, GnuTLS and GSKit
- 7.43.0: NSS and wolfSSL
+ 7.43.0: NSS and wolfSSL/CyaSSL
7.47.0: mbedtls
+ 7.49.0: PolarSSL
sha256 support:
- 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
+ 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.
7.47.0: mbedtls
+ 7.49.0: PolarSSL
Other SSL backends not supported.
If this option is used several times, the last one will be used.
@@ -1653,17 +1619,16 @@ Example, allow only HTTP and HTTPS on redirect:
curl --proto-redir -all,http,https http://example.com
-By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
-Older versions of curl allowed all protocols on redirect except several
-disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
-since 7.40.0 SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP
-enables all protocols on redirect, including those disabled for security.
+By default curl will allow all protocols on redirect except several disabled
+for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
+SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP enables all
+protocols on redirect, including those disabled for security.
Added in 7.20.2.
.IP "--proto <protocols>"
Tells curl to limit what protocols it may use in the transfer. Protocols are
evaluated left to right, are comma separated, and are each a protocol name or
-\&'all', optionally prefixed by zero or more modifiers. Available modifiers are:
+'all', optionally prefixed by zero or more modifiers. Available modifiers are:
.RS
.TP 3
.B +
@@ -1813,10 +1778,6 @@ ciphers. Read up on TLS 1.3 cipher suite details on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the \fI--proxy-ciphers\fP option.
-
If this option is used several times, the last one will be used.
.IP "--proxy-tlsauthtype <type>"
Same as \fI--tlsauthtype\fP but used in HTTPS proxy context.
@@ -1924,10 +1885,9 @@ If the server returns failure for one of the commands, the entire operation
will be aborted. You must send syntactically correct FTP commands as RFC 959
defines to FTP servers, or one of the commands listed below to SFTP servers.
-Prefix the command with an asterisk (*) to make curl continue even if the
-command fails as by default curl will stop at first failure.
-
-This option can be used multiple times.
+This option can be used multiple times. When speaking to an FTP server, prefix
+the command with an asterisk (*) to make curl continue even if the command
+fails as by default curl will stop at first failure.
SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP quote commands
itself before sending them to the server. File names may be quoted
@@ -2171,22 +2131,9 @@ for all forthcoming retries it will double the waiting time until it reaches
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See also
\fI--retry-max-time\fP to limit the total time allowed for retries.
-Since curl 7.66.0, curl will comply with the Retry-After: response header if
-one was present to know when to issue the next retry.
-
If this option is used several times, the last one will be used.
Added in 7.12.3.
-.IP "--sasl-authzid"
-Use this authorisation identity (authzid), during SASL PLAIN authentication,
-in addition to the authentication identity (authcid) as specified by \fI-u, --user\fP.
-
-If the option isn't specified, the server will derive the authzid from the
-authcid, but if specified, and depending on the server implementation, it may
-be used to access another user's inbox, that the user has been granted access
-to, or a shared mailbox for example.
-
-Added in 7.66.0.
.IP "--sasl-ir"
Enable initial response in SASL authentication.
@@ -2458,10 +2405,6 @@ cipher suite details on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the \fI--ciphers\fP option.
-
If this option is used several times, the last one will be used.
.IP "--tlsauthtype <type>"
Set TLS authentication type. Currently, the only supported option is "SRP",
@@ -2484,26 +2427,14 @@ Added in 7.21.4.
.IP "--tlsv1.0"
(TLS) Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
-In old versions of curl this option was documented to allow _only_ TLS 1.0,
-but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
-you want to set a maximum TLS version.
-
Added in 7.34.0.
.IP "--tlsv1.1"
(TLS) Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
-In old versions of curl this option was documented to allow _only_ TLS 1.1,
-but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
-you want to set a maximum TLS version.
-
Added in 7.34.0.
.IP "--tlsv1.2"
(TLS) Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
-In old versions of curl this option was documented to allow _only_ TLS 1.2,
-but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
-you want to set a maximum TLS version.
-
Added in 7.34.0.
.IP "--tlsv1.3"
(TLS) Forces curl to use TLS version 1.3 or later when connecting to a remote TLS server.
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc
index f03fcf2f0..8dd55b9df 100644
--- a/docs/examples/Makefile.inc
+++ b/docs/examples/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -35,8 +35,7 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
http2-upload http2-serverpush getredirect ftpuploadfrommem \
ftpuploadresume sslbackend postit2-formadd multi-formadd \
shared-connection-cache sftpuploadresume http2-pushinmemory parseurl \
- urlapi imap-authzid pop3-authzid smtp-authzid http3 altsvc \
- http3-present
+ urlapi
# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
@@ -45,4 +44,4 @@ COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
- threaded-shared-conn.c crawler.c ephiperfifo.c multi-event.c
+ threaded-shared-conn.c crawler.c ephiperfifo.c
diff --git a/docs/examples/altsvc.c b/docs/examples/altsvc.c
deleted file mode 100644
index 24ef42585..000000000
--- a/docs/examples/altsvc.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-/* <DESC>
- * HTTP with Alt-Svc support
- * </DESC>
- */
-#include <stdio.h>
-#include <curl/curl.h>
-
-int main(void)
-{
- CURL *curl;
- CURLcode res;
-
- curl = curl_easy_init();
- if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
-
- /* cache the alternatives in this file */
- curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc.txt");
-
- /* restrict which HTTP versions to use alternatives */
- curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, (long)
- CURLALTSVC_H1|CURLALTSVC_H2|CURLALTSVC_H3);
-
- /* Perform the request, res will get the return code */
- res = curl_easy_perform(curl);
- /* Check for errors */
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
-
- /* always cleanup */
- curl_easy_cleanup(curl);
- }
- return 0;
-}
diff --git a/docs/examples/cacertinmem.c b/docs/examples/cacertinmem.c
index ea295d016..9e15eb79d 100644
--- a/docs/examples/cacertinmem.c
+++ b/docs/examples/cacertinmem.c
@@ -85,7 +85,8 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
BIO *cbio = BIO_new_mem_buf(mypem, sizeof(mypem));
X509_STORE *cts = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
- int i;
+ X509_INFO *itmp;
+ int i, count = 0;
STACK_OF(X509_INFO) *inf;
(void)curl;
(void)parm;
@@ -102,12 +103,14 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
}
for(i = 0; i < sk_X509_INFO_num(inf); i++) {
- X509_INFO *itmp = sk_X509_INFO_value(inf, i);
+ itmp = sk_X509_INFO_value(inf, i);
if(itmp->x509) {
X509_STORE_add_cert(cts, itmp->x509);
+ count++;
}
if(itmp->crl) {
X509_STORE_add_crl(cts, itmp->crl);
+ count++;
}
}
@@ -123,26 +126,26 @@ int main(void)
CURL *ch;
CURLcode rv;
- curl_global_init(CURL_GLOBAL_ALL);
+ rv = curl_global_init(CURL_GLOBAL_ALL);
ch = curl_easy_init();
- curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
- curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
- curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
- curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
- curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
- curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
- curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
- curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
- curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
- curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
- curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+ rv = curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+ rv = curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
/* Turn off the default CA locations, otherwise libcurl will load CA
* certificates from the locations that were detected/specified at
* build-time
*/
- curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
- curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
+ rv = curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
+ rv = curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
/* first try: retrieve page without ca certificates -> should fail
* unless libcurl was built --with-ca-fallback enabled at build-time
@@ -162,13 +165,13 @@ int main(void)
* handle. normally you would set the ssl ctx function before making
* any transfers, and not use this option.
*/
- curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
/* second try: retrieve page using cacerts' certificate -> will succeed
* load the certificate by installing a function doing the necessary
* "modifications" to the SSL CONTEXT just before link init
*/
- curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv = curl_easy_perform(ch);
if(rv == CURLE_OK)
printf("*** transfer succeeded ***\n");
diff --git a/docs/examples/curlgtk.c b/docs/examples/curlgtk.c
index 4083c8f95..79e89acc6 100644
--- a/docs/examples/curlgtk.c
+++ b/docs/examples/curlgtk.c
@@ -45,12 +45,14 @@ int my_progress_func(GtkWidget *bar,
void *my_thread(void *ptr)
{
CURL *curl;
+ CURLcode res;
+ FILE *outfile;
+ gchar *url = ptr;
curl = curl_easy_init();
if(curl) {
- gchar *url = ptr;
const char *filename = "test.curl";
- FILE *outfile = fopen(filename, "wb");
+ outfile = fopen(filename, "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
@@ -60,7 +62,7 @@ void *my_thread(void *ptr)
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);
- curl_easy_perform(curl);
+ res = curl_easy_perform(curl);
fclose(outfile);
/* always cleanup */
diff --git a/docs/examples/curlx.c b/docs/examples/curlx.c
index 830207970..49f52e614 100644
--- a/docs/examples/curlx.c
+++ b/docs/examples/curlx.c
@@ -277,7 +277,7 @@ int main(int argc, char **argv)
int tabLength = 100;
char *binaryptr;
- char *mimetype = NULL;
+ char *mimetype;
char *mimetypeaccept = NULL;
char *contenttype;
const char **pp;
@@ -294,7 +294,7 @@ int main(int argc, char **argv)
binaryptr = malloc(tabLength);
- memset(&p, '\0', sizeof(p));
+ p.verbose = 0;
p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);
curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -372,7 +372,7 @@ int main(int argc, char **argv)
args++;
}
- if(mimetype == NULL || mimetypeaccept == NULL || p.p12file == NULL)
+ if(mimetype == NULL || mimetypeaccept == NULL)
badarg = 1;
if(badarg) {
@@ -544,7 +544,7 @@ int main(int argc, char **argv)
BIO_printf(p.errorbio, "%d %s %d\n", __LINE__, "curl_easy_perform",
res = curl_easy_perform(p.curl));
{
- curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
+ int result = curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
if(mimetypeaccept && p.verbose) {
if(!strcmp(mimetypeaccept, response))
BIO_printf(p.errorbio, "the response has a correct mimetype : %s\n",
diff --git a/docs/examples/ephiperfifo.c b/docs/examples/ephiperfifo.c
index c076a8523..35991de77 100644
--- a/docs/examples/ephiperfifo.c
+++ b/docs/examples/ephiperfifo.c
@@ -73,6 +73,12 @@ callback.
#include <curl/curl.h>
+#ifdef __GNUC__
+#define _Unused __attribute__((unused))
+#else
+#define _Unused
+#endif
+
#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
@@ -108,7 +114,7 @@ typedef struct _SockInfo
GlobalInfo *global;
} SockInfo;
-#define mycase(code) \
+#define __case(code) \
case code: s = __STRING(code)
/* Die if we get a bad CURLMcode somewhere */
@@ -117,14 +123,14 @@ static void mcode_or_die(const char *where, CURLMcode code)
if(CURLM_OK != code) {
const char *s;
switch(code) {
- mycase(CURLM_BAD_HANDLE); break;
- mycase(CURLM_BAD_EASY_HANDLE); break;
- mycase(CURLM_OUT_OF_MEMORY); break;
- mycase(CURLM_INTERNAL_ERROR); break;
- mycase(CURLM_UNKNOWN_OPTION); break;
- mycase(CURLM_LAST); break;
+ __case(CURLM_BAD_HANDLE); break;
+ __case(CURLM_BAD_EASY_HANDLE); break;
+ __case(CURLM_OUT_OF_MEMORY); break;
+ __case(CURLM_INTERNAL_ERROR); break;
+ __case(CURLM_UNKNOWN_OPTION); break;
+ __case(CURLM_LAST); break;
default: s = "CURLM_unknown"; break;
- mycase(CURLM_BAD_SOCKET);
+ __case(CURLM_BAD_SOCKET);
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
/* ignore this error */
return;
@@ -142,6 +148,7 @@ static void timer_cb(GlobalInfo* g, int revents);
static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
{
struct itimerspec its;
+ CURLMcode rc;
fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
@@ -201,8 +208,8 @@ static void event_cb(GlobalInfo *g, int fd, int revents)
CURLMcode rc;
struct itimerspec its;
- int action = ((revents & EPOLLIN) ? CURL_CSELECT_IN : 0) |
- ((revents & EPOLLOUT) ? CURL_CSELECT_OUT : 0);
+ int action = (revents & EPOLLIN ? CURL_CSELECT_IN : 0) |
+ (revents & EPOLLOUT ? CURL_CSELECT_OUT : 0);
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -267,8 +274,8 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
GlobalInfo *g)
{
struct epoll_event ev;
- int kind = ((act & CURL_POLL_IN) ? EPOLLIN : 0) |
- ((act & CURL_POLL_OUT) ? EPOLLOUT : 0);
+ int kind = (act & CURL_POLL_IN ? EPOLLIN : 0) |
+ (act & CURL_POLL_OUT ? EPOLLOUT : 0);
if(f->sockfd) {
if(epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL))
@@ -330,21 +337,21 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
/* CURLOPT_WRITEFUNCTION */
-static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
+static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
+ void *data)
{
- (void)ptr;
- (void)data;
- return size * nmemb;
+ size_t realsize = size * nmemb;
+ ConnInfo *conn _Unused = (ConnInfo*) data;
+
+ return realsize;
}
/* CURLOPT_PROGRESSFUNCTION */
-static int prog_cb(void *p, double dltotal, double dlnow, double ult,
- double uln)
+static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
+ double uln _Unused)
{
ConnInfo *conn = (ConnInfo *)p;
- (void)ult;
- (void)uln;
fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
return 0;
@@ -462,14 +469,14 @@ void SignalHandler(int signo)
}
}
-int main(int argc, char **argv)
+int main(int argc _Unused, char **argv _Unused)
{
GlobalInfo g;
+ int err;
+ int idx;
struct itimerspec its;
struct epoll_event ev;
struct epoll_event events[10];
- (void)argc;
- (void)argv;
g_should_exit_ = 0;
signal(SIGINT, SignalHandler);
@@ -511,9 +518,11 @@ int main(int argc, char **argv)
fprintf(MSG_OUT, "Entering wait loop\n");
fflush(MSG_OUT);
while(!g_should_exit_) {
- int idx;
- int err = epoll_wait(g.epfd, events,
- sizeof(events)/sizeof(struct epoll_event), 10000);
+ /* TODO(josh): use epoll_pwait to avoid a race on the signal. Mask the
+ * signal before the while loop, and then re-enable the signal during
+ * epoll wait. Mask at the end of the loop. */
+ err = epoll_wait(g.epfd, events, sizeof(events)/sizeof(struct epoll_event),
+ 10000);
if(err == -1) {
if(errno == EINTR) {
fprintf(MSG_OUT, "note: wait interrupted\n");
@@ -542,6 +551,5 @@ int main(int argc, char **argv)
fflush(MSG_OUT);
curl_multi_cleanup(g.multi);
- clean_fifo(&g);
return 0;
}
diff --git a/docs/examples/evhiperfifo.c b/docs/examples/evhiperfifo.c
index 4d77d5294..6474e352c 100644
--- a/docs/examples/evhiperfifo.c
+++ b/docs/examples/evhiperfifo.c
@@ -203,8 +203,8 @@ static void event_cb(EV_P_ struct ev_io *w, int revents)
GlobalInfo *g = (GlobalInfo*) w->data;
CURLMcode rc;
- int action = ((revents & EV_READ) ? CURL_POLL_IN : 0) |
- ((revents & EV_WRITE) ? CURL_POLL_OUT : 0);
+ int action = (revents&EV_READ?CURL_POLL_IN:0)|
+ (revents&EV_WRITE?CURL_POLL_OUT:0);
rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc);
check_multi_info(g);
@@ -247,8 +247,7 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
{
printf("%s \n", __PRETTY_FUNCTION__);
- int kind = ((act & CURL_POLL_IN) ? EV_READ : 0) |
- ((act & CURL_POLL_OUT) ? EV_WRITE : 0);
+ int kind = (act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0);
f->sockfd = s;
f->action = act;
@@ -422,6 +421,7 @@ static int init_fifo(GlobalInfo *g)
int main(int argc, char **argv)
{
GlobalInfo g;
+ CURLMcode rc;
(void)argc;
(void)argv;
diff --git a/docs/examples/externalsocket.c b/docs/examples/externalsocket.c
index bd0adf261..d89b041b4 100644
--- a/docs/examples/externalsocket.c
+++ b/docs/examples/externalsocket.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c
index 7151addde..f1706fbe6 100644
--- a/docs/examples/fopen.c
+++ b/docs/examples/fopen.c
@@ -211,7 +211,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
static int use_buffer(URL_FILE *file, size_t want)
{
/* sort out buffer */
- if(file->buffer_pos <= want) {
+ if((file->buffer_pos - want) <= 0) {
/* ditch buffer - write will recreate */
free(file->buffer);
file->buffer = NULL;
diff --git a/docs/examples/ftp-wildcard.c b/docs/examples/ftp-wildcard.c
index c7ed23f68..f249bc135 100644
--- a/docs/examples/ftp-wildcard.c
+++ b/docs/examples/ftp-wildcard.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -41,6 +41,8 @@ static size_t write_it(char *buff, size_t size, size_t nmemb,
int main(int argc, char **argv)
{
+ int rc = CURLE_OK;
+
/* curl easy handle */
CURL *handle;
@@ -48,7 +50,7 @@ int main(int argc, char **argv)
struct callback_data data = { 0 };
/* global initialization */
- int rc = curl_global_init(CURL_GLOBAL_ALL);
+ rc = curl_global_init(CURL_GLOBAL_ALL);
if(rc)
return rc;
diff --git a/docs/examples/ftpgetinfo.c b/docs/examples/ftpgetinfo.c
index db16408d3..277e52b9d 100644
--- a/docs/examples/ftpgetinfo.c
+++ b/docs/examples/ftpgetinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -56,6 +56,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
/* Ask for filetime */
curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ /* No header output: TODO 14.1 http-style HEAD output for ftp */
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, throw_away);
curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
/* Switch on full protocol/debug output */
diff --git a/docs/examples/ghiper.c b/docs/examples/ghiper.c
index 1fa3b5940..cb013afd4 100644
--- a/docs/examples/ghiper.c
+++ b/docs/examples/ghiper.c
@@ -182,8 +182,8 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
int fd = g_io_channel_unix_get_fd(ch);
int action =
- ((condition & G_IO_IN) ? CURL_CSELECT_IN : 0) |
- ((condition & G_IO_OUT) ? CURL_CSELECT_OUT : 0);
+ (condition & G_IO_IN ? CURL_CSELECT_IN : 0) |
+ (condition & G_IO_OUT ? CURL_CSELECT_OUT : 0);
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -218,8 +218,7 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
GlobalInfo *g)
{
GIOCondition kind =
- ((act & CURL_POLL_IN) ? G_IO_IN : 0) |
- ((act & CURL_POLL_OUT) ? G_IO_OUT : 0);
+ (act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0);
f->sockfd = s;
f->action = act;
@@ -256,8 +255,8 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
else {
if(!fdp) {
MSG_OUT("Adding data: %s%s\n",
- (what & CURL_POLL_IN) ? "READ" : "",
- (what & CURL_POLL_OUT) ? "WRITE" : "");
+ what&CURL_POLL_IN?"READ":"",
+ what&CURL_POLL_OUT?"WRITE":"");
addsock(s, e, what, g);
}
else {
@@ -412,6 +411,7 @@ int init_fifo(void)
int main(int argc, char **argv)
{
GlobalInfo *g;
+ CURLMcode rc;
GMainLoop*gmain;
int fd;
GIOChannel* ch;
diff --git a/docs/examples/hiperfifo.c b/docs/examples/hiperfifo.c
index c02659b9a..f3c1bbc73 100644
--- a/docs/examples/hiperfifo.c
+++ b/docs/examples/hiperfifo.c
@@ -72,6 +72,12 @@ callback.
#include <errno.h>
#include <sys/cdefs.h>
+#ifdef __GNUC__
+#define _Unused __attribute__((unused))
+#else
+#define _Unused
+#endif
+
#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
@@ -109,7 +115,7 @@ typedef struct _SockInfo
GlobalInfo *global;
} SockInfo;
-#define mycase(code) \
+#define __case(code) \
case code: s = __STRING(code)
/* Die if we get a bad CURLMcode somewhere */
@@ -118,14 +124,14 @@ static void mcode_or_die(const char *where, CURLMcode code)
if(CURLM_OK != code) {
const char *s;
switch(code) {
- mycase(CURLM_BAD_HANDLE); break;
- mycase(CURLM_BAD_EASY_HANDLE); break;
- mycase(CURLM_OUT_OF_MEMORY); break;
- mycase(CURLM_INTERNAL_ERROR); break;
- mycase(CURLM_UNKNOWN_OPTION); break;
- mycase(CURLM_LAST); break;
+ __case(CURLM_BAD_HANDLE); break;
+ __case(CURLM_BAD_EASY_HANDLE); break;
+ __case(CURLM_OUT_OF_MEMORY); break;
+ __case(CURLM_INTERNAL_ERROR); break;
+ __case(CURLM_UNKNOWN_OPTION); break;
+ __case(CURLM_LAST); break;
default: s = "CURLM_unknown"; break;
- mycase(CURLM_BAD_SOCKET);
+ __case(CURLM_BAD_SOCKET);
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
/* ignore this error */
return;
@@ -137,10 +143,10 @@ static void mcode_or_die(const char *where, CURLMcode code)
/* Update the event timer after curl_multi library calls */
-static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
+static int multi_timer_cb(CURLM *multi _Unused, long timeout_ms, GlobalInfo *g)
{
struct timeval timeout;
- (void)multi;
+ CURLMcode rc;
timeout.tv_sec = timeout_ms/1000;
timeout.tv_usec = (timeout_ms%1000)*1000;
@@ -197,8 +203,8 @@ static void event_cb(int fd, short kind, void *userp)
CURLMcode rc;
int action =
- ((kind & EV_READ) ? CURL_CSELECT_IN : 0) |
- ((kind & EV_WRITE) ? CURL_CSELECT_OUT : 0);
+ (kind & EV_READ ? CURL_CSELECT_IN : 0) |
+ (kind & EV_WRITE ? CURL_CSELECT_OUT : 0);
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -215,12 +221,10 @@ static void event_cb(int fd, short kind, void *userp)
/* Called by libevent when our timeout expires */
-static void timer_cb(int fd, short kind, void *userp)
+static void timer_cb(int fd _Unused, short kind _Unused, void *userp)
{
GlobalInfo *g = (GlobalInfo *)userp;
CURLMcode rc;
- (void)fd;
- (void)kind;
rc = curl_multi_socket_action(g->multi,
CURL_SOCKET_TIMEOUT, 0, &g->still_running);
@@ -246,8 +250,7 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
GlobalInfo *g)
{
int kind =
- ((act & CURL_POLL_IN) ? EV_READ : 0) |
- ((act & CURL_POLL_OUT) ? EV_WRITE : 0) | EV_PERSIST;
+ (act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0)|EV_PERSIST;
f->sockfd = s;
f->action = act;
@@ -300,21 +303,21 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
/* CURLOPT_WRITEFUNCTION */
-static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
+static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
+ void *data)
{
- (void)ptr;
- (void)data;
- return size * nmemb;
+ size_t realsize = size * nmemb;
+ ConnInfo *conn _Unused = (ConnInfo*) data;
+
+ return realsize;
}
/* CURLOPT_PROGRESSFUNCTION */
-static int prog_cb(void *p, double dltotal, double dlnow, double ult,
- double uln)
+static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
+ double uln _Unused)
{
ConnInfo *conn = (ConnInfo *)p;
- (void)ult;
- (void)uln;
fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
return 0;
@@ -357,14 +360,12 @@ static void new_conn(char *url, GlobalInfo *g)
}
/* This gets called whenever data is received from the fifo */
-static void fifo_cb(int fd, short event, void *arg)
+static void fifo_cb(int fd _Unused, short event _Unused, void *arg)
{
char s[1024];
long int rv = 0;
int n = 0;
GlobalInfo *g = (GlobalInfo *)arg;
- (void)fd;
- (void)event;
do {
s[0]='\0';
@@ -425,11 +426,9 @@ static void clean_fifo(GlobalInfo *g)
unlink(fifo);
}
-int main(int argc, char **argv)
+int main(int argc _Unused, char **argv _Unused)
{
GlobalInfo g;
- (void)argc;
- (void)argv;
memset(&g, 0, sizeof(GlobalInfo));
g.evbase = event_base_new();
diff --git a/docs/examples/htmltidy.c b/docs/examples/htmltidy.c
index 1cfb2735f..2f4500f51 100644
--- a/docs/examples/htmltidy.c
+++ b/docs/examples/htmltidy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -74,14 +74,13 @@ void dumpNode(TidyDoc doc, TidyNode tnod, int indent)
int main(int argc, char **argv)
{
+ CURL *curl;
+ char curl_errbuf[CURL_ERROR_SIZE];
+ TidyDoc tdoc;
+ TidyBuffer docbuf = {0};
+ TidyBuffer tidy_errbuf = {0};
+ int err;
if(argc == 2) {
- CURL *curl;
- char curl_errbuf[CURL_ERROR_SIZE];
- TidyDoc tdoc;
- TidyBuffer docbuf = {0};
- TidyBuffer tidy_errbuf = {0};
- int err;
-
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
diff --git a/docs/examples/htmltitle.cpp b/docs/examples/htmltitle.cpp
index e31e3e321..8148888a4 100644
--- a/docs/examples/htmltitle.cpp
+++ b/docs/examples/htmltitle.cpp
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -136,9 +136,9 @@ static void StartElement(void *voidContext,
const xmlChar *name,
const xmlChar **attributes)
{
- Context *context = static_cast<Context *>(voidContext);
+ Context *context = (Context *)voidContext;
- if(COMPARE(reinterpret_cast<char *>(name), "TITLE")) {
+ if(COMPARE((char *)name, "TITLE")) {
context->title = "";
context->addTitle = true;
}
@@ -152,9 +152,9 @@ static void StartElement(void *voidContext,
static void EndElement(void *voidContext,
const xmlChar *name)
{
- Context *context = static_cast<Context *>(voidContext);
+ Context *context = (Context *)voidContext;
- if(COMPARE(reinterpret_cast<char *>(name), "TITLE"))
+ if(COMPARE((char *)name, "TITLE"))
context->addTitle = false;
}
@@ -167,7 +167,7 @@ static void handleCharacters(Context *context,
int length)
{
if(context->addTitle)
- context->title.append(reinterpret_cast<char *>(chars), length);
+ context->title.append((char *)chars, length);
}
//
@@ -178,7 +178,7 @@ static void Characters(void *voidContext,
const xmlChar *chars,
int length)
{
- Context *context = static_cast<Context *>(voidContext);
+ Context *context = (Context *)voidContext;
handleCharacters(context, chars, length);
}
@@ -191,7 +191,7 @@ static void cdata(void *voidContext,
const xmlChar *chars,
int length)
{
- Context *context = static_cast<Context *>(voidContext);
+ Context *context = (Context *)voidContext;
handleCharacters(context, chars, length);
}
diff --git a/docs/examples/http2-download.c b/docs/examples/http2-download.c
index 333b7df2c..b4358fb6e 100644
--- a/docs/examples/http2-download.c
+++ b/docs/examples/http2-download.c
@@ -110,7 +110,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
- fprintf(stderr, "== %u Info: %s", num, data);
+ fprintf(stderr, "== %d Info: %s", num, data);
/* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
diff --git a/docs/examples/http2-upload.c b/docs/examples/http2-upload.c
index 8f1fd4a5f..45864cf3e 100644
--- a/docs/examples/http2-upload.c
+++ b/docs/examples/http2-upload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/http3-present.c b/docs/examples/http3-present.c
deleted file mode 100644
index 857952dc7..000000000
--- a/docs/examples/http3-present.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-/* <DESC>
- * Checks if HTTP/3 support is present in libcurl.
- * </DESC>
- */
-#include <stdio.h>
-#include <curl/curl.h>
-
-int main(void)
-{
- curl_version_info_data *ver;
-
- curl_global_init(CURL_GLOBAL_ALL);
-
- ver = curl_version_info(CURLVERSION_NOW);
- if(ver->features & CURL_VERSION_HTTP2)
- printf("HTTP/2 support is present\n");
-
- if(ver->features & CURL_VERSION_HTTP3)
- printf("HTTP/3 support is present\n");
-
- if(ver->features & CURL_VERSION_ALTSVC)
- printf("Alt-svc support is present\n");
-
- curl_global_cleanup();
- return 0;
-}
diff --git a/docs/examples/http3.c b/docs/examples/http3.c
deleted file mode 100644
index 240a7edd4..000000000
--- a/docs/examples/http3.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-/* <DESC>
- * Very simple HTTP/3 GET
- * </DESC>
- */
-#include <stdio.h>
-#include <curl/curl.h>
-
-int main(void)
-{
- CURL *curl;
- CURLcode res;
-
- curl = curl_easy_init();
- if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
-
- /* Forcing HTTP/3 will make the connection fail if the server isn't
- accessible over QUIC + HTTP/3 on the given host and port.
- Consider using CURLOPT_ALTSVC instead! */
- curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_3);
-
- /* Perform the request, res will get the return code */
- res = curl_easy_perform(curl);
- /* Check for errors */
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
-
- /* always cleanup */
- curl_easy_cleanup(curl);
- }
- return 0;
-}
diff --git a/docs/examples/imap-append.c b/docs/examples/imap-append.c
index ab0543300..bbf9fe436 100644
--- a/docs/examples/imap-append.c
+++ b/docs/examples/imap-append.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -85,15 +85,14 @@ int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
+ const char **p;
+ long infilesize;
+ struct upload_status upload_ctx;
+
+ upload_ctx.lines_read = 0;
curl = curl_easy_init();
if(curl) {
- const char **p;
- long infilesize;
- struct upload_status upload_ctx;
-
- upload_ctx.lines_read = 0;
-
/* Set username and password */
curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
diff --git a/docs/examples/imap-authzid.c b/docs/examples/imap-authzid.c
deleted file mode 100644
index bfe7d71d7..000000000
--- a/docs/examples/imap-authzid.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* <DESC>
- * IMAP example showing how to retreieve e-mails from a shared mailed box
- * </DESC>
- */
-
-#include <stdio.h>
-#include <curl/curl.h>
-
-/* This is a simple example showing how to fetch mail using libcurl's IMAP
- * capabilities.
- *
- * Note that this example requires libcurl 7.66.0 or above.
- */
-
-int main(void)
-{
- CURL *curl;
- CURLcode res = CURLE_OK;
-
- curl = curl_easy_init();
- if(curl) {
- /* Set the username and password */
- curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
-
- /* Set the authorisation identity (identity to act as) */
- curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");
-
- /* Force PLAIN authentication */
- curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
-
- /* This will fetch message 1 from the user's inbox */
- curl_easy_setopt(curl, CURLOPT_URL,
- "imap://imap.example.com/INBOX/;UID=1");
-
- /* Perform the fetch */
- res = curl_easy_perform(curl);
-
- /* Check for errors */
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
-
- /* Always cleanup */
- curl_easy_cleanup(curl);
- }
-
- return (int)res;
-}
diff --git a/docs/examples/multi-app.c b/docs/examples/multi-app.c
index dc03d0eb1..78867d835 100644
--- a/docs/examples/multi-app.c
+++ b/docs/examples/multi-app.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -147,11 +147,11 @@ int main(void)
/* See how the transfers went */
while((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
if(msg->msg == CURLMSG_DONE) {
- int idx;
+ int idx, found = 0;
/* Find out which handle this message is about */
for(idx = 0; idx<HANDLECOUNT; idx++) {
- int found = (msg->easy_handle == handles[idx]);
+ found = (msg->easy_handle == handles[idx]);
if(found)
break;
}
diff --git a/docs/examples/multi-event.c b/docs/examples/multi-event.c
deleted file mode 100644
index 482de8e7f..000000000
--- a/docs/examples/multi-event.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* <DESC>
- * multi_socket API using libevent
- * </DESC>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <event2/event.h>
-#include <curl/curl.h>
-
-struct event_base *base;
-CURLM *curl_handle;
-struct event *timeout;
-
-typedef struct curl_context_s {
- struct event *event;
- curl_socket_t sockfd;
-} curl_context_t;
-
-static void curl_perform(int fd, short event, void *arg);
-
-static curl_context_t* create_curl_context(curl_socket_t sockfd)
-{
- curl_context_t *context;
-
- context = (curl_context_t *) malloc(sizeof(*context));
-
- context->sockfd = sockfd;
-
- context->event = event_new(base, sockfd, 0, curl_perform, context);
-
- return context;
-}
-
-static void destroy_curl_context(curl_context_t *context)
-{
- event_del(context->event);
- event_free(context->event);
- free(context);
-}
-
-static void add_download(const char *url, int num)
-{
- char filename[50];
- FILE *file;
- CURL *handle;
-
- snprintf(filename, 50, "%d.download", num);
-
- file = fopen(filename, "wb");
- if(!file) {
- fprintf(stderr, "Error opening %s\n", filename);
- return;
- }
-
- handle = curl_easy_init();
- curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
- curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
- curl_easy_setopt(handle, CURLOPT_URL, url);
- curl_multi_add_handle(curl_handle, handle);
- fprintf(stderr, "Added download %s -> %s\n", url, filename);
-}
-
-static void check_multi_info(void)
-{
- char *done_url;
- CURLMsg *message;
- int pending;
- CURL *easy_handle;
- FILE *file;
-
- while((message = curl_multi_info_read(curl_handle, &pending))) {
- switch(message->msg) {
- case CURLMSG_DONE:
- /* Do not use message data after calling curl_multi_remove_handle() and
- curl_easy_cleanup(). As per curl_multi_info_read() docs:
- "WARNING: The data the returned pointer points to will not survive
- calling curl_multi_cleanup, curl_multi_remove_handle or
- curl_easy_cleanup." */
- easy_handle = message->easy_handle;
-
- curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
- curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
- printf("%s DONE\n", done_url);
-
- curl_multi_remove_handle(curl_handle, easy_handle);
- curl_easy_cleanup(easy_handle);
- if(file) {
- fclose(file);
- }
- break;
-
- default:
- fprintf(stderr, "CURLMSG default\n");
- break;
- }
- }
-}
-
-static void curl_perform(int fd, short event, void *arg)
-{
- int running_handles;
- int flags = 0;
- curl_context_t *context;
-
- if(event & EV_READ)
- flags |= CURL_CSELECT_IN;
- if(event & EV_WRITE)
- flags |= CURL_CSELECT_OUT;
-
- context = (curl_context_t *) arg;
-
- curl_multi_socket_action(curl_handle, context->sockfd, flags,
- &running_handles);
-
- check_multi_info();
-}
-
-static void on_timeout(evutil_socket_t fd, short events, void *arg)
-{
- int running_handles;
- curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
- &running_handles);
- check_multi_info();
-}
-
-static int start_timeout(CURLM *multi, long timeout_ms, void *userp)
-{
- if(timeout_ms < 0) {
- evtimer_del(timeout);
- }
- else {
- if(timeout_ms == 0)
- timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it
- in a bit */
- struct timeval tv;
- tv.tv_sec = timeout_ms / 1000;
- tv.tv_usec = (timeout_ms % 1000) * 1000;
- evtimer_del(timeout);
- evtimer_add(timeout, &tv);
- }
- return 0;
-}
-
-static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
- void *socketp)
-{
- curl_context_t *curl_context;
- int events = 0;
-
- switch(action) {
- case CURL_POLL_IN:
- case CURL_POLL_OUT:
- case CURL_POLL_INOUT:
- curl_context = socketp ?
- (curl_context_t *) socketp : create_curl_context(s);
-
- curl_multi_assign(curl_handle, s, (void *) curl_context);
-
- if(action != CURL_POLL_IN)
- events |= EV_WRITE;
- if(action != CURL_POLL_OUT)
- events |= EV_READ;
-
- events |= EV_PERSIST;
-
- event_del(curl_context->event);
- event_assign(curl_context->event, base, curl_context->sockfd, events,
- curl_perform, curl_context);
- event_add(curl_context->event, NULL);
-
- break;
- case CURL_POLL_REMOVE:
- if(socketp) {
- event_del(((curl_context_t*) socketp)->event);
- destroy_curl_context((curl_context_t*) socketp);
- curl_multi_assign(curl_handle, s, NULL);
- }
- break;
- default:
- abort();
- }
-
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- if(argc <= 1)
- return 0;
-
- if(curl_global_init(CURL_GLOBAL_ALL)) {
- fprintf(stderr, "Could not init curl\n");
- return 1;
- }
-
- base = event_base_new();
- timeout = evtimer_new(base, on_timeout, NULL);
-
- curl_handle = curl_multi_init();
- curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
- curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
-
- while(argc-- > 1) {
- add_download(argv[argc], argc);
- }
-
- event_base_dispatch(base);
-
- curl_multi_cleanup(curl_handle);
- event_free(timeout);
- event_base_free(base);
-
- libevent_global_shutdown();
- curl_global_cleanup();
-
- return 0;
-}
diff --git a/docs/examples/multithread.c b/docs/examples/multithread.c
index da07a1686..83ed3f589 100644
--- a/docs/examples/multithread.c
+++ b/docs/examples/multithread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,15 +69,16 @@ int main(int argc, char **argv)
{
pthread_t tid[NUMT];
int i;
+ int error;
/* Must initialize libcurl before any threads are started */
curl_global_init(CURL_GLOBAL_ALL);
for(i = 0; i< NUMT; i++) {
- int error = pthread_create(&tid[i],
- NULL, /* default attributes please */
- pull_one_url,
- (void *)urls[i]);
+ error = pthread_create(&tid[i],
+ NULL, /* default attributes please */
+ pull_one_url,
+ (void *)urls[i]);
if(0 != error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else
@@ -86,7 +87,7 @@ int main(int argc, char **argv)
/* now wait for all threads to terminate */
for(i = 0; i< NUMT; i++) {
- pthread_join(tid[i], NULL);
+ error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/pop3-authzid.c b/docs/examples/pop3-authzid.c
deleted file mode 100644
index 57363579a..000000000
--- a/docs/examples/pop3-authzid.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* <DESC>
- * POP3 example showing how to retrieve e-mails from a shared mailbox
- * </DESC>
- */
-
-#include <stdio.h>
-#include <curl/curl.h>
-
-/* This is a simple example showing how to retrieve mail using libcurl's POP3
- * capabilities.
- *
- * Note that this example requires libcurl 7.66.0 or above.
- */
-
-int main(void)
-{
- CURL *curl;
- CURLcode res = CURLE_OK;
-
- curl = curl_easy_init();
- if(curl) {
- /* Set the username and password */
- curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
-
- /* Set the authorisation identity (identity to act as) */
- curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");
-
- /* Force PLAIN authentication */
- curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
-
- /* This will retrieve message 1 from the user's mailbox */
- curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
-
- /* Perform the retr */
- res = curl_easy_perform(curl);
-
- /* Check for errors */
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
-
- /* Always cleanup */
- curl_easy_cleanup(curl);
- }
-
- return (int)res;
-}
diff --git a/docs/examples/postit2-formadd.c b/docs/examples/postit2-formadd.c
index 21d2a9f54..a501ce964 100644
--- a/docs/examples/postit2-formadd.c
+++ b/docs/examples/postit2-formadd.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,7 @@
* <input type="submit" value="send" name="submit">
* </form>
*
+ * This exact source code has not been verified to work.
*/
#include <stdio.h>
diff --git a/docs/examples/postit2.c b/docs/examples/postit2.c
index b3a1a934c..2808f7a4e 100644
--- a/docs/examples/postit2.c
+++ b/docs/examples/postit2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,7 @@
* <input type="submit" value="send" name="submit">
* </form>
*
+ * This exact source code has not been verified to work.
*/
#include <stdio.h>
diff --git a/docs/examples/resolve.c b/docs/examples/resolve.c
index 81a286271..c3b52d6f0 100644
--- a/docs/examples/resolve.c
+++ b/docs/examples/resolve.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,14 +31,14 @@ int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
+ struct curl_slist *host = NULL;
/* Each single name resolve string should be written using the format
HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve,
PORT is the port number of the service where libcurl wants to connect to
the HOST and ADDRESS is the numerical IP address
*/
- struct curl_slist *host = curl_slist_append(NULL,
- "example.com:443:127.0.0.1");
+ host = curl_slist_append(NULL, "example.com:443:127.0.0.1");
curl = curl_easy_init();
if(curl) {
diff --git a/docs/examples/sampleconv.c b/docs/examples/sampleconv.c
index a81747b1f..7bfaa51c6 100644
--- a/docs/examples/sampleconv.c
+++ b/docs/examples/sampleconv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -90,6 +90,7 @@ static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
int main(void)
{
CURL *curl;
+ CURLcode res;
curl = curl_easy_init();
if(curl) {
@@ -103,7 +104,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
my_conv_from_utf8_to_ebcdic);
- curl_easy_perform(curl);
+ res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
diff --git a/docs/examples/sendrecv.c b/docs/examples/sendrecv.c
index c6f1b1a91..cf764be43 100644
--- a/docs/examples/sendrecv.c
+++ b/docs/examples/sendrecv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,9 +59,12 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
int main(void)
{
CURL *curl;
+ CURLcode res;
/* Minimalistic http request */
const char *request = "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n";
size_t request_len = strlen(request);
+ curl_socket_t sockfd;
+ size_t nsent_total = 0;
/* A general note of caution here: if you're using curl_easy_recv() or
curl_easy_send() to implement HTTP or _any_ other protocol libcurl
@@ -73,10 +76,6 @@ int main(void)
curl = curl_easy_init();
if(curl) {
- CURLcode res;
- curl_socket_t sockfd;
- size_t nsent_total = 0;
-
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
diff --git a/docs/examples/sftpuploadresume.c b/docs/examples/sftpuploadresume.c
index e7d9d23f6..98f3b62f0 100644
--- a/docs/examples/sftpuploadresume.c
+++ b/docs/examples/sftpuploadresume.c
@@ -49,8 +49,9 @@ static curl_off_t sftpGetRemoteFileSize(const char *i_remoteFile)
{
CURLcode result = CURLE_GOT_NOTHING;
curl_off_t remoteFileSizeByte = -1;
- CURL *curlHandlePtr = curl_easy_init();
+ CURL *curlHandlePtr = NULL;
+ curlHandlePtr = curl_easy_init();
curl_easy_setopt(curlHandlePtr, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curlHandlePtr, CURLOPT_URL, i_remoteFile);
diff --git a/docs/examples/shared-connection-cache.c b/docs/examples/shared-connection-cache.c
index 2ccb9ea80..91864d9b2 100644
--- a/docs/examples/shared-connection-cache.c
+++ b/docs/examples/shared-connection-cache.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,6 +46,8 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
int main(void)
{
+ CURL *curl;
+ CURLcode res;
CURLSH *share;
int i;
@@ -59,10 +61,8 @@ int main(void)
still reuse connections since the pool is in the shared object! */
for(i = 0; i < 3; i++) {
- CURL *curl = curl_easy_init();
+ curl = curl_easy_init();
if(curl) {
- CURLcode res;
-
curl_easy_setopt(curl, CURLOPT_URL, "https://curl.haxx.se/");
/* use the share object */
diff --git a/docs/examples/smooth-gtk-thread.c b/docs/examples/smooth-gtk-thread.c
index ed404e851..5a4f18fd9 100644
--- a/docs/examples/smooth-gtk-thread.c
+++ b/docs/examples/smooth-gtk-thread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -67,12 +67,14 @@ size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
/* https://weather.com/weather/today/l/46214?cc=*&dayf=5&unit=i */
void *pull_one_url(void *NaN)
{
+ CURL *curl;
+ CURLcode res;
+ gchar *http;
+ FILE *outfile;
+
/* Stop threads from entering unless j is incremented */
pthread_mutex_lock(&lock);
while(j < num_urls) {
- CURL *curl;
- gchar *http;
-
printf("j = %d\n", j);
http =
@@ -84,7 +86,7 @@ void *pull_one_url(void *NaN)
curl = curl_easy_init();
if(curl) {
- FILE *outfile = fopen(urls[j], "wb");
+ outfile = fopen(urls[j], "wb");
/* Set the URL and transfer type */
curl_easy_setopt(curl, CURLOPT_URL, http);
@@ -96,7 +98,7 @@ void *pull_one_url(void *NaN)
j++; /* critical line */
pthread_mutex_unlock(&lock);
- curl_easy_perform(curl);
+ res = curl_easy_perform(curl);
fclose(outfile);
printf("fclose\n");
@@ -129,13 +131,14 @@ void *create_thread(void *progress_bar)
{
pthread_t tid[NUMT];
int i;
+ int error;
/* Make sure I don't create more threads than urls. */
for(i = 0; i < NUMT && i < num_urls ; i++) {
- int error = pthread_create(&tid[i],
- NULL, /* default attributes please */
- pull_one_url,
- NULL);
+ error = pthread_create(&tid[i],
+ NULL, /* default attributes please */
+ pull_one_url,
+ NULL);
if(0 != error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else
@@ -144,7 +147,7 @@ void *create_thread(void *progress_bar)
/* Wait for all threads to terminate. */
for(i = 0; i < NUMT && i < num_urls; i++) {
- pthread_join(tid[i], NULL);
+ error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/smtp-authzid.c b/docs/examples/smtp-authzid.c
deleted file mode 100644
index decdb719d..000000000
--- a/docs/examples/smtp-authzid.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* <DESC>
- * Send e-mail on behalf of another user with SMTP
- * </DESC>
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <curl/curl.h>
-
-/*
- * This is a simple example show how to send an email using libcurl's SMTP
- * capabilities.
- *
- * Note that this example requires libcurl 7.66.0 or above.
- */
-
-/* The libcurl options want plain addresses, the viewable headers in the mail
- * can very well get a full name as well.
- */
-#define FROM_ADDR "<ursel@example.org>"
-#define SENDER_ADDR "<kurt@example.org>"
-#define TO_ADDR "<addressee@example.net>"
-
-#define FROM_MAIL "Ursel " FROM_ADDR
-#define SENDER_MAIL "Kurt " SENDER_ADDR
-#define TO_MAIL "A Receiver " TO_ADDR
-
-static const char *payload_text[] = {
- "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
- "To: " TO_MAIL "\r\n",
- "From: " FROM_MAIL "\r\n",
- "Sender: " SENDER_MAIL "\r\n",
- "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
- "rfcpedant.example.org>\r\n",
- "Subject: SMTP example message\r\n",
- "\r\n", /* empty line to divide headers from body, see RFC5322 */
- "The body of the message starts here.\r\n",
- "\r\n",
- "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
- "Check RFC5322.\r\n",
- NULL
-};
-
-struct upload_status {
- int lines_read;
-};
-
-static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
-{
- struct upload_status *upload_ctx = (struct upload_status *)userp;
- const char *data;
-
- if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
- return 0;
- }
-
- data = payload_text[upload_ctx->lines_read];
-
- if(data) {
- size_t len = strlen(data);
- memcpy(ptr, data, len);
- upload_ctx->lines_read++;
-
- return len;
- }
-
- return 0;
-}
-
-int main(void)
-{
- CURL *curl;
- CURLcode res = CURLE_OK;
- struct curl_slist *recipients = NULL;
- struct upload_status upload_ctx;
-
- upload_ctx.lines_read = 0;
-
- curl = curl_easy_init();
- if(curl) {
- /* This is the URL for your mailserver. In this example we connect to the
- smtp-submission port as we require an authenticated connection. */
- curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com:587");
-
- /* Set the username and password */
- curl_easy_setopt(curl, CURLOPT_USERNAME, "kurt");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
-
- /* Set the authorisation identity (identity to act as) */
- curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "ursel");
-
- /* Force PLAIN authentication */
- curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
-
- /* Note that this option isn't strictly required, omitting it will result
- * in libcurl sending the MAIL FROM command with empty sender data. All
- * autoresponses should have an empty reverse-path, and should be directed
- * to the address in the reverse-path which triggered them. Otherwise,
- * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
- * details.
- */
- curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);
-
- /* Add a recipient, in this particular case it corresponds to the
- * To: addressee in the header. */
- recipients = curl_slist_append(recipients, TO_ADDR);
- curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
-
- /* We're using a callback function to specify the payload (the headers and
- * body of the message). You could just use the CURLOPT_READDATA option to
- * specify a FILE pointer to read from. */
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
- curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
-
- /* Send the message */
- res = curl_easy_perform(curl);
-
- /* Check for errors */
- if(res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
-
- /* Free the list of recipients */
- curl_slist_free_all(recipients);
-
- /* curl won't send the QUIT command until you call cleanup, so you should
- * be able to re-use this connection for additional messages (setting
- * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
- * curl_easy_perform() again. It may not be a good idea to keep the
- * connection open for a very long time though (more than a few minutes
- * may result in the server timing out the connection), and you do want to
- * clean up in the end.
- */
- curl_easy_cleanup(curl);
- }
-
- return (int)res;
-}
diff --git a/docs/examples/smtp-mime.c b/docs/examples/smtp-mime.c
index 1cf575cc6..35997fa0e 100644
--- a/docs/examples/smtp-mime.c
+++ b/docs/examples/smtp-mime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,17 +70,16 @@ int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
+ struct curl_slist *headers = NULL;
+ struct curl_slist *recipients = NULL;
+ struct curl_slist *slist = NULL;
+ curl_mime *mime;
+ curl_mime *alt;
+ curl_mimepart *part;
+ const char **cpp;
curl = curl_easy_init();
if(curl) {
- struct curl_slist *headers = NULL;
- struct curl_slist *recipients = NULL;
- struct curl_slist *slist = NULL;
- curl_mime *mime;
- curl_mime *alt;
- curl_mimepart *part;
- const char **cpp;
-
/* This is the URL for your mailserver */
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
diff --git a/docs/examples/sslbackend.c b/docs/examples/sslbackend.c
index 14c230390..c1489a9aa 100644
--- a/docs/examples/sslbackend.c
+++ b/docs/examples/sslbackend.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
return 0;
}
- else if(isdigit((int)(unsigned char)*name)) {
+ else if(isdigit(*name)) {
int id = atoi(name);
result = curl_global_sslset((curl_sslbackend)id, NULL, NULL);
diff --git a/docs/examples/synctime.c b/docs/examples/synctime.c
index 29ceaa51d..d84cea913 100644
--- a/docs/examples/synctime.c
+++ b/docs/examples/synctime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -137,6 +137,7 @@ size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb,
size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
void *stream)
{
+ int i, RetVal;
char TmpStr1[26], TmpStr2[26];
(void)stream;
@@ -155,13 +156,11 @@ size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
TmpStr1 & 2? */
AutoSyncTime = 0;
else {
- int RetVal = sscanf((char *)(ptr), "Date: %s %hu %s %hu %hu:%hu:%hu",
- TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
- &SYSTime.wHour, &SYSTime.wMinute,
- &SYSTime.wSecond);
+ RetVal = sscanf((char *)(ptr), "Date: %s %hu %s %hu %hu:%hu:%hu",
+ TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
+ &SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond);
if(RetVal == 7) {
- int i;
SYSTime.wMilliseconds = 500; /* adjust to midpoint, 0.5 sec */
for(i = 0; i<12; i++) {
if(strcmp(MthStr[i], TmpStr2) == 0) {
@@ -258,15 +257,25 @@ int main(int argc, char *argv[])
{
CURL *curl;
conf_t conf[1];
+ int OptionIndex;
+ struct tm *lt;
+ struct tm *gmt;
+ time_t tt;
+ time_t tt_local;
+ time_t tt_gmt;
+ double tzonediffFloat;
+ int tzonediffWord;
+ char timeBuf[61];
+ char tzoneBuf[16];
int RetValue;
+ OptionIndex = 0;
ShowAllHeader = 0; /* Do not show HTTP Header */
AutoSyncTime = 0; /* Do not synchronise computer clock */
RetValue = 0; /* Successful Exit */
conf_init(conf);
if(argc > 1) {
- int OptionIndex = 0;
while(OptionIndex < argc) {
if(strncmp(argv[OptionIndex], "--server=", 9) == 0)
snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]);
@@ -299,16 +308,6 @@ int main(int argc, char *argv[])
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl) {
- struct tm *lt;
- struct tm *gmt;
- time_t tt;
- time_t tt_local;
- time_t tt_gmt;
- double tzonediffFloat;
- int tzonediffWord;
- char timeBuf[61];
- char tzoneBuf[16];
-
SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user);
/* Calculating time diff between GMT and localtime */
diff --git a/docs/examples/threaded-shared-conn.c b/docs/examples/threaded-shared-conn.c
index f20b8a460..e238b952e 100644
--- a/docs/examples/threaded-shared-conn.c
+++ b/docs/examples/threaded-shared-conn.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -117,6 +117,7 @@ int main(void)
{
pthread_t tid[NUM_THREADS];
int i;
+ int error;
CURLSH *share;
struct initurl url[NUM_THREADS];
@@ -131,7 +132,6 @@ int main(void)
init_locks();
for(i = 0; i< NUM_THREADS; i++) {
- int error;
url[i].url = URL;
url[i].share = share;
url[i].threadno = i;
@@ -144,7 +144,7 @@ int main(void)
/* now wait for all threads to terminate */
for(i = 0; i< NUM_THREADS; i++) {
- pthread_join(tid[i], NULL);
+ error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/threaded-ssl.c b/docs/examples/threaded-ssl.c
index f61d728d4..adf46292a 100644
--- a/docs/examples/threaded-ssl.c
+++ b/docs/examples/threaded-ssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,7 +29,7 @@
* (libgcrypt) so far.
*
* OpenSSL docs for this:
- * https://www.openssl.org/docs/man1.0.2/man3/CRYPTO_num_locks.html
+ * https://www.openssl.org/docs/crypto/threads.html
* gcrypt docs for this:
* https://gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
*/
@@ -135,6 +135,7 @@ int main(int argc, char **argv)
{
pthread_t tid[NUMT];
int i;
+ int error;
(void)argc; /* we don't use any arguments in this example */
(void)argv;
@@ -144,10 +145,10 @@ int main(int argc, char **argv)
init_locks();
for(i = 0; i< NUMT; i++) {
- int error = pthread_create(&tid[i],
- NULL, /* default attributes please */
- pull_one_url,
- (void *)urls[i]);
+ error = pthread_create(&tid[i],
+ NULL, /* default attributes please */
+ pull_one_url,
+ (void *)urls[i]);
if(0 != error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else
@@ -156,7 +157,7 @@ int main(int argc, char **argv)
/* now wait for all threads to terminate */
for(i = 0; i< NUMT; i++) {
- pthread_join(tid[i], NULL);
+ error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/docs/examples/usercertinmem.c b/docs/examples/usercertinmem.c
index 2dc264310..40505b0c0 100644
--- a/docs/examples/usercertinmem.c
+++ b/docs/examples/usercertinmem.c
@@ -177,25 +177,25 @@ int main(void)
CURL *ch;
CURLcode rv;
- curl_global_init(CURL_GLOBAL_ALL);
+ rv = curl_global_init(CURL_GLOBAL_ALL);
ch = curl_easy_init();
- curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
- curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
- curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
- curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
- curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
- curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
- curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
- curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
- curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+ rv = curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
+ rv = curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+ rv = curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
/* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is
no CA certificate*/
- curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
- curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
- curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
- curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
+ rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+ rv = curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
/* first try: retrieve page without user certificate and key -> will fail
*/
@@ -211,7 +211,7 @@ int main(void)
* load the certificate and key by installing a function doing the necessary
* "modifications" to the SSL CONTEXT just before link init
*/
- curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+ rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv = curl_easy_perform(ch);
if(rv == CURLE_OK) {
printf("*** transfer succeeded ***\n");
diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
index bd88c9c38..b4ff45dde 100644
--- a/docs/libcurl/Makefile.inc
+++ b/docs/libcurl/Makefile.inc
@@ -46,7 +46,6 @@ man_MANS = \
curl_multi_info_read.3 \
curl_multi_init.3 \
curl_multi_perform.3 \
- curl_multi_poll.3 \
curl_multi_remove_handle.3 \
curl_multi_setopt.3 \
curl_multi_socket.3 \
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
index 002c56c30..87c703a1b 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl easy handle
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index db84f6182..ec6ab7682 100644
--- a/docs/libcurl/curl_easy_duphandle.3
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
index 7d54c6c7b..e3000c6c3 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index 09a0a3db5..162c0331c 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_getinfo 3 "May 17, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_getinfo - extract information from a curl handle
@@ -158,9 +158,6 @@ Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP
.IP CURLINFO_CONTENT_TYPE
Content type from the Content-Type header.
See \fICURLINFO_CONTENT_TYPE(3)\fP
-.IP CURLINFO_RETRY_AFTER
-The value from the from the Retry-After header.
-See \fICURLINFO_RETRY_AFTER(3)\fP
.IP CURLINFO_PRIVATE
User's private data pointer.
See \fICURLINFO_PRIVATE(3)\fP
@@ -246,7 +243,7 @@ curl_easy_perform()
|--|--|--|--|--|--REDIRECT
.fi
.IP NAMELOOKUP
-\fICURLINFO_NAMELOOKUP_TIME\fP and \fICURLINFO_NAMELOOKUP_TIME_T\fP.
+\fICURLINFO_NAMELOOKUP_TIME\fP and \fIfICURLINFO_NAMELOOKUP_TIME_T\fP.
The time it took from the start until the name resolving was completed.
.IP CONNECT
\fICURLINFO_CONNECT_TIME\fP and \fICURLINFO_CONNECT_TIME_T\fP.
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 4b76c0253..0d96c612e 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl easy session
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index 472b524eb..4e651c7fe 100644
--- a/docs/libcurl/curl_easy_pause.3
+++ b/docs/libcurl/curl_easy_pause.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_pause - pause and unpause a connection
diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
index 2e45387e3..46e7586e7 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_perform - perform a blocking file transfer
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index d796a1b88..0b95c5631 100644
--- a/docs/libcurl/curl_easy_recv.3
+++ b/docs/libcurl/curl_easy_recv.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
diff --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
index e413c80a0..7837683af 100644
--- a/docs/libcurl/curl_easy_reset.3
+++ b/docs/libcurl/curl_easy_reset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
index dc54c8b94..a71fede15 100644
--- a/docs/libcurl/curl_easy_send.3
+++ b/docs/libcurl/curl_easy_send.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_send - sends raw data over an "easy" connection
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index a35c996e5..a40eb84c7 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_setopt 3 "August 09, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "March 03, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_setopt \- set options for a curl easy handle
@@ -257,8 +257,6 @@ TLS authentication methods. See \fICURLOPT_TLSAUTH_TYPE(3)\fP
Proxy TLS authentication methods. See \fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP
.IP CURLOPT_PROXYAUTH
HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP
-.IP CURLOPT_SASL_AUTHZID
-SASL authorisation identity (identity to act as). See \fICURLOPT_SASL_AUTHZID(3)\fP
.IP CURLOPT_SASL_IR
Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP
.IP CURLOPT_XOAUTH2_BEARER
@@ -471,8 +469,6 @@ Maximum number of connections in the connection pool. See \fICURLOPT_MAXCONNECTS
Use a new connection. \fICURLOPT_FRESH_CONNECT(3)\fP
.IP CURLOPT_FORBID_REUSE
Prevent subsequent connections from re-using this. See \fICURLOPT_FORBID_REUSE(3)\fP
-.IP CURLOPT_MAXAGE_CONN
-Limit the age of connections for reuse. See \fICURLOPT_MAXAGE_CONN(3)\fP
.IP CURLOPT_CONNECTTIMEOUT
Timeout for the connection phase. See \fICURLOPT_CONNECTTIMEOUT(3)\fP
.IP CURLOPT_CONNECTTIMEOUT_MS
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index 2a08f42b8..e388520ac 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_strerror - return string describing error code
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index 3188cfc34..87823536b 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_easy_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index 5ef8dd492..c13ab0a4e 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_escape 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_escape 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index 51b903c8f..f679735f6 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formadd 3 "December 11, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formadd 3 "December 11, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
index b9732fab8..22d6ce2b0 100644
--- a/docs/libcurl/curl_formfree.3
+++ b/docs/libcurl/curl_formfree.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formfree 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formfree 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
index a2054c3b5..5e86f5df6 100644
--- a/docs/libcurl/curl_formget.3
+++ b/docs/libcurl/curl_formget.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formget 3 "September 02, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formget 3 "September 02, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
index abaedea16..b809b23bf 100644
--- a/docs/libcurl/curl_free.3
+++ b/docs/libcurl/curl_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_free 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_free 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
index 1457d0b92..1e8c470ee 100644
--- a/docs/libcurl/curl_getdate.3
+++ b/docs/libcurl/curl_getdate.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getdate 3 "January 18, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_getdate 3 "January 18, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_getdate - Convert a date string to number of seconds
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
index 7cbabf6b9..d1628f953 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getenv 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_getenv 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_getenv - return value for environment name
diff --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
index eb731c606..97113d168 100644
--- a/docs/libcurl/curl_global_cleanup.3
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_global_cleanup - global libcurl cleanup
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
index 6c71388ac..1117a5413 100644
--- a/docs/libcurl/curl_global_init.3
+++ b/docs/libcurl/curl_global_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_init 3 "April 17, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_global_init - Global libcurl initialisation
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
index c3e99a822..53cce2ad9 100644
--- a/docs/libcurl/curl_global_init_mem.3
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_init_mem 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
@@ -60,8 +60,6 @@ to that man page for documentation.
.SH "CAUTION"
Manipulating these gives considerable powers to the application to severely
screw things up for libcurl. Take care!
-.SH AVAILABILITY
-Added in 7.12.0
.SH "SEE ALSO"
.BR curl_global_init "(3), "
.BR curl_global_cleanup "(3), "
diff --git a/docs/libcurl/curl_global_sslset.3 b/docs/libcurl/curl_global_sslset.3
index eaabbe402..e89463abe 100644
--- a/docs/libcurl/curl_global_sslset.3
+++ b/docs/libcurl/curl_global_sslset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_global_sslset - Select SSL backend to use with libcurl
diff --git a/docs/libcurl/curl_mime_addpart.3 b/docs/libcurl/curl_mime_addpart.3
index cf19bed32..9ff2032e3 100644
--- a/docs/libcurl/curl_mime_addpart.3
+++ b/docs/libcurl/curl_mime_addpart.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_addpart - append a new empty part to a mime structure
diff --git a/docs/libcurl/curl_mime_data.3 b/docs/libcurl/curl_mime_data.3
index 2d3588589..d58171a9c 100644
--- a/docs/libcurl/curl_mime_data.3
+++ b/docs/libcurl/curl_mime_data.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_data - set a mime part's body data from memory
diff --git a/docs/libcurl/curl_mime_data_cb.3 b/docs/libcurl/curl_mime_data_cb.3
index 6d985f8ff..8397b186d 100644
--- a/docs/libcurl/curl_mime_data_cb.3
+++ b/docs/libcurl/curl_mime_data_cb.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_data_cb - set a callback-based data source for a mime part's body
diff --git a/docs/libcurl/curl_mime_encoder.3 b/docs/libcurl/curl_mime_encoder.3
index d6213e601..b87da3780 100644
--- a/docs/libcurl/curl_mime_encoder.3
+++ b/docs/libcurl/curl_mime_encoder.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_encoder - set a mime part's encoder and content transfer encoding
diff --git a/docs/libcurl/curl_mime_filedata.3 b/docs/libcurl/curl_mime_filedata.3
index 259c10d42..7d0315deb 100644
--- a/docs/libcurl/curl_mime_filedata.3
+++ b/docs/libcurl/curl_mime_filedata.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_filedata - set a mime part's body data from a file contents
diff --git a/docs/libcurl/curl_mime_filename.3 b/docs/libcurl/curl_mime_filename.3
index 1b697c7d7..ed322aa08 100644
--- a/docs/libcurl/curl_mime_filename.3
+++ b/docs/libcurl/curl_mime_filename.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_filename - set a mime part's remote file name
diff --git a/docs/libcurl/curl_mime_free.3 b/docs/libcurl/curl_mime_free.3
index 383534dea..392a93792 100644
--- a/docs/libcurl/curl_mime_free.3
+++ b/docs/libcurl/curl_mime_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_free - free a previously built mime structure
diff --git a/docs/libcurl/curl_mime_headers.3 b/docs/libcurl/curl_mime_headers.3
index 39c65a4ba..6e9821b54 100644
--- a/docs/libcurl/curl_mime_headers.3
+++ b/docs/libcurl/curl_mime_headers.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_headers - set a mime part's custom headers
diff --git a/docs/libcurl/curl_mime_init.3 b/docs/libcurl/curl_mime_init.3
index 0afa6bfab..410da1ff7 100644
--- a/docs/libcurl/curl_mime_init.3
+++ b/docs/libcurl/curl_mime_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_init - create a mime handle
diff --git a/docs/libcurl/curl_mime_name.3 b/docs/libcurl/curl_mime_name.3
index 66789ef2b..86419fe14 100644
--- a/docs/libcurl/curl_mime_name.3
+++ b/docs/libcurl/curl_mime_name.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_name - set a mime part's name
diff --git a/docs/libcurl/curl_mime_subparts.3 b/docs/libcurl/curl_mime_subparts.3
index bfb4f244f..eb6cc793e 100644
--- a/docs/libcurl/curl_mime_subparts.3
+++ b/docs/libcurl/curl_mime_subparts.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_subparts - set subparts of a multipart mime part
diff --git a/docs/libcurl/curl_mime_type.3 b/docs/libcurl/curl_mime_type.3
index 931eeaf5f..3245987c3 100644
--- a/docs/libcurl/curl_mime_type.3
+++ b/docs/libcurl/curl_mime_type.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_mime_type - set a mime part's content type
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index 94a78bb01..cc0a05a52 100644
--- a/docs/libcurl/curl_mprintf.3
+++ b/docs/libcurl/curl_mprintf.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_printf 3 "April 01, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
diff --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
index 3ced4886b..52e7a9950 100644
--- a/docs/libcurl/curl_multi_add_handle.3
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
index 03240d8a3..cbb20503a 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_assign \- set data to associate with an internal socket
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
index b97eebd6a..55d7a1020 100644
--- a/docs/libcurl/curl_multi_cleanup.3
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_cleanup - close down a multi session
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
index 2a9411ef3..7cf078c9b 100644
--- a/docs/libcurl/curl_multi_fdset.3
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
index 50633afb4..51bcec304 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_info_read - read multi stack informationals
diff --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
index 9f1a879ca..2325dee43 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_init - create a multi handle
diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
index a2db4d0ff..21b67a00f 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_perform 3 "October 31, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
@@ -47,8 +47,6 @@ know that there is one or more transfers less "running". You can then call
\fIcurl_multi_info_read(3)\fP to get information about each individual
completed transfer, and that returned info includes CURLcode and more. If an
added handle fails very quickly, it may never be counted as a running_handle.
-You could use \fIcurl_multi_info_read(3)\fP to track actual status of the
-added handles in that case.
When \fIrunning_handles\fP is set to zero (0) on the return of this function,
there is no longer any transfers in progress.
diff --git a/docs/libcurl/curl_multi_poll.3 b/docs/libcurl/curl_multi_poll.3
deleted file mode 100644
index 481858ef2..000000000
--- a/docs/libcurl/curl_multi_poll.3
+++ /dev/null
@@ -1,111 +0,0 @@
-.\" **************************************************************************
-.\" * _ _ ____ _
-.\" * Project ___| | | | _ \| |
-.\" * / __| | | | |_) | |
-.\" * | (__| |_| | _ <| |___
-.\" * \___|\___/|_| \_\_____|
-.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-.\" *
-.\" * This software is licensed as described in the file COPYING, which
-.\" * you should have received as part of this distribution. The terms
-.\" * are also available at https://curl.haxx.se/docs/copyright.html.
-.\" *
-.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-.\" * copies of the Software, and permit persons to whom the Software is
-.\" * furnished to do so, under the terms of the COPYING file.
-.\" *
-.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-.\" * KIND, either express or implied.
-.\" *
-.\" **************************************************************************
-.TH curl_multi_poll 3 "July 29, 2019" "libcurl 7.67.0" "libcurl Manual"
-
-.SH NAME
-curl_multi_poll - polls on all easy handles in a multi handle
-.SH SYNOPSIS
-.nf
-#include <curl/curl.h>
-
-CURLMcode curl_multi_poll(CURLM *multi_handle,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *numfds);
-.ad
-.SH DESCRIPTION
-\fIcurl_multi_poll(3)\fP polls all file descriptors used by the curl easy
-handles contained in the given multi handle set. It will block until activity
-is detected on at least one of the handles or \fItimeout_ms\fP has passed.
-Alternatively, if the multi handle has a pending internal timeout that has a
-shorter expiry time than \fItimeout_ms\fP, that shorter time will be used
-instead to make sure timeout accuracy is reasonably kept.
-
-The calling application may pass additional curl_waitfd structures which are
-similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
-
-On completion, if \fInumfds\fP is non-NULL, it will be populated with the
-total number of file descriptors on which interesting events occurred. This
-number can include both libcurl internal descriptors as well as descriptors
-provided in \fIextra_fds\fP.
-
-If no extra file descriptors are provided and libcurl has no file descriptor
-to offer to wait for, this function will instead wait during \fItimeout_ms\fP
-milliseconds (or shorter if an internal timer indicates so). This is the
-detail that makes this function different than \fIcurl_multi_wait(3)\fP.
-
-This function is encouraged to be used instead of select(3) when using the
-multi interface to allow applications to easier circumvent the common problem
-with 1024 maximum file descriptors.
-.SH curl_waitfd
-.nf
-struct curl_waitfd {
- curl_socket_t fd;
- short events;
- short revents;
-};
-.fi
-.IP CURL_WAIT_POLLIN
-Bit flag to curl_waitfd.events indicating the socket should poll on read
-events such as new data received.
-.IP CURL_WAIT_POLLPRI
-Bit flag to curl_waitfd.events indicating the socket should poll on high
-priority read events such as out of band data.
-.IP CURL_WAIT_POLLOUT
-Bit flag to curl_waitfd.events indicating the socket should poll on write
-events such as the socket being clear to write without blocking.
-.SH EXAMPLE
-.nf
-CURL *easy_handle;
-CURLM *multi_handle;
-
-/* add the individual easy handle */
-curl_multi_add_handle(multi_handle, easy_handle);
-
-do {
- CURLMcode mc;
- int numfds;
-
- mc = curl_multi_perform(multi_handle, &still_running);
-
- if(mc == CURLM_OK) {
- /* wait for activity or timeout */
- mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
- }
-
- if(mc != CURLM_OK) {
- fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
- break;
- }
-
-} while(still_running);
-
-curl_multi_remove_handle(multi_handle, easy_handle);
-.fi
-.SH RETURN VALUE
-CURLMcode type, general libcurl multi interface error code. See
-\fIlibcurl-errors(3)\fP
-.SH AVAILABILITY
-This function was added in libcurl 7.66.0.
-.SH "SEE ALSO"
-.BR curl_multi_fdset "(3), " curl_multi_perform "(3), " curl_multi_wait "(3)"
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
index a9f664e82..accb07f51 100644
--- a/docs/libcurl/curl_multi_remove_handle.3
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
index 44dba4ad7..61c466fff 100644
--- a/docs/libcurl/curl_multi_setopt.3
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_setopt \- set options for a curl multi handle
@@ -68,8 +68,6 @@ See \fICURLMOPT_SOCKETDATA(3)\fP
See \fICURLMOPT_TIMERFUNCTION(3)\fP
.IP CURLMOPT_TIMERDATA
See \fICURLMOPT_TIMERDATA(3)\fP
-.IP CURLMOPT_MAX_CONCURRENT_STREAMS
-See \fICURLMOPT_MAX_CONCURRENT_STREAMS(3)\fP
.SH RETURNS
The standard CURLMcode for multi interface error codes. Note that it returns a
CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
diff --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
index e82d2e05e..6967acf6d 100644
--- a/docs/libcurl/curl_multi_socket.3
+++ b/docs/libcurl/curl_multi_socket.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_socket \- reads/writes available data
diff --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
index f3fed74da..8b4ce700d 100644
--- a/docs/libcurl/curl_multi_socket_action.3
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 30, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
@@ -44,14 +44,15 @@ libcurl will test the descriptor internally. It is also permissible to pass
CURL_SOCKET_TIMEOUT to the \fBsockfd\fP parameter in order to initiate the
whole process or when a timeout occurs.
-At return, \fBrunning_handles\fP points to the number of running easy handles
-within the multi handle. When this number reaches zero, all transfers are
-complete/done. When you call \fIcurl_multi_socket_action(3)\fP on a specific
-socket and the counter decreases by one, it DOES NOT necessarily mean that
-this exact socket/transfer is the one that completed. Use
-\fIcurl_multi_info_read(3)\fP to figure out which easy handle that completed.
+At return, \fBrunning_handles\fP points to the number
+of running easy handles within the multi handle. When this number reaches
+zero, all transfers are complete/done. When you call
+\fIcurl_multi_socket_action(3)\fP on a specific socket and the counter
+decreases by one, it DOES NOT necessarily mean that this exact socket/transfer
+is the one that completed. Use \fIcurl_multi_info_read(3)\fP to figure out
+which easy handle that completed.
-The \fIcurl_multi_socket_action(3)\fP function informs the application about
+The \fIcurl_multi_socket_action(3)\fP functions inform the application about
updates in the socket (file descriptor) status by doing none, one, or multiple
calls to the socket callback function set with the
\fICURLMOPT_SOCKETFUNCTION(3)\fP option to \fIcurl_multi_setopt(3)\fP. They
@@ -66,6 +67,65 @@ timeout action: call the \fIcurl_multi_socket_action(3)\fP function with the
\fIcurl_multi_timeout(3)\fP function to poll the value at any given time, but
for an event-based system using the callback is far better than relying on
polling the timeout value.
+.SH "CALLBACK DETAILS"
+
+The socket \fBcallback\fP function uses a prototype like this
+.nf
+
+ int curl_socket_callback(CURL *easy, /* easy handle */
+ curl_socket_t s, /* socket */
+ int action, /* see values below */
+ void *userp, /* private callback pointer */
+ void *socketp); /* private socket pointer,
+ \fBNULL\fP if not
+ previously assigned with
+ \fIcurl_multi_assign(3)\fP */
+
+.fi
+The callback MUST return 0.
+
+The \fIeasy\fP argument is a pointer to the easy handle that deals with this
+particular socket. Note that a single handle may work with several sockets
+simultaneously.
+
+The \fIs\fP argument is the actual socket value as you use it within your
+system.
+
+The \fIaction\fP argument to the callback has one of five values:
+.RS
+.IP "CURL_POLL_NONE (0)"
+register, not interested in readiness (yet)
+.IP "CURL_POLL_IN (1)"
+register, interested in read readiness
+.IP "CURL_POLL_OUT (2)"
+register, interested in write readiness
+.IP "CURL_POLL_INOUT (3)"
+register, interested in both read and write readiness
+.IP "CURL_POLL_REMOVE (4)"
+unregister
+.RE
+
+The \fIsocketp\fP argument is a private pointer you have previously set with
+\fIcurl_multi_assign(3)\fP to be associated with the \fIs\fP socket. If no
+pointer has been set, socketp will be NULL. This argument is of course a
+service to applications that want to keep certain data or structs that are
+strictly associated to the given socket.
+
+The \fIuserp\fP argument is a private pointer you have previously set with
+\fIcurl_multi_setopt(3)\fP and the \fICURLMOPT_SOCKETDATA(3)\fP option.
+.SH "RETURN VALUE"
+CURLMcode type, general libcurl multi interface error code.
+
+Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
+basically means that you should call \fIcurl_multi_socket_action(3)\fP again
+before you wait for more actions on libcurl's sockets. You don't have to do it
+immediately, but the return code means that libcurl may have more data
+available to return or that there may be more data to send off before it is
+"satisfied".
+
+The return code from this function is for the whole multi stack. Problems
+still might have occurred on individual transfers even when one of these
+functions return OK.
.SH "TYPICAL USAGE"
1. Create a multi handle
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
index 839d89dfb..e486e8f3d 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_strerror - return string describing error code
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index 08fe54b0d..39d206761 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
index aeaf989dd..0651243b4 100644
--- a/docs/libcurl/curl_multi_wait.3
+++ b/docs/libcurl/curl_multi_wait.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wait 3 "October 31, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_wait 3 "March 09, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
@@ -92,7 +92,7 @@ do {
}
if(mc != CURLM_OK) {
- fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
+ fprintf(stderr, "curl_multi failed, code %d.\n", mc);
break;
}
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
index 325e759c7..ab5c5c98c 100644
--- a/docs/libcurl/curl_share_cleanup.3
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_share_cleanup - Clean up a shared object
diff --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
index 40df3c1fb..34b650bd6 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_init 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_init 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_share_init - Create a shared object
diff --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
index be034bf42..fe0001418 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_setopt 3 "June 04, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_setopt 3 "May 28, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_share_setopt - Set options for a shared object
@@ -38,8 +38,8 @@ prototype:
void lock_function(CURL *handle, curl_lock_data data, curl_lock_access access,
void *userptr);
-The \fIdata\fP argument tells what kind of data libcurl wants to lock. Make
-sure that the callback uses a different lock for each kind of data.
+\fIdata\fP defines what data libcurl wants to lock, and you must make sure that
+only one lock is given at any time for each kind of data.
\fIaccess\fP defines what access type libcurl wants, shared or single.
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index c6b3f9cc8..04e0d63e8 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_share_strerror - return string describing error code
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index c0603cbf3..46797e27e 100644
--- a/docs/libcurl/curl_slist_append.3
+++ b/docs/libcurl/curl_slist_append.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_slist_append - add a string to an slist
diff --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
index 69bd467b7..cdda0fc68 100644
--- a/docs/libcurl/curl_slist_free_all.3
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_slist_free_all - free an entire curl_slist list
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
index 4ab8ce288..ae144292d 100644
--- a/docs/libcurl/curl_strequal.3
+++ b/docs/libcurl/curl_strequal.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_strequal 3 "June 29, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
index 5d8068b20..3c3bab3ce 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_unescape 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_unescape 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_url.3 b/docs/libcurl/curl_url.3
index 55ef54c6c..8f2e7495d 100644
--- a/docs/libcurl/curl_url.3
+++ b/docs/libcurl/curl_url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url 3 "March 22, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url 3 "March 22, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_url - returns a new CURLU handle
diff --git a/docs/libcurl/curl_url_cleanup.3 b/docs/libcurl/curl_url_cleanup.3
index 8588b5a99..f79e83b9f 100644
--- a/docs/libcurl/curl_url_cleanup.3
+++ b/docs/libcurl/curl_url_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_url_cleanup - free a CURLU handle
diff --git a/docs/libcurl/curl_url_dup.3 b/docs/libcurl/curl_url_dup.3
index b9b3270ec..5bd75ff20 100644
--- a/docs/libcurl/curl_url_dup.3
+++ b/docs/libcurl/curl_url_dup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_url_dup - duplicate a CURLU handle
diff --git a/docs/libcurl/curl_url_get.3 b/docs/libcurl/curl_url_get.3
index e18af64a6..4cf32a5dd 100644
--- a/docs/libcurl/curl_url_get.3
+++ b/docs/libcurl/curl_url_get.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_get 3 "September 25, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_get 3 "October 08, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_url_get - extract a part from a URL
@@ -77,11 +77,6 @@ Scheme cannot be URL decoded on get.
.IP CURLUPART_PASSWORD
.IP CURLUPART_OPTIONS
.IP CURLUPART_HOST
-The host name. If it is an IPv6 numeric address, the zoneid will not be part
-of it but is provided separately in \fICURLUPART_ZONEID\fP. IPv6 numerical
-addresses are returned within brackets ([]).
-.IP CURLUPART_ZONEID
-If the host name is a numeric IPv6 address, this field might also be set.
.IP CURLUPART_PORT
Port cannot be URL decoded on get.
.IP CURLUPART_PATH
@@ -110,7 +105,7 @@ If this function returns an error, no URL part is returned.
}
.fi
.SH AVAILABILITY
-Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
+Added in curl 7.62.0
.SH "SEE ALSO"
.BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_set "(3), "
.BR curl_url_dup "(3), "
diff --git a/docs/libcurl/curl_url_set.3 b/docs/libcurl/curl_url_set.3
index ca5b35796..e1b3c33e6 100644
--- a/docs/libcurl/curl_url_set.3
+++ b/docs/libcurl/curl_url_set.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_set 3 "September 25, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_set 3 "November 06, 2018" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_url_set - set a URL part
@@ -61,15 +61,10 @@ Scheme cannot be URL decoded on set.
.IP CURLUPART_PASSWORD
.IP CURLUPART_OPTIONS
.IP CURLUPART_HOST
-The host name. If it is IDNA the string must then be encoded as your locale
-says or UTF-8 (when WinIDN is used). If it is a bracketed IPv6 numeric address
-it may contain a zone id (or you can use CURLUPART_ZONEID).
-.IP CURLUPART_ZONEID
-If the host name is a numeric IPv6 address, this field can also be set.
+The host name can use IDNA. The string must then be encoded as your locale
+says or UTF-8 (when winidn is used).
.IP CURLUPART_PORT
-Port cannot be URL encoded on set. The given port number is provided as a
-string and the decimal number must be between 1 and 65535. Anything else will
-return an error.
+Port cannot be URL encoded on set.
.IP CURLUPART_PATH
If a path is set in the URL without a leading slash, a slash will be inserted
automatically when this URL is read from the handle.
@@ -113,12 +108,6 @@ instead "guesses" which scheme that was intended based on the host name. If
the outermost sub-domain name matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then
that scheme will be used, otherwise it picks HTTP. Conflicts with the
\fICURLU_DEFAULT_SCHEME\fP option which takes precedence if both are set.
-.IP CURLU_NO_AUTHORITY
-If set, skips authority checks. The RFC allows individual schemes to omit the
-host part (normally the only mandatory part of the authority), but libcurl
-cannot know whether this is permitted for custom schemes. Specifying the flag
-permits empty authority sections, similar to how file scheme is handled.
-
.SH RETURN VALUE
Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
fine.
@@ -137,7 +126,7 @@ If this function returns an error, no URL part is returned.
curl_url_cleanup(url);
.fi
.SH AVAILABILITY
-Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
+Added in curl 7.62.0
.SH "SEE ALSO"
.BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_get "(3), "
.BR curl_url_dup "(3), "
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
index 42a2d675c..5e58b5303 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_version 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_version 3 "February 03, 2016" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_version - returns the libcurl version string
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index 25bd5de8a..e47eb6e2f 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_version_info 3 "August 13, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_version_info 3 "January 29, 2019" "libcurl 7.64.1" "libcurl Manual"
.SH NAME
curl_version_info - returns run-time libcurl version info
@@ -79,15 +79,6 @@ typedef struct {
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *brotli_version; /* human readable string. */
- /* when 'age is CURLVERSION_SIXTH or alter (7.66.0 or later), these fields
- also exist */
- unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
- (MAJOR << 16) | (MINOR << 8) | PATCH */
- const char *nghttp2_version; /* human readable string. */
-
- const char *quic_version; /* human readable quic (+ HTTP/3) library +
- version or NULL */
-
} curl_version_info_data;
.fi
@@ -109,40 +100,6 @@ environment.
\fIfeatures\fP can have none, one or more bits set, and the currently defined
bits are:
.RS
-.IP CURL_VERSION_ALTSVC
-HTTP Alt-Svc parsing and the associated options (Added in 7.64.1)
-.IP CURL_VERSION_ASYNCHDNS
-libcurl was built with support for asynchronous name lookups, which allows
-more exact timeouts (even on Windows) and less blocking when using the multi
-interface. (added in 7.10.7)
-.IP CURL_VERSION_BROTLI
-supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
-.IP CURL_VERSION_CONV
-libcurl was built with support for character conversions, as provided by the
-CURLOPT_CONV_* callbacks. (Added in 7.15.4)
-.IP CURL_VERSION_CURLDEBUG
-libcurl was built with memory tracking debug capabilities. This is mainly of
-interest for libcurl hackers. (added in 7.19.6)
-.IP CURL_VERSION_DEBUG
-libcurl was built with debug capabilities (added in 7.10.6)
-.IP CURL_VERSION_GSSAPI
-libcurl was built with support for GSS-API. This makes libcurl use provided
-functions for Kerberos and SPNEGO authentication. It also allows libcurl
-to use the current user credentials without the app having to pass them on.
-(Added in 7.38.0)
-.IP CURL_VERSION_GSSNEGOTIATE
-supports HTTP GSS-Negotiate (added in 7.10.6)
-.IP CURL_VERSION_HTTPS_PROXY
-libcurl was built with support for HTTPS-proxy.
-(Added in 7.52.0)
-.IP CURL_VERSION_HTTP2
-libcurl was built with support for HTTP2.
-(Added in 7.33.0)
-.IP CURL_VERSION_HTTP3
-HTTP/3 and QUIC support are built-in (Added in 7.66.0)
-.IP CURL_VERSION_IDN
-libcurl was built with support for IDNA, domain names with international
-letters. (Added in 7.12.0)
.IP CURL_VERSION_IPV6
supports IPv6
.IP CURL_VERSION_KERBEROS4
@@ -150,38 +107,68 @@ supports Kerberos V4 (when using FTP)
.IP CURL_VERSION_KERBEROS5
supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy
(Added in 7.40.0)
-.IP CURL_VERSION_LARGEFILE
-libcurl was built with support for large files. (Added in 7.11.1)
+.IP CURL_VERSION_SSL
+supports SSL (HTTPS/FTPS) (Added in 7.10)
.IP CURL_VERSION_LIBZ
supports HTTP deflate using libz (Added in 7.10)
-.IP CURL_VERSION_MULTI_SSL
-libcurl was built with multiple SSL backends. For details, see
-\fIcurl_global_sslset(3)\fP.
-(Added in 7.56.0)
.IP CURL_VERSION_NTLM
supports HTTP NTLM (added in 7.10.6)
-.IP CURL_VERSION_NTLM_WB
-libcurl was built with support for NTLM delegation to a winbind helper.
-(Added in 7.22.0)
-.IP CURL_VERSION_PSL
-libcurl was built with support for Mozilla's Public Suffix List. This makes
-libcurl ignore cookies with a domain that's on the list.
-(Added in 7.47.0)
+.IP CURL_VERSION_GSSNEGOTIATE
+supports HTTP GSS-Negotiate (added in 7.10.6)
+.IP CURL_VERSION_DEBUG
+libcurl was built with debug capabilities (added in 7.10.6)
+.IP CURL_VERSION_CURLDEBUG
+libcurl was built with memory tracking debug capabilities. This is mainly of
+interest for libcurl hackers. (added in 7.19.6)
+.IP CURL_VERSION_ASYNCHDNS
+libcurl was built with support for asynchronous name lookups, which allows
+more exact timeouts (even on Windows) and less blocking when using the multi
+interface. (added in 7.10.7)
.IP CURL_VERSION_SPNEGO
libcurl was built with support for SPNEGO authentication (Simple and Protected
GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8)
-.IP CURL_VERSION_SSL
-supports SSL (HTTPS/FTPS) (Added in 7.10)
+.IP CURL_VERSION_LARGEFILE
+libcurl was built with support for large files. (Added in 7.11.1)
+.IP CURL_VERSION_IDN
+libcurl was built with support for IDNA, domain names with international
+letters. (Added in 7.12.0)
.IP CURL_VERSION_SSPI
libcurl was built with support for SSPI. This is only available on Windows and
makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
Digest authentication. It also allows libcurl to use the current user
credentials without the app having to pass them on. (Added in 7.13.2)
+.IP CURL_VERSION_GSSAPI
+libcurl was built with support for GSS-API. This makes libcurl use provided
+functions for Kerberos and SPNEGO authentication. It also allows libcurl
+to use the current user credentials without the app having to pass them on.
+(Added in 7.38.0)
+.IP CURL_VERSION_CONV
+libcurl was built with support for character conversions, as provided by the
+CURLOPT_CONV_* callbacks. (Added in 7.15.4)
.IP CURL_VERSION_TLSAUTH_SRP
libcurl was built with support for TLS-SRP. (Added in 7.21.4)
+.IP CURL_VERSION_NTLM_WB
+libcurl was built with support for NTLM delegation to a winbind helper.
+(Added in 7.22.0)
+.IP CURL_VERSION_HTTP2
+libcurl was built with support for HTTP2.
+(Added in 7.33.0)
.IP CURL_VERSION_UNIX_SOCKETS
libcurl was built with support for Unix domain sockets.
(Added in 7.40.0)
+.IP CURL_VERSION_PSL
+libcurl was built with support for Mozilla's Public Suffix List. This makes
+libcurl ignore cookies with a domain that's on the list.
+(Added in 7.47.0)
+.IP CURL_VERSION_HTTPS_PROXY
+libcurl was built with support for HTTPS-proxy.
+(Added in 7.52.0)
+.IP CURL_VERSION_MULTI_SSL
+libcurl was built with multiple SSL backends. For details, see
+\fIcurl_global_sslset(3)\fP.
+(Added in 7.56.0)
+.IP CURL_VERSION_BROTLI
+supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
.RE
\fIssl_version\fP is an ASCII string for the TLS library name + version
used. If libcurl has no SSL support, this is NULL. For example "Schannel",
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index 02479acd2..9c03567f0 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "February 03, 2016" "libcurl 7.67.0" "libcurl easy interface"
+.TH libcurl 3 "February 03, 2016" "libcurl 7.64.1" "libcurl easy interface"
.SH NAME
libcurl-easy \- easy interface overview
diff --git a/docs/libcurl/libcurl-env.3 b/docs/libcurl/libcurl-env.3
index 0404570f0..f750976ef 100644
--- a/docs/libcurl/libcurl-env.3
+++ b/docs/libcurl/libcurl-env.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-env 3 "April 17, 2018" "libcurl 7.67.0" "libcurl environment variables"
+.TH libcurl-env 3 "April 17, 2018" "libcurl 7.64.1" "libcurl environment variables"
.SH NAME
libcurl-env \- environment variables libcurl understands
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index b3579fedb..3a4b8534c 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-errors 3 "October 31, 2019" "libcurl 7.67.0" "libcurl errors"
+.TH libcurl-errors 3 "November 19, 2018" "libcurl 7.64.1" "libcurl errors"
.SH NAME
libcurl-errors \- error codes in libcurl
@@ -255,8 +255,6 @@ Status returned failure when asked with \fICURLOPT_SSL_VERIFYSTATUS(3)\fP.
Stream error in the HTTP/2 framing layer.
.IP "CURLE_RECURSIVE_API_CALL (93)"
An API function was called from inside a callback.
-.IP "CURLE_AUTH_ERROR (94)"
-An authentication function returned an error.
.IP "CURLE_OBSOLETE*"
These error codes will never be returned. They were used in an old libcurl
version and are currently unused.
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
index c457c158d..5d4216ba6 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-multi 3 "October 31, 2019" "libcurl 7.67.0" "libcurl multi interface"
+.TH libcurl-multi 3 "June 30, 2018" "libcurl 7.64.1" "libcurl multi interface"
.SH NAME
libcurl-multi \- how to use the multi interface
@@ -98,7 +98,8 @@ period for your select() calls.
\fIcurl_multi_perform(3)\fP stores the number of still running transfers in
one of its input arguments, and by reading that you can figure out when all
the transfers in the multi handles are done. 'done' does not mean
-successful. One or more of the transfers may have failed.
+successful. One or more of the transfers may have failed. Tracking when this
+number changes, you know when one or more transfers are done.
To get information about completed transfers, to figure out success or not and
similar, \fIcurl_multi_info_read(3)\fP should be called. It can return a
diff --git a/docs/libcurl/libcurl-security.3 b/docs/libcurl/libcurl-security.3
index 4d3980281..16d7995f2 100644
--- a/docs/libcurl/libcurl-security.3
+++ b/docs/libcurl/libcurl-security.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-security 3 "July 16, 2019" "libcurl 7.67.0" "libcurl security"
+.TH libcurl-security 3 "September 23, 2018" "libcurl 7.64.1" "libcurl security"
.SH NAME
libcurl-security \- security considerations when using libcurl
@@ -98,8 +98,8 @@ Never ever switch off certificate verification.
The \fICURLOPT_FOLLOWLOCATION(3)\fP option automatically follows HTTP
redirects sent by a remote server. These redirects can refer to any kind of
URL, not just HTTP. libcurl restricts the protocols allowed to be used in
-redirects for security reasons: only HTTP, HTTPS, FTP and FTPS are
-enabled by default. Applications may opt to restrict that set further.
+redirects for security reasons: FILE, SCP, SMB and SMBS are disabled by
+default. Applications are encouraged to restrict that set further.
A redirect to a file: URL would cause the libcurl to read (or write) arbitrary
files from the local filesystem. If the application returns the data back to
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index e054a54e4..9f5aa18d7 100644
--- a/docs/libcurl/libcurl-share.3
+++ b/docs/libcurl/libcurl-share.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-share 3 "November 27, 2017" "libcurl 7.67.0" "libcurl share interface"
+.TH libcurl-share 3 "November 27, 2017" "libcurl 7.64.1" "libcurl share interface"
.SH NAME
libcurl-share \- how to use the share interface
diff --git a/docs/libcurl/libcurl-symbols.3 b/docs/libcurl/libcurl-symbols.3
index ec2e4922f..9fc0653d9 100644
--- a/docs/libcurl/libcurl-symbols.3
+++ b/docs/libcurl/libcurl-symbols.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-symbols 3 "nov 6, 2019" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "mar 27, 2019" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
@@ -35,6 +35,8 @@ The last version that featured the specific symbol. Using the symbol in source
code will make it no longer compile error-free after that specified version.
This man page is automatically generated from the symbols-in-versions file.
+.IP CURLALTSVC_ALTUSED
+Introduced in 7.64.1
.IP CURLALTSVC_H1
Introduced in 7.64.1
.IP CURLALTSVC_H2
@@ -90,8 +92,6 @@ Introduced in 7.1
Introduced in 7.18.2
.IP CURLE_ALREADY_COMPLETE
Introduced in 7.7.2
-.IP CURLE_AUTH_ERROR
-Introduced in 7.66.0
.IP CURLE_BAD_CALLING_ORDER
Introduced in 7.1
Deprecated since 7.17.0
@@ -596,8 +596,6 @@ Introduced in 7.18.2
Introduced in 7.4.1
.IP CURLINFO_RESPONSE_CODE
Introduced in 7.10.8
-.IP CURLINFO_RETRY_AFTER
-Introduced in 7.66.0
.IP CURLINFO_RTSP_CLIENT_CSEQ
Introduced in 7.20.0
.IP CURLINFO_RTSP_CSEQ_RECV
@@ -703,8 +701,6 @@ Introduced in 7.30.0
Introduced in 7.30.0
.IP CURLMOPT_MAX_TOTAL_CONNECTIONS
Introduced in 7.30.0
-.IP CURLMOPT_MAX_CONCURRENT_STREAMS
-Introduced in 7.67.0
.IP CURLMOPT_PIPELINING
Introduced in 7.16.0
.IP CURLMOPT_PIPELINING_SERVER_BL
@@ -759,8 +755,6 @@ Introduced in 7.1
Introduced in 7.11.0
.IP CURLOPTTYPE_STRINGPOINT
Introduced in 7.46.0
-.IP CURLOPTTYPE_SLISTPOINT
-Introduced in 7.65.2
.IP CURLOPT_ABSTRACT_UNIX_SOCKET
Introduced in 7.53.0
.IP CURLOPT_ACCEPTTIMEOUT_MS
@@ -1010,8 +1004,6 @@ Introduced in 7.25.0
Introduced in 7.20.0
.IP CURLOPT_MAIL_RCPT
Introduced in 7.20.0
-.IP CURLOPT_MAXAGE_CONN
-Introduced in 7.65.0
.IP CURLOPT_MAXCONNECTS
Introduced in 7.7
.IP CURLOPT_MAXFILESIZE
@@ -1202,8 +1194,6 @@ Introduced in 7.20.0
Introduced in 7.20.0
.IP CURLOPT_RTSP_TRANSPORT
Introduced in 7.20.0
-.IP CURLOPT_SASL_AUTHZID
-Introduced in 7.66.0
.IP CURLOPT_SASL_IR
Introduced in 7.31.0
.IP CURLOPT_SEEKDATA
@@ -1631,8 +1621,6 @@ Introduced in 7.62.0
Introduced in 7.62.0
.IP CURLUPART_USER
Introduced in 7.62.0
-.IP CURLUPART_ZONEID
-Introduced in 7.65.0
.IP CURLUSESSL_ALL
Introduced in 7.17.0
.IP CURLUSESSL_CONTROL
@@ -1655,8 +1643,6 @@ Introduced in 7.62.0
Introduced in 7.62.0
.IP CURLU_NO_DEFAULT_PORT
Introduced in 7.62.0
-.IP CURLU_NO_AUTHORITY
-Introduced in 7.67.0
.IP CURLU_PATH_AS_IS
Introduced in 7.62.0
.IP CURLU_URLDECODE
@@ -1675,8 +1661,6 @@ Introduced in 7.10
Introduced in 7.11.1
.IP CURLVERSION_THIRD
Introduced in 7.12.0
-.IP CURLVERSION_SIXTH
-Introduced in 7.66.0
.IP CURL_CHUNK_BGN_FUNC_FAIL
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_OK
@@ -1773,8 +1757,6 @@ Introduced in 7.47.0
Introduced in 7.33.0
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Introduced in 7.49.0
-.IP CURL_HTTP_VERSION_3
-Introduced in 7.66.0
.IP CURL_HTTP_VERSION_NONE
Introduced in 7.9.1
.IP CURL_IPRESOLVE_V4
@@ -1957,8 +1939,6 @@ Introduced in 7.15.4
Introduced in 7.19.6
.IP CURL_VERSION_DEBUG
Introduced in 7.10.6
-.IP CURL_VERSION_ESNI
-Introduced in 7.67.0
.IP CURL_VERSION_GSSAPI
Introduced in 7.38.0
.IP CURL_VERSION_GSSNEGOTIATE
@@ -1966,8 +1946,6 @@ Introduced in 7.10.6
Deprecated since 7.38.0
.IP CURL_VERSION_HTTP2
Introduced in 7.33.0
-.IP CURL_VERSION_HTTP3
-Introduced in 7.66.0
.IP CURL_VERSION_HTTPS_PROXY
Introduced in 7.52.0
.IP CURL_VERSION_IDN
diff --git a/docs/libcurl/libcurl-thread.3 b/docs/libcurl/libcurl-thread.3
index b608b8957..73b00deb2 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2015 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.67.0" "libcurl thread safety"
+.TH libcurl-thread 3 "October 30, 2018" "libcurl 7.64.1" "libcurl thread safety"
.SH NAME
libcurl-thread \- libcurl thread safety
@@ -42,15 +42,14 @@ then of course using the underlying SSL library multi-threaded and those libs
might have their own requirements on this issue. You may need to provide one
or two functions to allow it to function properly:
.IP OpenSSL
-OpenSSL 1.1.0+ "can be safely used in multi-threaded applications provided that
-support for the underlying OS threading API is built-in." In that case the
-engine is used by libcurl in a way that is fully thread-safe.
+OpenSSL 1.1.0 "can be safely used in multi-threaded applications provided that
+support for the underlying OS threading API is built-in."
-https://www.openssl.org/docs/man1.1.0/man3/CRYPTO_THREAD_run_once.html#DESCRIPTION
+https://www.openssl.org/docs/manmaster/crypto/threads.html#DESCRIPTION
OpenSSL <= 1.0.2 the user must set callbacks.
-https://www.openssl.org/docs/man1.0.2/man3/CRYPTO_set_locking_callback.html#DESCRIPTION
+https://www.openssl.org/docs/man1.0.2/crypto/threads.html#DESCRIPTION
https://curl.haxx.se/libcurl/c/opensslthreadlock.html
@@ -58,6 +57,10 @@ https://curl.haxx.se/libcurl/c/opensslthreadlock.html
https://gnutls.org/manual/html_node/Thread-safety.html
.IP NSS
thread-safe already without anything required.
+.IP PolarSSL
+Required actions unknown.
+.IP yassl
+Required actions unknown.
.IP Secure-Transport
The engine is used by libcurl in a way that is fully thread-safe.
.IP WinSSL
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index cee2082c0..bf578689d 100644
--- a/docs/libcurl/libcurl-tutorial.3
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.67.0" "libcurl programming"
+.TH libcurl-tutorial 3 "September 23, 2018" "libcurl 7.64.1" "libcurl programming"
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
@@ -497,13 +497,13 @@ and then a file with binary contents and uploads the whole thing.
.nf
curl_mime *multipart = curl_mime_init(easyhandle);
- curl_mimepart *part = curl_mime_addpart(multipart);
+ curl_mimepart *part = curl_mime_addpart(mutipart);
curl_mime_name(part, "name");
curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
- part = curl_mime_addpart(multipart);
+ part = curl_mime_addpart(mutipart);
curl_mime_name(part, "project");
curl_mime_data(part, "curl", CURL_ZERO_TERMINATED);
- part = curl_mime_addpart(multipart);
+ part = curl_mime_addpart(mutipart);
curl_mime_name(part, "logotype-image");
curl_mime_filedata(part, "curl.png");
diff --git a/docs/libcurl/libcurl-url.3 b/docs/libcurl/libcurl-url.3
index ad75c7a53..63972f64c 100644
--- a/docs/libcurl/libcurl-url.3
+++ b/docs/libcurl/libcurl-url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "September 10, 2018" "libcurl 7.67.0" "libcurl url interface"
+.TH libcurl 3 "September 10, 2018" "libcurl 7.64.1" "libcurl url interface"
.SH NAME
libcurl-url \- URL interface overview
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index dd0d16ce0..376719596 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "July 15, 2017" "libcurl 7.67.0" "libcurl overview"
+.TH libcurl 3 "July 15, 2017" "libcurl 7.64.1" "libcurl overview"
.SH NAME
libcurl \- client-side URL transfers
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index f76c3746c..1f4be7892 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index 6d95889f1..0a9dbd67f 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
@@ -35,8 +35,6 @@ This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
index aa6e80d7d..d71fbf7a7 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
@@ -36,8 +36,6 @@ This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_CERTINFO.3 b/docs/libcurl/opts/CURLINFO_CERTINFO.3
index af68da442..6ce996b1f 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index b88ec384e..c60a954ba 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index 624691fa6..7b78f363e 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
@@ -32,8 +32,6 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME, double *timep);
Pass a pointer to a double to receive the total time in seconds from the start
until the connection to the remote host (or proxy) was completed.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
index 476377c4a..42a4038ad 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME_T \- get the time until connect
@@ -31,9 +31,6 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME_T, curl_off_t *ti
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the connection to the remote host (or proxy) was completed.
-
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index f1bbffb3d..5a41f2d88 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index ee5fa2e72..669c4e5f1 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index 4534d1929..e5671dfa3 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index ad0280166..12d889dba 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 04a6e6af9..9147031ea 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index 1880eff7b..646ee2453 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index 39be19b03..041fd47de 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 55cd8e4f2..25665f402 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME_T.3 b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
index c93bfe879..3bcfa8b22 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME_T \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
index 36afa95bd..ed10101b7 100644
--- a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
diff --git a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
index 05482b24f..bca7d0064 100644
--- a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index f879acc5c..5c07e8b87 100644
--- a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index 503156acf..9e0b41951 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
index 1054cdb6d..39956fa4d 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_VERSION 3 "August 07, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
@@ -29,10 +29,9 @@ CURLINFO_HTTP_VERSION \- get the http version used in the connection
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p);
.SH DESCRIPTION
-Pass a pointer to a long to receive the version used in the last http
-connection. The returned value will be CURL_HTTP_VERSION_1_0,
-CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_2_0, CURL_HTTP_VERSION_3 or 0 if the
-version can't be determined.
+Pass a pointer to a long to receive the version used in the last http connection.
+The returned value will be CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1, or
+CURL_HTTP_VERSION_2_0, or 0 if the version can't be determined.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index d3bff6459..f4a7e9d43 100644
--- a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index f0a9a44f4..fc6f93d25 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index 212fe2cc7..fdb0402dd 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index 475a2c8e1..d9121312c 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
@@ -32,8 +32,6 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME, double *timep
Pass a pointer to a double to receive the total time in seconds from the start
until the name resolving was completed.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
index f6105911d..ec760ef90 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
@@ -32,8 +32,6 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME_T, curl_off_t
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the name resolving was completed.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
index cf0f5c27d..18b08ef82 100644
--- a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index f37fdef5c..3cb4bb081 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index 2a9af4882..349d6f1df 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
@@ -35,8 +35,6 @@ pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
index a94f8e8c1..3ff7109a5 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
@@ -36,8 +36,6 @@ pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
index 11f4fd683..ea8d736e9 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 4b9b240a4..22fb2880e 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index 805f881d5..09e37ca9c 100644
--- a/docs/libcurl/opts/CURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/CURLINFO_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIVATE \- get the private pointer
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index 438ce6dda..cbe1211db 100644
--- a/docs/libcurl/opts/CURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index d0e8ae6dd..6bfbf153e 100644
--- a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index beeb3bd99..4bd9603b6 100644
--- a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
index 7ed3775f4..b5bb18881 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 46b7b7364..f33fa4560 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
index 77623fb5f..c79a896b5 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
index 8fdc740b5..5319044a8 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index a3a67aac2..16747311b 100644
--- a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index af49e8556..6b18edc66 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
diff --git a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
deleted file mode 100644
index 366e749da..000000000
--- a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
+++ /dev/null
@@ -1,64 +0,0 @@
-.\" **************************************************************************
-.\" * _ _ ____ _
-.\" * Project ___| | | | _ \| |
-.\" * / __| | | | |_) | |
-.\" * | (__| |_| | _ <| |___
-.\" * \___|\___/|_| \_\_____|
-.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-.\" *
-.\" * This software is licensed as described in the file COPYING, which
-.\" * you should have received as part of this distribution. The terms
-.\" * are also available at https://curl.haxx.se/docs/copyright.html.
-.\" *
-.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-.\" * copies of the Software, and permit persons to whom the Software is
-.\" * furnished to do so, under the terms of the COPYING file.
-.\" *
-.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-.\" * KIND, either express or implied.
-.\" *
-.\" **************************************************************************
-.\"
-.TH CURLINFO_RETRY_AFTER 3 "August 06, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
-
-.SH NAME
-CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
-.SH SYNOPSIS
-#include <curl/curl.h>
-
-CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t *retry);
-.SH DESCRIPTION
-Pass a pointer to a curl_off_t variable to receive the number of seconds the
-HTTP server suggesets the client should wait until the next request is
-issued. The information from the "Retry-After:" header.
-
-While the HTTP header might contain a fixed date string, the
-\fICURLINFO_RETRY_AFTER(3)\fP will alwaus return number of seconds to wait -
-or zero if there was no header or the header couldn't be parsed.
-.SH DEFAULT
-Returns zero delay if there was no header.
-.SH PROTOCOLS
-HTTP(S)
-.SH EXAMPLE
-.nf
-CURL *curl = curl_easy_init();
-if(curl) {
- CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
- res = curl_easy_perform(curl);
- if(res == CURLE_OK) {
- curl_off_t wait = 0;
- curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &wait);
- if(wait)
- printf("Wait for %" CURL_FORMAT_CURL_OFF_T " seconds\\n", wait);
- }
- curl_easy_cleanup(curl);
-}
-.fi
-.SH AVAILABILITY
-Added in curl 7.66.0
-.SH RETURN VALUE
-Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
-.SH "SEE ALSO"
-.BR CURLOPT_STDERR "(3), " CURLOPT_HEADERFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index c17ed75be..9cc04a80f 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
index 3910cce0f..8d4de170e 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
index 33c976a45..936ae83da 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
index 0b92c51a7..a8591c3d6 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.3 b/docs/libcurl/opts/CURLINFO_SCHEME.3
index a96e27399..2c6c4291d 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index 153b280d8..0ef6ca327 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
index 694f1ad50..629e65aef 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 7a0ebea8b..b0008ea75 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
index 089edfb0d..5ced02c1d 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index 6ccb045f5..4e4b222d3 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
index e11d7f25d..168f15614 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index aaadcf472..e49d39804 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
index 1611431aa..63da414de 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index 2561e5188..e3194a9f5 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
diff --git a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
index 3a66feb7b..66faaedfb 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index b23a54d32..f460c7708 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
@@ -34,8 +34,6 @@ start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME(3)\fP and also the time the server needs to
calculate the result.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
index 082d39bb4..c2793f1c1 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
@@ -35,8 +35,6 @@ start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME_T(3)\fP and also the time the server needs to
calculate the result.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3 b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
index 6ad3956a3..34f18fb8a 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
index 24e166243..7033f61f1 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SSL_PTR 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
@@ -55,7 +55,7 @@ struct curl_tlssessioninfo {
The \fIbackend\fP struct member is one of the defines in the CURLSSLBACKEND_*
series: CURLSSLBACKEND_NONE (when built without TLS support),
-CURLSSLBACKEND_WOLFSSL, CURLSSLBACKEND_DARWINSSL,
+CURLSSLBACKEND_CYASSL, CURLSSLBACKEND_DARWINSSL,
CURLSSLBACKEND_GNUTLS, CURLSSLBACKEND_GSKIT, CURLSSLBACKEND_MBEDTLS,
CURLSSLBACKEND_NSS, CURLSSLBACKEND_OPENSSL, CURLSSLBACKEND_POLARSSL,
CURLSSLBACKEND_SCHANNEL or CURLSSLBACKEND_MESALINK. (Note that the OpenSSL
@@ -84,9 +84,9 @@ mbedtls_ssl_context *
ssl_context *
.IP "Secure Channel"
CtxtHandle *
-.IP "Secure Transport"
+.IP "Secure Transport (DarwinSSL)"
SSLContext *
-.IP "wolfSSL"
+.IP "WolfSSL (formerly CyaSSL)"
SSL *
.IP "MesaLink"
SSL *
@@ -96,26 +96,26 @@ If the \fIinternals\fP pointer is NULL then either the SSL backend is not
supported, an SSL session has not yet been established or the connection is no
longer associated with the easy handle (eg curl_easy_perform has returned).
.SH LIMITATIONS
-This option has some limitations that could make it unsafe when it comes to
-the manual verification of certificates.
+\fBThis option has some limitations that could make it unsafe when it comes to
+the manual verification of certificates.\fP
This option only retrieves the first in-use SSL session pointer for your easy
handle, however your easy handle may have more than one in-use SSL session if
using FTP over SSL. That is because the FTP protocol has a control channel and
-a data channel and one or both may be over SSL. Currently there is no way to
-retrieve a second in-use SSL session associated with an easy handle.
+a data channel and one or both may be over SSL. \fBCurrently there is no way to
+retrieve a second in-use SSL session associated with an easy handle.\fP
-This option has not been thoroughly tested with plaintext protocols that can
-be upgraded/downgraded to/from SSL: FTP, SMTP, POP3, IMAP when used with
+This option has not been thoroughly tested with plaintext protocols that can be
+upgraded/downgraded to/from SSL: FTP, SMTP, POP3, IMAP when used with
\fICURLOPT_USE_SSL(3)\fP. Though you will be able to retrieve the SSL pointer,
-it's possible that before you can do that data (including auth) may have
-already been sent over a connection after it was upgraded.
+it's possible that before you can do that \fBdata (including auth) may have
+already been sent over a connection after it was upgraded.\fP
Renegotiation. If unsafe renegotiation or renegotiation in a way that the
certificate is allowed to change is allowed by your SSL library this may occur
-and the certificate may change, and data may continue to be sent or received
+and the certificate may change, and \fBdata may continue to be sent or received
after renegotiation but before you are able to get the (possibly) changed SSL
-pointer, with the (possibly) changed certificate information.
+pointer,\fP with the (possibly) changed certificate information.
If you are using OpenSSL or wolfSSL then \fICURLOPT_SSL_CTX_FUNCTION(3)\fP can
be used to set a certificate verification callback in the CTX. That is safer
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index 18696f7cb..122f0bf36 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
@@ -33,8 +33,6 @@ Pass a pointer to a double to receive the total time in seconds for the
previous transfer, including name resolving, TCP connect etc. The double
represents the time in seconds, including fractions.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
index 226760ac4..9037104b9 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME_T 3 "May 17, 2018" "libcurl 7.64.1" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
@@ -33,8 +33,6 @@ Pass a pointer to a curl_off_t to receive the total time in microseconds
for the previous transfer, including name resolving, TCP connect etc.
The curl_off_t represents the time in microseconds.
-When a redirect is followed, the time from each request is added together.
-
See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index b12a6eab7..810eea171 100644
--- a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
@@ -29,8 +29,6 @@ CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);
.SH DESCRIPTION
-No function since pipelining was removed in 7.62.0.
-
Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
processing a chunked (Transfer-encoding: chunked) request with a current chunk
length larger than \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP, that pipeline
diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 2dc7608cb..7ae02d631 100644
--- a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
@@ -29,8 +29,6 @@ CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);
.SH DESCRIPTION
-No function since pipelining was removed in 7.62.0.
-
Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
processing a request with a Content-Length larger than this
\fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP, that pipeline will then not be
diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
index c6fb6c359..967709a48 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 b/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3
deleted file mode 100644
index 99cd86c36..000000000
--- a/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" **************************************************************************
-.\" * _ _ ____ _
-.\" * Project ___| | | | _ \| |
-.\" * / __| | | | |_) | |
-.\" * | (__| |_| | _ <| |___
-.\" * \___|\___/|_| \_\_____|
-.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-.\" *
-.\" * This software is licensed as described in the file COPYING, which
-.\" * you should have received as part of this distribution. The terms
-.\" * are also available at https://curl.haxx.se/docs/copyright.html.
-.\" *
-.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-.\" * copies of the Software, and permit persons to whom the Software is
-.\" * furnished to do so, under the terms of the COPYING file.
-.\" *
-.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-.\" * KIND, either express or implied.
-.\" *
-.\" **************************************************************************
-.\"
-.TH CURLMOPT_MAX_CONCURRENT_STREAMS 3 "06 Nov 2019" "libcurl 7.67.0" "curl_multi_setopt options"
-.SH NAME
-CURLMOPT_MAX_CONCURRENT_STREAMS \- set max concurrent streams for http2
-.SH SYNOPSIS
-.nf
-#include <curl/curl.h>
-
-CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_CONCURRENT_STREAMS,
- long max);
-.fi
-.SH DESCRIPTION
-Pass a long indicating the \fBmax\fP. The set number will be used as the
-maximum number of concurrent streams for a connections that libcurl should
-support on connections done using HTTP/2.
-
-Valid values range from 1 to 2147483647 (2^31 - 1) and defaults to 100. The
-value passed here would be honoured based on other system resources
-properties.
-.SH DEFAULT
-100
-.SH PROTOCOLS
-All
-.SH EXAMPLE
-.nf
- CURLM *m = curl_multi_init();
- /* max concurrent streams 200 */
- curl_multi_setopt(m, CURLMOPT_MAX_CONCURRENT_STREAMS, 200L);
-.fi
-.SH AVAILABILITY
-Added in 7.67.0
-.SH RETURN VALUE
-Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
-.SH "SEE ALSO"
-.BR CURLOPT_MAXCONNECTS "(3), " CURLMOPT_MAXCONNECTS "(3), "
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
index b6250dd55..cbb16fa22 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
index ddb00fb49..f35c52ade 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
@@ -29,8 +29,6 @@ CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max);
.SH DESCRIPTION
-No function since pipelining was removed in 7.62.0.
-
Pass a long. The set \fBmax\fP number will be used as the maximum amount of
outstanding requests in an HTTP/1.1 pipelined connection. This option is only
used for HTTP/1.1 pipelining, not for HTTP/2 multiplexing.
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
index 1a7e05d4d..72e3254ab 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
index e3427ac1a..caeb2f620 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "March 25, 2019" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
@@ -72,12 +72,12 @@ HTTP(S)
.SH EXAMPLE
.nf
CURLM *m = curl_multi_init();
-/* try HTTP/2 multiplexing */
-curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+/* try HTTP/1 pipelining and HTTP/2 multiplexing */
+curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_HTTP1 |
+ CURLPIPE_MULTIPLEX);
.fi
.SH AVAILABILITY
-Added in 7.16.0. Multiplex support bit added in 7.43.0. HTTP/1 Pipelining
-support was disabled in 7.62.0.
+Added in 7.16.0. Multiplex support bit added in 7.43.0.
.SH RETURN VALUE
Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
index 22076f55d..1da208c94 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "September 23, 2018" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
@@ -29,8 +29,6 @@ CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);
.SH DESCRIPTION
-No function since pipelining was removed in 7.62.0.
-
Pass a \fBservers\fP array of char *, ending with a NULL entry. This is a list
of server types prefixes (in the Server: HTTP header) that are blacklisted
from pipelining, i.e server types that are known to not support HTTP
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index fc4267598..5b24a1b37 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "February 03, 2016" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
@@ -29,8 +29,6 @@ CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts);
.SH DESCRIPTION
-No function since pipelining was removed in 7.62.0.
-
Pass a \fBhosts\fP array of char *, ending with a NULL entry. This is a list
of sites that are blacklisted from pipelining, i.e sites that are known to not
support HTTP pipelining. The array is copied by libcurl.
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index 04935c6d9..f514cef59 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
index 9a9ce545f..c6a972a8c 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index d8be37ba7..84cb64d49 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
index 08c006fa0..91f0552e3 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "September 23, 2018" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
@@ -39,24 +39,14 @@ CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION, socket_callb
Pass a pointer to your callback function, which should match the prototype
shown above.
-When the \fIcurl_multi_socket_action(3)\fP function is called, it informs the
+When the \fIcurl_multi_socket_action(3)\fP function runs, it informs the
application about updates in the socket (file descriptor) status by doing
-none, one, or multiple calls to the \fBsocket_callback\fP. The callback
-function gets status updates with changes since the previous time the callback
-was called. If the given callback pointer is set to NULL, no callback will be
-called.
-.SH "CALLBACK ARGUMENTS"
-\fIeasy\fP identifies the specific transfer for which this update is related.
-
-\fIs\fP is the specific socket this function invocation concerns. If the
-\fBwhat\fP argument is not CURL_POLL_REMOVE then it holds information about
-what activity on this socket the application is supposed to
-monitor. Subsequent calls to this callback might update the \fBwhat\fP bits
-for a socket that is already monitored.
-
-\fBuserp\fP is set with \fICURLMOPT_SOCKETDATA(3)\fP.
-
-\fBsocketp\fP is set with \fIcurl_multi_assign(3)\fP or will be NULL.
+none, one, or multiple calls to the \fBsocket_callback\fP. The callback gets
+status updates with changes since the previous time the callback was called.
+If the given callback pointer is NULL, no callback will be called. Set the
+callback's \fBuserp\fP argument with \fICURLMOPT_SOCKETDATA(3)\fP. See
+\fIcurl_multi_socket_action(3)\fP for more details on how the callback is used
+and should work.
The \fBwhat\fP parameter informs the callback on the status of the given
socket. It can hold one of these values:
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
index f62320b54..7b6f5742d 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
index 848d335e6..6b2409bf2 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "February 22, 2019" "libcurl 7.64.1" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
@@ -55,11 +55,6 @@ The \fBuserp\fP pointer is set with \fICURLMOPT_TIMERDATA(3)\fP.
The timer callback should return 0 on success, and -1 on error. This callback
can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP.
-
-\fBWARNING:\fP even if it feels tempting, avoid calling libcurl directly from
-within the callback itself when the \fBtimeout_ms\fP value is zero, since it
-risks triggering an unpleasant recursive behavior that immediately calls
-another call to the callback with a zero timeout...
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
index a4e909033..83e3ba1bd 100644
--- a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 9b4f2fd23..13a6c94fb 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
index 7c21d60a9..5c3717332 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index 300b2e6e0..21b758d3e 100644
--- a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,16 +20,17 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
-CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
+CURLOPT_ADDRESS_SCOPE \- set scope for local IPv6 addresses
.SH SYNOPSIS
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);
.SH DESCRIPTION
-Pass a long specifying the scope id value to use when connecting to IPv6 addresses.
+Pass a long specifying the scope_id value to use when connecting to IPv6
+link-local or site-local addresses.
.SH DEFAULT
0
.SH PROTOCOLS
@@ -39,10 +40,12 @@ All, when using IPv6
CURL *curl = curl_easy_init();
if(curl) {
CURLcode ret;
- long my_scope_id;
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
- my_scope_id = if_nametoindex("eth0");
- curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, my_scope_id);
+ /* 0x2 link-local
+ 0x5 site-local
+ 0x8 organization-local
+ 0xe global ... */
+ curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, 0xEL);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
@@ -51,6 +54,5 @@ if(curl) {
Added in 7.19.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
-Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value.
.SH "SEE ALSO"
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC.3 b/docs/libcurl/opts/CURLOPT_ALTSVC.3
index a21628d67..19fb263ad 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC 3 "March 03, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC \- set alt-svc cache file name
@@ -32,7 +32,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC, char *filename);
.fi
.SH EXPERIMENTAL
Warning: this feature is early code and is marked as experimental. It can only
-be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
+be enabled by explictly telling configure with \fB--enable-alt-svc\fP. You are
advised to not ship this in production before the experimental label is
removed.
.SH DESCRIPTION
@@ -40,8 +40,6 @@ Pass in a pointer to a \fIfilename\fP to instruct libcurl to use that file as
the Alt-Svc cache to read existing cache contents from and possibly also write
it back to a after a transfer, unless \fBCURLALTSVC_READONLYFILE\fP is set in
\fICURLOPT_ALTSVC_CTRL(3)\fP.
-
-Specify a blank file name ("") to make libcurl not load from a file at all.
.SH DEFAULT
NULL. The alt-svc cache is not read nor written to file.
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
index a27267a2b..9415f8bfd 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC_CTRL 3 "August 13, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC_CTRL 3 "March 03, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
@@ -29,6 +29,7 @@ CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
#include <curl/curl.h>
#define CURLALTSVC_IMMEDIATELY (1<<0)
+#define CURLALTSVC_ALTUSED (1<<1)
#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1 (1<<3)
#define CURLALTSVC_H2 (1<<4)
@@ -38,7 +39,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC_CTRL, long bitmask);
.fi
.SH EXPERIMENTAL
Warning: this feature is early code and is marked as experimental. It can only
-be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
+be enabled by explictly telling configure with \fB--enable-alt-svc\fP. You are
advised to not ship this in production before the experimental label is
removed.
.SH DESCRIPTION
@@ -53,8 +54,10 @@ sure both the source and the destination are legitimate.
Setting any bit will enable the alt-svc engine.
.IP "CURLALTSVC_IMMEDIATELY"
If an Alt-Svc: header is received, this instructs libcurl to switch to one of
-those alternatives asap rather than to save it and use for the next
-request. (Not currently supported).
+those alternatives asap rather than to save it and use for the next request.
+.IP "CURLALTSVC_ALTUSED"
+Issue the Alt-Used: header in all requests that have been redirected by
+alt-svc.
.IP "CURLALTSVC_READONLYFILE"
Do not write the alt-svc cache back to the file specified with
\fICURLOPT_ALTSVC(3)\fP even if it gets updated. By default a file specified
diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3
index 8003fe19c..7034f8eb4 100644
--- a/docs/libcurl/opts/CURLOPT_APPEND.3
+++ b/docs/libcurl/opts/CURLOPT_APPEND.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
index 48b703681..1d8a19be2 100644
--- a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index dcde4a8ed..a359361b4 100644
--- a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.3 b/docs/libcurl/opts/CURLOPT_CAINFO.3
index 5cf18123f..cb216c053 100644
--- a/docs/libcurl/opts/CURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAINFO 3 "June 10, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
@@ -47,20 +47,21 @@ libnssckbi.so, which contains a more comprehensive set of trust information
than supported by nss-pem, because libnssckbi.so also includes information
about distrusted certificates.
-(iOS and macOS) When curl uses Secure Transport this option is supported. If
-the option is not set, then curl will use the certificates in the system and
-user Keychain to verify the peer.
+(iOS and macOS only) If curl is built against Secure Transport, then this
+option is supported for backward compatibility with other SSL engines, but it
+should not be set. If the option is not set, then curl will use the
+certificates in the system and user Keychain to verify the peer, which is the
+preferred method of verifying the peer's certificate chain.
-(Schannel) This option is supported for Schannel in Windows 7 or later but we
-recommend not using it until Windows 8 since it works better starting then.
-If the option is not set, then curl will use the certificates in the Windows'
-store of root certificates (the default for Schannel).
+(Schannel only) This option is supported for Schannel in Windows 7 or later
+with libcurl 7.60 or later. This option is supported for backward
+compatibility with other SSL engines; instead it is recommended to use
+Windows' store of root certificates (the default for Schannel).
The application does not have to keep the string around after setting this
option.
.SH DEFAULT
-Built-in system specific. When curl is built with Secure Transport or
-Schannel, this option is not set by default.
+Built-in system specific
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
@@ -74,8 +75,8 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-For the SSL engines that don't support certificate files the CURLOPT_CAINFO
-option is ignored. Schannel support added in libcurl 7.60.
+For SSL engines that don't support certificate files the CURLOPT_CAINFO option
+is ignored. Refer to https://curl.haxx.se/docs/ssl-compared.html
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index 4d60c6bb9..a60fa06cf 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index 0d3b3dc15..1549926bf 100644
--- a/docs/libcurl/opts/CURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
index 7f17c265d..c1637adf7 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
@@ -28,33 +28,6 @@ CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
.nf
#include <curl/curl.h>
-struct curl_fileinfo {
- char *filename;
- curlfiletype filetype;
- time_t time; /* always zero! */
- unsigned int perm;
- int uid;
- int gid;
- curl_off_t size;
- long int hardlinks;
-
- struct {
- /* If some of these fields is not NULL, it is a pointer to b_data. */
- char *time;
- char *perm;
- char *user;
- char *group;
- char *target; /* pointer to the target filename of a symlink */
- } strings;
-
- unsigned int flags;
-
- /* used internally */
- char *b_data;
- size_t b_size;
- size_t b_used;
-};
-
long chunk_bgn_callback(const void *transfer_info, void *ptr,
int remains);
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
index 5dfb8c740..42c76e20a 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
index ea83c701b..28844335e 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
index c336a0291..5143c6796 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
index a5cc5d88e..5b5651f07 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
index a0745e896..fbb55cad3 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index beb606542..dc424aefc 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index ae066ec30..174e86cc6 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3 b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
index 8c27c9bfd..3ea60b6bc 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index b7c4b105e..78d257767 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
index a71a2b683..9096ce370 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
index 42af18cf1..2b510c1bc 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3
index 5393d1ccb..e15403158 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index 0897fb21f..8d643cfb6 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3 b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
index acbdea11e..b45e0493d 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 2f5198c33..1b1457854 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3 b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
index 958214108..4dcb3665e 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 55522298a..8b963fcf8 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index b32b0a5e5..c024ba69d 100644
--- a/docs/libcurl/opts/CURLOPT_CRLF.3
+++ b/docs/libcurl/opts/CURLOPT_CRLF.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3
index de9d4373a..30db545d7 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_CURLU.3 b/docs/libcurl/opts/CURLOPT_CURLU.3
index 9acead7c6..03ecb78dc 100644
--- a/docs/libcurl/opts/CURLOPT_CURLU.3
+++ b/docs/libcurl/opts/CURLOPT_CURLU.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CURLU 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CURLU 3 "January 16, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CURLU \- set URL with CURLU *
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 1822c3152..3b735ca71 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index df833ba05..321de5151 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
index 573197b2b..176f6fbe3 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index 2984c7e4a..dc7854587 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
index d4b6b6d58..b15131377 100644
--- a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
diff --git a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3 b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
index de6ff9621..e3d2c9841 100644
--- a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index b0edaad16..bb3f01a2f 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index dc727edf0..d2ac4cf41 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index 699695ddc..50cdba687 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index db00f7f4d..2e3f25e7b 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index 6fb7876c4..03ac41f3d 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
index 120dd761f..437a87731 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
index e2391fc50..b80aa9b74 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
@@ -30,8 +30,6 @@ CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,
long enable);
.SH DESCRIPTION
-Has no function since 7.62.0. Do note use!
-
Pass a long. If the \fIenable\fP value is 1, it tells curl to use a global DNS
cache that will survive between easy handle creations and deletions. This is
not thread-safe and this will use a global variable.
@@ -56,7 +54,7 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-Deprecated since 7.62.0. Has no function.
+Subject for removal in the future. Do not use!
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLOPT_DOH_URL.3 b/docs/libcurl/opts/CURLOPT_DOH_URL.3
index aed70fb36..07bff6963 100644
--- a/docs/libcurl/opts/CURLOPT_DOH_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DOH_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index 7eab22933..6ff0e28f5 100644
--- a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index c0973769d..99d2be564 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index cfdff2590..59592d10f 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index b89d36944..1cdeb9dbd 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3
index c4f5350ef..371574e4e 100644
--- a/docs/libcurl/opts/CURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/CURLOPT_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
index deecdce36..e0105ced4 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
index 8d1709b66..3c0e09f86 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
index 5556a49d3..fc49834a0 100644
--- a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FOLLOWLOCATION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "May 02, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
@@ -40,8 +40,7 @@ libcurl will follow.
libcurl limits what protocols it automatically follows to. The accepted
protocols are set with \fICURLOPT_REDIR_PROTOCOLS(3)\fP. By default libcurl
-will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2). Older versions of
-libcurl allowed all protocols on redirect except those disabled for security
+will allow all protocols on redirect except those disabled for security
reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0 SMB and SMBS
are also disabled.
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index 88d2c1c37..199fa47ba 100644
--- a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
index c9291a778..42bf69830 100644
--- a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.3 b/docs/libcurl/opts/CURLOPT_FTPPORT.3
index 072761aad..cf22af8ff 100644
--- a/docs/libcurl/opts/CURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/CURLOPT_FTPPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index 4f2301de7..4b1d1a579 100644
--- a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
index 55621d7ea..351f29148 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 472a37415..b280376c9 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
index 7de48bb93..912a42ab3 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
index c3fd8214e..f4eff8ead 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
index d9c13f379..1ebd32162 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
index 28f614e04..1e85f875d 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
index fe03c5b32..4a1262e2d 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
index 55b61f685..c501dd376 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
index fb4a57955..3b7a92228 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
index 795125022..8bf86f0ee 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
index 42c3edd3f..f459ddc12 100644
--- a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
diff --git a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
index 47d02e672..19f0c3546 100644
--- a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
diff --git a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3 b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
index a092626d1..fe9d07833 100644
--- a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3
index cca9d231b..32254b53f 100644
--- a/docs/libcurl/opts/CURLOPT_HEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index fcdc26820..ee4b38f10 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index 60c6577b7..68b70a8c7 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERFUNCTION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "November 22, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
@@ -53,7 +53,7 @@ an error to the library. This will cause the transfer to get aborted and the
libcurl function in progress will return \fICURLE_WRITE_ERROR\fP.
A complete HTTP header that is passed to this function can be up to
-\fICURL_MAX_HTTP_HEADER\fP (100K) bytes and includes the final line terminator.
+\fICURL_MAX_HTTP_HEADER\fP (100K) bytes.
If this option is not set, or if it is set to NULL, but
\fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to
@@ -68,9 +68,6 @@ negotiation. If you need to operate on only the headers from the final
response, you will need to collect headers in the callback yourself and use
HTTP status lines, for example, to delimit response boundaries.
-For an HTTP transfer, the status line and the blank line preceding the response
-body are both included as headers and passed to this function.
-
When a server sends a chunked encoded transfer, it may contain a trailer. That
trailer is identical to an HTTP header and if such a trailer is received it is
passed to the application using this callback as well. There are several ways
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index 9efb17b28..34661d974 100644
--- a/docs/libcurl/opts/CURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
@@ -58,14 +58,12 @@ if(curl) {
list = curl_slist_append(list, "Accept:");
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
/* HTTPS over a proxy makes a separate CONNECT to the proxy, so tell
libcurl to not send the custom headers to the proxy. Keep them
separate! */
curl_easy_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE);
ret = curl_easy_perform(curl);
- curl_slist_free_all(list);
curl_easy_cleanup(curl);
}
.fi
diff --git a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
index 28393b5ab..a5bc2f9b9 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP09_ALLOWED 3 "December 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP09 \- allow HTTP/0.9 response
@@ -32,12 +32,12 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP09_ALLOWED, long allowed);
Pass the long argument \fIallowed\fP set to 1L to allow HTTP/0.9 responses.
A HTTP/0.9 response is a server response entirely without headers and only a
-body. You can connect to lots of random TCP services and still get a response
-that curl might consider to be HTTP/0.9!
+body, while you can connect to lots of random TCP services and still get a
+response that curl might consider to be HTTP/0.9.
.SH DEFAULT
-curl allowed HTTP/0.9 responses by default before 7.66.0
+curl allows HTTP/0.9 responses by default.
-Since 7.66.0, libcurl requires this option set to 1L to allow HTTP/0.9
+A future curl version will require this option to be set to allow HTTP/0.9
responses.
.SH PROTOCOLS
HTTP
diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
index 3e07980dd..eb272719c 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index 3d16dd6e7..a074b61b2 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3
index 7238017f1..47745e8f7 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPGET \- ask for an HTTP GET request
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index 89b09edab..894d64e22 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index 4c306cfda..449df3fde 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
index a1ed04a6d..8772c52b7 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
index b21ab4c41..b048c8fec 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
index f88850333..d75fe17c2 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
index e9c948f30..7200a739b 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "December 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
@@ -30,7 +30,9 @@ CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);
.SH DESCRIPTION
Pass \fIversion\fP a long, set to one of the values described below. They ask
-libcurl to use the specific HTTP versions.
+libcurl to use the specific HTTP versions. This is not sensible to do unless
+you have a good reason. You have to set this option if you want to use
+libcurl's HTTP/2 support.
Note that the HTTP version is just a request. libcurl will still prioritize to
re-use an existing connection so it might then re-use a connection using a
@@ -58,14 +60,6 @@ Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires
prior knowledge that the server supports HTTP/2 straight away. HTTPS requests
will still do HTTP/2 the standard way with negotiated protocol version in the
TLS handshake. (Added in 7.49.0)
-.IP CURL_HTTP_VERSION_3
-(Added in 7.66.0) Setting this value will make libcurl attempt to use HTTP/3
-directly to server given in the URL. Note that this cannot gracefully
-downgrade to earlier HTTP version if the server doesn't support HTTP/3.
-
-For more reliably upgrading to HTTP/3, set the preferred version to something
-lower and let the server announce its HTTP/3 support via Alt-Svc:. See
-\fICURLOPT_ALTSVC(3)\fP.
.SH DEFAULT
Since curl 7.62.0: CURL_HTTP_VERSION_2TLS
@@ -91,4 +85,4 @@ Along with HTTP
Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), "
-.BR CURLOPT_HTTP09_ALLOWED "(3), " CURLOPT_ALTSVC "(3) "
+.BR CURLOPT_HTTP09_ALLOWED "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index 26bd100b4..4ba77c6f2 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index 2a2d1a21e..0144a2b41 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
index e6b65223b..d5fcd4d7f 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_INTERFACE.3
index bc86b98e3..cb9e65678 100644
--- a/docs/libcurl/opts/CURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index 8c59cc886..e7f730345 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
index 601836725..eb5e87c30 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3 b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
index 9cfc97162..f57545483 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
index c0dc8565b..fd6316f2f 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
index 6b12e8206..1cb20f7d9 100644
--- a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 70925f8a8..5d1e4ab76 100644
--- a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index 0561e77a5..1c7f67dcf 100644
--- a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
index b63d1d076..173f359d6 100644
--- a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index 1286d6391..694687ffd 100644
--- a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
index fe2dbf46c..c85ebcb1d 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORT 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "January 31, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index f13e0fec1..4d855ff1c 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORTRANGE 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "January 31, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index 46cc892b9..51a3be2b7 100644
--- a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 144a01f5a..01cc27140 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
index 0b30ebe88..87ab40822 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
index 1f382ccc2..0ffc1470e 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index 7b4bff72c..66a2bc64d 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index ac4bcbe87..dc4409858 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
@@ -32,10 +32,9 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT,
struct curl_slist *rcpts);
.SH DESCRIPTION
Pass a pointer to a linked list of recipients to pass to the server in your
-SMTP mail request. The linked list should be a fully valid list of
-\fBstruct curl_slist\fP structs properly filled in. Use
-\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP
-to clean up an entire list.
+SMTP mail request. The linked list should be a fully valid list of \fBstruct
+curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to
+create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list.
When performing a mail transfer, each recipient should be specified within a
pair of angled brackets (<>), however, should you not use an angled bracket as
diff --git a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
deleted file mode 100644
index 18845135b..000000000
--- a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
+++ /dev/null
@@ -1,66 +0,0 @@
-.\" **************************************************************************
-.\" * _ _ ____ _
-.\" * Project ___| | | | _ \| |
-.\" * / __| | | | |_) | |
-.\" * | (__| |_| | _ <| |___
-.\" * \___|\___/|_| \_\_____|
-.\" *
-.\" * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-.\" *
-.\" * This software is licensed as described in the file COPYING, which
-.\" * you should have received as part of this distribution. The terms
-.\" * are also available at https://curl.haxx.se/docs/copyright.html.
-.\" *
-.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-.\" * copies of the Software, and permit persons to whom the Software is
-.\" * furnished to do so, under the terms of the COPYING file.
-.\" *
-.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-.\" * KIND, either express or implied.
-.\" *
-.\" **************************************************************************
-.\"
-.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
-
-.SH NAME
-CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
-.SH SYNOPSIS
-#include <curl/curl.h>
-
-CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXAGE_CONN, long maxage);
-.SH DESCRIPTION
-Pass a long as parameter containing \fImaxage\fP - the maximum time in seconds
-that you allow an existing connection to have to be considered for reuse for
-this request.
-
-The "connection cache" that holds previously used connections. When a new
-request is to be done, it will consider any connection that matches for
-reuse. The \fICURLOPT_MAXAGE_CONN(3)\fP limit prevents libcurl from trying
-very old connections for reuse, since old connections have a high risk of not
-working and thus trying them is a performance loss and sometimes service loss
-due to the difficulties to figure out the situation. If a connection is found
-in the cache that is older than this set \fImaxage\fP, it will instead be
-closed.
-.SH DEFAULT
-Default maxage is 118 seconds.
-.SH PROTOCOLS
-All
-.SH EXAMPLE
-.nf
-CURL *curl = curl_easy_init();
-if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
-
- /* only allow 30 seconds idle time */
- curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 30L);
-
- curl_easy_perform(curl);
-}
-.fi
-.SH AVAILABILITY
-Added in libcurl 7.65.0
-.SH RETURN VALUE
-Returns CURLE_OK.
-.SH "SEE ALSO"
-.BR CURLOPT_TIMEOUT "(3), " CURLOPT_FORBID_REUSE "(3), "
-.BR CURLOPT_FRESH_CONNECT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 31d224e95..4f62a640e 100644
--- a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
index 83cc15b74..d2b8250ae 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
index db24c5b86..b577af468 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
index 2d9188db7..6155a1e92 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index d7c75a4a6..e7f8f037f 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index 5201a6e79..8b85842b7 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
diff --git a/docs/libcurl/opts/CURLOPT_MIMEPOST.3 b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
index 9d2466b42..6a3fdef66 100644
--- a/docs/libcurl/opts/CURLOPT_MIMEPOST.3
+++ b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_MIMEPOST \- set post/send data from mime structure
diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3
index c6c3122e2..80301dcfb 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC \- request that .netrc is used
diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3 b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
index 7b80c0394..7ae559be1 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index 5c0eaadd8..867aa9a6f 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
index b12132376..c556b5690 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index 4776ff8b1..1ca98816d 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index 9533bc8d6..2ccbc3a94 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index 460550a9f..fe45179fe 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index 05092508f..e0b6323ba 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
index d7b4c9af8..943384879 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
index acb38f31f..6d6653760 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 8fe212f42..52d7c7e70 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index 5b0574859..e21f68944 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index 93836f312..1fb5b84c2 100644
--- a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
@@ -100,21 +100,25 @@ PEM/DER support:
7.39.0-7.48.0,7.58.1+: GSKit
- 7.43.0: NSS and wolfSSL
+ 7.43.0: NSS and wolfSSL/CyaSSL
7.47.0: mbedtls
- 7.54.1: SecureTransport on macOS 10.7+/iOS 10+
+ 7.49.0: PolarSSL
+
+ 7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
7.58.1: SChannel
sha256 support:
- 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
+ 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL
7.47.0: mbedtls
- 7.54.1: SecureTransport on macOS 10.7+/iOS 10+
+ 7.49.0: PolarSSL
+
+ 7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
7.58.1: SChannel Windows XP SP3+
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index 4dc706e1f..e16a179f2 100644
--- a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3
index 1285bf5a1..5780dc1a8 100644
--- a/docs/libcurl/opts/CURLOPT_PORT.3
+++ b/docs/libcurl/opts/CURLOPT_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PORT \- set remote port number to work with
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index 8013ee516..53ec9a019 100644
--- a/docs/libcurl/opts/CURLOPT_POST.3
+++ b/docs/libcurl/opts/CURLOPT_POST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POST 3 "July 22, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "May 21, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POST \- request an HTTP POST
@@ -56,8 +56,7 @@ If you use POST to an HTTP 1.1 server, you can send data without knowing the
size before starting the POST if you use chunked encoding. You enable this by
adding a header like "Transfer-Encoding: chunked" with
\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
-must specify the size in the request. (Since 7.66.0, libcurl will
-automatically use chunked encoding for POSTs if the size is unknown.)
+must specify the size in the request.
When setting \fICURLOPT_POST(3)\fP to 1, libcurl will automatically set
\fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0.
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index 168c3e832..ada102251 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index 83b09e33f..b2ea6e436 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index 57bc47c36..5535f1e99 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index 8aec0399f..f04a2fb67 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
index c29d85e5a..baede47d6 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index 19f38f0b8..a77128a7e 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
diff --git a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3 b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
index 838d2d895..5e4785caa 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 698175a74..8ebe76173 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRIVATE \- store a private pointer
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 27b211c9c..71f3e0d65 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
index 10ad5af94..8f39b3e95 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
index 743a2721a..bb2b9fd35 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
diff --git a/docs/libcurl/opts/CURLOPT_PROXY.3 b/docs/libcurl/opts/CURLOPT_PROXY.3
index 0e68cdf41..a5e3f45d6 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY \- set proxy to use
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index f8d287d33..3c99fb015 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3 b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
index 3d5897544..9ba338550 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
index 4543e9adf..318079d5f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 73c882d8b..62adbed92 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index cd6ad8c83..45a570b05 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
index 8d76597d0..0573eac10 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index c2c3dd681..efe212fe9 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index fc28516c5..fe67826ad 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index 5535dea1b..62468764d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAPATH 3 "May 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
@@ -56,8 +56,9 @@ if(curl) {
.SH AVAILABILITY
Added in 7.52.0
-This option is supported by the OpenSSL, GnuTLS, and mbedTLS (since 7.56.0)
-backends. The NSS backend provides the option only for backward compatibility.
+This option is supported by the OpenSSL, GnuTLS, PolarSSL and mbedTLS
+(since 7.56.0) backends. The NSS backend provides the option only for
+backward compatibility.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index 75637a6f8..468c7ef78 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index 58414a20c..061e2827f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index 224225d31..ffcfdabe7 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
@@ -95,11 +95,11 @@ footer:
.SH AVAILABILITY
PEM/DER support:
- 7.52.0: GSKit, GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
+ 7.52.0: GSKit, GnuTLS, NSS, OpenSSL, PolarSSL, mbedtls, wolfSSL/CyaSSL
sha256 support:
- 7.52.0: GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
+ 7.52.0: GnuTLS, NSS, OpenSSL, PolarSSL, mbedtls, wolfSSL/CyaSSL
Other SSL backends not supported.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index 754a0ca18..5bf99d5aa 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
index 750523a06..df6e4e06b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 25aeb67a3..3a60f87cf 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 48fc1604b..96c30f140 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index a477de675..abc76e874 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index 3d0153b25..1a81b9478 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2016, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "October 30, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
@@ -70,11 +70,6 @@ The flag defines maximum supported TLS version as TLSv1.2.
The flag defines maximum supported TLS version as TLSv1.3.
(Added in 7.54.0)
.RE
-
-In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
-documented to allow \fIonly\fP the specified TLS version, but behavior was
-inconsistent depending on the TLS library.
-
.SH DEFAULT
CURL_SSLVERSION_DEFAULT
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
index 520732ea6..09e3f4bf7 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index fbe58d6a0..fa0ef8739 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
@@ -40,10 +40,13 @@ lessens the security, and by setting this option to 1 you ask for exactly
that. This option is only supported for DarwinSSL, NSS and OpenSSL.
\fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. This option is
-only supported for Schannel (the native Windows SSL library), with an
-exception in the case of Windows' Untrusted Publishers blacklist which it
-seems can't be bypassed.
+checks for those SSL backends where such behavior is present. \fBCurrently
+this option is only supported for Schannel (the native Windows SSL library),
+with an exception in the case of Windows' Untrusted Publishers blacklist which
+it seems can't be bypassed.\fP This option may have broader support to
+accommodate other SSL backends in the future.
+https://curl.haxx.se/docs/ssl-compared.html
+
.SH DEFAULT
0
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
index 3e4f0460e..9be33aafc 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "May 02, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
@@ -43,15 +43,8 @@ Curl considers the proxy the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
proxy string which you told curl to use.
-If \fIverify\fP value is set to 1:
-
-In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
-anymore due to frequently leading to programmer mistakes.
-
-From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
-and leaving the flag untouched.
-
-From 7.66.0: treats 1 and 2 the same.
+When the \fIverify\fP value is 1L, \fIcurl_easy_setopt\fP will return an error
+and the option value will not be changed due to old legacy reasons.
When the \fIverify\fP value is 0L, the connection succeeds regardless of the
names used in the certificate. Use that ability with caution!
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
index e048aae98..58aaaf548 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
index 89ffc13a6..031abe26b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "October 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
@@ -38,10 +38,6 @@ You'll find more details about cipher lists on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the CURLOPT_PROXY_SSL_CIPHER_LIST option.
-
The application does not have to keep the string around after setting this
option.
.SH DEFAULT
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 33b728ace..8ea1dfe27 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index 34fbe9801..18c088c24 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index 93d7f8d4a..1f96d2cf8 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 9e074a3dc..5d1525d19 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
diff --git a/docs/libcurl/opts/CURLOPT_PUT.3 b/docs/libcurl/opts/CURLOPT_PUT.3
index 825edd7c0..d0bec44f0 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_PUT \- make an HTTP PUT request
diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3
index 78869c405..82194578b 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
index c54f6024d..5587b6189 100644
--- a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index 54c98cda7..9fdfc044b 100644
--- a/docs/libcurl/opts/CURLOPT_RANGE.3
+++ b/docs/libcurl/opts/CURLOPT_RANGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANGE 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "December 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANGE \- set byte range to request
@@ -44,14 +44,6 @@ For RTSP, the formatting of a range should follow RFC2326 Section 12.29. For
RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges should be given in
npt, utc, or smpte formats.
-For HTTP PUT uploads this option should not be used, since it may conflict with
-other options. If you need to upload arbitrary parts of a file (like for
-Amazon's web services) support is limited. We suggest set resume position using
-\fICURLOPT_RESUME_FROM(3)\fP, set end (resume+size) position using
-\fICURLOPT_INFILESIZE(3)\fP and seek to the resume position before initiating
-the transfer for each part. For more information refer to
-https://curl.haxx.se/mail/lib-2019-05/0012.html
-
Pass a NULL to this option to disable the use of ranges.
The application does not have to keep the string around after setting this
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index 88bf8d385..8738876a4 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index 6582b80db..38056dc45 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READFUNCTION 3 "August 12, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "August 11, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
@@ -70,37 +70,8 @@ The default internal read callback is fread().
.SH PROTOCOLS
This is used for all protocols when doing uploads.
.SH EXAMPLE
-.nf
-size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
-{
- FILE *readhere = (FILE *)userdata;
- curl_off_t nread;
-
- /* copy as much data as possible into the 'ptr' buffer, but no more than
- 'size' * 'nmemb' bytes! */
- size_t retcode = fread(ptr, size, nmemb, readhere);
-
- nread = (curl_off_t)retcode;
-
- fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
- " bytes from file\\n", nread);
- return retcode;
-}
-
-void setup(char *uploadthis)
-{
- FILE *file = fopen("rb", uploadthis);
- CURLcode result;
-
- /* set callback to use */
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
-
- /* pass in suitable argument to callback */
- curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);
-
- result = curl_easy_perform(curl);
-}
-.fi
+Here's an example setting a read callback for reading that to upload to an FTP
+site: https://curl.haxx.se/libcurl/c/ftpupload.html
.SH AVAILABILITY
CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
was added in 7.12.1.
@@ -109,4 +80,3 @@ This will return CURLE_OK.
.SH "SEE ALSO"
.BR CURLOPT_READDATA "(3), " CURLOPT_WRITEFUNCTION "(3), "
.BR CURLOPT_SEEKFUNCTION "(3), " CURLOPT_UPLOAD "(3), " CURLOPT_POST "(3), "
-.BR CURLOPT_UPLOAD_BUFFERSIZE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
index 6d9af7012..3a83e9747 100644
--- a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "September 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
@@ -38,11 +38,10 @@ redirections.
Protocols denied by \fICURLOPT_PROTOCOLS(3)\fP are not overridden by this
option.
-By default libcurl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
-Older versions of libcurl allowed all protocols on redirect except several
-disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
-since 7.40.0 SMB and SMBS are also disabled. \fICURLPROTO_ALL\fP enables all
-protocols on redirect, including those disabled for security.
+By default libcurl will allow all protocols on redirect except several disabled
+for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
+SMB and SMBS are also disabled. \fICURLPROTO_ALL\fP enables all protocols on
+redirect, including those disabled for security.
These are the available protocol defines:
.nf
diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3
index 01a2d5f79..b942b4a3c 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index f8293cd3f..c44f00b5e 100644
--- a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index 2049a9224..cbcb7127c 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
index 162187f5b..0566e1fc0 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
index 79d042207..eecfc9669 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index e52e5238b..f7677e197 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
index d40f981db..a8fc539f8 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
index e19440c14..0cc6efee6 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
index 8d8565a03..2148d3bea 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
@@ -34,15 +34,15 @@ enum values as a long in the \fIrequest\fP argument. Unless noted otherwise,
commands require the Session ID to be initialized.
.IP CURL_RTSPREQ_OPTIONS
Used to retrieve the available methods of the server. The application is
-responsible for parsing and obeying the response. The session ID is not needed
-for this method.
+responsible for parsing and obeying the response. \fB(The session ID is not
+needed for this method.)\fP
.IP CURL_RTSPREQ_DESCRIBE
Used to get the low level description of a stream. The application should note
what formats it understands in the \fI'Accept:'\fP header. Unless set
-manually, libcurl will automatically fill in \fI'Accept: application/sdp'\fP.
-Time-condition headers will be added to Describe requests if the
-\fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is not
-needed for this method)\fP
+manually, libcurl will automatically fill in \fI'Accept:
+application/sdp'\fP. Time-condition headers will be added to Describe requests
+if the \fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is
+not needed for this method)\fP
.IP CURL_RTSPREQ_ANNOUNCE
When sent by a client, this method changes the description of the session. For
example, if a client is using the server to record a meeting, the client can
@@ -54,8 +54,8 @@ Setup is used to initialize the transport layer for the session. The
application must set the desired Transport options for a session by using the
\fICURLOPT_RTSP_TRANSPORT(3)\fP option prior to calling setup. If no session
ID is currently set with \fICURLOPT_RTSP_SESSION_ID(3)\fP, libcurl will
-extract and use the session ID in the response to this request. The session ID
-is not needed for this method.
+extract and use the session ID in the response to this request. \fB(The
+session ID is not needed for this method).\fP
.IP CURL_RTSPREQ_PLAY
Send a Play command to the server. Use the \fICURLOPT_RANGE(3)\fP option to
modify the playback time (e.g. 'npt=10-15').
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
index 8526d93cb..6dd90a846 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
index d2ba95650..cadc25073 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
index c276242f0..548b2011d 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
@@ -43,7 +43,7 @@ examples might be set to \fIrtsp://foo/twister\fP
The application does not have to keep the string around after setting this
option.
.SH DEFAULT
-\&'*'
+'*'
.SH PROTOCOLS
RTSP
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
index 60c776bc8..2162d113d 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
deleted file mode 100644
index 65445475d..000000000
--- a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
+++ /dev/null
@@ -1,64 +0,0 @@
-.\" **************************************************************************
-.\" * _ _ ____ _
-.\" * Project ___| | | | _ \| |
-.\" * / __| | | | |_) | |
-.\" * | (__| |_| | _ <| |___
-.\" * \___|\___/|_| \_\_____|
-.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-.\" *
-.\" * This software is licensed as described in the file COPYING, which
-.\" * you should have received as part of this distribution. The terms
-.\" * are also available at https://curl.haxx.se/docs/copyright.html.
-.\" *
-.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-.\" * copies of the Software, and permit persons to whom the Software is
-.\" * furnished to do so, under the terms of the COPYING file.
-.\" *
-.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-.\" * KIND, either express or implied.
-.\" *
-.\" **************************************************************************
-.\"
-.TH CURLOPT_SASL_AUTHZID 3 "11 Sep 2019" "libcurl 7.66.0" "curl_easy_setopt options"
-.SH NAME
-CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
-.SH SYNOPSIS
-#include <curl/curl.h>
-
-CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_AUTHZID, char *authzid);
-.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
-authorisation identity (authzid) for the transfer. Only applicable to the PLAIN
-SASL authentication mechanism where it is optional.
-
-When not specified only the authentication identity (authcid) as specified by
-the username will be sent to the server, along with the password. The server
-will derive a authzid from the authcid when not provided, which it will then
-uses internally.
-
-When the authzid is specified, the use of which is server dependent, it can be
-used to access another user's inbox, that the user has been granted access to,
-or a shared mailbox for example.
-.SH DEFAULT
-blank
-.SH PROTOCOLS
-IMAP, POP3 and SMTP
-.SH EXAMPLE
-.nf
-CURL *curl = curl_easy_init();
-if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "imap://example.com/");
- curl_easy_setopt(curl, CURLOPT_USERNAME, "Kurt");
- curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
- curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "Ursel");
- ret = curl_easy_perform(curl);
- curl_easy_cleanup(curl);
-}
-.fi
-.SH AVAILABILITY
-Added in 7.66.0
-.SH RETURN VALUE
-Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
-.SH "SEE ALSO"
-.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), ".BR CURLOPT_USERPWD "(3)"
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index 6f09c4d9a..7bc0b7cfa 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_IR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.3 b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
index 8bf2ddd22..e02a73f01 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "August 12, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
@@ -41,7 +41,7 @@ HTTP, FTP, SFTP
static int seek_cb(void *userp, curl_off_t offset, int origin)
{
struct data *d = (struct data *)userp;
- lseek(d->our_fd, offset, origin);
+ lseek(our_fd, offset, origin);
return CURL_SEEKFUNC_OK;
}
diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
index 62cf7cdbd..e62a69167 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
diff --git a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
index e1e4d5563..398696819 100644
--- a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3
index 3d2ba331d..0746c3492 100644
--- a/docs/libcurl/opts/CURLOPT_SHARE.3
+++ b/docs/libcurl/opts/CURLOPT_SHARE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SHARE \- specify share handle to use
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
index bff5f28f6..6d23ae2b1 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index 44cc5600e..226334582 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
index d197bd91d..b47448f07 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
index 9ca4271ed..2f8953029 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
index beab699b2..be3878664 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
index 7f726efdd..950006807 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
diff --git a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
index 893922c09..4fd7c04a2 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index 86ffb35a1..be7a7b04e 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
index 545007f91..b23272ff7 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
index cda31e36f..22159b6b6 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 06afe8c0e..a3d8515a1 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index 953a3c057..1cb8ac3e1 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
index b4c12f27d..9fda09bb6 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3
index a3e293dfa..f0a431f9f 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index 95f20a358..d8025fbc3 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index 2ca6da47f..56e7a4549 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index bc64851b0..88d756db9 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_SSLKEY.3
index 9d2fb138e..349ffc93e 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index e4b3ae332..79d6044d3 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index 5cce52a07..6f84b6ca1 100644
--- a/docs/libcurl/opts/CURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "October 30, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
@@ -80,11 +80,6 @@ The flag defines maximum supported TLS version as TLS v1.2.
The flag defines maximum supported TLS version as TLS v1.3.
(Added in 7.54.0)
.RE
-
-In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
-documented to allow \fIonly\fP the specified TLS version, but behavior was
-inconsistent depending on the TLS library.
-
.SH DEFAULT
CURL_SSLVERSION_DEFAULT
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
index 848dd7f49..27a62a796 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index 5e9c125c9..5e70aed7f 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
@@ -113,8 +113,8 @@ int main(void)
}
.fi
.SH AVAILABILITY
-Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
-mbedTLS. Other SSL backends are not supported.
+Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Other SSL
+backends not supported.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
index fade26edb..b4c70e528 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,10 +20,10 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "August 29, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
-CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
+CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL/CyaSSL or mbedTLS
.SH SYNOPSIS
.nf
#include <curl/curl.h>
@@ -33,8 +33,9 @@ CURLcode ssl_ctx_callback(CURL *curl, void *ssl_ctx, void *userptr);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION,
ssl_ctx_callback);
.SH DESCRIPTION
-This option only works for libcurl powered by OpenSSL, wolfSSL or mbedTLS. If
-libcurl was built against another SSL library this functionality is absent.
+This option only works for libcurl powered by OpenSSL, wolfSSL/CyaSSL or
+mbedTLS. If libcurl was built against another SSL library this functionality is
+absent.
Pass a pointer to your callback function, which should match the prototype
shown above.
@@ -43,11 +44,11 @@ This callback function gets called by libcurl just before the initialization
of an SSL connection after having processed all other SSL related options to
give a last chance to an application to modify the behavior of the SSL
initialization. The \fIssl_ctx\fP parameter is actually a pointer to the SSL
-library's \fISSL_CTX\fP for OpenSSL or wolfSSL, and a pointer to
-\fImbedtls_ssl_config\fP for mbedTLS. If an error is returned from the
-callback no attempt to establish a connection is made and the perform
-operation will return the callback's error code. Set the \fIuserptr\fP
-argument with the \fICURLOPT_SSL_CTX_DATA(3)\fP option.
+library's \fISSL_CTX\fP for OpenSSL or wolfSSL/CyaSSL, and a pointer to
+\fImbedtls_ssl_config\fP for mbedTLS. If an error is returned from the callback
+no attempt to establish a connection is made and the perform operation will
+return the callback's error code. Set the \fIuserptr\fP argument with the
+\fICURLOPT_SSL_CTX_DATA(3)\fP option.
This function will get called on all new connections made to a server, during
the SSL negotiation. The \fIssl_ctx\fP will point to a newly initialized object
@@ -72,8 +73,8 @@ See cacertinmem.c in docs/examples directory for usage example.
https://curl.haxx.se/libcurl/c/cacertinmem.html
.SH AVAILABILITY
-Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
-mbedTLS. Other SSL backends are not supported.
+Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Added in
+7.54.0 for mbedTLS. Other SSL backends not supported.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index 8f55d8916..b6dc16dad 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
index 1fe88a8ce..0cf74a245 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
index 60c7baede..2139b6993 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
index d6445fde5..f30848edc 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "January 29, 2019" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
@@ -42,10 +42,12 @@ This option is only supported for DarwinSSL, NSS and OpenSSL.
Added in 7.44.0:
\fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. This option is
-only supported for Schannel (the native Windows SSL library), with an
-exception in the case of Windows' Untrusted Publishers blacklist which it
-seems can't be bypassed.
+checks for those SSL backends where such behavior is present. \fBCurrently this
+option is only supported for Schannel (the native Windows SSL library), with an
+exception in the case of Windows' Untrusted Publishers blacklist which it seems
+can't be bypassed.\fP This option may have broader support to accommodate other
+SSL backends in the future.
+https://curl.haxx.se/docs/ssl-compared.html
.SH DEFAULT
0
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
index 20b04a57b..7d6b5bb05 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
index 026fcf8c8..efdebe4a7 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
@@ -46,15 +46,11 @@ Curl considers the server the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
URL to which you told Curl to connect.
-If \fIverify\fP value is set to 1:
-
-In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
-anymore due to frequently leading to programmer mistakes.
-
-From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
-and leaving the flag untouched.
-
-From 7.66.0: treats 1 and 2 the same.
+When the \fIverify\fP value is 1, \fIcurl_easy_setopt\fP will return an error
+and the option value will not be changed. It was previously (in 7.28.0 and
+earlier) a debug option of some sorts, but it is no longer supported due to
+frequently leading to programmer mistakes. Future versions will stop returning
+an error for 1 and just treat 1 and 2 the same.
When the \fIverify\fP value is 0, the connection succeeds regardless of the
names in the certificate. Use that ability with caution!
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index 0aa1f28f1..1f4a07184 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
index 344ce8e95..b77a750c5 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
diff --git a/docs/libcurl/opts/CURLOPT_STDERR.3 b/docs/libcurl/opts/CURLOPT_STDERR.3
index aebf6858d..f2e30d599 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 47949b2ac..5b5775e34 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
index fa2d943a7..d79378ed8 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
index 699304bf2..65e1ef498 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
diff --git a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
index d7d460767..6b169be9e 100644
--- a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
+++ b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
diff --git a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
index eeb5f06a5..e4d879437 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index 5f2a16d88..9254156da 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index 0d49cd03a..cd4292291 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index 0034c3609..d712e6dae 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index e1f22e2ca..a24ac9447 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index f5309db9f..ee5d62981 100644
--- a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
index cdc5a0803..be329c714 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index d814be4ba..13375f51e 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3 b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
index 05976eb3a..b11d62d90 100644
--- a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 0d33da863..5d4e52dc9 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT 3 "October 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "October 03, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
@@ -31,9 +31,9 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);
.SH DESCRIPTION
Pass a long as parameter containing \fItimeout\fP - the maximum time in
seconds that you allow the libcurl transfer operation to take. Normally, name
-lookups can take a considerable time and limiting operations risk aborting
-perfectly normal operations. This option may cause libcurl to use the SIGALRM
-signal to timeout system calls.
+lookups can take a considerable time and limiting operations to less than a
+few minutes risk aborting perfectly normal operations. This option may cause
+libcurl to use the SIGALRM signal to timeout system calls.
In unix-like systems, this might cause signals to be used unless
\fICURLOPT_NOSIGNAL(3)\fP is set.
@@ -41,12 +41,11 @@ In unix-like systems, this might cause signals to be used unless
If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the
value set last will be used.
-Since this option puts a hard limit on how long time a request is allowed to
-take, it has limited use in dynamic use cases with varying transfer times. That
-is especially apparent when using the multi interface, which may queue the
-transfer, and that time is included. You are advised to explore
-\fICURLOPT_LOW_SPEED_LIMIT(3)\fP, \fICURLOPT_LOW_SPEED_TIME(3)\fP or using
-\fICURLOPT_PROGRESSFUNCTION(3)\fP to implement your own timeout logic.
+Since this puts a hard limit for how long time a request is allowed to take,
+it has limited use in dynamic use cases with varying transfer times. You are
+then advised to explore \fICURLOPT_LOW_SPEED_LIMIT(3)\fP,
+\fICURLOPT_LOW_SPEED_TIME(3)\fP or using \fICURLOPT_PROGRESSFUNCTION(3)\fP to
+implement your own timeout logic.
.SH DEFAULT
Default timeout is 0 (zero) which means it never times out during transfer.
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index d5de79b93..1cb93575d 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index 61542bfc0..6df0c526c 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
index 61de7dd8a..20cf669e1 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
diff --git a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
index 0561d9d95..68a7aeebe 100644
--- a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLS13_CIPHERS 3 "October 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
@@ -37,10 +37,6 @@ You'll find more details about cipher lists on this URL:
https://curl.haxx.se/docs/ssl-ciphers.html
-This option is currently used only when curl is built to use OpenSSL 1.1.1 or
-later. If you are using a different SSL backend you can try setting TLS 1.3
-cipher suites by using the CURLOPT_SSL_CIPHER_LIST option.
-
The application does not have to keep the string around after setting this
option.
.SH DEFAULT
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 005e5e915..872613cfa 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
index aa1ee1604..f86cad0c7 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
index 764603525..e6bd46468 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3 b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
index 46c46653a..6f15f4a58 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,21 +20,21 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERDATA 3 "December 14, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
-.SH NAME
+.SH NAME:
CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
-.SH SYNOPSIS
+.SH SYNOPSIS:
#include <curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERDATA, void *userdata);
.SH DESCRIPTION:
Data pointer to be passed to the HTTP trailer callback function.
-.SH DEFAULT
+.SH DEFAULT:
NULL
-.SH PROTOCOLS
+.SH PROTOCOLS:
HTTP
-.SH EXAMPLE
+.SH EXAMPLE:
.nf
/* Assuming we have a CURL handle in the hndl variable. */
@@ -44,7 +44,7 @@ curl_easy_setopt(hndl, CURLOPT_TRAILERDATA, &data);
.fi
A more complete example can be found in examples/http_trailers.html
-.SH AVAILABILITY
+.SH AVAILABILITY:
This option was added in curl 7.64.0 and is present if HTTP support is enabled
.SH "SEE ALSO"
.BR CURLOPT_TRAILERFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
index b4535f406..285cf25c1 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,17 +20,17 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERFUNCTION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERFUNCTION 3 "December 14, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
-.SH NAME
+.SH NAME:
CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
-.SH SYNOPSIS
+.SH SYNOPSIS:
#include <curl.h>
int curl_trailer_callback(struct curl_slist ** list, void *userdata);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERFUNCTION, curl_trailer_callback *func);
-.SH DESCRIPTION
+.SH DESCRIPTION:
Pass a pointer to a callback function.
This callback function will be called once right before sending the final
@@ -57,11 +57,11 @@ trailers or to abort the request.
If you set this option to NULL, then the transfer proceeds as usual
without any interruptions.
-.SH DEFAULT
+.SH DEFAULT:
NULL
-.SH PROTOCOLS
+.SH PROTOCOLS:
HTTP
-.SH EXAMPLE
+.SH EXAMPLE:
#include <curl/curl.h>
static int trailer_cb(struct curl_slist **tr, void *data)
@@ -96,7 +96,7 @@ if(curl) {
curl_slist_free_all(headers);
}
-.SH AVAILABILITY
+.SH AVAILABILITY:
This option was added in curl 7.64.0 and is present if HTTP support is enabled
.SH "SEE ALSO"
.BR CURLOPT_TRAILERDATA "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index 3f0f97670..42cce74fe 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
index 6cb2d3b6f..af03da0fa 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index 7a61b8299..e82c27839 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
index 493be9ada..111a7d05f 100644
--- a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index f9b42fe3c..de9754ba2 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD \- enable data upload
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
index dc39eb578..9c8d950a6 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3
index 809769072..564d00015 100644
--- a/docs/libcurl/opts/CURLOPT_URL.3
+++ b/docs/libcurl/opts/CURLOPT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_URL 3 "November 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "November 11, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_URL \- provide the URL to use in the request
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index edaa01bec..a4a8fb551 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index 532573106..2e251a7ca 100644
--- a/docs/libcurl/opts/CURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 2b3b92d5c..05bdd0997 100644
--- a/docs/libcurl/opts/CURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_USERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index c72812b5c..ccd0045dc 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3
index 8063eb2cb..f80ad6ddb 100644
--- a/docs/libcurl/opts/CURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
index 280d6eaec..5aac8979c 100644
--- a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
index 4a3491ab1..2797d7fe4 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
index e9ca2e496..982954171 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index c7dfbe24e..de0837239 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
index b0ec54fb9..0519b246f 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
index 09e5315dc..45e5e3655 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.64.1" "curl_easy_setopt options"
.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index 93c4357d2..07547503b 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -43,7 +43,6 @@ man_MANS = \
CURLINFO_REDIRECT_URL.3 \
CURLINFO_REQUEST_SIZE.3 \
CURLINFO_RESPONSE_CODE.3 \
- CURLINFO_RETRY_AFTER.3 \
CURLINFO_RTSP_CLIENT_CSEQ.3 \
CURLINFO_RTSP_CSEQ_RECV.3 \
CURLINFO_RTSP_SERVER_CSEQ.3 \
@@ -68,7 +67,6 @@ man_MANS = \
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
CURLMOPT_MAXCONNECTS.3 \
- CURLMOPT_MAX_CONCURRENT_STREAMS.3 \
CURLMOPT_MAX_HOST_CONNECTIONS.3 \
CURLMOPT_MAX_PIPELINE_LENGTH.3 \
CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \
@@ -98,6 +96,7 @@ man_MANS = \
CURLOPT_CHUNK_END_FUNCTION.3 \
CURLOPT_CLOSESOCKETDATA.3 \
CURLOPT_CLOSESOCKETFUNCTION.3 \
+ CURLOPT_UPKEEP_INTERVAL_MS.3 \
CURLOPT_CONNECTTIMEOUT.3 \
CURLOPT_CONNECTTIMEOUT_MS.3 \
CURLOPT_CONNECT_ONLY.3 \
@@ -113,8 +112,8 @@ man_MANS = \
CURLOPT_COPYPOSTFIELDS.3 \
CURLOPT_CRLF.3 \
CURLOPT_CRLFILE.3 \
- CURLOPT_CURLU.3 \
CURLOPT_CUSTOMREQUEST.3 \
+ CURLOPT_CURLU.3 \
CURLOPT_DEBUGDATA.3 \
CURLOPT_DEBUGFUNCTION.3 \
CURLOPT_DEFAULT_PROTOCOL.3 \
@@ -168,6 +167,8 @@ man_MANS = \
CURLOPT_HTTP_TRANSFER_DECODING.3 \
CURLOPT_HTTP_VERSION.3 \
CURLOPT_IGNORE_CONTENT_LENGTH.3 \
+ CURLOPT_TRAILERDATA.3 \
+ CURLOPT_TRAILERFUNCTION.3 \
CURLOPT_INFILESIZE.3 \
CURLOPT_INFILESIZE_LARGE.3 \
CURLOPT_INTERFACE.3 \
@@ -188,7 +189,6 @@ man_MANS = \
CURLOPT_MAIL_AUTH.3 \
CURLOPT_MAIL_FROM.3 \
CURLOPT_MAIL_RCPT.3 \
- CURLOPT_MAXAGE_CONN.3 \
CURLOPT_MAXCONNECTS.3 \
CURLOPT_MAXFILESIZE.3 \
CURLOPT_MAXFILESIZE_LARGE.3 \
@@ -271,7 +271,6 @@ man_MANS = \
CURLOPT_RTSP_SESSION_ID.3 \
CURLOPT_RTSP_STREAM_URI.3 \
CURLOPT_RTSP_TRANSPORT.3 \
- CURLOPT_SASL_AUTHZID.3 \
CURLOPT_SASL_IR.3 \
CURLOPT_SEEKDATA.3 \
CURLOPT_SEEKFUNCTION.3 \
@@ -330,13 +329,10 @@ man_MANS = \
CURLOPT_TLSAUTH_PASSWORD.3 \
CURLOPT_TLSAUTH_TYPE.3 \
CURLOPT_TLSAUTH_USERNAME.3 \
- CURLOPT_TRAILERDATA.3 \
- CURLOPT_TRAILERFUNCTION.3 \
CURLOPT_TRANSFERTEXT.3 \
CURLOPT_TRANSFER_ENCODING.3 \
CURLOPT_UNIX_SOCKET_PATH.3 \
CURLOPT_UNRESTRICTED_AUTH.3 \
- CURLOPT_UPKEEP_INTERVAL_MS.3 \
CURLOPT_UPLOAD.3 \
CURLOPT_UPLOAD_BUFFERSIZE.3 \
CURLOPT_URL.3 \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index bf23b4488..0f43aee31 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -12,6 +12,7 @@
Name Introduced Deprecated Removed
+CURLALTSVC_ALTUSED 7.64.1
CURLALTSVC_H1 7.64.1
CURLALTSVC_H2 7.64.1
CURLALTSVC_H3 7.64.1
@@ -39,7 +40,6 @@ CURLCLOSEPOLICY_SLOWEST 7.7
CURLE_ABORTED_BY_CALLBACK 7.1
CURLE_AGAIN 7.18.2
CURLE_ALREADY_COMPLETE 7.7.2
-CURLE_AUTH_ERROR 7.66.0
CURLE_BAD_CALLING_ORDER 7.1 7.17.0
CURLE_BAD_CONTENT_ENCODING 7.10
CURLE_BAD_DOWNLOAD_RESUME 7.10
@@ -266,7 +266,6 @@ CURLINFO_REDIRECT_TIME_T 7.61.0
CURLINFO_REDIRECT_URL 7.18.2
CURLINFO_REQUEST_SIZE 7.4.1
CURLINFO_RESPONSE_CODE 7.10.8
-CURLINFO_RETRY_AFTER 7.66.0
CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
CURLINFO_RTSP_CSEQ_RECV 7.20.0
CURLINFO_RTSP_SERVER_CSEQ 7.20.0
@@ -319,7 +318,6 @@ CURLMOPT_MAXCONNECTS 7.16.3
CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0
CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0
CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0
-CURLMOPT_MAX_CONCURRENT_STREAMS 7.67.0
CURLMOPT_PIPELINING 7.16.0
CURLMOPT_PIPELINING_SERVER_BL 7.30.0
CURLMOPT_PIPELINING_SITE_BL 7.30.0
@@ -347,7 +345,6 @@ CURLOPTTYPE_LONG 7.1
CURLOPTTYPE_OBJECTPOINT 7.1
CURLOPTTYPE_OFF_T 7.11.0
CURLOPTTYPE_STRINGPOINT 7.46.0
-CURLOPTTYPE_SLISTPOINT 7.65.2
CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0
CURLOPT_ACCEPTTIMEOUT_MS 7.24.0
CURLOPT_ACCEPT_ENCODING 7.21.6
@@ -466,7 +463,6 @@ CURLOPT_LOW_SPEED_TIME 7.1
CURLOPT_MAIL_AUTH 7.25.0
CURLOPT_MAIL_FROM 7.20.0
CURLOPT_MAIL_RCPT 7.20.0
-CURLOPT_MAXAGE_CONN 7.65.0
CURLOPT_MAXCONNECTS 7.7
CURLOPT_MAXFILESIZE 7.10.8
CURLOPT_MAXFILESIZE_LARGE 7.11.0
@@ -556,7 +552,6 @@ CURLOPT_RTSP_SERVER_CSEQ 7.20.0
CURLOPT_RTSP_SESSION_ID 7.20.0
CURLOPT_RTSP_STREAM_URI 7.20.0
CURLOPT_RTSP_TRANSPORT 7.20.0
-CURLOPT_SASL_AUTHZID 7.66.0
CURLOPT_SASL_IR 7.31.0
CURLOPT_SEEKDATA 7.18.0
CURLOPT_SEEKFUNCTION 7.18.0
@@ -768,7 +763,6 @@ CURLUPART_QUERY 7.62.0
CURLUPART_SCHEME 7.62.0
CURLUPART_URL 7.62.0
CURLUPART_USER 7.62.0
-CURLUPART_ZONEID 7.65.0
CURLUSESSL_ALL 7.17.0
CURLUSESSL_CONTROL 7.17.0
CURLUSESSL_NONE 7.17.0
@@ -780,7 +774,6 @@ CURLU_DISALLOW_USER 7.62.0
CURLU_GUESS_SCHEME 7.62.0
CURLU_NON_SUPPORT_SCHEME 7.62.0
CURLU_NO_DEFAULT_PORT 7.62.0
-CURLU_NO_AUTHORITY 7.67.0
CURLU_PATH_AS_IS 7.62.0
CURLU_URLDECODE 7.62.0
CURLU_URLENCODE 7.62.0
@@ -790,7 +783,6 @@ CURLVERSION_FOURTH 7.16.1
CURLVERSION_NOW 7.10
CURLVERSION_SECOND 7.11.1
CURLVERSION_THIRD 7.12.0
-CURLVERSION_SIXTH 7.66.0
CURL_CHUNK_BGN_FUNC_FAIL 7.21.0
CURL_CHUNK_BGN_FUNC_OK 7.21.0
CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
@@ -835,7 +827,6 @@ CURL_HTTP_VERSION_2 7.43.0
CURL_HTTP_VERSION_2TLS 7.47.0
CURL_HTTP_VERSION_2_0 7.33.0
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
-CURL_HTTP_VERSION_3 7.66.0
CURL_HTTP_VERSION_NONE 7.9.1
CURL_IPRESOLVE_V4 7.10.8
CURL_IPRESOLVE_V6 7.10.8
@@ -927,11 +918,9 @@ CURL_VERSION_BROTLI 7.57.0
CURL_VERSION_CONV 7.15.4
CURL_VERSION_CURLDEBUG 7.19.6
CURL_VERSION_DEBUG 7.10.6
-CURL_VERSION_ESNI 7.67.0
CURL_VERSION_GSSAPI 7.38.0
CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0
CURL_VERSION_HTTP2 7.33.0
-CURL_VERSION_HTTP3 7.66.0
CURL_VERSION_HTTPS_PROXY 7.52.0
CURL_VERSION_IDN 7.12.0
CURL_VERSION_IPV6 7.10
diff --git a/include/curl/curl.h b/include/curl/curl.h
index dcbe8995c..86a24184a 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_CURL_H
-#define CURLINC_CURL_H
+#ifndef __CURL_CURL_H
+#define __CURL_CURL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -114,7 +114,7 @@ typedef void CURLSH;
#ifdef CURL_STATICLIB
# define CURL_EXTERN
-#elif defined(WIN32) || defined(__SYMBIAN32__) || \
+#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) || \
(__has_declspec_attribute(dllexport) && \
__has_declspec_attribute(dllimport))
# if defined(BUILDING_LIBCURL)
@@ -209,17 +209,16 @@ struct curl_httppost {
set. Added in 7.46.0 */
};
-/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
- considered deprecated but was the only choice up until 7.31.0 */
+/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered
+ deprecated but was the only choice up until 7.31.0 */
typedef int (*curl_progress_callback)(void *clientp,
double dltotal,
double dlnow,
double ultotal,
double ulnow);
-/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced
- in 7.32.0, avoids the use of floating point numbers and provides more
- detailed information. */
+/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in
+ 7.32.0, it avoids floating point and provides more detailed information. */
typedef int (*curl_xferinfo_callback)(void *clientp,
curl_off_t dltotal,
curl_off_t dlnow,
@@ -284,11 +283,14 @@ typedef enum {
#define CURLFINFOFLAG_KNOWN_SIZE (1<<6)
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7)
-/* Information about a single file, used when doing FTP wildcard matching */
+/* Content of this structure depends on information which is known and is
+ achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man
+ page for callbacks returning this structure -- some fields are mandatory,
+ some others are optional. The FLAG field has special meaning. */
struct curl_fileinfo {
char *filename;
curlfiletype filetype;
- time_t time; /* always zero! */
+ time_t time;
unsigned int perm;
int uid;
int gid;
@@ -600,8 +602,6 @@ typedef enum {
*/
CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from
inside a callback */
- CURLE_AUTH_ERROR, /* 94 - an authentication function returned an
- error */
CURL_LAST /* never use! */
} CURLcode;
@@ -685,10 +685,8 @@ typedef enum {
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
- void *ssl_ctx, /* actually an OpenSSL
- or WolfSSL SSL_CTX,
- or an mbedTLS
- mbedtls_ssl_config */
+ void *ssl_ctx, /* actually an
+ OpenSSL SSL_CTX */
void *userptr);
typedef enum {
@@ -885,7 +883,7 @@ typedef enum {
/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
#define CURLALTSVC_IMMEDIATELY (1<<0)
-
+#define CURLALTSVC_ALTUSED (1<<1)
#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1 (1<<3)
#define CURLALTSVC_H2 (1<<4)
@@ -926,6 +924,7 @@ typedef enum {
but 32 */
#define CURLOPTTYPE_LONG 0
#define CURLOPTTYPE_OBJECTPOINT 10000
+#define CURLOPTTYPE_STRINGPOINT 10000
#define CURLOPTTYPE_FUNCTIONPOINT 20000
#define CURLOPTTYPE_OFF_T 30000
@@ -945,15 +944,12 @@ typedef enum {
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
#define LONG CURLOPTTYPE_LONG
#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
+#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT
#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
#define OFF_T CURLOPTTYPE_OFF_T
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
#endif
-/* handy aliases that make no run-time difference */
-#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
-#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT
-
/*
* This macro-mania below setups the CURLOPT_[what] enum, to be used with
* curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
@@ -1051,7 +1047,7 @@ typedef enum {
/* This points to a linked list of headers, struct curl_slist kind. This
list is also used for RTSP (in spite of its name) */
- CINIT(HTTPHEADER, SLISTPOINT, 23),
+ CINIT(HTTPHEADER, OBJECTPOINT, 23),
/* This points to a linked list of post entries, struct curl_httppost */
CINIT(HTTPPOST, OBJECTPOINT, 24),
@@ -1066,7 +1062,7 @@ typedef enum {
CINIT(CRLF, LONG, 27),
/* send linked-list of QUOTE commands */
- CINIT(QUOTE, SLISTPOINT, 28),
+ CINIT(QUOTE, OBJECTPOINT, 28),
/* send FILE * or void * to store headers to, if you use a callback it
is simply passed to the callback unmodified */
@@ -1101,7 +1097,7 @@ typedef enum {
/* 38 is not used */
/* send linked-list of post-transfer QUOTE commands */
- CINIT(POSTQUOTE, SLISTPOINT, 39),
+ CINIT(POSTQUOTE, OBJECTPOINT, 39),
CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
@@ -1177,7 +1173,7 @@ typedef enum {
CINIT(FILETIME, LONG, 69),
/* This points to a linked list of telnet options */
- CINIT(TELNETOPTIONS, SLISTPOINT, 70),
+ CINIT(TELNETOPTIONS, OBJECTPOINT, 70),
/* Max amount of cached alive connections */
CINIT(MAXCONNECTS, LONG, 71),
@@ -1261,7 +1257,7 @@ typedef enum {
CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
/* send linked-list of pre-transfer QUOTE commands */
- CINIT(PREQUOTE, SLISTPOINT, 93),
+ CINIT(PREQUOTE, OBJECTPOINT, 93),
/* set the debug function */
CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),
@@ -1301,7 +1297,7 @@ typedef enum {
CINIT(PRIVATE, OBJECTPOINT, 103),
/* Set aliases for HTTP 200 in the HTTP Response header */
- CINIT(HTTP200ALIASES, SLISTPOINT, 104),
+ CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
/* Continue to send authentication (user+password) when following locations,
even when hostname changed. This can potentially send off the name
@@ -1318,9 +1314,9 @@ typedef enum {
Note that setting multiple bits may cause extra network round-trips. */
CINIT(HTTPAUTH, LONG, 107),
- /* Set the ssl context callback function, currently only for OpenSSL or
- WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
- The function must match the curl_ssl_ctx_callback prototype. */
+ /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx
+ in second argument. The function must be matching the
+ curl_ssl_ctx_callback proto. */
CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
/* Set the userdata for the ssl context callback function's third
@@ -1573,7 +1569,8 @@ typedef enum {
/* set the bitmask for the protocols that libcurl is allowed to follow to,
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
- to be set in both bitmasks to be allowed to get redirected to. */
+ to be set in both bitmasks to be allowed to get redirected to. Defaults
+ to all protocols except FILE and SCP. */
CINIT(REDIR_PROTOCOLS, LONG, 182),
/* set the SSH knownhost file name to use */
@@ -1590,7 +1587,7 @@ typedef enum {
CINIT(MAIL_FROM, STRINGPOINT, 186),
/* set the list of SMTP mail receiver(s) */
- CINIT(MAIL_RCPT, SLISTPOINT, 187),
+ CINIT(MAIL_RCPT, OBJECTPOINT, 187),
/* FTP: send PRET before PASV */
CINIT(FTP_USE_PRET, LONG, 188),
@@ -1640,7 +1637,7 @@ typedef enum {
CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
/* send linked-list of name:port:address sets */
- CINIT(RESOLVE, SLISTPOINT, 203),
+ CINIT(RESOLVE, OBJECTPOINT, 203),
/* Set a username for authenticated TLS */
CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204),
@@ -1730,7 +1727,7 @@ typedef enum {
/* This points to a linked list of headers used for proxy requests only,
struct curl_slist kind */
- CINIT(PROXYHEADER, SLISTPOINT, 228),
+ CINIT(PROXYHEADER, OBJECTPOINT, 228),
/* Pass in a bitmask of "header options" */
CINIT(HEADEROPT, LONG, 229),
@@ -1777,7 +1774,7 @@ typedef enum {
/* Linked-list of host:port:connect-to-host:connect-to-port,
overrides the URL's host:port (only for the network layer) */
- CINIT(CONNECT_TO, SLISTPOINT, 243),
+ CINIT(CONNECT_TO, OBJECTPOINT, 243),
/* Set TCP Fast Open */
CINIT(TCP_FASTOPEN, LONG, 244),
@@ -1921,12 +1918,6 @@ typedef enum {
/* alt-svc cache file name to possibly read from/write to */
CINIT(ALTSVC, STRINGPOINT, 287),
- /* maximum age of a connection to consider it for reuse (in seconds) */
- CINIT(MAXAGE_CONN, LONG, 288),
-
- /* SASL authorisation identity */
- CINIT(SASL_AUTHZID, STRINGPOINT, 289),
-
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -1980,8 +1971,7 @@ enum {
CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1
Upgrade */
- CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback.
- Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */
+
CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};
@@ -2521,8 +2511,8 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
*/
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
-/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS
- and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+/* info about the certificate chain, only for OpenSSL builds. Asked
+ for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
struct curl_certinfo {
int num_of_certs; /* number of certificates with information */
struct curl_slist **certinfo; /* for each index in this array, there's a
@@ -2617,9 +2607,8 @@ typedef enum {
CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55,
CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
- CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57,
- CURLINFO_LASTONE = 57
+ CURLINFO_LASTONE = 56
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -2718,7 +2707,6 @@ typedef enum {
CURLVERSION_THIRD,
CURLVERSION_FOURTH,
CURLVERSION_FIFTH,
- CURLVERSION_SIXTH,
CURLVERSION_LAST /* never actually use this */
} CURLversion;
@@ -2727,7 +2715,7 @@ typedef enum {
meant to be a built-in version number for what kind of struct the caller
expects. If the struct ever changes, we redefine the NOW to another enum
from above. */
-#define CURLVERSION_NOW CURLVERSION_SIXTH
+#define CURLVERSION_NOW CURLVERSION_FIFTH
typedef struct {
CURLversion age; /* age of the returned struct */
@@ -2756,16 +2744,11 @@ typedef struct {
const char *libssh_version; /* human readable string */
/* These fields were added in CURLVERSION_FIFTH */
+
unsigned int brotli_ver_num; /* Numeric Brotli version
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *brotli_version; /* human readable string. */
- /* These fields were added in CURLVERSION_SIXTH */
- unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
- (MAJOR << 16) | (MINOR << 8) | PATCH */
- const char *nghttp2_version; /* human readable string. */
- const char *quic_version; /* human readable quic (+ HTTP/3) library +
- version or NULL */
} curl_version_info_data;
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
@@ -2798,9 +2781,6 @@ typedef struct {
#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */
#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */
#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */
-#define CURL_VERSION_HTTP3 (1<<25) /* HTTP3 support built-in */
-
-#define CURL_VERSION_ESNI (1<<26) /* ESNI support */
/*
* NAME curl_version_info()
@@ -2881,4 +2861,4 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
#endif /* __STDC__ >= 1 */
#endif /* gcc >= 4.3 && !__cplusplus */
-#endif /* CURLINC_CURL_H */
+#endif /* __CURL_CURL_H */
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index cab09eebd..9a4b9b02d 100644
--- a/include/curl/curlver.h
+++ b/include/curl/curlver.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_CURLVER_H
-#define CURLINC_CURLVER_H
+#ifndef __CURL_CURLVER_H
+#define __CURL_CURLVER_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -30,13 +30,13 @@
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.67.0"
+#define LIBCURL_VERSION "7.64.1"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 67
-#define LIBCURL_VERSION_PATCH 0
+#define LIBCURL_VERSION_MINOR 64
+#define LIBCURL_VERSION_PATCH 1
/* This is the numeric version of the libcurl version number, meant for easier
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
@@ -57,7 +57,7 @@
CURL_VERSION_BITS() macro since curl's own configure script greps for it
and needs it to contain the full number.
*/
-#define LIBCURL_VERSION_NUM 0x074300
+#define LIBCURL_VERSION_NUM 0x074001
/*
* This is the date and time when the full source package was created. The
@@ -68,10 +68,10 @@
*
* "2007-11-23"
*/
-#define LIBCURL_TIMESTAMP "2019-11-06"
+#define LIBCURL_TIMESTAMP "2019-03-27"
-#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
+#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
#define CURL_AT_LEAST_VERSION(x,y,z) \
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
-#endif /* CURLINC_CURLVER_H */
+#endif /* __CURL_CURLVER_H */
diff --git a/include/curl/easy.h b/include/curl/easy.h
index 592f5d3c1..f42a8a969 100644
--- a/include/curl/easy.h
+++ b/include/curl/easy.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_EASY_H
-#define CURLINC_EASY_H
+#ifndef __CURL_EASY_H
+#define __CURL_EASY_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/include/curl/mprintf.h b/include/curl/mprintf.h
index f615ed7d6..e20f546e1 100644
--- a/include/curl/mprintf.h
+++ b/include/curl/mprintf.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_MPRINTF_H
-#define CURLINC_MPRINTF_H
+#ifndef __CURL_MPRINTF_H
+#define __CURL_MPRINTF_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,4 +47,4 @@ CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
}
#endif
-#endif /* CURLINC_MPRINTF_H */
+#endif /* __CURL_MPRINTF_H */
diff --git a/include/curl/multi.h b/include/curl/multi.h
index b39218395..b19dbaf79 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_MULTI_H
-#define CURLINC_MULTI_H
+#ifndef __CURL_MULTI_H
+#define __CURL_MULTI_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -173,20 +173,6 @@ CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
int timeout_ms,
int *ret);
-/*
- * Name: curl_multi_poll()
- *
- * Desc: Poll on all fds within a CURLM set as well as any
- * additional fds passed to the function.
- *
- * Returns: CURLMcode type, general multi error code.
- */
-CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *ret);
-
/*
* Name: curl_multi_perform()
*
@@ -396,9 +382,6 @@ typedef enum {
/* This is the argument passed to the server push callback */
CINIT(PUSHDATA, OBJECTPOINT, 15),
- /* maximum number of concurrent streams to support on a connection */
- CINIT(MAX_CONCURRENT_STREAMS, LONG, 16),
-
CURLMOPT_LASTENTRY /* the last unused */
} CURLMoption;
@@ -451,9 +434,6 @@ typedef int (*curl_push_callback)(CURL *parent,
struct curl_pushheaders *headers,
void *userp);
-/* value for MAXIMUM CONCURRENT STREAMS upper limit */
-#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
-
#ifdef __cplusplus
} /* end of extern "C" */
#endif
diff --git a/include/curl/stdcheaders.h b/include/curl/stdcheaders.h
index a6bdc1a25..027b6f421 100644
--- a/include/curl/stdcheaders.h
+++ b/include/curl/stdcheaders.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_STDCHEADERS_H
-#define CURLINC_STDCHEADERS_H
+#ifndef __STDC_HEADERS_H
+#define __STDC_HEADERS_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,4 +30,4 @@ size_t fwrite(const void *, size_t, size_t, FILE *);
int strcasecmp(const char *, const char *);
int strncasecmp(const char *, const char *, size_t);
-#endif /* CURLINC_STDCHEADERS_H */
+#endif /* __STDC_HEADERS_H */
diff --git a/include/curl/system.h b/include/curl/system.h
index cd37c2bf5..1e555ec19 100644
--- a/include/curl/system.h
+++ b/include/curl/system.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_SYSTEM_H
-#define CURLINC_SYSTEM_H
+#ifndef __CURL_SYSTEM_H
+#define __CURL_SYSTEM_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -473,21 +473,21 @@
*/
#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
-# define CURLINC_OFF_T_C_HLPR2(x) x
-# define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
-# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
- CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
-# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
- CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
+# define __CURL_OFF_T_C_HLPR2(x) x
+# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
+# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
+ __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
+# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
+ __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
#else
# ifdef CURL_ISOCPP
-# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
+# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
# else
-# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
+# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
# endif
-# define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
-# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
-# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
+# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
+# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
+# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
#endif
-#endif /* CURLINC_SYSTEM_H */
+#endif /* __CURL_SYSTEM_H */
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index 03c84fc85..8018ea37f 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_TYPECHECK_GCC_H
-#define CURLINC_TYPECHECK_GCC_H
+#ifndef __CURL_TYPECHECK_GCC_H
+#define __CURL_TYPECHECK_GCC_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -25,10 +25,10 @@
/* wraps curl_easy_setopt() with typechecking */
/* To add a new kind of warning, add an
- * if(curlcheck_sometype_option(_curl_opt))
- * if(!curlcheck_sometype(value))
+ * if(_curl_is_sometype_option(_curl_opt))
+ * if(!_curl_is_sometype(value))
* _curl_easy_setopt_err_sometype();
- * block and define curlcheck_sometype_option, curlcheck_sometype and
+ * block and define _curl_is_sometype_option, _curl_is_sometype and
* _curl_easy_setopt_err_sometype below
*
* NOTE: We use two nested 'if' statements here instead of the && operator, in
@@ -38,115 +38,117 @@
* To add an option that uses the same type as an existing option, you'll just
* need to extend the appropriate _curl_*_option macro
*/
-#define curl_easy_setopt(handle, option, value) \
- __extension__({ \
- __typeof__(option) _curl_opt = option; \
- if(__builtin_constant_p(_curl_opt)) { \
- if(curlcheck_long_option(_curl_opt)) \
- if(!curlcheck_long(value)) \
- _curl_easy_setopt_err_long(); \
- if(curlcheck_off_t_option(_curl_opt)) \
- if(!curlcheck_off_t(value)) \
- _curl_easy_setopt_err_curl_off_t(); \
- if(curlcheck_string_option(_curl_opt)) \
- if(!curlcheck_string(value)) \
- _curl_easy_setopt_err_string(); \
- if(curlcheck_write_cb_option(_curl_opt)) \
- if(!curlcheck_write_cb(value)) \
- _curl_easy_setopt_err_write_callback(); \
- if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
- if(!curlcheck_resolver_start_callback(value)) \
- _curl_easy_setopt_err_resolver_start_callback(); \
- if((_curl_opt) == CURLOPT_READFUNCTION) \
- if(!curlcheck_read_cb(value)) \
- _curl_easy_setopt_err_read_cb(); \
- if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
- if(!curlcheck_ioctl_cb(value)) \
- _curl_easy_setopt_err_ioctl_cb(); \
- if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
- if(!curlcheck_sockopt_cb(value)) \
- _curl_easy_setopt_err_sockopt_cb(); \
- if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
- if(!curlcheck_opensocket_cb(value)) \
- _curl_easy_setopt_err_opensocket_cb(); \
- if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
- if(!curlcheck_progress_cb(value)) \
- _curl_easy_setopt_err_progress_cb(); \
- if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
- if(!curlcheck_debug_cb(value)) \
- _curl_easy_setopt_err_debug_cb(); \
- if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
- if(!curlcheck_ssl_ctx_cb(value)) \
- _curl_easy_setopt_err_ssl_ctx_cb(); \
- if(curlcheck_conv_cb_option(_curl_opt)) \
- if(!curlcheck_conv_cb(value)) \
- _curl_easy_setopt_err_conv_cb(); \
- if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
- if(!curlcheck_seek_cb(value)) \
- _curl_easy_setopt_err_seek_cb(); \
- if(curlcheck_cb_data_option(_curl_opt)) \
- if(!curlcheck_cb_data(value)) \
- _curl_easy_setopt_err_cb_data(); \
- if((_curl_opt) == CURLOPT_ERRORBUFFER) \
- if(!curlcheck_error_buffer(value)) \
- _curl_easy_setopt_err_error_buffer(); \
- if((_curl_opt) == CURLOPT_STDERR) \
- if(!curlcheck_FILE(value)) \
- _curl_easy_setopt_err_FILE(); \
- if(curlcheck_postfields_option(_curl_opt)) \
- if(!curlcheck_postfields(value)) \
- _curl_easy_setopt_err_postfields(); \
- if((_curl_opt) == CURLOPT_HTTPPOST) \
- if(!curlcheck_arr((value), struct curl_httppost)) \
- _curl_easy_setopt_err_curl_httpost(); \
- if((_curl_opt) == CURLOPT_MIMEPOST) \
- if(!curlcheck_ptr((value), curl_mime)) \
- _curl_easy_setopt_err_curl_mimepost(); \
- if(curlcheck_slist_option(_curl_opt)) \
- if(!curlcheck_arr((value), struct curl_slist)) \
- _curl_easy_setopt_err_curl_slist(); \
- if((_curl_opt) == CURLOPT_SHARE) \
- if(!curlcheck_ptr((value), CURLSH)) \
- _curl_easy_setopt_err_CURLSH(); \
- } \
- curl_easy_setopt(handle, _curl_opt, value); \
- })
+#define curl_easy_setopt(handle, option, value) \
+__extension__ ({ \
+ __typeof__(option) _curl_opt = option; \
+ if(__builtin_constant_p(_curl_opt)) { \
+ if(_curl_is_long_option(_curl_opt)) \
+ if(!_curl_is_long(value)) \
+ _curl_easy_setopt_err_long(); \
+ if(_curl_is_off_t_option(_curl_opt)) \
+ if(!_curl_is_off_t(value)) \
+ _curl_easy_setopt_err_curl_off_t(); \
+ if(_curl_is_string_option(_curl_opt)) \
+ if(!_curl_is_string(value)) \
+ _curl_easy_setopt_err_string(); \
+ if(_curl_is_write_cb_option(_curl_opt)) \
+ if(!_curl_is_write_cb(value)) \
+ _curl_easy_setopt_err_write_callback(); \
+ if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
+ if(!_curl_is_resolver_start_callback(value)) \
+ _curl_easy_setopt_err_resolver_start_callback(); \
+ if((_curl_opt) == CURLOPT_READFUNCTION) \
+ if(!_curl_is_read_cb(value)) \
+ _curl_easy_setopt_err_read_cb(); \
+ if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
+ if(!_curl_is_ioctl_cb(value)) \
+ _curl_easy_setopt_err_ioctl_cb(); \
+ if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
+ if(!_curl_is_sockopt_cb(value)) \
+ _curl_easy_setopt_err_sockopt_cb(); \
+ if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
+ if(!_curl_is_opensocket_cb(value)) \
+ _curl_easy_setopt_err_opensocket_cb(); \
+ if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
+ if(!_curl_is_progress_cb(value)) \
+ _curl_easy_setopt_err_progress_cb(); \
+ if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
+ if(!_curl_is_debug_cb(value)) \
+ _curl_easy_setopt_err_debug_cb(); \
+ if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
+ if(!_curl_is_ssl_ctx_cb(value)) \
+ _curl_easy_setopt_err_ssl_ctx_cb(); \
+ if(_curl_is_conv_cb_option(_curl_opt)) \
+ if(!_curl_is_conv_cb(value)) \
+ _curl_easy_setopt_err_conv_cb(); \
+ if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
+ if(!_curl_is_seek_cb(value)) \
+ _curl_easy_setopt_err_seek_cb(); \
+ if(_curl_is_cb_data_option(_curl_opt)) \
+ if(!_curl_is_cb_data(value)) \
+ _curl_easy_setopt_err_cb_data(); \
+ if((_curl_opt) == CURLOPT_ERRORBUFFER) \
+ if(!_curl_is_error_buffer(value)) \
+ _curl_easy_setopt_err_error_buffer(); \
+ if((_curl_opt) == CURLOPT_STDERR) \
+ if(!_curl_is_FILE(value)) \
+ _curl_easy_setopt_err_FILE(); \
+ if(_curl_is_postfields_option(_curl_opt)) \
+ if(!_curl_is_postfields(value)) \
+ _curl_easy_setopt_err_postfields(); \
+ if((_curl_opt) == CURLOPT_HTTPPOST) \
+ if(!_curl_is_arr((value), struct curl_httppost)) \
+ _curl_easy_setopt_err_curl_httpost(); \
+ if((_curl_opt) == CURLOPT_MIMEPOST) \
+ if(!_curl_is_ptr((value), curl_mime)) \
+ _curl_easy_setopt_err_curl_mimepost(); \
+ if(_curl_is_slist_option(_curl_opt)) \
+ if(!_curl_is_arr((value), struct curl_slist)) \
+ _curl_easy_setopt_err_curl_slist(); \
+ if((_curl_opt) == CURLOPT_SHARE) \
+ if(!_curl_is_ptr((value), CURLSH)) \
+ _curl_easy_setopt_err_CURLSH(); \
+ } \
+ curl_easy_setopt(handle, _curl_opt, value); \
+})
/* wraps curl_easy_getinfo() with typechecking */
-#define curl_easy_getinfo(handle, info, arg) \
- __extension__({ \
- __typeof__(info) _curl_info = info; \
- if(__builtin_constant_p(_curl_info)) { \
- if(curlcheck_string_info(_curl_info)) \
- if(!curlcheck_arr((arg), char *)) \
- _curl_easy_getinfo_err_string(); \
- if(curlcheck_long_info(_curl_info)) \
- if(!curlcheck_arr((arg), long)) \
- _curl_easy_getinfo_err_long(); \
- if(curlcheck_double_info(_curl_info)) \
- if(!curlcheck_arr((arg), double)) \
- _curl_easy_getinfo_err_double(); \
- if(curlcheck_slist_info(_curl_info)) \
- if(!curlcheck_arr((arg), struct curl_slist *)) \
- _curl_easy_getinfo_err_curl_slist(); \
- if(curlcheck_tlssessioninfo_info(_curl_info)) \
- if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \
- _curl_easy_getinfo_err_curl_tlssesssioninfo(); \
- if(curlcheck_certinfo_info(_curl_info)) \
- if(!curlcheck_arr((arg), struct curl_certinfo *)) \
- _curl_easy_getinfo_err_curl_certinfo(); \
- if(curlcheck_socket_info(_curl_info)) \
- if(!curlcheck_arr((arg), curl_socket_t)) \
- _curl_easy_getinfo_err_curl_socket(); \
- if(curlcheck_off_t_info(_curl_info)) \
- if(!curlcheck_arr((arg), curl_off_t)) \
- _curl_easy_getinfo_err_curl_off_t(); \
- } \
- curl_easy_getinfo(handle, _curl_info, arg); \
- })
-
-/*
- * For now, just make sure that the functions are called with three arguments
+/* FIXME: don't allow const pointers */
+#define curl_easy_getinfo(handle, info, arg) \
+__extension__ ({ \
+ __typeof__(info) _curl_info = info; \
+ if(__builtin_constant_p(_curl_info)) { \
+ if(_curl_is_string_info(_curl_info)) \
+ if(!_curl_is_arr((arg), char *)) \
+ _curl_easy_getinfo_err_string(); \
+ if(_curl_is_long_info(_curl_info)) \
+ if(!_curl_is_arr((arg), long)) \
+ _curl_easy_getinfo_err_long(); \
+ if(_curl_is_double_info(_curl_info)) \
+ if(!_curl_is_arr((arg), double)) \
+ _curl_easy_getinfo_err_double(); \
+ if(_curl_is_slist_info(_curl_info)) \
+ if(!_curl_is_arr((arg), struct curl_slist *)) \
+ _curl_easy_getinfo_err_curl_slist(); \
+ if(_curl_is_tlssessioninfo_info(_curl_info)) \
+ if(!_curl_is_arr((arg), struct curl_tlssessioninfo *)) \
+ _curl_easy_getinfo_err_curl_tlssesssioninfo(); \
+ if(_curl_is_certinfo_info(_curl_info)) \
+ if(!_curl_is_arr((arg), struct curl_certinfo *)) \
+ _curl_easy_getinfo_err_curl_certinfo(); \
+ if(_curl_is_socket_info(_curl_info)) \
+ if(!_curl_is_arr((arg), curl_socket_t)) \
+ _curl_easy_getinfo_err_curl_socket(); \
+ if(_curl_is_off_t_info(_curl_info)) \
+ if(!_curl_is_arr((arg), curl_off_t)) \
+ _curl_easy_getinfo_err_curl_off_t(); \
+ } \
+ curl_easy_getinfo(handle, _curl_info, arg); \
+})
+
+/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(),
+ * for now just make sure that the functions are called with three
+ * arguments
*/
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
@@ -156,83 +158,83 @@
* functions */
/* To define a new warning, use _CURL_WARNING(identifier, "message") */
-#define CURLWARNING(id, message) \
- static void __attribute__((__warning__(message))) \
- __attribute__((__unused__)) __attribute__((__noinline__)) \
+#define _CURL_WARNING(id, message) \
+ static void __attribute__((__warning__(message))) \
+ __attribute__((__unused__)) __attribute__((__noinline__)) \
id(void) { __asm__(""); }
-CURLWARNING(_curl_easy_setopt_err_long,
+_CURL_WARNING(_curl_easy_setopt_err_long,
"curl_easy_setopt expects a long argument for this option")
-CURLWARNING(_curl_easy_setopt_err_curl_off_t,
+_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
"curl_easy_setopt expects a curl_off_t argument for this option")
-CURLWARNING(_curl_easy_setopt_err_string,
+_CURL_WARNING(_curl_easy_setopt_err_string,
"curl_easy_setopt expects a "
"string ('char *' or char[]) argument for this option"
)
-CURLWARNING(_curl_easy_setopt_err_write_callback,
+_CURL_WARNING(_curl_easy_setopt_err_write_callback,
"curl_easy_setopt expects a curl_write_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_resolver_start_callback,
+_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
"curl_easy_setopt expects a "
"curl_resolver_start_callback argument for this option"
)
-CURLWARNING(_curl_easy_setopt_err_read_cb,
+_CURL_WARNING(_curl_easy_setopt_err_read_cb,
"curl_easy_setopt expects a curl_read_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_ioctl_cb,
+_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
"curl_easy_setopt expects a curl_ioctl_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_sockopt_cb,
+_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
"curl_easy_setopt expects a curl_sockopt_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_opensocket_cb,
+_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
"curl_easy_setopt expects a "
"curl_opensocket_callback argument for this option"
)
-CURLWARNING(_curl_easy_setopt_err_progress_cb,
+_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
"curl_easy_setopt expects a curl_progress_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_debug_cb,
+_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
"curl_easy_setopt expects a curl_debug_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb,
+_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
"curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_conv_cb,
+_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
"curl_easy_setopt expects a curl_conv_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_seek_cb,
+_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
"curl_easy_setopt expects a curl_seek_callback argument for this option")
-CURLWARNING(_curl_easy_setopt_err_cb_data,
+_CURL_WARNING(_curl_easy_setopt_err_cb_data,
"curl_easy_setopt expects a "
"private data pointer as argument for this option")
-CURLWARNING(_curl_easy_setopt_err_error_buffer,
+_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
"curl_easy_setopt expects a "
"char buffer of CURL_ERROR_SIZE as argument for this option")
-CURLWARNING(_curl_easy_setopt_err_FILE,
+_CURL_WARNING(_curl_easy_setopt_err_FILE,
"curl_easy_setopt expects a 'FILE *' argument for this option")
-CURLWARNING(_curl_easy_setopt_err_postfields,
+_CURL_WARNING(_curl_easy_setopt_err_postfields,
"curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
-CURLWARNING(_curl_easy_setopt_err_curl_httpost,
+_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
"curl_easy_setopt expects a 'struct curl_httppost *' "
"argument for this option")
-CURLWARNING(_curl_easy_setopt_err_curl_mimepost,
+_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
"curl_easy_setopt expects a 'curl_mime *' "
"argument for this option")
-CURLWARNING(_curl_easy_setopt_err_curl_slist,
+_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
"curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
-CURLWARNING(_curl_easy_setopt_err_CURLSH,
+_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
"curl_easy_setopt expects a CURLSH* argument for this option")
-CURLWARNING(_curl_easy_getinfo_err_string,
+_CURL_WARNING(_curl_easy_getinfo_err_string,
"curl_easy_getinfo expects a pointer to 'char *' for this info")
-CURLWARNING(_curl_easy_getinfo_err_long,
+_CURL_WARNING(_curl_easy_getinfo_err_long,
"curl_easy_getinfo expects a pointer to long for this info")
-CURLWARNING(_curl_easy_getinfo_err_double,
+_CURL_WARNING(_curl_easy_getinfo_err_double,
"curl_easy_getinfo expects a pointer to double for this info")
-CURLWARNING(_curl_easy_getinfo_err_curl_slist,
+_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
"curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
-CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
+_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
"curl_easy_getinfo expects a pointer to "
"'struct curl_tlssessioninfo *' for this info")
-CURLWARNING(_curl_easy_getinfo_err_curl_certinfo,
+_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
"curl_easy_getinfo expects a pointer to "
"'struct curl_certinfo *' for this info")
-CURLWARNING(_curl_easy_getinfo_err_curl_socket,
+_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
"curl_easy_getinfo expects a pointer to curl_socket_t for this info")
-CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
+_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
"curl_easy_getinfo expects a pointer to curl_off_t for this info")
/* groups of curl_easy_setops options that take the same type of argument */
@@ -244,14 +246,14 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
*/
/* evaluates to true if option takes a long argument */
-#define curlcheck_long_option(option) \
+#define _curl_is_long_option(option) \
(0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
-#define curlcheck_off_t_option(option) \
+#define _curl_is_off_t_option(option) \
((option) > CURLOPTTYPE_OFF_T)
/* evaluates to true if option takes a char* argument */
-#define curlcheck_string_option(option) \
+#define _curl_is_string_option(option) \
((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \
(option) == CURLOPT_ACCEPT_ENCODING || \
(option) == CURLOPT_ALTSVC || \
@@ -300,18 +302,15 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_PROXY_SSLKEY || \
(option) == CURLOPT_PROXY_SSLKEYTYPE || \
(option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \
- (option) == CURLOPT_PROXY_TLS13_CIPHERS || \
(option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \
- (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
(option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
+ (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
(option) == CURLOPT_RANDOM_FILE || \
(option) == CURLOPT_RANGE || \
(option) == CURLOPT_REFERER || \
- (option) == CURLOPT_REQUEST_TARGET || \
(option) == CURLOPT_RTSP_SESSION_ID || \
(option) == CURLOPT_RTSP_STREAM_URI || \
(option) == CURLOPT_RTSP_TRANSPORT || \
- (option) == CURLOPT_SASL_AUTHZID || \
(option) == CURLOPT_SERVICE_NAME || \
(option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \
(option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \
@@ -324,7 +323,6 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_SSLKEY || \
(option) == CURLOPT_SSLKEYTYPE || \
(option) == CURLOPT_SSL_CIPHER_LIST || \
- (option) == CURLOPT_TLS13_CIPHERS || \
(option) == CURLOPT_TLSAUTH_PASSWORD || \
(option) == CURLOPT_TLSAUTH_TYPE || \
(option) == CURLOPT_TLSAUTH_USERNAME || \
@@ -337,18 +335,18 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
0)
/* evaluates to true if option takes a curl_write_callback argument */
-#define curlcheck_write_cb_option(option) \
- ((option) == CURLOPT_HEADERFUNCTION || \
+#define _curl_is_write_cb_option(option) \
+ ((option) == CURLOPT_HEADERFUNCTION || \
(option) == CURLOPT_WRITEFUNCTION)
/* evaluates to true if option takes a curl_conv_callback argument */
-#define curlcheck_conv_cb_option(option) \
- ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
- (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
+#define _curl_is_conv_cb_option(option) \
+ ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
+ (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
(option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
/* evaluates to true if option takes a data argument to pass to a callback */
-#define curlcheck_cb_data_option(option) \
+#define _curl_is_cb_data_option(option) \
((option) == CURLOPT_CHUNK_DATA || \
(option) == CURLOPT_CLOSESOCKETDATA || \
(option) == CURLOPT_DEBUGDATA || \
@@ -366,17 +364,17 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_SSL_CTX_DATA || \
(option) == CURLOPT_WRITEDATA || \
(option) == CURLOPT_RESOLVER_START_DATA || \
- (option) == CURLOPT_TRAILERDATA || \
+ (option) == CURLOPT_CURLU || \
0)
/* evaluates to true if option takes a POST data argument (void* or char*) */
-#define curlcheck_postfields_option(option) \
+#define _curl_is_postfields_option(option) \
((option) == CURLOPT_POSTFIELDS || \
(option) == CURLOPT_COPYPOSTFIELDS || \
0)
/* evaluates to true if option takes a struct curl_slist * argument */
-#define curlcheck_slist_option(option) \
+#define _curl_is_slist_option(option) \
((option) == CURLOPT_HTTP200ALIASES || \
(option) == CURLOPT_HTTPHEADER || \
(option) == CURLOPT_MAIL_RCPT || \
@@ -386,46 +384,45 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_QUOTE || \
(option) == CURLOPT_RESOLVE || \
(option) == CURLOPT_TELNETOPTIONS || \
- (option) == CURLOPT_CONNECT_TO || \
0)
/* groups of curl_easy_getinfo infos that take the same type of argument */
/* evaluates to true if info expects a pointer to char * argument */
-#define curlcheck_string_info(info) \
+#define _curl_is_string_info(info) \
(CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
/* evaluates to true if info expects a pointer to long argument */
-#define curlcheck_long_info(info) \
+#define _curl_is_long_info(info) \
(CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
/* evaluates to true if info expects a pointer to double argument */
-#define curlcheck_double_info(info) \
+#define _curl_is_double_info(info) \
(CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
/* true if info expects a pointer to struct curl_slist * argument */
-#define curlcheck_slist_info(info) \
+#define _curl_is_slist_info(info) \
(((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
-#define curlcheck_tlssessioninfo_info(info) \
+#define _curl_is_tlssessioninfo_info(info) \
(((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
/* true if info expects a pointer to struct curl_certinfo * argument */
-#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
+#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
/* true if info expects a pointer to struct curl_socket_t argument */
-#define curlcheck_socket_info(info) \
+#define _curl_is_socket_info(info) \
(CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
/* true if info expects a pointer to curl_off_t argument */
-#define curlcheck_off_t_info(info) \
+#define _curl_is_off_t_info(info) \
(CURLINFO_OFF_T < (info))
/* typecheck helpers -- check whether given expression has requested type*/
-/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros,
+/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
* otherwise define a new macro. Search for __builtin_types_compatible_p
* in the GCC manual.
* NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
@@ -435,35 +432,35 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
*/
/* XXX: should evaluate to true if expr is a pointer */
-#define curlcheck_any_ptr(expr) \
+#define _curl_is_any_ptr(expr) \
(sizeof(expr) == sizeof(void *))
/* evaluates to true if expr is NULL */
/* XXX: must not evaluate expr, so this check is not accurate */
-#define curlcheck_NULL(expr) \
+#define _curl_is_NULL(expr) \
(__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
/* evaluates to true if expr is type*, const type* or NULL */
-#define curlcheck_ptr(expr, type) \
- (curlcheck_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), type *) || \
+#define _curl_is_ptr(expr, type) \
+ (_curl_is_NULL(expr) || \
+ __builtin_types_compatible_p(__typeof__(expr), type *) || \
__builtin_types_compatible_p(__typeof__(expr), const type *))
/* evaluates to true if expr is one of type[], type*, NULL or const type* */
-#define curlcheck_arr(expr, type) \
- (curlcheck_ptr((expr), type) || \
+#define _curl_is_arr(expr, type) \
+ (_curl_is_ptr((expr), type) || \
__builtin_types_compatible_p(__typeof__(expr), type []))
/* evaluates to true if expr is a string */
-#define curlcheck_string(expr) \
- (curlcheck_arr((expr), char) || \
- curlcheck_arr((expr), signed char) || \
- curlcheck_arr((expr), unsigned char))
+#define _curl_is_string(expr) \
+ (_curl_is_arr((expr), char) || \
+ _curl_is_arr((expr), signed char) || \
+ _curl_is_arr((expr), unsigned char))
/* evaluates to true if expr is a long (no matter the signedness)
* XXX: for now, int is also accepted (and therefore short and char, which
* are promoted to int when passed to a variadic function) */
-#define curlcheck_long(expr) \
+#define _curl_is_long(expr) \
(__builtin_types_compatible_p(__typeof__(expr), long) || \
__builtin_types_compatible_p(__typeof__(expr), signed long) || \
__builtin_types_compatible_p(__typeof__(expr), unsigned long) || \
@@ -478,59 +475,63 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
__builtin_types_compatible_p(__typeof__(expr), unsigned char))
/* evaluates to true if expr is of type curl_off_t */
-#define curlcheck_off_t(expr) \
+#define _curl_is_off_t(expr) \
(__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
/* XXX: also check size of an char[] array? */
-#define curlcheck_error_buffer(expr) \
- (curlcheck_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), char *) || \
+#define _curl_is_error_buffer(expr) \
+ (_curl_is_NULL(expr) || \
+ __builtin_types_compatible_p(__typeof__(expr), char *) || \
__builtin_types_compatible_p(__typeof__(expr), char[]))
/* evaluates to true if expr is of type (const) void* or (const) FILE* */
#if 0
-#define curlcheck_cb_data(expr) \
- (curlcheck_ptr((expr), void) || \
- curlcheck_ptr((expr), FILE))
+#define _curl_is_cb_data(expr) \
+ (_curl_is_ptr((expr), void) || \
+ _curl_is_ptr((expr), FILE))
#else /* be less strict */
-#define curlcheck_cb_data(expr) \
- curlcheck_any_ptr(expr)
+#define _curl_is_cb_data(expr) \
+ _curl_is_any_ptr(expr)
#endif
/* evaluates to true if expr is of type FILE* */
-#define curlcheck_FILE(expr) \
- (curlcheck_NULL(expr) || \
+#define _curl_is_FILE(expr) \
+ (_curl_is_NULL(expr) || \
(__builtin_types_compatible_p(__typeof__(expr), FILE *)))
/* evaluates to true if expr can be passed as POST data (void* or char*) */
-#define curlcheck_postfields(expr) \
- (curlcheck_ptr((expr), void) || \
- curlcheck_arr((expr), char) || \
- curlcheck_arr((expr), unsigned char))
-
+#define _curl_is_postfields(expr) \
+ (_curl_is_ptr((expr), void) || \
+ _curl_is_arr((expr), char) || \
+ _curl_is_arr((expr), unsigned char))
+
+/* FIXME: the whole callback checking is messy...
+ * The idea is to tolerate char vs. void and const vs. not const
+ * pointers in arguments at least
+ */
/* helper: __builtin_types_compatible_p distinguishes between functions and
* function pointers, hide it */
-#define curlcheck_cb_compatible(func, type) \
- (__builtin_types_compatible_p(__typeof__(func), type) || \
+#define _curl_callback_compatible(func, type) \
+ (__builtin_types_compatible_p(__typeof__(func), type) || \
__builtin_types_compatible_p(__typeof__(func) *, type))
/* evaluates to true if expr is of type curl_resolver_start_callback */
-#define curlcheck_resolver_start_callback(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_resolver_start_callback))
+#define _curl_is_resolver_start_callback(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_resolver_start_callback))
/* evaluates to true if expr is of type curl_read_callback or "similar" */
-#define curlcheck_read_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), __typeof__(fread) *) || \
- curlcheck_cb_compatible((expr), curl_read_callback) || \
- curlcheck_cb_compatible((expr), _curl_read_callback1) || \
- curlcheck_cb_compatible((expr), _curl_read_callback2) || \
- curlcheck_cb_compatible((expr), _curl_read_callback3) || \
- curlcheck_cb_compatible((expr), _curl_read_callback4) || \
- curlcheck_cb_compatible((expr), _curl_read_callback5) || \
- curlcheck_cb_compatible((expr), _curl_read_callback6))
+#define _curl_is_read_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), __typeof__(fread) *) || \
+ _curl_callback_compatible((expr), curl_read_callback) || \
+ _curl_callback_compatible((expr), _curl_read_callback1) || \
+ _curl_callback_compatible((expr), _curl_read_callback2) || \
+ _curl_callback_compatible((expr), _curl_read_callback3) || \
+ _curl_callback_compatible((expr), _curl_read_callback4) || \
+ _curl_callback_compatible((expr), _curl_read_callback5) || \
+ _curl_callback_compatible((expr), _curl_read_callback6))
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
@@ -539,16 +540,16 @@ typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
/* evaluates to true if expr is of type curl_write_callback or "similar" */
-#define curlcheck_write_cb(expr) \
- (curlcheck_read_cb(expr) || \
- curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \
- curlcheck_cb_compatible((expr), curl_write_callback) || \
- curlcheck_cb_compatible((expr), _curl_write_callback1) || \
- curlcheck_cb_compatible((expr), _curl_write_callback2) || \
- curlcheck_cb_compatible((expr), _curl_write_callback3) || \
- curlcheck_cb_compatible((expr), _curl_write_callback4) || \
- curlcheck_cb_compatible((expr), _curl_write_callback5) || \
- curlcheck_cb_compatible((expr), _curl_write_callback6))
+#define _curl_is_write_cb(expr) \
+ (_curl_is_read_cb(expr) || \
+ _curl_callback_compatible((expr), __typeof__(fwrite) *) || \
+ _curl_callback_compatible((expr), curl_write_callback) || \
+ _curl_callback_compatible((expr), _curl_write_callback1) || \
+ _curl_callback_compatible((expr), _curl_write_callback2) || \
+ _curl_callback_compatible((expr), _curl_write_callback3) || \
+ _curl_callback_compatible((expr), _curl_write_callback4) || \
+ _curl_callback_compatible((expr), _curl_write_callback5) || \
+ _curl_callback_compatible((expr), _curl_write_callback6))
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
const void *);
@@ -559,37 +560,37 @@ typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
-#define curlcheck_ioctl_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_ioctl_callback) || \
- curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \
- curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \
- curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \
- curlcheck_cb_compatible((expr), _curl_ioctl_callback4))
+#define _curl_is_ioctl_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_ioctl_callback) || \
+ _curl_callback_compatible((expr), _curl_ioctl_callback1) || \
+ _curl_callback_compatible((expr), _curl_ioctl_callback2) || \
+ _curl_callback_compatible((expr), _curl_ioctl_callback3) || \
+ _curl_callback_compatible((expr), _curl_ioctl_callback4))
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
-#define curlcheck_sockopt_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_sockopt_callback) || \
- curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \
- curlcheck_cb_compatible((expr), _curl_sockopt_callback2))
+#define _curl_is_sockopt_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_sockopt_callback) || \
+ _curl_callback_compatible((expr), _curl_sockopt_callback1) || \
+ _curl_callback_compatible((expr), _curl_sockopt_callback2))
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
curlsocktype);
/* evaluates to true if expr is of type curl_opensocket_callback or
"similar" */
-#define curlcheck_opensocket_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_opensocket_callback) || \
- curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \
- curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \
- curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \
- curlcheck_cb_compatible((expr), _curl_opensocket_callback4))
+#define _curl_is_opensocket_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_opensocket_callback) || \
+ _curl_callback_compatible((expr), _curl_opensocket_callback1) || \
+ _curl_callback_compatible((expr), _curl_opensocket_callback2) || \
+ _curl_callback_compatible((expr), _curl_opensocket_callback3) || \
+ _curl_callback_compatible((expr), _curl_opensocket_callback4))
typedef curl_socket_t (*_curl_opensocket_callback1)
(void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback2)
@@ -600,28 +601,28 @@ typedef curl_socket_t (*_curl_opensocket_callback4)
(const void *, curlsocktype, const struct curl_sockaddr *);
/* evaluates to true if expr is of type curl_progress_callback or "similar" */
-#define curlcheck_progress_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_progress_callback) || \
- curlcheck_cb_compatible((expr), _curl_progress_callback1) || \
- curlcheck_cb_compatible((expr), _curl_progress_callback2))
+#define _curl_is_progress_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_progress_callback) || \
+ _curl_callback_compatible((expr), _curl_progress_callback1) || \
+ _curl_callback_compatible((expr), _curl_progress_callback2))
typedef int (*_curl_progress_callback1)(void *,
double, double, double, double);
typedef int (*_curl_progress_callback2)(const void *,
double, double, double, double);
/* evaluates to true if expr is of type curl_debug_callback or "similar" */
-#define curlcheck_debug_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_debug_callback) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback1) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback2) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback3) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback4) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback5) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback6) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback7) || \
- curlcheck_cb_compatible((expr), _curl_debug_callback8))
+#define _curl_is_debug_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_debug_callback) || \
+ _curl_callback_compatible((expr), _curl_debug_callback1) || \
+ _curl_callback_compatible((expr), _curl_debug_callback2) || \
+ _curl_callback_compatible((expr), _curl_debug_callback3) || \
+ _curl_callback_compatible((expr), _curl_debug_callback4) || \
+ _curl_callback_compatible((expr), _curl_debug_callback5) || \
+ _curl_callback_compatible((expr), _curl_debug_callback6) || \
+ _curl_callback_compatible((expr), _curl_debug_callback7) || \
+ _curl_callback_compatible((expr), _curl_debug_callback8))
typedef int (*_curl_debug_callback1) (CURL *,
curl_infotype, char *, size_t, void *);
typedef int (*_curl_debug_callback2) (CURL *,
@@ -641,17 +642,17 @@ typedef int (*_curl_debug_callback8) (CURL *,
/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
/* this is getting even messier... */
-#define curlcheck_ssl_ctx_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \
- curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8))
+#define _curl_is_ssl_ctx_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_ssl_ctx_callback) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \
+ _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
@@ -674,26 +675,26 @@ typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
#endif
/* evaluates to true if expr is of type curl_conv_callback or "similar" */
-#define curlcheck_conv_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_conv_callback) || \
- curlcheck_cb_compatible((expr), _curl_conv_callback1) || \
- curlcheck_cb_compatible((expr), _curl_conv_callback2) || \
- curlcheck_cb_compatible((expr), _curl_conv_callback3) || \
- curlcheck_cb_compatible((expr), _curl_conv_callback4))
+#define _curl_is_conv_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_conv_callback) || \
+ _curl_callback_compatible((expr), _curl_conv_callback1) || \
+ _curl_callback_compatible((expr), _curl_conv_callback2) || \
+ _curl_callback_compatible((expr), _curl_conv_callback3) || \
+ _curl_callback_compatible((expr), _curl_conv_callback4))
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
/* evaluates to true if expr is of type curl_seek_callback or "similar" */
-#define curlcheck_seek_cb(expr) \
- (curlcheck_NULL(expr) || \
- curlcheck_cb_compatible((expr), curl_seek_callback) || \
- curlcheck_cb_compatible((expr), _curl_seek_callback1) || \
- curlcheck_cb_compatible((expr), _curl_seek_callback2))
+#define _curl_is_seek_cb(expr) \
+ (_curl_is_NULL(expr) || \
+ _curl_callback_compatible((expr), curl_seek_callback) || \
+ _curl_callback_compatible((expr), _curl_seek_callback1) || \
+ _curl_callback_compatible((expr), _curl_seek_callback2))
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
-#endif /* CURLINC_TYPECHECK_GCC_H */
+#endif /* __CURL_TYPECHECK_GCC_H */
diff --git a/include/curl/urlapi.h b/include/curl/urlapi.h
index f2d06770d..850faa97a 100644
--- a/include/curl/urlapi.h
+++ b/include/curl/urlapi.h
@@ -1,5 +1,5 @@
-#ifndef CURLINC_URLAPI_H
-#define CURLINC_URLAPI_H
+#ifndef __CURL_URLAPI_H
+#define __CURL_URLAPI_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -60,8 +60,7 @@ typedef enum {
CURLUPART_PORT,
CURLUPART_PATH,
CURLUPART_QUERY,
- CURLUPART_FRAGMENT,
- CURLUPART_ZONEID /* added in 7.65.0 */
+ CURLUPART_FRAGMENT
} CURLUPart;
#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */
@@ -77,8 +76,6 @@ typedef enum {
#define CURLU_URLENCODE (1<<7) /* URL encode on set */
#define CURLU_APPENDQUERY (1<<8) /* append a form style part */
#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */
-#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the
- scheme is unknown. */
typedef struct Curl_URL CURLU;
@@ -122,4 +119,4 @@ CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
} /* end of extern "C" */
#endif
-#endif /* CURLINC_URLAPI_H */
+#endif
diff --git a/install-sh b/install-sh
index 8175c640f..59990a104 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2014-09-12.12; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -271,18 +271,15 @@ do
fi
dst=$dst_arg
- # If destination is a directory, append the input filename.
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
if test -d "$dst"; then
if test "$is_target_a_directory" = never; then
echo "$0: $dst_arg: Is a directory" >&2
exit 1
fi
dstdir=$dst
- dstbase=`basename "$src"`
- case $dst in
- */) dst=$dst$dstbase;;
- *) dst=$dst/$dstbase;;
- esac
+ dst=$dstdir/`basename "$src"`
dstdir_status=0
else
dstdir=`dirname "$dst"`
@@ -291,11 +288,6 @@ do
fi
fi
- case $dstdir in
- */) dstdirslash=$dstdir;;
- *) dstdirslash=$dstdir/;;
- esac
-
obsolete_mkdir_used=false
if test $dstdir_status != 0; then
@@ -332,16 +324,14 @@ do
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
;;
*)
- # Note that $RANDOM variable is not portable (e.g. dash); Use it
- # here however when possible just to lower collision chance.
+ # $RANDOM is not portable (e.g. dash); use it when possible to
+ # lower collision chance
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p' feature.
+ # As "mkdir -p" follows symlinks and we work in /tmp possibly; so
+ # create the $tmpdir first (and fail if unsuccessful) to make sure
+ # that nobody tries to guess the $tmpdir name.
if (umask $mkdir_umask &&
$mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
@@ -444,8 +434,8 @@ do
else
# Make a couple of temp file names in the proper directory.
- dsttmp=${dstdirslash}_inst.$$_
- rmtmp=${dstdirslash}_rm.$$_
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
@@ -510,9 +500,9 @@ do
done
# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 516a2394d..7c258b3fa 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -23,8 +23,8 @@ AUTOMAKE_OPTIONS = foreign nostdinc
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
-EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \
- config-plan9.h config-riscos.h config-mac.h curl_config.h.in \
+EXTRA_DIST = Makefile.m32 config-win32.h \
+ config-win32ce.h config-riscos.h config-mac.h curl_config.h.in \
makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \
config-os400.h setup-os400.h config-symbian.h Makefile.Watcom \
@@ -65,7 +65,7 @@ endif
# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)
-VERSIONINFO=-version-info 10:0:6
+VERSIONINFO=-version-info 9:0:5
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
@@ -138,7 +138,7 @@ CS_ = $(CS_0)
checksrc:
$(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
- $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])
+ $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch])
if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
diff --git a/lib/Makefile.inc b/lib/Makefile.inc
index 72ef428ee..6c47bcda5 100644
--- a/lib/Makefile.inc
+++ b/lib/Makefile.inc
@@ -29,20 +29,14 @@ LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \
vtls/polarssl.c vtls/polarssl_threadlock.c \
- vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c \
+ vtls/cyassl.c vtls/schannel.c vtls/schannel_verify.c \
vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \
vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h \
- vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h \
+ vtls/cyassl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h \
vtls/mbedtls.h vtls/mesalink.h
-LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
-
-LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
-
-LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
-
LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c \
@@ -52,16 +46,16 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \
strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \
inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \
- curl_addrinfo.c socks_gssapi.c socks_sspi.c \
+ ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c \
curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \
pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \
openldap.c curl_gethostname.c gopher.c idn_win32.c \
http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \
http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c \
- curl_multibyte.c hostcheck.c conncache.c dotdot.c \
+ curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c \
x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c \
- doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
+ doh.c urlapi.c altsvc.c
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
@@ -78,15 +72,13 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \
http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \
curl_sasl.h curl_multibyte.h hostcheck.h conncache.h \
- curl_setup_once.h multihandle.h setup-vms.h dotdot.h \
+ curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h \
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h \
- curl_get_line.h altsvc.h quic.h socketpair.h
+ altsvc.h
LIB_RCFILES = libcurl.rc
-CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
- $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
-HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
- $(LIB_VQUIC_HFILES)
+CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)
+HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)
diff --git a/lib/Makefile.netware b/lib/Makefile.netware
index a40534684..29885a19e 100644
--- a/lib/Makefile.netware
+++ b/lib/Makefile.netware
@@ -640,6 +640,8 @@ ifdef WITH_SSL
@echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@
+ @echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@
+ @echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@
@echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@
ifdef WITH_SRP
@echo $(DL)#define USE_TLS_SRP 1$(DL) >> $@
diff --git a/lib/altsvc.c b/lib/altsvc.c
index 64971a9f0..164346645 100644
--- a/lib/altsvc.c
+++ b/lib/altsvc.c
@@ -29,7 +29,7 @@
#include <curl/curl.h>
#include "urldata.h"
#include "altsvc.h"
-#include "curl_get_line.h"
+#include "cookie.h" /* for Curl_get_line() */
#include "strcase.h"
#include "parsedate.h"
#include "sendf.h"
@@ -54,13 +54,10 @@ static enum alpnid alpn2alpnid(char *name)
return ALPN_h1;
if(strcasecompare(name, "h2"))
return ALPN_h2;
-#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
- if(strcasecompare(name, "h3-23"))
- return ALPN_h3;
-#else
+ if(strcasecompare(name, "h2c"))
+ return ALPN_h2c;
if(strcasecompare(name, "h3"))
return ALPN_h3;
-#endif
return ALPN_none; /* unknown, probably rubbish input */
}
@@ -72,12 +69,10 @@ const char *Curl_alpnid2str(enum alpnid id)
return "h1";
case ALPN_h2:
return "h2";
+ case ALPN_h2c:
+ return "h2c";
case ALPN_h3:
-#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
- return "h3-23";
-#else
return "h3";
-#endif
default:
return ""; /* bad */
}
@@ -86,8 +81,8 @@ const char *Curl_alpnid2str(enum alpnid id)
static void altsvc_free(struct altsvc *as)
{
- free(as->src.host);
- free(as->dst.host);
+ free(as->srchost);
+ free(as->dsthost);
free(as);
}
@@ -102,17 +97,17 @@ static struct altsvc *altsvc_createid(const char *srchost,
if(!as)
return NULL;
- as->src.host = strdup(srchost);
- if(!as->src.host)
+ as->srchost = strdup(srchost);
+ if(!as->srchost)
goto error;
- as->dst.host = strdup(dsthost);
- if(!as->dst.host)
+ as->dsthost = strdup(dsthost);
+ if(!as->dsthost)
goto error;
- as->src.alpnid = srcalpnid;
- as->dst.alpnid = dstalpnid;
- as->src.port = curlx_ultous(srcport);
- as->dst.port = curlx_ultous(dstport);
+ as->srcalpnid = srcalpnid;
+ as->dstalpnid = dstalpnid;
+ as->srcport = curlx_ultous(srcport);
+ as->dstport = curlx_ultous(dstport);
return as;
error:
@@ -231,8 +226,8 @@ static CURLcode altsvc_out(struct altsvc *as, FILE *fp)
"\"%d%02d%02d "
"%02d:%02d:%02d\" "
"%u %d\n",
- Curl_alpnid2str(as->src.alpnid), as->src.host, as->src.port,
- Curl_alpnid2str(as->dst.alpnid), as->dst.host, as->dst.port,
+ Curl_alpnid2str(as->srcalpnid), as->srchost, as->srcport,
+ Curl_alpnid2str(as->dstalpnid), as->dsthost, as->dstport,
stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
stamp.tm_hour, stamp.tm_min, stamp.tm_sec,
as->persist, as->prio);
@@ -257,7 +252,8 @@ struct altsvcinfo *Curl_altsvc_init(void)
#ifdef USE_NGHTTP2
| CURLALTSVC_H2
#endif
-#ifdef ENABLE_QUIC
+#ifdef USE_HTTP3
+ /* TODO: adjust when known */
| CURLALTSVC_H3
#endif
;
@@ -348,12 +344,12 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
while(*p && ISBLANK(*p))
p++;
protop = p;
- while(*p && !ISBLANK(*p) && (*p != ';') && (*p != '='))
+ while(*p && ISALNUM(*p))
p++;
len = p - protop;
if(!len || (len >= buflen))
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLE_BAD_FUNCTION_ARGUMENT; /* TODO: improve error code */
memcpy(alpnbuf, protop, len);
alpnbuf[len] = 0;
*ptr = p;
@@ -370,9 +366,9 @@ static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
- if((srcalpnid == as->src.alpnid) &&
- (srcport == as->src.port) &&
- strcasecompare(srchost, as->src.host)) {
+ if((srcalpnid == as->srcalpnid) &&
+ (srcport == as->srcport) &&
+ strcasecompare(srchost, as->srchost)) {
Curl_llist_remove(&asi->list, e, NULL);
altsvc_free(as);
asi->num--;
@@ -429,6 +425,7 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
/* "clear" is a magic keyword */
if(strcasecompare(alpnbuf, "clear")) {
+ /* TODO: clear whatever it is it should clear */
return CURLE_OK;
}
@@ -442,7 +439,6 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
char option[32];
unsigned long num;
char *end_ptr;
- bool quoted = FALSE;
semip++; /* pass the semicolon */
result = getalnum(&semip, option, sizeof(option));
if(result)
@@ -452,21 +448,12 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
if(*semip != '=')
continue;
semip++;
- while(*semip && ISBLANK(*semip))
- semip++;
- if(*semip == '\"') {
- /* quoted value */
- semip++;
- quoted = TRUE;
- }
num = strtoul(semip, &end_ptr, 10);
- if((end_ptr != semip) && num && (num < ULONG_MAX)) {
+ if(num < ULONG_MAX) {
if(strcasecompare("ma", option))
maxage = num;
else if(strcasecompare("persist", option) && (num == 1))
persist = TRUE;
- if(quoted && (*end_ptr == '\"'))
- end_ptr++;
}
semip = end_ptr;
}
@@ -491,7 +478,7 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
p++;
len = p - hostp;
if(!len || (len >= MAX_ALTSVC_HOSTLEN))
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLE_BAD_FUNCTION_ARGUMENT; /* TODO: improve error code */
memcpy(namebuf, hostp, len);
namebuf[len] = 0;
dsthost = namebuf;
@@ -517,8 +504,8 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
srcalpnid, dstalpnid,
srcport, dstport);
if(as) {
- /* The expires time also needs to take the Age: value (if any) into
- account. [See RFC 7838 section 3.1] */
+ /* TODO: the expires time also needs to take the Age: value (if any)
+ into account. [See RFC 7838 section 3.1] */
as->expires = maxage + time(NULL);
as->persist = persist;
Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
@@ -550,31 +537,31 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
enum alpnid srcalpnid, const char *srchost,
int srcport,
- struct altsvc **dstentry,
- const int versions) /* one or more bits */
+ enum alpnid *dstalpnid, const char **dsthost,
+ int *dstport)
{
struct curl_llist_element *e;
struct curl_llist_element *n;
time_t now = time(NULL);
DEBUGASSERT(asi);
DEBUGASSERT(srchost);
- DEBUGASSERT(dstentry);
+ DEBUGASSERT(dsthost);
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
if(as->expires < now) {
/* an expired entry, remove */
- Curl_llist_remove(&asi->list, e, NULL);
altsvc_free(as);
continue;
}
- if((as->src.alpnid == srcalpnid) &&
- strcasecompare(as->src.host, srchost) &&
- (as->src.port == srcport) &&
- (versions & as->dst.alpnid)) {
+ if((as->srcalpnid == srcalpnid) &&
+ strcasecompare(as->srchost, srchost) &&
+ as->srcport == srcport) {
/* match */
- *dstentry = as;
+ *dstalpnid = as->dstalpnid;
+ *dsthost = as->dsthost;
+ *dstport = as->dstport;
return TRUE;
}
}
diff --git a/lib/altsvc.h b/lib/altsvc.h
index 99d0499af..eefb45bf6 100644
--- a/lib/altsvc.h
+++ b/lib/altsvc.h
@@ -28,21 +28,20 @@
#include "llist.h"
enum alpnid {
- ALPN_none = 0,
- ALPN_h1 = CURLALTSVC_H1,
- ALPN_h2 = CURLALTSVC_H2,
- ALPN_h3 = CURLALTSVC_H3
-};
-
-struct althost {
- char *host;
- unsigned short port;
- enum alpnid alpnid;
+ ALPN_none,
+ ALPN_h1,
+ ALPN_h2,
+ ALPN_h2c,
+ ALPN_h3
};
struct altsvc {
- struct althost src;
- struct althost dst;
+ char *srchost;
+ char *dsthost;
+ unsigned short srcport;
+ unsigned short dstport;
+ enum alpnid srcalpnid;
+ enum alpnid dstalpnid;
time_t expires;
bool persist;
int prio;
@@ -69,8 +68,8 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
enum alpnid srcalpnid, const char *srchost,
int srcport,
- struct altsvc **dstentry,
- int versions); /* one or more CURLALTSVC_H* bits */
+ enum alpnid *dstalpnid, const char **dsthost,
+ int *dstport);
#else
/* disabled */
#define Curl_altsvc_save(a,b)
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index 835cfa48f..04a25b321 100644
--- a/lib/asyn-ares.c
+++ b/lib/asyn-ares.c
@@ -68,7 +68,7 @@
#include "progress.h"
# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+ (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__))
# define CARES_STATICLIB
# endif
# include <ares.h>
@@ -89,20 +89,8 @@ struct ResolverResults {
int num_pending; /* number of ares_gethostbyname() requests */
Curl_addrinfo *temp_ai; /* intermediary result while fetching c-ares parts */
int last_status;
- struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
};
-/* How long we are willing to wait for additional parallel responses after
- obtaining a "definitive" one.
-
- This is intended to equal the c-ares default timeout. cURL always uses that
- default value. Unfortunately, c-ares doesn't expose its default timeout in
- its API, but it is officially documented as 5 seconds.
-
- See query_completed_cb() for an explanation of how this is used.
- */
-#define HAPPY_EYEBALLS_DNS_TIMEOUT 5000
-
/*
* Curl_resolver_global_init() - the generic low-level asynchronous name
* resolve API. Called from curl_global_init() to initialize global resolver
@@ -253,14 +241,16 @@ static void destroy_async_data(struct Curl_async *async)
*/
int Curl_resolver_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
+
{
struct timeval maxtime;
struct timeval timebuf;
struct timeval *timeout;
long milli;
int max = ares_getsock((ares_channel)conn->data->state.resolver,
- (ares_socket_t *)socks, MAX_SOCKSPEREASYHANDLE);
+ (ares_socket_t *)socks, numsocks);
maxtime.tv_sec = CURL_TIMEOUT_RESOLVE;
maxtime.tv_usec = 0;
@@ -329,9 +319,9 @@ static int waitperform(struct connectdata *conn, int timeout_ms)
/* move through the descriptors and ask for processing on them */
for(i = 0; i < num; i++)
ares_process_fd((ares_channel)data->state.resolver,
- (pfd[i].revents & (POLLRDNORM|POLLIN))?
+ pfd[i].revents & (POLLRDNORM|POLLIN)?
pfd[i].fd:ARES_SOCKET_BAD,
- (pfd[i].revents & (POLLWRNORM|POLLOUT))?
+ pfd[i].revents & (POLLWRNORM|POLLOUT)?
pfd[i].fd:ARES_SOCKET_BAD);
}
return nfds;
@@ -357,29 +347,6 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
waitperform(conn, 0);
- /* Now that we've checked for any last minute results above, see if there are
- any responses still pending when the EXPIRE_HAPPY_EYEBALLS_DNS timer
- expires. */
- if(res
- && res->num_pending
- /* This is only set to non-zero if the timer was started. */
- && (res->happy_eyeballs_dns_time.tv_sec
- || res->happy_eyeballs_dns_time.tv_usec)
- && (Curl_timediff(Curl_now(), res->happy_eyeballs_dns_time)
- >= HAPPY_EYEBALLS_DNS_TIMEOUT)) {
- /* Remember that the EXPIRE_HAPPY_EYEBALLS_DNS timer is no longer
- running. */
- memset(
- &res->happy_eyeballs_dns_time, 0, sizeof(res->happy_eyeballs_dns_time));
-
- /* Cancel the raw c-ares request, which will fire query_completed_cb() with
- ARES_ECANCELLED synchronously for all pending responses. This will
- leave us with res->num_pending == 0, which is perfect for the next
- block. */
- ares_cancel((ares_channel)data->state.resolver);
- DEBUGASSERT(res->num_pending == 0);
- }
-
if(res && !res->num_pending) {
if(dns) {
(void)Curl_addrinfo_callback(conn, res->last_status, res->temp_ai);
@@ -488,7 +455,9 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
if(result)
/* close the connection, since we can't return failure here without
- cleaning up this connection properly. */
+ cleaning up this connection properly.
+ TODO: remove this action from here, it is not a name resolver decision.
+ */
connclose(conn, "c-ares resolve failed");
return result;
@@ -548,66 +517,6 @@ static void query_completed_cb(void *arg, /* (struct connectdata *) */
/* A successful result overwrites any previous error */
if(res->last_status != ARES_SUCCESS)
res->last_status = status;
-
- /* If there are responses still pending, we presume they must be the
- complementary IPv4 or IPv6 lookups that we started in parallel in
- Curl_resolver_getaddrinfo() (for Happy Eyeballs). If we've got a
- "definitive" response from one of a set of parallel queries, we need to
- think about how long we're willing to wait for more responses. */
- if(res->num_pending
- /* Only these c-ares status values count as "definitive" for these
- purposes. For example, ARES_ENODATA is what we expect when there is
- no IPv6 entry for a domain name, and that's not a reason to get more
- aggressive in our timeouts for the other response. Other errors are
- either a result of bad input (which should affect all parallel
- requests), local or network conditions, non-definitive server
- responses, or us cancelling the request. */
- && (status == ARES_SUCCESS || status == ARES_ENOTFOUND)) {
- /* Right now, there can only be up to two parallel queries, so don't
- bother handling any other cases. */
- DEBUGASSERT(res->num_pending == 1);
-
- /* It's possible that one of these parallel queries could succeed
- quickly, but the other could always fail or timeout (when we're
- talking to a pool of DNS servers that can only successfully resolve
- IPv4 address, for example).
-
- It's also possible that the other request could always just take
- longer because it needs more time or only the second DNS server can
- fulfill it successfully. But, to align with the philosophy of Happy
- Eyeballs, we don't want to wait _too_ long or users will think
- requests are slow when IPv6 lookups don't actually work (but IPv4 ones
- do).
-
- So, now that we have a usable answer (some IPv4 addresses, some IPv6
- addresses, or "no such domain"), we start a timeout for the remaining
- pending responses. Even though it is typical that this resolved
- request came back quickly, that needn't be the case. It might be that
- this completing request didn't get a result from the first DNS server
- or even the first round of the whole DNS server pool. So it could
- already be quite some time after we issued the DNS queries in the
- first place. Without modifying c-ares, we can't know exactly where in
- its retry cycle we are. We could guess based on how much time has
- gone by, but it doesn't really matter. Happy Eyeballs tells us that,
- given usable information in hand, we simply don't want to wait "too
- much longer" after we get a result.
-
- We simply wait an additional amount of time equal to the default
- c-ares query timeout. That is enough time for a typical parallel
- response to arrive without being "too long". Even on a network
- where one of the two types of queries is failing or timing out
- constantly, this will usually mean we wait a total of the default
- c-ares timeout (5 seconds) plus the round trip time for the successful
- request, which seems bearable. The downside is that c-ares might race
- with us to issue one more retry just before we give up, but it seems
- better to "waste" that request instead of trying to guess the perfect
- timeout to prevent it. After all, we don't even know where in the
- c-ares retry cycle each request is.
- */
- res->happy_eyeballs_dns_time = Curl_now();
- Curl_expire(
- conn->data, HAPPY_EYEBALLS_DNS_TIMEOUT, EXPIRE_HAPPY_EYEBALLS_DNS);
- }
}
}
@@ -732,11 +641,7 @@ CURLcode Curl_set_dns_servers(struct Curl_easy *data,
return CURLE_OK;
#if (ARES_VERSION >= 0x010704)
-#if (ARES_VERSION >= 0x010b00)
- ares_result = ares_set_servers_ports_csv(data->state.resolver, servers);
-#else
ares_result = ares_set_servers_csv(data->state.resolver, servers);
-#endif
switch(ares_result) {
case ARES_SUCCESS:
result = CURLE_OK;
diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index 8c552baa9..55e0811c5 100755..100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -21,7 +21,6 @@
***************************************************************************/
#include "curl_setup.h"
-#include "socketpair.h"
/***********************************************************************
* Only for threaded name resolves builds
@@ -75,7 +74,6 @@
#include "inet_ntop.h"
#include "curl_threads.h"
#include "connect.h"
-#include "socketpair.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -165,10 +163,6 @@ struct thread_sync_data {
char *hostname; /* hostname to resolve, Curl_async.hostname
duplicate */
int port;
-#ifdef USE_SOCKETPAIR
- struct connectdata *conn;
- curl_socket_t sock_pair[2]; /* socket pair */
-#endif
int sock_error;
Curl_addrinfo *res;
#ifdef HAVE_GETADDRINFO
@@ -203,15 +197,6 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd)
if(tsd->res)
Curl_freeaddrinfo(tsd->res);
-#ifdef USE_SOCKETPAIR
- /*
- * close one end of the socket pair (may be done in resolver thread);
- * the other end (for reading) is always closed in the parent thread.
- */
- if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
- sclose(tsd->sock_pair[1]);
- }
-#endif
memset(tsd, 0, sizeof(*tsd));
}
@@ -245,14 +230,6 @@ int init_thread_sync_data(struct thread_data * td,
Curl_mutex_init(tsd->mtx);
-#ifdef USE_SOCKETPAIR
- /* create socket pair, avoid AF_LOCAL since it doesn't build on Solaris */
- if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) {
- tsd->sock_pair[0] = CURL_SOCKET_BAD;
- tsd->sock_pair[1] = CURL_SOCKET_BAD;
- goto err_exit;
- }
-#endif
tsd->sock_error = CURL_ASYNC_SUCCESS;
/* Copying hostname string because original can be destroyed by parent
@@ -299,9 +276,6 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
struct thread_data *td = tsd->td;
char service[12];
int rc;
-#ifdef USE_SOCKETPAIR
- char buf[1];
-#endif
msnprintf(service, sizeof(service), "%d", tsd->port);
@@ -324,16 +298,6 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
free(td);
}
else {
-#ifdef USE_SOCKETPAIR
- if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
- /* DNS has been resolved, signal client task */
- buf[0] = 1;
- if(swrite(tsd->sock_pair[1], buf, sizeof(buf)) < 0) {
- /* update sock_erro to errno */
- tsd->sock_error = SOCKERRNO;
- }
- }
-#endif
tsd->done = 1;
Curl_mutex_release(tsd->mtx);
}
@@ -384,10 +348,6 @@ static void destroy_async_data(struct Curl_async *async)
if(async->os_specific) {
struct thread_data *td = (struct thread_data*) async->os_specific;
int done;
-#ifdef USE_SOCKETPAIR
- curl_socket_t sock_rd = td->tsd.sock_pair[0];
- struct connectdata *conn = td->tsd.conn;
-#endif
/*
* if the thread is still blocking in the resolve syscall, detach it and
@@ -409,15 +369,6 @@ static void destroy_async_data(struct Curl_async *async)
free(async->os_specific);
}
-#ifdef USE_SOCKETPAIR
- /*
- * ensure CURLMOPT_SOCKETFUNCTION fires CURL_POLL_REMOVE
- * before the FD is invalidated to avoid EBADF on EPOLL_CTL_DEL
- */
- if(conn)
- Curl_multi_closed(conn->data, sock_rd);
- sclose(sock_rd);
-#endif
}
async->os_specific = NULL;
@@ -618,9 +569,8 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
else {
/* poll for name lookup done with exponential backoff up to 250ms */
- /* should be fine even if this converts to 32 bit */
- time_t elapsed = (time_t)Curl_timediff(Curl_now(),
- data->progress.t_startsingle);
+ timediff_t elapsed = Curl_timediff(Curl_now(),
+ data->progress.t_startsingle);
if(elapsed < 0)
elapsed = 0;
@@ -642,45 +592,26 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
int Curl_resolver_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
- int ret_val = 0;
time_t milli;
timediff_t ms;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
-#ifdef USE_SOCKETPAIR
- struct thread_data *td = (struct thread_data*)conn->async.os_specific;
-#else
(void)socks;
-#endif
-
-#ifdef USE_SOCKETPAIR
- if(td) {
- /* return read fd to client for polling the DNS resolution status */
- socks[0] = td->tsd.sock_pair[0];
- DEBUGASSERT(td->tsd.conn == conn || !td->tsd.conn);
- td->tsd.conn = conn;
- ret_val = GETSOCK_READSOCK(0);
- }
- else {
-#endif
- ms = Curl_timediff(Curl_now(), reslv->start);
- if(ms < 3)
- milli = 0;
- else if(ms <= 50)
- milli = (time_t)ms/3;
- else if(ms <= 250)
- milli = 50;
- else
- milli = 200;
- Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
-#ifdef USE_SOCKETPAIR
- }
-#endif
-
-
- return ret_val;
+ (void)numsocks;
+ ms = Curl_timediff(Curl_now(), reslv->start);
+ if(ms < 3)
+ milli = 0;
+ else if(ms <= 50)
+ milli = ms/3;
+ else if(ms <= 250)
+ milli = 50;
+ else
+ milli = 200;
+ Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
+ return 0;
}
#ifndef HAVE_GETADDRINFO
@@ -775,8 +706,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
memset(&hints, 0, sizeof(hints));
hints.ai_family = pf;
- hints.ai_socktype = (conn->transport == TRNSPRT_TCP)?
- SOCK_STREAM : SOCK_DGRAM;
+ hints.ai_socktype = conn->socktype;
msnprintf(sbuf, sizeof(sbuf), "%d", port);
diff --git a/lib/asyn.h b/lib/asyn.h
index 081c3fef0..ccd4b1f7e 100644
--- a/lib/asyn.h
+++ b/lib/asyn.h
@@ -114,7 +114,8 @@ void Curl_resolver_kill(struct connectdata *conn);
* return bitmask indicating what file descriptors (referring to array indexes
* in the 'sock' array) to wait for, read/write.
*/
-int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock);
+int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock,
+ int numsocks);
/*
* Curl_resolver_is_resolved()
diff --git a/lib/base64.c b/lib/base64.c
index 643cef625..431b64357 100644
--- a/lib/base64.c
+++ b/lib/base64.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,11 +23,6 @@
/* Base64 encoding/decoding */
#include "curl_setup.h"
-
-#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
- !defined(CURL_DISABLE_LDAP) || \
- !defined(CURL_DISABLE_DOH) || defined(USE_SSL)
-
#include "urldata.h" /* for the Curl_easy definition */
#include "warnless.h"
#include "curl_base64.h"
@@ -322,5 +317,3 @@ CURLcode Curl_base64url_encode(struct Curl_easy *data,
{
return base64_encode(base64url, data, inputbuff, insize, outptr, outlen);
}
-
-#endif /* no users so disabled */
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index b2cfa8355..965f0bab1 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -176,7 +176,7 @@ sub checkwarn {
$file = shift @ARGV;
-while(defined $file) {
+while(1) {
if($file =~ /-D(.*)/) {
$dir = $1;
diff --git a/lib/config-amigaos.h b/lib/config-amigaos.h
index 12a87cf29..31cfc3afc 100644
--- a/lib/config-amigaos.h
+++ b/lib/config-amigaos.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,6 +36,8 @@
#define HAVE_INTTYPES_H 1
#define HAVE_IOCTLSOCKET_CAMEL 1
#define HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1
+#define HAVE_LIBCRYPTO 1
+#define HAVE_LIBSSL 1
#define HAVE_LIBZ 1
#define HAVE_LONGLONG 1
#define HAVE_MALLOC_H 1
diff --git a/lib/config-os400.h b/lib/config-os400.h
index a302828e2..bde4f0b33 100644
--- a/lib/config-os400.h
+++ b/lib/config-os400.h
@@ -127,18 +127,12 @@
/* Define if you have the `getpass_r' function. */
#undef HAVE_GETPASS_R
-/* Define to 1 if you have the getpeername function. */
-#define HAVE_GETPEERNAME 1
-
/* Define if you have the `getpwuid' function. */
#define HAVE_GETPWUID
/* Define if you have the `getservbyname' function. */
#define HAVE_GETSERVBYNAME
-/* Define to 1 if you have the getsockname function. */
-#define HAVE_GETSOCKNAME 1
-
/* Define if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY
@@ -160,6 +154,9 @@
/* Define if you have the <krb.h> header file. */
#undef HAVE_KRB_H
+/* Define if you have the `crypto' library (-lcrypto). */
+#undef HAVE_LIBCRYPTO
+
/* Define if you have the `nsl' library (-lnsl). */
#undef HAVE_LIBNSL
@@ -172,6 +169,9 @@
/* Define if you have the `socket' library (-lsocket). */
#undef HAVE_LIBSOCKET
+/* Define if you have the `ssl' library (-lssl). */
+#undef HAVE_LIBSSL
+
/* Define if you have GSS API. */
#define HAVE_GSSAPI
@@ -428,9 +428,6 @@
/* Define to enable alt-svc support (experimental) */
#undef USE_ALTSVC
-/* Define to enable HTTP3 support (experimental, requires NGTCP2 or QUICHE) */
-#undef ENABLE_QUIC
-
/* Version number of package */
#undef VERSION
diff --git a/lib/config-plan9.h b/lib/config-plan9.h
deleted file mode 100644
index 64bfbdea0..000000000
--- a/lib/config-plan9.h
+++ /dev/null
@@ -1,216 +0,0 @@
-#ifndef HEADER_CURL_CONFIG_PLAN9_H
-#define HEADER_CURL_CONFIG_PLAN9_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#define BUILDING_LIBCURL 1
-#define CURL_CA_BUNDLE "/sys/lib/tls/ca.pem"
-#define CURL_CA_PATH "/sys/lib/tls"
-#define CURL_STATICLIB 1
-#define ENABLE_IPV6 1
-#define CURL_DISABLE_LDAP 1
-
-#define NEED_REENTRANT 1
-#define OS "plan9"
-#define PACKAGE "curl"
-#define PACKAGE_NAME "curl"
-#define PACKAGE_BUGREPORT "a suitable mailing list: https://curl.haxx.se/mail/"
-#define PACKAGE_STRING "curl -"
-#define PACKAGE_TARNAME "curl"
-#define PACKAGE_VERSION "-"
-#define RANDOM_FILE "/dev/random"
-#define VERSION "0.0.0" /* TODO */
-
-#define RETSIGTYPE void
-
-#define STDC_HEADERS 1
-
-#ifdef _BITS64
-#error not implement
-#else
-#define SIZEOF_INT 4
-#define SIZEOF_SHORT 2
-#define SIZEOF_LONG 4
-#define SIZEOF_OFF_T 8
-#define SIZEOF_CURL_OFF_T 4 /* curl_off_t = timediff_t = int */
-#define SIZEOF_SIZE_T 4
-#define SIZEOF_TIME_T 4
-#endif
-
-#define HAVE_GETNAMEINFO 1
-#define GETNAMEINFO_QUAL_ARG1 const
-#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
-#define GETNAMEINFO_TYPE_ARG2 int
-#define GETNAMEINFO_TYPE_ARG46 long
-#define GETNAMEINFO_TYPE_ARG7 int
-
-#define HAVE_RECV 1
-#define RECV_TYPE_ARG1 int
-#define RECV_TYPE_ARG2 void *
-#define RECV_TYPE_ARG3 int
-#define RECV_TYPE_ARG4 int
-#define RECV_TYPE_RETV int
-
-#define HAVE_RECVFROM 1
-#define RECVFROM_TYPE_ARG1 int
-#define RECVFROM_TYPE_ARG2 void
-#define RECVFROM_TYPE_ARG2_IS_VOID 1
-#define RECVFROM_TYPE_ARG3 int
-#define RECVFROM_TYPE_ARG4 int
-#define RECVFROM_TYPE_ARG5 void
-#define RECVFROM_TYPE_ARG5_IS_VOID 1
-#define RECVFROM_TYPE_ARG6 int
-#define RECVFROM_TYPE_ARG6_IS_VOID 1
-#define RECVFROM_TYPE_RETV int
-
-#define HAVE_SELECT 1
-#define SELECT_TYPE_ARG1 int
-#define SELECT_TYPE_ARG234 fd_set *
-#define SELECT_TYPE_ARG5 struct timeval *
-#define SELECT_TYPE_RETV int
-
-#define HAVE_SEND 1
-#define SEND_TYPE_ARG1 int
-#define SEND_TYPE_ARG2 void *
-#define SEND_QUAL_ARG2
-#define SEND_TYPE_ARG3 int
-#define SEND_TYPE_ARG4 int
-#define SEND_TYPE_RETV int
-
-#define HAVE_ALARM 1
-#define HAVE_ARPA_INET_H 1
-#define HAVE_ASSERT_H 1
-#define HAVE_BASENAME 1
-#define HAVE_BOOL_T 1
-#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-#define HAVE_ERRNO_H 1
-#define HAVE_FCNTL 1
-#define HAVE_FCNTL_H 1
-#define HAVE_FDOPEN 1
-#define HAVE_FORK 1
-#define HAVE_FREEADDRINFO 1
-#define HAVE_FTRUNCATE 1
-#define HAVE_GETADDRINFO 1
-#define HAVE_GETEUID 1
-#define HAVE_GETHOSTBYADDR 1
-#define HAVE_GETHOSTBYNAME 1
-#define HAVE_GETHOSTNAME 1
-#define HAVE_GETPPID 1
-#define HAVE_GETPROTOBYNAME 1
-#define HAVE_GETPWUID 1
-#define HAVE_GETTIMEOFDAY 1
-#define HAVE_GMTIME_R 1
-#define HAVE_INET_ADDR 1
-#define HAVE_INET_NTOP 1
-#define HAVE_INET_PTON 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_IOCTL 1
-#define HAVE_LIBGEN_H 1
-#define HAVE_LIBZ 1
-#define HAVE_LL 1
-#define HAVE_LOCALE_H 1
-#define HAVE_LOCALTIME_R 1
-#define HAVE_LONGLONG 1
-#define HAVE_NETDB_H 1
-#define HAVE_NETINET_IN_H 1
-#define HAVE_NETINET_TCP_H 1
-#define HAVE_PWD_H 1
-#define HAVE_SYS_SELECT_H 1
-
-#define USE_OPENSSL 1
-#define HAVE_OPENSSL_CRYPTO_H 1
-#define HAVE_OPENSSL_ENGINE_H 1
-#define HAVE_OPENSSL_ERR_H 1
-#define HAVE_OPENSSL_PEM_H 1
-#define HAVE_OPENSSL_PKCS12_H 1
-#define HAVE_OPENSSL_RSA_H 1
-#define HAVE_OPENSSL_SSL_H 1
-#define HAVE_OPENSSL_X509_H 1
-
-#define HAVE_PERROR 1
-#define HAVE_PIPE 1
-#define HAVE_POLL 1
-#define HAVE_POLL_FINE 1
-#define HAVE_POLL_H 1
-#define HAVE_PTHREAD_H 1
-#define HAVE_RAND_STATUS 1
-#define HAVE_SETJMP_H 1
-#define HAVE_SETLOCALE 1
-
-#define HAVE_SETSOCKOPT 1
-#define HAVE_SOCK_OPTS 1 /* for /sys/include/ape/sys/socket.h */
-
-#define HAVE_SIGACTION 1
-#define HAVE_SIGNAL 1
-#define HAVE_SIGNAL_H 1
-#define HAVE_SIGSETJMP 1
-#define HAVE_SIG_ATOMIC_T 1
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
-#define HAVE_SOCKET 1
-#define HAVE_SSL_GET_SHUTDOWN 1
-#define HAVE_STDBOOL_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_STDIO_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRCASECMP 1
-#define HAVE_STRDUP 1
-#define HAVE_STRING_H 1
-#define HAVE_STRNCASECMP 1
-#define HAVE_STRSTR 1
-#define HAVE_STRTOK_R 1
-#define HAVE_STRTOLL 1
-#define HAVE_STRUCT_TIMEVAL 1
-#define HAVE_SYS_IOCTL_H 1
-#define HAVE_SYS_PARAM_H 1
-#define HAVE_SYS_RESOURCE_H 1
-#define HAVE_SYS_SOCKET_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_SYS_TIME_H 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_SYS_UIO_H 1
-#define HAVE_SYS_UN_H 1
-#define HAVE_TERMIOS_H 1
-#define HAVE_TIME_H 1
-#define HAVE_UNAME 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UTIME 1
-#define HAVE_UTIME_H 1
-#define HAVE_WRITEV 1
-
-#define HAVE_ZLIB_H 1
-
-#define HAVE_POSIX_STRERROR_R 1
-#define HAVE_STRERROR_R 1
-#define STRERROR_R_TYPE_ARG3 int
-
-#define TIME_WITH_SYS_TIME 1
-#define USE_BLOCKING_SOCKETS 1
-#define USE_MANUAL 1
-
-#define __attribute__(x)
-
-#ifndef __cplusplus
-#undef inline
-#endif
-
-#endif /* HEADER_CURL_CONFIG_PLAN9_H */
diff --git a/lib/config-riscos.h b/lib/config-riscos.h
index 4af94981c..0379524fb 100644
--- a/lib/config-riscos.h
+++ b/lib/config-riscos.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -164,6 +164,9 @@
/* Define if you have the <krb.h> header file. */
#undef HAVE_KRB_H
+/* Define if you have the `crypto' library (-lcrypto). */
+#undef HAVE_LIBCRYPTO
+
/* Define if you have the `nsl' library (-lnsl). */
#undef HAVE_LIBNSL
@@ -176,6 +179,9 @@
/* Define if you have the `socket' library (-lsocket). */
#undef HAVE_LIBSOCKET
+/* Define if you have the `ssl' library (-lssl). */
+#undef HAVE_LIBSSL
+
/* Define if you have the `ucb' library (-lucb). */
#undef HAVE_LIBUCB
diff --git a/lib/config-symbian.h b/lib/config-symbian.h
index cb2e96d5d..d23de3325 100644
--- a/lib/config-symbian.h
+++ b/lib/config-symbian.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -315,6 +315,9 @@
/* Define to 1 if you have the <libssh2.h> header file. */
/*#define HAVE_LIBSSH2_H 1*/
+/* Define to 1 if you have the `ssl' library (-lssl). */
+/*#define HAVE_LIBSSL 1*/
+
/* if your compiler supports LL */
#define HAVE_LL 1
@@ -475,6 +478,9 @@
/* Define to 1 if you have the `socket' function. */
#define HAVE_SOCKET 1
+/* Define to 1 if you have the `SSL_get_shutdown' function. */
+/*#define HAVE_SSL_GET_SHUTDOWN 1*/
+
/* Define to 1 if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
diff --git a/lib/config-tpf.h b/lib/config-tpf.h
index f0c095bb0..778d9833f 100644
--- a/lib/config-tpf.h
+++ b/lib/config-tpf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -277,6 +277,10 @@
/* Define to 1 if you have the `socket' library (-lsocket). */
/* #undef HAVE_LIBSOCKET */
+/* Define to 1 if you have the `ssl' library (-lssl). */
+/* #undef HAVE_LIBSSL */
+#define HAVE_LIBSSL 1
+
/* if zlib is available */
/* #undef HAVE_LIBZ */
diff --git a/lib/config-vxworks.h b/lib/config-vxworks.h
index d352578e3..8790f8266 100644
--- a/lib/config-vxworks.h
+++ b/lib/config-vxworks.h
@@ -375,6 +375,9 @@
/* Define to 1 if you have the `libssh2_version' function. */
/* #undef HAVE_LIBSSH2_VERSION */
+/* Define to 1 if you have the `ssl' library (-lssl). */
+#define HAVE_LIBSSL 1
+
/* if zlib is available */
#define HAVE_LIBZ 1
@@ -538,6 +541,9 @@
/* Define to 1 if you have the `socket' function. */
#define HAVE_SOCKET 1
+/* Define to 1 if you have the `SSL_get_shutdown' function. */
+#define HAVE_SSL_GET_SHUTDOWN 1
+
/* Define to 1 if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
diff --git a/lib/config-win32.h b/lib/config-win32.h
index 90c105476..76b00b9bb 100644
--- a/lib/config-win32.h
+++ b/lib/config-win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -185,12 +185,6 @@
/* Define if you have the ftruncate function. */
#define HAVE_FTRUNCATE 1
-/* Define to 1 if you have the `getpeername' function. */
-#define HAVE_GETPEERNAME 1
-
-/* Define to 1 if you have the getsockname function. */
-#define HAVE_GETSOCKNAME 1
-
/* Define if you have the gethostbyaddr function. */
#define HAVE_GETHOSTBYADDR 1
@@ -585,9 +579,8 @@ Vista
# endif
#endif
-/* Availability of freeaddrinfo, getaddrinfo, getnameinfo and if_nametoindex
- functions is quite convoluted, compiler dependent and even build target
- dependent. */
+/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is
+ quite convoluted, compiler dependent and even build target dependent. */
#if defined(HAVE_WS2TCPIP_H)
# if defined(__POCC__)
# define HAVE_FREEADDRINFO 1
@@ -717,12 +710,8 @@ Vista
#define USE_WIN32_CRYPTO
/* Define to use Unix sockets. */
-#if defined(_MSC_VER) && (_MSC_VER >= 1500)
-/* sdkddkver.h first shipped with Platform SDK v6.0A included with VS2008 */
-#include <sdkddkver.h>
-#if defined(NTDDI_WIN10_RS4)
-#define USE_UNIX_SOCKETS
-#endif
+#if defined(_MSC_VER) && _MSC_VER >= 1900
+/* #define USE_UNIX_SOCKETS */
#endif
/* ---------------------------------------------------------------- */
diff --git a/lib/conncache.c b/lib/conncache.c
index 57d6061fd..39302ba7b 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -61,8 +61,6 @@
Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
#endif
-#define HASHKEY_SIZE 128
-
static void conn_llist_dtor(void *user, void *element)
{
struct connectdata *conn = element;
@@ -143,8 +141,10 @@ int Curl_conncache_init(struct conncache *connc, int size)
rc = Curl_hash_init(&connc->hash, size, Curl_hash_str,
Curl_str_key_compare, free_bundle_hash_entry);
- if(rc)
- Curl_close(&connc->closure_handle);
+ if(rc) {
+ Curl_close(connc->closure_handle);
+ connc->closure_handle = NULL;
+ }
else
connc->closure_handle->state.conn_cache = connc;
@@ -159,27 +159,23 @@ void Curl_conncache_destroy(struct conncache *connc)
/* creates a key to find a bundle for this connection */
static void hashkey(struct connectdata *conn, char *buf,
- size_t len, /* something like 128 is fine */
- const char **hostp)
+ size_t len) /* something like 128 is fine */
{
const char *hostname;
- long port = conn->remote_port;
- if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
+ if(conn->bits.socksproxy)
+ hostname = conn->socks_proxy.host.name;
+ else if(conn->bits.httpproxy)
hostname = conn->http_proxy.host.name;
- port = conn->port;
- }
else if(conn->bits.conn_to_host)
hostname = conn->conn_to_host.name;
else
hostname = conn->host.name;
- if(hostp)
- /* report back which name we used */
- *hostp = hostname;
+ DEBUGASSERT(len > 32);
/* put the number first so that the hostname gets cut off if too long */
- msnprintf(buf, len, "%ld%s", port, hostname);
+ msnprintf(buf, len, "%ld%s", conn->port, hostname);
}
void Curl_conncache_unlock(struct Curl_easy *data)
@@ -216,14 +212,13 @@ size_t Curl_conncache_bundle_size(struct connectdata *conn)
**NOTE**: When it returns, it holds the connection cache lock! */
struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
- struct conncache *connc,
- const char **hostp)
+ struct conncache *connc)
{
struct connectbundle *bundle = NULL;
CONN_LOCK(conn->data);
if(connc) {
- char key[HASHKEY_SIZE];
- hashkey(conn, key, sizeof(key), hostp);
+ char key[128];
+ hashkey(conn, key, sizeof(key));
bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
}
@@ -272,17 +267,17 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct Curl_easy *data = conn->data;
/* *find_bundle() locks the connection cache */
- bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache, NULL);
+ bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache);
if(!bundle) {
int rc;
- char key[HASHKEY_SIZE];
+ char key[128];
result = bundle_create(data, &new_bundle);
if(result) {
goto unlock;
}
- hashkey(conn, key, sizeof(key), NULL);
+ hashkey(conn, key, sizeof(key));
rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
if(!rc) {
@@ -439,7 +434,6 @@ bool Curl_conncache_return_conn(struct connectdata *conn)
struct connectdata *conn_candidate = NULL;
conn->data = NULL; /* no owner anymore */
- conn->lastused = Curl_now(); /* it was used up until now */
if(maxconnects > 0 &&
Curl_conncache_size(data) > maxconnects) {
infof(data, "Connection cache is full, closing the oldest one.\n");
@@ -485,7 +479,7 @@ Curl_conncache_extract_bundle(struct Curl_easy *data,
if(!CONN_INUSE(conn) && !conn->data) {
/* Set higher score for the age passed since the connection was used */
- score = Curl_timediff(now, conn->lastused);
+ score = Curl_timediff(now, conn->now);
if(score > highscore) {
highscore = score;
@@ -543,7 +537,7 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
if(!CONN_INUSE(conn) && !conn->data) {
/* Set higher score for the age passed since the connection was used */
- score = Curl_timediff(now, conn->lastused);
+ score = Curl_timediff(now, conn->now);
if(score > highscore) {
highscore = score;
@@ -593,7 +587,7 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
Curl_hostcache_clean(connc->closure_handle,
connc->closure_handle->dns.hostcache);
- Curl_close(&connc->closure_handle);
+ Curl_close(connc->closure_handle);
sigpipe_restore(&pipe_st);
}
}
diff --git a/lib/conncache.h b/lib/conncache.h
index 58f902409..0df6d4715 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2012 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
@@ -40,6 +40,7 @@ struct conncache {
#define BUNDLE_NO_MULTIUSE -1
#define BUNDLE_UNKNOWN 0 /* initial value */
+#define BUNDLE_PIPELINING 1
#define BUNDLE_MULTIPLEX 2
struct connectbundle {
@@ -54,8 +55,7 @@ void Curl_conncache_destroy(struct conncache *connc);
/* return the correct bundle, to a host or a proxy */
struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
- struct conncache *connc,
- const char **hostp);
+ struct conncache *connc);
void Curl_conncache_unlock(struct Curl_easy *data);
/* returns number of connections currently held in the connection cache */
size_t Curl_conncache_size(struct Curl_easy *data);
diff --git a/lib/connect.c b/lib/connect.c
index 3b88a5962..a53d79c21 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -75,8 +75,6 @@
#include "conncache.h"
#include "multihandle.h"
#include "system_win32.h"
-#include "quic.h"
-#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -167,7 +165,7 @@ tcpkeepalive(struct Curl_easy *data,
static CURLcode
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai, /* start connecting to this */
- int sockindex); /* 0 or 1 among the temp ones */
+ curl_socket_t *sock);
/*
* Curl_timeleft() returns the amount of milliseconds left allowed for the
@@ -359,7 +357,7 @@ static CURLcode bindlocal(struct connectdata *conn,
conn->ip_version = CURL_IPRESOLVE_V6;
#endif
- rc = Curl_resolv(conn, dev, 0, FALSE, &h);
+ rc = Curl_resolv(conn, dev, 0, &h);
if(rc == CURLRESOLV_PENDING)
(void)Curl_resolver_wait_resolv(conn, &h);
conn->ip_version = ipver;
@@ -370,11 +368,6 @@ static CURLcode bindlocal(struct connectdata *conn,
infof(data, "Name '%s' family %i resolved to '%s' family %i\n",
dev, af, myhost, h->addr->ai_family);
Curl_resolv_unlock(data, h);
- if(af != h->addr->ai_family) {
- /* bad IP version combo, signal the caller to try another address
- family if available */
- return CURLE_UNSUPPORTED_PROTOCOL;
- }
done = 1;
}
else {
@@ -597,7 +590,7 @@ static CURLcode trynextip(struct connectdata *conn,
}
if(ai) {
- result = singleipconnect(conn, ai, tempindex);
+ result = singleipconnect(conn, ai, &conn->tempsock[tempindex]);
if(result == CURLE_COULDNT_CONNECT) {
ai = ai->ai_next;
continue;
@@ -627,19 +620,21 @@ void Curl_persistconninfo(struct connectdata *conn)
conn->data->info.conn_local_port = conn->local_port;
}
+UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
+ long *port);
+
/* retrieves ip address and port from a sockaddr structure.
note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
-bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
- char *addr, long *port)
+UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
+ long *port)
{
+ unsigned short us_port;
struct sockaddr_in *si = NULL;
#ifdef ENABLE_IPV6
struct sockaddr_in6 *si6 = NULL;
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
struct sockaddr_un *su = NULL;
-#else
- (void)salen;
#endif
switch(sa->sa_family) {
@@ -647,7 +642,7 @@ bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
si = (struct sockaddr_in *)(void *) sa;
if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
addr, MAX_IPADR_LEN)) {
- unsigned short us_port = ntohs(si->sin_port);
+ us_port = ntohs(si->sin_port);
*port = us_port;
return TRUE;
}
@@ -657,7 +652,7 @@ bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
si6 = (struct sockaddr_in6 *)(void *) sa;
if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr,
addr, MAX_IPADR_LEN)) {
- unsigned short us_port = ntohs(si6->sin6_port);
+ us_port = ntohs(si6->sin6_port);
*port = us_port;
return TRUE;
}
@@ -665,12 +660,8 @@ bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
case AF_UNIX:
- if(salen > (curl_socklen_t)sizeof(sa_family_t)) {
- su = (struct sockaddr_un*)sa;
- msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
- }
- else
- addr[0] = 0; /* socket with no name */
+ su = (struct sockaddr_un*)sa;
+ msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
*port = 0;
return TRUE;
#endif
@@ -688,115 +679,55 @@ bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
connection */
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
- if(conn->transport != TRNSPRT_TCP)
- /* there's no TCP connection! */
+ curl_socklen_t len;
+ struct Curl_sockaddr_storage ssrem;
+ struct Curl_sockaddr_storage ssloc;
+ struct Curl_easy *data = conn->data;
+
+ if(conn->socktype == SOCK_DGRAM)
+ /* there's no connection! */
return;
-#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
- struct Curl_easy *data = conn->data;
char buffer[STRERROR_LEN];
- struct Curl_sockaddr_storage ssrem;
- struct Curl_sockaddr_storage ssloc;
- curl_socklen_t plen;
- curl_socklen_t slen;
-#ifdef HAVE_GETPEERNAME
- plen = sizeof(struct Curl_sockaddr_storage);
- if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
+ len = sizeof(struct Curl_sockaddr_storage);
+ if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
int error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(error, buffer, sizeof(buffer)));
return;
}
-#endif
-#ifdef HAVE_GETSOCKNAME
- slen = sizeof(struct Curl_sockaddr_storage);
+
+ len = sizeof(struct Curl_sockaddr_storage);
memset(&ssloc, 0, sizeof(ssloc));
- if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
+ if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
int error = SOCKERRNO;
failf(data, "getsockname() failed with errno %d: %s",
error, Curl_strerror(error, buffer, sizeof(buffer)));
return;
}
-#endif
-#ifdef HAVE_GETPEERNAME
- if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
- conn->primary_ip, &conn->primary_port)) {
+
+ if(!getaddressinfo((struct sockaddr*)&ssrem,
+ conn->primary_ip, &conn->primary_port)) {
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
return;
}
memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
-#endif
-#ifdef HAVE_GETSOCKNAME
- if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
- conn->local_ip, &conn->local_port)) {
+
+ if(!getaddressinfo((struct sockaddr*)&ssloc,
+ conn->local_ip, &conn->local_port)) {
failf(data, "ssloc inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
return;
}
-#endif
+
}
-#else /* !HAVE_GETSOCKNAME && !HAVE_GETPEERNAME */
- (void)sockfd; /* unused */
-#endif
/* persist connection info in session handle */
Curl_persistconninfo(conn);
}
-/* after a TCP connection to the proxy has been verified, this function does
- the next magic step.
-
- Note: this function's sub-functions call failf()
-
-*/
-static CURLcode connected_proxy(struct connectdata *conn, int sockindex)
-{
- CURLcode result = CURLE_OK;
-
- if(conn->bits.socksproxy) {
-#ifndef CURL_DISABLE_PROXY
- /* for the secondary socket (FTP), use the "connect to host"
- * but ignore the "connect to port" (use the secondary port)
- */
- const char * const host = conn->bits.httpproxy ?
- conn->http_proxy.host.name :
- conn->bits.conn_to_host ?
- conn->conn_to_host.name :
- sockindex == SECONDARYSOCKET ?
- conn->secondaryhostname : conn->host.name;
- const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
- sockindex == SECONDARYSOCKET ? conn->secondary_port :
- conn->bits.conn_to_port ? conn->conn_to_port :
- conn->remote_port;
- conn->bits.socksproxy_connecting = TRUE;
- switch(conn->socks_proxy.proxytype) {
- case CURLPROXY_SOCKS5:
- case CURLPROXY_SOCKS5_HOSTNAME:
- result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
- host, port, sockindex, conn);
- break;
-
- case CURLPROXY_SOCKS4:
- case CURLPROXY_SOCKS4A:
- result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
- conn);
- break;
-
- default:
- failf(conn->data, "unknown proxytype option given");
- result = CURLE_COULDNT_CONNECT;
- } /* switch proxytype */
- conn->bits.socksproxy_connecting = FALSE;
-#else
- (void)sockindex;
-#endif /* CURL_DISABLE_PROXY */
- }
-
- return result;
-}
-
/*
* Curl_is_connected() checks if the socket has connected.
*/
@@ -839,24 +770,6 @@ CURLcode Curl_is_connected(struct connectdata *conn,
if(conn->tempsock[i] == CURL_SOCKET_BAD)
continue;
-#ifdef ENABLE_QUIC
- if(conn->transport == TRNSPRT_QUIC) {
- result = Curl_quic_is_connected(conn, i, connected);
- if(result) {
- error = SOCKERRNO;
- goto error;
- }
- if(*connected) {
- /* use this socket from now on */
- conn->sock[sockindex] = conn->tempsock[i];
- conn->ip_addr = conn->tempaddr[i];
- conn->tempsock[i] = CURL_SOCKET_BAD;
- connkeep(conn, "HTTP/3 default");
- }
- return result;
- }
-#endif
-
#ifdef mpeix
/* Call this function once now, and ignore the results. We do this to
"clear" the error state on the socket so that we can later read it
@@ -870,8 +783,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
if(rc == 0) { /* no connection yet */
error = 0;
if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
- infof(data, "After %" CURL_FORMAT_TIMEDIFF_T
- "ms connect time, move on!\n", conn->timeoutms_per_addr);
+ infof(data, "After %ldms connect time, move on!\n",
+ conn->timeoutms_per_addr);
error = ETIMEDOUT;
}
@@ -901,7 +814,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
}
/* see if we need to do any proxy magic first once we connected */
- result = connected_proxy(conn, sockindex);
+ result = Curl_connected_proxy(conn, sockindex);
if(result)
return result;
@@ -920,9 +833,6 @@ CURLcode Curl_is_connected(struct connectdata *conn,
else if(rc & CURL_CSELECT_ERR)
(void)verifyconnect(conn->tempsock[i], &error);
-#ifdef ENABLE_QUIC
- error:
-#endif
/*
* The connection failed here, we should attempt to connect to the "next
* address" for the given host. But first remember the latest error.
@@ -940,11 +850,11 @@ CURLcode Curl_is_connected(struct connectdata *conn,
Curl_strerror(error, buffer, sizeof(buffer)));
conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
- allow : allow / 2;
+ allow : allow / 2;
status = trynextip(conn, sockindex, i);
- if((status != CURLE_COULDNT_CONNECT) ||
- conn->tempsock[other] == CURL_SOCKET_BAD)
+ if(status != CURLE_COULDNT_CONNECT
+ || conn->tempsock[other] == CURL_SOCKET_BAD)
/* the last attempt failed and no other sockets remain open */
result = status;
}
@@ -976,14 +886,6 @@ CURLcode Curl_is_connected(struct connectdata *conn,
failf(data, "Failed to connect to %s port %ld: %s",
hostname, conn->port,
Curl_strerror(error, buffer, sizeof(buffer)));
-
-#ifdef WSAETIMEDOUT
- if(WSAETIMEDOUT == data->state.os_errno)
- result = CURLE_OPERATION_TIMEDOUT;
-#elif defined(ETIMEDOUT)
- if(ETIMEDOUT == data->state.os_errno)
- result = CURLE_OPERATION_TIMEDOUT;
-#endif
}
return result;
@@ -1091,7 +993,7 @@ void Curl_sndbufset(curl_socket_t sockfd)
*/
static CURLcode singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai,
- int sockindex)
+ curl_socket_t *sockp)
{
struct Curl_sockaddr_ex addr;
int rc = -1;
@@ -1107,7 +1009,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
int optval = 1;
#endif
char buffer[STRERROR_LEN];
- curl_socket_t *sockp = &conn->tempsock[sockindex];
+
*sockp = CURL_SOCKET_BAD;
result = Curl_socket(conn, ai, &addr, &sockfd);
@@ -1118,15 +1020,15 @@ static CURLcode singleipconnect(struct connectdata *conn,
return CURLE_OK;
/* store remote address and port used in this connection attempt */
- if(!Curl_addr2string((struct sockaddr*)&addr.sa_addr, addr.addrlen,
- ipaddress, &port)) {
+ if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
+ ipaddress, &port)) {
/* malformed address or bug in inet_ntop, try next address */
failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
Curl_closesocket(conn, sockfd);
return CURLE_OK;
}
- infof(data, " Trying %s:%ld...\n", ipaddress, port);
+ infof(data, " Trying %s...\n", ipaddress);
#ifdef ENABLE_IPV6
is_tcp = (addr.family == AF_INET || addr.family == AF_INET6) &&
@@ -1186,8 +1088,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(conn->num_addr > 1)
Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
- /* Connect TCP and QUIC sockets */
- if(!isconnected && (conn->transport != TRNSPRT_UDP)) {
+ /* Connect TCP sockets, bind UDP */
+ if(!isconnected && (conn->socktype == SOCK_STREAM)) {
if(conn->bits.tcp_fastopen) {
#if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
# if defined(HAVE_BUILTIN_AVAILABLE)
@@ -1233,16 +1135,6 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(-1 == rc)
error = SOCKERRNO;
-#ifdef ENABLE_QUIC
- else if(conn->transport == TRNSPRT_QUIC) {
- /* pass in 'sockfd' separately since it hasn't been put into the
- tempsock array at this point */
- result = Curl_quic_connect(conn, sockfd, sockindex,
- &addr.sa_addr, addr.addrlen);
- if(result)
- error = SOCKERRNO;
- }
-#endif
}
else {
*sockp = sockfd;
@@ -1316,7 +1208,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
/* start connecting to first IP */
while(conn->tempaddr[0]) {
- result = singleipconnect(conn, conn->tempaddr[0], 0);
+ result = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
if(!result)
break;
conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
@@ -1483,9 +1375,8 @@ CURLcode Curl_socket(struct connectdata *conn,
*/
addr->family = ai->ai_family;
- addr->socktype = (conn->transport == TRNSPRT_TCP) ? SOCK_STREAM : SOCK_DGRAM;
- addr->protocol = conn->transport != TRNSPRT_TCP ? IPPROTO_UDP :
- ai->ai_protocol;
+ addr->socktype = conn->socktype;
+ addr->protocol = conn->socktype == SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
addr->addrlen = ai->ai_addrlen;
if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
@@ -1516,11 +1407,6 @@ CURLcode Curl_socket(struct connectdata *conn,
/* no socket, no connection */
return CURLE_COULDNT_CONNECT;
- if(conn->transport == TRNSPRT_QUIC) {
- /* QUIC sockets need to be nonblocking */
- (void)curlx_nonblock(*sockfd, TRUE);
- }
-
#if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
if(conn->scope_id && (addr->family == AF_INET6)) {
struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr;
diff --git a/lib/connect.h b/lib/connect.h
index b23085a98..6a5c755cc 100644
--- a/lib/connect.h
+++ b/lib/connect.h
@@ -51,9 +51,6 @@ timediff_t Curl_timeleft(struct Curl_easy *data,
curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
struct connectdata **connp);
-bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
- char *addr, long *port);
-
/*
* Check if a connection seems to be alive.
*/
diff --git a/lib/cookie.c b/lib/cookie.c
index f56bd85a9..44851a52f 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -93,7 +93,6 @@ Example set of cookies:
#include "share.h"
#include "strtoofft.h"
#include "strcase.h"
-#include "curl_get_line.h"
#include "curl_memrchr.h"
#include "inet_pton.h"
@@ -819,14 +818,22 @@ Curl_cookie_add(struct Curl_easy *data,
badcookie = TRUE;
break;
case 1:
- /* flag: A TRUE/FALSE value indicating if all machines within a given
- domain can access the variable. Set TRUE when the cookie says
+ /* This field got its explanation on the 23rd of May 2001 by
+ Andrés García:
+
+ flag: A TRUE/FALSE value indicating if all machines within a given
+ domain can access the variable. This value is set automatically by
+ the browser, depending on the value you set for the domain.
+
+ As far as I can see, it is set to true when the cookie says
.domain.com and to false when the domain is complete www.domain.com
*/
co->tailmatch = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
break;
case 2:
- /* The file format allows the path field to remain not filled in */
+ /* It turns out, that sometimes the file format allows the path
+ field to remain not filled in, we try to detect this and work
+ around it! Andrés García made us aware of this... */
if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
/* only if the path doesn't look like a boolean option! */
co->path = strdup(ptr);
@@ -866,13 +873,11 @@ Curl_cookie_add(struct Curl_easy *data,
co->name = strdup(ptr);
if(!co->name)
badcookie = TRUE;
- else {
- /* For Netscape file format cookies we check prefix on the name */
- if(strncasecompare("__Secure-", co->name, 9))
- co->prefix |= COOKIE_PREFIX__SECURE;
- else if(strncasecompare("__Host-", co->name, 7))
- co->prefix |= COOKIE_PREFIX__HOST;
- }
+ /* For Netscape file format cookies we check prefix on the name */
+ if(strncasecompare("__Secure-", co->name, 9))
+ co->prefix |= COOKIE_PREFIX__SECURE;
+ else if(strncasecompare("__Host-", co->name, 7))
+ co->prefix |= COOKIE_PREFIX__HOST;
break;
case 6:
co->value = strdup(ptr);
@@ -1080,6 +1085,33 @@ Curl_cookie_add(struct Curl_easy *data,
return co;
}
+/*
+ * get_line() makes sure to only return complete whole lines that fit in 'len'
+ * bytes and end with a newline.
+ */
+char *Curl_get_line(char *buf, int len, FILE *input)
+{
+ bool partial = FALSE;
+ while(1) {
+ char *b = fgets(buf, len, input);
+ if(b) {
+ size_t rlen = strlen(b);
+ if(rlen && (b[rlen-1] == '\n')) {
+ if(partial) {
+ partial = FALSE;
+ continue;
+ }
+ return b;
+ }
+ /* read a partial, discard the next piece that ends with newline */
+ partial = TRUE;
+ }
+ else
+ break;
+ }
+ return NULL;
+}
+
/*****************************************************************************
*
@@ -1090,8 +1122,6 @@ Curl_cookie_add(struct Curl_easy *data,
*
* If 'newsession' is TRUE, discard all "session cookies" on read from file.
*
- * Note that 'data' might be called as NULL pointer.
- *
* Returns NULL on out of memory. Invalid cookies are ignored.
****************************************************************************/
struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
@@ -1162,8 +1192,6 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
}
c->running = TRUE; /* now, we're running */
- if(data)
- data->state.cookie_engine = TRUE;
return c;
@@ -1505,6 +1533,10 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
struct Cookie *co;
FILE *out;
bool use_stdout = FALSE;
+ char *format_ptr;
+ unsigned int i;
+ unsigned int j;
+ struct Cookie **array;
if(!c)
/* no cookie engine alive */
@@ -1531,30 +1563,26 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
out);
if(c->numcookies) {
- unsigned int i;
- size_t nvalid = 0;
- struct Cookie **array;
-
- array = calloc(1, sizeof(struct Cookie *) * c->numcookies);
+ array = malloc(sizeof(struct Cookie *) * c->numcookies);
if(!array) {
if(!use_stdout)
fclose(out);
return 1;
}
- /* only sort the cookies with a domain property */
+ j = 0;
for(i = 0; i < COOKIE_HASH_SIZE; i++) {
for(co = c->cookies[i]; co; co = co->next) {
if(!co->domain)
continue;
- array[nvalid++] = co;
+ array[j++] = co;
}
}
- qsort(array, nvalid, sizeof(struct Cookie *), cookie_sort_ct);
+ qsort(array, c->numcookies, sizeof(struct Cookie *), cookie_sort_ct);
- for(i = 0; i < nvalid; i++) {
- char *format_ptr = get_netscape_format(array[i]);
+ for(i = 0; i < j; i++) {
+ format_ptr = get_netscape_format(array[i]);
if(format_ptr == NULL) {
fprintf(out, "#\n# Fatal libcurl error\n");
free(array);
@@ -1617,7 +1645,7 @@ struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
return list;
}
-void Curl_flush_cookies(struct Curl_easy *data, bool cleanup)
+void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
{
if(data->set.str[STRING_COOKIEJAR]) {
if(data->change.cookielist) {
@@ -1646,7 +1674,6 @@ void Curl_flush_cookies(struct Curl_easy *data, bool cleanup)
if(cleanup && (!data->share || (data->cookies != data->share->cookies))) {
Curl_cookie_cleanup(data->cookies);
- data->cookies = NULL;
}
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
diff --git a/lib/cookie.h b/lib/cookie.h
index b3865e601..6ac4a6ac0 100644
--- a/lib/cookie.h
+++ b/lib/cookie.h
@@ -101,6 +101,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *, const char *,
void Curl_cookie_freelist(struct Cookie *cookies);
void Curl_cookie_clearall(struct CookieInfo *cookies);
void Curl_cookie_clearsess(struct CookieInfo *cookies);
+char *Curl_get_line(char *buf, int len, FILE *input);
#if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES)
#define Curl_cookie_list(x) NULL
@@ -109,7 +110,7 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies);
#define Curl_cookie_cleanup(x) Curl_nop_stmt
#define Curl_flush_cookies(x,y) Curl_nop_stmt
#else
-void Curl_flush_cookies(struct Curl_easy *data, bool cleanup);
+void Curl_flush_cookies(struct Curl_easy *data, int cleanup);
void Curl_cookie_cleanup(struct CookieInfo *);
struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
const char *, struct CookieInfo *, bool);
diff --git a/lib/curl_config.h b/lib/curl_config.h
index d3bc43e2e..a714d6352 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
@@ -25,9 +25,6 @@
/* to disable DICT */
#define CURL_DISABLE_DICT 1
-/* disable DoH */
-/* #undef CURL_DISABLE_DOH */
-
/* to disable FILE */
/* #undef CURL_DISABLE_FILE */
@@ -40,9 +37,6 @@
/* to disable HTTP */
/* #undef CURL_DISABLE_HTTP */
-/* disable HTTP authentication */
-/* #undef CURL_DISABLE_HTTP_AUTH */
-
/* to disable IMAP */
#define CURL_DISABLE_IMAP 1
@@ -55,33 +49,18 @@
/* to disable --libcurl C code generation option */
/* #undef CURL_DISABLE_LIBCURL_OPTION */
-/* disable mime API */
-/* #undef CURL_DISABLE_MIME */
-
-/* disable netrc parsing */
-/* #undef CURL_DISABLE_NETRC */
-
/* if the OpenSSL configuration won't be loaded automatically */
/* #undef CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG */
-/* disable date parsing */
-/* #undef CURL_DISABLE_PARSEDATE */
-
/* to disable POP3 */
#define CURL_DISABLE_POP3 1
-/* disable progress-meter */
-/* #undef CURL_DISABLE_PROGRESS_METER */
-
/* to disable proxies */
/* #undef CURL_DISABLE_PROXY */
/* to disable RTSP */
#define CURL_DISABLE_RTSP 1
-/* disable DNS shuffling */
-/* #undef CURL_DISABLE_SHUFFLE_DNS */
-
/* to disable SMB/CIFS */
#define CURL_DISABLE_SMB 1
@@ -94,6 +73,9 @@
/* to disable TFTP */
#define CURL_DISABLE_TFTP 1
+/* to disable TLS-SRP authentication */
+/* #undef CURL_DISABLE_TLS_SRP */
+
/* to disable verbose strings */
/* #undef CURL_DISABLE_VERBOSE_STRINGS */
@@ -172,6 +154,18 @@
/* Define to 1 if you have the <crypto.h> header file. */
/* #undef HAVE_CRYPTO_H */
+/* Define to 1 if you have the `CyaSSL_CTX_UseSupportedCurve' function. */
+/* #undef HAVE_CYASSL_CTX_USESUPPORTEDCURVE */
+
+/* Define to 1 if you have the <cyassl/error-ssl.h> header file. */
+/* #undef HAVE_CYASSL_ERROR_SSL_H */
+
+/* Define to 1 if you have the `CyaSSL_get_peer_certificate' function. */
+/* #undef HAVE_CYASSL_GET_PEER_CERTIFICATE */
+
+/* Define to 1 if you have the <cyassl/options.h> header file. */
+/* #undef HAVE_CYASSL_OPTIONS_H */
+
/* Define to 1 if you have the declaration of `getpwuid_r', and to 0 if you
don't. */
#define HAVE_DECL_GETPWUID_R 1
@@ -269,9 +263,6 @@
/* Define to 1 if you have the `getpass_r' function. */
/* #undef HAVE_GETPASS_R */
-/* Define to 1 if you have the getpeername function. */
-#define HAVE_GETPEERNAME 1
-
/* Define to 1 if you have the `getppid' function. */
#define HAVE_GETPPID 1
@@ -287,9 +278,6 @@
/* Define to 1 if you have the getservbyport_r function. */
/* #undef HAVE_GETSERVBYPORT_R */
-/* Define to 1 if you have the getsockname function. */
-#define HAVE_GETSOCKNAME 1
-
/* Define to 1 if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY 1
@@ -487,15 +475,6 @@
/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
/* #undef HAVE_NGHTTP2_NGHTTP2_H */
-/* Define to 1 if you have the <nghttp3/nghttp3.h> header file. */
-/* #undef HAVE_NGHTTP3_NGHTTP3_H */
-
-/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto.h> header file. */
-/* #undef HAVE_NGTCP2_NGTCP2_CRYPTO_H */
-
-/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
-/* #undef HAVE_NGTCP2_NGTCP2_H */
-
/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE
*/
/* #undef HAVE_OLD_GSSMIT */
@@ -554,9 +533,6 @@
/* Define to 1 if you have the <pwd.h> header file. */
#define HAVE_PWD_H 1
-/* Define to 1 if you have the <quiche.h> header file. */
-/* #undef HAVE_QUICHE_H */
-
/* Define to 1 if you have the `RAND_egd' function. */
/* #undef HAVE_RAND_EGD */
@@ -629,8 +605,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
/* #undef HAVE_SSLV2_CLIENT_METHOD */
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-/* #undef HAVE_SSL_GET_ESNI_STATUS */
+/* Define to 1 if you have the `SSL_get_shutdown' function. */
+#define HAVE_SSL_GET_SHUTDOWN 1
/* Define to 1 if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
@@ -755,9 +731,6 @@
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
-/* Define to 1 if you have the `usleep' function. */
-#define HAVE_USLEEP 1
-
/* Define to 1 if you have the `utime' function. */
#define HAVE_UTIME 1
@@ -938,8 +911,8 @@
/* Define to enable c-ares support */
/* #undef USE_ARES */
-/* if ESNI support is available */
-/* #undef USE_ESNI */
+/* if CyaSSL/WolfSSL is enabled */
+/* #undef USE_CYASSL */
/* if GnuTLS is enabled */
/* #undef USE_GNUTLS */
@@ -974,15 +947,6 @@
/* if nghttp2 is in use */
/* #undef USE_NGHTTP2 */
-/* if nghttp3 is in use */
-/* #undef USE_NGHTTP3 */
-
-/* if ngtcp2 is in use */
-/* #undef USE_NGTCP2 */
-
-/* if ngtcp2_crypto_openssl is in use */
-/* #undef USE_NGTCP2_CRYPTO_OPENSSL */
-
/* if NSS is enabled */
/* #undef USE_NSS */
@@ -992,8 +956,8 @@
/* if OpenSSL is in use */
#define USE_OPENSSL 1
-/* if quiche is in use */
-/* #undef USE_QUICHE */
+/* if PolarSSL is enabled */
+/* #undef USE_POLARSSL */
/* to enable Windows native SSL/TLS support */
/* #undef USE_SCHANNEL */
@@ -1030,9 +994,6 @@
/* to enable SSPI support */
/* #undef USE_WINDOWS_SSPI */
-/* if wolfSSL is enabled */
-/* #undef USE_WOLFSSL */
-
/* Version number of package */
#define VERSION "-"
diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake
index e0793a7ee..5308eb579 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -235,15 +235,6 @@
/* Define to 1 if you have the `getprotobyname' function. */
#cmakedefine HAVE_GETPROTOBYNAME 1
-/* Define to 1 if you have the `getpeername' function. */
-#cmakedefine HAVE_GETPEERNAME 1
-
-/* Define to 1 if you have the `getsockname' function. */
-#cmakedefine HAVE_GETSOCKNAME 1
-
-/* Define to 1 if you have the `if_nametoindex' function. */
-#cmakedefine HAVE_IF_NAMETOINDEX 1
-
/* Define to 1 if you have the `getpwuid' function. */
#cmakedefine HAVE_GETPWUID 1
@@ -407,6 +398,9 @@
/* Define to 1 if you have the <libssh2.h> header file. */
#cmakedefine HAVE_LIBSSH2_H 1
+/* Define to 1 if you have the `ssl' library (-lssl). */
+#cmakedefine HAVE_LIBSSL 1
+
/* if zlib is available */
#cmakedefine HAVE_LIBZ 1
@@ -584,6 +578,9 @@
/* Define to 1 if you have the `socket' function. */
#cmakedefine HAVE_SOCKET 1
+/* Define to 1 if you have the `SSL_get_shutdown' function. */
+#cmakedefine HAVE_SSL_GET_SHUTDOWN 1
+
/* Define to 1 if you have the <ssl.h> header file. */
#cmakedefine HAVE_SSL_H 1
@@ -885,35 +882,26 @@
/* Define to the function return type for send. */
#cmakedefine SEND_TYPE_RETV ${SEND_TYPE_RETV}
-/*
- Note: SIZEOF_* variables are fetched with CMake through check_type_size().
- As per CMake documentation on CheckTypeSize, C preprocessor code is
- generated by CMake into SIZEOF_*_CODE. This is what we use in the
- following statements.
-
- Reference: https://cmake.org/cmake/help/latest/module/CheckTypeSize.html
-*/
-
/* The size of `int', as computed by sizeof. */
-${SIZEOF_INT_CODE}
+#cmakedefine SIZEOF_INT ${SIZEOF_INT}
/* The size of `short', as computed by sizeof. */
-${SIZEOF_SHORT_CODE}
+#cmakedefine SIZEOF_SHORT ${SIZEOF_SHORT}
/* The size of `long', as computed by sizeof. */
-${SIZEOF_LONG_CODE}
+#cmakedefine SIZEOF_LONG ${SIZEOF_LONG}
/* The size of `off_t', as computed by sizeof. */
-${SIZEOF_OFF_T_CODE}
+#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
/* The size of `curl_off_t', as computed by sizeof. */
-${SIZEOF_CURL_OFF_T_CODE}
+#cmakedefine SIZEOF_CURL_OFF_T ${SIZEOF_CURL_OFF_T}
/* The size of `size_t', as computed by sizeof. */
-${SIZEOF_SIZE_T_CODE}
+#cmakedefine SIZEOF_SIZE_T ${SIZEOF_SIZE_T}
/* The size of `time_t', as computed by sizeof. */
-${SIZEOF_TIME_T_CODE}
+#cmakedefine SIZEOF_TIME_T ${SIZEOF_TIME_T}
/* Define to 1 if you have the ANSI C header files. */
#cmakedefine STDC_HEADERS 1
@@ -942,8 +930,8 @@ ${SIZEOF_TIME_T_CODE}
/* if PolarSSL is enabled */
#cmakedefine USE_POLARSSL 1
-/* if Secure Transport is enabled */
-#cmakedefine USE_SECTRANSP 1
+/* if DarwinSSL is enabled */
+#cmakedefine USE_DARWINSSL 1
/* if mbedTLS is enabled */
#cmakedefine USE_MBEDTLS 1
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index 32a87bd29..04ed02a56 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -24,9 +24,6 @@
/* to disable DICT */
#undef CURL_DISABLE_DICT
-/* disable DoH */
-#undef CURL_DISABLE_DOH
-
/* to disable FILE */
#undef CURL_DISABLE_FILE
@@ -39,9 +36,6 @@
/* to disable HTTP */
#undef CURL_DISABLE_HTTP
-/* disable HTTP authentication */
-#undef CURL_DISABLE_HTTP_AUTH
-
/* to disable IMAP */
#undef CURL_DISABLE_IMAP
@@ -54,33 +48,18 @@
/* to disable --libcurl C code generation option */
#undef CURL_DISABLE_LIBCURL_OPTION
-/* disable mime API */
-#undef CURL_DISABLE_MIME
-
-/* disable netrc parsing */
-#undef CURL_DISABLE_NETRC
-
/* if the OpenSSL configuration won't be loaded automatically */
#undef CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
-/* disable date parsing */
-#undef CURL_DISABLE_PARSEDATE
-
/* to disable POP3 */
#undef CURL_DISABLE_POP3
-/* disable progress-meter */
-#undef CURL_DISABLE_PROGRESS_METER
-
/* to disable proxies */
#undef CURL_DISABLE_PROXY
/* to disable RTSP */
#undef CURL_DISABLE_RTSP
-/* disable DNS shuffling */
-#undef CURL_DISABLE_SHUFFLE_DNS
-
/* to disable SMB/CIFS */
#undef CURL_DISABLE_SMB
@@ -93,6 +72,9 @@
/* to disable TFTP */
#undef CURL_DISABLE_TFTP
+/* to disable TLS-SRP authentication */
+#undef CURL_DISABLE_TLS_SRP
+
/* to disable verbose strings */
#undef CURL_DISABLE_VERBOSE_STRINGS
@@ -171,6 +153,18 @@
/* Define to 1 if you have the <crypto.h> header file. */
#undef HAVE_CRYPTO_H
+/* Define to 1 if you have the `CyaSSL_CTX_UseSupportedCurve' function. */
+#undef HAVE_CYASSL_CTX_USESUPPORTEDCURVE
+
+/* Define to 1 if you have the <cyassl/error-ssl.h> header file. */
+#undef HAVE_CYASSL_ERROR_SSL_H
+
+/* Define to 1 if you have the `CyaSSL_get_peer_certificate' function. */
+#undef HAVE_CYASSL_GET_PEER_CERTIFICATE
+
+/* Define to 1 if you have the <cyassl/options.h> header file. */
+#undef HAVE_CYASSL_OPTIONS_H
+
/* Define to 1 if you have the declaration of `getpwuid_r', and to 0 if you
don't. */
#undef HAVE_DECL_GETPWUID_R
@@ -268,9 +262,6 @@
/* Define to 1 if you have the `getpass_r' function. */
#undef HAVE_GETPASS_R
-/* Define to 1 if you have the getpeername function. */
-#undef HAVE_GETPEERNAME
-
/* Define to 1 if you have the `getppid' function. */
#undef HAVE_GETPPID
@@ -286,9 +277,6 @@
/* Define to 1 if you have the getservbyport_r function. */
#undef HAVE_GETSERVBYPORT_R
-/* Define to 1 if you have the getsockname function. */
-#undef HAVE_GETSOCKNAME
-
/* Define to 1 if you have the `gettimeofday' function. */
#undef HAVE_GETTIMEOFDAY
@@ -486,15 +474,6 @@
/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
#undef HAVE_NGHTTP2_NGHTTP2_H
-/* Define to 1 if you have the <nghttp3/nghttp3.h> header file. */
-#undef HAVE_NGHTTP3_NGHTTP3_H
-
-/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto.h> header file. */
-#undef HAVE_NGTCP2_NGTCP2_CRYPTO_H
-
-/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
-#undef HAVE_NGTCP2_NGTCP2_H
-
/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE
*/
#undef HAVE_OLD_GSSMIT
@@ -553,9 +532,6 @@
/* Define to 1 if you have the <pwd.h> header file. */
#undef HAVE_PWD_H
-/* Define to 1 if you have the <quiche.h> header file. */
-#undef HAVE_QUICHE_H
-
/* Define to 1 if you have the `RAND_egd' function. */
#undef HAVE_RAND_EGD
@@ -628,8 +604,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
#undef HAVE_SSLV2_CLIENT_METHOD
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-#undef HAVE_SSL_GET_ESNI_STATUS
+/* Define to 1 if you have the `SSL_get_shutdown' function. */
+#undef HAVE_SSL_GET_SHUTDOWN
/* Define to 1 if you have the <ssl.h> header file. */
#undef HAVE_SSL_H
@@ -754,9 +730,6 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* Define to 1 if you have the `usleep' function. */
-#undef HAVE_USLEEP
-
/* Define to 1 if you have the `utime' function. */
#undef HAVE_UTIME
@@ -955,8 +928,8 @@
/* Define to enable c-ares support */
#undef USE_ARES
-/* if ESNI support is available */
-#undef USE_ESNI
+/* if CyaSSL/WolfSSL is enabled */
+#undef USE_CYASSL
/* if GnuTLS is enabled */
#undef USE_GNUTLS
@@ -991,15 +964,6 @@
/* if nghttp2 is in use */
#undef USE_NGHTTP2
-/* if nghttp3 is in use */
-#undef USE_NGHTTP3
-
-/* if ngtcp2 is in use */
-#undef USE_NGTCP2
-
-/* if ngtcp2_crypto_openssl is in use */
-#undef USE_NGTCP2_CRYPTO_OPENSSL
-
/* if NSS is enabled */
#undef USE_NSS
@@ -1009,8 +973,8 @@
/* if OpenSSL is in use */
#undef USE_OPENSSL
-/* if quiche is in use */
-#undef USE_QUICHE
+/* if PolarSSL is enabled */
+#undef USE_POLARSSL
/* to enable Windows native SSL/TLS support */
#undef USE_SCHANNEL
@@ -1047,9 +1011,6 @@
/* to enable SSPI support */
#undef USE_WINDOWS_SSPI
-/* if wolfSSL is enabled */
-#undef USE_WOLFSSL
-
/* Version number of package */
#undef VERSION
diff --git a/lib/curl_endian.h b/lib/curl_endian.h
index 9830e58fd..4f345a6a2 100644
--- a/lib/curl_endian.h
+++ b/lib/curl_endian.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,9 @@ unsigned int Curl_read32_le(const unsigned char *buf);
/* Converts a 16-bit integer from big endian */
unsigned short Curl_read16_be(const unsigned char *buf);
+/* Converts a 32-bit integer to little endian */
+void Curl_write32_le(const int value, unsigned char *buffer);
+
#if (CURL_SIZEOF_CURL_OFF_T > 4)
/* Converts a 64-bit integer to little endian */
#if defined(HAVE_LONGLONG)
diff --git a/lib/curl_fnmatch.c b/lib/curl_fnmatch.c
index ab3e7428d..846ecaec3 100644
--- a/lib/curl_fnmatch.c
+++ b/lib/curl_fnmatch.c
@@ -32,6 +32,15 @@
#ifndef HAVE_FNMATCH
+/*
+ * TODO:
+ *
+ * Make this function match POSIX. Test 1307 includes a set of test patterns
+ * that returns different results with a POSIX fnmatch() than with this
+ * implementation and this is considered a bug where POSIX is the guiding
+ * light.
+ */
+
#define CURLFNM_CHARSET_LEN (sizeof(char) * 256)
#define CURLFNM_CHSET_SIZE (CURLFNM_CHARSET_LEN + 15)
diff --git a/lib/curl_get_line.c b/lib/curl_get_line.c
deleted file mode 100644
index c4194851a..000000000
--- a/lib/curl_get_line.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#include "curl_get_line.h"
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-/*
- * get_line() makes sure to only return complete whole lines that fit in 'len'
- * bytes and end with a newline.
- */
-char *Curl_get_line(char *buf, int len, FILE *input)
-{
- bool partial = FALSE;
- while(1) {
- char *b = fgets(buf, len, input);
- if(b) {
- size_t rlen = strlen(b);
- if(rlen && (b[rlen-1] == '\n')) {
- if(partial) {
- partial = FALSE;
- continue;
- }
- return b;
- }
- /* read a partial, discard the next piece that ends with newline */
- partial = TRUE;
- }
- else
- break;
- }
- return NULL;
-}
diff --git a/lib/curl_get_line.h b/lib/curl_get_line.h
deleted file mode 100644
index 532ab080a..000000000
--- a/lib/curl_get_line.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef HEADER_CURL_GET_LINE_H
-#define HEADER_CURL_GET_LINE_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* get_line() makes sure to only return complete whole lines that fit in 'len'
- * bytes and end with a newline. */
-char *Curl_get_line(char *buf, int len, FILE *input);
-
-#endif /* HEADER_CURL_GET_LINE_H */
diff --git a/lib/curl_md4.h b/lib/curl_md4.h
index 82df708ce..e0690416d 100644
--- a/lib/curl_md4.h
+++ b/lib/curl_md4.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,12 +24,12 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_CRYPTO_AUTH)
-
-#define MD4_DIGEST_LENGTH 16
+#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);
-#endif /* !defined(CURL_DISABLE_CRYPTO_AUTH) */
+#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
#endif /* HEADER_CURL_MD4_H */
diff --git a/lib/curl_md5.h b/lib/curl_md5.h
index aaf25f61b..5f70c9634 100644
--- a/lib/curl_md5.h
+++ b/lib/curl_md5.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -53,10 +53,10 @@ void Curl_md5it(unsigned char *output,
const unsigned char *input);
MD5_context * Curl_MD5_init(const MD5_params *md5params);
-CURLcode Curl_MD5_update(MD5_context *context,
- const unsigned char *data,
- unsigned int len);
-CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result);
+int Curl_MD5_update(MD5_context *context,
+ const unsigned char *data,
+ unsigned int len);
+int Curl_MD5_final(MD5_context *context, unsigned char *result);
#endif
diff --git a/lib/curl_memory.h b/lib/curl_memory.h
index ce38a08cd..fccf46879 100644
--- a/lib/curl_memory.h
+++ b/lib/curl_memory.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,7 +39,7 @@
*
* File lib/strdup.c is an exception, given that it provides a strdup
* clone implementation while using malloc. Extra care needed inside
- * this one.
+ * this one. TODO: revisit this paragraph and related code.
*
* The need for curl_memory.h inclusion is due to libcurl's feature
* of allowing library user to provide memory replacement functions,
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index 19f9b61d8..e7060eb29 100644
--- a/lib/curl_ntlm_core.c
+++ b/lib/curl_ntlm_core.c
@@ -55,6 +55,9 @@
#ifdef USE_OPENSSL
# include <openssl/des.h>
+# ifndef OPENSSL_NO_MD4
+# include <openssl/md4.h>
+# endif
# include <openssl/md5.h>
# include <openssl/ssl.h>
# include <openssl/rand.h>
@@ -74,23 +77,29 @@
#elif defined(USE_GNUTLS_NETTLE)
# include <nettle/des.h>
+# include <nettle/md4.h>
#elif defined(USE_GNUTLS)
# include <gcrypt.h>
# define MD5_DIGEST_LENGTH 16
+# define MD4_DIGEST_LENGTH 16
#elif defined(USE_NSS)
# include <nss.h>
# include <pk11pub.h>
# include <hasht.h>
+# include "curl_md4.h"
# define MD5_DIGEST_LENGTH MD5_LENGTH
#elif defined(USE_MBEDTLS)
# include <mbedtls/des.h>
-# include "curl_md4.h"
+# include <mbedtls/md4.h>
+# if !defined(MBEDTLS_MD4_C)
+# include "curl_md4.h"
+# endif
#elif defined(USE_SECTRANSP)
@@ -99,6 +108,7 @@
#elif defined(USE_OS400CRYPTO)
# include "cipher.mih" /* mih/cipher */
+# include "curl_md4.h"
#elif defined(USE_WIN32_CRYPTO)
# include <wincrypt.h>
#else
@@ -114,7 +124,6 @@
#include "warnless.h"
#include "curl_endian.h"
#include "curl_des.h"
-#include "curl_md4.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -207,6 +216,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
const unsigned char *key_56)
{
const CK_MECHANISM_TYPE mech = CKM_DES_ECB; /* DES cipher in ECB mode */
+ PK11SlotInfo *slot = NULL;
char key[8]; /* expanded 64 bit key */
SECItem key_item;
PK11SymKey *symkey = NULL;
@@ -216,7 +226,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
bool rv = FALSE;
/* use internal slot for DES encryption (requires NSS to be initialized) */
- PK11SlotInfo *slot = PK11_GetInternalKeySlot();
+ slot = PK11_GetInternalKeySlot();
if(!slot)
return FALSE;
@@ -541,7 +551,7 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
CURLcode result;
if(len > SIZE_T_MAX/2) /* avoid integer overflow */
return CURLE_OUT_OF_MEMORY;
- pw = len ? malloc(len * 2) : (unsigned char *)strdup("");
+ pw = len ? malloc(len * 2) : strdup("");
if(!pw)
return CURLE_OUT_OF_MEMORY;
@@ -555,10 +565,53 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
if(result)
return result;
- /* Create NT hashed password. */
- Curl_md4it(ntbuffer, pw, 2 * len);
+ {
+ /* Create NT hashed password. */
+#ifdef USE_OPENSSL
+ MD4_CTX MD4pw;
+ MD4_Init(&MD4pw);
+ MD4_Update(&MD4pw, pw, 2 * len);
+ MD4_Final(ntbuffer, &MD4pw);
+#elif defined(USE_GNUTLS_NETTLE)
+ struct md4_ctx MD4pw;
+ md4_init(&MD4pw);
+ md4_update(&MD4pw, (unsigned int)(2 * len), pw);
+ md4_digest(&MD4pw, MD4_DIGEST_SIZE, ntbuffer);
+#elif defined(USE_GNUTLS)
+ gcry_md_hd_t MD4pw;
+ gcry_md_open(&MD4pw, GCRY_MD_MD4, 0);
+ gcry_md_write(MD4pw, pw, 2 * len);
+ memcpy(ntbuffer, gcry_md_read(MD4pw, 0), MD4_DIGEST_LENGTH);
+ gcry_md_close(MD4pw);
+#elif defined(USE_NSS)
+ Curl_md4it(ntbuffer, pw, 2 * len);
+#elif defined(USE_MBEDTLS)
+#if defined(MBEDTLS_MD4_C)
+ mbedtls_md4(pw, 2 * len, ntbuffer);
+#else
+ Curl_md4it(ntbuffer, pw, 2 * len);
+#endif
+#elif defined(USE_SECTRANSP)
+ (void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
+#elif defined(USE_OS400CRYPTO)
+ Curl_md4it(ntbuffer, pw, 2 * len);
+#elif defined(USE_WIN32_CRYPTO)
+ HCRYPTPROV hprov;
+ if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT)) {
+ HCRYPTHASH hhash;
+ if(CryptCreateHash(hprov, CALG_MD4, 0, 0, &hhash)) {
+ DWORD length = 16;
+ CryptHashData(hhash, pw, (unsigned int)len * 2, 0);
+ CryptGetHashParam(hhash, HP_HASHVAL, ntbuffer, &length, 0);
+ CryptDestroyHash(hhash);
+ }
+ CryptReleaseContext(hprov, 0);
+ }
+#endif
- memset(ntbuffer + 16, 0, 21 - 16);
+ memset(ntbuffer + 16, 0, 21 - 16);
+ }
free(pw);
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index 3b4b8053c..07ef5deae 100644
--- a/lib/curl_ntlm_core.h
+++ b/lib/curl_ntlm_core.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,9 @@
/* Define USE_NTRESPONSES in order to make the type-3 message include
* the NT response message. */
+#if !defined(USE_OPENSSL) || !defined(OPENSSL_NO_MD4)
#define USE_NTRESPONSES
+#endif
/* Define USE_NTLM2SESSION in order to make the type-3 message include the
NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and a
diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c
index 80266e2a4..18ee75dd9 100644
--- a/lib/curl_ntlm_wb.c
+++ b/lib/curl_ntlm_wb.c
@@ -53,8 +53,6 @@
#include "url.h"
#include "strerror.h"
#include "strdup.h"
-#include "strcase.h"
-
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -76,7 +74,7 @@
# define sclose_nolog(x) close((x))
#endif
-void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
+void Curl_ntlm_wb_cleanup(struct connectdata *conn)
{
if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
sclose(conn->ntlm_auth_hlpr_socket);
@@ -335,48 +333,6 @@ done:
return CURLE_REMOTE_ACCESS_DENIED;
}
-CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
- bool proxy,
- const char *header)
-{
- curlntlm *state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
-
- if(!checkprefix("NTLM", header))
- return CURLE_BAD_CONTENT_ENCODING;
-
- header += strlen("NTLM");
- while(*header && ISSPACE(*header))
- header++;
-
- if(*header) {
- conn->challenge_header = strdup(header);
- if(!conn->challenge_header)
- return CURLE_OUT_OF_MEMORY;
-
- *state = NTLMSTATE_TYPE2; /* We got a type-2 message */
- }
- else {
- if(*state == NTLMSTATE_LAST) {
- infof(conn->data, "NTLM auth restarted\n");
- Curl_http_auth_cleanup_ntlm_wb(conn);
- }
- else if(*state == NTLMSTATE_TYPE3) {
- infof(conn->data, "NTLM handshake rejected\n");
- Curl_http_auth_cleanup_ntlm_wb(conn);
- *state = NTLMSTATE_NONE;
- return CURLE_REMOTE_ACCESS_DENIED;
- }
- else if(*state >= NTLMSTATE_TYPE1) {
- infof(conn->data, "NTLM handshake failure (internal error)\n");
- return CURLE_REMOTE_ACCESS_DENIED;
- }
-
- *state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
- }
-
- return CURLE_OK;
-}
-
/*
* This is for creating ntlm header output by delegating challenge/response
* to Samba's winbind daemon helper ntlm_auth.
@@ -389,7 +345,8 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
char **allocuserpwd;
/* point to the name and password for this */
const char *userp;
- curlntlm *state;
+ /* point to the correct struct with this */
+ struct ntlmdata *ntlm;
struct auth *authp;
CURLcode res = CURLE_OK;
@@ -401,13 +358,13 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
if(proxy) {
allocuserpwd = &conn->allocptr.proxyuserpwd;
userp = conn->http_proxy.user;
- state = &conn->proxy_ntlm_state;
+ ntlm = &conn->proxyntlm;
authp = &conn->data->state.authproxy;
}
else {
allocuserpwd = &conn->allocptr.userpwd;
userp = conn->user;
- state = &conn->http_ntlm_state;
+ ntlm = &conn->ntlm;
authp = &conn->data->state.authhost;
}
authp->done = FALSE;
@@ -416,7 +373,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
if(!userp)
userp = "";
- switch(*state) {
+ switch(ntlm->state) {
case NTLMSTATE_TYPE1:
default:
/* Use Samba's 'winbind' daemon to support NTLM authentication,
@@ -435,7 +392,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
res = ntlm_wb_init(conn, userp);
if(res)
return res;
- res = ntlm_wb_response(conn, "YR\n", *state);
+ res = ntlm_wb_response(conn, "YR\n", ntlm->state);
if(res)
return res;
@@ -449,12 +406,11 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
return CURLE_OUT_OF_MEMORY;
conn->response_header = NULL;
break;
-
case NTLMSTATE_TYPE2:
input = aprintf("TT %s\n", conn->challenge_header);
if(!input)
return CURLE_OUT_OF_MEMORY;
- res = ntlm_wb_response(conn, input, *state);
+ res = ntlm_wb_response(conn, input, ntlm->state);
free(input);
input = NULL;
if(res)
@@ -465,20 +421,17 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
proxy ? "Proxy-" : "",
conn->response_header);
DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
- *state = NTLMSTATE_TYPE3; /* we sent a type-3 */
+ ntlm->state = NTLMSTATE_TYPE3; /* we sent a type-3 */
authp->done = TRUE;
- Curl_http_auth_cleanup_ntlm_wb(conn);
+ Curl_ntlm_wb_cleanup(conn);
if(!*allocuserpwd)
return CURLE_OUT_OF_MEMORY;
break;
-
case NTLMSTATE_TYPE3:
/* connection is already authenticated,
* don't send a header in future requests */
- *state = NTLMSTATE_LAST;
- /* FALLTHROUGH */
- case NTLMSTATE_LAST:
- Curl_safefree(*allocuserpwd);
+ free(*allocuserpwd);
+ *allocuserpwd = NULL;
authp->done = TRUE;
break;
}
diff --git a/lib/curl_ntlm_wb.h b/lib/curl_ntlm_wb.h
index 3cf841cf2..aba3d469c 100644
--- a/lib/curl_ntlm_wb.h
+++ b/lib/curl_ntlm_wb.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,14 +27,11 @@
#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
defined(NTLM_WB_ENABLED)
-/* this is for ntlm header input */
-CURLcode Curl_input_ntlm_wb(struct connectdata *conn, bool proxy,
- const char *header);
-
-/* this is for creating ntlm header output */
+/* this is for creating ntlm header output by delegating challenge/response
+ to Samba's winbind daemon helper ntlm_auth */
CURLcode Curl_output_ntlm_wb(struct connectdata *conn, bool proxy);
-void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn);
+void Curl_ntlm_wb_cleanup(struct connectdata *conn);
#endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */
diff --git a/lib/curl_path.c b/lib/curl_path.c
index f42963463..ad386e743 100644
--- a/lib/curl_path.c
+++ b/lib/curl_path.c
@@ -22,7 +22,7 @@
#include "curl_setup.h"
-#if defined(USE_SSH)
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
#include <curl/curl.h>
#include "curl_memory.h"
@@ -55,7 +55,7 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
}
if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
/* It is referenced to the home directory, so strip the leading '/~/' */
- memcpy(real_path, working_path + 3, working_path_len - 2);
+ memcpy(real_path, working_path + 3, 4 + working_path_len-3);
else
memcpy(real_path, working_path, 1 + working_path_len);
}
diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
index df8f2b1d9..16b1de1ae 100644
--- a/lib/curl_rtmp.c
+++ b/lib/curl_rtmp.c
@@ -199,13 +199,13 @@ static CURLcode rtmp_setup_connection(struct connectdata *conn)
RTMP_Free(r);
return CURLE_URL_MALFORMAT;
}
- conn->proto.rtmp = r;
+ conn->proto.generic = r;
return CURLE_OK;
}
static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
{
- RTMP *r = conn->proto.rtmp;
+ RTMP *r = conn->proto.generic;
SET_RCVTIMEO(tv, 10);
r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];
@@ -240,7 +240,7 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
static CURLcode rtmp_do(struct connectdata *conn, bool *done)
{
struct Curl_easy *data = conn->data;
- RTMP *r = conn->proto.rtmp;
+ RTMP *r = conn->proto.generic;
if(!RTMP_ConnectStream(r, 0))
return CURLE_FAILED_INIT;
@@ -268,10 +268,10 @@ static CURLcode rtmp_done(struct connectdata *conn, CURLcode status,
static CURLcode rtmp_disconnect(struct connectdata *conn,
bool dead_connection)
{
- RTMP *r = conn->proto.rtmp;
+ RTMP *r = conn->proto.generic;
(void)dead_connection;
if(r) {
- conn->proto.rtmp = NULL;
+ conn->proto.generic = NULL;
RTMP_Close(r);
RTMP_Free(r);
}
@@ -281,7 +281,7 @@ static CURLcode rtmp_disconnect(struct connectdata *conn,
static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
size_t len, CURLcode *err)
{
- RTMP *r = conn->proto.rtmp;
+ RTMP *r = conn->proto.generic;
ssize_t nread;
(void)sockindex; /* unused */
@@ -302,7 +302,7 @@ static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
static ssize_t rtmp_send(struct connectdata *conn, int sockindex,
const void *buf, size_t len, CURLcode *err)
{
- RTMP *r = conn->proto.rtmp;
+ RTMP *r = conn->proto.generic;
ssize_t num;
(void)sockindex; /* unused */
diff --git a/lib/curl_sasl.c b/lib/curl_sasl.c
index 0aa1f5bb7..9e1a72e5e 100644
--- a/lib/curl_sasl.c
+++ b/lib/curl_sasl.c
@@ -31,9 +31,6 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) || \
- !defined(CURL_DISABLE_POP3)
-
#include <curl/curl.h>
#include "urldata.h"
@@ -86,14 +83,14 @@ void Curl_sasl_cleanup(struct connectdata *conn, unsigned int authused)
#if defined(USE_KERBEROS5)
/* Cleanup the gssapi structure */
if(authused == SASL_MECH_GSSAPI) {
- Curl_auth_cleanup_gssapi(&conn->krb5);
+ Curl_auth_gssapi_cleanup(&conn->krb5);
}
#endif
#if defined(USE_NTLM)
/* Cleanup the NTLM structure */
if(authused == SASL_MECH_NTLM) {
- Curl_auth_cleanup_ntlm(&conn->ntlm);
+ Curl_auth_ntlm_cleanup(&conn->ntlm);
}
#endif
@@ -293,7 +290,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
#if defined(USE_KERBEROS5)
if((enabledmechs & SASL_MECH_GSSAPI) && Curl_auth_is_gssapi_supported() &&
Curl_auth_user_contains_domain(conn->user)) {
- sasl->mutual_auth = FALSE;
+ sasl->mutual_auth = FALSE; /* TODO: Calculate mutual authentication */
mech = SASL_MECH_STRING_GSSAPI;
state1 = SASL_GSSAPI;
state2 = SASL_GSSAPI_TOKEN;
@@ -360,9 +357,10 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
sasl->authused = SASL_MECH_XOAUTH2;
if(force_ir || data->set.sasl_ir)
- result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
- &resp, &len);
+ result = Curl_auth_create_oauth_bearer_message(data, conn->user,
+ NULL, 0,
+ conn->oauth_bearer,
+ &resp, &len);
}
else if(enabledmechs & SASL_MECH_PLAIN) {
mech = SASL_MECH_STRING_PLAIN;
@@ -370,8 +368,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
sasl->authused = SASL_MECH_PLAIN;
if(force_ir || data->set.sasl_ir)
- result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
- conn->user, conn->passwd,
+ result = Curl_auth_create_plain_message(data, conn->user, conn->passwd,
&resp, &len);
}
else if(enabledmechs & SASL_MECH_LOGIN) {
@@ -454,9 +451,9 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
*progress = SASL_DONE;
return result;
case SASL_PLAIN:
- result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
- conn->user, conn->passwd,
- &resp, &len);
+ result = Curl_auth_create_plain_message(data, conn->user, conn->passwd,
+ &resp,
+ &len);
break;
case SASL_LOGIN:
result = Curl_auth_create_login_message(data, conn->user, &resp, &len);
@@ -565,9 +562,10 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
newstate = SASL_OAUTH2_RESP;
}
else
- result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
- &resp, &len);
+ result = Curl_auth_create_oauth_bearer_message(data, conn->user,
+ NULL, 0,
+ conn->oauth_bearer,
+ &resp, &len);
break;
case SASL_OAUTH2_RESP:
@@ -628,4 +626,3 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
return result;
}
-#endif /* protocols are enabled that use SASL */
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 13af8cdec..4c3a17359 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -96,10 +96,6 @@
# include "config-vxworks.h"
#endif
-#ifdef __PLAN9__
-# include "config-plan9.h"
-#endif
-
#endif /* HAVE_CONFIG_H */
/* ================================================================ */
@@ -486,6 +482,7 @@
#ifdef WIN32
# define DIR_CHAR "\\"
+# define DOT_CHAR "_"
#else /* WIN32 */
@@ -511,6 +508,14 @@
# endif
# define DIR_CHAR "/"
+# ifndef DOT_CHAR
+# define DOT_CHAR "."
+# endif
+
+# ifdef MSDOS
+# undef DOT_CHAR
+# define DOT_CHAR "_"
+# endif
# ifndef fileno /* sunos 4 have this as a macro! */
int fileno(FILE *stream);
@@ -642,8 +647,8 @@ int netware_init(void);
#define LIBIDN_REQUIRED_VERSION "0.4.1"
#if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \
- defined(USE_MBEDTLS) || \
- defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
+ defined(USE_POLARSSL) || defined(USE_MBEDTLS) || \
+ defined(USE_CYASSL) || defined(USE_SCHANNEL) || \
defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK)
#define USE_SSL /* SSL support has been enabled */
#endif
@@ -681,10 +686,6 @@ int netware_init(void);
#error "No longer supported. Set CURLOPT_CAINFO at runtime instead."
#endif
-#if defined(USE_LIBSSH2) || defined(USE_LIBSSH) || defined(USE_WOLFSSH)
-#define USE_SSH
-#endif
-
/*
* Provide a mechanism to silence picky compilers, such as gcc 4.6+.
* Parameters should of course normally not be unused, but for example when
@@ -822,8 +823,4 @@ int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf,
#define UNITTEST static
#endif
-#if defined(USE_NGTCP2) || defined(USE_QUICHE)
-#define ENABLE_QUIC
-#endif
-
#endif /* HEADER_CURL_SETUP_H */
diff --git a/lib/doh.c b/lib/doh.c
index d1795789e..b5327c4ae 100644
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -22,8 +22,6 @@
#include "curl_setup.h"
-#ifndef CURL_DISABLE_DOH
-
#include "urldata.h"
#include "curl_addrinfo.h"
#include "doh.h"
@@ -74,26 +72,17 @@ static const char *doh_strerror(DOHcode code)
#define UNITTEST static
#endif
-/* @unittest 1655
- */
UNITTEST DOHcode doh_encode(const char *host,
DNStype dnstype,
unsigned char *dnsp, /* buffer */
size_t len, /* buffer size */
size_t *olen) /* output length */
{
- const size_t hostlen = strlen(host);
+ size_t hostlen = strlen(host);
unsigned char *orig = dnsp;
const char *hostp = host;
- /* The expected output length does not depend on the number of dots within
- * the host name. It will always be two more than the length of the host
- * name, one for the size and one trailing null. In case there are dots,
- * each dot adds one size but removes the need to store the dot, net zero.
- */
- const size_t expected_len = 12 + ( 1 + hostlen + 1) + 4;
-
- if(len < expected_len)
+ if(len < (12 + hostlen + 4))
return DOH_TOO_SMALL_BUFFER;
*dnsp++ = 0; /* 16 bit id */
@@ -135,18 +124,12 @@ UNITTEST DOHcode doh_encode(const char *host,
}
} while(1);
- /* There are assigned TYPE codes beyond 255: use range [1..65535] */
- *dnsp++ = (unsigned char)(255 & (dnstype>>8)); /* upper 8 bit TYPE */
- *dnsp++ = (unsigned char)(255 & dnstype); /* lower 8 bit TYPE */
-
+ *dnsp++ = '\0'; /* upper 8 bit TYPE */
+ *dnsp++ = (unsigned char)dnstype;
*dnsp++ = '\0'; /* upper 8 bit CLASS */
*dnsp++ = DNS_CLASS_IN; /* IN - "the Internet" */
*olen = dnsp - orig;
-
- /* verify that our assumption of length is valid, since
- * this has lead to buffer overflows in this function */
- DEBUGASSERT(*olen == expected_len);
return DOH_OK;
}
@@ -240,10 +223,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
}
timeout_ms = Curl_timeleft(data, NULL, TRUE);
- if(timeout_ms <= 0) {
- result = CURLE_OPERATION_TIMEDOUT;
- goto error;
- }
+
/* Curl_open() is the internal version of curl_easy_init() */
result = Curl_open(&doh);
if(!result) {
@@ -264,9 +244,6 @@ static CURLcode dohprobe(struct Curl_easy *data,
#ifndef CURLDEBUG
/* enforce HTTPS if not debug */
ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
-#else
- /* in debug mode, also allow http */
- ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS);
#endif
ERROR_CHECK_SETOPT(CURLOPT_TIMEOUT_MS, (long)timeout_ms);
if(data->set.verbose)
@@ -346,7 +323,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
error:
free(nurl);
- Curl_close(&doh);
+ Curl_close(doh);
return result;
}
@@ -402,8 +379,10 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
error:
curl_slist_free_all(data->req.doh.headers);
data->req.doh.headers = NULL;
- Curl_close(&data->req.doh.probe[0].easy);
- Curl_close(&data->req.doh.probe[1].easy);
+ curl_easy_cleanup(data->req.doh.probe[0].easy);
+ data->req.doh.probe[0].easy = NULL;
+ curl_easy_cleanup(data->req.doh.probe[1].easy);
+ data->req.doh.probe[1].easy = NULL;
return NULL;
}
@@ -438,14 +417,8 @@ static unsigned short get16bit(unsigned char *doh, int index)
static unsigned int get32bit(unsigned char *doh, int index)
{
- /* make clang and gcc optimize this to bswap by incrementing
- the pointer first. */
- doh += index;
-
- /* avoid undefined behaviour by casting to unsigned before shifting
- 24 bits, possibly into the sign bit. codegen is same, but
- ub sanitizer won't be upset */
- return ( (unsigned)doh[0] << 24) | (doh[1] << 16) |(doh[2] << 8) | doh[3];
+ return (doh[index] << 24) | (doh[index + 1] << 16) |
+ (doh[index + 2] << 8) | doh[index + 3];
}
static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
@@ -609,6 +582,7 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
unsigned short qdcount;
unsigned short ancount;
unsigned short type = 0;
+ unsigned short class;
unsigned short rdlength;
unsigned short nscount;
unsigned short arcount;
@@ -636,7 +610,6 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
ancount = get16bit(doh, 6);
while(ancount) {
- unsigned short class;
unsigned int ttl;
rc = skipqname(doh, dohlen, &index);
@@ -921,18 +894,21 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
DOHcode rc;
DOHcode rc2;
struct dohentry de;
+ struct Curl_dns_entry *dns;
+ struct Curl_addrinfo *ai;
/* remove DOH handles from multi handle and close them */
curl_multi_remove_handle(data->multi, data->req.doh.probe[0].easy);
- Curl_close(&data->req.doh.probe[0].easy);
+ Curl_close(data->req.doh.probe[0].easy);
curl_multi_remove_handle(data->multi, data->req.doh.probe[1].easy);
- Curl_close(&data->req.doh.probe[1].easy);
+ Curl_close(data->req.doh.probe[1].easy);
+
/* parse the responses, create the struct and return it! */
init_dohentry(&de);
rc = doh_decode(data->req.doh.probe[0].serverdoh.memory,
data->req.doh.probe[0].serverdoh.size,
data->req.doh.probe[0].dnstype,
&de);
- Curl_safefree(data->req.doh.probe[0].serverdoh.memory);
+ free(data->req.doh.probe[0].serverdoh.memory);
if(rc) {
infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc),
type2name(data->req.doh.probe[0].dnstype),
@@ -942,16 +918,13 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
data->req.doh.probe[1].serverdoh.size,
data->req.doh.probe[1].dnstype,
&de);
- Curl_safefree(data->req.doh.probe[1].serverdoh.memory);
+ free(data->req.doh.probe[1].serverdoh.memory);
if(rc2) {
infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc2),
type2name(data->req.doh.probe[1].dnstype),
data->req.doh.host);
}
if(!rc || !rc2) {
- struct Curl_dns_entry *dns;
- struct Curl_addrinfo *ai;
-
infof(data, "DOH Host name: %s\n", data->req.doh.host);
showdoh(data, &de);
@@ -987,5 +960,3 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
return CURLE_OK;
}
-
-#endif /* CURL_DISABLE_DOH */
diff --git a/lib/doh.h b/lib/doh.h
index f522d3308..83c79bc5d 100644
--- a/lib/doh.h
+++ b/lib/doh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,8 +25,6 @@
#include "urldata.h"
#include "curl_addrinfo.h"
-#ifndef CURL_DISABLE_DOH
-
/*
* Curl_doh() resolve a name using DoH (DNS-over-HTTPS). It resolves a name
* and returns a 'Curl_addrinfo *' with the address information.
@@ -40,7 +38,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct Curl_dns_entry **dns);
-int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks);
+int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
typedef enum {
DOH_OK,
@@ -103,10 +102,4 @@ DOHcode doh_decode(unsigned char *doh,
struct dohentry *d);
void de_cleanup(struct dohentry *d);
#endif
-
-#else /* if DOH is disabled */
-#define Curl_doh(a,b,c,d) NULL
-#define Curl_doh_is_resolved(x,y) CURLE_COULDNT_RESOLVE_HOST
-#endif
-
#endif /* HEADER_CURL_DOH_H */
diff --git a/lib/easy.c b/lib/easy.c
index 001648d49..ae6176f25 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -187,8 +187,16 @@ static CURLcode global_init(long flags, bool memoryfuncs)
(void)Curl_ipv6works();
-#if defined(USE_SSH)
- if(Curl_ssh_init()) {
+#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_INIT)
+ if(libssh2_init(0)) {
+ DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+#endif
+
+#if defined(USE_LIBSSH)
+ if(ssh_init()) {
+ DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
return CURLE_FAILED_INIT;
}
#endif
@@ -257,6 +265,7 @@ void curl_global_cleanup(void)
if(--initialized)
return;
+ Curl_global_host_cache_dtor();
Curl_ssl_cleanup();
Curl_resolver_global_cleanup();
@@ -266,7 +275,13 @@ void curl_global_cleanup(void)
Curl_amiga_cleanup();
- Curl_ssh_cleanup();
+#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_EXIT)
+ (void)libssh2_exit();
+#endif
+
+#if defined(USE_LIBSSH)
+ (void)ssh_finalize();
+#endif
init_flags = 0;
}
@@ -413,8 +428,8 @@ static int events_socket(struct Curl_easy *easy, /* easy handle */
mask. Convert from libcurl bitmask to the poll one. */
m->socket.events = socketcb2poll(what);
infof(easy, "socket cb: socket %d UPDATED as %s%s\n", s,
- (what&CURL_POLL_IN)?"IN":"",
- (what&CURL_POLL_OUT)?"OUT":"");
+ what&CURL_POLL_IN?"IN":"",
+ what&CURL_POLL_OUT?"OUT":"");
}
break;
}
@@ -437,8 +452,8 @@ static int events_socket(struct Curl_easy *easy, /* easy handle */
m->socket.revents = 0;
ev->list = m;
infof(easy, "socket cb: socket %d ADDED as %s%s\n", s,
- (what&CURL_POLL_IN)?"IN":"",
- (what&CURL_POLL_OUT)?"OUT":"");
+ what&CURL_POLL_IN?"IN":"",
+ what&CURL_POLL_OUT?"OUT":"");
}
else
return CURLE_OUT_OF_MEMORY;
@@ -545,7 +560,7 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
return CURLE_RECV_ERROR;
if(mcode)
- return CURLE_URL_MALFORMAT;
+ return CURLE_URL_MALFORMAT; /* TODO: return a proper error! */
/* we don't really care about the "msgs_in_queue" value returned in the
second argument */
@@ -588,11 +603,27 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
while(!done && !mcode) {
int still_running = 0;
+ bool gotsocket = FALSE;
+
+ mcode = Curl_multi_wait(multi, NULL, 0, 1000, NULL, &gotsocket);
+
+ if(!mcode) {
+ if(!gotsocket) {
+ long sleep_ms;
+
+ /* If it returns without any filedescriptor instantly, we need to
+ avoid busy-looping during periods where it has nothing particular
+ to wait for */
+ curl_multi_timeout(multi, &sleep_ms);
+ if(sleep_ms) {
+ if(sleep_ms > 1000)
+ sleep_ms = 1000;
+ Curl_wait_ms((int)sleep_ms);
+ }
+ }
- mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
-
- if(!mcode)
mcode = curl_multi_perform(multi, &still_running);
+ }
/* only read 'still_running' if curl_multi_perform() return OK */
if(!mcode && !still_running) {
@@ -731,7 +762,7 @@ void curl_easy_cleanup(struct Curl_easy *data)
return;
sigpipe_ignore(data, &pipe_st);
- Curl_close(&data);
+ Curl_close(data);
sigpipe_restore(&pipe_st);
}
@@ -912,8 +943,6 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
*/
void curl_easy_reset(struct Curl_easy *data)
{
- long old_buffer_size = data->set.buffer_size;
-
Curl_free_request_state(data);
/* zero out UserDefined data: */
@@ -933,22 +962,7 @@ void curl_easy_reset(struct Curl_easy *data)
/* zero out authentication data: */
memset(&data->state.authhost, 0, sizeof(struct auth));
memset(&data->state.authproxy, 0, sizeof(struct auth));
-
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
- Curl_http_auth_cleanup_digest(data);
-#endif
-
- /* resize receive buffer */
- if(old_buffer_size != data->set.buffer_size) {
- char *newbuff = realloc(data->state.buffer, data->set.buffer_size + 1);
- if(!newbuff) {
- DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
- /* nothing we can do here except use the old size */
- data->set.buffer_size = old_buffer_size;
- }
- else
- data->state.buffer = newbuff;
- }
+ Curl_digest_cleanup(data);
}
/*
@@ -1020,12 +1034,10 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
/* if there's no error and we're not pausing both directions, we want
to have this handle checked soon */
- if((newstate & (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
- (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
+ if(!result &&
+ ((newstate&(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
+ (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
- if(data->multi)
- Curl_update_timer(data->multi);
- }
/* This transfer may have been moved in or out of the bundle, update
the corresponding socket callback, if used */
@@ -1124,35 +1136,6 @@ CURLcode curl_easy_send(struct Curl_easy *data, const void *buffer,
}
/*
- * Wrapper to call functions in Curl_conncache_foreach()
- *
- * Returns always 0.
- */
-static int conn_upkeep(struct connectdata *conn,
- void *param)
-{
- /* Param is unused. */
- (void)param;
-
- if(conn->handler->connection_check) {
- /* Do a protocol-specific keepalive check on the connection. */
- conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
- }
-
- return 0; /* continue iteration */
-}
-
-static CURLcode upkeep(struct conncache *conn_cache, void *data)
-{
- /* Loop over every connection and make connection alive. */
- Curl_conncache_foreach(data,
- conn_cache,
- data,
- conn_upkeep);
- return CURLE_OK;
-}
-
-/*
* Performs connection upkeep for the given session handle.
*/
CURLcode curl_easy_upkeep(struct Curl_easy *data)
@@ -1163,7 +1146,7 @@ CURLcode curl_easy_upkeep(struct Curl_easy *data)
if(data->multi_easy) {
/* Use the common function to keep connections alive. */
- return upkeep(&data->multi_easy->conn_cache, data);
+ return Curl_upkeep(&data->multi_easy->conn_cache, data);
}
else {
/* No connections, so just return success */
diff --git a/lib/fileinfo.c b/lib/fileinfo.c
index 2630c9e46..4e72e1eba 100644
--- a/lib/fileinfo.c
+++ b/lib/fileinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
***************************************************************************/
#include "curl_setup.h"
-#ifndef CURL_DISABLE_FTP
+
#include "strdup.h"
#include "fileinfo.h"
#include "curl_memory.h"
@@ -41,4 +41,3 @@ void Curl_fileinfo_cleanup(struct fileinfo *finfo)
Curl_safefree(finfo->info.b_data);
free(finfo);
}
-#endif
diff --git a/lib/formdata.c b/lib/formdata.c
index 429d479da..202d930c7 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,14 +24,14 @@
#include <curl/curl.h>
-#include "formdata.h"
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)
+#ifndef CURL_DISABLE_HTTP
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
#include <libgen.h>
#endif
#include "urldata.h" /* for struct Curl_easy */
+#include "formdata.h"
#include "mime.h"
#include "non-ascii.h"
#include "vtls/vtls.h"
@@ -569,7 +569,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
if(((form->flags & HTTPPOST_FILENAME) ||
(form->flags & HTTPPOST_BUFFER)) &&
!form->contenttype) {
- char *f = (form->flags & HTTPPOST_BUFFER)?
+ char *f = form->flags & HTTPPOST_BUFFER?
form->showfilename : form->value;
char const *type;
type = Curl_mime_contenttype(f);
@@ -921,8 +921,7 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
return result;
}
-#else
-/* if disabled */
+#else /* CURL_DISABLE_HTTP */
CURLFORMcode curl_formadd(struct curl_httppost **httppost,
struct curl_httppost **last_post,
...)
@@ -947,4 +946,5 @@ void curl_formfree(struct curl_httppost *form)
/* does nothing HTTP is disabled */
}
-#endif /* if disabled */
+
+#endif /* !defined(CURL_DISABLE_HTTP) */
diff --git a/lib/formdata.h b/lib/formdata.h
index cb20805f5..1246c2bc8 100644
--- a/lib/formdata.h
+++ b/lib/formdata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,10 +22,6 @@
*
***************************************************************************/
-#include "curl_setup.h"
-
-#ifndef CURL_DISABLE_MIME
-
/* used by FormAdd for temporary storage */
typedef struct FormInfo {
char *name;
@@ -51,10 +47,5 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
curl_mimepart *,
struct curl_httppost *post,
curl_read_callback fread_func);
-#else
-/* disabled */
-#define Curl_getformdata(a,b,c,d) CURLE_NOT_BUILT_IN
-#endif
-
#endif /* HEADER_CURL_FORMDATA_H */
diff --git a/lib/ftp.c b/lib/ftp.c
index 8072a33d5..825aaaa1d 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -132,8 +132,10 @@ static CURLcode ftp_connect(struct connectdata *conn, bool *done);
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection);
static CURLcode ftp_do_more(struct connectdata *conn, int *completed);
static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done);
-static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks);
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode ftp_doing(struct connectdata *conn,
bool *dophase_done);
static CURLcode ftp_setup_connection(struct connectdata * conn);
@@ -380,7 +382,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
int result;
- timediff_t timeout_ms;
+ time_t timeout_ms;
ssize_t nread;
int ftpcode;
@@ -491,7 +493,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
{
struct Curl_easy *data = conn->data;
- timediff_t timeout_ms;
+ time_t timeout_ms;
CURLcode result = CURLE_OK;
*connected = FALSE;
@@ -523,7 +525,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
}
else {
/* Add timeout to multi handle and break out of the loop */
- if(*connected == FALSE) {
+ if(!result && *connected == FALSE) {
Curl_expire(data, data->set.accepttimeout > 0 ?
data->set.accepttimeout: DEFAULT_ACCEPT_TIMEOUT, 0);
}
@@ -563,11 +565,14 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
#ifdef HAVE_GSSAPI
char * const buf = data->state.buffer;
#endif
+ CURLcode result = CURLE_OK;
int code;
- CURLcode result = Curl_pp_readresp(sockfd, pp, &code, size);
+
+ result = Curl_pp_readresp(sockfd, pp, &code, size);
#if defined(HAVE_GSSAPI)
/* handle the security-oriented responses 6xx ***/
+ /* FIXME: some errorchecking perhaps... ***/
switch(code) {
case 631:
code = Curl_sec_read_msg(conn, buf, PROT_SAFE);
@@ -808,16 +813,21 @@ static CURLcode ftp_state_pwd(struct connectdata *conn)
/* For the FTP "protocol connect" and "doing" phases only */
static int ftp_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
- return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
+ return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}
/* For the FTP "DO_MORE" phase only */
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
struct ftp_conn *ftpc = &conn->proto.ftpc;
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
/* When in DO_MORE state, we could be either waiting for us to connect to a
* remote site, or we could wait for that site to connect to us. Or just
* handle ordinary commands.
@@ -849,7 +859,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
return bits;
}
- return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
+ return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}
/* This is called after the FTP_QUOTE state is passed.
@@ -867,10 +877,6 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
/* already done and fine */
result = ftp_state_mdtm(conn);
else {
- /* FTPFILE_NOCWD with full path: expect ftpc->cwddone! */
- DEBUGASSERT((conn->data->set.ftp_filemethod != FTPFILE_NOCWD) ||
- !(ftpc->dirdepth && ftpc->dirs[0][0] == '/'));
-
ftpc->count2 = 0; /* count2 counts failed CWDs */
/* count3 is set to allow a MKD to fail once. In the case when first CWD
@@ -878,9 +884,10 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
dir) this then allows for a second try to CWD to it */
ftpc->count3 = (conn->data->set.ftp_create_missing_dirs == 2)?1:0;
- if(conn->bits.reuse && ftpc->entrypath &&
- /* no need to go to entrypath when we have an absolute path */
- !(ftpc->dirdepth && ftpc->dirs[0][0] == '/')) {
+ if((conn->data->set.ftp_filemethod == FTPFILE_NOCWD) && !ftpc->cwdcount)
+ /* No CWD necessary */
+ result = ftp_state_mdtm(conn);
+ else if(conn->bits.reuse && ftpc->entrypath) {
/* This is a re-used connection. Since we change directory to where the
transfer is taking place, we must first get back to the original dir
where we ended up after login: */
@@ -1073,7 +1080,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
}
/* resolv ip/host to ip */
- rc = Curl_resolv(conn, host, 0, FALSE, &h);
+ rc = Curl_resolv(conn, host, 0, &h);
if(rc == CURLRESOLV_PENDING)
(void)Curl_resolver_wait_resolv(conn, &h);
if(h) {
@@ -1439,37 +1446,31 @@ static CURLcode ftp_state_list(struct connectdata *conn)
servers either... */
/*
- if FTPFILE_NOCWD was specified, we should add the path
+ if FTPFILE_NOCWD was specified, we are currently in
+ the user's home directory, so we should add the path
as argument for the LIST / NLST / or custom command.
Whether the server will support this, is uncertain.
The other ftp_filemethods will CWD into dir/dir/ first and
then just do LIST (in that case: nothing to do here)
*/
- char *lstArg = NULL;
- char *cmd;
-
- if((data->set.ftp_filemethod == FTPFILE_NOCWD) && ftp->path) {
- /* url-decode before evaluation: e.g. paths starting/ending with %2f */
- const char *slashPos = NULL;
- char *rawPath = NULL;
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, TRUE);
+ char *cmd, *lstArg, *slashPos;
+ const char *inpath = ftp->path;
+
+ lstArg = NULL;
+ if((data->set.ftp_filemethod == FTPFILE_NOCWD) &&
+ inpath && inpath[0] && strchr(inpath, '/')) {
+ size_t n = strlen(inpath);
+
+ /* Check if path does not end with /, as then we cut off the file part */
+ if(inpath[n - 1] != '/') {
+ /* chop off the file part if format is dir/dir/file */
+ slashPos = strrchr(inpath, '/');
+ n = slashPos - inpath;
+ }
+ result = Curl_urldecode(data, inpath, n, &lstArg, NULL, TRUE);
if(result)
return result;
-
- slashPos = strrchr(rawPath, '/');
- if(slashPos) {
- /* chop off the file part if format is dir/file otherwise remove
- the trailing slash for dir/dir/ except for absolute path / */
- size_t n = slashPos - rawPath;
- if(n == 0)
- ++n;
-
- lstArg = rawPath;
- lstArg[n] = '\0';
- }
- else
- free(rawPath);
}
cmd = aprintf("%s%s%s",
@@ -1478,12 +1479,15 @@ static CURLcode ftp_state_list(struct connectdata *conn)
(data->set.ftp_list_only?"NLST":"LIST"),
lstArg? " ": "",
lstArg? lstArg: "");
- free(lstArg);
- if(!cmd)
+ if(!cmd) {
+ free(lstArg);
return CURLE_OUT_OF_MEMORY;
+ }
result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd);
+
+ free(lstArg);
free(cmd);
if(result)
@@ -1496,14 +1500,24 @@ static CURLcode ftp_state_list(struct connectdata *conn)
static CURLcode ftp_state_retr_prequote(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* We've sent the TYPE, now we must send the list of prequote strings */
- return ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
+
+ result = ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
+
+ return result;
}
static CURLcode ftp_state_stor_prequote(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* We've sent the TYPE, now we must send the list of prequote strings */
- return ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
+
+ result = ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
+
+ return result;
}
static CURLcode ftp_state_type(struct connectdata *conn)
@@ -1920,7 +1934,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
*/
const char * const host_name = conn->bits.socksproxy ?
conn->socks_proxy.host.name : conn->http_proxy.host.name;
- rc = Curl_resolv(conn, host_name, (int)conn->port, FALSE, &addr);
+ rc = Curl_resolv(conn, host_name, (int)conn->port, &addr);
if(rc == CURLRESOLV_PENDING)
/* BLOCKING, ignores the return code but 'addr' will be NULL in
case of failure */
@@ -1936,7 +1950,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
}
else {
/* normal, direct, ftp connection */
- rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, FALSE, &addr);
+ rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, &addr);
if(rc == CURLRESOLV_PENDING)
/* BLOCKING */
(void)Curl_resolver_wait_resolv(conn, &addr);
@@ -2248,25 +2262,9 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
char *buf = data->state.buffer;
/* get the size from the ascii string: */
- if(ftpcode == 213) {
- /* To allow servers to prepend "rubbish" in the response string, we scan
- for all the digits at the end of the response and parse only those as a
- number. */
- char *start = &buf[4];
- char *fdigit = strchr(start, '\r');
- if(fdigit) {
- do
- fdigit--;
- while(ISDIGIT(*fdigit) && (fdigit > start));
- if(!ISDIGIT(*fdigit))
- fdigit++;
- }
- else
- fdigit = start;
+ if(ftpcode == 213)
/* ignores parsing errors, which will make the size remain unknown */
- (void)curlx_strtoofft(fdigit, NULL, 0, &filesize);
-
- }
+ (void)curlx_strtoofft(buf + 4, NULL, 0, &filesize);
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -3137,8 +3135,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
ssize_t nread;
int ftpcode;
CURLcode result = CURLE_OK;
- char *rawPath = NULL;
- size_t pathLen = 0;
+ char *path = NULL;
if(!ftp)
return CURLE_OK;
@@ -3176,6 +3173,9 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
break;
}
+ /* now store a copy of the directory we are in */
+ free(ftpc->prevpath);
+
if(data->state.wildcardmatch) {
if(data->set.chunk_end && ftpc->file) {
Curl_set_in_callback(data, true);
@@ -3186,41 +3186,41 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
}
if(!result)
- /* get the url-decoded "raw" path */
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
+ /* get the "raw" path */
+ result = Curl_urldecode(data, ftp->path, 0, &path, NULL, TRUE);
if(result) {
/* We can limp along anyway (and should try to since we may already be in
* the error path) */
ftpc->ctl_valid = FALSE; /* mark control connection as bad */
connclose(conn, "FTP: out of memory!"); /* mark for connection closure */
- free(ftpc->prevpath);
ftpc->prevpath = NULL; /* no path remembering */
}
- else { /* remember working directory for connection reuse */
- if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
- free(rawPath); /* full path => no CWDs happened => keep ftpc->prevpath */
- else {
- free(ftpc->prevpath);
-
- if(!ftpc->cwdfail) {
- if(data->set.ftp_filemethod == FTPFILE_NOCWD)
- pathLen = 0; /* relative path => working directory is FTP home */
- else
- pathLen -= ftpc->file?strlen(ftpc->file):0; /* file is url-decoded */
-
- rawPath[pathLen] = '\0';
- ftpc->prevpath = rawPath;
+ else {
+ size_t flen = ftpc->file?strlen(ftpc->file):0; /* file is "raw" already */
+ size_t dlen = strlen(path)-flen;
+ if(!ftpc->cwdfail) {
+ ftpc->prevmethod = data->set.ftp_filemethod;
+ if(dlen && (data->set.ftp_filemethod != FTPFILE_NOCWD)) {
+ ftpc->prevpath = path;
+ if(flen)
+ /* if 'path' is not the whole string */
+ ftpc->prevpath[dlen] = 0; /* terminate */
}
else {
- free(rawPath);
- ftpc->prevpath = NULL; /* no path */
+ free(path);
+ /* we never changed dir */
+ ftpc->prevpath = strdup("");
+ if(!ftpc->prevpath)
+ return CURLE_OUT_OF_MEMORY;
}
+ if(ftpc->prevpath)
+ infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
+ }
+ else {
+ ftpc->prevpath = NULL; /* no path */
+ free(path);
}
-
- if(ftpc->prevpath)
- infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
}
-
/* free the dir tree and file parts */
freedirs(ftpc);
@@ -3490,7 +3490,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
if(!conn->bits.tcpconnect[SECONDARYSOCKET]) {
if(Curl_connect_ongoing(conn)) {
/* As we're in TUNNEL_CONNECT state now, we know the proxy name and port
- aren't used so we blank their arguments. */
+ aren't used so we blank their arguments. TODO: make this nicer */
result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, NULL, 0);
return result;
@@ -3533,13 +3533,14 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
/* if we got an error or if we don't wait for a data connection return
immediately */
- if(result || !ftpc->wait_data_conn)
+ if(result || (ftpc->wait_data_conn != TRUE))
return result;
- /* if we reach the end of the FTP state machine here, *complete will be
- TRUE but so is ftpc->wait_data_conn, which says we need to wait for the
- data connection and therefore we're not actually complete */
- *completep = 0;
+ if(ftpc->wait_data_conn)
+ /* if we reach the end of the FTP state machine here, *complete will be
+ TRUE but so is ftpc->wait_data_conn, which says we need to wait for
+ the data connection and therefore we're not actually complete */
+ *completep = 0;
}
if(ftp->transfer <= FTPTRANSFER_INFO) {
@@ -3573,8 +3574,13 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
return result;
result = ftp_multi_statemach(conn, &complete);
- /* ftpc->wait_data_conn is always false here */
- *completep = (int)complete;
+ if(ftpc->wait_data_conn)
+ /* if we reach the end of the FTP state machine here, *complete will be
+ TRUE but so is ftpc->wait_data_conn, which says we need to wait for
+ the data connection and therefore we're not actually complete */
+ *completep = 0;
+ else
+ *completep = (int)complete;
}
else {
/* download */
@@ -3614,8 +3620,10 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
return result;
}
- /* no data to transfer */
- Curl_setup_transfer(data, -1, -1, FALSE, -1);
+ if(!result && (ftp->transfer != FTPTRANSFER_BODY))
+ /* no data to transfer. FIX: it feels like a kludge to have this here
+ too! */
+ Curl_setup_transfer(data, -1, -1, FALSE, -1);
if(!ftpc->wait_data_conn) {
/* no waiting for the data connection so this is now complete */
@@ -4092,142 +4100,186 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
/* the ftp struct is already inited in ftp_connect() */
struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
- const char *slashPos = NULL;
- const char *fileName = NULL;
- CURLcode result = CURLE_OK;
- char *rawPath = NULL; /* url-decoded "raw" path */
- size_t pathLen = 0;
+ const char *slash_pos; /* position of the first '/' char in curpos */
+ const char *path_to_use = ftp->path;
+ const char *cur_pos;
+ const char *filename = NULL;
+
+ cur_pos = path_to_use; /* current position in path. point at the begin of
+ next path component */
ftpc->ctl_valid = FALSE;
ftpc->cwdfail = FALSE;
- /* url-decode ftp path before further evaluation */
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
- if(result)
- return result;
-
switch(data->set.ftp_filemethod) {
- case FTPFILE_NOCWD: /* fastest, but less standard-compliant */
+ case FTPFILE_NOCWD:
+ /* fastest, but less standard-compliant */
- if((pathLen > 0) && (rawPath[pathLen - 1] != '/'))
- fileName = rawPath; /* this is a full file path */
- /*
- else: ftpc->file is not used anywhere other than for operations on
- a file. In other words, never for directory operations.
- So we can safely leave filename as NULL here and use it as a
- argument in dir/file decisions.
- */
- break;
-
- case FTPFILE_SINGLECWD:
- slashPos = strrchr(rawPath, '/');
- if(slashPos) {
- /* get path before last slash, except for / */
- size_t dirlen = slashPos - rawPath;
- if(dirlen == 0)
- dirlen++;
-
- ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
- if(!ftpc->dirs) {
- free(rawPath);
- return CURLE_OUT_OF_MEMORY;
- }
-
- ftpc->dirs[0] = calloc(1, dirlen + 1);
- if(!ftpc->dirs[0]) {
- free(rawPath);
- return CURLE_OUT_OF_MEMORY;
- }
+ /*
+ The best time to check whether the path is a file or directory is right
+ here. so:
- strncpy(ftpc->dirs[0], rawPath, dirlen);
- ftpc->dirdepth = 1; /* we consider it to be a single dir */
- fileName = slashPos + 1; /* rest is file name */
+ the first condition in the if() right here, is there just in case
+ someone decides to set path to NULL one day
+ */
+ if(path_to_use[0] &&
+ (path_to_use[strlen(path_to_use) - 1] != '/') )
+ filename = path_to_use; /* this is a full file path */
+ /*
+ else {
+ ftpc->file is not used anywhere other than for operations on a file.
+ In other words, never for directory operations.
+ So we can safely leave filename as NULL here and use it as a
+ argument in dir/file decisions.
}
- else
- fileName = rawPath; /* file name only (or empty) */
+ */
+ break;
+
+ case FTPFILE_SINGLECWD:
+ /* get the last slash */
+ if(!path_to_use[0]) {
+ /* no dir, no file */
+ ftpc->dirdepth = 0;
break;
+ }
+ slash_pos = strrchr(cur_pos, '/');
+ if(slash_pos || !*cur_pos) {
+ size_t dirlen = slash_pos-cur_pos;
+ CURLcode result;
- default: /* allow pretty much anything */
- case FTPFILE_MULTICWD: {
- /* current position: begin of next path component */
- const char *curPos = rawPath;
-
- int dirAlloc = 0; /* number of entries allocated for the 'dirs' array */
- const char *str = rawPath;
- for(; *str != 0; ++str)
- if (*str == '/')
- ++dirAlloc;
-
- if(dirAlloc > 0) {
- ftpc->dirs = calloc(dirAlloc, sizeof(ftpc->dirs[0]));
- if(!ftpc->dirs) {
- free(rawPath);
- return CURLE_OUT_OF_MEMORY;
- }
+ ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
+ if(!ftpc->dirs)
+ return CURLE_OUT_OF_MEMORY;
- /* parse the URL path into separate path components */
- while((slashPos = strchr(curPos, '/')) != NULL) {
- size_t compLen = slashPos - curPos;
+ if(!dirlen)
+ dirlen++;
+
+ result = Curl_urldecode(conn->data, slash_pos ? cur_pos : "/",
+ slash_pos ? dirlen : 1,
+ &ftpc->dirs[0], NULL,
+ TRUE);
+ if(result) {
+ freedirs(ftpc);
+ return result;
+ }
+ ftpc->dirdepth = 1; /* we consider it to be a single dir */
+ filename = slash_pos ? slash_pos + 1 : cur_pos; /* rest is file name */
+ }
+ else
+ filename = cur_pos; /* this is a file name only */
+ break;
- /* path starts with a slash: add that as a directory */
- if((compLen == 0) && (ftpc->dirdepth == 0))
- ++compLen;
+ default: /* allow pretty much anything */
+ case FTPFILE_MULTICWD:
+ ftpc->dirdepth = 0;
+ ftpc->diralloc = 5; /* default dir depth to allocate */
+ ftpc->dirs = calloc(ftpc->diralloc, sizeof(ftpc->dirs[0]));
+ if(!ftpc->dirs)
+ return CURLE_OUT_OF_MEMORY;
+ /* we have a special case for listing the root dir only */
+ if(!strcmp(path_to_use, "/")) {
+ cur_pos++; /* make it point to the zero byte */
+ ftpc->dirs[0] = strdup("/");
+ ftpc->dirdepth++;
+ }
+ else {
+ /* parse the URL path into separate path components */
+ while((slash_pos = strchr(cur_pos, '/')) != NULL) {
+ /* 1 or 0 pointer offset to indicate absolute directory */
+ ssize_t absolute_dir = ((cur_pos - ftp->path > 0) &&
+ (ftpc->dirdepth == 0))?1:0;
+
+ /* seek out the next path component */
+ if(slash_pos-cur_pos) {
/* we skip empty path components, like "x//y" since the FTP command
CWD requires a parameter and a non-existent parameter a) doesn't
work on many servers and b) has no effect on the others. */
- if(compLen > 0) {
- char *comp = calloc(1, compLen + 1);
- if(!comp) {
- free(rawPath);
+ size_t len = slash_pos - cur_pos + absolute_dir;
+ CURLcode result =
+ Curl_urldecode(conn->data, cur_pos - absolute_dir, len,
+ &ftpc->dirs[ftpc->dirdepth], NULL,
+ TRUE);
+ if(result) {
+ freedirs(ftpc);
+ return result;
+ }
+ }
+ else {
+ cur_pos = slash_pos + 1; /* jump to the rest of the string */
+ if(!ftpc->dirdepth) {
+ /* path starts with a slash, add that as a directory */
+ ftpc->dirs[ftpc->dirdepth] = strdup("/");
+ if(!ftpc->dirs[ftpc->dirdepth++]) { /* run out of memory ... */
+ failf(data, "no memory");
+ freedirs(ftpc);
return CURLE_OUT_OF_MEMORY;
}
- strncpy(comp, curPos, compLen);
- ftpc->dirs[ftpc->dirdepth++] = comp;
}
- curPos = slashPos + 1;
+ continue;
+ }
+
+ cur_pos = slash_pos + 1; /* jump to the rest of the string */
+ if(++ftpc->dirdepth >= ftpc->diralloc) {
+ /* enlarge array */
+ char **bigger;
+ ftpc->diralloc *= 2; /* double the size each time */
+ bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
+ if(!bigger) {
+ freedirs(ftpc);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ ftpc->dirs = bigger;
}
}
- DEBUGASSERT(ftpc->dirdepth <= dirAlloc);
- fileName = curPos; /* the rest is the file name (or empty) */
}
+ filename = cur_pos; /* the rest is the file name */
break;
} /* switch */
- if(fileName && *fileName)
- ftpc->file = strdup(fileName);
+ if(filename && *filename) {
+ CURLcode result =
+ Curl_urldecode(conn->data, filename, 0, &ftpc->file, NULL, TRUE);
+
+ if(result) {
+ freedirs(ftpc);
+ return result;
+ }
+ }
else
- ftpc->file = NULL; /* instead of point to a zero byte,
- we make it a NULL pointer */
+ ftpc->file = NULL; /* instead of point to a zero byte, we make it a NULL
+ pointer */
if(data->set.upload && !ftpc->file && (ftp->transfer == FTPTRANSFER_BODY)) {
/* We need a file name when uploading. Return error! */
failf(data, "Uploading to a URL without a file name!");
- free(rawPath);
return CURLE_URL_MALFORMAT;
}
ftpc->cwddone = FALSE; /* default to not done */
- if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
- ftpc->cwddone = TRUE; /* skip CWD for absolute paths */
- else { /* newly created FTP connections are already in entry path */
- const char *oldPath = conn->bits.reuse ? ftpc->prevpath : "";
- if(oldPath) {
- size_t n = pathLen;
- if(data->set.ftp_filemethod == FTPFILE_NOCWD)
- n = 0; /* CWD to entry for relative paths */
- else
- n -= ftpc->file?strlen(ftpc->file):0;
+ if(ftpc->prevpath) {
+ /* prevpath is "raw" so we convert the input path before we compare the
+ strings */
+ size_t dlen;
+ char *path;
+ CURLcode result =
+ Curl_urldecode(conn->data, ftp->path, 0, &path, &dlen, TRUE);
+ if(result) {
+ freedirs(ftpc);
+ return result;
+ }
- if((strlen(oldPath) == n) && !strncmp(rawPath, oldPath, n)) {
- infof(data, "Request has same path as previous transfer\n");
- ftpc->cwddone = TRUE;
- }
+ dlen -= ftpc->file?strlen(ftpc->file):0;
+ if((dlen == strlen(ftpc->prevpath)) &&
+ !strncmp(path, ftpc->prevpath, dlen) &&
+ (ftpc->prevmethod == data->set.ftp_filemethod)) {
+ infof(data, "Request has same path as previous transfer\n");
+ ftpc->cwddone = TRUE;
}
+ free(path);
}
- free(rawPath);
return CURLE_OK;
}
diff --git a/lib/ftp.h b/lib/ftp.h
index 2c88d568c..828d69a21 100644
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -121,7 +121,8 @@ struct ftp_conn {
char *entrypath; /* the PWD reply when we logged on */
char **dirs; /* realloc()ed array for path components */
int dirdepth; /* number of entries used in the 'dirs' array */
- char *file; /* url-decoded file name (or path) */
+ int diralloc; /* number of entries allocated for the 'dirs' array */
+ char *file; /* decoded file */
bool dont_check; /* Set to TRUE to prevent the final (post-transfer)
file size and 226/250 status check. It should still
read the line, just ignore the result. */
@@ -134,7 +135,8 @@ struct ftp_conn {
bool cwdfail; /* set TRUE if a CWD command fails, as then we must prevent
caching the current directory */
bool wait_data_conn; /* this is set TRUE if data connection is waited */
- char *prevpath; /* url-decoded conn->path from the previous transfer */
+ char *prevpath; /* conn->path from the previous transfer */
+ curl_ftpfile prevmethod; /* ftp method in previous transfer */
char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a
and others (A/I or zero) */
int count1; /* general purpose counter for the state machine */
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index f399a4c27..1b1de5c3c 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -914,7 +914,10 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
case PL_WINNT_DIRORSIZE:
switch(parser->state.NT.sub.dirorsize) {
case PL_WINNT_DIRORSIZE_PRESPACE:
- if(c != ' ') {
+ if(c == ' ') {
+
+ }
+ else {
parser->item_offset = finfo->b_used - 1;
parser->item_length = 1;
parser->state.NT.sub.dirorsize = PL_WINNT_DIRORSIZE_CONTENT;
diff --git a/lib/getenv.c b/lib/getenv.c
index e444a6a3a..89d181de3 100644
--- a/lib/getenv.c
+++ b/lib/getenv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,7 +35,7 @@ char *GetEnv(const char *variable)
return NULL;
#else
#ifdef WIN32
- char env[4096];
+ char env[MAX_PATH]; /* MAX_PATH is from windef.h */
char *temp = getenv(variable);
env[0] = '\0';
if(temp != NULL)
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 2b8f2303e..e118da80d 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -235,9 +235,6 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
case 20:
*param_longp = CURL_HTTP_VERSION_2_0;
break;
- case 30:
- *param_longp = CURL_HTTP_VERSION_3;
- break;
default:
*param_longp = CURL_HTTP_VERSION_NONE;
break;
@@ -246,6 +243,7 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
case CURLINFO_PROTOCOL:
*param_longp = data->info.conn_protocol;
break;
+
default:
return CURLE_UNKNOWN_OPTION;
}
@@ -303,9 +301,7 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
case CURLINFO_REDIRECT_TIME_T:
*param_offt = data->progress.t_redirect;
break;
- case CURLINFO_RETRY_AFTER:
- *param_offt = data->info.retry_after;
- break;
+
default:
return CURLE_UNKNOWN_OPTION;
}
diff --git a/lib/hash.h b/lib/hash.h
index 558d0f47c..90a25d1ca 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -80,7 +80,7 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len);
void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len);
void Curl_hash_apply(struct curl_hash *h, void *user,
void (*cb)(void *user, void *ptr));
-#define Curl_hash_count(h) ((h)->size)
+int Curl_hash_count(struct curl_hash *h);
void Curl_hash_destroy(struct curl_hash *h);
void Curl_hash_clean(struct curl_hash *h);
void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
diff --git a/lib/hostcheck.c b/lib/hostcheck.c
index 9e0db05fa..6fcd0a901 100644
--- a/lib/hostcheck.c
+++ b/lib/hostcheck.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -127,14 +127,16 @@ static int hostmatch(char *hostname, char *pattern)
int Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
{
+ char *matchp;
+ char *hostp;
int res = 0;
if(!match_pattern || !*match_pattern ||
!hostname || !*hostname) /* sanity check */
;
else {
- char *matchp = strdup(match_pattern);
+ matchp = strdup(match_pattern);
if(matchp) {
- char *hostp = strdup(hostname);
+ hostp = strdup(hostname);
if(hostp) {
if(hostmatch(hostp, matchp) == CURL_HOST_MATCH)
res = 1;
diff --git a/lib/hostip.c b/lib/hostip.c
index d4e8f9366..7909141c1 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -114,9 +114,43 @@
* CURLRES_* defines based on the config*.h and curl_setup.h defines.
*/
+/* These two symbols are for the global DNS cache */
+static struct curl_hash hostname_cache;
+static int host_cache_initialized;
+
static void freednsentry(void *freethis);
/*
+ * Curl_global_host_cache_init() initializes and sets up a global DNS cache.
+ * Global DNS cache is general badness. Do not use. This will be removed in
+ * a future version. Use the share interface instead!
+ *
+ * Returns a struct curl_hash pointer on success, NULL on failure.
+ */
+struct curl_hash *Curl_global_host_cache_init(void)
+{
+ int rc = 0;
+ if(!host_cache_initialized) {
+ rc = Curl_hash_init(&hostname_cache, 7, Curl_hash_str,
+ Curl_str_key_compare, freednsentry);
+ if(!rc)
+ host_cache_initialized = 1;
+ }
+ return rc?NULL:&hostname_cache;
+}
+
+/*
+ * Destroy and cleanup the global DNS cache
+ */
+void Curl_global_host_cache_dtor(void)
+{
+ if(host_cache_initialized) {
+ Curl_hash_destroy(&hostname_cache);
+ host_cache_initialized = 0;
+ }
+}
+
+/*
* Return # of addresses in a Curl_addrinfo struct
*/
int Curl_num_addresses(const Curl_addrinfo *addr)
@@ -334,9 +368,9 @@ Curl_fetch_addr(struct connectdata *conn,
return dns;
}
-#ifndef CURL_DISABLE_SHUFFLE_DNS
UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
Curl_addrinfo **addr);
+
/*
* Curl_shuffle_addr() shuffles the order of addresses in a 'Curl_addrinfo'
* struct by re-linking its linked list.
@@ -401,7 +435,6 @@ UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
}
return result;
}
-#endif
/*
* Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache.
@@ -423,14 +456,12 @@ Curl_cache_addr(struct Curl_easy *data,
struct Curl_dns_entry *dns;
struct Curl_dns_entry *dns2;
-#ifndef CURL_DISABLE_SHUFFLE_DNS
/* shuffle addresses if requested */
if(data->set.dns_shuffle_addresses) {
CURLcode result = Curl_shuffle_addr(data, &addr);
if(result)
return NULL;
}
-#endif
/* Create a new cache entry */
dns = calloc(1, sizeof(struct Curl_dns_entry));
@@ -485,7 +516,6 @@ Curl_cache_addr(struct Curl_easy *data,
int Curl_resolv(struct connectdata *conn,
const char *hostname,
int port,
- bool allowDOH,
struct Curl_dns_entry **entry)
{
struct Curl_dns_entry *dns = NULL;
@@ -531,7 +561,7 @@ int Curl_resolv(struct connectdata *conn,
return CURLRESOLV_ERROR;
}
- if(allowDOH && data->set.doh) {
+ if(data->set.doh) {
addr = Curl_doh(conn, hostname, port, &respwait);
}
else {
@@ -624,7 +654,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
const char *hostname,
int port,
struct Curl_dns_entry **entry,
- timediff_t timeoutms)
+ time_t timeoutms)
{
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
@@ -657,7 +687,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
if(!timeout)
/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */
- return Curl_resolv(conn, hostname, port, TRUE, entry);
+ return Curl_resolv(conn, hostname, port, entry);
if(timeout < 1000) {
/* The alarm() function only provides integer second resolution, so if
@@ -719,7 +749,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
/* Perform the actual name resolution. This might be interrupted by an
* alarm if it takes too long.
*/
- rc = Curl_resolv(conn, hostname, port, TRUE, entry);
+ rc = Curl_resolv(conn, hostname, port, entry);
#ifdef USE_ALARM_TIMEOUT
clean_up:
@@ -749,7 +779,7 @@ clean_up:
conn->created) / 1000;
/* the alarm period is counted in even number of seconds */
- unsigned long alarm_set = (unsigned long)(prev_alarm - elapsed_secs);
+ unsigned long alarm_set = prev_alarm - elapsed_secs;
if(!alarm_set ||
((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
@@ -1027,17 +1057,19 @@ CURLcode Curl_resolv_check(struct connectdata *conn,
}
int Curl_resolv_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
#ifdef CURLRES_ASYNCH
if(conn->data->set.doh)
/* nothing to wait for during DOH resolve, those handles have their own
sockets */
return GETSOCK_BLANK;
- return Curl_resolver_getsock(conn, socks);
+ return Curl_resolver_getsock(conn, socks, numsocks);
#else
(void)conn;
(void)socks;
+ (void)numsocks;
return GETSOCK_BLANK;
#endif
}
diff --git a/lib/hostip.h b/lib/hostip.h
index e0597ea96..cd43882af 100644
--- a/lib/hostip.h
+++ b/lib/hostip.h
@@ -25,7 +25,6 @@
#include "curl_setup.h"
#include "hash.h"
#include "curl_addrinfo.h"
-#include "timeval.h" /* for timediff_t */
#include "asyn.h"
#ifdef HAVE_SETJMP_H
@@ -62,6 +61,7 @@ struct connectdata;
* Returns a struct curl_hash pointer on success, NULL on failure.
*/
struct curl_hash *Curl_global_host_cache_init(void);
+void Curl_global_host_cache_dtor(void);
struct Curl_dns_entry {
Curl_addrinfo *addr;
@@ -83,14 +83,11 @@ struct Curl_dns_entry {
#define CURLRESOLV_ERROR -1
#define CURLRESOLV_RESOLVED 0
#define CURLRESOLV_PENDING 1
-int Curl_resolv(struct connectdata *conn,
- const char *hostname,
- int port,
- bool allowDOH,
- struct Curl_dns_entry **dnsentry);
+int Curl_resolv(struct connectdata *conn, const char *hostname,
+ int port, struct Curl_dns_entry **dnsentry);
int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
int port, struct Curl_dns_entry **dnsentry,
- timediff_t timeoutms);
+ time_t timeoutms);
#ifdef CURLRES_IPV6
/*
@@ -124,6 +121,9 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
void Curl_resolv_unlock(struct Curl_easy *data,
struct Curl_dns_entry *dns);
+/* for debugging purposes only: */
+void Curl_scan_cache_used(void *user, void *ptr);
+
/* init a new dns cache and return success */
int Curl_mk_dnscache(struct curl_hash *hash);
@@ -234,6 +234,11 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
/*
+ * Destroy the hostcache of this handle.
+ */
+void Curl_hostcache_destroy(struct Curl_easy *data);
+
+/*
* Populate the cache with specified entries from CURLOPT_RESOLVE.
*/
CURLcode Curl_loadhostpairs(struct Curl_easy *data);
@@ -241,6 +246,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data);
CURLcode Curl_resolv_check(struct connectdata *conn,
struct Curl_dns_entry **dns);
int Curl_resolv_getsock(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
#endif /* HEADER_CURL_HOSTIP_H */
diff --git a/lib/hostip6.c b/lib/hostip6.c
index e0e0c58df..fb2f35ce3 100644
--- a/lib/hostip6.c
+++ b/lib/hostip6.c
@@ -102,15 +102,14 @@ static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai)
printf("dump_addrinfo:\n");
for(; ai; ai = ai->ai_next) {
char buf[INET6_ADDRSTRLEN];
+ char buffer[STRERROR_LEN];
printf(" fam %2d, CNAME %s, ",
ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
if(Curl_printable_address(ai, buf, sizeof(buf)))
printf("%s\n", buf);
- else {
- char buffer[STRERROR_LEN];
+ else
printf("failed; %s\n",
Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- }
}
}
#else
@@ -165,8 +164,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
memset(&hints, 0, sizeof(hints));
hints.ai_family = pf;
- hints.ai_socktype = (conn->transport == TRNSPRT_TCP) ?
- SOCK_STREAM : SOCK_DGRAM;
+ hints.ai_socktype = conn->socktype;
#ifndef USE_RESOLVE_ON_IPS
/*
diff --git a/lib/http.c b/lib/http.c
index 4631a7f36..a0520b40e 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -73,6 +73,7 @@
#include "http_proxy.h"
#include "warnless.h"
#include "non-ascii.h"
+#include "pipeline.h"
#include "http2.h"
#include "connect.h"
#include "strdup.h"
@@ -88,17 +89,17 @@
*/
static int http_getsock_do(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
static int http_should_fail(struct connectdata *conn);
-#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn);
-#endif
#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done);
static int https_getsock(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
#else
#define https_connecting(x,y) CURLE_COULDNT_CONNECT
#endif
@@ -169,26 +170,14 @@ static CURLcode http_setup_conn(struct connectdata *conn)
Curl_mime_initpart(&http->form, conn->data);
data->req.protop = http;
- if(data->set.httpversion == CURL_HTTP_VERSION_3) {
- if(conn->handler->flags & PROTOPT_SSL)
- /* Only go HTTP/3 directly on HTTPS URLs. It needs a UDP socket and does
- the QUIC dance. */
- conn->transport = TRNSPRT_QUIC;
- else {
- failf(data, "HTTP/3 requested for non-HTTPS URL");
- return CURLE_URL_MALFORMAT;
- }
- }
- else {
- if(!CONN_INUSE(conn))
- /* if not already multi-using, setup connection details */
- Curl_http2_setup_conn(conn);
- Curl_http2_setup_req(data);
- }
+ if(!CONN_INUSE(conn))
+ /* if not already multi-using, setup connection details */
+ Curl_http2_setup_conn(conn);
+ Curl_http2_setup_req(data);
return CURLE_OK;
}
-#ifndef CURL_DISABLE_PROXY
+
/*
* checkProxyHeaders() checks the linked list of custom proxy headers
* if proxy headers are not available, then it will lookup into http header
@@ -215,10 +204,6 @@ char *Curl_checkProxyheaders(const struct connectdata *conn,
return NULL;
}
-#else
-/* disabled */
-#define Curl_checkProxyheaders(x,y) NULL
-#endif
/*
* Strip off leading and trailing whitespace from the value in the
@@ -273,7 +258,6 @@ char *Curl_copy_header_value(const char *header)
return value;
}
-#ifndef CURL_DISABLE_HTTP_AUTH
/*
* http_output_basic() sets up an Authorization: header (or the proxy version)
* for HTTP Basic authentication.
@@ -355,8 +339,6 @@ static CURLcode http_output_bearer(struct connectdata *conn)
return result;
}
-#endif
-
/* pickoneauth() selects the most favourable authentication method from the
* ones available and the ones we want.
*
@@ -393,7 +375,7 @@ static bool pickoneauth(struct auth *pick, unsigned long mask)
}
/*
- * http_perhapsrewind()
+ * Curl_http_perhapsrewind()
*
* If we are doing POST or PUT {
* If we have more data to send {
@@ -450,6 +432,9 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
/* figure out how much data we are expected to send */
switch(data->set.httpreq) {
case HTTPREQ_POST:
+ if(data->state.infilesize != -1)
+ expectsend = data->state.infilesize;
+ break;
case HTTPREQ_PUT:
if(data->state.infilesize != -1)
expectsend = data->state.infilesize;
@@ -473,8 +458,8 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
(data->state.authproxy.picked == CURLAUTH_NTLM_WB) ||
(data->state.authhost.picked == CURLAUTH_NTLM_WB)) {
if(((expectsend - bytessent) < 2000) ||
- (conn->http_ntlm_state != NTLMSTATE_NONE) ||
- (conn->proxy_ntlm_state != NTLMSTATE_NONE)) {
+ (conn->ntlm.state != NTLMSTATE_NONE) ||
+ (conn->proxyntlm.state != NTLMSTATE_NONE)) {
/* The NTLM-negotiation has started *OR* there is just a little (<2K)
data left to send, keep on sending. */
@@ -501,8 +486,8 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
if((data->state.authproxy.picked == CURLAUTH_NEGOTIATE) ||
(data->state.authhost.picked == CURLAUTH_NEGOTIATE)) {
if(((expectsend - bytessent) < 2000) ||
- (conn->http_negotiate_state != GSS_AUTHNONE) ||
- (conn->proxy_negotiate_state != GSS_AUTHNONE)) {
+ (conn->negotiate.state != GSS_AUTHNONE) ||
+ (conn->proxyneg.state != GSS_AUTHNONE)) {
/* The NEGOTIATE-negotiation has started *OR*
there is just a little (<2K) data left to send, keep on sending. */
@@ -627,7 +612,6 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
return result;
}
-#ifndef CURL_DISABLE_HTTP_AUTH
/*
* Output the correct authentication header depending on the auth type
* and whether or not it is to a proxy.
@@ -651,7 +635,7 @@ output_auth_headers(struct connectdata *conn,
#endif
#ifdef USE_SPNEGO
- if(authstatus->picked == CURLAUTH_NEGOTIATE) {
+ if((authstatus->picked == CURLAUTH_NEGOTIATE)) {
auth = "Negotiate";
result = Curl_output_negotiate(conn, proxy);
if(result)
@@ -816,22 +800,6 @@ Curl_http_output_auth(struct connectdata *conn,
return result;
}
-#else
-/* when disabled */
-CURLcode
-Curl_http_output_auth(struct connectdata *conn,
- const char *request,
- const char *path,
- bool proxytunnel)
-{
- (void)conn;
- (void)request;
- (void)path;
- (void)proxytunnel;
- return CURLE_OK;
-}
-#endif
-
/*
* Curl_http_input_auth() deals with Proxy-Authenticate: and WWW-Authenticate:
* headers. They are dealt with both in the transfer.c main loop and in the
@@ -847,8 +815,8 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
struct Curl_easy *data = conn->data;
#ifdef USE_SPNEGO
- curlnegotiate *negstate = proxy ? &conn->proxy_negotiate_state :
- &conn->http_negotiate_state;
+ struct negotiatedata *negdata = proxy?
+ &conn->proxyneg:&conn->negotiate;
#endif
unsigned long *availp;
struct auth *authp;
@@ -895,7 +863,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
return CURLE_OUT_OF_MEMORY;
data->state.authproblem = FALSE;
/* we received a GSS auth token and we dealt with it fine */
- *negstate = GSS_AUTHRECV;
+ negdata->state = GSS_AUTHRECV;
}
else
data->state.authproblem = TRUE;
@@ -926,10 +894,19 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
*availp |= CURLAUTH_NTLM_WB;
authp->avail |= CURLAUTH_NTLM_WB;
- result = Curl_input_ntlm_wb(conn, proxy, auth);
- if(result) {
- infof(data, "Authentication problem. Ignoring this.\n");
- data->state.authproblem = TRUE;
+ /* Get the challenge-message which will be passed to
+ * ntlm_auth for generating the type 3 message later */
+ while(*auth && ISSPACE(*auth))
+ auth++;
+ if(checkprefix("NTLM", auth)) {
+ auth += strlen("NTLM");
+ while(*auth && ISSPACE(*auth))
+ auth++;
+ if(*auth) {
+ conn->challenge_header = strdup(auth);
+ if(!conn->challenge_header)
+ return CURLE_OUT_OF_MEMORY;
+ }
}
}
#endif
@@ -1143,14 +1120,10 @@ Curl_send_buffer *Curl_add_buffer_init(void)
*/
void Curl_add_buffer_free(Curl_send_buffer **inp)
{
- Curl_send_buffer *in;
- if(!inp)
- return;
- in = *inp;
- if(in) { /* deal with NULL input */
+ Curl_send_buffer *in = *inp;
+ if(in) /* deal with NULL input */
free(in->buffer);
- free(in);
- }
+ free(in);
*inp = NULL;
}
@@ -1307,6 +1280,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
This needs FIXing.
*/
return CURLE_SEND_ERROR;
+ Curl_pipeline_leave_write(conn);
}
}
Curl_add_buffer_free(&in);
@@ -1483,14 +1457,12 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
/* nothing else to do except wait right now - we're not done here. */
return CURLE_OK;
-#ifndef CURL_DISABLE_PROXY
if(conn->data->set.haproxyprotocol) {
/* add HAProxy PROXY protocol header */
result = add_haproxy_protocol_header(conn);
if(result)
return result;
}
-#endif
if(conn->given->protocol & CURLPROTO_HTTPS) {
/* perform SSL initialization */
@@ -1508,14 +1480,15 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
interface and then we're always _sending_ a request and thus we wait for
the single socket to become writable only */
static int http_getsock_do(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
/* write mode */
+ (void)numsocks; /* unused, we trust it to be at least 1 */
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_WRITESOCK(0);
}
-#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
{
char proxy_header[128];
@@ -1556,7 +1529,6 @@ static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
return result;
}
-#endif
#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done)
@@ -1564,13 +1536,6 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
CURLcode result;
DEBUGASSERT((conn) && (conn->handler->flags & PROTOPT_SSL));
-#ifdef ENABLE_QUIC
- if(conn->transport == TRNSPRT_QUIC) {
- *done = TRUE;
- return CURLE_OK;
- }
-#endif
-
/* perform SSL initialization for this socket */
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
if(result)
@@ -1580,10 +1545,11 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
}
static int https_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
if(conn->handler->flags & PROTOPT_SSL)
- return Curl_ssl_getsock(conn, socks);
+ return Curl_ssl_getsock(conn, socks, numsocks);
return GETSOCK_BLANK;
}
#endif /* USE_SSL */
@@ -1665,12 +1631,6 @@ static bool use_http_1_1plus(const struct Curl_easy *data,
static const char *get_http_string(const struct Curl_easy *data,
const struct connectdata *conn)
{
-#ifdef ENABLE_QUIC
- if((data->set.httpversion == CURL_HTTP_VERSION_3) ||
- (conn->httpversion == 30))
- return "3";
-#endif
-
#ifdef USE_NGHTTP2
if(conn->proto.httpc.h2)
return "2";
@@ -1691,7 +1651,7 @@ static CURLcode expect100(struct Curl_easy *data,
data->state.expect100header = FALSE; /* default to false unless it is set
to TRUE below */
if(use_http_1_1plus(data, conn) &&
- (conn->httpversion < 20)) {
+ (conn->httpversion != 20)) {
/* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
Expect: 100-continue to the headers which actually speeds up post
operations (as there is one packet coming back from the web server) */
@@ -1721,7 +1681,7 @@ enum proxy_use {
will return an error code if one of the headers is
not formatted correctly */
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer **buffer,
+ Curl_send_buffer *buffer,
struct Curl_easy *handle)
{
char *ptr = NULL;
@@ -1729,6 +1689,8 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
const char *endofline_native = NULL;
const char *endofline_network = NULL;
+ /* TODO: Maybe split Curl_add_custom_headers to make it reusable here */
+
if(
#ifdef CURL_DO_LINEEND_CONV
(handle->set.prefer_ascii) ||
@@ -1747,7 +1709,7 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
/* only add correctly formatted trailers */
ptr = strchr(trailers->data, ':');
if(ptr && *(ptr + 1) == ' ') {
- result = Curl_add_bufferf(buffer, "%s%s", trailers->data,
+ result = Curl_add_bufferf(&buffer, "%s%s", trailers->data,
endofline_native);
if(result)
return result;
@@ -1756,7 +1718,7 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
infof(handle, "Malformatted trailing header ! Skipping trailer.");
trailers = trailers->next;
}
- result = Curl_add_buffer(buffer, endofline_network,
+ result = Curl_add_buffer(&buffer, endofline_network,
strlen(endofline_network));
return result;
}
@@ -1872,7 +1834,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
Connection: */
checkprefix("Connection:", compare))
;
- else if((conn->httpversion >= 20) &&
+ else if((conn->httpversion == 20) &&
checkprefix("Transfer-Encoding:", compare))
/* HTTP/2 doesn't support chunked requests */
;
@@ -1901,11 +1863,9 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
return CURLE_OK;
}
-#ifndef CURL_DISABLE_PARSEDATE
-CURLcode Curl_add_timecondition(const struct connectdata *conn,
+CURLcode Curl_add_timecondition(struct Curl_easy *data,
Curl_send_buffer *req_buffer)
{
- struct Curl_easy *data = conn->data;
const struct tm *tm;
struct tm keeptime;
CURLcode result;
@@ -1938,11 +1898,6 @@ CURLcode Curl_add_timecondition(const struct connectdata *conn,
break;
}
- if(Curl_checkheaders(conn, condp)) {
- /* A custom header was specified; it will be sent instead. */
- return CURLE_OK;
- }
-
/* The If-Modified-Since header family should have their times set in
* GMT as RFC2616 defines: "All HTTP date/time stamps MUST be
* represented in Greenwich Mean Time (GMT), without exception. For the
@@ -1966,16 +1921,6 @@ CURLcode Curl_add_timecondition(const struct connectdata *conn,
return result;
}
-#else
-/* disabled */
-CURLcode Curl_add_timecondition(const struct connectdata *conn,
- Curl_send_buffer *req_buffer)
-{
- (void)conn;
- (void)req_buffer;
- return CURLE_OK;
-}
-#endif
/*
* Curl_http() gets called from the generic multi_do() function when a HTTP
@@ -2003,57 +1948,48 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
const char *httpstring;
Curl_send_buffer *req_buffer;
curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
- char *altused = NULL;
/* Always consider the DO phase done after this function call, even if there
may be parts of the request that is not yet sent, since we can deal with
the rest of the request in the PERFORM phase. */
*done = TRUE;
- if(conn->transport != TRNSPRT_QUIC) {
- if(conn->httpversion < 20) { /* unless the connection is re-used and
- already http2 */
- switch(conn->negnpn) {
- case CURL_HTTP_VERSION_2:
- conn->httpversion = 20; /* we know we're on HTTP/2 now */
+ if(conn->httpversion < 20) { /* unless the connection is re-used and already
+ http2 */
+ switch(conn->negnpn) {
+ case CURL_HTTP_VERSION_2:
+ conn->httpversion = 20; /* we know we're on HTTP/2 now */
+
+ result = Curl_http2_switched(conn, NULL, 0);
+ if(result)
+ return result;
+ break;
+ case CURL_HTTP_VERSION_1_1:
+ /* continue with HTTP/1.1 when explicitly requested */
+ break;
+ default:
+ /* Check if user wants to use HTTP/2 with clear TCP*/
+#ifdef USE_NGHTTP2
+ if(conn->data->set.httpversion ==
+ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
+ DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
+ conn->httpversion = 20;
result = Curl_http2_switched(conn, NULL, 0);
if(result)
return result;
- break;
- case CURL_HTTP_VERSION_1_1:
- /* continue with HTTP/1.1 when explicitly requested */
- break;
- default:
- /* Check if user wants to use HTTP/2 with clear TCP*/
-#ifdef USE_NGHTTP2
- if(conn->data->set.httpversion ==
- CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
- if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
- /* We don't support HTTP/2 proxies yet. Also it's debatable
- whether or not this setting should apply to HTTP/2 proxies. */
- infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
- break;
- }
-
- DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
- conn->httpversion = 20;
-
- result = Curl_http2_switched(conn, NULL, 0);
- if(result)
- return result;
- }
-#endif
- break;
}
+#endif
+ break;
}
- else {
- /* prepare for a http2 request */
- result = Curl_http2_setup(conn);
- if(result)
- return result;
- }
}
+ else {
+ /* prepare for a http2 request */
+ result = Curl_http2_setup(conn);
+ if(result)
+ return result;
+ }
+
http = data->req.protop;
DEBUGASSERT(http);
@@ -2213,7 +2149,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
http->sendit = NULL;
}
-#ifndef CURL_DISABLE_MIME
if(http->sendit) {
const char *cthdr = Curl_checkheaders(conn, "Content-Type");
@@ -2238,7 +2173,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return result;
http->postsize = Curl_mime_size(http->sendit);
}
-#endif
ptr = Curl_checkheaders(conn, "Transfer-Encoding");
if(ptr) {
@@ -2249,16 +2183,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
else {
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
(((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
- http->postsize < 0) ||
- ((data->set.upload || httpreq == HTTPREQ_POST) &&
- data->state.infilesize == -1))) {
+ http->postsize < 0) ||
+ (data->set.upload && data->state.infilesize == -1))) {
if(conn->bits.authneg)
/* don't enable chunked during auth neg */
;
else if(use_http_1_1plus(data, conn)) {
- if(conn->httpversion < 20)
- /* HTTP, upload, unknown file size and not HTTP 1.0 */
- data->req.upload_chunky = TRUE;
+ /* HTTP, upload, unknown file size and not HTTP 1.0 */
+ data->req.upload_chunky = TRUE;
}
else {
failf(data, "Chunky upload is not supported by HTTP 1.0");
@@ -2359,6 +2291,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* and no fragment part */
CURLUcode uc;
+ char *url;
CURLU *h = curl_url_dup(data->state.uh);
if(!h)
return CURLE_OUT_OF_MEMORY;
@@ -2389,15 +2322,19 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return CURLE_OUT_OF_MEMORY;
}
}
- /* Extract the the URL to use in the request. Store in STRING_TEMP_URL for
- clean-up reasons if the function returns before the free() further
- down. */
- uc = curl_url_get(h, CURLUPART_URL, &data->set.str[STRING_TEMP_URL], 0);
+ /* now extract the new version of the URL */
+ uc = curl_url_get(h, CURLUPART_URL, &url, 0);
if(uc) {
curl_url_cleanup(h);
return CURLE_OUT_OF_MEMORY;
}
+ if(data->change.url_alloc)
+ free(data->change.url);
+
+ data->change.url = url;
+ data->change.url_alloc = TRUE;
+
curl_url_cleanup(h);
if(strcasecompare("ftp", data->state.up.scheme)) {
@@ -2576,16 +2513,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
query = NULL;
}
-#ifndef CURL_DISABLE_PROXY
/* url */
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
- char *url = data->set.str[STRING_TEMP_URL];
+ char *url = data->change.url;
result = Curl_add_buffer(&req_buffer, url, strlen(url));
- Curl_safefree(data->set.str[STRING_TEMP_URL]);
}
- else
-#endif
- if(paste_ftp_userpwd)
+ else if(paste_ftp_userpwd)
result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
conn->user, conn->passwd,
path + sizeof("ftp://") - 1);
@@ -2599,14 +2532,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
-#ifdef USE_ALTSVC
- if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) {
- altused = aprintf("Alt-Used: %s:%d\r\n",
- conn->conn_to_host.name, conn->conn_to_port);
- if(!altused)
- return CURLE_OUT_OF_MEMORY;
- }
-#endif
result =
Curl_add_bufferf(&req_buffer,
"%s" /* ftp typecode (;type=x) */
@@ -2621,8 +2546,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
"%s" /* accept-encoding */
"%s" /* referer */
"%s" /* Proxy-Connection */
- "%s" /* transfer-encoding */
- "%s",/* Alt-Used */
+ "%s",/* transfer-encoding */
ftp_typecode,
httpstring,
@@ -2648,15 +2572,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
!conn->bits.tunnel_proxy &&
!Curl_checkProxyheaders(conn, "Proxy-Connection"))?
"Proxy-Connection: Keep-Alive\r\n":"",
- te,
- altused ? altused : ""
+ te
);
/* clear userpwd and proxyuserpwd to avoid re-using old credentials
* from re-used connections */
Curl_safefree(conn->allocptr.userpwd);
Curl_safefree(conn->allocptr.proxyuserpwd);
- free(altused);
if(result)
return result;
@@ -2676,7 +2598,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
struct Cookie *co = NULL; /* no cookies from start */
int count = 0;
- if(data->cookies && data->state.cookie_engine) {
+ if(data->cookies) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
co = Curl_cookie_getlist(data->cookies,
conn->allocptr.cookiehost?
@@ -2724,7 +2646,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
#endif
- result = Curl_add_timecondition(conn, req_buffer);
+ result = Curl_add_timecondition(data, req_buffer);
if(result)
return result;
@@ -2819,7 +2741,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return result;
}
-#ifndef CURL_DISABLE_MIME
/* Output mime-generated headers. */
{
struct curl_slist *hdr;
@@ -2830,7 +2751,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return result;
}
}
-#endif
/* For really small posts we don't use Expect: headers at all, and for
the somewhat bigger ones we allow the app to disable it. Just make
@@ -3041,7 +2961,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending HTTP request");
else
/* HTTP GET/HEAD download: */
- Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
+ Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
+ http->postdata?FIRSTSOCKET:-1);
}
if(result)
return result;
@@ -3187,9 +3108,6 @@ static CURLcode header_append(struct Curl_easy *data,
struct SingleRequest *k,
size_t length)
{
- /* length is at most the size of a full read buffer, for which the upper
- bound is CURL_MAX_READ_SIZE. There is thus no chance of overflow in this
- calculation. */
size_t newsize = k->hbuflen + length;
if(newsize > CURL_MAX_HTTP_HEADER) {
/* The reason to have a max limit for this is to avoid the risk of a bad
@@ -3454,9 +3372,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
#if defined(USE_NTLM)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
- (conn->http_ntlm_state == NTLMSTATE_TYPE2)) ||
+ (conn->ntlm.state == NTLMSTATE_TYPE2)) ||
((data->req.httpcode == 407) &&
- (conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) {
+ (conn->proxyntlm.state == NTLMSTATE_TYPE2)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
@@ -3464,19 +3382,19 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
#if defined(USE_SPNEGO)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
- (conn->http_negotiate_state == GSS_AUTHRECV)) ||
+ (conn->negotiate.state == GSS_AUTHRECV)) ||
((data->req.httpcode == 407) &&
- (conn->proxy_negotiate_state == GSS_AUTHRECV)))) {
+ (conn->proxyneg.state == GSS_AUTHRECV)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
- if((conn->http_negotiate_state == GSS_AUTHDONE) &&
+ if((conn->negotiate.state == GSS_AUTHDONE) &&
(data->req.httpcode != 401)) {
- conn->http_negotiate_state = GSS_AUTHSUCC;
+ conn->negotiate.state = GSS_AUTHSUCC;
}
- if((conn->proxy_negotiate_state == GSS_AUTHDONE) &&
+ if((conn->proxyneg.state == GSS_AUTHDONE) &&
(data->req.httpcode != 407)) {
- conn->proxy_negotiate_state = GSS_AUTHSUCC;
+ conn->proxyneg.state = GSS_AUTHSUCC;
}
#endif
/*
@@ -3554,10 +3472,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
else {
infof(data, "HTTP error before end of send, stop sending\n");
streamclose(conn, "Stop sending data before everything sent");
- result = Curl_done_sending(conn, k);
- if(result)
- return result;
k->upload_done = TRUE;
+ k->keepon &= ~KEEP_SEND; /* don't send */
if(data->state.expect100header)
k->exp100 = EXP100_FAILED;
}
@@ -3694,7 +3610,6 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* guarantees on future behaviors since it isn't within the protocol.
*/
char separator;
- char twoorthree[2];
nc = sscanf(HEADER1,
" HTTP/%1d.%1d%c%3d",
&httpversion_major,
@@ -3702,8 +3617,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
&separator,
&k->httpcode);
- if(nc == 1 && httpversion_major >= 2 &&
- 2 == sscanf(HEADER1, " HTTP/%1[23] %d", twoorthree, &k->httpcode)) {
+ if(nc == 1 && httpversion_major == 2 &&
+ 1 == sscanf(HEADER1, " HTTP/2 %d", &k->httpcode)) {
conn->httpversion = 0;
nc = 4;
separator = ' ';
@@ -3717,10 +3632,6 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(conn->httpversion != 20)
infof(data, "Lying server, not serving HTTP/2\n");
}
- if(conn->httpversion < 20) {
- conn->bundle->multiuse = BUNDLE_NO_MULTIUSE;
- infof(data, "Mark bundle as not supporting multiuse\n");
- }
}
else if(!nc) {
/* this is the real world, not a Nirvana
@@ -3741,7 +3652,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
else {
- failf(data, "Unsupported HTTP version in response");
+ failf(data, "Unsupported HTTP version in response\n");
return CURLE_UNSUPPORTED_PROTOCOL;
}
}
@@ -3758,6 +3669,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
conn->httpversion = 11; /* For us, RTSP acts like HTTP 1.1 */
}
else {
+ /* TODO: do we care about the other cases here? */
nc = 0;
}
}
@@ -3810,12 +3722,18 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
else if(conn->httpversion >= 11 &&
!conn->bits.close) {
- /* If HTTP version is >= 1.1 and connection is persistent */
+ /* If HTTP version is >= 1.1 and connection is persistent
+ server supports pipelining. */
DEBUGF(infof(data,
- "HTTP 1.1 or later with persistent connection\n"));
+ "HTTP 1.1 or later with persistent connection, "
+ "pipelining supported\n"));
+ /* Activate pipelining if needed */
+ if(conn->bundle) {
+ if(!Curl_pipeline_site_blacklisted(data, conn))
+ conn->bundle->multiuse = BUNDLE_PIPELINING;
+ }
}
- k->http_bodyless = k->httpcode >= 100 && k->httpcode < 200;
switch(k->httpcode) {
case 304:
/* (quote from RFC2616, section 10.3.5): The 304 response
@@ -3833,9 +3751,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* empty line after the header fields. */
k->size = 0;
k->maxdownload = 0;
- k->http_bodyless = TRUE;
+ k->ignorecl = TRUE; /* ignore Content-Length headers */
break;
default:
+ /* nothing */
break;
}
}
@@ -3851,8 +3770,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
return result;
/* Check for Content-Length: header lines to get size */
- if(!k->http_bodyless &&
- !data->set.ignorecl && checkprefix("Content-Length:", k->p)) {
+ if(!k->ignorecl && !data->set.ignorecl &&
+ checkprefix("Content-Length:", k->p)) {
curl_off_t contentlength;
CURLofft offt = curlx_strtoofft(k->p + 15, NULL, 10, &contentlength);
@@ -3897,6 +3816,19 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
data->info.contenttype = contenttype;
}
}
+ else if(checkprefix("Server:", k->p)) {
+ if(conn->httpversion < 20) {
+ /* only do this for non-h2 servers */
+ char *server_name = Curl_copy_header_value(k->p);
+
+ /* Turn off pipelining if the server version is blacklisted */
+ if(conn->bundle && (conn->bundle->multiuse == BUNDLE_PIPELINING)) {
+ if(Curl_pipeline_server_blacklisted(data, server_name))
+ conn->bundle->multiuse = BUNDLE_NO_MULTIUSE;
+ }
+ free(server_name);
+ }
+ }
else if((conn->httpversion == 10) &&
conn->bits.httpproxy &&
Curl_compareheader(k->p,
@@ -3941,7 +3873,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
*/
streamclose(conn, "Connection: close used");
}
- else if(!k->http_bodyless && checkprefix("Transfer-Encoding:", k->p)) {
+ else if(checkprefix("Transfer-Encoding:", k->p)) {
/* One or more encodings. We check for chunked and/or a compression
algorithm. */
/*
@@ -3957,7 +3889,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
- else if(!k->http_bodyless && checkprefix("Content-Encoding:", k->p) &&
+ else if(checkprefix("Content-Encoding:", k->p) &&
data->set.str[STRING_ENCODING]) {
/*
* Process Content-Encoding. Look for the values: identity,
@@ -3970,20 +3902,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
- else if(checkprefix("Retry-After:", k->p)) {
- /* Retry-After = HTTP-date / delay-seconds */
- curl_off_t retry_after = 0; /* zero for unknown or "now" */
- time_t date = curl_getdate(&k->p[12], NULL);
- if(-1 == date) {
- /* not a date, try it as a decimal number */
- (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
- }
- else
- /* convert date to number of seconds into the future */
- retry_after = date - time(NULL);
- data->info.retry_after = retry_after; /* store it */
- }
- else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
+ else if(checkprefix("Content-Range:", k->p)) {
/* Content-Range: bytes [num]-
Content-Range: bytes: [num]-
Content-Range: [num]-
@@ -4013,7 +3932,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
data->state.resume_from = 0; /* get everything */
}
#if !defined(CURL_DISABLE_COOKIES)
- else if(data->cookies && data->state.cookie_engine &&
+ else if(data->cookies &&
checkprefix("Set-Cookie:", k->p)) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE,
CURL_LOCK_ACCESS_SINGLE);
@@ -4029,7 +3948,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
#endif
- else if(!k->http_bodyless && checkprefix("Last-Modified:", k->p) &&
+ else if(checkprefix("Last-Modified:", k->p) &&
(data->set.timecondition || data->set.get_filetime) ) {
time_t secs = time(NULL);
k->timeofdoc = curl_getdate(k->p + strlen("Last-Modified:"),
@@ -4054,7 +3973,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(result)
return result;
}
-#ifdef USE_SPNEGO
+ #ifdef USE_SPNEGO
else if(checkprefix("Persistent-Auth", k->p)) {
struct negotiatedata *negdata = &conn->negotiate;
struct auth *authp = &data->state.authhost;
@@ -4062,15 +3981,14 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
char *persistentauth = Curl_copy_header_value(k->p);
if(!persistentauth)
return CURLE_OUT_OF_MEMORY;
- negdata->noauthpersist = checkprefix("false", persistentauth)?
- TRUE:FALSE;
+ negdata->noauthpersist = checkprefix("false", persistentauth);
negdata->havenoauthpersist = TRUE;
infof(data, "Negotiate: noauthpersist -> %d, header part: %s",
negdata->noauthpersist, persistentauth);
free(persistentauth);
}
}
-#endif
+ #endif
else if((k->httpcode >= 300 && k->httpcode < 400) &&
checkprefix("Location:", k->p) &&
!data->req.location) {
diff --git a/lib/http.h b/lib/http.h
index a3a275702..a59fe7af0 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -69,24 +69,32 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
size_t included_body_bytes,
int socketindex);
-CURLcode Curl_add_timecondition(const struct connectdata *conn,
+CURLcode Curl_add_timecondition(struct Curl_easy *data,
Curl_send_buffer *buf);
CURLcode Curl_add_custom_headers(struct connectdata *conn,
bool is_connect,
Curl_send_buffer *req_buffer);
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer **buffer,
+ Curl_send_buffer *buffer,
struct Curl_easy *handle);
/* protocol-specific functions set up to be called by the main engine */
CURLcode Curl_http(struct connectdata *conn, bool *done);
CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
CURLcode Curl_http_connect(struct connectdata *conn, bool *done);
+CURLcode Curl_http_setup_conn(struct connectdata *conn);
+
+/* The following functions are defined in http_chunks.c */
+void Curl_httpchunk_init(struct connectdata *conn);
+CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
+ ssize_t length, ssize_t *wrote);
/* These functions are in http.c */
+void Curl_http_auth_stage(struct Curl_easy *data, int stage);
CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
const char *auth);
CURLcode Curl_http_auth_act(struct connectdata *conn);
+CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
/* If only the PICKNONE bit is set, there has been a round-trip and we
selected to use no auth at all. Ie, we actively select no auth, as opposed
@@ -121,10 +129,6 @@ CURLcode Curl_http_auth_act(struct connectdata *conn);
#endif /* CURL_DISABLE_HTTP */
-#ifdef USE_NGHTTP3
-struct h3out; /* see ngtcp2 */
-#endif
-
/****************************************************************************
* HTTP unique setup
***************************************************************************/
@@ -171,34 +175,19 @@ struct HTTP {
int status_code; /* HTTP status code */
const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
size_t pauselen; /* the number of bytes left in data */
- bool close_handled; /* TRUE if stream closure is handled by libcurl */
-
- char **push_headers; /* allocated array */
- size_t push_headers_used; /* number of entries filled in */
- size_t push_headers_alloc; /* number of entries allocated */
-#endif
-#if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
bool closed; /* TRUE on HTTP2 stream close */
+ bool close_handled; /* TRUE if stream closure is handled by libcurl */
char *mem; /* points to a buffer in memory to store received data */
size_t len; /* size of the buffer 'mem' points to */
size_t memlen; /* size of data copied to mem */
-#endif
-#if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
- /* fields used by both HTTP/2 and HTTP/3 */
+
const uint8_t *upload_mem; /* points to a buffer to read from */
size_t upload_len; /* size of the buffer 'upload_mem' points to */
curl_off_t upload_left; /* number of bytes left to upload */
-#endif
-#ifdef ENABLE_QUIC
- /*********** for HTTP/3 we store stream-local data here *************/
- int64_t stream3_id; /* stream we are interested in */
- bool firstbody; /* FALSE until body arrives */
- bool h3req; /* FALSE until request is issued */
- bool upload_done;
-#endif
-#ifdef USE_NGHTTP3
- struct h3out *h3out; /* per-stream buffers for upload */
+ char **push_headers; /* allocated array */
+ size_t push_headers_used; /* number of entries filled in */
+ size_t push_headers_alloc; /* number of entries allocated */
#endif
};
diff --git a/lib/http2.c b/lib/http2.c
index 6315fc401..b5c53cdf6 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -100,12 +100,19 @@ void Curl_http2_init_userset(struct UserDefined *set)
}
static int http2_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to
+ numsocks
+ number of
+ sockets */
+ int numsocks)
{
const struct http_conn *c = &conn->proto.httpc;
struct SingleRequest *k = &conn->data->req;
int bitmap = GETSOCK_BLANK;
+ (void)numsocks;
+ /* TODO We should check underlying socket state if it is SSL socket
+ because of renegotiation. */
sock[0] = conn->sock[FIRSTSOCKET];
/* in a HTTP/2 connection we can basically always get a frame so we should
@@ -121,9 +128,11 @@ static int http2_perform_getsock(const struct connectdata *conn,
}
static int http2_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *sock, /* points to numsocks
+ number of sockets */
+ int numsocks)
{
- return http2_perform_getsock(conn, socks);
+ return http2_perform_getsock(conn, sock, numsocks);
}
/*
@@ -233,7 +242,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
if(checks_to_perform & CONNCHECK_KEEPALIVE) {
struct curltime now = Curl_now();
- timediff_t elapsed = Curl_timediff(now, check->keepalive);
+ time_t elapsed = Curl_timediff(now, check->keepalive);
if(elapsed > check->upkeep_interval_ms) {
/* Perform an HTTP/2 PING */
@@ -262,7 +271,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
return ret_val;
}
-/* called from http_setup_conn */
+/* called from Curl_http_setup_conn */
void Curl_http2_setup_req(struct Curl_easy *data)
{
struct HTTP *http = data->req.protop;
@@ -279,7 +288,7 @@ void Curl_http2_setup_req(struct Curl_easy *data)
http->memlen = 0;
}
-/* called from http_setup_conn */
+/* called from Curl_http_setup_conn */
void Curl_http2_setup_conn(struct connectdata *conn)
{
conn->proto.httpc.settings.max_concurrent_streams =
@@ -496,14 +505,16 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
/* setup the request struct */
struct HTTP *http = calloc(1, sizeof(struct HTTP));
if(!http) {
- (void)Curl_close(&second);
+ (void)Curl_close(second);
+ second = NULL;
}
else {
second->req.protop = http;
http->header_recvbuf = Curl_add_buffer_init();
if(!http->header_recvbuf) {
free(http);
- (void)Curl_close(&second);
+ (void)Curl_close(second);
+ second = NULL;
}
else {
Curl_http2_setup_req(second);
@@ -545,7 +556,7 @@ static int push_promise(struct Curl_easy *data,
stream = data->req.protop;
if(!stream) {
failf(data, "Internal NULL stream!\n");
- (void)Curl_close(&newhandle);
+ (void)Curl_close(newhandle);
rv = 1;
goto fail;
}
@@ -567,7 +578,7 @@ static int push_promise(struct Curl_easy *data,
/* denied, kill off the new handle again */
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- (void)Curl_close(&newhandle);
+ (void)Curl_close(newhandle);
goto fail;
}
@@ -583,7 +594,7 @@ static int push_promise(struct Curl_easy *data,
infof(data, "failed to add handle to multi\n");
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
- Curl_close(&newhandle);
+ Curl_close(newhandle);
rv = 1;
goto fail;
}
@@ -609,7 +620,7 @@ static int push_promise(struct Curl_easy *data,
/*
* multi_connchanged() is called to tell that there is a connection in
- * this multi handle that has changed state (multiplexing become possible, the
+ * this multi handle that has changed state (pipelining become possible, the
* number of allowed streams changed or similar), and a subsequent use of this
* multi handle should move CONNECT_PEND handles back to CONNECT to have them
* retry.
@@ -846,7 +857,6 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
stream->closed = TRUE;
httpc = &conn->proto.httpc;
drain_this(data_s, httpc);
- Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
httpc->error_code = error_code;
/* remove the entry from the hash as the stream is now gone */
@@ -960,15 +970,13 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
char *h;
if(!strcmp(":authority", (const char *)name)) {
- /* pseudo headers are lower case */
+ /* psuedo headers are lower case */
int rc = 0;
char *check = aprintf("%s:%d", conn->host.name, conn->remote_port);
if(!check)
/* no memory */
return NGHTTP2_ERR_CALLBACK_FAILURE;
- if(!Curl_strcasecompare(check, (const char *)value) &&
- ((conn->remote_port != conn->given->defport) ||
- !Curl_strcasecompare(conn->host.name, (const char *)value))) {
+ if(!Curl_strcasecompare(check, (const char *)value)) {
/* This is push is not for the same authority that was asked for in
* the URL. RFC 7540 section 8.2 says: "A client MUST treat a
* PUSH_PROMISE for which the server is not authoritative as a stream
@@ -1158,7 +1166,7 @@ static void populate_settings(struct connectdata *conn,
nghttp2_settings_entry *iv = httpc->local_settings;
iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
- iv[0].value = (uint32_t)Curl_multi_max_concurrent_streams(conn->data->multi);
+ iv[0].value = 100;
iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
iv[1].value = HTTP2_HUGE_WINDOW_SIZE;
@@ -1193,6 +1201,9 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
if(!httpc->h2) /* not HTTP/2 ? */
return;
+ if(data->state.drain)
+ drained_transfer(data, httpc);
+
if(premature) {
/* RST_STREAM */
if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
@@ -1204,10 +1215,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
httpc->pause_stream_id = 0;
}
}
-
- if(data->state.drain)
- drained_transfer(data, httpc);
-
/* -1 means unassigned and 0 means cleared */
if(http->stream_id > 0) {
int rv = nghttp2_session_set_stream_user_data(httpc->h2,
@@ -1536,7 +1543,6 @@ static int h2_session_send(struct Curl_easy *data,
H2BUGF(infof(data, "Queuing PRIORITY on stream %u (easy %p)\n",
stream->stream_id, data));
- DEBUGASSERT(stream->stream_id != -1);
rv = nghttp2_submit_priority(h2, NGHTTP2_FLAG_NONE, stream->stream_id,
&pri_spec);
if(rv)
@@ -1561,11 +1567,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
if(should_close_session(httpc)) {
H2BUGF(infof(data,
"http2_recv: nothing to do in this session\n"));
- if(conn->bits.close) {
- /* already marked for closure, return OK and we're done */
- *err = CURLE_OK;
- return 0;
- }
*err = CURLE_HTTP2;
return -1;
}
@@ -1661,9 +1662,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
socket is not read. But it seems that usually streams are
notified with its drain property, and socket is read again
quickly. */
- if(stream->closed)
- /* closed overrides paused */
- return 0;
H2BUGF(infof(data, "stream %x is paused, pause id: %x\n",
stream->stream_id, httpc->pause_stream_id));
*err = CURLE_AGAIN;
@@ -1758,16 +1756,14 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
else if(!stream->closed) {
drained_transfer(data, httpc);
}
- else
- /* this stream is closed, trigger a another read ASAP to detect that */
- Curl_expire(data, 0, EXPIRE_RUN_NOW);
return retlen;
}
- /* If this stream is closed, return 0 to signal the http routine to close
+ /* If stream is closed, return 0 to signal the http routine to close
the connection */
- if(stream->closed)
- return 0;
+ if(stream->closed) {
+ return http2_handle_stream_close(conn, data, stream, err);
+ }
*err = CURLE_AGAIN;
H2BUGF(infof(data, "http2_recv returns AGAIN for stream %u\n",
stream->stream_id));
@@ -1778,9 +1774,8 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
field list. */
#define AUTHORITY_DST_IDX 3
-/* USHRT_MAX is 65535 == 0xffff */
#define HEADER_OVERFLOW(x) \
- (x.namelen > 0xffff || x.valuelen > 0xffff - x.namelen)
+ (x.namelen > (uint16_t)-1 || x.valuelen > (uint16_t)-1 - x.namelen)
/*
* Check header memory for the token "trailers".
@@ -1852,9 +1847,9 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
const void *mem, size_t len, CURLcode *err)
{
/*
- * Currently, we send request in this function, but this function is also
- * used to send request body. It would be nice to add dedicated function for
- * request.
+ * BIG TODO: Currently, we send request in this function, but this
+ * function is also used to send request body. It would be nice to
+ * add dedicated function for request.
*/
int rv;
struct http_conn *httpc = &conn->proto.httpc;
@@ -1887,11 +1882,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
are going to send or sending request body in DATA frame */
stream->upload_mem = mem;
stream->upload_len = len;
- rv = nghttp2_session_resume_data(h2, stream->stream_id);
- if(nghttp2_is_fatal(rv)) {
- *err = CURLE_SEND_ERROR;
- return -1;
- }
+ nghttp2_session_resume_data(h2, stream->stream_id);
rv = h2_session_send(conn->data, h2);
if(nghttp2_is_fatal(rv)) {
*err = CURLE_SEND_ERROR;
@@ -2030,10 +2021,8 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
nva[i].namelen = strlen((char *)nva[i].name);
}
else {
- nva[i].namelen = (size_t)(end - hdbuf);
- /* Lower case the header name for HTTP/2 */
- Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
nva[i].name = (unsigned char *)hdbuf;
+ nva[i].namelen = (size_t)(end - hdbuf);
}
hdbuf = end + 1;
while(*hdbuf == ' ' || *hdbuf == '\t')
@@ -2143,14 +2132,17 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
return -1;
}
- /* If whole HEADERS frame was sent off to the underlying socket, the nghttp2
- library calls data_source_read_callback. But only it found that no data
- available, so it deferred the DATA transmission. Which means that
- nghttp2_session_want_write() returns 0 on http2_perform_getsock(), which
- results that no writable socket check is performed. To workaround this,
- we issue nghttp2_session_resume_data() here to bring back DATA
- transmission from deferred state. */
- nghttp2_session_resume_data(h2, stream->stream_id);
+ if(stream->stream_id != -1) {
+ /* If whole HEADERS frame was sent off to the underlying socket,
+ the nghttp2 library calls data_source_read_callback. But only
+ it found that no data available, so it deferred the DATA
+ transmission. Which means that nghttp2_session_want_write()
+ returns 0 on http2_perform_getsock(), which results that no
+ writable socket check is performed. To workaround this, we
+ issue nghttp2_session_resume_data() here to bring back DATA
+ transmission from deferred state. */
+ nghttp2_session_resume_data(h2, stream->stream_id);
+ }
return len;
@@ -2424,6 +2416,8 @@ bool Curl_h2_http_1_1_error(struct connectdata *conn)
#else /* !USE_NGHTTP2 */
/* Satisfy external references even if http2 is not compiled in. */
+
+#define CURL_DISABLE_TYPECHECK
#include <curl/curl.h>
char *curl_pushheader_bynum(struct curl_pushheaders *h, size_t num)
diff --git a/lib/http2.h b/lib/http2.h
index 93058ccb3..db6217b11 100644
--- a/lib/http2.h
+++ b/lib/http2.h
@@ -42,12 +42,13 @@ const char *Curl_http2_strerror(uint32_t err);
CURLcode Curl_http2_init(struct connectdata *conn);
void Curl_http2_init_state(struct UrlState *state);
void Curl_http2_init_userset(struct UserDefined *set);
+CURLcode Curl_http2_send_request(struct connectdata *conn);
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
struct connectdata *conn);
CURLcode Curl_http2_setup(struct connectdata *conn);
CURLcode Curl_http2_switched(struct connectdata *conn,
const char *data, size_t nread);
-/* called from http_setup_conn */
+/* called from Curl_http_setup_conn */
void Curl_http2_setup_conn(struct connectdata *conn);
void Curl_http2_setup_req(struct Curl_easy *data);
void Curl_http2_done(struct connectdata *conn, bool premature);
@@ -62,6 +63,7 @@ void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
/* returns true if the HTTP/2 stream error was HTTP_1_1_REQUIRED */
bool Curl_h2_http_1_1_error(struct connectdata *conn);
#else /* USE_NGHTTP2 */
+#define Curl_http2_send_request(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_request_upgrade(x,y) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_setup(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_switched(x,y,z) CURLE_UNSUPPORTED_PROTOCOL
diff --git a/lib/http_chunks.c b/lib/http_chunks.c
index b6ffa4185..18dfcb282 100644
--- a/lib/http_chunks.c
+++ b/lib/http_chunks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -109,8 +109,7 @@ void Curl_httpchunk_init(struct connectdata *conn)
CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
char *datap,
ssize_t datalen,
- ssize_t *wrotep,
- CURLcode *extrap)
+ ssize_t *wrotep)
{
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
@@ -126,10 +125,8 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
chunk read process, to properly calculate the content length*/
if(data->set.http_te_skip && !k->ignorebody) {
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, datalen);
- if(result) {
- *extrap = result;
- return CHUNKE_PASSTHRU_ERROR;
- }
+ if(result)
+ return CHUNKE_WRITE_ERROR;
}
while(length) {
@@ -200,10 +197,8 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
else
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, piece);
- if(result) {
- *extrap = result;
- return CHUNKE_PASSTHRU_ERROR;
- }
+ if(result)
+ return CHUNKE_WRITE_ERROR;
}
*wrote += piece;
@@ -249,10 +244,8 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
if(!data->set.http_te_skip) {
result = Curl_client_write(conn, CLIENTWRITE_HEADER,
conn->trailer, conn->trlPos);
- if(result) {
- *extrap = result;
- return CHUNKE_PASSTHRU_ERROR;
- }
+ if(result)
+ return CHUNKE_WRITE_ERROR;
}
conn->trlPos = 0;
ch->state = CHUNK_TRAILER_CR;
@@ -346,9 +339,8 @@ const char *Curl_chunked_strerror(CHUNKcode code)
return "Illegal or missing hexadecimal sequence";
case CHUNKE_BAD_CHUNK:
return "Malformed encoding found";
- case CHUNKE_PASSTHRU_ERROR:
- DEBUGASSERT(0); /* never used */
- return "";
+ case CHUNKE_WRITE_ERROR:
+ return "Write error";
case CHUNKE_BAD_ENCODING:
return "Bad content-encoding found";
case CHUNKE_OUT_OF_MEMORY:
diff --git a/lib/http_chunks.h b/lib/http_chunks.h
index 8f4a33c8e..b969c5590 100644
--- a/lib/http_chunks.h
+++ b/lib/http_chunks.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,9 +21,6 @@
* KIND, either express or implied.
*
***************************************************************************/
-
-struct connectdata;
-
/*
* The longest possible hexadecimal number we support in a chunked transfer.
* Weird enough, RFC2616 doesn't set a maximum size! Since we use strtoul()
@@ -74,9 +71,9 @@ typedef enum {
CHUNKE_TOO_LONG_HEX = 1,
CHUNKE_ILLEGAL_HEX,
CHUNKE_BAD_CHUNK,
+ CHUNKE_WRITE_ERROR,
CHUNKE_BAD_ENCODING,
CHUNKE_OUT_OF_MEMORY,
- CHUNKE_PASSTHRU_ERROR, /* Curl_httpchunk_read() returns a CURLcode to use */
CHUNKE_LAST
} CHUNKcode;
@@ -90,10 +87,4 @@ struct Curl_chunker {
size_t dataleft; /* untouched data amount at the end of the last buffer */
};
-/* The following functions are defined in http_chunks.c */
-void Curl_httpchunk_init(struct connectdata *conn);
-CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
- ssize_t length, ssize_t *wrote,
- CURLcode *passthru);
-
#endif /* HEADER_CURL_HTTP_CHUNKS_H */
diff --git a/lib/http_digest.c b/lib/http_digest.c
index 9616c30ed..e2d865b0a 100644
--- a/lib/http_digest.c
+++ b/lib/http_digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,6 @@
#include "strcase.h"
#include "vauth/vauth.h"
#include "http_digest.h"
-
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -172,7 +171,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
return CURLE_OK;
}
-void Curl_http_auth_cleanup_digest(struct Curl_easy *data)
+void Curl_digest_cleanup(struct Curl_easy *data)
{
Curl_auth_digest_cleanup(&data->state.digest);
Curl_auth_digest_cleanup(&data->state.proxydigest);
diff --git a/lib/http_digest.h b/lib/http_digest.h
index 73410ae88..fd225c7c1 100644
--- a/lib/http_digest.h
+++ b/lib/http_digest.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,8 +23,6 @@
***************************************************************************/
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
-
/* this is for digest header input */
CURLcode Curl_input_digest(struct connectdata *conn,
bool proxy, const char *header);
@@ -35,8 +33,10 @@ CURLcode Curl_output_digest(struct connectdata *conn,
const unsigned char *request,
const unsigned char *uripath);
-void Curl_http_auth_cleanup_digest(struct Curl_easy *data);
-
-#endif /* !CURL_DISABLE_HTTP && !CURL_DISABLE_CRYPTO_AUTH */
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
+void Curl_digest_cleanup(struct Curl_easy *data);
+#else
+#define Curl_digest_cleanup(x) Curl_nop_stmt
+#endif
#endif /* HEADER_CURL_HTTP_DIGEST_H */
diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c
index 8e1f3bf68..9415236fb 100644
--- a/lib/http_negotiate.c
+++ b/lib/http_negotiate.c
@@ -49,7 +49,6 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
/* Point to the correct struct with this */
struct negotiatedata *neg_ctx;
- curlnegotiate state;
if(proxy) {
userp = conn->http_proxy.user;
@@ -58,7 +57,6 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
data->set.str[STRING_PROXY_SERVICE_NAME] : "HTTP";
host = conn->http_proxy.host.name;
neg_ctx = &conn->proxyneg;
- state = conn->proxy_negotiate_state;
}
else {
userp = conn->user;
@@ -67,7 +65,6 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
data->set.str[STRING_SERVICE_NAME] : "HTTP";
host = conn->host.name;
neg_ctx = &conn->negotiate;
- state = conn->http_negotiate_state;
}
/* Not set means empty */
@@ -85,14 +82,14 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
len = strlen(header);
neg_ctx->havenegdata = len != 0;
if(!len) {
- if(state == GSS_AUTHSUCC) {
+ if(neg_ctx->state == GSS_AUTHSUCC) {
infof(conn->data, "Negotiate auth restarted\n");
- Curl_http_auth_cleanup_negotiate(conn);
+ Curl_cleanup_negotiate(conn);
}
- else if(state != GSS_AUTHNONE) {
+ else if(neg_ctx->state != GSS_AUTHNONE) {
/* The server rejected our authentication and hasn't supplied any more
negotiation mechanisms */
- Curl_http_auth_cleanup_negotiate(conn);
+ Curl_cleanup_negotiate(conn);
return CURLE_LOGIN_DENIED;
}
}
@@ -107,7 +104,7 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
host, header, neg_ctx);
if(result)
- Curl_http_auth_cleanup_negotiate(conn);
+ Curl_auth_spnego_cleanup(neg_ctx);
return result;
}
@@ -118,8 +115,6 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
&conn->negotiate;
struct auth *authp = proxy ? &conn->data->state.authproxy :
&conn->data->state.authhost;
- curlnegotiate *state = proxy ? &conn->proxy_negotiate_state :
- &conn->http_negotiate_state;
char *base64 = NULL;
size_t len = 0;
char *userp;
@@ -127,34 +122,28 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
authp->done = FALSE;
- if(*state == GSS_AUTHRECV) {
+ if(neg_ctx->state == GSS_AUTHRECV) {
if(neg_ctx->havenegdata) {
neg_ctx->havemultiplerequests = TRUE;
}
}
- else if(*state == GSS_AUTHSUCC) {
+ else if(neg_ctx->state == GSS_AUTHSUCC) {
if(!neg_ctx->havenoauthpersist) {
neg_ctx->noauthpersist = !neg_ctx->havemultiplerequests;
}
}
if(neg_ctx->noauthpersist ||
- (*state != GSS_AUTHDONE && *state != GSS_AUTHSUCC)) {
+ (neg_ctx->state != GSS_AUTHDONE && neg_ctx->state != GSS_AUTHSUCC)) {
- if(neg_ctx->noauthpersist && *state == GSS_AUTHSUCC) {
+ if(neg_ctx->noauthpersist && neg_ctx->state == GSS_AUTHSUCC) {
infof(conn->data, "Curl_output_negotiate, "
"no persistent authentication: cleanup existing context");
- Curl_http_auth_cleanup_negotiate(conn);
+ Curl_auth_spnego_cleanup(neg_ctx);
}
if(!neg_ctx->context) {
result = Curl_input_negotiate(conn, proxy, "Negotiate");
- if(result == CURLE_AUTH_ERROR) {
- /* negotiate auth failed, let's continue unauthenticated to stay
- * compatible with the behavior before curl-7_64_0-158-g6c6035532 */
- authp->done = TRUE;
- return CURLE_OK;
- }
- else if(result)
+ if(result)
return result;
}
@@ -181,23 +170,23 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
return CURLE_OUT_OF_MEMORY;
}
- *state = GSS_AUTHSENT;
+ neg_ctx->state = GSS_AUTHSENT;
#ifdef HAVE_GSSAPI
if(neg_ctx->status == GSS_S_COMPLETE ||
neg_ctx->status == GSS_S_CONTINUE_NEEDED) {
- *state = GSS_AUTHDONE;
+ neg_ctx->state = GSS_AUTHDONE;
}
#else
#ifdef USE_WINDOWS_SSPI
if(neg_ctx->status == SEC_E_OK ||
neg_ctx->status == SEC_I_CONTINUE_NEEDED) {
- *state = GSS_AUTHDONE;
+ neg_ctx->state = GSS_AUTHDONE;
}
#endif
#endif
}
- if(*state == GSS_AUTHDONE || *state == GSS_AUTHSUCC) {
+ if(neg_ctx->state == GSS_AUTHDONE || neg_ctx->state == GSS_AUTHSUCC) {
/* connection is already authenticated,
* don't send a header in future requests */
authp->done = TRUE;
@@ -208,13 +197,10 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
return CURLE_OK;
}
-void Curl_http_auth_cleanup_negotiate(struct connectdata *conn)
+void Curl_cleanup_negotiate(struct connectdata *conn)
{
- conn->http_negotiate_state = GSS_AUTHNONE;
- conn->proxy_negotiate_state = GSS_AUTHNONE;
-
- Curl_auth_cleanup_spnego(&conn->negotiate);
- Curl_auth_cleanup_spnego(&conn->proxyneg);
+ Curl_auth_spnego_cleanup(&conn->negotiate);
+ Curl_auth_spnego_cleanup(&conn->proxyneg);
}
#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */
diff --git a/lib/http_negotiate.h b/lib/http_negotiate.h
index 4f0ac1686..d4a7f09e0 100644
--- a/lib/http_negotiate.h
+++ b/lib/http_negotiate.h
@@ -22,7 +22,7 @@
*
***************************************************************************/
-#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO)
+#ifdef USE_SPNEGO
/* this is for Negotiate header input */
CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
@@ -31,8 +31,8 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
/* this is for creating Negotiate header output */
CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy);
-void Curl_http_auth_cleanup_negotiate(struct connectdata *conn);
+void Curl_cleanup_negotiate(struct connectdata *conn);
-#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */
+#endif /* USE_SPNEGO */
#endif /* HEADER_CURL_HTTP_NEGOTIATE_H */
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c
index e4a4fe05d..aaf8a3deb 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -68,11 +68,9 @@ CURLcode Curl_input_ntlm(struct connectdata *conn,
{
/* point to the correct struct with this */
struct ntlmdata *ntlm;
- curlntlm *state;
CURLcode result = CURLE_OK;
ntlm = proxy ? &conn->proxyntlm : &conn->ntlm;
- state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
if(checkprefix("NTLM", header)) {
header += strlen("NTLM");
@@ -85,25 +83,25 @@ CURLcode Curl_input_ntlm(struct connectdata *conn,
if(result)
return result;
- *state = NTLMSTATE_TYPE2; /* We got a type-2 message */
+ ntlm->state = NTLMSTATE_TYPE2; /* We got a type-2 message */
}
else {
- if(*state == NTLMSTATE_LAST) {
+ if(ntlm->state == NTLMSTATE_LAST) {
infof(conn->data, "NTLM auth restarted\n");
- Curl_http_auth_cleanup_ntlm(conn);
+ Curl_http_ntlm_cleanup(conn);
}
- else if(*state == NTLMSTATE_TYPE3) {
+ else if(ntlm->state == NTLMSTATE_TYPE3) {
infof(conn->data, "NTLM handshake rejected\n");
- Curl_http_auth_cleanup_ntlm(conn);
- *state = NTLMSTATE_NONE;
+ Curl_http_ntlm_cleanup(conn);
+ ntlm->state = NTLMSTATE_NONE;
return CURLE_REMOTE_ACCESS_DENIED;
}
- else if(*state >= NTLMSTATE_TYPE1) {
+ else if(ntlm->state >= NTLMSTATE_TYPE1) {
infof(conn->data, "NTLM handshake failure (internal error)\n");
return CURLE_REMOTE_ACCESS_DENIED;
}
- *state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
+ ntlm->state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
}
}
@@ -131,7 +129,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
/* point to the correct struct with this */
struct ntlmdata *ntlm;
- curlntlm *state;
struct auth *authp;
DEBUGASSERT(conn);
@@ -150,7 +147,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
conn->data->set.str[STRING_PROXY_SERVICE_NAME] : "HTTP";
hostname = conn->http_proxy.host.name;
ntlm = &conn->proxyntlm;
- state = &conn->proxy_ntlm_state;
authp = &conn->data->state.authproxy;
}
else {
@@ -161,7 +157,6 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
conn->data->set.str[STRING_SERVICE_NAME] : "HTTP";
hostname = conn->host.name;
ntlm = &conn->ntlm;
- state = &conn->http_ntlm_state;
authp = &conn->data->state.authhost;
}
authp->done = FALSE;
@@ -185,7 +180,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
#endif
#endif
- switch(*state) {
+ switch(ntlm->state) {
case NTLMSTATE_TYPE1:
default: /* for the weird cases we (re)start here */
/* Create a type-1 message */
@@ -227,7 +222,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
- *state = NTLMSTATE_TYPE3; /* we send a type-3 */
+ ntlm->state = NTLMSTATE_TYPE3; /* we send a type-3 */
authp->done = TRUE;
}
break;
@@ -235,7 +230,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
case NTLMSTATE_TYPE3:
/* connection is already authenticated,
* don't send a header in future requests */
- *state = NTLMSTATE_LAST;
+ ntlm->state = NTLMSTATE_LAST;
/* FALLTHROUGH */
case NTLMSTATE_LAST:
Curl_safefree(*allocuserpwd);
@@ -246,13 +241,13 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
return CURLE_OK;
}
-void Curl_http_auth_cleanup_ntlm(struct connectdata *conn)
+void Curl_http_ntlm_cleanup(struct connectdata *conn)
{
- Curl_auth_cleanup_ntlm(&conn->ntlm);
- Curl_auth_cleanup_ntlm(&conn->proxyntlm);
+ Curl_auth_ntlm_cleanup(&conn->ntlm);
+ Curl_auth_ntlm_cleanup(&conn->proxyntlm);
#if defined(NTLM_WB_ENABLED)
- Curl_http_auth_cleanup_ntlm_wb(conn);
+ Curl_ntlm_wb_cleanup(conn);
#endif
}
diff --git a/lib/http_ntlm.h b/lib/http_ntlm.h
index 003714dbd..d186bbe37 100644
--- a/lib/http_ntlm.h
+++ b/lib/http_ntlm.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_HTTP_NTLM_H
-#define HEADER_CURL_HTTP_NTLM_H
+#ifndef HEADER_CURL_NTLM_H
+#define HEADER_CURL_NTLM_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -33,8 +33,8 @@ CURLcode Curl_input_ntlm(struct connectdata *conn, bool proxy,
/* this is for creating ntlm header output */
CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
-void Curl_http_auth_cleanup_ntlm(struct connectdata *conn);
+void Curl_http_ntlm_cleanup(struct connectdata *conn);
#endif /* !CURL_DISABLE_HTTP && USE_NTLM */
-#endif /* HEADER_CURL_HTTP_NTLM_H */
+#endif /* HEADER_CURL_NTLM_H */
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index f095455a5..d7ed11761 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -327,7 +327,7 @@ static CURLcode CONNECT(struct connectdata *conn,
{ /* READING RESPONSE PHASE */
int error = SELECT_OK;
- while(s->keepon) {
+ while(s->keepon && !error) {
ssize_t gotbytes;
/* make sure we have space to read more data */
@@ -384,12 +384,11 @@ static CURLcode CONNECT(struct connectdata *conn,
/* chunked-encoded body, so we need to do the chunked dance
properly to know when the end of the body is reached */
CHUNKcode r;
- CURLcode extra;
ssize_t tookcareof = 0;
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof, &extra);
+ r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
@@ -456,7 +455,6 @@ static CURLcode CONNECT(struct connectdata *conn,
}
else if(s->chunked_encoding) {
CHUNKcode r;
- CURLcode extra;
infof(data, "Ignore chunked response-body\n");
@@ -474,8 +472,7 @@ static CURLcode CONNECT(struct connectdata *conn,
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes,
- &extra);
+ r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
@@ -635,7 +632,6 @@ static CURLcode CONNECT(struct connectdata *conn,
conn->allocptr.proxyuserpwd = NULL;
data->state.authproxy.done = TRUE;
- data->state.authproxy.multipass = FALSE;
infof(data, "Proxy replied %d to CONNECT request\n",
data->info.httpproxycode);
diff --git a/lib/if2ip.c b/lib/if2ip.c
index d003de678..acbcff71e 100644
--- a/lib/if2ip.c
+++ b/lib/if2ip.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -97,7 +97,7 @@ unsigned int Curl_ipv6_scope(const struct sockaddr *sa)
#if defined(HAVE_GETIFADDRS)
if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
- unsigned int local_scope_id, const char *interf,
+ unsigned int remote_scope_id, const char *interf,
char *buf, int buf_size)
{
struct ifaddrs *iface, *head;
@@ -109,7 +109,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
#if !defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) || \
!defined(ENABLE_IPV6)
- (void) local_scope_id;
+ (void) remote_scope_id;
#endif
if(getifaddrs(&head) >= 0) {
@@ -123,9 +123,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
char ipstr[64];
#ifdef ENABLE_IPV6
if(af == AF_INET6) {
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
unsigned int scopeid = 0;
-#endif
unsigned int ifscope = Curl_ipv6_scope(iface->ifa_addr);
if(ifscope != remote_scope) {
@@ -145,16 +143,15 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
->sin6_scope_id;
/* If given, scope id should match. */
- if(local_scope_id && scopeid != local_scope_id) {
+ if(remote_scope_id && scopeid != remote_scope_id) {
if(res == IF2IP_NOT_FOUND)
res = IF2IP_AF_NOT_SUPPORTED;
continue;
}
-
- if(scopeid)
- msnprintf(scope, sizeof(scope), "%%%u", scopeid);
#endif
+ if(scopeid)
+ msnprintf(scope, sizeof(scope), "%%%u", scopeid);
}
else
#endif
@@ -182,7 +179,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
#elif defined(HAVE_IOCTL_SIOCGIFADDR)
if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
- unsigned int local_scope_id, const char *interf,
+ unsigned int remote_scope_id, const char *interf,
char *buf, int buf_size)
{
struct ifreq req;
@@ -192,7 +189,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
size_t len;
(void)remote_scope;
- (void)local_scope_id;
+ (void)remote_scope_id;
if(!interf || (af != AF_INET))
return IF2IP_NOT_FOUND;
@@ -228,12 +225,12 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
#else
if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
- unsigned int local_scope_id, const char *interf,
+ unsigned int remote_scope_id, const char *interf,
char *buf, int buf_size)
{
(void) af;
(void) remote_scope;
- (void) local_scope_id;
+ (void) remote_scope_id;
(void) interf;
(void) buf;
(void) buf_size;
diff --git a/lib/if2ip.h b/lib/if2ip.h
index f193d4257..a11b1c222 100644
--- a/lib/if2ip.h
+++ b/lib/if2ip.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,7 +39,7 @@ typedef enum {
} if2ip_result_t;
if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
- unsigned int local_scope_id, const char *interf,
+ unsigned int remote_scope_id, const char *interf,
char *buf, int buf_size);
#ifdef __INTERIX
diff --git a/lib/imap.c b/lib/imap.c
index 66172bddc..075b3ad20 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -28,7 +28,6 @@
* RFC4959 IMAP Extension for SASL Initial Client Response
* RFC5092 IMAP URL Scheme
* RFC6749 OAuth 2.0 Authorization Framework
- * RFC8314 Use of TLS for Email Submission and Access
* Draft LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
*
***************************************************************************/
@@ -95,7 +94,8 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
static CURLcode imap_connect(struct connectdata *conn, bool *done);
static CURLcode imap_disconnect(struct connectdata *conn, bool dead);
static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done);
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata *conn);
static char *imap_atom(const char *str, bool escape_only);
@@ -443,8 +443,10 @@ static CURLcode imap_perform_capability(struct connectdata *conn)
*/
static CURLcode imap_perform_starttls(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the STARTTLS command */
- CURLcode result = imap_sendf(conn, "STARTTLS");
+ result = imap_sendf(conn, "STARTTLS");
if(!result)
state(conn, IMAP_STARTTLS);
@@ -460,10 +462,11 @@ static CURLcode imap_perform_starttls(struct connectdata *conn)
*/
static CURLcode imap_perform_upgrade_tls(struct connectdata *conn)
{
- /* Start the SSL connection */
+ CURLcode result = CURLE_OK;
struct imap_conn *imapc = &conn->proto.imapc;
- CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
- &imapc->ssldone);
+
+ /* Start the SSL connection */
+ result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);
if(!result) {
if(imapc->state != IMAP_UPGRADETLS)
@@ -822,8 +825,10 @@ static CURLcode imap_perform_search(struct connectdata *conn)
*/
static CURLcode imap_perform_logout(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the LOGOUT command */
- CURLcode result = imap_sendf(conn, "LOGOUT");
+ result = imap_sendf(conn, "LOGOUT");
if(!result)
state(conn, IMAP_LOGOUT);
@@ -1037,7 +1042,7 @@ static CURLcode imap_state_listsearch_resp(struct connectdata *conn,
line[len] = '\0';
}
else if(imapcode != IMAP_RESP_OK)
- result = CURLE_QUOTE_ERROR;
+ result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */
else
/* End of DO phase */
state(conn, IMAP_STOP);
@@ -1109,7 +1114,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
if(imapcode != '*') {
Curl_pgrsSetDownloadSize(data, -1);
state(conn, IMAP_STOP);
- return CURLE_REMOTE_FILE_NOT_FOUND;
+ return CURLE_REMOTE_FILE_NOT_FOUND; /* TODO: Fix error code */
}
/* Something like this is received "* 1 FETCH (BODY[TEXT] {2021}\r" so parse
@@ -1306,7 +1311,6 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
break;
case IMAP_LIST:
- case IMAP_SEARCH:
result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
break;
@@ -1330,6 +1334,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
result = imap_state_append_final_resp(conn, imapcode, imapc->state);
break;
+ case IMAP_SEARCH:
+ result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
+ break;
+
case IMAP_LOGOUT:
/* fallthrough, just stop! */
default:
@@ -1388,9 +1396,10 @@ static CURLcode imap_init(struct connectdata *conn)
}
/* For the IMAP "protocol connect" and "doing" phases only */
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
- return Curl_pp_getsock(&conn->proto.imapc.pp, socks);
+ return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
}
/***********************************************************************
@@ -1482,7 +1491,12 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
state(conn, IMAP_APPEND_FINAL);
}
- /* Run the state-machine */
+ /* Run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the imap_multi_statemach function but we have no general support for
+ non-blocking DONE operations!
+ */
if(!result)
result = imap_block_statemach(conn, FALSE);
}
@@ -1780,7 +1794,7 @@ static char *imap_atom(const char *str, bool escape_only)
return NULL;
/* Look for "atom-specials", counting the backslash and quote characters as
- these will need escaping */
+ these will need escapping */
p1 = str;
while(*p1) {
if(*p1 == '\\')
diff --git a/lib/inet_pton.c b/lib/inet_pton.c
index 0d65ae0ec..fef9610d1 100644
--- a/lib/inet_pton.c
+++ b/lib/inet_pton.c
@@ -153,7 +153,7 @@ inet_pton6(const char *src, unsigned char *dst)
static const char xdigits_l[] = "0123456789abcdef",
xdigits_u[] = "0123456789ABCDEF";
unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
- const char *curtok;
+ const char *xdigits, *curtok;
int ch, saw_xdigit;
size_t val;
@@ -168,7 +168,6 @@ inet_pton6(const char *src, unsigned char *dst)
saw_xdigit = 0;
val = 0;
while((ch = *src++) != '\0') {
- const char *xdigits;
const char *pch;
pch = strchr((xdigits = xdigits_l), ch);
diff --git a/lib/krb5.c b/lib/krb5.c
index 5a47d481b..e51dcd1c6 100644
--- a/lib/krb5.c
+++ b/lib/krb5.c
@@ -1,6 +1,6 @@
/* GSSAPI/krb5 support for FTP - loosely based on old krb4.c
*
- * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
+ * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* Copyright (c) 2004 - 2017 Daniel Stenberg
* All rights reserved.
@@ -320,8 +320,10 @@ static void krb5_end(void *app_data)
OM_uint32 min;
gss_ctx_id_t *context = app_data;
if(*context != GSS_C_NO_CONTEXT) {
- OM_uint32 maj = gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
- (void)maj;
+#ifdef DEBUGBUILD
+ OM_uint32 maj =
+#endif
+ gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
DEBUGASSERT(maj == GSS_S_COMPLETE);
}
}
diff --git a/lib/ldap.c b/lib/ldap.c
index af3d61c57..79dc2f2ed 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -119,12 +119,6 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp);
#define LDAP_TRACE(x) Curl_nop_stmt
#endif
-#if defined(USE_WIN32_LDAP) && defined(ldap_err2string)
-/* Use ansi error strings in UNICODE builds */
-#undef ldap_err2string
-#define ldap_err2string ldap_err2stringA
-#endif
-
static CURLcode Curl_ldap(struct connectdata *conn, bool *done);
@@ -844,10 +838,10 @@ static bool split_str(char *str, char ***out, size_t *count)
static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
{
int rc = LDAP_SUCCESS;
- char *p;
char *path;
- char *q = NULL;
- char *query = NULL;
+ char *query;
+ char *p;
+ char *q;
size_t i;
if(!conn->data ||
@@ -865,13 +859,11 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
if(!path)
return LDAP_NO_MEMORY;
- /* Duplicate the query if present */
- if(conn->data->state.up.query) {
- q = query = strdup(conn->data->state.up.query);
- if(!query) {
- free(path);
- return LDAP_NO_MEMORY;
- }
+ /* Duplicate the query */
+ q = query = strdup(conn->data->state.up.query);
+ if(!query) {
+ free(path);
+ return LDAP_NO_MEMORY;
}
/* Parse the DN (Distinguished Name) */
@@ -1077,6 +1069,8 @@ static int _ldap_url_parse(const struct connectdata *conn,
static void _ldap_free_urldesc(LDAPURLDesc *ludp)
{
+ size_t i;
+
if(!ludp)
return;
@@ -1084,7 +1078,6 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp)
free(ludp->lud_filter);
if(ludp->lud_attrs) {
- size_t i;
for(i = 0; i < ludp->lud_attrs_dups; i++)
free(ludp->lud_attrs[i]);
free(ludp->lud_attrs);
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index 55c2ed494..7d005b795 100644
--- a/lib/libcurl.plist
+++ b/lib/libcurl.plist
@@ -15,7 +15,7 @@
<string>se.haxx.curl.libcurl</string>
<key>CFBundleVersion</key>
- <string>7.67.0</string>
+ <string>7.64.1</string>
<key>CFBundleName</key>
<string>libcurl</string>
@@ -27,9 +27,9 @@
<string>????</string>
<key>CFBundleShortVersionString</key>
- <string>libcurl 7.67.0</string>
+ <string>libcurl 7.64.1</string>
<key>CFBundleGetInfoString</key>
- <string>libcurl.plist 7.67.0</string>
+ <string>libcurl.plist 7.64.1</string>
</dict>
</plist>
diff --git a/lib/md4.c b/lib/md4.c
index bbf897508..4691904be 100644
--- a/lib/md4.c
+++ b/lib/md4.c
@@ -1,223 +1,5 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#if !defined(CURL_DISABLE_CRYPTO_AUTH)
-
-#include "curl_md4.h"
-#include "warnless.h"
-
-#ifdef USE_OPENSSL
-#include <openssl/opensslconf.h>
-#endif
-#ifdef USE_MBEDTLS
-#include <mbedtls/config.h>
-#endif
-
-#if defined(USE_GNUTLS_NETTLE)
-
-#include <nettle/md4.h>
-
-#include "curl_memory.h"
-
-/* The last #include file should be: */
-#include "memdebug.h"
-
-typedef struct md4_ctx MD4_CTX;
-
-static void MD4_Init(MD4_CTX *ctx)
-{
- md4_init(ctx);
-}
-
-static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
-{
- md4_update(ctx, size, data);
-}
-
-static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
-{
- md4_digest(ctx, MD4_DIGEST_SIZE, result);
-}
-
-#elif defined(USE_GNUTLS)
-
-#include <gcrypt.h>
-
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-typedef struct gcry_md_hd_t MD4_CTX;
-
-static void MD4_Init(MD4_CTX *ctx)
-{
- gcry_md_open(ctx, GCRY_MD_MD4, 0);
-}
-
-static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
-{
- gcry_md_write(*ctx, data, size);
-}
-
-static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
-{
- memcpy(result, gcry_md_read(ctx, 0), MD4_DIGEST_LENGTH);
- gcry_md_close(ctx);
-}
-
-#elif defined(USE_OPENSSL) && !defined(OPENSSL_NO_MD4)
-/* When OpenSSL is available we use the MD4-functions from OpenSSL */
-#include <openssl/md4.h>
-
-#elif defined(USE_SECTRANSP)
-
-#include <CommonCrypto/CommonDigest.h>
-
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-typedef struct {
- void *data;
- unsigned long size;
-} MD4_CTX;
-
-static void MD4_Init(MD4_CTX *ctx)
-{
- ctx->data = NULL;
- ctx->size = 0;
-}
-
-static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
-{
- if(ctx->data == NULL) {
- ctx->data = malloc(size);
- if(ctx->data != NULL) {
- memcpy(ctx->data, data, size);
- ctx->size = size;
- }
- }
-}
-
-static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
-{
- if(ctx->data != NULL) {
- (void)CC_MD4(ctx->data, (CC_LONG) ctx->size, result);
-
- Curl_safefree(ctx->data);
- ctx->size = 0;
- }
-}
-
-#elif defined(USE_WIN32_CRYPTO)
-
-#include <wincrypt.h>
-
-#include "curl_memory.h"
- /* The last #include file should be: */
-#include "memdebug.h"
-
-typedef struct {
- HCRYPTPROV hCryptProv;
- HCRYPTHASH hHash;
-} MD4_CTX;
-
-static void MD4_Init(MD4_CTX *ctx)
-{
- ctx->hCryptProv = 0;
- ctx->hHash = 0;
-
- if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT)) {
- CryptCreateHash(ctx->hCryptProv, CALG_MD4, 0, 0, &ctx->hHash);
- }
-}
-
-static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
-{
- CryptHashData(ctx->hHash, data, (unsigned int) size, 0);
-}
-
-static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
-{
- unsigned long length = 0;
-
- CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
- if(length == MD4_DIGEST_LENGTH)
- CryptGetHashParam(ctx->hHash, HP_HASHVAL, result, &length, 0);
-
- if(ctx->hHash)
- CryptDestroyHash(ctx->hHash);
-
- if(ctx->hCryptProv)
- CryptReleaseContext(ctx->hCryptProv, 0);
-}
-
-#elif(defined(USE_MBEDTLS) && defined(MBEDTLS_MD4_C))
-
-#include <mbedtls/md4.h>
-
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-typedef struct {
- void *data;
- unsigned long size;
-} MD4_CTX;
-
-static void MD4_Init(MD4_CTX *ctx)
-{
- ctx->data = NULL;
- ctx->size = 0;
-}
-
-static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
-{
- if(ctx->data == NULL) {
- ctx->data = malloc(size);
- if(ctx->data != NULL) {
- memcpy(ctx->data, data, size);
- ctx->size = size;
- }
- }
-}
-
-static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
-{
- if(ctx->data != NULL) {
- mbedtls_md4(ctx->data, ctx->size, result);
-
- Curl_safefree(ctx->data);
- ctx->size = 0;
- }
-}
-
-#else
-/* When no other crypto library is available, or the crypto library doesn't
- * support MD4, we use this code segment this implementation of it
- *
+/*
+ * !checksrc! disable COPYRIGHT
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD4 Message-Digest Algorithm (RFC 1320).
*
@@ -254,6 +36,17 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
* compile-time configuration.
*/
+#include "curl_setup.h"
+
+/* The NSS, OS/400 and sometimes mbed TLS crypto libraries do not provide the
+ * MD4 hash algorithm, so we have a local implementation of it */
+#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
+
+#include "curl_md4.h"
+#include "warnless.h"
+
+#ifndef HAVE_OPENSSL
#include <string.h>
@@ -320,6 +113,7 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
{
const unsigned char *ptr;
MD4_u32plus a, b, c, d;
+ MD4_u32plus saved_a, saved_b, saved_c, saved_d;
ptr = (const unsigned char *)data;
@@ -329,8 +123,6 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
d = ctx->d;
do {
- MD4_u32plus saved_a, saved_b, saved_c, saved_d;
-
saved_a = a;
saved_b = b;
saved_c = c;
@@ -338,59 +130,59 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
/* Round 1 */
STEP(F, a, b, c, d, SET(0), 3)
- STEP(F, d, a, b, c, SET(1), 7)
- STEP(F, c, d, a, b, SET(2), 11)
- STEP(F, b, c, d, a, SET(3), 19)
- STEP(F, a, b, c, d, SET(4), 3)
- STEP(F, d, a, b, c, SET(5), 7)
- STEP(F, c, d, a, b, SET(6), 11)
- STEP(F, b, c, d, a, SET(7), 19)
- STEP(F, a, b, c, d, SET(8), 3)
- STEP(F, d, a, b, c, SET(9), 7)
- STEP(F, c, d, a, b, SET(10), 11)
- STEP(F, b, c, d, a, SET(11), 19)
- STEP(F, a, b, c, d, SET(12), 3)
- STEP(F, d, a, b, c, SET(13), 7)
- STEP(F, c, d, a, b, SET(14), 11)
- STEP(F, b, c, d, a, SET(15), 19)
+ STEP(F, d, a, b, c, SET(1), 7)
+ STEP(F, c, d, a, b, SET(2), 11)
+ STEP(F, b, c, d, a, SET(3), 19)
+ STEP(F, a, b, c, d, SET(4), 3)
+ STEP(F, d, a, b, c, SET(5), 7)
+ STEP(F, c, d, a, b, SET(6), 11)
+ STEP(F, b, c, d, a, SET(7), 19)
+ STEP(F, a, b, c, d, SET(8), 3)
+ STEP(F, d, a, b, c, SET(9), 7)
+ STEP(F, c, d, a, b, SET(10), 11)
+ STEP(F, b, c, d, a, SET(11), 19)
+ STEP(F, a, b, c, d, SET(12), 3)
+ STEP(F, d, a, b, c, SET(13), 7)
+ STEP(F, c, d, a, b, SET(14), 11)
+ STEP(F, b, c, d, a, SET(15), 19)
/* Round 2 */
- STEP(G, a, b, c, d, GET(0) + 0x5a827999, 3)
- STEP(G, d, a, b, c, GET(4) + 0x5a827999, 5)
- STEP(G, c, d, a, b, GET(8) + 0x5a827999, 9)
- STEP(G, b, c, d, a, GET(12) + 0x5a827999, 13)
- STEP(G, a, b, c, d, GET(1) + 0x5a827999, 3)
- STEP(G, d, a, b, c, GET(5) + 0x5a827999, 5)
- STEP(G, c, d, a, b, GET(9) + 0x5a827999, 9)
- STEP(G, b, c, d, a, GET(13) + 0x5a827999, 13)
- STEP(G, a, b, c, d, GET(2) + 0x5a827999, 3)
- STEP(G, d, a, b, c, GET(6) + 0x5a827999, 5)
- STEP(G, c, d, a, b, GET(10) + 0x5a827999, 9)
- STEP(G, b, c, d, a, GET(14) + 0x5a827999, 13)
- STEP(G, a, b, c, d, GET(3) + 0x5a827999, 3)
- STEP(G, d, a, b, c, GET(7) + 0x5a827999, 5)
- STEP(G, c, d, a, b, GET(11) + 0x5a827999, 9)
- STEP(G, b, c, d, a, GET(15) + 0x5a827999, 13)
+ STEP(G, a, b, c, d, GET(0) + 0x5a827999, 3)
+ STEP(G, d, a, b, c, GET(4) + 0x5a827999, 5)
+ STEP(G, c, d, a, b, GET(8) + 0x5a827999, 9)
+ STEP(G, b, c, d, a, GET(12) + 0x5a827999, 13)
+ STEP(G, a, b, c, d, GET(1) + 0x5a827999, 3)
+ STEP(G, d, a, b, c, GET(5) + 0x5a827999, 5)
+ STEP(G, c, d, a, b, GET(9) + 0x5a827999, 9)
+ STEP(G, b, c, d, a, GET(13) + 0x5a827999, 13)
+ STEP(G, a, b, c, d, GET(2) + 0x5a827999, 3)
+ STEP(G, d, a, b, c, GET(6) + 0x5a827999, 5)
+ STEP(G, c, d, a, b, GET(10) + 0x5a827999, 9)
+ STEP(G, b, c, d, a, GET(14) + 0x5a827999, 13)
+ STEP(G, a, b, c, d, GET(3) + 0x5a827999, 3)
+ STEP(G, d, a, b, c, GET(7) + 0x5a827999, 5)
+ STEP(G, c, d, a, b, GET(11) + 0x5a827999, 9)
+ STEP(G, b, c, d, a, GET(15) + 0x5a827999, 13)
/* Round 3 */
- STEP(H, a, b, c, d, GET(0) + 0x6ed9eba1, 3)
- STEP(H, d, a, b, c, GET(8) + 0x6ed9eba1, 9)
- STEP(H, c, d, a, b, GET(4) + 0x6ed9eba1, 11)
- STEP(H, b, c, d, a, GET(12) + 0x6ed9eba1, 15)
- STEP(H, a, b, c, d, GET(2) + 0x6ed9eba1, 3)
- STEP(H, d, a, b, c, GET(10) + 0x6ed9eba1, 9)
- STEP(H, c, d, a, b, GET(6) + 0x6ed9eba1, 11)
- STEP(H, b, c, d, a, GET(14) + 0x6ed9eba1, 15)
- STEP(H, a, b, c, d, GET(1) + 0x6ed9eba1, 3)
- STEP(H, d, a, b, c, GET(9) + 0x6ed9eba1, 9)
- STEP(H, c, d, a, b, GET(5) + 0x6ed9eba1, 11)
- STEP(H, b, c, d, a, GET(13) + 0x6ed9eba1, 15)
- STEP(H, a, b, c, d, GET(3) + 0x6ed9eba1, 3)
- STEP(H, d, a, b, c, GET(11) + 0x6ed9eba1, 9)
- STEP(H, c, d, a, b, GET(7) + 0x6ed9eba1, 11)
- STEP(H, b, c, d, a, GET(15) + 0x6ed9eba1, 15)
-
- a += saved_a;
+ STEP(H, a, b, c, d, GET(0) + 0x6ed9eba1, 3)
+ STEP(H, d, a, b, c, GET(8) + 0x6ed9eba1, 9)
+ STEP(H, c, d, a, b, GET(4) + 0x6ed9eba1, 11)
+ STEP(H, b, c, d, a, GET(12) + 0x6ed9eba1, 15)
+ STEP(H, a, b, c, d, GET(2) + 0x6ed9eba1, 3)
+ STEP(H, d, a, b, c, GET(10) + 0x6ed9eba1, 9)
+ STEP(H, c, d, a, b, GET(6) + 0x6ed9eba1, 11)
+ STEP(H, b, c, d, a, GET(14) + 0x6ed9eba1, 15)
+ STEP(H, a, b, c, d, GET(1) + 0x6ed9eba1, 3)
+ STEP(H, d, a, b, c, GET(9) + 0x6ed9eba1, 9)
+ STEP(H, c, d, a, b, GET(5) + 0x6ed9eba1, 11)
+ STEP(H, b, c, d, a, GET(13) + 0x6ed9eba1, 15)
+ STEP(H, a, b, c, d, GET(3) + 0x6ed9eba1, 3)
+ STEP(H, d, a, b, c, GET(11) + 0x6ed9eba1, 9)
+ STEP(H, c, d, a, b, GET(7) + 0x6ed9eba1, 11)
+ STEP(H, b, c, d, a, GET(15) + 0x6ed9eba1, 15)
+
+ a += saved_a;
b += saved_b;
c += saved_c;
d += saved_d;
@@ -420,7 +212,7 @@ static void MD4_Init(MD4_CTX *ctx)
static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
MD4_u32plus saved_lo;
- unsigned long used;
+ unsigned long used, available;
saved_lo = ctx->lo;
ctx->lo = (saved_lo + size) & 0x1fffffff;
@@ -431,7 +223,7 @@ static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
used = saved_lo & 0x3f;
if(used) {
- unsigned long available = 64 - used;
+ available = 64 - used;
if(size < available) {
memcpy(&ctx->buffer[used], data, size);
@@ -503,7 +295,7 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
memset(ctx, 0, sizeof(*ctx));
}
-#endif /* CRYPTO LIBS */
+#endif
void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
{
@@ -512,5 +304,5 @@ void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
MD4_Update(&ctx, input, curlx_uztoui(len));
MD4_Final(output, &ctx);
}
-
-#endif /* CURL_DISABLE_CRYPTO_AUTH */
+#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
diff --git a/lib/md5.c b/lib/md5.c
index 2b81ca455..db4cc2656 100644
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -39,19 +39,19 @@
typedef struct md5_ctx MD5_CTX;
-static void MD5_Init(MD5_CTX *ctx)
+static void MD5_Init(MD5_CTX * ctx)
{
md5_init(ctx);
}
-static void MD5_Update(MD5_CTX *ctx,
+static void MD5_Update(MD5_CTX * ctx,
const unsigned char *input,
unsigned int inputLen)
{
md5_update(ctx, inputLen, input);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char digest[16], MD5_CTX * ctx)
{
md5_digest(ctx, 16, digest);
}
@@ -65,19 +65,19 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
typedef gcry_md_hd_t MD5_CTX;
-static void MD5_Init(MD5_CTX *ctx)
+static void MD5_Init(MD5_CTX * ctx)
{
gcry_md_open(ctx, GCRY_MD_MD5, 0);
}
-static void MD5_Update(MD5_CTX *ctx,
+static void MD5_Update(MD5_CTX * ctx,
const unsigned char *input,
unsigned int inputLen)
{
gcry_md_write(*ctx, input, inputLen);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char digest[16], MD5_CTX * ctx)
{
memcpy(digest, gcry_md_read(*ctx, 0), 16);
gcry_md_close(*ctx);
@@ -124,7 +124,7 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
CC_MD5_Final(digest, ctx);
}
-#elif defined(WIN32) && !defined(CURL_WINDOWS_APP)
+#elif defined(_WIN32) && !defined(CURL_WINDOWS_APP)
#include <wincrypt.h>
#include "curl_memory.h"
@@ -275,6 +275,7 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
{
const unsigned char *ptr;
MD5_u32plus a, b, c, d;
+ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
ptr = (const unsigned char *)data;
@@ -284,8 +285,6 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
d = ctx->d;
do {
- MD5_u32plus saved_a, saved_b, saved_c, saved_d;
-
saved_a = a;
saved_b = b;
saved_c = c;
@@ -293,77 +292,77 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
/* Round 1 */
STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
- STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
- STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
- STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
- STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
- STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
- STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
- STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
- STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
- STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
- STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
- STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
- STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
- STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
- STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
- STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
/* Round 2 */
- STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
- STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
- STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
- STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
- STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
- STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
- STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
- STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
- STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
- STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
- STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
- STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
- STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
- STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
- STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
- STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
/* Round 3 */
- STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
- STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
- STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
- STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
- STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
- STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
- STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
- STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
- STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
- STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
- STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
- STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
- STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
- STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
- STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
- STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
+ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+ STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
+ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+ STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
+ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+ STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+ STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
+ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+ STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
+ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+ STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
+ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+ STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
+ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+ STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
/* Round 4 */
- STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
- STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
- STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
- STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
- STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
- STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
- STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
- STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
- STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
- STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
- STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
- STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
- STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
- STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
- STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
- STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
-
- a += saved_a;
+ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+ a += saved_a;
b += saved_b;
c += saved_c;
d += saved_d;
@@ -393,7 +392,7 @@ static void MD5_Init(MD5_CTX *ctx)
static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
{
MD5_u32plus saved_lo;
- unsigned long used;
+ unsigned long used, available;
saved_lo = ctx->lo;
ctx->lo = (saved_lo + size) & 0x1fffffff;
@@ -404,7 +403,7 @@ static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
used = saved_lo & 0x3f;
if(used) {
- unsigned long available = 64 - used;
+ available = 64 - used;
if(size < available) {
memcpy(&ctx->buffer[used], data, size);
@@ -546,23 +545,23 @@ MD5_context *Curl_MD5_init(const MD5_params *md5params)
return ctxt;
}
-CURLcode Curl_MD5_update(MD5_context *context,
- const unsigned char *data,
- unsigned int len)
+int Curl_MD5_update(MD5_context *context,
+ const unsigned char *data,
+ unsigned int len)
{
(*context->md5_hash->md5_update_func)(context->md5_hashctx, data, len);
- return CURLE_OK;
+ return 0;
}
-CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result)
+int Curl_MD5_final(MD5_context *context, unsigned char *result)
{
(*context->md5_hash->md5_final_func)(result, context->md5_hashctx);
free(context->md5_hashctx);
free(context);
- return CURLE_OK;
+ return 0;
}
#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/lib/memdebug.c b/lib/memdebug.c
index ede60094b..e3ac8edf7 100644
--- a/lib/memdebug.c
+++ b/lib/memdebug.c
@@ -114,8 +114,8 @@ void curl_dbg_memdebug(const char *logname)
curl_dbg_logfile = stderr;
#ifdef MEMDEBUG_LOG_SYNC
/* Flush the log file after every line so the log isn't lost in a crash */
- if(curl_dbg_logfile)
- setbuf(curl_dbg_logfile, (char *)NULL);
+ if(logfile)
+ setbuf(logfile, (char *)NULL);
#endif
}
}
@@ -306,8 +306,9 @@ void *curl_dbg_realloc(void *ptr, size_t wantedsize,
void curl_dbg_free(void *ptr, int line, const char *source)
{
+ struct memdebug *mem;
+
if(ptr) {
- struct memdebug *mem;
#ifdef __INTEL_COMPILER
# pragma warning(push)
diff --git a/lib/mime.c b/lib/mime.c
index 081e51e50..48147d4f5 100644
--- a/lib/mime.c
+++ b/lib/mime.c
@@ -29,8 +29,8 @@
#include "urldata.h"
#include "sendf.h"
-#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) || \
- !defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
+#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \
+ !defined(CURL_DISABLE_IMAP)
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
#include <libgen.h>
@@ -821,10 +821,8 @@ static size_t readback_part(curl_mimepart *part,
struct curl_slist *hdr = (struct curl_slist *) part->state.ptr;
switch(part->state.state) {
case MIMESTATE_BEGIN:
- mimesetstate(&part->state,
- (part->flags & MIME_BODY_ONLY)?
- MIMESTATE_BODY: MIMESTATE_CURLHEADERS,
- part->curlheaders);
+ mimesetstate(&part->state, part->flags & MIME_BODY_ONLY? MIMESTATE_BODY:
+ MIMESTATE_CURLHEADERS, part->curlheaders);
break;
case MIMESTATE_USERHEADERS:
if(!hdr) {
@@ -1135,8 +1133,6 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
const curl_mimepart *s;
CURLcode res = CURLE_OK;
- DEBUGASSERT(dst);
-
/* Duplicate content. */
switch(src->kind) {
case MIMEKIND_NONE:
@@ -1186,18 +1182,20 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
}
}
- if(!res) {
- /* Duplicate other fields. */
+ /* Duplicate other fields. */
+ if(dst != NULL)
dst->encoder = src->encoder;
+ else
+ res = CURLE_WRITE_ERROR;
+ if(!res)
res = curl_mime_type(dst, src->mimetype);
- }
if(!res)
res = curl_mime_name(dst, src->name);
if(!res)
res = curl_mime_filename(dst, src->filename);
/* If an error occurred, rollback. */
- if(res)
+ if(res && dst)
Curl_mime_cleanpart(dst);
return res;
@@ -1901,11 +1899,72 @@ CURLcode curl_mime_headers(curl_mimepart *part,
return CURLE_NOT_BUILT_IN;
}
+void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
+{
+ (void) part;
+ (void) easy;
+}
+
+void Curl_mime_cleanpart(curl_mimepart *part)
+{
+ (void) part;
+}
+
+CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
+{
+ (void) dst;
+ (void) src;
+ return CURLE_OK; /* Nothing to duplicate: always succeed. */
+}
+
+CURLcode Curl_mime_set_subparts(curl_mimepart *part,
+ curl_mime *subparts, int take_ownership)
+{
+ (void) part;
+ (void) subparts;
+ (void) take_ownership;
+ return CURLE_NOT_BUILT_IN;
+}
+
+CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
+ const char *contenttype,
+ const char *disposition,
+ enum mimestrategy strategy)
+{
+ (void) part;
+ (void) contenttype;
+ (void) disposition;
+ (void) strategy;
+ return CURLE_NOT_BUILT_IN;
+}
+
+curl_off_t Curl_mime_size(curl_mimepart *part)
+{
+ (void) part;
+ return (curl_off_t) -1;
+}
+
+size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream)
+{
+ (void) buffer;
+ (void) size;
+ (void) nitems;
+ (void) instream;
+ return 0;
+}
+
+CURLcode Curl_mime_rewind(curl_mimepart *part)
+{
+ (void) part;
+ return CURLE_NOT_BUILT_IN;
+}
+
+/* VARARGS2 */
CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...)
{
- (void)slp;
- (void)fmt;
+ (void) slp;
+ (void) fmt;
return CURLE_NOT_BUILT_IN;
}
-#endif /* if disabled */
+#endif /* !CURL_DISABLE_HTTP || !CURL_DISABLE_SMTP || !CURL_DISABLE_IMAP */
diff --git a/lib/mime.h b/lib/mime.h
index 3241fdc1f..0721c8ca4 100644
--- a/lib/mime.h
+++ b/lib/mime.h
@@ -22,8 +22,6 @@
*
***************************************************************************/
-#include "curl_setup.h"
-
#define MIME_RAND_BOUNDARY_CHARS 16 /* Nb. of random boundary chars. */
#define MAX_ENCODED_LINE_LENGTH 76 /* Maximum encoded line length. */
#define ENCODING_BUFFER_SIZE 256 /* Encoding temp buffers size. */
@@ -71,7 +69,7 @@ enum mimestrategy {
typedef struct {
const char * name; /* Encoding name. */
size_t (*encodefunc)(char *buffer, size_t size, bool ateof,
- curl_mimepart *part); /* Encoded read. */
+ curl_mimepart *part); /* Encoded read. */
curl_off_t (*sizefunc)(curl_mimepart *part); /* Encoded size. */
} mime_encoder;
@@ -127,10 +125,6 @@ struct curl_mimepart_s {
mime_encoder_state encstate; /* Data encoder state. */
};
-CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
-
-#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) || \
- !defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
/* Prototypes. */
void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy);
@@ -146,19 +140,7 @@ curl_off_t Curl_mime_size(curl_mimepart *part);
size_t Curl_mime_read(char *buffer, size_t size, size_t nitems,
void *instream);
CURLcode Curl_mime_rewind(curl_mimepart *part);
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
const char *Curl_mime_contenttype(const char *filename);
-#else
-/* if disabled */
-#define Curl_mime_initpart(x,y)
-#define Curl_mime_cleanpart(x)
-#define Curl_mime_duppart(x,y) CURLE_OK /* Nothing to duplicate. Succeed */
-#define Curl_mime_set_subparts(a,b,c) CURLE_NOT_BUILT_IN
-#define Curl_mime_prepare_headers(a,b,c,d) CURLE_NOT_BUILT_IN
-#define Curl_mime_size(x) (curl_off_t) -1
-#define Curl_mime_read NULL
-#define Curl_mime_rewind(x) ((void)x, CURLE_NOT_BUILT_IN)
-#endif
-
-
#endif /* HEADER_CURL_MIME_H */
diff --git a/lib/multi.c b/lib/multi.c
index 6dfe8842e..cc16924a3 100755..100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -41,6 +41,7 @@
#include "speedcheck.h"
#include "conncache.h"
#include "multihandle.h"
+#include "pipeline.h"
#include "sigpipe.h"
#include "vtls/vtls.h"
#include "connect.h"
@@ -71,6 +72,8 @@
static CURLMcode singlesocket(struct Curl_multi *multi,
struct Curl_easy *data);
+static int update_timer(struct Curl_multi *multi);
+
static CURLMcode add_next_timeout(struct curltime now,
struct Curl_multi *multi,
struct Curl_easy *d);
@@ -89,10 +92,12 @@ static const char * const statename[]={
"WAITPROXYCONNECT",
"SENDPROTOCONNECT",
"PROTOCONNECT",
+ "WAITDO",
"DO",
"DOING",
"DO_MORE",
"DO_DONE",
+ "WAITPERFORM",
"PERFORM",
"TOOFAST",
"DONE",
@@ -131,10 +136,12 @@ static void mstate(struct Curl_easy *data, CURLMstate state
NULL, /* WAITPROXYCONNECT */
NULL, /* SENDPROTOCONNECT */
NULL, /* PROTOCONNECT */
+ NULL, /* WAITDO */
Curl_connect_free, /* DO */
NULL, /* DOING */
NULL, /* DO_MORE */
NULL, /* DO_DONE */
+ NULL, /* WAITPERFORM */
NULL, /* PERFORM */
NULL, /* TOOFAST */
NULL, /* DONE */
@@ -187,7 +194,7 @@ static void mstate(struct Curl_easy *data, CURLMstate state
*/
struct Curl_sh_entry {
- struct curl_hash transfers; /* hash of transfers using this socket */
+ struct curl_llist list; /* list of easy handles using this socket */
unsigned int action; /* what combined action READ/WRITE this socket waits
for */
void *socketp; /* settable by users with curl_multi_assign() */
@@ -204,36 +211,12 @@ struct Curl_sh_entry {
static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
curl_socket_t s)
{
- if(s != CURL_SOCKET_BAD) {
+ if(s != CURL_SOCKET_BAD)
/* only look for proper sockets */
return Curl_hash_pick(sh, (char *)&s, sizeof(curl_socket_t));
- }
return NULL;
}
-#define TRHASH_SIZE 13
-static size_t trhash(void *key, size_t key_length, size_t slots_num)
-{
- size_t keyval = (size_t)*(struct Curl_easy **)key;
- (void) key_length;
-
- return (keyval % slots_num);
-}
-
-static size_t trhash_compare(void *k1, size_t k1_len, void *k2, size_t k2_len)
-{
- (void)k1_len;
- (void)k2_len;
-
- return *(struct Curl_easy **)k1 == *(struct Curl_easy **)k2;
-}
-
-static void trhash_dtor(void *nada)
-{
- (void)nada;
-}
-
-
/* make sure this socket is present in the hash for this handle */
static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
curl_socket_t s)
@@ -241,21 +224,16 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
struct Curl_sh_entry *there = sh_getentry(sh, s);
struct Curl_sh_entry *check;
- if(there) {
+ if(there)
/* it is present, return fine */
return there;
- }
/* not present, add it */
check = calloc(1, sizeof(struct Curl_sh_entry));
if(!check)
return NULL; /* major failure */
- if(Curl_hash_init(&check->transfers, TRHASH_SIZE, trhash,
- trhash_compare, trhash_dtor)) {
- free(check);
- return NULL;
- }
+ Curl_llist_init(&check->list, NULL);
/* make/add new hash entry */
if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) {
@@ -268,11 +246,8 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
/* delete the given socket + handle from the hash */
-static void sh_delentry(struct Curl_sh_entry *entry,
- struct curl_hash *sh, curl_socket_t s)
+static void sh_delentry(struct curl_hash *sh, curl_socket_t s)
{
- Curl_hash_destroy(&entry->transfers);
-
/* We remove the hash entry. This will end up in a call to
sh_freeentry(). */
Curl_hash_delete(sh, (char *)&s, sizeof(curl_socket_t));
@@ -341,6 +316,17 @@ static CURLMcode multi_addmsg(struct Curl_multi *multi,
return CURLM_OK;
}
+/*
+ * multi_freeamsg()
+ *
+ * Callback used by the llist system when a single list entry is destroyed.
+ */
+static void multi_freeamsg(void *a, void *b)
+{
+ (void)a;
+ (void)b;
+}
+
struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
int chashsize) /* connection hash */
{
@@ -360,10 +346,11 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
if(Curl_conncache_init(&multi->conn_cache, chashsize))
goto error;
- Curl_llist_init(&multi->msglist, NULL);
- Curl_llist_init(&multi->pending, NULL);
+ Curl_llist_init(&multi->msglist, multi_freeamsg);
+ Curl_llist_init(&multi->pending, multi_freeamsg);
- multi->multiplexing = TRUE;
+ multi->max_pipeline_length = 5;
+ multi->pipelining = CURLPIPE_MULTIPLEX;
/* -1 means it not set by user, use the default value */
multi->maxconnects = -1;
@@ -421,9 +408,19 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
/* set the easy handle */
multistate(data, CURLM_STATE_INIT);
+ if((data->set.global_dns_cache) &&
+ (data->dns.hostcachetype != HCACHE_GLOBAL)) {
+ /* global dns cache was requested but still isn't */
+ struct curl_hash *global = Curl_global_host_cache_init();
+ if(global) {
+ /* only do this if the global cache init works */
+ data->dns.hostcache = global;
+ data->dns.hostcachetype = HCACHE_GLOBAL;
+ }
+ }
/* for multi interface connections, we share DNS cache automatically if the
easy handle's one is currently not set. */
- if(!data->dns.hostcache ||
+ else if(!data->dns.hostcache ||
(data->dns.hostcachetype == HCACHE_NONE)) {
data->dns.hostcache = &multi->hostcache;
data->dns.hostcachetype = HCACHE_MULTI;
@@ -443,7 +440,12 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->psl = &multi->psl;
#endif
- /* We add the new entry last in the list. */
+ /* This adds the new entry at the 'end' of the doubly-linked circular
+ list of Curl_easy structs to try and maintain a FIFO queue so
+ the pipelined requests are in order. */
+
+ /* We add this new entry last in the list. */
+
data->next = NULL; /* end of the line */
if(multi->easyp) {
struct Curl_easy *last = multi->easylp;
@@ -474,16 +476,16 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
/* increase the alive-counter */
multi->num_alive++;
- /* A somewhat crude work-around for a little glitch in Curl_update_timer()
- that happens if the lastcall time is set to the same time when the handle
- is removed as when the next handle is added, as then the check in
- Curl_update_timer() that prevents calling the application multiple times
- with the same timer info will not trigger and then the new handle's
- timeout will not be notified to the app.
+ /* A somewhat crude work-around for a little glitch in update_timer() that
+ happens if the lastcall time is set to the same time when the handle is
+ removed as when the next handle is added, as then the check in
+ update_timer() that prevents calling the application multiple times with
+ the same timer info will not trigger and then the new handle's timeout
+ will not be notified to the app.
The work-around is thus simply to clear the 'lastcall' variable to force
- Curl_update_timer() to always trigger a callback to the app when a new
- easy handle is added */
+ update_timer() to always trigger a callback to the app when a new easy
+ handle is added */
memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
/* The closure handle only ever has default timeouts set. To improve the
@@ -495,8 +497,10 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->set.server_response_timeout;
data->state.conn_cache->closure_handle->set.no_signal =
data->set.no_signal;
+ data->state.conn_cache->closure_handle->set.verbose =
+ data->set.verbose;
- Curl_update_timer(multi);
+ update_timer(multi);
return CURLM_OK;
}
@@ -534,6 +538,8 @@ static CURLcode multi_done(struct Curl_easy *data,
/* Stop the resolver and free its own resources (but not dns_entry yet). */
Curl_resolver_kill(conn);
+ Curl_getoff_all_pipelines(data, conn);
+
/* Cleanup possible redirect junk */
Curl_safefree(data->req.newurl);
Curl_safefree(data->req.location);
@@ -567,12 +573,12 @@ static CURLcode multi_done(struct Curl_easy *data,
process_pending_handles(data->multi); /* connection / multiplex */
- detach_connnection(data);
- if(CONN_INUSE(conn)) {
- /* Stop if still used. */
- DEBUGF(infof(data, "Connection still in use %zu, "
+ if(conn->send_pipe.size || conn->recv_pipe.size) {
+ /* Stop if pipeline is not empty . */
+ detach_connnection(data);
+ DEBUGF(infof(data, "Connection still in use %zu/%zu, "
"no more multi_done now!\n",
- conn->easyq.size));
+ conn->send_pipe.size, conn->recv_pipe.size));
return CURLE_OK;
}
@@ -609,12 +615,12 @@ static CURLcode multi_done(struct Curl_easy *data,
if((data->set.reuse_forbid
#if defined(USE_NTLM)
- && !(conn->http_ntlm_state == NTLMSTATE_TYPE2 ||
- conn->proxy_ntlm_state == NTLMSTATE_TYPE2)
+ && !(conn->ntlm.state == NTLMSTATE_TYPE2 ||
+ conn->proxyntlm.state == NTLMSTATE_TYPE2)
#endif
#if defined(USE_SPNEGO)
- && !(conn->http_negotiate_state == GSS_AUTHRECV ||
- conn->proxy_negotiate_state == GSS_AUTHRECV)
+ && !(conn->negotiate.state == GSS_AUTHRECV ||
+ conn->proxyneg.state == GSS_AUTHRECV)
#endif
) || conn->bits.close
|| (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
@@ -646,6 +652,7 @@ static CURLcode multi_done(struct Curl_easy *data,
data->state.lastconnect = NULL;
}
+ detach_connnection(data);
Curl_free_request_state(data);
return result;
}
@@ -691,6 +698,9 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
/* Set connection owner so that the DONE function closes it. We can
safely do this here since connection is killed. */
data->conn->data = easy;
+ /* If the handle is in a pipeline and has started sending off its
+ request but not received its response yet, we need to close
+ connection. */
streamclose(data->conn, "Removed with partial response");
easy_owns_conn = TRUE;
}
@@ -713,6 +723,9 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
nothing really useful to do with it anyway! */
(void)multi_done(data, data->result, premature);
}
+ else
+ /* Clear connection pipelines, if multi_done above was not called */
+ Curl_getoff_all_pipelines(data, data->conn);
}
if(data->connect_queue.ptr)
@@ -786,23 +799,20 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
We do not touch the easy handle here! */
multi->num_easy--; /* one less to care about now */
- Curl_update_timer(multi);
+ update_timer(multi);
return CURLM_OK;
}
-/* Return TRUE if the application asked for multiplexing */
-bool Curl_multiplex_wanted(const struct Curl_multi *multi)
+/* Return TRUE if the application asked for a certain set of pipelining */
+bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
{
- return (multi && (multi->multiplexing));
+ return (multi && (multi->pipelining & bits)) ? TRUE : FALSE;
}
/* This is the only function that should clear data->conn. This will
occasionally be called with the pointer already cleared. */
static void detach_connnection(struct Curl_easy *data)
{
- struct connectdata *conn = data->conn;
- if(conn)
- Curl_llist_remove(&conn->easyq, &data->conn_queue, NULL);
data->conn = NULL;
}
@@ -811,34 +821,29 @@ void Curl_attach_connnection(struct Curl_easy *data,
struct connectdata *conn)
{
DEBUGASSERT(!data->conn);
- DEBUGASSERT(conn);
data->conn = conn;
- Curl_llist_insert_next(&conn->easyq, conn->easyq.tail, data,
- &data->conn_queue);
}
static int waitconnect_getsock(struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock,
+ int numsocks)
{
int i;
int s = 0;
int rc = 0;
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
#ifdef USE_SSL
if(CONNECT_FIRSTSOCKET_PROXY_SSL())
- return Curl_ssl_getsock(conn, sock);
+ return Curl_ssl_getsock(conn, sock, numsocks);
#endif
for(i = 0; i<2; i++) {
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
sock[s] = conn->tempsock[i];
- rc |= GETSOCK_WRITESOCK(s);
-#ifdef ENABLE_QUIC
- if(conn->transport == TRNSPRT_QUIC)
- /* when connecting QUIC, we want to read the socket too */
- rc |= GETSOCK_READSOCK(s);
-#endif
- s++;
+ rc |= GETSOCK_WRITESOCK(s++);
}
}
@@ -846,8 +851,12 @@ static int waitconnect_getsock(struct connectdata *conn,
}
static int waitproxyconnect_getsock(struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock,
+ int numsocks)
{
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
sock[0] = conn->sock[FIRSTSOCKET];
/* when we've sent a CONNECT to a proxy, we should rather wait for the
@@ -859,37 +868,19 @@ static int waitproxyconnect_getsock(struct connectdata *conn,
}
static int domore_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
if(conn && conn->handler->domore_getsock)
- return conn->handler->domore_getsock(conn, socks);
+ return conn->handler->domore_getsock(conn, socks, numsocks);
return GETSOCK_BLANK;
}
-static int doing_getsock(struct connectdata *conn,
- curl_socket_t *socks)
-{
- if(conn && conn->handler->doing_getsock)
- return conn->handler->doing_getsock(conn, socks);
- return GETSOCK_BLANK;
-}
-
-static int protocol_getsock(struct connectdata *conn,
- curl_socket_t *socks)
-{
- if(conn->handler->proto_getsock)
- return conn->handler->proto_getsock(conn, socks);
- /* Backup getsock logic. Since there is a live socket in use, we must wait
- for it or it will be removed from watching when the multi_socket API is
- used. */
- socks[0] = conn->sock[FIRSTSOCKET];
- return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
-}
-
-/* returns bitmapped flags for this handle and its sockets. The 'socks[]'
- array contains MAX_SOCKSPEREASYHANDLE entries. */
+/* returns bitmapped flags for this handle and its sockets */
static int multi_getsock(struct Curl_easy *data,
- curl_socket_t *socks)
+ curl_socket_t *socks, /* points to numsocks number
+ of sockets */
+ int numsocks)
{
/* The no connection case can happen when this is called from
curl_multi_remove_handle() => singlesocket() => multi_getsock().
@@ -921,30 +912,31 @@ static int multi_getsock(struct Curl_easy *data,
return 0;
case CURLM_STATE_WAITRESOLVE:
- return Curl_resolv_getsock(data->conn, socks);
+ return Curl_resolv_getsock(data->conn, socks, numsocks);
case CURLM_STATE_PROTOCONNECT:
case CURLM_STATE_SENDPROTOCONNECT:
- return protocol_getsock(data->conn, socks);
+ return Curl_protocol_getsock(data->conn, socks, numsocks);
case CURLM_STATE_DO:
case CURLM_STATE_DOING:
- return doing_getsock(data->conn, socks);
+ return Curl_doing_getsock(data->conn, socks, numsocks);
case CURLM_STATE_WAITPROXYCONNECT:
- return waitproxyconnect_getsock(data->conn, socks);
+ return waitproxyconnect_getsock(data->conn, socks, numsocks);
case CURLM_STATE_WAITCONNECT:
- return waitconnect_getsock(data->conn, socks);
+ return waitconnect_getsock(data->conn, socks, numsocks);
case CURLM_STATE_DO_MORE:
- return domore_getsock(data->conn, socks);
+ return domore_getsock(data->conn, socks, numsocks);
case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
to waiting for the same as the *PERFORM
states */
case CURLM_STATE_PERFORM:
- return Curl_single_getsock(data->conn, socks);
+ case CURLM_STATE_WAITPERFORM:
+ return Curl_single_getsock(data->conn, socks, numsocks);
}
}
@@ -970,7 +962,7 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
data = multi->easyp;
while(data) {
- int bitmap = multi_getsock(data, sockbunch);
+ int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -1000,12 +992,12 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
#define NUM_POLLS_ON_STACK 10
-static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *ret,
- bool extrawait) /* when no socket, wait */
+CURLMcode Curl_multi_wait(struct Curl_multi *multi,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret,
+ bool *gotsocket) /* if any socket was checked */
{
struct Curl_easy *data;
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
@@ -1019,6 +1011,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
struct pollfd *ufds = &a_few_on_stack[0];
+ if(gotsocket)
+ *gotsocket = FALSE;
+
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -1028,7 +1023,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
/* Count up how many fds we have from the multi handle */
data = multi->easyp;
while(data) {
- bitmap = multi_getsock(data, sockbunch);
+ bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -1078,7 +1073,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
/* Add the curl handles to our pollfds first */
data = multi->easyp;
while(data) {
- bitmap = multi_getsock(data, sockbunch);
+ bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
@@ -1147,19 +1142,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
free(ufds);
if(ret)
*ret = retcode;
- if(!extrawait || extra_fds || curlfds)
+ if(gotsocket && (extra_fds || curlfds))
/* if any socket was checked */
- ;
- else {
- long sleep_ms = 0;
-
- /* Avoid busy-looping when there's nothing particular to wait for */
- if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
- if(sleep_ms > timeout_ms)
- sleep_ms = timeout_ms;
- Curl_wait_ms((int)sleep_ms);
- }
- }
+ *gotsocket = TRUE;
return CURLM_OK;
}
@@ -1170,16 +1155,7 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
int timeout_ms,
int *ret)
{
- return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE);
-}
-
-CURLMcode curl_multi_poll(struct Curl_multi *multi,
- struct curl_waitfd extra_fds[],
- unsigned int extra_nfds,
- int timeout_ms,
- int *ret)
-{
- return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE);
+ return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, NULL);
}
/*
@@ -1227,7 +1203,7 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
* do_complete is called when the DO actions are complete.
*
* We init chunking and trailer bits to their default values here immediately
- * before receiving any header data for the current request.
+ * before receiving any header data for the current request in the pipeline.
*/
static void do_complete(struct connectdata *conn)
{
@@ -1240,9 +1216,6 @@ static CURLcode multi_do(struct Curl_easy *data, bool *done)
CURLcode result = CURLE_OK;
struct connectdata *conn = data->conn;
- DEBUGASSERT(conn);
- DEBUGASSERT(conn->handler);
-
if(conn->handler->do_it) {
/* generic protocol-specific function pointer set in curl_connect() */
result = conn->handler->do_it(conn, done);
@@ -1259,6 +1232,8 @@ static CURLcode multi_do(struct Curl_easy *data, bool *done)
* second stage DO state which (wrongly) was introduced to support FTP's
* second connection.
*
+ * TODO: A future libcurl should be able to work away this state.
+ *
* 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
* DOING state there's more work to do!
*/
@@ -1279,109 +1254,6 @@ static CURLcode multi_do_more(struct connectdata *conn, int *complete)
return result;
}
-/*
- * We are doing protocol-specific connecting and this is being called over and
- * over from the multi interface until the connection phase is done on
- * protocol layer.
- */
-
-static CURLcode protocol_connecting(struct connectdata *conn,
- bool *done)
-{
- CURLcode result = CURLE_OK;
-
- if(conn && conn->handler->connecting) {
- *done = FALSE;
- result = conn->handler->connecting(conn, done);
- }
- else
- *done = TRUE;
-
- return result;
-}
-
-/*
- * We are DOING this is being called over and over from the multi interface
- * until the DOING phase is done on protocol layer.
- */
-
-static CURLcode protocol_doing(struct connectdata *conn, bool *done)
-{
- CURLcode result = CURLE_OK;
-
- if(conn && conn->handler->doing) {
- *done = FALSE;
- result = conn->handler->doing(conn, done);
- }
- else
- *done = TRUE;
-
- return result;
-}
-
-/*
- * We have discovered that the TCP connection has been successful, we can now
- * proceed with some action.
- *
- */
-static CURLcode protocol_connect(struct connectdata *conn,
- bool *protocol_done)
-{
- CURLcode result = CURLE_OK;
-
- DEBUGASSERT(conn);
- DEBUGASSERT(protocol_done);
-
- *protocol_done = FALSE;
-
- if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
- /* We already are connected, get back. This may happen when the connect
- worked fine in the first call, like when we connect to a local server
- or proxy. Note that we don't know if the protocol is actually done.
-
- Unless this protocol doesn't have any protocol-connect callback, as
- then we know we're done. */
- if(!conn->handler->connecting)
- *protocol_done = TRUE;
-
- return CURLE_OK;
- }
-
- if(!conn->bits.protoconnstart) {
-
- result = Curl_proxy_connect(conn, FIRSTSOCKET);
- if(result)
- return result;
-
- if(CONNECT_FIRSTSOCKET_PROXY_SSL())
- /* wait for HTTPS proxy SSL initialization to complete */
- return CURLE_OK;
-
- if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
- Curl_connect_ongoing(conn))
- /* when using an HTTP tunnel proxy, await complete tunnel establishment
- before proceeding further. Return CURLE_OK so we'll be called again */
- return CURLE_OK;
-
- if(conn->handler->connect_it) {
- /* is there a protocol-specific connect() procedure? */
-
- /* Call the protocol-specific connect function */
- result = conn->handler->connect_it(conn, protocol_done);
- }
- else
- *protocol_done = TRUE;
-
- /* it has started, possibly even completed but that knowledge isn't stored
- in this bit! */
- if(!result)
- conn->bits.protoconnstart = TRUE;
- }
-
- return result; /* pass back status */
-}
-
-
static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct curltime now,
struct Curl_easy *data)
@@ -1389,11 +1261,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct Curl_message *msg = NULL;
bool connected;
bool async;
- bool protocol_connected = FALSE;
+ bool protocol_connect = FALSE;
bool dophase_done = FALSE;
bool done = FALSE;
CURLMcode rc;
CURLcode result = CURLE_OK;
+ struct SingleRequest *k;
timediff_t timeout_ms;
timediff_t recv_timeout_ms;
timediff_t send_timeout_ms;
@@ -1408,9 +1281,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
bool stream_error = FALSE;
rc = CURLM_OK;
- DEBUGASSERT((data->mstate <= CURLM_STATE_CONNECT) ||
- (data->mstate >= CURLM_STATE_DONE) ||
- data->conn);
if(!data->conn &&
data->mstate > CURLM_STATE_CONNECT &&
data->mstate < CURLM_STATE_DONE) {
@@ -1423,7 +1293,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(multi_ischanged(multi, TRUE)) {
DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n"));
- process_pending_handles(multi); /* multiplexed */
+ process_pending_handles(multi); /* pipelined/multiplexed */
}
if(data->conn && data->mstate > CURLM_STATE_CONNECT &&
@@ -1438,7 +1308,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* we need to wait for the connect state as only then is the start time
stored, but we must not check already completed handles */
timeout_ms = Curl_timeleft(data, &now,
- (data->mstate <= CURLM_STATE_DO)?
+ (data->mstate <= CURLM_STATE_WAITDO)?
TRUE:FALSE);
if(timeout_ms < 0) {
@@ -1452,7 +1322,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
" milliseconds",
Curl_timediff(now, data->progress.t_startsingle));
else {
- struct SingleRequest *k = &data->req;
+ k = &data->req;
if(k->size != -1) {
failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %"
@@ -1508,7 +1378,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(data->set.connecttimeout)
Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);
- result = Curl_connect(data, &async, &protocol_connected);
+ result = Curl_connect(data, &async, &protocol_connect);
if(CURLE_NO_CONNECTION_AVAILABLE == result) {
/* There was no connection available. We will go to the pending
state and wait for an available connection. */
@@ -1520,31 +1390,33 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
result = CURLE_OK;
break;
}
- else if(data->state.previouslypending) {
- /* this transfer comes from the pending queue so try move another */
- infof(data, "Transfer was pending, now try another\n");
- process_pending_handles(data->multi);
- }
if(!result) {
- if(async)
- /* We're now waiting for an asynchronous name lookup */
- multistate(data, CURLM_STATE_WAITRESOLVE);
+ /* Add this handle to the send or pend pipeline */
+ result = Curl_add_handle_to_pipeline(data, data->conn);
+ if(result)
+ stream_error = TRUE;
else {
- /* after the connect has been sent off, go WAITCONNECT unless the
- protocol connect is already done and we can go directly to
- WAITDO or DO! */
- rc = CURLM_CALL_MULTI_PERFORM;
-
- if(protocol_connected)
- multistate(data, CURLM_STATE_DO);
+ if(async)
+ /* We're now waiting for an asynchronous name lookup */
+ multistate(data, CURLM_STATE_WAITRESOLVE);
else {
+ /* after the connect has been sent off, go WAITCONNECT unless the
+ protocol connect is already done and we can go directly to
+ WAITDO or DO! */
+ rc = CURLM_CALL_MULTI_PERFORM;
+
+ if(protocol_connect)
+ multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
+ CURLM_STATE_WAITDO:CURLM_STATE_DO);
+ else {
#ifndef CURL_DISABLE_HTTP
- if(Curl_connect_ongoing(data->conn))
- multistate(data, CURLM_STATE_WAITPROXYCONNECT);
- else
+ if(Curl_connect_ongoing(data->conn))
+ multistate(data, CURLM_STATE_WAITPROXYCONNECT);
+ else
#endif
- multistate(data, CURLM_STATE_WAITCONNECT);
+ multistate(data, CURLM_STATE_WAITCONNECT);
+ }
}
}
}
@@ -1557,7 +1429,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct connectdata *conn = data->conn;
const char *hostname;
- DEBUGASSERT(conn);
if(conn->bits.httpproxy)
hostname = conn->http_proxy.host.name;
else if(conn->bits.conn_to_host)
@@ -1591,17 +1462,18 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(dns) {
/* Perform the next step in the connection phase, and then move on
to the WAITCONNECT state */
- result = Curl_once_resolved(data->conn, &protocol_connected);
+ result = Curl_once_resolved(data->conn, &protocol_connect);
if(result)
/* if Curl_once_resolved() returns failure, the connection struct
is already freed and gone */
- data->conn = NULL; /* no more connection */
+ detach_connnection(data); /* no more connection */
else {
/* call again please so that we get the next socket setup */
rc = CURLM_CALL_MULTI_PERFORM;
- if(protocol_connected)
- multistate(data, CURLM_STATE_DO);
+ if(protocol_connect)
+ multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
+ CURLM_STATE_WAITDO:CURLM_STATE_DO);
else {
#ifndef CURL_DISABLE_HTTP
if(Curl_connect_ongoing(data->conn))
@@ -1624,8 +1496,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
#ifndef CURL_DISABLE_HTTP
case CURLM_STATE_WAITPROXYCONNECT:
/* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
- DEBUGASSERT(data->conn);
- result = Curl_http_connect(data->conn, &protocol_connected);
+ result = Curl_http_connect(data->conn, &protocol_connect);
if(data->conn->bits.proxy_connect_closed) {
rc = CURLM_CALL_MULTI_PERFORM;
@@ -1650,7 +1521,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_WAITCONNECT:
/* awaiting a completion of an asynch TCP connect */
- DEBUGASSERT(data->conn);
result = Curl_is_connected(data->conn, FIRSTSOCKET, &connected);
if(connected && !result) {
#ifndef CURL_DISABLE_HTTP
@@ -1676,13 +1546,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break;
case CURLM_STATE_SENDPROTOCONNECT:
- result = protocol_connect(data->conn, &protocol_connected);
- if(!result && !protocol_connected)
+ result = Curl_protocol_connect(data->conn, &protocol_connect);
+ if(!result && !protocol_connect)
/* switch to waiting state */
multistate(data, CURLM_STATE_PROTOCONNECT);
else if(!result) {
/* protocol connect has completed, go WAITDO or DO */
- multistate(data, CURLM_STATE_DO);
+ multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
+ CURLM_STATE_WAITDO:CURLM_STATE_DO);
rc = CURLM_CALL_MULTI_PERFORM;
}
else if(result) {
@@ -1695,10 +1566,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_PROTOCONNECT:
/* protocol-specific connect phase */
- result = protocol_connecting(data->conn, &protocol_connected);
- if(!result && protocol_connected) {
+ result = Curl_protocol_connecting(data->conn, &protocol_connect);
+ if(!result && protocol_connect) {
/* after the connect has completed, go WAITDO or DO */
- multistate(data, CURLM_STATE_DO);
+ multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
+ CURLM_STATE_WAITDO:CURLM_STATE_DO);
rc = CURLM_CALL_MULTI_PERFORM;
}
else if(result) {
@@ -1709,6 +1581,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
break;
+ case CURLM_STATE_WAITDO:
+ /* Wait for our turn to DO when we're pipelining requests */
+ if(Curl_pipeline_checkget_write(data, data->conn)) {
+ /* Grabbed the channel */
+ multistate(data, CURLM_STATE_DO);
+ rc = CURLM_CALL_MULTI_PERFORM;
+ }
+ break;
+
case CURLM_STATE_DO:
if(data->set.connect_only) {
/* keep connection open for application to use the socket */
@@ -1725,7 +1606,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(!result) {
if(!dophase_done) {
-#ifndef CURL_DISABLE_FTP
/* some steps needed for wildcard matching */
if(data->state.wildcardmatch) {
struct WildcardData *wc = &data->wildcard;
@@ -1737,7 +1617,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break;
}
}
-#endif
/* DO was not completed in one function call, we must continue
DOING... */
multistate(data, CURLM_STATE_DOING);
@@ -1817,8 +1696,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_DOING:
/* we continue DOING until the DO phase is complete */
- DEBUGASSERT(data->conn);
- result = protocol_doing(data->conn, &dophase_done);
+ result = Curl_protocol_doing(data->conn,
+ &dophase_done);
if(!result) {
if(dophase_done) {
/* after DO, go DO_DONE or DO_MORE */
@@ -1840,9 +1719,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/*
* When we are connected, DO MORE and then go DO_DONE
*/
- DEBUGASSERT(data->conn);
result = multi_do_more(data->conn, &control);
+ /* No need to remove this handle from the send pipeline here since that
+ is done in multi_done() */
if(!result) {
if(control) {
/* if positive, advance to DO_DONE
@@ -1865,30 +1745,38 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break;
case CURLM_STATE_DO_DONE:
- DEBUGASSERT(data->conn);
- if(data->conn->bits.multiplex)
+ /* Move ourselves from the send to recv pipeline */
+ Curl_move_handle_from_send_to_recv_pipe(data, data->conn);
+
+ if(data->conn->bits.multiplex || data->conn->send_pipe.size)
/* Check if we can move pending requests to send pipe */
- process_pending_handles(multi); /* multiplexed */
+ process_pending_handles(multi); /* pipelined/multiplexed */
/* Only perform the transfer if there's a good socket to work with.
Having both BAD is a signal to skip immediately to DONE */
if((data->conn->sockfd != CURL_SOCKET_BAD) ||
(data->conn->writesockfd != CURL_SOCKET_BAD))
- multistate(data, CURLM_STATE_PERFORM);
+ multistate(data, CURLM_STATE_WAITPERFORM);
else {
-#ifndef CURL_DISABLE_FTP
if(data->state.wildcardmatch &&
((data->conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
- data->wildcard.state = CURLWC_DONE;
+ data->wildcard.state = CURLWC_DONE;
}
-#endif
multistate(data, CURLM_STATE_DONE);
}
rc = CURLM_CALL_MULTI_PERFORM;
break;
+ case CURLM_STATE_WAITPERFORM:
+ /* Wait for our turn to PERFORM */
+ if(Curl_pipeline_checkget_read(data, data->conn)) {
+ /* Grabbed the channel */
+ multistate(data, CURLM_STATE_PERFORM);
+ rc = CURLM_CALL_MULTI_PERFORM;
+ }
+ break;
+
case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */
- DEBUGASSERT(data->conn);
/* if both rates are within spec, resume transfer */
if(Curl_pgrsUpdate(data->conn))
result = CURLE_ABORTED_BY_CALLBACK;
@@ -1962,6 +1850,18 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* read/write data if it is ready to do so */
result = Curl_readwrite(data->conn, data, &done, &comeback);
+ k = &data->req;
+
+ if(!(k->keepon & KEEP_RECV)) {
+ /* We're done receiving */
+ Curl_pipeline_leave_read(data->conn);
+ }
+
+ if(!(k->keepon & KEEP_SEND)) {
+ /* We're done sending */
+ Curl_pipeline_leave_write(data->conn);
+ }
+
if(done || (result == CURLE_RECV_ERROR)) {
/* If CURLE_RECV_ERROR happens early enough, we assume it was a race
* condition and the server closed the re-used connection exactly when
@@ -1981,25 +1881,23 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
}
else if((CURLE_HTTP2_STREAM == result) &&
- Curl_h2_http_1_1_error(data->conn)) {
+ Curl_h2_http_1_1_error(data->conn)) {
CURLcode ret = Curl_retry_request(data->conn, &newurl);
- if(!ret) {
- infof(data, "Downgrades to HTTP/1.1!\n");
- data->set.httpversion = CURL_HTTP_VERSION_1_1;
- /* clear the error message bit too as we ignore the one we got */
- data->state.errorbuf = FALSE;
- if(!newurl)
- /* typically for HTTP_1_1_REQUIRED error on first flight */
- newurl = strdup(data->change.url);
- /* if we are to retry, set the result to OK and consider the request
- as done */
- retry = TRUE;
+ infof(data, "Forcing HTTP/1.1 for NTLM");
+ data->set.httpversion = CURL_HTTP_VERSION_1_1;
+
+ if(!ret)
+ retry = (newurl)?TRUE:FALSE;
+ else
+ result = ret;
+
+ if(retry) {
+ /* if we are to retry, set the result to OK and consider the
+ request as done */
result = CURLE_OK;
done = TRUE;
}
- else
- result = ret;
}
if(result) {
@@ -2024,6 +1922,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* call this even if the readwrite function returned error */
Curl_posttransfer(data);
+ /* we're no longer receiving */
+ Curl_removeHandleFromPipeline(data, &data->conn->recv_pipe);
+
+ /* expire the new receiving pipeline head */
+ if(data->conn->recv_pipe.head)
+ Curl_expire(data->conn->recv_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
+
/* When we follow redirects or is set to retry the connection, we must
to go back to the CONNECT state */
if(data->req.newurl || retry) {
@@ -2037,12 +1942,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
else
follow = FOLLOW_RETRY;
- (void)multi_done(data, CURLE_OK, FALSE);
- /* multi_done() might return CURLE_GOT_NOTHING */
- result = Curl_follow(data, newurl, follow);
+ result = multi_done(data, CURLE_OK, FALSE);
if(!result) {
- multistate(data, CURLM_STATE_CONNECT);
- rc = CURLM_CALL_MULTI_PERFORM;
+ result = Curl_follow(data, newurl, follow);
+ if(!result) {
+ multistate(data, CURLM_STATE_CONNECT);
+ rc = CURLM_CALL_MULTI_PERFORM;
+ }
}
free(newurl);
}
@@ -2081,9 +1987,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(data->conn) {
CURLcode res;
- if(data->conn->bits.multiplex)
+ /* Remove ourselves from the receive pipeline, if we are there. */
+ Curl_removeHandleFromPipeline(data, &data->conn->recv_pipe);
+
+ if(data->conn->bits.multiplex || data->conn->send_pipe.size)
/* Check if we can move pending requests to connection */
- process_pending_handles(multi); /* multiplexing */
+ process_pending_handles(multi); /* pipelined/multiplexing */
/* post-transfer command */
res = multi_done(data, result, FALSE);
@@ -2093,7 +2002,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
result = res;
/*
- * If there are other handles on the connection, multi_done won't set
+ * If there are other handles on the pipeline, multi_done won't set
* conn to NULL. In such a case, curl_multi_remove_handle() can
* access free'd data, if the connection is free'd and the handle
* removed before we perform the processing in CURLM_STATE_COMPLETED
@@ -2102,7 +2011,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
detach_connnection(data);
}
-#ifndef CURL_DISABLE_FTP
if(data->state.wildcardmatch) {
if(data->wildcard.state != CURLWC_DONE) {
/* if a wildcard is set and we are not ending -> lets start again
@@ -2111,7 +2019,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break;
}
}
-#endif
+
/* after we have DONE what we're supposed to do, go COMPLETED, and
it doesn't matter what the multi_done() returned! */
multistate(data, CURLM_STATE_COMPLETED);
@@ -2143,18 +2051,22 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
process_pending_handles(multi); /* connection */
if(data->conn) {
+ /* if this has a connection, unsubscribe from the pipelines */
+ Curl_pipeline_leave_write(data->conn);
+ Curl_pipeline_leave_read(data->conn);
+ Curl_removeHandleFromPipeline(data, &data->conn->send_pipe);
+ Curl_removeHandleFromPipeline(data, &data->conn->recv_pipe);
+
if(stream_error) {
/* Don't attempt to send data over a connection that timed out */
bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
- struct connectdata *conn = data->conn;
+ /* disconnect properly */
+ Curl_disconnect(data, data->conn, dead_connection);
/* This is where we make sure that the conn pointer is reset.
We don't have to do this in every case block above where a
failure is detected */
detach_connnection(data);
-
- /* disconnect properly */
- Curl_disconnect(data, conn, dead_connection);
}
}
else if(data->mstate == CURLM_STATE_CONNECT) {
@@ -2253,7 +2165,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
*running_handles = multi->num_alive;
if(CURLM_OK >= returncode)
- Curl_update_timer(multi);
+ update_timer(multi);
return returncode;
}
@@ -2305,6 +2217,12 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_hash_destroy(&multi->hostcache);
Curl_psl_destroy(&multi->psl);
+
+ /* Free the blacklists by setting them to NULL */
+ (void)Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl);
+ (void)Curl_pipeline_set_server_blacklist(NULL,
+ &multi->pipelining_server_bl);
+
free(multi);
return CURLM_OK;
@@ -2370,7 +2288,7 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
/* Fill in the 'current' struct with the state as it is now: what sockets to
supervise and for what actions */
- curraction = multi_getsock(data, socks);
+ curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
/* We have 0 .. N sockets already and we get to know about the 0 .. M
sockets we should have from now on. Detect the differences, remove no
@@ -2398,14 +2316,14 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
actions[i] = action;
if(entry) {
/* check if new for this transfer */
- int j;
- for(j = 0; j< data->numsocks; j++) {
- if(s == data->sockets[j]) {
- prevaction = data->actions[j];
+ for(i = 0; i< data->numsocks; i++) {
+ if(s == data->sockets[i]) {
+ prevaction = data->actions[i];
sincebefore = TRUE;
break;
}
}
+
}
else {
/* this is a socket we didn't have before, add it to the hash! */
@@ -2433,22 +2351,29 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
if(action & CURL_POLL_OUT)
entry->writers++;
- /* add 'data' to the transfer hash on this socket! */
- if(!Curl_hash_add(&entry->transfers, (char *)&data, /* hash key */
- sizeof(struct Curl_easy *), data))
- return CURLM_OUT_OF_MEMORY;
+ /* add 'data' to the list of handles using this socket! */
+ Curl_llist_insert_next(&entry->list, entry->list.tail,
+ data, &data->sh_queue);
}
comboaction = (entry->writers? CURL_POLL_OUT : 0) |
(entry->readers ? CURL_POLL_IN : 0);
- /* socket existed before and has the same action set as before */
- if(sincebefore && (entry->action == comboaction))
+#if 0
+ infof(data, "--- Comboaction: %u readers %u writers\n",
+ entry->readers, entry->writers);
+#endif
+ /* check if it has the same action set */
+ if(entry->action == comboaction)
/* same, continue */
continue;
+ /* we know (entry != NULL) at this point, see the logic above */
if(multi->socket_cb)
- multi->socket_cb(data, s, comboaction, multi->socket_userp,
+ multi->socket_cb(data,
+ s,
+ comboaction,
+ multi->socket_userp,
entry->socketp);
entry->action = comboaction; /* store the current action state */
@@ -2488,14 +2413,11 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
multi->socket_cb(data, s, CURL_POLL_REMOVE,
multi->socket_userp,
entry->socketp);
- sh_delentry(entry, &multi->sockhash, s);
+ sh_delentry(&multi->sockhash, s);
}
else {
- /* still users, but remove this handle as a user of this socket */
- if(Curl_hash_delete(&entry->transfers, (char *)&data,
- sizeof(struct Curl_easy *))) {
- DEBUGASSERT(NULL);
- }
+ /* remove this transfer as a user of this socket */
+ Curl_llist_remove(&entry->list, &data->sh_queue, NULL);
}
}
} /* for loop over numsocks */
@@ -2539,7 +2461,7 @@ void Curl_multi_closed(struct Curl_easy *data, curl_socket_t s)
entry->socketp);
/* now remove it from the socket hash */
- sh_delentry(entry, &multi->sockhash, s);
+ sh_delentry(&multi->sockhash, s);
}
}
}
@@ -2630,6 +2552,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
return result;
}
if(s != CURL_SOCKET_TIMEOUT) {
+
struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
if(!entry)
@@ -2640,22 +2563,50 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
and just move on. */
;
else {
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct curl_llist *list = &entry->list;
+ struct curl_llist_element *e;
+ SIGPIPE_VARIABLE(pipe_st);
/* the socket can be shared by many transfers, iterate */
- Curl_hash_start_iterate(&entry->transfers, &iter);
- for(he = Curl_hash_next_element(&iter); he;
- he = Curl_hash_next_element(&iter)) {
- data = (struct Curl_easy *)he->ptr;
- DEBUGASSERT(data);
- DEBUGASSERT(data->magic == CURLEASY_MAGIC_NUMBER);
+ for(e = list->head; e; e = e->next) {
+ data = (struct Curl_easy *)e->ptr;
+
+ if(data->magic != CURLEASY_MAGIC_NUMBER)
+ /* bad bad bad bad bad bad bad */
+ return CURLM_INTERNAL_ERROR;
+
+ /* If the pipeline is enabled, take the handle which is in the head of
+ the pipeline. If we should write into the socket, take the
+ send_pipe head. If we should read from the socket, take the
+ recv_pipe head. */
+ if(data->conn) {
+ if((ev_bitmask & CURL_POLL_OUT) &&
+ data->conn->send_pipe.head)
+ data = data->conn->send_pipe.head->ptr;
+ else if((ev_bitmask & CURL_POLL_IN) &&
+ data->conn->recv_pipe.head)
+ data = data->conn->recv_pipe.head->ptr;
+ }
if(data->conn && !(data->conn->handler->flags & PROTOPT_DIRLOCK))
/* set socket event bitmask if they're not locked */
data->conn->cselect_bits = ev_bitmask;
- Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ sigpipe_ignore(data, &pipe_st);
+ result = multi_runsingle(multi, now, data);
+ sigpipe_restore(&pipe_st);
+
+ if(data->conn && !(data->conn->handler->flags & PROTOPT_DIRLOCK))
+ /* clear the bitmask only if not locked */
+ data->conn->cselect_bits = 0;
+
+ if(CURLM_OK >= result) {
+ /* get the socket(s) and check if the state has been changed since
+ last */
+ result = singlesocket(multi, data);
+ if(result)
+ return result;
+ }
}
/* Now we fall-through and do the timer-based stuff, since we don't want
@@ -2670,10 +2621,9 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
}
else {
/* Asked to run due to time-out. Clear the 'lastcall' variable to force
- Curl_update_timer() to trigger a callback to the app again even if the
- same timeout is still the one to run after this call. That handles the
- case when the application asks libcurl to run the timeout
- prematurely. */
+ update_timer() to trigger a callback to the app again even if the same
+ timeout is still the one to run after this call. That handles the case
+ when the application asks libcurl to run the timeout prematurely. */
memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
}
@@ -2744,7 +2694,7 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
multi->push_userp = va_arg(param, void *);
break;
case CURLMOPT_PIPELINING:
- multi->multiplexing = va_arg(param, long) & CURLPIPE_MULTIPLEX;
+ multi->pipelining = va_arg(param, long) & CURLPIPE_MULTIPLEX;
break;
case CURLMOPT_TIMERFUNCTION:
multi->timer_cb = va_arg(param, curl_multi_timer_callback);
@@ -2758,29 +2708,25 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
case CURLMOPT_MAX_HOST_CONNECTIONS:
multi->max_host_connections = va_arg(param, long);
break;
- case CURLMOPT_MAX_TOTAL_CONNECTIONS:
- multi->max_total_connections = va_arg(param, long);
- break;
- /* options formerly used for pipelining */
case CURLMOPT_MAX_PIPELINE_LENGTH:
+ multi->max_pipeline_length = va_arg(param, long);
break;
case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
+ multi->content_length_penalty_size = va_arg(param, long);
break;
case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
+ multi->chunk_length_penalty_size = va_arg(param, long);
break;
case CURLMOPT_PIPELINING_SITE_BL:
+ res = Curl_pipeline_set_site_blacklist(va_arg(param, char **),
+ &multi->pipelining_site_bl);
break;
case CURLMOPT_PIPELINING_SERVER_BL:
+ res = Curl_pipeline_set_server_blacklist(va_arg(param, char **),
+ &multi->pipelining_server_bl);
break;
- case CURLMOPT_MAX_CONCURRENT_STREAMS:
- {
- long streams = va_arg(param, long);
- if(streams < 1)
- streams = 100;
- multi->max_concurrent_streams =
- (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
- (long)INITIAL_MAX_CONCURRENT_STREAMS : streams;
- }
+ case CURLMOPT_MAX_TOTAL_CONNECTIONS:
+ multi->max_total_connections = va_arg(param, long);
break;
default:
res = CURLM_UNKNOWN_OPTION;
@@ -2801,7 +2747,7 @@ CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s,
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, FALSE, s, 0, running_handles);
if(CURLM_OK >= result)
- Curl_update_timer(multi);
+ update_timer(multi);
return result;
}
@@ -2813,7 +2759,7 @@ CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s,
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, FALSE, s, ev_bitmask, running_handles);
if(CURLM_OK >= result)
- Curl_update_timer(multi);
+ update_timer(multi);
return result;
}
@@ -2825,7 +2771,7 @@ CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
return CURLM_RECURSIVE_API_CALL;
result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, running_handles);
if(CURLM_OK >= result)
- Curl_update_timer(multi);
+ update_timer(multi);
return result;
}
@@ -2885,14 +2831,14 @@ CURLMcode curl_multi_timeout(struct Curl_multi *multi,
* Tell the application it should update its timers, if it subscribes to the
* update timer callback.
*/
-void Curl_update_timer(struct Curl_multi *multi)
+static int update_timer(struct Curl_multi *multi)
{
long timeout_ms;
if(!multi->timer_cb)
- return;
+ return 0;
if(multi_timeout(multi, &timeout_ms)) {
- return;
+ return -1;
}
if(timeout_ms < 0) {
static const struct curltime none = {0, 0};
@@ -2900,10 +2846,9 @@ void Curl_update_timer(struct Curl_multi *multi)
multi->timer_lastcall = none;
/* there's no timeout now but there was one previously, tell the app to
disable it */
- multi->timer_cb(multi, -1, multi->timer_userp);
- return;
+ return multi->timer_cb(multi, -1, multi->timer_userp);
}
- return;
+ return 0;
}
/* When multi_timeout() is done, multi->timetree points to the node with the
@@ -2911,11 +2856,11 @@ void Curl_update_timer(struct Curl_multi *multi)
* if this is the same (fixed) time as we got in a previous call and then
* avoid calling the callback again. */
if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0)
- return;
+ return 0;
multi->timer_lastcall = multi->timetree->key;
- multi->timer_cb(multi, timeout_ms, multi->timer_userp);
+ return multi->timer_cb(multi, timeout_ms, multi->timer_userp);
}
/*
@@ -2992,7 +2937,7 @@ multi_addtimeout(struct Curl_easy *data,
*
* Expire replaces a former timeout using the same id if already set.
*/
-void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id id)
+void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
{
struct Curl_multi *multi = data->multi;
struct curltime *nowp = &data->state.expiretime;
@@ -3006,7 +2951,7 @@ void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id id)
DEBUGASSERT(id < EXPIRE_LAST);
set = Curl_now();
- set.tv_sec += (time_t)(milli/1000); /* might be a 64 to 32 bit conversion */
+ set.tv_sec += milli/1000;
set.tv_usec += (unsigned int)(milli%1000)*1000;
if(set.tv_usec >= 1000000) {
@@ -3134,20 +3079,24 @@ size_t Curl_multi_max_total_connections(struct Curl_multi *multi)
return multi ? multi->max_total_connections : 0;
}
-/*
- * When information about a connection has appeared, call this!
- */
+curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi)
+{
+ return multi ? multi->content_length_penalty_size : 0;
+}
-void Curl_multiuse_state(struct connectdata *conn,
- int bundlestate) /* use BUNDLE_* defines */
+curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
{
- DEBUGASSERT(conn);
- DEBUGASSERT(conn->bundle);
- DEBUGASSERT(conn->data);
- DEBUGASSERT(conn->data->multi);
+ return multi ? multi->chunk_length_penalty_size : 0;
+}
- conn->bundle->multiuse = bundlestate;
- process_pending_handles(conn->data->multi);
+struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
+{
+ return &multi->pipelining_site_bl;
+}
+
+struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
+{
+ return &multi->pipelining_server_bl;
}
static void process_pending_handles(struct Curl_multi *multi)
@@ -3165,9 +3114,6 @@ static void process_pending_handles(struct Curl_multi *multi)
/* Make sure that the handle will be processed soonish. */
Curl_expire(data, 0, EXPIRE_RUN_NOW);
-
- /* mark this as having been in the pending queue */
- data->state.previouslypending = TRUE;
}
}
@@ -3211,8 +3157,8 @@ void Curl_multi_dump(struct Curl_multi *multi)
continue;
}
fprintf(stderr, "[%s %s] ",
- (entry->action&CURL_POLL_IN)?"RECVING":"",
- (entry->action&CURL_POLL_OUT)?"SENDING":"");
+ entry->action&CURL_POLL_IN?"RECVING":"",
+ entry->action&CURL_POLL_OUT?"SENDING":"");
}
if(data->numsocks)
fprintf(stderr, "\n");
@@ -3220,9 +3166,3 @@ void Curl_multi_dump(struct Curl_multi *multi)
}
}
#endif
-
-size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi)
-{
- return multi ? ((size_t)multi->max_concurrent_streams ?
- (size_t)multi->max_concurrent_streams : 100) : 0;
-}
diff --git a/lib/multihandle.h b/lib/multihandle.h
index b65bd9638..ea2bf352d 100644
--- a/lib/multihandle.h
+++ b/lib/multihandle.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,16 +46,18 @@ typedef enum {
CURLM_STATE_SENDPROTOCONNECT, /* 6 - initiate protocol connect procedure */
CURLM_STATE_PROTOCONNECT, /* 7 - completing the protocol-specific connect
phase */
- CURLM_STATE_DO, /* 8 - start send off the request (part 1) */
- CURLM_STATE_DOING, /* 9 - sending off the request (part 1) */
- CURLM_STATE_DO_MORE, /* 10 - send off the request (part 2) */
- CURLM_STATE_DO_DONE, /* 11 - done sending off request */
- CURLM_STATE_PERFORM, /* 12 - transfer data */
- CURLM_STATE_TOOFAST, /* 13 - wait because limit-rate exceeded */
- CURLM_STATE_DONE, /* 14 - post data transfer operation */
- CURLM_STATE_COMPLETED, /* 15 - operation complete */
- CURLM_STATE_MSGSENT, /* 16 - the operation complete message is sent */
- CURLM_STATE_LAST /* 17 - not a true state, never use this */
+ CURLM_STATE_WAITDO, /* 8 - wait for our turn to send the request */
+ CURLM_STATE_DO, /* 9 - start send off the request (part 1) */
+ CURLM_STATE_DOING, /* 10 - sending off the request (part 1) */
+ CURLM_STATE_DO_MORE, /* 11 - send off the request (part 2) */
+ CURLM_STATE_DO_DONE, /* 12 - done sending off request */
+ CURLM_STATE_WAITPERFORM, /* 13 - wait for our turn to read the response */
+ CURLM_STATE_PERFORM, /* 14 - transfer data */
+ CURLM_STATE_TOOFAST, /* 15 - wait because limit-rate exceeded */
+ CURLM_STATE_DONE, /* 16 - post data transfer operation */
+ CURLM_STATE_COMPLETED, /* 17 - operation complete */
+ CURLM_STATE_MSGSENT, /* 18 - the operation complete message is sent */
+ CURLM_STATE_LAST /* 19 - not a true state, never use this */
} CURLMstate;
/* we support N sockets per easy handle. Set the corresponding bit to what
@@ -64,7 +66,7 @@ typedef enum {
#define GETSOCK_READABLE (0x00ff)
#define GETSOCK_WRITABLE (0xff00)
-#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
+#define CURLPIPE_ANY (CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX)
/* This is the struct known as CURLM on the outside */
struct Curl_multi {
@@ -110,8 +112,8 @@ struct Curl_multi {
same actual socket) */
struct curl_hash sockhash;
- /* multiplexing wanted */
- bool multiplexing;
+ /* pipelining wanted bits (CURLPIPE*) */
+ long pipelining;
bool recheckstate; /* see Curl_multi_connchanged */
@@ -127,13 +129,30 @@ struct Curl_multi {
long max_total_connections; /* if >0, a fixed limit of the maximum number
of connections in total */
+ long max_pipeline_length; /* if >0, maximum number of requests in a
+ pipeline */
+
+ long content_length_penalty_size; /* a connection with a
+ content-length bigger than
+ this is not considered
+ for pipelining */
+
+ long chunk_length_penalty_size; /* a connection with a chunk length
+ bigger than this is not
+ considered for pipelining */
+
+ struct curl_llist pipelining_site_bl; /* List of sites that are blacklisted
+ from pipelining */
+
+ struct curl_llist pipelining_server_bl; /* List of server types that are
+ blacklisted from pipelining */
+
/* timer callback and user data pointer for the *socket() API */
curl_multi_timer_callback timer_cb;
void *timer_userp;
struct curltime timer_lastcall; /* the fixed time for the timeout for the
previous callback */
bool in_callback; /* true while executing a callback */
- long max_concurrent_streams; /* max concurrent streams client to support */
};
#endif /* HEADER_CURL_MULTIHANDLE_H */
diff --git a/lib/multiif.h b/lib/multiif.h
index 75025232c..ed35ef427 100644
--- a/lib/multiif.h
+++ b/lib/multiif.h
@@ -27,13 +27,13 @@
*/
void Curl_updatesocket(struct Curl_easy *data);
-void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id);
+void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
void Curl_expire_done(struct Curl_easy *data, expire_id id);
-void Curl_update_timer(struct Curl_multi *multi);
+bool Curl_pipeline_wanted(const struct Curl_multi* multi, int bits);
+void Curl_detach_connnection(struct Curl_easy *data);
void Curl_attach_connnection(struct Curl_easy *data,
struct connectdata *conn);
-bool Curl_multiplex_wanted(const struct Curl_multi *multi);
void Curl_set_in_callback(struct Curl_easy *data, bool value);
bool Curl_is_in_callback(struct Curl_easy *easy);
@@ -64,11 +64,22 @@ void Curl_multi_dump(struct Curl_multi *multi);
/* Return the value of the CURLMOPT_MAX_HOST_CONNECTIONS option */
size_t Curl_multi_max_host_connections(struct Curl_multi *multi);
+/* Return the value of the CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE option */
+curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi);
+
+/* Return the value of the CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE option */
+curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi);
+
+/* Return the value of the CURLMOPT_PIPELINING_SITE_BL option */
+struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi);
+
+/* Return the value of the CURLMOPT_PIPELINING_SERVER_BL option */
+struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi);
+
/* Return the value of the CURLMOPT_MAX_TOTAL_CONNECTIONS option */
size_t Curl_multi_max_total_connections(struct Curl_multi *multi);
-void Curl_multiuse_state(struct connectdata *conn,
- int bundlestate); /* use BUNDLE_* defines */
+void Curl_multi_connchanged(struct Curl_multi *multi);
/*
* Curl_multi_closed()
@@ -89,10 +100,11 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
struct Curl_easy *data,
struct connectdata *conn);
-
-/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option
- * If not specified or 0, default would be 100
- */
-size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi);
+CURLMcode Curl_multi_wait(struct Curl_multi *multi,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret,
+ bool *gotsocket); /* if any socket was checked */
#endif /* HEADER_CURL_MULTIIF_H */
diff --git a/lib/netrc.c b/lib/netrc.c
index 1c9da3199..aba355b76 100644
--- a/lib/netrc.c
+++ b/lib/netrc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,7 +21,6 @@
***************************************************************************/
#include "curl_setup.h"
-#ifndef CURL_DISABLE_NETRC
#ifdef HAVE_PWD_H
#include <pwd.h>
@@ -45,27 +44,27 @@ enum host_lookup_state {
HOSTVALID /* this is "our" machine! */
};
-#define NETRC_FILE_MISSING 1
-#define NETRC_FAILED -1
-#define NETRC_SUCCESS 0
-
/*
- * Returns zero on success.
+ * @unittest: 1304
+ *
+ * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
+ * in.
*/
-static int parsenetrc(const char *host,
- char **loginp,
- char **passwordp,
- bool *login_changed,
- bool *password_changed,
- char *netrcfile)
+int Curl_parsenetrc(const char *host,
+ char **loginp,
+ char **passwordp,
+ bool *login_changed,
+ bool *password_changed,
+ char *netrcfile)
{
FILE *file;
- int retcode = NETRC_FILE_MISSING;
+ int retcode = 1;
char *login = *loginp;
char *password = *passwordp;
bool specific_login = (login && *login != 0);
bool login_alloc = FALSE;
bool password_alloc = FALSE;
+ bool netrc_alloc = FALSE;
enum host_lookup_state state = NOTHING;
char state_login = 0; /* Found a login keyword */
@@ -73,9 +72,51 @@ static int parsenetrc(const char *host,
int state_our_login = FALSE; /* With specific_login, found *our* login
name */
- DEBUGASSERT(netrcfile);
+#define NETRC DOT_CHAR "netrc"
+
+ if(!netrcfile) {
+ bool home_alloc = FALSE;
+ char *home = curl_getenv("HOME"); /* portable environment reader */
+ if(home) {
+ home_alloc = TRUE;
+#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
+ }
+ else {
+ struct passwd pw, *pw_res;
+ char pwbuf[1024];
+ if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
+ && pw_res) {
+ home = strdup(pw.pw_dir);
+ if(!home)
+ return CURLE_OUT_OF_MEMORY;
+ home_alloc = TRUE;
+ }
+#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
+ }
+ else {
+ struct passwd *pw;
+ pw = getpwuid(geteuid());
+ if(pw) {
+ home = pw->pw_dir;
+ }
+#endif
+ }
+
+ if(!home)
+ return retcode; /* no home directory found (or possibly out of memory) */
+
+ netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC);
+ if(home_alloc)
+ free(home);
+ if(!netrcfile) {
+ return -1;
+ }
+ netrc_alloc = TRUE;
+ }
file = fopen(netrcfile, FOPEN_READTEXT);
+ if(netrc_alloc)
+ free(netrcfile);
if(file) {
char *tok;
char *tok_buf;
@@ -88,7 +129,7 @@ static int parsenetrc(const char *host,
if(tok && *tok == '#')
/* treat an initial hash as a comment line */
continue;
- while(tok) {
+ while(!done && tok) {
if((login && *login) && (password && *password)) {
done = TRUE;
@@ -106,14 +147,14 @@ static int parsenetrc(const char *host,
}
else if(strcasecompare("default", tok)) {
state = HOSTVALID;
- retcode = NETRC_SUCCESS; /* we did find our host */
+ retcode = 0; /* we did find our host */
}
break;
case HOSTFOUND:
if(strcasecompare(host, tok)) {
/* and yes, this is our host! */
state = HOSTVALID;
- retcode = NETRC_SUCCESS; /* we did find our host */
+ retcode = 0; /* we did find our host */
}
else
/* not our host */
@@ -132,7 +173,7 @@ static int parsenetrc(const char *host,
}
login = strdup(tok);
if(!login) {
- retcode = NETRC_FAILED; /* allocation failed */
+ retcode = -1; /* allocation failed */
goto out;
}
login_alloc = TRUE;
@@ -148,7 +189,7 @@ static int parsenetrc(const char *host,
}
password = strdup(tok);
if(!password) {
- retcode = NETRC_FAILED; /* allocation failed */
+ retcode = -1; /* allocation failed */
goto out;
}
password_alloc = TRUE;
@@ -173,7 +214,6 @@ static int parsenetrc(const char *host,
out:
if(!retcode) {
- /* success */
*login_changed = FALSE;
*password_changed = FALSE;
if(login_alloc) {
@@ -200,79 +240,3 @@ static int parsenetrc(const char *host,
return retcode;
}
-
-/*
- * @unittest: 1304
- *
- * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
- * in.
- */
-int Curl_parsenetrc(const char *host,
- char **loginp,
- char **passwordp,
- bool *login_changed,
- bool *password_changed,
- char *netrcfile)
-{
- int retcode = 1;
- char *filealloc = NULL;
-
- if(!netrcfile) {
- char *home = NULL;
- char *homea = curl_getenv("HOME"); /* portable environment reader */
- if(homea) {
- home = homea;
-#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
- }
- else {
- struct passwd pw, *pw_res;
- char pwbuf[1024];
- if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
- && pw_res) {
- home = pw.pw_dir;
- }
-#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
- }
- else {
- struct passwd *pw;
- pw = getpwuid(geteuid());
- if(pw) {
- home = pw->pw_dir;
- }
-#endif
- }
-
- if(!home)
- return retcode; /* no home directory found (or possibly out of
- memory) */
-
- filealloc = curl_maprintf("%s%s.netrc", home, DIR_CHAR);
- if(!filealloc) {
- free(homea);
- return -1;
- }
- retcode = parsenetrc(host, loginp, passwordp, login_changed,
- password_changed, filealloc);
- free(filealloc);
-#ifdef WIN32
- if(retcode == NETRC_FILE_MISSING) {
- /* fallback to the old-style "_netrc" file */
- filealloc = curl_maprintf("%s%s_netrc", home, DIR_CHAR);
- if(!filealloc) {
- free(homea);
- return -1;
- }
- retcode = parsenetrc(host, loginp, passwordp, login_changed,
- password_changed, filealloc);
- free(filealloc);
- }
-#endif
- free(homea);
- }
- else
- retcode = parsenetrc(host, loginp, passwordp, login_changed,
- password_changed, netrcfile);
- return retcode;
-}
-
-#endif
diff --git a/lib/netrc.h b/lib/netrc.h
index 7f56c4b4d..fe3dc357e 100644
--- a/lib/netrc.h
+++ b/lib/netrc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,9 +22,6 @@
*
***************************************************************************/
-#include "curl_setup.h"
-#ifndef CURL_DISABLE_NETRC
-
/* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */
int Curl_parsenetrc(const char *host,
char **loginp,
@@ -37,9 +34,5 @@ int Curl_parsenetrc(const char *host,
* section in the netrc.
* If (*loginp)[0] != 0, search for password within machine and login.
*/
-#else
-/* disabled */
-#define Curl_parsenetrc(a,b,c,d,e,f) 1
-#endif
#endif /* HEADER_CURL_NETRC_H */
diff --git a/lib/non-ascii.c b/lib/non-ascii.c
index a48e67db4..42beaec45 100644
--- a/lib/non-ascii.c
+++ b/lib/non-ascii.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/openldap.c b/lib/openldap.c
index 734ca5fa0..a98c50b46 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -151,7 +151,7 @@ static const char *url_errs[] = {
"bad or missing extensions"
};
-struct ldapconninfo {
+typedef struct ldapconninfo {
LDAP *ld;
Curl_recv *recv; /* for stacking SSL handler */
Curl_send *send;
@@ -160,7 +160,7 @@ struct ldapconninfo {
bool ssldone;
bool sslinst;
bool didbind;
-};
+} ldapconninfo;
typedef struct ldapreqinfo {
int msgid;
@@ -169,7 +169,7 @@ typedef struct ldapreqinfo {
static CURLcode ldap_setup_connection(struct connectdata *conn)
{
- struct ldapconninfo *li;
+ ldapconninfo *li;
LDAPURLDesc *lud;
struct Curl_easy *data = conn->data;
int rc, proto;
@@ -190,12 +190,15 @@ static CURLcode ldap_setup_connection(struct connectdata *conn)
proto = ldap_pvt_url_scheme2proto(lud->lud_scheme);
ldap_free_urldesc(lud);
- li = calloc(1, sizeof(struct ldapconninfo));
+ li = calloc(1, sizeof(ldapconninfo));
if(!li)
return CURLE_OUT_OF_MEMORY;
li->proto = proto;
- conn->proto.ldapc = li;
+ conn->proto.generic = li;
connkeep(conn, "OpenLDAP default");
+ /* TODO:
+ * - provide option to choose SASL Binds instead of Simple
+ */
return CURLE_OK;
}
@@ -205,7 +208,7 @@ static Sockbuf_IO ldapsb_tls;
static CURLcode ldap_connect(struct connectdata *conn, bool *done)
{
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
struct Curl_easy *data = conn->data;
int rc, proto = LDAP_VERSION3;
char hosturl[1024];
@@ -252,7 +255,7 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)
static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
{
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
struct Curl_easy *data = conn->data;
LDAPMessage *msg = NULL;
struct timeval tv = {0, 1}, *tvp;
@@ -357,7 +360,7 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
{
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
(void) dead_connection;
if(li) {
@@ -365,7 +368,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
ldap_unbind_ext(li->ld, NULL, NULL);
li->ld = NULL;
}
- conn->proto.ldapc = NULL;
+ conn->proto.generic = NULL;
free(li);
}
return CURLE_OK;
@@ -373,7 +376,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
static CURLcode ldap_do(struct connectdata *conn, bool *done)
{
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
ldapreqinfo *lr;
CURLcode status = CURLE_OK;
int rc = 0;
@@ -427,7 +430,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
if(lr) {
/* if there was a search in progress, abandon it */
if(lr->msgid) {
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);
lr->msgid = 0;
}
@@ -441,7 +444,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
size_t len, CURLcode *err)
{
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
struct Curl_easy *data = conn->data;
ldapreqinfo *lr = data->req.protop;
int rc, ret;
@@ -507,6 +510,8 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
lr->nument++;
rc = ldap_get_dn_ber(li->ld, ent, &ber, &bv);
if(rc < 0) {
+ /* TODO: verify that this is really how this return code should be
+ handled */
*err = CURLE_RECV_ERROR;
return -1;
}
@@ -718,7 +723,7 @@ static ber_slen_t
ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
struct connectdata *conn = sbiod->sbiod_pvt;
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
ber_slen_t ret;
CURLcode err = CURLE_RECV_ERROR;
@@ -733,7 +738,7 @@ static ber_slen_t
ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
struct connectdata *conn = sbiod->sbiod_pvt;
- struct ldapconninfo *li = conn->proto.ldapc;
+ ldapconninfo *li = conn->proto.generic;
ber_slen_t ret;
CURLcode err = CURLE_SEND_ERROR;
diff --git a/lib/parsedate.c b/lib/parsedate.c
index f4b18d091..3d3c00b4f 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -82,6 +82,20 @@
#include "warnless.h"
#include "parsedate.h"
+const char * const Curl_wkday[] =
+{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
+static const char * const weekday[] =
+{ "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday", "Sunday" };
+const char * const Curl_month[]=
+{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+struct tzinfo {
+ char name[5];
+ int offset; /* +/- in minutes */
+};
+
/*
* parsedate()
*
@@ -100,26 +114,6 @@ static int parsedate(const char *date, time_t *output);
#define PARSEDATE_LATER 1
#define PARSEDATE_SOONER 2
-#if !defined(CURL_DISABLE_PARSEDATE) || !defined(CURL_DISABLE_FTP) || \
- !defined(CURL_DISABLE_FILE)
-/* These names are also used by FTP and FILE code */
-const char * const Curl_wkday[] =
-{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
-const char * const Curl_month[]=
-{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-#endif
-
-#ifndef CURL_DISABLE_PARSEDATE
-static const char * const weekday[] =
-{ "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday", "Sunday" };
-
-struct tzinfo {
- char name[5];
- int offset; /* +/- in minutes */
-};
-
/* Here's a bunch of frequently used time zone names. These were supported
by the old getdate parser. */
#define tDAYZONE -60 /* offset for daylight savings time */
@@ -561,15 +555,6 @@ static int parsedate(const char *date, time_t *output)
return PARSEDATE_OK;
}
-#else
-/* disabled */
-static int parsedate(const char *date, time_t *output)
-{
- (void)date;
- *output = 0;
- return PARSEDATE_OK; /* a lie */
-}
-#endif
time_t curl_getdate(const char *p, const time_t *now)
{
diff --git a/lib/pingpong.c b/lib/pingpong.c
index d0710053b..e9568ee3d 100644
--- a/lib/pingpong.c
+++ b/lib/pingpong.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -60,12 +60,12 @@ time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
/* Without a requested timeout, we only wait 'response_time' seconds for the
full response to arrive before we bail out */
timeout_ms = response_time -
- (time_t)Curl_timediff(Curl_now(), pp->response); /* spent time */
+ Curl_timediff(Curl_now(), pp->response); /* spent time */
if(data->set.timeout && !disconnecting) {
/* if timeout is requested, find out how much remaining time we have */
time_t timeout2_ms = data->set.timeout - /* timeout time */
- (time_t)Curl_timediff(Curl_now(), conn->now); /* spent time */
+ Curl_timediff(Curl_now(), conn->now); /* spent time */
/* pick the lowest number */
timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
@@ -463,9 +463,14 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
}
int Curl_pp_getsock(struct pingpong *pp,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
struct connectdata *conn = pp->conn;
+
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
socks[0] = conn->sock[FIRSTSOCKET];
if(pp->sendleft) {
diff --git a/lib/pingpong.h b/lib/pingpong.h
index 849a7c0ff..dbe1f8d3d 100644
--- a/lib/pingpong.h
+++ b/lib/pingpong.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -135,7 +135,8 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp);
/* call this when a pingpong connection is disconnected */
CURLcode Curl_pp_disconnect(struct pingpong *pp);
-int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks);
+int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks,
+ int numsocks);
/***********************************************************************
diff --git a/lib/pipeline.c b/lib/pipeline.c
new file mode 100644
index 000000000..8de3babd7
--- /dev/null
+++ b/lib/pipeline.c
@@ -0,0 +1,404 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2013, Linus Nielsen Feltzing, <linus@haxx.se>
+ * Copyright (C) 2013 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#include <curl/curl.h>
+
+#include "urldata.h"
+#include "url.h"
+#include "progress.h"
+#include "multiif.h"
+#include "pipeline.h"
+#include "sendf.h"
+#include "strcase.h"
+
+#include "curl_memory.h"
+/* The last #include file should be: */
+#include "memdebug.h"
+
+struct site_blacklist_entry {
+ struct curl_llist_element list;
+ unsigned short port;
+ char hostname[1];
+};
+
+static void site_blacklist_llist_dtor(void *user, void *element)
+{
+ struct site_blacklist_entry *entry = element;
+ (void)user;
+ free(entry);
+}
+
+static void server_blacklist_llist_dtor(void *user, void *element)
+{
+ (void)user;
+ free(element);
+}
+
+bool Curl_pipeline_penalized(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ if(data) {
+ bool penalized = FALSE;
+ curl_off_t penalty_size =
+ Curl_multi_content_length_penalty_size(data->multi);
+ curl_off_t chunk_penalty_size =
+ Curl_multi_chunk_length_penalty_size(data->multi);
+ curl_off_t recv_size = -2; /* Make it easy to spot in the log */
+
+ /* Find the head of the recv pipe, if any */
+ if(conn->recv_pipe.head) {
+ struct Curl_easy *recv_handle = conn->recv_pipe.head->ptr;
+
+ recv_size = recv_handle->req.size;
+
+ if(penalty_size > 0 && recv_size > penalty_size)
+ penalized = TRUE;
+ }
+
+ if(chunk_penalty_size > 0 &&
+ (curl_off_t)conn->chunk.datasize > chunk_penalty_size)
+ penalized = TRUE;
+
+ infof(data, "Conn: %ld (%p) Receive pipe weight: (%"
+ CURL_FORMAT_CURL_OFF_T "/%" CURL_FORMAT_CURL_OFF_T
+ "), penalized: %s\n",
+ conn->connection_id, (void *)conn, recv_size,
+ conn->chunk.datasize, penalized?"TRUE":"FALSE");
+ return penalized;
+ }
+ return FALSE;
+}
+
+static CURLcode addHandleToPipeline(struct Curl_easy *data,
+ struct curl_llist *pipeline)
+{
+ Curl_llist_insert_next(pipeline, pipeline->tail, data,
+ &data->pipeline_queue);
+ return CURLE_OK;
+}
+
+
+CURLcode Curl_add_handle_to_pipeline(struct Curl_easy *handle,
+ struct connectdata *conn)
+{
+ struct curl_llist_element *sendhead = conn->send_pipe.head;
+ struct curl_llist *pipeline;
+ CURLcode result;
+
+ pipeline = &conn->send_pipe;
+
+ result = addHandleToPipeline(handle, pipeline);
+ if((conn->bundle->multiuse == BUNDLE_PIPELINING) &&
+ (pipeline == &conn->send_pipe && sendhead != conn->send_pipe.head)) {
+ /* this is a new one as head, expire it */
+ Curl_pipeline_leave_write(conn); /* not in use yet */
+ Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
+ }
+
+#if 0 /* enable for pipeline debugging */
+ print_pipeline(conn);
+#endif
+
+ return result;
+}
+
+/* Move this transfer from the sending list to the receiving list.
+
+ Pay special attention to the new sending list "leader" as it needs to get
+ checked to update what sockets it acts on.
+
+*/
+void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle,
+ struct connectdata *conn)
+{
+ struct curl_llist_element *curr;
+
+ curr = conn->send_pipe.head;
+ while(curr) {
+ if(curr->ptr == handle) {
+ Curl_llist_move(&conn->send_pipe, curr,
+ &conn->recv_pipe, conn->recv_pipe.tail);
+
+ if(conn->send_pipe.head) {
+ /* Since there's a new easy handle at the start of the send pipeline,
+ set its timeout value to 1ms to make it trigger instantly */
+ Curl_pipeline_leave_write(conn); /* not used now */
+#ifdef DEBUGBUILD
+ infof(conn->data, "%p is at send pipe head B!\n",
+ (void *)conn->send_pipe.head->ptr);
+#endif
+ Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
+ }
+
+ /* The receiver's list is not really interesting here since either this
+ handle is now first in the list and we'll deal with it soon, or
+ another handle is already first and thus is already taken care of */
+
+ break; /* we're done! */
+ }
+ curr = curr->next;
+ }
+}
+
+bool Curl_pipeline_site_blacklisted(struct Curl_easy *handle,
+ struct connectdata *conn)
+{
+ if(handle->multi) {
+ struct curl_llist *blacklist =
+ Curl_multi_pipelining_site_bl(handle->multi);
+
+ if(blacklist) {
+ struct curl_llist_element *curr;
+
+ curr = blacklist->head;
+ while(curr) {
+ struct site_blacklist_entry *site;
+
+ site = curr->ptr;
+ if(strcasecompare(site->hostname, conn->host.name) &&
+ site->port == conn->remote_port) {
+ infof(handle, "Site %s:%d is pipeline blacklisted\n",
+ conn->host.name, conn->remote_port);
+ return TRUE;
+ }
+ curr = curr->next;
+ }
+ }
+ }
+ return FALSE;
+}
+
+CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
+ struct curl_llist *list)
+{
+ /* Free the old list */
+ if(list->size)
+ Curl_llist_destroy(list, NULL);
+
+ if(sites) {
+ Curl_llist_init(list, (curl_llist_dtor) site_blacklist_llist_dtor);
+
+ /* Parse the URLs and populate the list */
+ while(*sites) {
+ char *port;
+ struct site_blacklist_entry *entry;
+
+ entry = malloc(sizeof(struct site_blacklist_entry) + strlen(*sites));
+ if(!entry) {
+ Curl_llist_destroy(list, NULL);
+ return CURLM_OUT_OF_MEMORY;
+ }
+ strcpy(entry->hostname, *sites);
+
+ port = strchr(entry->hostname, ':');
+ if(port) {
+ *port = '\0';
+ port++;
+ entry->port = (unsigned short)strtol(port, NULL, 10);
+ }
+ else {
+ /* Default port number for HTTP */
+ entry->port = 80;
+ }
+
+ Curl_llist_insert_next(list, list->tail, entry, &entry->list);
+ sites++;
+ }
+ }
+
+ return CURLM_OK;
+}
+
+struct blacklist_node {
+ struct curl_llist_element list;
+ char server_name[1];
+};
+
+bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
+ char *server_name)
+{
+ if(handle->multi && server_name) {
+ struct curl_llist *list =
+ Curl_multi_pipelining_server_bl(handle->multi);
+
+ struct curl_llist_element *e = list->head;
+ while(e) {
+ struct blacklist_node *bl = (struct blacklist_node *)e;
+ if(strncasecompare(bl->server_name, server_name,
+ strlen(bl->server_name))) {
+ infof(handle, "Server %s is blacklisted\n", server_name);
+ return TRUE;
+ }
+ e = e->next;
+ }
+
+ DEBUGF(infof(handle, "Server %s is not blacklisted\n", server_name));
+ }
+ return FALSE;
+}
+
+CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
+ struct curl_llist *list)
+{
+ /* Free the old list */
+ if(list->size)
+ Curl_llist_destroy(list, NULL);
+
+ if(servers) {
+ Curl_llist_init(list, (curl_llist_dtor) server_blacklist_llist_dtor);
+
+ /* Parse the URLs and populate the list */
+ while(*servers) {
+ struct blacklist_node *n;
+ size_t len = strlen(*servers);
+
+ n = malloc(sizeof(struct blacklist_node) + len);
+ if(!n) {
+ Curl_llist_destroy(list, NULL);
+ return CURLM_OUT_OF_MEMORY;
+ }
+ strcpy(n->server_name, *servers);
+
+ Curl_llist_insert_next(list, list->tail, n, &n->list);
+ servers++;
+ }
+ }
+
+
+ return CURLM_OK;
+}
+
+static bool pipe_head(struct Curl_easy *data,
+ struct curl_llist *pipeline)
+{
+ if(pipeline) {
+ struct curl_llist_element *curr = pipeline->head;
+ if(curr)
+ return (curr->ptr == data) ? TRUE : FALSE;
+ }
+ return FALSE;
+}
+
+/* returns TRUE if the given handle is head of the recv pipe */
+bool Curl_recvpipe_head(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ return pipe_head(data, &conn->recv_pipe);
+}
+
+/* returns TRUE if the given handle is head of the send pipe */
+bool Curl_sendpipe_head(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ return pipe_head(data, &conn->send_pipe);
+}
+
+
+/*
+ * Check if the write channel is available and this handle as at the head,
+ * then grab the channel and return TRUE.
+ *
+ * If not available, return FALSE.
+ */
+
+bool Curl_pipeline_checkget_write(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ if(conn->bits.multiplex)
+ /* when multiplexing, we can use it at once */
+ return TRUE;
+
+ if(!conn->writechannel_inuse && Curl_sendpipe_head(data, conn)) {
+ /* Grab the channel */
+ conn->writechannel_inuse = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/*
+ * Check if the read channel is available and this handle as at the head, then
+ * grab the channel and return TRUE.
+ *
+ * If not available, return FALSE.
+ */
+
+bool Curl_pipeline_checkget_read(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ if(conn->bits.multiplex)
+ /* when multiplexing, we can use it at once */
+ return TRUE;
+
+ if(!conn->readchannel_inuse && Curl_recvpipe_head(data, conn)) {
+ /* Grab the channel */
+ conn->readchannel_inuse = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*
+ * The current user of the pipeline write channel gives it up.
+ */
+void Curl_pipeline_leave_write(struct connectdata *conn)
+{
+ conn->writechannel_inuse = FALSE;
+}
+
+/*
+ * The current user of the pipeline read channel gives it up.
+ */
+void Curl_pipeline_leave_read(struct connectdata *conn)
+{
+ conn->readchannel_inuse = FALSE;
+}
+
+
+#if 0
+void print_pipeline(struct connectdata *conn)
+{
+ struct curl_llist_element *curr;
+ struct connectbundle *cb_ptr;
+ struct Curl_easy *data = conn->data;
+
+ cb_ptr = conn->bundle;
+
+ if(cb_ptr) {
+ curr = cb_ptr->conn_list->head;
+ while(curr) {
+ conn = curr->ptr;
+ infof(data, "- Conn %ld (%p) send_pipe: %zu, recv_pipe: %zu\n",
+ conn->connection_id,
+ (void *)conn,
+ conn->send_pipe->size,
+ conn->recv_pipe->size);
+ curr = curr->next;
+ }
+ }
+}
+
+#endif
diff --git a/lib/pipeline.h b/lib/pipeline.h
new file mode 100644
index 000000000..413ba31a0
--- /dev/null
+++ b/lib/pipeline.h
@@ -0,0 +1,56 @@
+#ifndef HEADER_CURL_PIPELINE_H
+#define HEADER_CURL_PIPELINE_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2015 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+CURLcode Curl_add_handle_to_pipeline(struct Curl_easy *handle,
+ struct connectdata *conn);
+void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle,
+ struct connectdata *conn);
+bool Curl_pipeline_penalized(struct Curl_easy *data,
+ struct connectdata *conn);
+
+bool Curl_pipeline_site_blacklisted(struct Curl_easy *handle,
+ struct connectdata *conn);
+
+CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
+ struct curl_llist *list_ptr);
+
+bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
+ char *server_name);
+
+CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
+ struct curl_llist *list_ptr);
+
+bool Curl_pipeline_checkget_write(struct Curl_easy *data,
+ struct connectdata *conn);
+bool Curl_pipeline_checkget_read(struct Curl_easy *data,
+ struct connectdata *conn);
+void Curl_pipeline_leave_write(struct connectdata *conn);
+void Curl_pipeline_leave_read(struct connectdata *conn);
+bool Curl_recvpipe_head(struct Curl_easy *data,
+ struct connectdata *conn);
+bool Curl_sendpipe_head(struct Curl_easy *data,
+ struct connectdata *conn);
+
+#endif /* HEADER_CURL_PIPELINE_H */
diff --git a/lib/pop3.c b/lib/pop3.c
index 57c1373aa..8dbd448b2 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -30,7 +30,6 @@
* RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism
* RFC5034 POP3 SASL Authentication Mechanism
* RFC6749 OAuth 2.0 Authorization Framework
- * RFC8314 Use of TLS for Email Submission and Access
* Draft LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
*
***************************************************************************/
@@ -95,7 +94,8 @@ static CURLcode pop3_done(struct connectdata *conn, CURLcode status,
static CURLcode pop3_connect(struct connectdata *conn, bool *done);
static CURLcode pop3_disconnect(struct connectdata *conn, bool dead);
static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done);
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode pop3_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode pop3_setup_connection(struct connectdata *conn);
static CURLcode pop3_parse_url_options(struct connectdata *conn);
@@ -338,8 +338,10 @@ static CURLcode pop3_perform_capa(struct connectdata *conn)
*/
static CURLcode pop3_perform_starttls(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the STLS command */
- CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
+ result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
if(!result)
state(conn, POP3_STARTTLS);
@@ -355,10 +357,11 @@ static CURLcode pop3_perform_starttls(struct connectdata *conn)
*/
static CURLcode pop3_perform_upgrade_tls(struct connectdata *conn)
{
- /* Start the SSL connection */
+ CURLcode result = CURLE_OK;
struct pop3_conn *pop3c = &conn->proto.pop3c;
- CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
- &pop3c->ssldone);
+
+ /* Start the SSL connection */
+ result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &pop3c->ssldone);
if(!result) {
if(pop3c->state != POP3_UPGRADETLS)
@@ -589,8 +592,10 @@ static CURLcode pop3_perform_command(struct connectdata *conn)
*/
static CURLcode pop3_perform_quit(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the QUIT command */
- CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
+ result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
if(!result)
state(conn, POP3_QUIT);
@@ -1054,9 +1059,10 @@ static CURLcode pop3_init(struct connectdata *conn)
}
/* For the POP3 "protocol connect" and "doing" phases only */
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
- return Curl_pp_getsock(&conn->proto.pop3c.pp, socks);
+ return Curl_pp_getsock(&conn->proto.pop3c.pp, socks, numsocks);
}
/***********************************************************************
diff --git a/lib/progress.c b/lib/progress.c
index 2aa929599..d37e1d5a6 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,13 +26,11 @@
#include "sendf.h"
#include "multiif.h"
#include "progress.h"
-#include "timeval.h"
#include "curl_printf.h"
/* check rate limits within this many recent milliseconds, at minimum. */
#define MIN_RATE_LIMIT_PERIOD 3000
-#ifndef CURL_DISABLE_PROGRESS_METER
/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
byte) */
static void time2str(char *r, curl_off_t seconds)
@@ -121,7 +119,6 @@ static char *max5data(curl_off_t bytes, char *max5)
return max5;
}
-#endif
/*
@@ -169,7 +166,7 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
struct curltime now = Curl_now();
- timediff_t *delta = NULL;
+ time_t *delta = NULL;
switch(timer) {
default:
@@ -239,8 +236,6 @@ void Curl_pgrsStartNow(struct Curl_easy *data)
data->progress.ul_limit_start.tv_usec = 0;
data->progress.dl_limit_start.tv_sec = 0;
data->progress.dl_limit_start.tv_usec = 0;
- data->progress.downloaded = 0;
- data->progress.uploaded = 0;
/* clear all bits except HIDE and HEADERS_OUT */
data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
Curl_ratelimit(data, data->progress.start);
@@ -271,8 +266,8 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
struct curltime now)
{
curl_off_t size = cursize - startsize;
- timediff_t minimum;
- timediff_t actual;
+ time_t minimum;
+ time_t actual;
if(!limit || !size)
return 0;
@@ -285,10 +280,10 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
else {
minimum = (time_t) (size / limit);
- if(minimum < TIMEDIFF_T_MAX/1000)
+ if(minimum < TIME_T_MAX/1000)
minimum *= 1000;
else
- minimum = TIMEDIFF_T_MAX;
+ minimum = TIME_T_MAX;
}
/*
@@ -367,15 +362,22 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
}
}
-/* returns TRUE if it's time to show the progress meter */
-static bool progress_calc(struct connectdata *conn, struct curltime now)
+/*
+ * Curl_pgrsUpdate() returns 0 for success or the value returned by the
+ * progress callback!
+ */
+int Curl_pgrsUpdate(struct connectdata *conn)
{
+ struct curltime now;
curl_off_t timespent;
curl_off_t timespent_ms; /* milliseconds */
struct Curl_easy *data = conn->data;
+ int nowindex = data->progress.speeder_c% CURR_TIME;
+ bool shownow = FALSE;
curl_off_t dl = data->progress.downloaded;
curl_off_t ul = data->progress.uploaded;
- bool timetoshow = FALSE;
+
+ now = Curl_now(); /* what time is it */
/* The time spent so far (from the start) */
data->progress.timespent = Curl_timediff_us(now, data->progress.start);
@@ -397,9 +399,9 @@ static bool progress_calc(struct connectdata *conn, struct curltime now)
/* Calculations done at most once a second, unless end is reached */
if(data->progress.lastshow != now.tv_sec) {
int countindex; /* amount of seconds stored in the speeder array */
- int nowindex = data->progress.speeder_c% CURR_TIME;
+ shownow = TRUE;
+
data->progress.lastshow = now.tv_sec;
- timetoshow = TRUE;
/* Let's do the "current speed" thing, with the dl + ul speeds
combined. Store the speed at entry 'nowindex'. */
@@ -432,7 +434,8 @@ static bool progress_calc(struct connectdata *conn, struct curltime now)
data->progress.speeder_c%CURR_TIME:0;
/* Figure out the exact time for the time span */
- span_ms = Curl_timediff(now, data->progress.speeder_time[checkindex]);
+ span_ms = Curl_timediff(now,
+ data->progress.speeder_time[checkindex]);
if(0 == span_ms)
span_ms = 1; /* at least one millisecond MUST have passed */
@@ -458,132 +461,22 @@ static bool progress_calc(struct connectdata *conn, struct curltime now)
data->progress.ulspeed + data->progress.dlspeed;
} /* Calculations end */
- return timetoshow;
-}
-
-#ifndef CURL_DISABLE_PROGRESS_METER
-static void progress_meter(struct connectdata *conn)
-{
- struct Curl_easy *data = conn->data;
- char max5[6][10];
- curl_off_t dlpercen = 0;
- curl_off_t ulpercen = 0;
- curl_off_t total_percen = 0;
- curl_off_t total_transfer;
- curl_off_t total_expected_transfer;
- char time_left[10];
- char time_total[10];
- char time_spent[10];
- curl_off_t ulestimate = 0;
- curl_off_t dlestimate = 0;
- curl_off_t total_estimate;
- curl_off_t timespent =
- (curl_off_t)data->progress.timespent/1000000; /* seconds */
-
- if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
- if(data->state.resume_from) {
- fprintf(data->set.err,
- "** Resuming transfer from byte position %"
- CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
- }
- fprintf(data->set.err,
- " %% Total %% Received %% Xferd Average Speed "
- "Time Time Time Current\n"
- " Dload Upload "
- "Total Spent Left Speed\n");
- data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
- }
-
- /* Figure out the estimated time of arrival for the upload */
- if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
- (data->progress.ulspeed > CURL_OFF_T_C(0))) {
- ulestimate = data->progress.size_ul / data->progress.ulspeed;
-
- if(data->progress.size_ul > CURL_OFF_T_C(10000))
- ulpercen = data->progress.uploaded /
- (data->progress.size_ul/CURL_OFF_T_C(100));
- else if(data->progress.size_ul > CURL_OFF_T_C(0))
- ulpercen = (data->progress.uploaded*100) /
- data->progress.size_ul;
- }
-
- /* ... and the download */
- if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
- (data->progress.dlspeed > CURL_OFF_T_C(0))) {
- dlestimate = data->progress.size_dl / data->progress.dlspeed;
-
- if(data->progress.size_dl > CURL_OFF_T_C(10000))
- dlpercen = data->progress.downloaded /
- (data->progress.size_dl/CURL_OFF_T_C(100));
- else if(data->progress.size_dl > CURL_OFF_T_C(0))
- dlpercen = (data->progress.downloaded*100) /
- data->progress.size_dl;
- }
-
- /* Now figure out which of them is slower and use that one for the
- total estimate! */
- total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
-
- /* create the three time strings */
- time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
- time2str(time_total, total_estimate);
- time2str(time_spent, timespent);
-
- /* Get the total amount of data expected to get transferred */
- total_expected_transfer =
- ((data->progress.flags & PGRS_UL_SIZE_KNOWN)?
- data->progress.size_ul:data->progress.uploaded)+
- ((data->progress.flags & PGRS_DL_SIZE_KNOWN)?
- data->progress.size_dl:data->progress.downloaded);
-
- /* We have transferred this much so far */
- total_transfer = data->progress.downloaded + data->progress.uploaded;
-
- /* Get the percentage of data transferred so far */
- if(total_expected_transfer > CURL_OFF_T_C(10000))
- total_percen = total_transfer /
- (total_expected_transfer/CURL_OFF_T_C(100));
- else if(total_expected_transfer > CURL_OFF_T_C(0))
- total_percen = (total_transfer*100) / total_expected_transfer;
-
- fprintf(data->set.err,
- "\r"
- "%3" CURL_FORMAT_CURL_OFF_T " %s "
- "%3" CURL_FORMAT_CURL_OFF_T " %s "
- "%3" CURL_FORMAT_CURL_OFF_T " %s %s %s %s %s %s %s",
- total_percen, /* 3 letters */ /* total % */
- max5data(total_expected_transfer, max5[2]), /* total size */
- dlpercen, /* 3 letters */ /* rcvd % */
- max5data(data->progress.downloaded, max5[0]), /* rcvd size */
- ulpercen, /* 3 letters */ /* xfer % */
- max5data(data->progress.uploaded, max5[1]), /* xfer size */
- max5data(data->progress.dlspeed, max5[3]), /* avrg dl speed */
- max5data(data->progress.ulspeed, max5[4]), /* avrg ul speed */
- time_total, /* 8 letters */ /* total time */
- time_spent, /* 8 letters */ /* time spent */
- time_left, /* 8 letters */ /* time left */
- max5data(data->progress.current_speed, max5[5])
- );
-
- /* we flush the output stream to make it appear as soon as possible */
- fflush(data->set.err);
-}
-#else
- /* progress bar disabled */
-#define progress_meter(x) Curl_nop_stmt
-#endif
-
-/*
- * Curl_pgrsUpdate() returns 0 for success or the value returned by the
- * progress callback!
- */
-int Curl_pgrsUpdate(struct connectdata *conn)
-{
- struct Curl_easy *data = conn->data;
- struct curltime now = Curl_now(); /* what time is it */
- bool showprogress = progress_calc(conn, now);
if(!(data->progress.flags & PGRS_HIDE)) {
+ /* progress meter has not been shut off */
+ char max5[6][10];
+ curl_off_t dlpercen = 0;
+ curl_off_t ulpercen = 0;
+ curl_off_t total_percen = 0;
+ curl_off_t total_transfer;
+ curl_off_t total_expected_transfer;
+ char time_left[10];
+ char time_total[10];
+ char time_spent[10];
+ curl_off_t ulestimate = 0;
+ curl_off_t dlestimate = 0;
+ curl_off_t total_estimate;
+
if(data->set.fxferinfo) {
int result;
/* There's a callback set, call that */
@@ -613,9 +506,102 @@ int Curl_pgrsUpdate(struct connectdata *conn)
return result;
}
- if(showprogress)
- progress_meter(conn);
- }
+ if(!shownow)
+ /* only show the internal progress meter once per second */
+ return 0;
+
+ /* If there's no external callback set, use internal code to show
+ progress */
+
+ if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
+ if(data->state.resume_from) {
+ fprintf(data->set.err,
+ "** Resuming transfer from byte position %"
+ CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
+ }
+ fprintf(data->set.err,
+ " %% Total %% Received %% Xferd Average Speed "
+ "Time Time Time Current\n"
+ " Dload Upload "
+ "Total Spent Left Speed\n");
+ data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
+ }
+
+ /* Figure out the estimated time of arrival for the upload */
+ if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
+ (data->progress.ulspeed > CURL_OFF_T_C(0))) {
+ ulestimate = data->progress.size_ul / data->progress.ulspeed;
+
+ if(data->progress.size_ul > CURL_OFF_T_C(10000))
+ ulpercen = data->progress.uploaded /
+ (data->progress.size_ul/CURL_OFF_T_C(100));
+ else if(data->progress.size_ul > CURL_OFF_T_C(0))
+ ulpercen = (data->progress.uploaded*100) /
+ data->progress.size_ul;
+ }
+
+ /* ... and the download */
+ if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
+ (data->progress.dlspeed > CURL_OFF_T_C(0))) {
+ dlestimate = data->progress.size_dl / data->progress.dlspeed;
+
+ if(data->progress.size_dl > CURL_OFF_T_C(10000))
+ dlpercen = data->progress.downloaded /
+ (data->progress.size_dl/CURL_OFF_T_C(100));
+ else if(data->progress.size_dl > CURL_OFF_T_C(0))
+ dlpercen = (data->progress.downloaded*100) /
+ data->progress.size_dl;
+ }
+
+ /* Now figure out which of them is slower and use that one for the
+ total estimate! */
+ total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
+
+ /* create the three time strings */
+ time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
+ time2str(time_total, total_estimate);
+ time2str(time_spent, timespent);
+
+ /* Get the total amount of data expected to get transferred */
+ total_expected_transfer =
+ (data->progress.flags & PGRS_UL_SIZE_KNOWN?
+ data->progress.size_ul:data->progress.uploaded)+
+ (data->progress.flags & PGRS_DL_SIZE_KNOWN?
+ data->progress.size_dl:data->progress.downloaded);
+
+ /* We have transferred this much so far */
+ total_transfer = data->progress.downloaded + data->progress.uploaded;
+
+ /* Get the percentage of data transferred so far */
+ if(total_expected_transfer > CURL_OFF_T_C(10000))
+ total_percen = total_transfer /
+ (total_expected_transfer/CURL_OFF_T_C(100));
+ else if(total_expected_transfer > CURL_OFF_T_C(0))
+ total_percen = (total_transfer*100) / total_expected_transfer;
+
+ fprintf(data->set.err,
+ "\r"
+ "%3" CURL_FORMAT_CURL_OFF_T " %s "
+ "%3" CURL_FORMAT_CURL_OFF_T " %s "
+ "%3" CURL_FORMAT_CURL_OFF_T " %s %s %s %s %s %s %s",
+ total_percen, /* 3 letters */ /* total % */
+ max5data(total_expected_transfer, max5[2]), /* total size */
+ dlpercen, /* 3 letters */ /* rcvd % */
+ max5data(data->progress.downloaded, max5[0]), /* rcvd size */
+ ulpercen, /* 3 letters */ /* xfer % */
+ max5data(data->progress.uploaded, max5[1]), /* xfer size */
+ max5data(data->progress.dlspeed, max5[3]), /* avrg dl speed */
+ max5data(data->progress.ulspeed, max5[4]), /* avrg ul speed */
+ time_total, /* 8 letters */ /* total time */
+ time_spent, /* 8 letters */ /* time spent */
+ time_left, /* 8 letters */ /* time left */
+ max5data(data->progress.current_speed, max5[5]) /* current speed */
+ );
+
+ /* we flush the output stream to make it appear as soon as possible */
+ fflush(data->set.err);
+
+ } /* !(data->progress.flags & PGRS_HIDE) */
return 0;
}
diff --git a/lib/quic.h b/lib/quic.h
deleted file mode 100644
index 6c132a324..000000000
--- a/lib/quic.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef HEADER_CURL_QUIC_H
-#define HEADER_CURL_QUIC_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#ifdef ENABLE_QUIC
-#ifdef USE_NGTCP2
-#include "vquic/ngtcp2.h"
-#endif
-#ifdef USE_QUICHE
-#include "vquic/quiche.h"
-#endif
-
-#include "urldata.h"
-
-/* functions provided by the specific backends */
-CURLcode Curl_quic_connect(struct connectdata *conn,
- curl_socket_t sockfd,
- int sockindex,
- const struct sockaddr *addr,
- socklen_t addrlen);
-CURLcode Curl_quic_is_connected(struct connectdata *conn,
- curl_socket_t sockfd,
- bool *connected);
-int Curl_quic_ver(char *p, size_t len);
-CURLcode Curl_quic_done_sending(struct connectdata *conn);
-
-#else /* ENABLE_QUIC */
-#define Curl_quic_done_sending(x)
-#endif /* !ENABLE_QUIC */
-
-#endif /* HEADER_CURL_QUIC_H */
diff --git a/lib/rand.c b/lib/rand.c
index c415048ec..6ee45feb1 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,7 +106,8 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
* 'rndptr' points to.
*
* If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit or mbedTLS), this function will use "weak" random.
+ * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
+ * "weak" random.
*
* When built *with* TLS support and a backend that offers strong random, it
* will return error if it cannot provide strong random values.
diff --git a/lib/rand.h b/lib/rand.h
index 3c8e2b81d..5deb04161 100644
--- a/lib/rand.h
+++ b/lib/rand.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,7 +27,8 @@
* 'rnd' points to.
*
* If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit or mbedTLS), this function will use "weak" random.
+ * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
+ * "weak" random.
*
* When built *with* TLS support and a backend that offers strong random, it
* will return error if it cannot provide strong random values.
diff --git a/lib/rtsp.c b/lib/rtsp.c
index bba4c16a1..b9a8ef5e8 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -42,6 +42,16 @@
#include "curl_memory.h"
#include "memdebug.h"
+/*
+ * TODO (general)
+ * -incoming server requests
+ * -server CSeq counter
+ * -digest authentication
+ * -connect through proxy
+ * -pipelining?
+ */
+
+
#define RTP_PKT_CHANNEL(p) ((int)((unsigned char)((p)[1])))
#define RTP_PKT_LENGTH(p) ((((int)((unsigned char)((p)[2]))) << 8) | \
@@ -52,7 +62,10 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done);
static CURLcode rtsp_done(struct connectdata *conn, CURLcode, bool premature);
static CURLcode rtsp_connect(struct connectdata *conn, bool *done);
static CURLcode rtsp_disconnect(struct connectdata *conn, bool dead);
-static int rtsp_getsock_do(struct connectdata *conn, curl_socket_t *socks);
+
+static int rtsp_getsock_do(struct connectdata *conn,
+ curl_socket_t *socks,
+ int numsocks);
/*
* Parse and write out any available RTP data.
@@ -74,9 +87,11 @@ static unsigned int rtsp_conncheck(struct connectdata *check,
interface and then we're always _sending_ a request and thus we wait for
the single socket to become writable only */
static int rtsp_getsock_do(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
/* write mode */
+ (void)numsocks; /* unused, we trust it to be at least 1 */
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_WRITESOCK(0);
}
@@ -221,6 +236,7 @@ static CURLcode rtsp_done(struct connectdata *conn,
if(data->set.rtspreq == RTSPREQ_RECEIVE &&
(conn->proto.rtspc.rtp_channel == -1)) {
infof(data, "Got an RTP Receive with a CSeq of %ld\n", CSeq_recv);
+ /* TODO CPC: Server -> Client logic here */
}
}
@@ -320,6 +336,8 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
return CURLE_BAD_FUNCTION_ARGUMENT;
}
+ /* TODO: proxy? */
+
/* Stream URI. Default to server '*' if not specified */
if(data->set.str[STRING_RTSP_STREAM_URI]) {
p_stream_uri = data->set.str[STRING_RTSP_STREAM_URI];
@@ -486,7 +504,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
return result;
if((rtspreq == RTSPREQ_SETUP) || (rtspreq == RTSPREQ_DESCRIBE)) {
- result = Curl_add_timecondition(conn, req_buffer);
+ result = Curl_add_timecondition(data, req_buffer);
if(result)
return result;
}
diff --git a/lib/security.c b/lib/security.c
index fbfa70741..eec6e6f44 100644
--- a/lib/security.c
+++ b/lib/security.c
@@ -7,7 +7,7 @@
* rewrite to work around the paragraph 2 in the BSD licenses as explained
* below.
*
- * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
+ * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
*
* Copyright (C) 2001 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
@@ -151,6 +151,7 @@ socket_read(curl_socket_t fd, void *to, size_t len)
to_p += nread;
}
else {
+ /* FIXME: We are doing a busy wait */
if(result == CURLE_AGAIN)
continue;
return result;
@@ -178,6 +179,7 @@ socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
to_p += written;
}
else {
+ /* FIXME: We are doing a busy wait */
if(result == CURLE_AGAIN)
continue;
return result;
@@ -191,6 +193,7 @@ static CURLcode read_data(struct connectdata *conn,
struct krb5buffer *buf)
{
int len;
+ void *tmp = NULL;
CURLcode result;
result = socket_read(fd, &len, sizeof(len));
@@ -200,11 +203,12 @@ static CURLcode read_data(struct connectdata *conn,
if(len) {
/* only realloc if there was a length */
len = ntohl(len);
- buf->data = Curl_saferealloc(buf->data, len);
+ tmp = Curl_saferealloc(buf->data, len);
}
- if(!len || !buf->data)
+ if(tmp == NULL)
return CURLE_OUT_OF_MEMORY;
+ buf->data = tmp;
result = socket_read(fd, buf->data, len);
if(result)
return result;
@@ -236,7 +240,7 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
/* Handle clear text response. */
if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
- return sread(fd, buffer, len);
+ return read(fd, buffer, len);
if(conn->in_buffer.eof_flag) {
conn->in_buffer.eof_flag = 0;
@@ -261,11 +265,13 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
total_read += bytes_read;
buffer += bytes_read;
}
+ /* FIXME: Check for overflow */
return total_read;
}
/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
- and negotiating with the server. |from| can be NULL. */
+ and negociating with the server. |from| can be NULL. */
+/* FIXME: We don't check for errors nor report any! */
static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
const char *from, int length)
{
@@ -400,14 +406,18 @@ int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
if(buf[decoded_len - 1] == '\n')
buf[decoded_len - 1] = '\0';
+ /* FIXME: Is |buffer| length always greater than |decoded_len|? */
strcpy(buffer, buf);
free(buf);
return ret_code;
}
+/* FIXME: The error code returned here is never checked. */
static int sec_set_protection_level(struct connectdata *conn)
{
int code;
+ char *pbsz;
+ static unsigned int buffer_size = 1 << 20; /* 1048576 */
enum protection_level level = conn->request_data_prot;
DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
@@ -423,9 +433,6 @@ static int sec_set_protection_level(struct connectdata *conn)
return 0;
if(level) {
- char *pbsz;
- static unsigned int buffer_size = 1 << 20; /* 1048576 */
-
code = ftp_send_command(conn, "PBSZ %u", buffer_size);
if(code < 0)
return -1;
@@ -501,6 +508,7 @@ static CURLcode choose_mech(struct connectdata *conn)
infof(data, "Trying mechanism %s...\n", mech->name);
ret = ftp_send_command(conn, "AUTH %s", mech->name);
if(ret < 0)
+ /* FIXME: This error is too generic but it is OK for now. */
return CURLE_COULDNT_CONNECT;
if(ret/100 != 3) {
@@ -567,6 +575,7 @@ Curl_sec_end(struct connectdata *conn)
conn->in_buffer.data = NULL;
conn->in_buffer.size = 0;
conn->in_buffer.index = 0;
+ /* FIXME: Is this really needed? */
conn->in_buffer.eof_flag = 0;
}
conn->sec_complete = 0;
diff --git a/lib/select.h b/lib/select.h
index f5652a74f..9a1ba45a7 100644
--- a/lib/select.h
+++ b/lib/select.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -77,9 +77,9 @@ int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
time_t timeout_ms);
#define SOCKET_READABLE(x,z) \
- Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)z)
+ Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, z)
#define SOCKET_WRITABLE(x,z) \
- Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, (time_t)z)
+ Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, z)
int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);
diff --git a/lib/sendf.c b/lib/sendf.c
index 5913ea406..5008d9333 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -595,10 +595,7 @@ static CURLcode chop_write(struct connectdata *conn,
size_t chunklen = len <= CURL_MAX_WRITE_SIZE? len: CURL_MAX_WRITE_SIZE;
if(writebody) {
- size_t wrote;
- Curl_set_in_callback(data, true);
- wrote = writebody(ptr, 1, chunklen, data->set.out);
- Curl_set_in_callback(data, false);
+ size_t wrote = writebody(ptr, 1, chunklen, data->set.out);
if(CURL_WRITEFUNC_PAUSE == wrote) {
if(conn->handler->flags & PROTOPT_NONETWORK) {
@@ -727,6 +724,10 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
char *buffertofill = NULL;
struct Curl_easy *data = conn->data;
+ /* if HTTP/1 pipelining is both wanted and possible */
+ bool pipelining = Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
+ (conn->bundle->multiuse == BUNDLE_PIPELINING);
+
/* Set 'num' to 0 or 1, depending on which socket that has been sent here.
If it is the second socket, we set num to 1. Otherwise to 0. This lets
us use the correct ssl handle. */
@@ -734,13 +735,40 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
*n = 0; /* reset amount to zero */
- bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
- buffertofill = buf;
+ /* If session can pipeline, check connection buffer */
+ if(pipelining) {
+ size_t bytestocopy = CURLMIN(conn->buf_len - conn->read_pos,
+ sizerequested);
+
+ /* Copy from our master buffer first if we have some unread data there*/
+ if(bytestocopy > 0) {
+ memcpy(buf, conn->master_buffer + conn->read_pos, bytestocopy);
+ conn->read_pos += bytestocopy;
+ conn->bits.stream_was_rewound = FALSE;
+
+ *n = (ssize_t)bytestocopy;
+ return CURLE_OK;
+ }
+ /* If we come here, it means that there is no data to read from the buffer,
+ * so we read from the socket */
+ bytesfromsocket = CURLMIN(sizerequested, MASTERBUF_SIZE);
+ buffertofill = conn->master_buffer;
+ }
+ else {
+ bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
+ buffertofill = buf;
+ }
nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &result);
if(nread < 0)
return result;
+ if(pipelining) {
+ memcpy(buf, conn->master_buffer, nread);
+ conn->buf_len = nread;
+ conn->read_pos = nread;
+ }
+
*n += nread;
return CURLE_OK;
diff --git a/lib/setopt.c b/lib/setopt.c
index 64c29e333..b5f74a93d 100644
--- a/lib/setopt.c
+++ b/lib/setopt.c
@@ -61,13 +61,6 @@ CURLcode Curl_setstropt(char **charp, const char *s)
if(s) {
char *str = strdup(s);
- if(str) {
- size_t len = strlen(str);
- if(len > CURL_MAX_INPUT_LENGTH) {
- free(str);
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
- }
if(!str)
return CURLE_OUT_OF_MEMORY;
@@ -119,16 +112,12 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
#define C_SSLVERSION_VALUE(x) (x & 0xffff)
#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
-/*
- * Do not make Curl_vsetopt() static: it is called from
- * packages/OS400/ccsidcurl.c.
- */
-CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
+static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
+ va_list param)
{
char *argptr;
CURLcode result = CURLE_OK;
long arg;
- unsigned long uarg;
curl_off_t bigsize;
switch(option) {
@@ -139,20 +128,23 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.dns_cache_timeout = arg;
break;
case CURLOPT_DNS_USE_GLOBAL_CACHE:
- /* deprecated */
+#if 0 /* deprecated */
+ /* remember we want this enabled */
+ arg = va_arg(param, long);
+ data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE;
+#endif
break;
case CURLOPT_SSL_CIPHER_LIST:
/* set a list of cipher we want to use in the SSL connection */
result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSL_CIPHER_LIST:
/* set a list of cipher we want to use in the SSL connection for proxy */
result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY],
va_arg(param, char *));
break;
-#endif
+
case CURLOPT_TLS13_CIPHERS:
if(Curl_ssl_tls13_ciphersuites()) {
/* set preferred list of TLS 1.3 cipher suites */
@@ -162,7 +154,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else
return CURLE_NOT_BUILT_IN;
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_TLS13_CIPHERS:
if(Curl_ssl_tls13_ciphersuites()) {
/* set preferred list of TLS 1.3 cipher suites for proxy */
@@ -172,7 +163,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else
return CURLE_NOT_BUILT_IN;
break;
-#endif
+
case CURLOPT_RANDOM_FILE:
/*
* This is the path name to a file that contains random data to seed
@@ -280,6 +271,27 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
*/
data->set.get_filetime = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
+ case CURLOPT_FTP_CREATE_MISSING_DIRS:
+ /*
+ * An FTP option that modifies an upload to create missing directories on
+ * the server.
+ */
+ switch(va_arg(param, long)) {
+ case 0:
+ data->set.ftp_create_missing_dirs = 0;
+ break;
+ case 1:
+ data->set.ftp_create_missing_dirs = 1;
+ break;
+ case 2:
+ data->set.ftp_create_missing_dirs = 2;
+ break;
+ default:
+ /* reserve other values for future use */
+ result = CURLE_UNKNOWN_OPTION;
+ break;
+ }
+ break;
case CURLOPT_SERVER_RESPONSE_TIMEOUT:
/*
* Option that specifies how quickly an server response must be obtained
@@ -291,7 +303,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else
return CURLE_BAD_FUNCTION_ARGUMENT;
break;
-#ifndef CURL_DISABLE_TFTP
case CURLOPT_TFTP_NO_OPTIONS:
/*
* Option that prevents libcurl from sending TFTP option requests to the
@@ -308,14 +319,34 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.tftp_blksize = arg;
break;
-#endif
-#ifndef CURL_DISABLE_NETRC
+ case CURLOPT_DIRLISTONLY:
+ /*
+ * An option that changes the command to one that asks for a list
+ * only, no file info details.
+ */
+ data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_APPEND:
+ /*
+ * We want to upload and append to an existing file.
+ */
+ data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+ case CURLOPT_FTP_FILEMETHOD:
+ /*
+ * How do access files over FTP.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLFTPMETHOD_DEFAULT) || (arg > CURLFTPMETHOD_SINGLECWD))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ftp_filemethod = (curl_ftpfile)arg;
+ break;
case CURLOPT_NETRC:
/*
* Parse the $HOME/.netrc file
*/
arg = va_arg(param, long);
- if((arg < CURL_NETRC_IGNORED) || (arg >= CURL_NETRC_LAST))
+ if((arg < CURL_NETRC_IGNORED) || (arg > CURL_NETRC_REQUIRED))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.use_netrc = (enum CURL_NETRC_OPTION)arg;
break;
@@ -326,7 +357,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_NETRC_FILE],
va_arg(param, char *));
break;
-#endif
case CURLOPT_TRANSFERTEXT:
/*
* This option was previously named 'FTPASCII'. Renamed to work with
@@ -342,7 +372,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* curl/curl.h header file.
*/
arg = va_arg(param, long);
- if((arg < CURL_TIMECOND_NONE) || (arg >= CURL_TIMECOND_LAST))
+ if((arg < CURL_TIMECOND_NONE) || (arg > CURL_TIMECOND_LASTMOD))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.timecondition = (curl_TimeCond)arg;
break;
@@ -634,7 +664,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
break;
#ifndef CURL_DISABLE_HTTP
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXYHEADER:
/*
* Set a list with proxy headers to use (or replace internals with)
@@ -648,7 +677,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
*/
data->set.proxyheaders = va_arg(param, struct curl_slist *);
break;
-#endif
+
case CURLOPT_HEADEROPT:
/*
* Set header option.
@@ -752,7 +781,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
}
else if(strcasecompare(argptr, "FLUSH")) {
/* flush cookies to file, takes care of the locking */
- Curl_flush_cookies(data, FALSE);
+ Curl_flush_cookies(data, 0);
}
else if(strcasecompare(argptr, "RELOAD")) {
/* reload cookies from file */
@@ -809,16 +838,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
arg = va_arg(param, long);
if(arg < CURL_HTTP_VERSION_NONE)
return CURLE_BAD_FUNCTION_ARGUMENT;
-#ifdef ENABLE_QUIC
- if(arg == CURL_HTTP_VERSION_3)
- ;
- else
-#endif
#ifndef USE_NGHTTP2
if(arg >= CURL_HTTP_VERSION_2)
return CURLE_UNSUPPORTED_PROTOCOL;
#else
- if(arg >= CURL_HTTP_VERSION_LAST)
+ if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
return CURLE_UNSUPPORTED_PROTOCOL;
if(arg == CURL_HTTP_VERSION_NONE)
arg = CURL_HTTP_VERSION_2TLS;
@@ -1048,7 +1072,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.socks5_gssapi_nec = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
#endif
-#ifndef CURL_DISABLE_PROXY
+
case CURLOPT_SOCKS5_GSSAPI_SERVICE:
case CURLOPT_PROXY_SERVICE_NAME:
/*
@@ -1057,7 +1081,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME],
va_arg(param, char *));
break;
-#endif
+
case CURLOPT_SERVICE_NAME:
/*
* Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO
@@ -1086,33 +1110,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
*/
data->set.out = va_arg(param, void *);
break;
-
- case CURLOPT_DIRLISTONLY:
- /*
- * An option that changes the command to one that asks for a list only, no
- * file info details. Used for FTP, POP3 and SFTP.
- */
- data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_APPEND:
- /*
- * We want to upload and append to an existing file. Used for FTP and
- * SFTP.
- */
- data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
-#ifndef CURL_DISABLE_FTP
- case CURLOPT_FTP_FILEMETHOD:
- /*
- * How do access files over FTP.
- */
- arg = va_arg(param, long);
- if((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.ftp_filemethod = (curl_ftpfile)arg;
- break;
case CURLOPT_FTPPORT:
/*
* Use FTP PORT, this also specifies which IP address to use
@@ -1136,7 +1133,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_FTP_SSL_CCC:
arg = va_arg(param, long);
- if((arg < CURLFTPSSL_CCC_NONE) || (arg >= CURLFTPSSL_CCC_LAST))
+ if((arg < CURLFTPSSL_CCC_NONE) || (arg > CURLFTPSSL_CCC_ACTIVE))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.ftp_ccc = (curl_ftpccc)arg;
break;
@@ -1149,55 +1146,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.ftp_skip_ip = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
- case CURLOPT_FTP_ACCOUNT:
- result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
- va_arg(param, char *));
- break;
-
- case CURLOPT_FTP_ALTERNATIVE_TO_USER:
- result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
- va_arg(param, char *));
- break;
-
- case CURLOPT_FTPSSLAUTH:
- /*
- * Set a specific auth for FTP-SSL transfers.
- */
- arg = va_arg(param, long);
- if((arg < CURLFTPAUTH_DEFAULT) || (arg >= CURLFTPAUTH_LAST))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.ftpsslauth = (curl_ftpauth)arg;
- break;
- case CURLOPT_KRBLEVEL:
- /*
- * A string that defines the kerberos security level.
- */
- result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
- va_arg(param, char *));
- data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
- break;
-#endif
- case CURLOPT_FTP_CREATE_MISSING_DIRS:
- /*
- * An FTP/SFTP option that modifies an upload to create missing
- * directories on the server.
- */
- switch(va_arg(param, long)) {
- case 0:
- data->set.ftp_create_missing_dirs = 0;
- break;
- case 1:
- data->set.ftp_create_missing_dirs = 1;
- break;
- case 2:
- data->set.ftp_create_missing_dirs = 2;
- break;
- default:
- /* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
- break;
case CURLOPT_READDATA:
/*
* FILE pointer to read the file to be uploaded from. Or possibly
@@ -1606,7 +1554,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLCERT:
/*
* String that holds file name of the SSL certificate to use for proxy
@@ -1614,7 +1561,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_SSLCERTTYPE:
/*
* String that holds file type of the SSL certificate to use
@@ -1622,7 +1568,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLCERTTYPE:
/*
* String that holds file type of the SSL certificate to use for proxy
@@ -1630,7 +1575,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_SSLKEY:
/*
* String that holds file name of the SSL key to use
@@ -1638,7 +1582,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLKEY:
/*
* String that holds file name of the SSL key to use for proxy
@@ -1646,7 +1589,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_SSLKEYTYPE:
/*
* String that holds file type of the SSL key to use
@@ -1654,7 +1596,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLKEYTYPE:
/*
* String that holds file type of the SSL key to use for proxy
@@ -1662,7 +1603,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_KEYPASSWD:
/*
* String that holds the SSL or SSH private key password.
@@ -1670,7 +1610,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_KEYPASSWD:
/*
* String that holds the SSL private key password for proxy.
@@ -1678,7 +1617,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_SSLENGINE:
/*
* String that holds the SSL crypto engine.
@@ -1705,14 +1643,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
*/
data->set.crlf = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#ifndef CURL_DISABLE_PROXY
+
case CURLOPT_HAPROXYPROTOCOL:
/*
* Set to send the HAProxy Proxy Protocol header
*/
data->set.haproxyprotocol = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#endif
+
case CURLOPT_INTERFACE:
/*
* Set what interface or address/hostname to bind the socket to when
@@ -1739,6 +1677,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.localportrange = curlx_sltosi(arg);
break;
+ case CURLOPT_KRBLEVEL:
+ /*
+ * A string that defines the kerberos security level.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
+ va_arg(param, char *));
+ data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
+ break;
case CURLOPT_GSSAPI_DELEGATION:
/*
* GSS-API credential delegation bitmask
@@ -1761,7 +1707,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.ssl.primary.verifypeer;
}
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSL_VERIFYPEER:
/*
* Enable peer SSL verifying for proxy.
@@ -1775,7 +1720,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.primary.verifypeer;
}
break;
-#endif
case CURLOPT_SSL_VERIFYHOST:
/*
* Enable verification of the host name in the peer certificate
@@ -1783,9 +1727,16 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
arg = va_arg(param, long);
/* Obviously people are not reading documentation and too many thought
- this argument took a boolean when it wasn't and misused it.
- Treat 1 and 2 the same */
- data->set.ssl.primary.verifyhost = (bool)((arg & 3) ? TRUE : FALSE);
+ this argument took a boolean when it wasn't and misused it. We thus ban
+ 1 as a sensible input and we warn about its use. Then we only have the
+ 2 action internally stored as TRUE. */
+
+ if(1 == arg) {
+ failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+
+ data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;
/* Update the current connection ssl_config. */
if(data->conn) {
@@ -1793,15 +1744,23 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.ssl.primary.verifyhost;
}
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSL_VERIFYHOST:
/*
* Enable verification of the host name in the peer certificate for proxy
*/
arg = va_arg(param, long);
- /* Treat both 1 and 2 as TRUE */
- data->set.proxy_ssl.primary.verifyhost = (bool)((arg & 3)?TRUE:FALSE);
+ /* Obviously people are not reading documentation and too many thought
+ this argument took a boolean when it wasn't and misused it. We thus ban
+ 1 as a sensible input and we warn about its use. Then we only have the
+ 2 action internally stored as TRUE. */
+
+ if(1 == arg) {
+ failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ }
+
+ data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;
/* Update the current connection proxy_ssl_config. */
if(data->conn) {
@@ -1809,7 +1768,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.primary.verifyhost;
}
break;
-#endif
case CURLOPT_SSL_VERIFYSTATUS:
/*
* Enable certificate status verifying.
@@ -1882,7 +1840,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
#endif
result = CURLE_NOT_BUILT_IN;
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_PINNEDPUBLICKEY:
/*
* Set pinned public key for SSL connection.
@@ -1896,7 +1853,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
#endif
result = CURLE_NOT_BUILT_IN;
break;
-#endif
case CURLOPT_CAINFO:
/*
* Set CA info for SSL connection. Specify file name of the CA certificate
@@ -1904,7 +1860,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_CAINFO:
/*
* Set CA info SSL connection for proxy. Specify file name of the
@@ -1913,7 +1868,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_CAPATH:
/*
* Set CA path info for SSL connection. Specify directory name of the CA
@@ -1928,7 +1882,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
#endif
result = CURLE_NOT_BUILT_IN;
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_CAPATH:
/*
* Set CA path info for SSL connection proxy. Specify directory name of the
@@ -1943,7 +1896,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
#endif
result = CURLE_NOT_BUILT_IN;
break;
-#endif
case CURLOPT_CRLFILE:
/*
* Set CRL file info for SSL connection. Specify file name of the CRL
@@ -1952,7 +1904,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_CRLFILE:
/*
* Set CRL file info for SSL connection for proxy. Specify file name of the
@@ -1961,7 +1912,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY],
va_arg(param, char *));
break;
-#endif
case CURLOPT_ISSUERCERT:
/*
* Set Issuer certificate file
@@ -1970,14 +1920,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_TELNET
case CURLOPT_TELNETOPTIONS:
/*
* Set a linked list of telnet options
*/
data->set.telnet_options = va_arg(param, struct curl_slist *);
break;
-#endif
+
case CURLOPT_BUFFERSIZE:
/*
* The application kindly asks for a differently sized receive buffer.
@@ -2123,7 +2072,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* Make transfers attempt to use SSL/TLS.
*/
arg = va_arg(param, long);
- if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST))
+ if((arg < CURLUSESSL_NONE) || (arg > CURLUSESSL_ALL))
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.use_ssl = (curl_usessl)arg;
break;
@@ -2135,16 +2084,24 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
break;
-#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSL_OPTIONS:
arg = va_arg(param, long);
data->set.proxy_ssl.enable_beast =
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
break;
-#endif
#endif
+ case CURLOPT_FTPSSLAUTH:
+ /*
+ * Set a specific auth for FTP-SSL transfers.
+ */
+ arg = va_arg(param, long);
+ if((arg < CURLFTPAUTH_DEFAULT) || (arg > CURLFTPAUTH_TLS))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.ftpsslauth = (curl_ftpauth)arg;
+ break;
+
case CURLOPT_IPRESOLVE:
arg = va_arg(param, long);
if((arg < CURL_IPRESOLVE_WHATEVER) || (arg > CURL_IPRESOLVE_V6))
@@ -2170,6 +2127,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.tcp_nodelay = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
+ case CURLOPT_FTP_ACCOUNT:
+ result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
+ va_arg(param, char *));
+ break;
+
case CURLOPT_IGNORE_CONTENT_LENGTH:
data->set.ignorecl = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
@@ -2181,6 +2143,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.connect_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
+ case CURLOPT_FTP_ALTERNATIVE_TO_USER:
+ result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
+ va_arg(param, char *));
+ break;
+
case CURLOPT_SOCKOPTFUNCTION:
/*
* socket callback function: called after socket() but before connect()
@@ -2246,7 +2213,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
break;
-#ifdef USE_SSH
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
/* we only include SSH options if explicitly built to support SSH */
case CURLOPT_SSH_AUTH_TYPES:
data->set.ssh_auth_types = va_arg(param, long);
@@ -2296,11 +2263,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
*/
data->set.ssh_keyfunc_userp = va_arg(param, void *);
break;
-
- case CURLOPT_SSH_COMPRESSION:
- data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE;
- break;
-#endif /* USE_SSH */
+#endif /* USE_LIBSSH2 */
case CURLOPT_HTTP_TRANSFER_DECODING:
/*
@@ -2316,7 +2279,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.http_ce_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
break;
-#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH)
case CURLOPT_NEW_FILE_PERMS:
/*
* Uses these permissions instead of 0644
@@ -2336,20 +2298,17 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.new_directory_perms = arg;
break;
-#endif
case CURLOPT_ADDRESS_SCOPE:
/*
- * Use this scope id when using IPv6
- * We always get longs when passed plain numericals so we should check
- * that the value fits into an unsigned 32 bit integer.
+ * We always get longs when passed plain numericals, but for this value we
+ * know that an unsigned int will always hold the value so we blindly
+ * typecast to this type
*/
- uarg = va_arg(param, unsigned long);
-#if SIZEOF_LONG > 4
- if(uarg > UINT_MAX)
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 0xf))
return CURLE_BAD_FUNCTION_ARGUMENT;
-#endif
- data->set.scope_id = (unsigned int)uarg;
+ data->set.scope_id = curlx_sltoui(arg);
break;
case CURLOPT_PROTOCOLS:
@@ -2363,7 +2322,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_REDIR_PROTOCOLS:
/* set the bitmask for the protocols that libcurl is allowed to follow to,
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
- to be set in both bitmasks to be allowed to get redirected to. */
+ to be set in both bitmasks to be allowed to get redirected to. Defaults
+ to all protocols except FILE and SCP. */
data->set.redir_protocols = va_arg(param, long);
break;
@@ -2372,7 +2332,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL],
va_arg(param, char *));
break;
-#ifndef CURL_DISABLE_SMTP
+
case CURLOPT_MAIL_FROM:
/* Set the SMTP mail originator */
result = Curl_setstropt(&data->set.str[STRING_MAIL_FROM],
@@ -2389,19 +2349,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
/* Set the list of mail recipients */
data->set.mail_rcpt = va_arg(param, struct curl_slist *);
break;
-#endif
-
- case CURLOPT_SASL_AUTHZID:
- /* Authorisation identity (identity to act as) */
- result = Curl_setstropt(&data->set.str[STRING_SASL_AUTHZID],
- va_arg(param, char *));
- break;
case CURLOPT_SASL_IR:
/* Enable/disable SASL initial response */
data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#ifndef CURL_DISABLE_RTSP
+
case CURLOPT_RTSP_REQUEST:
{
/*
@@ -2500,7 +2453,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_RTSP_SERVER_CSEQ:
/* Same as the above, but for server-initiated requests */
- data->state.rtsp_next_server_CSeq = va_arg(param, long);
+ data->state.rtsp_next_client_CSeq = va_arg(param, long);
break;
case CURLOPT_INTERLEAVEDATA:
@@ -2510,8 +2463,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
/* Set the user defined RTP write function */
data->set.fwrite_rtp = va_arg(param, curl_write_callback);
break;
-#endif
-#ifndef CURL_DISABLE_FTP
+
case CURLOPT_WILDCARDMATCH:
data->set.wildcard_enabled = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
@@ -2530,7 +2482,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_FNMATCH_DATA:
data->set.fnmatch_data = va_arg(param, void *);
break;
-#endif
#ifdef USE_TLS_SRP
case CURLOPT_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_ORIG],
@@ -2575,7 +2526,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
break;
#endif
-#ifdef USE_ARES
case CURLOPT_DNS_SERVERS:
result = Curl_set_dns_servers(data, va_arg(param, char *));
break;
@@ -2588,7 +2538,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_DNS_LOCAL_IP6:
result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
break;
-#endif
+
case CURLOPT_TCP_KEEPALIVE:
data->set.tcp_keepalive = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
@@ -2612,14 +2562,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = CURLE_NOT_BUILT_IN;
#endif
break;
-#ifdef USE_NGHTTP2
case CURLOPT_SSL_ENABLE_NPN:
data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
case CURLOPT_SSL_ENABLE_ALPN:
data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#endif
+
#ifdef USE_UNIX_SOCKETS
case CURLOPT_UNIX_SOCKET_PATH:
data->set.abstract_unix_socket = FALSE;
@@ -2670,40 +2619,33 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_SUPPRESS_CONNECT_HEADERS:
data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE;
break;
+ case CURLOPT_SSH_COMPRESSION:
+ data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE;
+ break;
case CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS:
arg = va_arg(param, long);
if(arg < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.happy_eyeballs_timeout = arg;
break;
-#ifndef CURL_DISABLE_SHUFFLE_DNS
case CURLOPT_DNS_SHUFFLE_ADDRESSES:
data->set.dns_shuffle_addresses = (0 != va_arg(param, long)) ? TRUE:FALSE;
break;
-#endif
case CURLOPT_DISALLOW_USERNAME_IN_URL:
data->set.disallow_username_in_url =
(0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#ifndef CURL_DISABLE_DOH
case CURLOPT_DOH_URL:
result = Curl_setstropt(&data->set.str[STRING_DOH],
va_arg(param, char *));
data->set.doh = data->set.str[STRING_DOH]?TRUE:FALSE;
break;
-#endif
case CURLOPT_UPKEEP_INTERVAL_MS:
arg = va_arg(param, long);
if(arg < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
data->set.upkeep_interval_ms = arg;
break;
- case CURLOPT_MAXAGE_CONN:
- arg = va_arg(param, long);
- if(arg < 0)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.maxage_conn = arg;
- break;
case CURLOPT_TRAILERFUNCTION:
#ifndef CURL_DISABLE_HTTP
data->set.trailer_callback = va_arg(param, curl_trailer_callback);
@@ -2725,8 +2667,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_ALTSVC], argptr);
if(result)
return result;
- if(argptr)
- (void)Curl_altsvc_load(data->asi, argptr);
+ (void)Curl_altsvc_load(data->asi, argptr);
break;
case CURLOPT_ALTSVC_CTRL:
if(!data->asi) {
@@ -2768,7 +2709,7 @@ CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
va_start(arg, tag);
- result = Curl_vsetopt(data, tag, arg);
+ result = vsetopt(data, tag, arg);
va_end(arg);
return result;
diff --git a/lib/setopt.h b/lib/setopt.h
index 5e347dd66..c658e04ae 100644
--- a/lib/setopt.h
+++ b/lib/setopt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,7 @@
***************************************************************************/
CURLcode Curl_setstropt(char **charp, const char *s);
-CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list arg);
+CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
+ va_list arg);
#endif /* HEADER_CURL_SETOPT_H */
diff --git a/lib/setup-os400.h b/lib/setup-os400.h
index 629fd94c4..a3c2a7bdc 100644
--- a/lib/setup-os400.h
+++ b/lib/setup-os400.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -206,15 +206,11 @@ extern int Curl_os400_sendto(int sd, char *buffer, int buflen, int flags,
struct sockaddr * dstaddr, int addrlen);
extern int Curl_os400_recvfrom(int sd, char *buffer, int buflen, int flags,
struct sockaddr *fromaddr, int *addrlen);
-extern int Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen);
-extern int Curl_os400_getsockname(int sd, struct sockaddr *addr, int *addrlen);
#define connect Curl_os400_connect
#define bind Curl_os400_bind
#define sendto Curl_os400_sendto
#define recvfrom Curl_os400_recvfrom
-#define getpeername Curl_os400_getpeername
-#define getsockname Curl_os400_getsockname
#ifdef HAVE_LIBZ
#define zlibVersion Curl_os400_zlibVersion
diff --git a/lib/smb.c b/lib/smb.c
index 12f99257f..76c99a230 100644
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
- * Copyright (C) 2016-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2016-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -64,7 +64,8 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done);
static CURLcode smb_done(struct connectdata *conn, CURLcode status,
bool premature);
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode smb_parse_url_path(struct connectdata *conn);
/*
@@ -606,7 +607,6 @@ static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
{
struct smb_conn *smbc = &conn->proto.smbc;
CURLcode result;
- *msg = NULL; /* if it returns early */
/* Check if there is data in the transfer buffer */
if(!smbc->send_size && smbc->upload_size) {
@@ -682,8 +682,7 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
switch(smbc->state) {
case SMB_NEGOTIATE:
- if((smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) ||
- h->status) {
+ if(h->status || smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) {
connclose(conn, "SMB: negotiation failed");
return CURLE_COULDNT_CONNECT;
}
@@ -786,8 +785,6 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
case SMB_OPEN:
if(h->status || smbc->got < sizeof(struct smb_nt_create_response)) {
req->result = CURLE_REMOTE_FILE_NOT_FOUND;
- if(h->status == smb_swap32(SMB_ERR_NOACCESS))
- req->result = CURLE_REMOTE_ACCESS_DENIED;
next_state = SMB_TREE_DISCONNECT;
break;
}
@@ -937,8 +934,12 @@ static CURLcode smb_disconnect(struct connectdata *conn, bool dead)
return CURLE_OK;
}
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}
@@ -956,6 +957,7 @@ static CURLcode smb_do(struct connectdata *conn, bool *done)
static CURLcode smb_parse_url_path(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct smb_request *req = data->req.protop;
struct smb_conn *smbc = &conn->proto.smbc;
@@ -963,8 +965,7 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
char *slash;
/* URL decode the path */
- CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL,
- TRUE);
+ result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL, TRUE);
if(result)
return result;
diff --git a/lib/smtp.c b/lib/smtp.c
index 65220b0f6..f3db714b5 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -28,7 +28,6 @@
* RFC4954 SMTP Authentication
* RFC5321 SMTP protocol
* RFC6749 OAuth 2.0 Authorization Framework
- * RFC8314 Use of TLS for Email Submission and Access
* Draft SMTP URL Interface <draft-earhart-url-smtp-00.txt>
* Draft LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
*
@@ -95,7 +94,8 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
static CURLcode smtp_connect(struct connectdata *conn, bool *done);
static CURLcode smtp_disconnect(struct connectdata *conn, bool dead);
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done);
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode smtp_setup_connection(struct connectdata *conn);
static CURLcode smtp_parse_url_options(struct connectdata *conn);
@@ -358,8 +358,10 @@ static CURLcode smtp_perform_helo(struct connectdata *conn)
*/
static CURLcode smtp_perform_starttls(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the STARTTLS command */
- CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
if(!result)
state(conn, SMTP_STARTTLS);
@@ -375,10 +377,11 @@ static CURLcode smtp_perform_starttls(struct connectdata *conn)
*/
static CURLcode smtp_perform_upgrade_tls(struct connectdata *conn)
{
- /* Start the SSL connection */
+ CURLcode result = CURLE_OK;
struct smtp_conn *smtpc = &conn->proto.smtpc;
- CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
- &smtpc->ssldone);
+
+ /* Start the SSL connection */
+ result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
if(!result) {
if(smtpc->state != SMTP_UPGRADETLS)
@@ -641,8 +644,10 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn)
*/
static CURLcode smtp_perform_quit(struct connectdata *conn)
{
+ CURLcode result = CURLE_OK;
+
/* Send the QUIT command */
- CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
if(!result)
state(conn, SMTP_QUIT);
@@ -714,7 +719,7 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
result = CURLE_REMOTE_ACCESS_DENIED;
}
}
- else if(len >= 4) {
+ else {
line += 4;
len -= 4;
@@ -785,10 +790,6 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
result = smtp_perform_authentication(conn);
}
}
- else {
- failf(data, "Unexpectedly short EHLO response");
- result = CURLE_WEIRD_SERVER_REPLY;
- }
return result;
}
@@ -1117,9 +1118,10 @@ static CURLcode smtp_init(struct connectdata *conn)
}
/* For the SMTP "protocol connect" and "doing" phases only */
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
- return Curl_pp_getsock(&conn->proto.smtpc.pp, socks);
+ return Curl_pp_getsock(&conn->proto.smtpc.pp, socks, numsocks);
}
/***********************************************************************
@@ -1216,7 +1218,7 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
returned CURLE_AGAIN, we duplicate the EOB now rather than when the
bytes written doesn't equal len. */
if(smtp->trailing_crlf || !conn->data->state.infilesize) {
- eob = strdup(&SMTP_EOB[2]);
+ eob = strdup(SMTP_EOB + 2);
len = SMTP_EOB_LEN - 2;
}
else {
@@ -1250,7 +1252,12 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
state(conn, SMTP_POSTDATA);
- /* Run the state-machine */
+ /* Run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the smtp_multi_statemach function but we have no general support for
+ non-blocking DONE operations!
+ */
result = smtp_block_statemach(conn, FALSE);
}
diff --git a/lib/socketpair.c b/lib/socketpair.c
deleted file mode 100644
index 1f0e2e4a4..000000000
--- a/lib/socketpair.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-#include "socketpair.h"
-
-#ifndef HAVE_SOCKETPAIR
-#ifdef WIN32
-/*
- * This is a socketpair() implementation for Windows.
- */
-#include <string.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <windows.h>
-#include <io.h>
-#else
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h> /* IPPROTO_TCP */
-#endif
-#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK 0x7f000001
-#endif /* !INADDR_LOOPBACK */
-#endif /* !WIN32 */
-
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
-#include "memdebug.h"
-
-int Curl_socketpair(int domain, int type, int protocol,
- curl_socket_t socks[2])
-{
- union {
- struct sockaddr_in inaddr;
- struct sockaddr addr;
- } a;
- curl_socket_t listener;
- curl_socklen_t addrlen = sizeof(a.inaddr);
- int reuse = 1;
- char data[2][12];
- ssize_t dlen;
- (void)domain;
- (void)type;
- (void)protocol;
-
- listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(listener == CURL_SOCKET_BAD)
- return -1;
-
- memset(&a, 0, sizeof(a));
- a.inaddr.sin_family = AF_INET;
- a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- a.inaddr.sin_port = 0;
-
- socks[0] = socks[1] = CURL_SOCKET_BAD;
-
- if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
- (char *)&reuse, (curl_socklen_t)sizeof(reuse)) == -1)
- goto error;
- if(bind(listener, &a.addr, sizeof(a.inaddr)) == -1)
- goto error;
- if(getsockname(listener, &a.addr, &addrlen) == -1)
- goto error;
- if(listen(listener, 1) == -1)
- goto error;
- socks[0] = socket(AF_INET, SOCK_STREAM, 0);
- if(socks[0] == CURL_SOCKET_BAD)
- goto error;
- if(connect(socks[0], &a.addr, sizeof(a.inaddr)) == -1)
- goto error;
- socks[1] = accept(listener, NULL, NULL);
- if(socks[1] == CURL_SOCKET_BAD)
- goto error;
-
- /* verify that nothing else connected */
- msnprintf(data[0], sizeof(data[0]), "%p", socks);
- dlen = strlen(data[0]);
- if(swrite(socks[0], data[0], dlen) != dlen)
- goto error;
- if(sread(socks[1], data[1], sizeof(data[1])) != dlen)
- goto error;
- if(memcmp(data[0], data[1], dlen))
- goto error;
-
- sclose(listener);
- return 0;
-
- error:
- sclose(listener);
- sclose(socks[0]);
- sclose(socks[1]);
- return -1;
-}
-
-#endif /* ! HAVE_SOCKETPAIR */
diff --git a/lib/socketpair.h b/lib/socketpair.h
deleted file mode 100644
index be9fb24f9..000000000
--- a/lib/socketpair.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef HEADER_CURL_SOCKETPAIR_H
-#define HEADER_CURL_SOCKETPAIR_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-#ifndef HAVE_SOCKETPAIR
-int Curl_socketpair(int domain, int type, int protocol,
- curl_socket_t socks[2]);
-#else
-#define Curl_socketpair(a,b,c,d) socketpair(a,b,c,d)
-#endif
-
-/* Defined here to allow specific build configs to disable it completely */
-#define USE_SOCKETPAIR 1
-
-#endif /* HEADER_CURL_SOCKETPAIR_H */
diff --git a/lib/socks.c b/lib/socks.c
index 6ae98184d..d0aba0605 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -38,9 +38,7 @@
#include "timeval.h"
#include "socks.h"
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
+/* The last #include file should be: */
#include "memdebug.h"
/*
@@ -157,7 +155,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
Curl_addrinfo *hp = NULL;
int rc;
- rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ rc = Curl_resolv(conn, hostname, remote_port, &dns);
if(rc == CURLRESOLV_ERROR)
return CURLE_COULDNT_RESOLVE_PROXY;
@@ -292,7 +290,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
/* wrong version ? */
if(socksreq[0] != 0) {
failf(data,
- "SOCKS4 reply has wrong version, version should be 0.");
+ "SOCKS4 reply has wrong version, version should be 4.");
return CURLE_COULDNT_CONNECT;
}
@@ -374,9 +372,8 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
o REP Reply field:
o X'00' succeeded
*/
-#define REQUEST_BUFSIZE 600 /* room for large user/pw (255 max each) */
- unsigned char socksreq[REQUEST_BUFSIZE];
- char dest[REQUEST_BUFSIZE] = "unknown"; /* printable hostname:port */
+
+ unsigned char socksreq[600]; /* room for large user/pw (255 max each) */
int idx;
ssize_t actualread;
ssize_t written;
@@ -530,24 +527,12 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
len = 0;
socksreq[len++] = 1; /* username/pw subnegotiation version */
socksreq[len++] = (unsigned char) proxy_user_len;
- if(proxy_user && proxy_user_len) {
- /* the length must fit in a single byte */
- if(proxy_user_len >= 255) {
- failf(data, "Excessive user name length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
+ if(proxy_user && proxy_user_len)
memcpy(socksreq + len, proxy_user, proxy_user_len);
- }
len += proxy_user_len;
socksreq[len++] = (unsigned char) proxy_password_len;
- if(proxy_password && proxy_password_len) {
- /* the length must fit in a single byte */
- if(proxy_password_len > 255) {
- failf(data, "Excessive password length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
+ if(proxy_password && proxy_password_len)
memcpy(socksreq + len, proxy_password, proxy_password_len);
- }
len += proxy_password_len;
code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
@@ -608,13 +593,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
socksreq[len++] = (char) hostname_len; /* address length */
memcpy(&socksreq[len], hostname, hostname_len); /* address str w/o NULL */
len += hostname_len;
- msnprintf(dest, sizeof(dest), "%s:%d", hostname, remote_port);
- infof(data, "SOCKS5 connect to %s (remotely resolved)\n", dest);
}
else {
struct Curl_dns_entry *dns;
Curl_addrinfo *hp = NULL;
- int rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ int rc = Curl_resolv(conn, hostname, remote_port, &dns);
if(rc == CURLRESOLV_ERROR)
return CURLE_COULDNT_RESOLVE_HOST;
@@ -633,13 +616,8 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
if(dns)
hp = dns->addr;
if(hp) {
- if(Curl_printable_address(hp, dest, sizeof(dest))) {
- size_t destlen = strlen(dest);
- msnprintf(dest + destlen, sizeof(dest) - destlen, ":%d", remote_port);
- }
- else {
- strcpy(dest, "unknown");
- }
+ char buf[64];
+ Curl_printable_address(hp, buf, sizeof(buf));
if(hp->ai_family == AF_INET) {
int i;
@@ -651,7 +629,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
}
- infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", dest);
+ infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", buf);
}
#ifdef ENABLE_IPV6
else if(hp->ai_family == AF_INET6) {
@@ -665,13 +643,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
}
- infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
+ infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", buf);
}
#endif
else {
hp = NULL; /* fail! */
- failf(data, "SOCKS5 connection to %s not supported\n", dest);
+ failf(data, "SOCKS5 connection to %s not supported\n", buf);
}
Curl_resolv_unlock(data, dns); /* not used anymore from now on */
@@ -766,8 +744,42 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
#endif
if(socksreq[1] != 0) { /* Anything besides 0 is an error */
- failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
- dest, (unsigned char)socksreq[1]);
+ if(socksreq[3] == 1) {
+ failf(data,
+ "Can't complete SOCKS5 connection to %d.%d.%d.%d:%d. (%d)",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[8] << 8) |
+ (unsigned char)socksreq[9]),
+ (unsigned char)socksreq[1]);
+ }
+ else if(socksreq[3] == 3) {
+ unsigned char port_upper = (unsigned char)socksreq[len - 2];
+ socksreq[len - 2] = 0;
+ failf(data,
+ "Can't complete SOCKS5 connection to %s:%d. (%d)",
+ (char *)&socksreq[5],
+ ((port_upper << 8) |
+ (unsigned char)socksreq[len - 1]),
+ (unsigned char)socksreq[1]);
+ socksreq[len - 2] = port_upper;
+ }
+ else if(socksreq[3] == 4) {
+ failf(data,
+ "Can't complete SOCKS5 connection to %02x%02x:%02x%02x:"
+ "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%d. (%d)",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (unsigned char)socksreq[8], (unsigned char)socksreq[9],
+ (unsigned char)socksreq[10], (unsigned char)socksreq[11],
+ (unsigned char)socksreq[12], (unsigned char)socksreq[13],
+ (unsigned char)socksreq[14], (unsigned char)socksreq[15],
+ (unsigned char)socksreq[16], (unsigned char)socksreq[17],
+ (unsigned char)socksreq[18], (unsigned char)socksreq[19],
+ (((unsigned char)socksreq[20] << 8) |
+ (unsigned char)socksreq[21]),
+ (unsigned char)socksreq[1]);
+ }
return CURLE_COULDNT_CONNECT;
}
infof(data, "SOCKS5 request granted.\n");
diff --git a/lib/splay.c b/lib/splay.c
index 0f5fcd1e8..baf07e00d 100644
--- a/lib/splay.c
+++ b/lib/splay.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1997 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -198,7 +198,7 @@ struct Curl_tree *Curl_splaygetbest(struct curltime i,
/* Deletes the very node we point out from the tree if it's there. Stores a
* pointer to the new resulting tree in 'newroot'.
*
- * Returns zero on success and non-zero on errors!
+ * Returns zero on success and non-zero on errors! TODO: document error codes.
* When returning error, it does not touch the 'newroot' pointer.
*
* NOTE: when the last node of the tree is removed, there's no tree left so
diff --git a/lib/splay.h b/lib/splay.h
index 9292f349b..4612ec271 100644
--- a/lib/splay.h
+++ b/lib/splay.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1997 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,4 +59,10 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
( ((i.tv_usec) < (j.tv_usec)) ? -1 : \
( ((i.tv_usec) > (j.tv_usec)) ? 1 : 0))))
+#ifdef DEBUGBUILD
+void Curl_splayprint(struct Curl_tree * t, int d, char output);
+#else
+#define Curl_splayprint(x,y,z) Curl_nop_stmt
+#endif
+
#endif /* HEADER_CURL_SPLAY_H */
diff --git a/lib/vssh/libssh.c b/lib/ssh-libssh.c
index cad8b3786..609da1e09 100644
--- a/lib/vssh/libssh.c
+++ b/lib/ssh-libssh.c
@@ -126,9 +126,13 @@ CURLcode sftp_perform(struct connectdata *conn,
static void sftp_quote(struct connectdata *conn);
static void sftp_quote_stat(struct connectdata *conn);
-static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock);
+
+static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock,
+ int numsocks);
+
static int myssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock);
+ curl_socket_t *sock,
+ int numsocks);
static CURLcode myssh_setup_connection(struct connectdata *conn);
@@ -493,7 +497,7 @@ restart:
return SSH_ERROR;
nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
- if(nprompts != 1)
+ if(nprompts == SSH_ERROR || nprompts != 1)
return SSH_ERROR;
rc = ssh_userauth_kbdint_setanswer(sshc->ssh_session, 0, conn->passwd);
@@ -1115,7 +1119,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
flags = O_WRONLY|O_APPEND;
else
/* Clear file before writing (normal behaviour) */
- flags = O_WRONLY|O_CREAT|O_TRUNC;
+ flags = O_WRONLY|O_APPEND|O_CREAT|O_TRUNC;
if(sshc->sftp_file)
sftp_close(sshc->sftp_file);
@@ -1356,7 +1360,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
}
- else if(sftp_dir_eof(sshc->sftp_dir)) {
+ else if(sshc->readdir_attrs == NULL && sftp_dir_eof(sshc->sftp_dir)) {
state(conn, SSH_SFTP_READDIR_DONE);
break;
}
@@ -1909,9 +1913,13 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
/* called by the multi interface to figure out what socket(s) to wait for and
for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int myssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to numsocks
+ number of sockets */
+ int numsocks)
{
int bitmap = GETSOCK_BLANK;
+ (void) numsocks;
+
sock[0] = conn->sock[FIRSTSOCKET];
if(conn->waitfor & KEEP_RECV)
@@ -1926,23 +1934,26 @@ static int myssh_perform_getsock(const struct connectdata *conn,
/* Generic function called by the multi interface to figure out what socket(s)
to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int myssh_getsock(struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to numsocks
+ number of sockets */
+ int numsocks)
{
/* if we know the direction we can use the generic *_getsock() function even
for the protocol_connect and doing states */
- return myssh_perform_getsock(conn, sock);
+ return myssh_perform_getsock(conn, sock, numsocks);
}
static void myssh_block2waitfor(struct connectdata *conn, bool block)
{
struct ssh_conn *sshc = &conn->proto.sshc;
+ int dir;
/* If it didn't block, or nothing was returned by ssh_get_poll_flags
* have the original set */
conn->waitfor = sshc->orig_waitfor;
if(block) {
- int dir = ssh_get_poll_flags(sshc->ssh_session);
+ dir = ssh_get_poll_flags(sshc->ssh_session);
if(dir & SSH_READ_PENDING) {
/* translate the libssh define bits into our own bit defines */
conn->waitfor = KEEP_RECV;
@@ -1958,10 +1969,11 @@ static CURLcode myssh_multi_statemach(struct connectdata *conn,
bool *done)
{
struct ssh_conn *sshc = &conn->proto.sshc;
+ CURLcode result = CURLE_OK;
bool block; /* we store the status and use that to provide a ssh_getsock()
implementation */
- CURLcode result = myssh_statemach_act(conn, &block);
+ result = myssh_statemach_act(conn, &block);
*done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
myssh_block2waitfor(conn, block);
@@ -1999,8 +2011,10 @@ static CURLcode myssh_block_statemach(struct connectdata *conn,
}
}
- if(block) {
- curl_socket_t fd_read = conn->sock[FIRSTSOCKET];
+ if(!result && block) {
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
+ curl_socket_t fd_read = CURL_SOCKET_BAD;
+ fd_read = sock;
/* wait for the socket to become ready */
(void) Curl_socket_check(fd_read, CURL_SOCKET_BAD,
CURL_SOCKET_BAD, left > 1000 ? 1000 : left);
@@ -2038,6 +2052,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
CURLcode result;
curl_socket_t sock = conn->sock[FIRSTSOCKET];
struct Curl_easy *data = conn->data;
+ int rc;
/* initialize per-handle data if not already */
if(!data->req.protop)
@@ -2091,8 +2106,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
ssh->pubkey = NULL;
if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
- int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
- &ssh->pubkey);
+ rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
+ &ssh->pubkey);
if(rc != SSH_OK) {
failf(data, "Could not load public key file");
/* ignore */
@@ -2212,7 +2227,12 @@ static CURLcode myssh_done(struct connectdata *conn, CURLcode status)
struct SSHPROTO *protop = conn->data->req.protop;
if(!status) {
- /* run the state-machine */
+ /* run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the ssh_multi_statemach function but we have no general support for
+ non-blocking DONE operations!
+ */
result = myssh_block_statemach(conn, FALSE);
}
else
@@ -2725,23 +2745,5 @@ static void sftp_quote_stat(struct connectdata *conn)
return;
}
-CURLcode Curl_ssh_init(void)
-{
- if(ssh_init()) {
- DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
- return CURLE_FAILED_INIT;
- }
- return CURLE_OK;
-}
-
-void Curl_ssh_cleanup(void)
-{
- (void)ssh_finalize();
-}
-
-size_t Curl_ssh_version(char *buffer, size_t buflen)
-{
- return msnprintf(buffer, buflen, "libssh/%s", CURL_LIBSSH_VERSION);
-}
#endif /* USE_LIBSSH */
diff --git a/lib/vssh/libssh2.c b/lib/ssh.c
index c71cfbc9f..46f52eceb 100644
--- a/lib/vssh/libssh2.c
+++ b/lib/ssh.c
@@ -125,9 +125,17 @@ static
CURLcode sftp_perform(struct connectdata *conn,
bool *connected,
bool *dophase_done);
-static int ssh_getsock(struct connectdata *conn, curl_socket_t *sock);
+
+static int ssh_getsock(struct connectdata *conn,
+ curl_socket_t *sock, /* points to numsocks number
+ of sockets */
+ int numsocks);
+
static int ssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock);
+ curl_socket_t *sock, /* points to numsocks
+ number of sockets */
+ int numsocks);
+
static CURLcode ssh_setup_connection(struct connectdata *conn);
/*
@@ -282,6 +290,10 @@ static CURLcode libssh2_session_error_to_CURLE(int err)
return CURLE_AGAIN;
}
+ /* TODO: map some more of the libssh2 errors to the more appropriate CURLcode
+ error code, and possibly add a few new SSH-related one. We must however
+ not return or even depend on libssh2 errors in the public libcurl API */
+
return CURLE_SSH;
}
@@ -579,13 +591,13 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
struct Curl_easy *data = conn->data;
const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
char md5buffer[33];
+ int i;
const char *fingerprint = libssh2_hostkey_hash(sshc->ssh_session,
LIBSSH2_HOSTKEY_HASH_MD5);
if(fingerprint) {
/* The fingerprint points to static storage (!), don't free() it. */
- int i;
for(i = 0; i < 16; i++)
msnprintf(&md5buffer[i*2], 3, "%02x", (unsigned char) fingerprint[i]);
infof(data, "SSH MD5 fingerprint: %s\n", md5buffer);
@@ -725,17 +737,18 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) &&
(strstr(sshc->authlist, "publickey") != NULL)) {
+ char *home = NULL;
bool out_of_memory = FALSE;
sshc->rsa_pub = sshc->rsa = NULL;
+ /* To ponder about: should really the lib be messing about with the
+ HOME environment variable etc? */
+ home = curl_getenv("HOME");
+
if(data->set.str[STRING_SSH_PRIVATE_KEY])
sshc->rsa = strdup(data->set.str[STRING_SSH_PRIVATE_KEY]);
else {
- /* To ponder about: should really the lib be messing about with the
- HOME environment variable etc? */
- char *home = curl_getenv("HOME");
-
/* If no private key file is specified, try some common paths. */
if(home) {
/* Try ~/.ssh first. */
@@ -751,7 +764,6 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
Curl_safefree(sshc->rsa);
}
}
- free(home);
}
if(!out_of_memory && !sshc->rsa) {
/* Nothing found; try the current dir. */
@@ -783,6 +795,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
if(out_of_memory || sshc->rsa == NULL) {
+ free(home);
Curl_safefree(sshc->rsa);
Curl_safefree(sshc->rsa_pub);
state(conn, SSH_SESSION_FREE);
@@ -794,6 +807,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(!sshc->passphrase)
sshc->passphrase = "";
+ free(home);
+
if(sshc->rsa_pub)
infof(data, "Using SSH public key file '%s'\n", sshc->rsa_pub);
infof(data, "Using SSH private key file '%s'\n", sshc->rsa);
@@ -2692,10 +2707,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* called by the multi interface to figure out what socket(s) to wait for and
for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int ssh_perform_getsock(const struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to numsocks
+ number of sockets */
+ int numsocks)
{
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
int bitmap = GETSOCK_BLANK;
+ (void)numsocks;
sock[0] = conn->sock[FIRSTSOCKET];
@@ -2709,25 +2727,28 @@ static int ssh_perform_getsock(const struct connectdata *conn,
#else
/* if we don't know the direction we can use the generic *_getsock()
function even for the protocol_connect and doing states */
- return Curl_single_getsock(conn, sock);
+ return Curl_single_getsock(conn, sock, numsocks);
#endif
}
/* Generic function called by the multi interface to figure out what socket(s)
to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int ssh_getsock(struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to numsocks number
+ of sockets */
+ int numsocks)
{
#ifndef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
(void)conn;
(void)sock;
+ (void)numsocks;
/* if we don't know any direction we can just play along as we used to and
not provide any sensible info */
return GETSOCK_BLANK;
#else
/* if we know the direction we can use the generic *_getsock() function even
for the protocol_connect and doing states */
- return ssh_perform_getsock(conn, sock);
+ return ssh_perform_getsock(conn, sock, numsocks);
#endif
}
@@ -2811,7 +2832,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
}
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
- if(block) {
+ if(!result && block) {
int dir = libssh2_session_block_directions(sshc->ssh_session);
curl_socket_t sock = conn->sock[FIRSTSOCKET];
curl_socket_t fd_read = CURL_SOCKET_BAD;
@@ -2822,7 +2843,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
fd_write = sock;
/* wait for the socket to become ready */
(void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
- left>1000?1000:(time_t)left);
+ left>1000?1000:left); /* ignore result */
}
#endif
@@ -3044,7 +3065,12 @@ static CURLcode ssh_done(struct connectdata *conn, CURLcode status)
struct SSHPROTO *sftp_scp = conn->data->req.protop;
if(!status) {
- /* run the state-machine */
+ /* run the state-machine
+
+ TODO: when the multi interface is used, this _really_ should be using
+ the ssh_multi_statemach function but we have no general support for
+ non-blocking DONE operations!
+ */
result = ssh_block_statemach(conn, FALSE);
}
else
@@ -3320,27 +3346,4 @@ static const char *sftp_libssh2_strerror(int err)
return "Unknown error in libssh2";
}
-CURLcode Curl_ssh_init(void)
-{
-#ifdef HAVE_LIBSSH2_INIT
- if(libssh2_init(0)) {
- DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
- return CURLE_FAILED_INIT;
- }
-#endif
- return CURLE_OK;
-}
-
-void Curl_ssh_cleanup(void)
-{
-#ifdef HAVE_LIBSSH2_EXIT
- (void)libssh2_exit();
-#endif
-}
-
-size_t Curl_ssh_version(char *buffer, size_t buflen)
-{
- return msnprintf(buffer, buflen, "libssh2/%s", LIBSSH2_VERSION);
-}
-
#endif /* USE_LIBSSH2 */
diff --git a/lib/ssh.h b/lib/ssh.h
index 3213c5a52..0620aac32 100644
--- a/lib/ssh.h
+++ b/lib/ssh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -239,16 +239,7 @@ extern const struct Curl_handler Curl_handler_sftp;
extern const struct Curl_handler Curl_handler_scp;
extern const struct Curl_handler Curl_handler_sftp;
-#endif /* USE_LIBSSH2 */
-#ifdef USE_SSH
-/* generic SSH backend functions */
-CURLcode Curl_ssh_init(void);
-void Curl_ssh_cleanup(void);
-size_t Curl_ssh_version(char *buffer, size_t buflen);
-#else
-/* for non-SSH builds */
-#define Curl_ssh_cleanup()
-#endif
+#endif /* USE_LIBSSH2 */
#endif /* HEADER_CURL_SSH_H */
diff --git a/lib/strcase.c b/lib/strcase.c
index a89471225..24bcca932 100644
--- a/lib/strcase.c
+++ b/lib/strcase.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -93,75 +93,6 @@ char Curl_raw_toupper(char in)
return in;
}
-
-/* Portable, consistent tolower (remember EBCDIC). Do not use tolower() because
- its behavior is altered by the current locale. */
-char Curl_raw_tolower(char in)
-{
-#if !defined(CURL_DOES_CONVERSIONS)
- if(in >= 'A' && in <= 'Z')
- return (char)('a' + in - 'A');
-#else
- switch(in) {
- case 'A':
- return 'a';
- case 'B':
- return 'b';
- case 'C':
- return 'c';
- case 'D':
- return 'd';
- case 'E':
- return 'e';
- case 'F':
- return 'f';
- case 'G':
- return 'g';
- case 'H':
- return 'h';
- case 'I':
- return 'i';
- case 'J':
- return 'j';
- case 'K':
- return 'k';
- case 'L':
- return 'l';
- case 'M':
- return 'm';
- case 'N':
- return 'n';
- case 'O':
- return 'o';
- case 'P':
- return 'p';
- case 'Q':
- return 'q';
- case 'R':
- return 'r';
- case 'S':
- return 's';
- case 'T':
- return 't';
- case 'U':
- return 'u';
- case 'V':
- return 'v';
- case 'W':
- return 'w';
- case 'X':
- return 'x';
- case 'Y':
- return 'y';
- case 'Z':
- return 'z';
- }
-#endif
-
- return in;
-}
-
-
/*
* Curl_strcasecompare() is for doing "raw" case insensitive strings. This is
* meant to be locale independent and only compare strings we know are safe
@@ -234,21 +165,6 @@ void Curl_strntoupper(char *dest, const char *src, size_t n)
} while(*src++ && --n);
}
-/* Copy a lower case version of the string from src to dest. The
- * strings may overlap. No more than n characters of the string are copied
- * (including any NUL) and the destination string will NOT be
- * NUL-terminated if that limit is reached.
- */
-void Curl_strntolower(char *dest, const char *src, size_t n)
-{
- if(n < 1)
- return;
-
- do {
- *dest++ = Curl_raw_tolower(*src);
- } while(*src++ && --n);
-}
-
/* --- public functions --- */
int curl_strequal(const char *first, const char *second)
diff --git a/lib/strcase.h b/lib/strcase.h
index baa768b2b..6fee3840e 100644
--- a/lib/strcase.h
+++ b/lib/strcase.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,13 +40,11 @@ int Curl_safe_strcasecompare(const char *first, const char *second);
int Curl_strncasecompare(const char *first, const char *second, size_t max);
char Curl_raw_toupper(char in);
-char Curl_raw_tolower(char in);
/* checkprefix() is a shorter version of the above, used when the first
argument is zero-byte terminated */
#define checkprefix(a,b) curl_strnequal(a,b,strlen(a))
void Curl_strntoupper(char *dest, const char *src, size_t n);
-void Curl_strntolower(char *dest, const char *src, size_t n);
#endif /* HEADER_CURL_STRCASE_H */
diff --git a/lib/strerror.c b/lib/strerror.c
index d0650d80c..e273f3765 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -311,9 +311,6 @@ curl_easy_strerror(CURLcode error)
case CURLE_RECURSIVE_API_CALL:
return "API function called from within callback";
- case CURLE_AUTH_ERROR:
- return "An authentication function returned an error";
-
/* error codes not used by current libcurl */
case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24:
diff --git a/lib/system_win32.c b/lib/system_win32.c
index 52a5fd951..f7f817dd4 100644
--- a/lib/system_win32.c
+++ b/lib/system_win32.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2017, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,12 +36,6 @@
LARGE_INTEGER Curl_freq;
bool Curl_isVistaOrGreater;
-/* Handle of iphlpapp.dll */
-static HMODULE s_hIpHlpApiDll = NULL;
-
-/* Pointer to the if_nametoindex function */
-IF_NAMETOINDEX_FN Curl_if_nametoindex = NULL;
-
/* Curl_win32_init() performs win32 global initialization */
CURLcode Curl_win32_init(long flags)
{
@@ -95,17 +89,6 @@ CURLcode Curl_win32_init(long flags)
}
#endif
- s_hIpHlpApiDll = Curl_load_library(TEXT("iphlpapi.dll"));
- if(s_hIpHlpApiDll) {
- /* Get the address of the if_nametoindex function */
- IF_NAMETOINDEX_FN pIfNameToIndex =
- CURLX_FUNCTION_CAST(IF_NAMETOINDEX_FN,
- (GetProcAddress(s_hIpHlpApiDll, "if_nametoindex")));
-
- if(pIfNameToIndex)
- Curl_if_nametoindex = pIfNameToIndex;
- }
-
if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT,
VERSION_GREATER_THAN_EQUAL)) {
Curl_isVistaOrGreater = TRUE;
@@ -120,12 +103,6 @@ CURLcode Curl_win32_init(long flags)
/* Curl_win32_cleanup() is the opposite of Curl_win32_init() */
void Curl_win32_cleanup(long init_flags)
{
- if(s_hIpHlpApiDll) {
- FreeLibrary(s_hIpHlpApiDll);
- s_hIpHlpApiDll = NULL;
- Curl_if_nametoindex = NULL;
- }
-
#ifdef USE_WINDOWS_SSPI
Curl_sspi_global_cleanup();
#endif
@@ -137,6 +114,10 @@ void Curl_win32_cleanup(long init_flags)
}
}
+#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
+ defined(USE_WINSOCK))
+
+
#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
#endif
@@ -159,6 +140,8 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
# define LOADLIBARYEX "LoadLibraryExA"
#endif
+#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
+
/*
* Curl_verify_windows_version()
*
@@ -351,6 +334,9 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
return matched;
}
+#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
+ defined(USE_WINSOCK))
+
/*
* Curl_load_library()
*
@@ -367,7 +353,6 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
*/
HMODULE Curl_load_library(LPCTSTR filename)
{
-#ifndef CURL_WINDOWS_APP
HMODULE hModule = NULL;
LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
@@ -422,12 +407,10 @@ HMODULE Curl_load_library(LPCTSTR filename)
free(path);
}
}
+
return hModule;
-#else
- /* the Universal Windows Platform (UWP) can't do this */
- (void)filename;
- return NULL;
-#endif
}
+#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
+
#endif /* WIN32 */
diff --git a/lib/system_win32.h b/lib/system_win32.h
index d2882fce1..926328a9a 100644
--- a/lib/system_win32.h
+++ b/lib/system_win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,21 +48,20 @@ typedef enum {
PLATFORM_WINNT
} PlatformIdentifier;
-/* We use our own typedef here since some headers might lack this */
-typedef unsigned int(WINAPI *IF_NAMETOINDEX_FN)(const char *);
-
-/* This is used instead of if_nametoindex if available on Windows */
-extern IF_NAMETOINDEX_FN Curl_if_nametoindex;
-
/* This is used to verify if we are running on a specific windows version */
bool Curl_verify_windows_version(const unsigned int majorVersion,
const unsigned int minorVersion,
const PlatformIdentifier platform,
const VersionCondition condition);
+#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
+ defined(USE_WINSOCK))
+
/* This is used to dynamically load DLLs */
HMODULE Curl_load_library(LPCTSTR filename);
+#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
+
#endif /* WIN32 */
#endif /* HEADER_CURL_SYSTEM_WIN32_H */
diff --git a/lib/tftp.c b/lib/tftp.c
index 346f293dc..8b92b7bd6 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -157,7 +157,8 @@ static CURLcode tftp_done(struct connectdata *conn,
static CURLcode tftp_setup_connection(struct connectdata * conn);
static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
static CURLcode tftp_translate_code(tftp_error_t error);
@@ -403,14 +404,13 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
return CURLE_OK;
}
-static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
- char *buf, const char *option)
+static size_t tftp_option_add(tftp_state_data_t *state, size_t csize,
+ char *buf, const char *option)
{
- if(( strlen(option) + *csize + 1) > (size_t)state->blksize)
- return CURLE_TFTP_ILLEGAL;
+ if(( strlen(option) + csize + 1) > (size_t)state->blksize)
+ return 0;
strcpy(buf, option);
- *csize += strlen(option) + 1;
- return CURLE_OK;
+ return strlen(option) + 1;
}
static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
@@ -511,38 +511,26 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
else
strcpy(buf, "0"); /* the destination is large enough */
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_TSIZE);
- if(result == CURLE_OK)
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes, buf);
-
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_TSIZE);
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes, buf);
/* add blksize option */
msnprintf(buf, sizeof(buf), "%d", state->requested_blksize);
- if(result == CURLE_OK)
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_BLKSIZE);
- if(result == CURLE_OK)
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes, buf);
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_BLKSIZE);
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes, buf);
/* add timeout option */
msnprintf(buf, sizeof(buf), "%d", state->retry_time);
- if(result == CURLE_OK)
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes,
- TFTP_OPTION_INTERVAL);
- if(result == CURLE_OK)
- result = tftp_option_add(state, &sbytes,
- (char *)state->spacket.data + sbytes, buf);
-
- if(result != CURLE_OK) {
- failf(data, "TFTP buffer too small for options");
- free(filename);
- return CURLE_TFTP_ILLEGAL;
- }
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes,
+ TFTP_OPTION_INTERVAL);
+ sbytes += tftp_option_add(state, sbytes,
+ (char *)state->spacket.data + sbytes, buf);
}
/* the typecase for the 3rd argument is mostly for systems that do
@@ -985,7 +973,6 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
{
tftp_state_data_t *state;
int blksize;
- int need_blksize;
blksize = TFTP_BLKSIZE_DEFAULT;
@@ -1000,20 +987,15 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
return CURLE_TFTP_ILLEGAL;
}
- need_blksize = blksize;
- /* default size is the fallback when no OACK is received */
- if(need_blksize < TFTP_BLKSIZE_DEFAULT)
- need_blksize = TFTP_BLKSIZE_DEFAULT;
-
if(!state->rpacket.data) {
- state->rpacket.data = calloc(1, need_blksize + 2 + 2);
+ state->rpacket.data = calloc(1, blksize + 2 + 2);
if(!state->rpacket.data)
return CURLE_OUT_OF_MEMORY;
}
if(!state->spacket.data) {
- state->spacket.data = calloc(1, need_blksize + 2 + 2);
+ state->spacket.data = calloc(1, blksize + 2 + 2);
if(!state->spacket.data)
return CURLE_OUT_OF_MEMORY;
@@ -1027,7 +1009,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
state->sockfd = state->conn->sock[FIRSTSOCKET];
state->state = TFTP_STATE_START;
state->error = TFTP_ERR_NONE;
- state->blksize = TFTP_BLKSIZE_DEFAULT; /* Unless updated by OACK response */
+ state->blksize = TFTP_BLKSIZE_DEFAULT;
state->requested_blksize = blksize;
((struct sockaddr *)&state->local_addr)->sa_family =
@@ -1100,9 +1082,14 @@ static CURLcode tftp_done(struct connectdata *conn, CURLcode status,
* The getsock callback
*
**********************************************************/
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks)
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
socks[0] = conn->sock[FIRSTSOCKET];
+
return GETSOCK_READSOCK(0);
}
@@ -1389,7 +1376,7 @@ static CURLcode tftp_setup_connection(struct connectdata * conn)
struct Curl_easy *data = conn->data;
char *type;
- conn->transport = TRNSPRT_UDP;
+ conn->socktype = SOCK_DGRAM; /* UDP datagram based */
/* TFTP URLs support an extension like ";mode=<typecode>" that
* we'll try to get now! */
diff --git a/lib/timeval.c b/lib/timeval.c
index 9b05cf051..ff8d8a69a 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -66,9 +66,7 @@ struct curltime Curl_now(void)
** in any case the time starting point does not change once that the
** system has started up.
*/
-#ifdef HAVE_GETTIMEOFDAY
struct timeval now;
-#endif
struct curltime cnow;
struct timespec tsnow;
@@ -174,6 +172,14 @@ struct curltime Curl_now(void)
#endif
+#if SIZEOF_TIME_T < 8
+#define TIME_MAX INT_MAX
+#define TIME_MIN INT_MIN
+#else
+#define TIME_MAX 9223372036854775807LL
+#define TIME_MIN -9223372036854775807LL
+#endif
+
/*
* Returns: time difference in number of milliseconds. For too large diffs it
* returns max value.
@@ -183,10 +189,10 @@ struct curltime Curl_now(void)
timediff_t Curl_timediff(struct curltime newer, struct curltime older)
{
timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
- if(diff >= (TIMEDIFF_T_MAX/1000))
- return TIMEDIFF_T_MAX;
- else if(diff <= (TIMEDIFF_T_MIN/1000))
- return TIMEDIFF_T_MIN;
+ if(diff >= (TIME_MAX/1000))
+ return TIME_MAX;
+ else if(diff <= (TIME_MIN/1000))
+ return TIME_MIN;
return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
}
@@ -197,9 +203,9 @@ timediff_t Curl_timediff(struct curltime newer, struct curltime older)
timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
{
timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
- if(diff >= (TIMEDIFF_T_MAX/1000000))
- return TIMEDIFF_T_MAX;
- else if(diff <= (TIMEDIFF_T_MIN/1000000))
- return TIMEDIFF_T_MIN;
+ if(diff >= (TIME_MAX/1000000))
+ return TIME_MAX;
+ else if(diff <= (TIME_MIN/1000000))
+ return TIME_MIN;
return diff * 1000000 + newer.tv_usec-older.tv_usec;
}
diff --git a/lib/timeval.h b/lib/timeval.h
index 53e063607..96867d713 100644
--- a/lib/timeval.h
+++ b/lib/timeval.h
@@ -24,13 +24,13 @@
#include "curl_setup.h"
-/* Use a larger type even for 32 bit time_t systems so that we can keep
- microsecond accuracy in it */
+#if SIZEOF_TIME_T < 8
+typedef int timediff_t;
+#define CURL_FORMAT_TIMEDIFF_T "d"
+#else
typedef curl_off_t timediff_t;
#define CURL_FORMAT_TIMEDIFF_T CURL_FORMAT_CURL_OFF_T
-
-#define TIMEDIFF_T_MAX CURL_OFF_T_MAX
-#define TIMEDIFF_T_MIN CURL_OFF_T_MIN
+#endif
struct curltime {
time_t tv_sec; /* seconds */
diff --git a/lib/transfer.c b/lib/transfer.c
index d0d4aeb50..ca6031724 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -157,8 +157,15 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
size_t buffersize = bytes;
size_t nread;
+#ifndef CURL_DISABLE_HTTP
+ struct curl_slist *trailers = NULL;
+ CURLcode c;
+ int trailers_ret_code;
+#endif
+
curl_read_callback readfunc = NULL;
void *extra_data = NULL;
+ bool added_crlf = FALSE;
#ifdef CURL_DOES_CONVERSIONS
bool sending_http_headers = FALSE;
@@ -175,10 +182,6 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
#ifndef CURL_DISABLE_HTTP
if(data->state.trailers_state == TRAILERS_INITIALIZED) {
- struct curl_slist *trailers = NULL;
- CURLcode result;
- int trailers_ret_code;
-
/* at this point we already verified that the callback exists
so we compile and store the trailers buffer, then proceed */
infof(data,
@@ -195,18 +198,17 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
data->set.trailer_data);
Curl_set_in_callback(data, false);
if(trailers_ret_code == CURL_TRAILERFUNC_OK) {
- result = Curl_http_compile_trailers(trailers, &data->state.trailers_buf,
- data);
+ c = Curl_http_compile_trailers(trailers, data->state.trailers_buf, data);
}
else {
failf(data, "operation aborted by trailing headers callback");
*nreadp = 0;
- result = CURLE_ABORTED_BY_CALLBACK;
+ c = CURLE_ABORTED_BY_CALLBACK;
}
- if(result) {
+ if(c != CURLE_OK) {
Curl_add_buffer_free(&data->state.trailers_buf);
curl_slist_free_all(trailers);
- return result;
+ return c;
}
infof(data, "Successfully compiled trailers.\r\n");
curl_slist_free_all(trailers);
@@ -226,7 +228,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
if(data->state.trailers_state == TRAILERS_SENDING) {
/* if we're here then that means that we already sent the last empty chunk
but we didn't send a final CR LF, so we sent 0 CR LF. We then start
- pulling trailing data until we have no more at which point we
+ pulling trailing data until we ²have no more at which point we
simply return to the previous point in the state machine as if
nothing happened.
*/
@@ -294,7 +296,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
here, knowing they'll become CRLFs later on.
*/
- bool added_crlf = FALSE;
+ char hexbuffer[11] = "";
int hexlen = 0;
const char *endofline_native;
const char *endofline_network;
@@ -315,7 +317,6 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
/* if we're not handling trailing data, proceed as usual */
if(data->state.trailers_state != TRAILERS_SENDING) {
- char hexbuffer[11] = "";
hexlen = msnprintf(hexbuffer, sizeof(hexbuffer),
"%zx%s", nread, endofline_native);
@@ -462,6 +463,7 @@ CURLcode Curl_readrewind(struct connectdata *conn)
infof(data, "the ioctl callback returned %d\n", (int)err);
if(err) {
+ /* FIXME: convert to a human readable error message */
failf(data, "ioctl callback returned error %d", (int)err);
return CURLE_SEND_FAIL_REWIND;
}
@@ -498,12 +500,41 @@ static int data_pending(const struct connectdata *conn)
TRUE. The thing is if we read everything, then http2_recv won't
be called and we cannot signal the HTTP/2 stream has closed. As
a workaround, we return nonzero here to call http2_recv. */
- ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion >= 20);
+ ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20);
#else
Curl_ssl_data_pending(conn, FIRSTSOCKET);
#endif
}
+static void read_rewind(struct connectdata *conn,
+ size_t thismuch)
+{
+ DEBUGASSERT(conn->read_pos >= thismuch);
+
+ conn->read_pos -= thismuch;
+ conn->bits.stream_was_rewound = TRUE;
+
+#ifdef DEBUGBUILD
+ {
+ char buf[512 + 1];
+ size_t show;
+
+ show = CURLMIN(conn->buf_len - conn->read_pos, sizeof(buf)-1);
+ if(conn->master_buffer) {
+ memcpy(buf, conn->master_buffer + conn->read_pos, show);
+ buf[show] = '\0';
+ }
+ else {
+ buf[0] = '\0';
+ }
+
+ DEBUGF(infof(conn->data,
+ "Buffer after stream rewind (read_pos = %zu): [%s]\n",
+ conn->read_pos, buf));
+ }
+#endif
+}
+
/*
* Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the
* remote document with the time provided by CURLOPT_TIMEVAL
@@ -578,7 +609,9 @@ static CURLcode readwrite_data(struct Curl_easy *data,
conn->httpversion == 20) &&
#endif
k->size != -1 && !k->header) {
- /* make sure we don't read too much */
+ /* make sure we don't read "too much" if we can help it since we
+ might be pipelining and then someone else might want to read what
+ follows! */
curl_off_t totalleft = k->size - k->bytecount;
if(totalleft < (curl_off_t)bytestoread)
bytestoread = (size_t)totalleft;
@@ -602,7 +635,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
nread = 0;
}
- if(!k->bytecount) {
+ if((k->bytecount == 0) && (k->writebytecount == 0)) {
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
if(k->exp100 > EXP100_SEND_DATA)
/* set time stamp to compare with when waiting for the 100 */
@@ -617,7 +650,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
if(0 < nread || is_empty_data) {
k->buf[nread] = 0;
}
- else {
+ else if(0 >= nread) {
/* if we receive 0 or less here, the server closed the connection
and we bail out from this! */
DEBUGF(infof(data, "nread <= 0, server closed connection, bailing\n"));
@@ -660,11 +693,20 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* We've stopped dealing with input, get out of the do-while loop */
if(nread > 0) {
- infof(data,
- "Excess found:"
- " excess = %zd"
- " url = %s (zero-length body)\n",
- nread, data->state.up.path);
+ if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
+ infof(data,
+ "Rewinding stream by : %zd"
+ " bytes on url %s (zero-length body)\n",
+ nread, data->state.up.path);
+ read_rewind(conn, (size_t)nread);
+ }
+ else {
+ infof(data,
+ "Excess found in a non pipelined read:"
+ " excess = %zd"
+ " url = %s (zero-length body)\n",
+ nread, data->state.up.path);
+ }
}
break;
@@ -776,14 +818,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
* and writes away the data. The returned 'nread' holds the number
* of actual data it wrote to the client.
*/
- CURLcode extra;
+
CHUNKcode res =
- Curl_httpchunk_read(conn, k->str, nread, &nread, &extra);
+ Curl_httpchunk_read(conn, k->str, nread, &nread);
if(CHUNKE_OK < res) {
- if(CHUNKE_PASSTHRU_ERROR == res) {
- failf(data, "Failed reading the chunked-encoded stream");
- return extra;
+ if(CHUNKE_WRITE_ERROR == res) {
+ failf(data, "Failed writing data");
+ return CURLE_WRITE_ERROR;
}
failf(data, "%s in chunked-encoding", Curl_chunked_strerror(res));
return CURLE_RECV_ERROR;
@@ -795,12 +837,19 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* There are now possibly N number of bytes at the end of the
str buffer that weren't written to the client.
+
+ We DO care about this data if we are pipelining.
Push it back to be read on the next pass. */
dataleft = conn->chunk.dataleft;
if(dataleft != 0) {
infof(conn->data, "Leftovers after chunking: %zu bytes\n",
dataleft);
+ if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
+ /* only attempt the rewind if we truly are pipelining */
+ infof(conn->data, "Rewinding %zu bytes\n",dataleft);
+ read_rewind(conn, dataleft);
+ }
}
}
/* If it returned OK, we just keep going */
@@ -819,13 +868,25 @@ static CURLcode readwrite_data(struct Curl_easy *data,
excess = (size_t)(k->bytecount + nread - k->maxdownload);
if(excess > 0 && !k->ignorebody) {
- infof(data,
- "Excess found in a read:"
- " excess = %zu"
- ", size = %" CURL_FORMAT_CURL_OFF_T
- ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
- ", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n",
- excess, k->size, k->maxdownload, k->bytecount);
+ if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
+ infof(data,
+ "Rewinding stream by : %zu"
+ " bytes on url %s (size = %" CURL_FORMAT_CURL_OFF_T
+ ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
+ ", bytecount = %" CURL_FORMAT_CURL_OFF_T ", nread = %zd)\n",
+ excess, data->state.up.path,
+ k->size, k->maxdownload, k->bytecount, nread);
+ read_rewind(conn, excess);
+ }
+ else {
+ infof(data,
+ "Excess found in a non pipelined read:"
+ " excess = %zu"
+ ", size = %" CURL_FORMAT_CURL_OFF_T
+ ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
+ ", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n",
+ excess, k->size, k->maxdownload, k->bytecount);
+ }
}
nread = (ssize_t) (k->maxdownload - k->bytecount);
@@ -938,14 +999,12 @@ static CURLcode readwrite_data(struct Curl_easy *data,
return CURLE_OK;
}
-CURLcode Curl_done_sending(struct connectdata *conn,
- struct SingleRequest *k)
+static CURLcode done_sending(struct connectdata *conn,
+ struct SingleRequest *k)
{
k->keepon &= ~KEEP_SEND; /* we're done writing */
- /* These functions should be moved into the handler struct! */
Curl_http2_done_sending(conn);
- Curl_quic_done_sending(conn);
if(conn->bits.rewindaftersend) {
CURLcode result = Curl_readrewind(conn);
@@ -1049,7 +1108,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
break;
}
if(nread <= 0) {
- result = Curl_done_sending(conn, k);
+ result = done_sending(conn, k);
if(result)
return result;
break;
@@ -1167,7 +1226,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
k->upload_present = 0; /* no more bytes left */
if(k->upload_done) {
- result = Curl_done_sending(conn, k);
+ result = done_sending(conn, k);
if(result)
return result;
}
@@ -1357,14 +1416,20 @@ CURLcode Curl_readwrite(struct connectdata *conn,
* in the proper state to have this information available.
*/
int Curl_single_getsock(const struct connectdata *conn,
- curl_socket_t *sock)
+ curl_socket_t *sock, /* points to numsocks number
+ of sockets */
+ int numsocks)
{
const struct Curl_easy *data = conn->data;
int bitmap = GETSOCK_BLANK;
unsigned sockindex = 0;
if(conn->handler->perform_getsock)
- return conn->handler->perform_getsock(conn, sock);
+ return conn->handler->perform_getsock(conn, sock, numsocks);
+
+ if(numsocks < 2)
+ /* simple check but we might need two slots */
+ return GETSOCK_BLANK;
/* don't include HOLD and PAUSE connections */
if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {
@@ -1500,7 +1565,6 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
data->state.authhost.picked &= data->state.authhost.want;
data->state.authproxy.picked &= data->state.authproxy.want;
-#ifndef CURL_DISABLE_FTP
if(data->state.wildcardmatch) {
struct WildcardData *wc = &data->wildcard;
if(wc->state < CURLWC_INIT) {
@@ -1509,8 +1573,6 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
return CURLE_OUT_OF_MEMORY;
}
}
-#endif
- Curl_http2_init_state(&data->state);
}
return result;
@@ -1592,8 +1654,7 @@ CURLcode Curl_follow(struct Curl_easy *data,
DEBUGASSERT(data->state.uh);
uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl,
- (type == FOLLOW_FAKE) ? CURLU_NON_SUPPORT_SCHEME :
- ((type == FOLLOW_REDIR) ? CURLU_URLENCODE : 0) );
+ (type == FOLLOW_FAKE) ? CURLU_NON_SUPPORT_SCHEME : 0);
if(uc) {
if(type != FOLLOW_FAKE)
return Curl_uc_to_curlcode(uc);
diff --git a/lib/transfer.h b/lib/transfer.h
index 67fd91f25..a9bff6348 100644
--- a/lib/transfer.h
+++ b/lib/transfer.h
@@ -29,6 +29,7 @@ char *Curl_checkheaders(const struct connectdata *conn,
void Curl_init_CONNECT(struct Curl_easy *data);
CURLcode Curl_pretransfer(struct Curl_easy *data);
+CURLcode Curl_second_connect(struct connectdata *conn);
CURLcode Curl_posttransfer(struct Curl_easy *data);
typedef enum {
@@ -47,7 +48,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
struct Curl_easy *data, bool *done,
bool *comeback);
int Curl_single_getsock(const struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
CURLcode Curl_readrewind(struct connectdata *conn);
CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
size_t *nreadp);
@@ -55,9 +57,6 @@ CURLcode Curl_retry_request(struct connectdata *conn, char **url);
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
CURLcode Curl_get_upload_buffer(struct Curl_easy *data);
-CURLcode Curl_done_sending(struct connectdata *conn,
- struct SingleRequest *k);
-
/* This sets up a forthcoming transfer */
void
Curl_setup_transfer (struct Curl_easy *data,
diff --git a/lib/url.c b/lib/url.c
index 8285474fd..eb09a24be 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -34,12 +34,10 @@
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
-#ifdef HAVE_IPHLPAPI_H
-#include <Iphlpapi.h>
-#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
+
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
@@ -95,7 +93,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "inet_pton.h"
#include "getinfo.h"
#include "urlapi-int.h"
-#include "system_win32.h"
/* And now for the protocols */
#include "ftp.h"
@@ -112,11 +109,14 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "connect.h"
#include "inet_ntop.h"
#include "http_ntlm.h"
+#include "curl_ntlm_wb.h"
+#include "socks.h"
#include "curl_rtmp.h"
#include "gopher.h"
#include "http_proxy.h"
#include "conncache.h"
#include "multihandle.h"
+#include "pipeline.h"
#include "dotdot.h"
#include "strdup.h"
#include "setopt.h"
@@ -187,11 +187,11 @@ static const struct Curl_handler * const protocols[] = {
&Curl_handler_tftp,
#endif
-#if defined(USE_SSH)
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
&Curl_handler_scp,
#endif
-#if defined(USE_SSH)
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
&Curl_handler_sftp,
#endif
@@ -304,7 +304,8 @@ static void up_free(struct Curl_easy *data)
Curl_safefree(up->options);
Curl_safefree(up->path);
Curl_safefree(up->query);
- curl_url_cleanup(data->state.uh);
+ if(data->set.uh != data->state.uh)
+ curl_url_cleanup(data->state.uh);
data->state.uh = NULL;
}
@@ -317,17 +318,13 @@ static void up_free(struct Curl_easy *data)
* when curl_easy_perform() is invoked.
*/
-CURLcode Curl_close(struct Curl_easy **datap)
+CURLcode Curl_close(struct Curl_easy *data)
{
struct Curl_multi *m;
- struct Curl_easy *data;
- if(!datap || !*datap)
+ if(!data)
return CURLE_OK;
- data = *datap;
- *datap = NULL;
-
Curl_expire_clear(data); /* shut off timers */
m = data->multi;
@@ -378,15 +375,13 @@ CURLcode Curl_close(struct Curl_easy **datap)
Curl_safefree(data->state.buffer);
Curl_safefree(data->state.headerbuff);
Curl_safefree(data->state.ulbuf);
- Curl_flush_cookies(data, TRUE);
+ Curl_flush_cookies(data, 1);
#ifdef USE_ALTSVC
Curl_altsvc_save(data->asi, data->set.str[STRING_ALTSVC]);
Curl_altsvc_cleanup(data->asi);
data->asi = NULL;
#endif
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
- Curl_http_auth_cleanup_digest(data);
-#endif
+ Curl_digest_cleanup(data);
Curl_safefree(data->info.contenttype);
Curl_safefree(data->info.wouldredirect);
@@ -403,10 +398,6 @@ CURLcode Curl_close(struct Curl_easy **datap)
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
}
- free(data->req.doh.probe[0].serverdoh.memory);
- free(data->req.doh.probe[1].serverdoh.memory);
- curl_slist_free_all(data->req.doh.headers);
-
/* destruct wildcard structures if it is needed */
Curl_wildcard_dtor(&data->wildcard);
Curl_freeset(data);
@@ -449,12 +440,11 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
set->httpreq = HTTPREQ_GET; /* Default HTTP request */
set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */
-#ifndef CURL_DISABLE_FTP
set->ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
set->ftp_use_eprt = TRUE; /* FTP defaults to EPRT operations */
set->ftp_use_pret = FALSE; /* mainly useful for drftpd servers */
set->ftp_filemethod = FTPFILE_MULTICWD;
-#endif
+
set->dns_cache_timeout = 60; /* Timeout every 60 seconds by default */
/* Set the default size of the SSL session ID cache */
@@ -495,8 +485,9 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
define since we internally only use the lower 16 bits for the passed
in bitmask to not conflict with the private bits */
set->allowed_protocols = CURLPROTO_ALL;
- set->redir_protocols = CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP |
- CURLPROTO_FTPS;
+ set->redir_protocols = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
+ ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
+ CURLPROTO_SMBS);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
@@ -552,8 +543,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
set->fnmatch = ZERO_NULL;
set->upkeep_interval_ms = CURL_UPKEEP_INTERVAL_DEFAULT;
set->maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
- set->maxage_conn = 118;
- set->http09_allowed = FALSE;
+ set->http09_allowed = TRUE;
set->httpversion =
#ifdef USE_NGHTTP2
CURL_HTTP_VERSION_2TLS
@@ -620,6 +610,8 @@ CURLcode Curl_open(struct Curl_easy **curl)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
+
+ Curl_http2_init_state(&data->state);
}
}
@@ -702,6 +694,11 @@ static void conn_shutdown(struct connectdata *conn)
if(CURL_SOCKET_BAD != conn->tempsock[1])
Curl_closesocket(conn, conn->tempsock[1]);
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
+ defined(NTLM_WB_ENABLED)
+ Curl_ntlm_wb_cleanup(conn);
+#endif
+
/* unlink ourselves. this should be called last since other shutdown
procedures need a valid conn->data and this may clear it. */
Curl_conncache_remove_conn(conn->data, conn, TRUE);
@@ -720,7 +717,6 @@ static void conn_free(struct connectdata *conn)
Curl_safefree(conn->user);
Curl_safefree(conn->passwd);
Curl_safefree(conn->oauth_bearer);
- Curl_safefree(conn->sasl_authzid);
Curl_safefree(conn->options);
Curl_safefree(conn->http_proxy.user);
Curl_safefree(conn->socks_proxy.user);
@@ -743,10 +739,14 @@ static void conn_free(struct connectdata *conn)
Curl_safefree(conn->secondaryhostname);
Curl_safefree(conn->http_proxy.host.rawalloc); /* http proxy name buffer */
Curl_safefree(conn->socks_proxy.host.rawalloc); /* socks proxy name buffer */
+ Curl_safefree(conn->master_buffer);
Curl_safefree(conn->connect_state);
conn_reset_all_postponed_data(conn);
- Curl_llist_destroy(&conn->easyq, NULL);
+
+ Curl_llist_destroy(&conn->send_pipe, NULL);
+ Curl_llist_destroy(&conn->recv_pipe, NULL);
+
Curl_safefree(conn->localdev);
Curl_free_primary_ssl_config(&conn->ssl_config);
Curl_free_primary_ssl_config(&conn->proxy_ssl_config);
@@ -804,21 +804,17 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM)
/* Cleanup NTLM connection-related data */
- Curl_http_auth_cleanup_ntlm(conn);
+ Curl_http_ntlm_cleanup(conn);
#endif
#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO)
/* Cleanup NEGOTIATE connection-related data */
- Curl_http_auth_cleanup_negotiate(conn);
+ Curl_cleanup_negotiate(conn);
#endif
/* the protocol specific disconnect handler and conn_shutdown need a transfer
for the connection! */
conn->data = data;
- if(conn->bits.connect_only)
- /* treat the connection as dead in CONNECT_ONLY situations */
- dead_connection = TRUE;
-
if(conn->handler->disconnect)
/* This is set if protocol-specific cleanups should be made */
conn->handler->disconnect(conn, dead_connection);
@@ -847,21 +843,28 @@ static bool SocketIsDead(curl_socket_t sock)
}
/*
- * IsMultiplexingPossible()
+ * IsPipeliningPossible()
*
- * Return a bitmask with the available multiplexing options for the given
- * requested connection.
+ * Return a bitmask with the available pipelining and multiplexing options for
+ * the given requested connection.
*/
-static int IsMultiplexingPossible(const struct Curl_easy *handle,
- const struct connectdata *conn)
+static int IsPipeliningPossible(const struct Curl_easy *handle,
+ const struct connectdata *conn)
{
int avail = 0;
- /* If a HTTP protocol and multiplexing is enabled */
+ /* If a HTTP protocol and pipelining is enabled */
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
(!conn->bits.protoconnstart || !conn->bits.close)) {
- if(Curl_multiplex_wanted(handle->multi) &&
+ if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
+ (handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
+ (handle->set.httpreq == HTTPREQ_GET ||
+ handle->set.httpreq == HTTPREQ_HEAD))
+ /* didn't ask for HTTP/1.0 and a GET or HEAD */
+ avail |= CURLPIPE_HTTP1;
+
+ if(Curl_pipeline_wanted(handle->multi, CURLPIPE_MULTIPLEX) &&
(handle->set.httpversion >= CURL_HTTP_VERSION_2))
/* allows HTTP/2 */
avail |= CURLPIPE_MULTIPLEX;
@@ -869,7 +872,84 @@ static int IsMultiplexingPossible(const struct Curl_easy *handle,
return avail;
}
-#ifndef CURL_DISABLE_PROXY
+/* Returns non-zero if a handle was removed */
+int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
+ struct curl_llist *pipeline)
+{
+ if(pipeline) {
+ struct curl_llist_element *curr;
+
+ curr = pipeline->head;
+ while(curr) {
+ if(curr->ptr == handle) {
+ Curl_llist_remove(pipeline, curr, NULL);
+ return 1; /* we removed a handle */
+ }
+ curr = curr->next;
+ }
+ }
+
+ return 0;
+}
+
+#if 0 /* this code is saved here as it is useful for debugging purposes */
+static void Curl_printPipeline(struct curl_llist *pipeline)
+{
+ struct curl_llist_element *curr;
+
+ curr = pipeline->head;
+ while(curr) {
+ struct Curl_easy *data = (struct Curl_easy *) curr->ptr;
+ infof(data, "Handle in pipeline: %s\n", data->state.path);
+ curr = curr->next;
+ }
+}
+#endif
+
+static struct Curl_easy* gethandleathead(struct curl_llist *pipeline)
+{
+ struct curl_llist_element *curr = pipeline->head;
+#ifdef DEBUGBUILD
+ {
+ struct curl_llist_element *p = pipeline->head;
+ while(p) {
+ struct Curl_easy *e = p->ptr;
+ DEBUGASSERT(GOOD_EASY_HANDLE(e));
+ p = p->next;
+ }
+ }
+#endif
+ if(curr) {
+ return (struct Curl_easy *) curr->ptr;
+ }
+
+ return NULL;
+}
+
+/* remove the specified connection from all (possible) pipelines and related
+ queues */
+void Curl_getoff_all_pipelines(struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ if(!conn->bundle)
+ return;
+ if(conn->bundle->multiuse == BUNDLE_PIPELINING) {
+ bool recv_head = (conn->readchannel_inuse &&
+ Curl_recvpipe_head(data, conn));
+ bool send_head = (conn->writechannel_inuse &&
+ Curl_sendpipe_head(data, conn));
+
+ if(Curl_removeHandleFromPipeline(data, &conn->recv_pipe) && recv_head)
+ Curl_pipeline_leave_read(conn);
+ if(Curl_removeHandleFromPipeline(data, &conn->send_pipe) && send_head)
+ Curl_pipeline_leave_write(conn);
+ }
+ else {
+ (void)Curl_removeHandleFromPipeline(data, &conn->recv_pipe);
+ (void)Curl_removeHandleFromPipeline(data, &conn->send_pipe);
+ }
+}
+
static bool
proxy_info_matches(const struct proxy_info* data,
const struct proxy_info* needle)
@@ -881,30 +961,6 @@ proxy_info_matches(const struct proxy_info* data,
return FALSE;
}
-#else
-/* disabled, won't get called */
-#define proxy_info_matches(x,y) FALSE
-#endif
-
-/* A connection has to have been idle for a shorter time than 'maxage_conn' to
- be subject for reuse. The success rate is just too low after this. */
-
-static bool conn_maxage(struct Curl_easy *data,
- struct connectdata *conn,
- struct curltime now)
-{
- if(!conn->data) {
- timediff_t idletime = Curl_timediff(now, conn->lastused);
- idletime /= 1000; /* integer seconds is fine */
-
- if(idletime > data->set.maxage_conn) {
- infof(data, "Too old connection (%ld seconds), disconnect it\n",
- idletime);
- return TRUE;
- }
- }
- return FALSE;
-}
/*
* This function checks if the given connection is dead and extracts it from
@@ -918,15 +974,13 @@ static bool conn_maxage(struct Curl_easy *data,
static bool extract_if_dead(struct connectdata *conn,
struct Curl_easy *data)
{
- if(!CONN_INUSE(conn) && !conn->data) {
- /* The check for a dead socket makes sense only if the connection isn't in
+ size_t pipeLen = conn->send_pipe.size + conn->recv_pipe.size;
+ if(!pipeLen && !CONN_INUSE(conn) && !conn->data) {
+ /* The check for a dead socket makes sense only if there are no
+ handles in pipeline and the connection isn't already marked in
use */
bool dead;
- struct curltime now = Curl_now();
- if(conn_maxage(data, conn, now)) {
- dead = TRUE;
- }
- else if(conn->handler->connection_check) {
+ if(conn->handler->connection_check) {
/* The protocol has a special method for checking the state of the
connection. Use it to check if the connection is dead. */
unsigned int state;
@@ -978,8 +1032,7 @@ static int call_extract_if_dead(struct connectdata *conn, void *param)
static void prune_dead_connections(struct Curl_easy *data)
{
struct curltime now = Curl_now();
- timediff_t elapsed =
- Curl_timediff(now, data->state.conn_cache->last_cleanup);
+ time_t elapsed = Curl_timediff(now, data->state.conn_cache->last_cleanup);
if(elapsed >= 1000L) {
struct prunedead prune;
@@ -994,6 +1047,13 @@ static void prune_dead_connections(struct Curl_easy *data)
}
}
+
+static size_t max_pipeline_length(struct Curl_multi *multi)
+{
+ return multi ? multi->max_pipeline_length : 0;
+}
+
+
/*
* Given one filled in connection struct (named needle), this function should
* detect if there already is one that has all the significant details
@@ -1003,7 +1063,8 @@ static void prune_dead_connections(struct Curl_easy *data)
* connection as 'in-use'. It must later be called with ConnectionDone() to
* return back to 'idle' (unused) state.
*
- * The force_reuse flag is set if the connection must be used.
+ * The force_reuse flag is set if the connection must be used, even if
+ * the pipelining strategy wants to open a new connection instead of reusing.
*/
static bool
ConnectionExists(struct Curl_easy *data,
@@ -1015,9 +1076,8 @@ ConnectionExists(struct Curl_easy *data,
struct connectdata *check;
struct connectdata *chosen = 0;
bool foundPendingCandidate = FALSE;
- bool canmultiplex = IsMultiplexingPossible(data, needle);
+ int canpipe = IsPipeliningPossible(data, needle);
struct connectbundle *bundle;
- const char *hostbundle;
#ifdef USE_NTLM
bool wantNTLMhttp = ((data->state.authhost.want &
@@ -1032,46 +1092,59 @@ ConnectionExists(struct Curl_easy *data,
*force_reuse = FALSE;
*waitpipe = FALSE;
+ /* We can't pipeline if the site is blacklisted */
+ if((canpipe & CURLPIPE_HTTP1) &&
+ Curl_pipeline_site_blacklisted(data, needle))
+ canpipe &= ~ CURLPIPE_HTTP1;
+
/* Look up the bundle with all the connections to this particular host.
Locks the connection cache, beware of early returns! */
- bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache,
- &hostbundle);
+ bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache);
if(bundle) {
/* Max pipe length is zero (unlimited) for multiplexed connections */
+ size_t max_pipe_len = (bundle->multiuse != BUNDLE_MULTIPLEX)?
+ max_pipeline_length(data->multi):0;
+ size_t best_pipe_len = max_pipe_len;
struct curl_llist_element *curr;
infof(data, "Found bundle for host %s: %p [%s]\n",
- hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ?
- "can multiplex" : "serially"));
-
- /* We can't multiplex if we don't know anything about the server */
- if(canmultiplex) {
- if(bundle->multiuse == BUNDLE_UNKNOWN) {
- if(data->set.pipewait) {
- infof(data, "Server doesn't support multiplex yet, wait\n");
+ (needle->bits.conn_to_host ? needle->conn_to_host.name :
+ needle->host.name), (void *)bundle,
+ (bundle->multiuse == BUNDLE_PIPELINING ?
+ "can pipeline" :
+ (bundle->multiuse == BUNDLE_MULTIPLEX ?
+ "can multiplex" : "serially")));
+
+ /* We can't pipeline if we don't know anything about the server */
+ if(canpipe) {
+ if(bundle->multiuse <= BUNDLE_UNKNOWN) {
+ if((bundle->multiuse == BUNDLE_UNKNOWN) && data->set.pipewait) {
+ infof(data, "Server doesn't support multi-use yet, wait\n");
*waitpipe = TRUE;
Curl_conncache_unlock(data);
return FALSE; /* no re-use */
}
- infof(data, "Server doesn't support multiplex (yet)\n");
- canmultiplex = FALSE;
+ infof(data, "Server doesn't support multi-use (yet)\n");
+ canpipe = 0;
}
- if((bundle->multiuse == BUNDLE_MULTIPLEX) &&
- !Curl_multiplex_wanted(data->multi)) {
- infof(data, "Could multiplex, but not asked to!\n");
- canmultiplex = FALSE;
+ if((bundle->multiuse == BUNDLE_PIPELINING) &&
+ !Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1)) {
+ /* not asked for, switch off */
+ infof(data, "Could pipeline, but not asked to!\n");
+ canpipe = 0;
}
- if(bundle->multiuse == BUNDLE_NO_MULTIUSE) {
- infof(data, "Can not multiplex, even if we wanted to!\n");
- canmultiplex = FALSE;
+ else if((bundle->multiuse == BUNDLE_MULTIPLEX) &&
+ !Curl_pipeline_wanted(data->multi, CURLPIPE_MULTIPLEX)) {
+ infof(data, "Could multiplex, but not asked to!\n");
+ canpipe = 0;
}
}
curr = bundle->conn_list.head;
while(curr) {
bool match = FALSE;
- size_t multiplexed;
+ size_t pipeLen;
/*
* Note that if we use a HTTP proxy in normal mode (no tunneling), we
@@ -1084,15 +1157,35 @@ ConnectionExists(struct Curl_easy *data,
/* connect-only connections will not be reused */
continue;
- multiplexed = CONN_INUSE(check) &&
- (bundle->multiuse == BUNDLE_MULTIPLEX);
+ if(extract_if_dead(check, data)) {
+ /* disconnect it */
+ (void)Curl_disconnect(data, check, /* dead_connection */TRUE);
+ continue;
+ }
+
+ pipeLen = check->send_pipe.size + check->recv_pipe.size;
- if(canmultiplex) {
+ if(canpipe) {
if(check->bits.protoconnstart && check->bits.close)
continue;
+
+ if(!check->bits.multiplex) {
+ /* If not multiplexing, make sure the connection is fine for HTTP/1
+ pipelining */
+ struct Curl_easy* sh = gethandleathead(&check->send_pipe);
+ struct Curl_easy* rh = gethandleathead(&check->recv_pipe);
+ if(sh) {
+ if(!(IsPipeliningPossible(sh, check) & CURLPIPE_HTTP1))
+ continue;
+ }
+ else if(rh) {
+ if(!(IsPipeliningPossible(rh, check) & CURLPIPE_HTTP1))
+ continue;
+ }
+ }
}
else {
- if(multiplexed) {
+ if(pipeLen > 0) {
/* can only happen within multi handles, and means that another easy
handle is using this connection */
continue;
@@ -1117,6 +1210,13 @@ ConnectionExists(struct Curl_easy *data,
to get closed. */
infof(data, "Connection #%ld isn't open enough, can't reuse\n",
check->connection_id);
+#ifdef DEBUGBUILD
+ if(check->recv_pipe.size > 0) {
+ infof(data,
+ "BAD! Unconnected #%ld has a non-empty recv pipeline!\n",
+ check->connection_id);
+ }
+#endif
continue;
}
}
@@ -1187,15 +1287,15 @@ ConnectionExists(struct Curl_easy *data,
}
}
- if(!canmultiplex && check->data)
- /* this request can't be multiplexed but the checked connection is
+ if(!canpipe && check->data)
+ /* this request can't be pipelined but the checked connection is
already in use so we skip it */
continue;
if(CONN_INUSE(check) && check->data &&
(check->data->multi != needle->data->multi))
- /* this could be subject for multiplex use, but only if they belong to
- * the same multi handle */
+ /* this could be subject for pipeline/multiplex use, but only if they
+ belong to the same multi handle */
continue;
if(needle->localdev || needle->localport) {
@@ -1283,16 +1383,10 @@ ConnectionExists(struct Curl_easy *data,
partway through a handshake!) */
if(wantNTLMhttp) {
if(strcmp(needle->user, check->user) ||
- strcmp(needle->passwd, check->passwd)) {
-
- /* we prefer a credential match, but this is at least a connection
- that can be reused and "upgraded" to NTLM */
- if(check->http_ntlm_state == NTLMSTATE_NONE)
- chosen = check;
+ strcmp(needle->passwd, check->passwd))
continue;
- }
}
- else if(check->http_ntlm_state != NTLMSTATE_NONE) {
+ else if(check->ntlm.state != NTLMSTATE_NONE) {
/* Connection is using NTLM auth but we don't want NTLM */
continue;
}
@@ -1308,7 +1402,7 @@ ConnectionExists(struct Curl_easy *data,
strcmp(needle->http_proxy.passwd, check->http_proxy.passwd))
continue;
}
- else if(check->proxy_ntlm_state != NTLMSTATE_NONE) {
+ else if(check->proxyntlm.state != NTLMSTATE_NONE) {
/* Proxy connection is using NTLM auth but we don't want NTLM */
continue;
}
@@ -1318,9 +1412,9 @@ ConnectionExists(struct Curl_easy *data,
chosen = check;
if((wantNTLMhttp &&
- (check->http_ntlm_state != NTLMSTATE_NONE)) ||
+ (check->ntlm.state != NTLMSTATE_NONE)) ||
(wantProxyNTLMhttp &&
- (check->proxy_ntlm_state != NTLMSTATE_NONE))) {
+ (check->proxyntlm.state != NTLMSTATE_NONE))) {
/* We must use this connection, no other */
*force_reuse = TRUE;
break;
@@ -1330,32 +1424,55 @@ ConnectionExists(struct Curl_easy *data,
continue;
}
#endif
- if(canmultiplex) {
- /* We can multiplex if we want to. Let's continue looking for
- the optimal connection to use. */
+ if(canpipe) {
+ /* We can pipeline if we want to. Let's continue looking for
+ the optimal connection to use, i.e the shortest pipe that is not
+ blacklisted. */
- if(!multiplexed) {
+ if(pipeLen == 0) {
/* We have the optimal connection. Let's stop looking. */
chosen = check;
break;
}
+ /* We can't use the connection if the pipe is full */
+ if(max_pipe_len && (pipeLen >= max_pipe_len)) {
+ infof(data, "Pipe is full, skip (%zu)\n", pipeLen);
+ continue;
+ }
#ifdef USE_NGHTTP2
/* If multiplexed, make sure we don't go over concurrency limit */
if(check->bits.multiplex) {
/* Multiplexed connections can only be HTTP/2 for now */
struct http_conn *httpc = &check->proto.httpc;
- if(multiplexed >= httpc->settings.max_concurrent_streams) {
+ if(pipeLen >= httpc->settings.max_concurrent_streams) {
infof(data, "MAX_CONCURRENT_STREAMS reached, skip (%zu)\n",
- multiplexed);
+ pipeLen);
continue;
}
}
#endif
- /* When not multiplexed, we have a match here! */
- chosen = check;
- infof(data, "Multiplexed connection found!\n");
- break;
+ /* We can't use the connection if the pipe is penalized */
+ if(Curl_pipeline_penalized(data, check)) {
+ infof(data, "Penalized, skip\n");
+ continue;
+ }
+
+ if(max_pipe_len) {
+ if(pipeLen < best_pipe_len) {
+ /* This connection has a shorter pipe so far. We'll pick this
+ and continue searching */
+ chosen = check;
+ best_pipe_len = pipeLen;
+ continue;
+ }
+ }
+ else {
+ /* When not pipelining (== multiplexed), we have a match here! */
+ chosen = check;
+ infof(data, "Multiplexed connection found!\n");
+ break;
+ }
}
else {
/* We have found a connection. Let's stop searching. */
@@ -1384,6 +1501,58 @@ ConnectionExists(struct Curl_easy *data,
return FALSE; /* no matching connecting exists */
}
+/* after a TCP connection to the proxy has been verified, this function does
+ the next magic step.
+
+ Note: this function's sub-functions call failf()
+
+*/
+CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn->bits.socksproxy) {
+#ifndef CURL_DISABLE_PROXY
+ /* for the secondary socket (FTP), use the "connect to host"
+ * but ignore the "connect to port" (use the secondary port)
+ */
+ const char * const host = conn->bits.httpproxy ?
+ conn->http_proxy.host.name :
+ conn->bits.conn_to_host ?
+ conn->conn_to_host.name :
+ sockindex == SECONDARYSOCKET ?
+ conn->secondaryhostname : conn->host.name;
+ const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
+ sockindex == SECONDARYSOCKET ? conn->secondary_port :
+ conn->bits.conn_to_port ? conn->conn_to_port :
+ conn->remote_port;
+ conn->bits.socksproxy_connecting = TRUE;
+ switch(conn->socks_proxy.proxytype) {
+ case CURLPROXY_SOCKS5:
+ case CURLPROXY_SOCKS5_HOSTNAME:
+ result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
+ host, port, sockindex, conn);
+ break;
+
+ case CURLPROXY_SOCKS4:
+ case CURLPROXY_SOCKS4A:
+ result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
+ conn);
+ break;
+
+ default:
+ failf(conn->data, "unknown proxytype option given");
+ result = CURLE_COULDNT_CONNECT;
+ } /* switch proxytype */
+ conn->bits.socksproxy_connecting = FALSE;
+#else
+ (void)sockindex;
+#endif /* CURL_DISABLE_PROXY */
+ }
+
+ return result;
+}
+
/*
* verboseconnect() displays verbose information after a connect
*/
@@ -1400,6 +1569,127 @@ void Curl_verboseconnect(struct connectdata *conn)
}
#endif
+int Curl_protocol_getsock(struct connectdata *conn,
+ curl_socket_t *socks,
+ int numsocks)
+{
+ if(conn->handler->proto_getsock)
+ return conn->handler->proto_getsock(conn, socks, numsocks);
+ /* Backup getsock logic. Since there is a live socket in use, we must wait
+ for it or it will be removed from watching when the multi_socket API is
+ used. */
+ socks[0] = conn->sock[FIRSTSOCKET];
+ return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
+}
+
+int Curl_doing_getsock(struct connectdata *conn,
+ curl_socket_t *socks,
+ int numsocks)
+{
+ if(conn && conn->handler->doing_getsock)
+ return conn->handler->doing_getsock(conn, socks, numsocks);
+ return GETSOCK_BLANK;
+}
+
+/*
+ * We are doing protocol-specific connecting and this is being called over and
+ * over from the multi interface until the connection phase is done on
+ * protocol layer.
+ */
+
+CURLcode Curl_protocol_connecting(struct connectdata *conn,
+ bool *done)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn && conn->handler->connecting) {
+ *done = FALSE;
+ result = conn->handler->connecting(conn, done);
+ }
+ else
+ *done = TRUE;
+
+ return result;
+}
+
+/*
+ * We are DOING this is being called over and over from the multi interface
+ * until the DOING phase is done on protocol layer.
+ */
+
+CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
+{
+ CURLcode result = CURLE_OK;
+
+ if(conn && conn->handler->doing) {
+ *done = FALSE;
+ result = conn->handler->doing(conn, done);
+ }
+ else
+ *done = TRUE;
+
+ return result;
+}
+
+/*
+ * We have discovered that the TCP connection has been successful, we can now
+ * proceed with some action.
+ *
+ */
+CURLcode Curl_protocol_connect(struct connectdata *conn,
+ bool *protocol_done)
+{
+ CURLcode result = CURLE_OK;
+
+ *protocol_done = FALSE;
+
+ if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
+ /* We already are connected, get back. This may happen when the connect
+ worked fine in the first call, like when we connect to a local server
+ or proxy. Note that we don't know if the protocol is actually done.
+
+ Unless this protocol doesn't have any protocol-connect callback, as
+ then we know we're done. */
+ if(!conn->handler->connecting)
+ *protocol_done = TRUE;
+
+ return CURLE_OK;
+ }
+
+ if(!conn->bits.protoconnstart) {
+
+ result = Curl_proxy_connect(conn, FIRSTSOCKET);
+ if(result)
+ return result;
+
+ if(CONNECT_FIRSTSOCKET_PROXY_SSL())
+ /* wait for HTTPS proxy SSL initialization to complete */
+ return CURLE_OK;
+
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
+ Curl_connect_ongoing(conn))
+ /* when using an HTTP tunnel proxy, await complete tunnel establishment
+ before proceeding further. Return CURLE_OK so we'll be called again */
+ return CURLE_OK;
+
+ if(conn->handler->connect_it) {
+ /* is there a protocol-specific connect() procedure? */
+
+ /* Call the protocol-specific connect function */
+ result = conn->handler->connect_it(conn, protocol_done);
+ }
+ else
+ *protocol_done = TRUE;
+
+ /* it has started, possibly even completed but that knowledge isn't stored
+ in this bit! */
+ if(!result)
+ conn->bits.protoconnstart = TRUE;
+ }
+
+ return result; /* pass back status */
+}
+
/*
* Helpers for IDNA conversions.
*/
@@ -1510,6 +1800,13 @@ static void free_idnconverted_hostname(struct hostname *host)
#endif
}
+static void llist_dtor(void *user, void *element)
+{
+ (void)user;
+ (void)element;
+ /* Do nothing */
+}
+
/*
* Allocate and initialize a new connectdata object.
*/
@@ -1577,7 +1874,16 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->http_proxy.proxytype = data->set.proxytype;
conn->socks_proxy.proxytype = CURLPROXY_SOCKS4;
-#if !defined(CURL_DISABLE_PROXY)
+#ifdef CURL_DISABLE_PROXY
+
+ conn->bits.proxy = FALSE;
+ conn->bits.httpproxy = FALSE;
+ conn->bits.socksproxy = FALSE;
+ conn->bits.proxy_user_passwd = FALSE;
+ conn->bits.tunnel_proxy = FALSE;
+
+#else /* CURL_DISABLE_PROXY */
+
/* note that these two proxy bits are now just on what looks to be
requested, they may be altered down the road */
conn->bits.proxy = (data->set.str[STRING_PROXY] &&
@@ -1598,13 +1904,13 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->bits.proxy_user_passwd =
(data->set.str[STRING_PROXYUSERNAME]) ? TRUE : FALSE;
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
+
#endif /* CURL_DISABLE_PROXY */
conn->bits.user_passwd = (data->set.str[STRING_USERNAME]) ? TRUE : FALSE;
-#ifndef CURL_DISABLE_FTP
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
-#endif
+
conn->ssl_config.verifystatus = data->set.ssl.primary.verifystatus;
conn->ssl_config.verifypeer = data->set.ssl.primary.verifypeer;
conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
@@ -1614,15 +1920,26 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
conn->ip_version = data->set.ipver;
conn->bits.connect_only = data->set.connect_only;
- conn->transport = TRNSPRT_TCP; /* most of them are TCP streams */
#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
defined(NTLM_WB_ENABLED)
conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ conn->ntlm_auth_hlpr_pid = 0;
+ conn->challenge_header = NULL;
+ conn->response_header = NULL;
#endif
- /* Initialize the easy handle list */
- Curl_llist_init(&conn->easyq, NULL);
+ if(Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
+ !conn->master_buffer) {
+ /* Allocate master_buffer to be used for HTTP/1 pipelining */
+ conn->master_buffer = calloc(MASTERBUF_SIZE, sizeof(char));
+ if(!conn->master_buffer)
+ goto error;
+ }
+
+ /* Initialize the pipeline lists */
+ Curl_llist_init(&conn->send_pipe, (curl_llist_dtor) llist_dtor);
+ Curl_llist_init(&conn->recv_pipe, (curl_llist_dtor) llist_dtor);
#ifdef HAVE_GSSAPI
conn->data_prot = PROT_CLEAR;
@@ -1645,7 +1962,10 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
return conn;
error:
- Curl_llist_destroy(&conn->easyq, NULL);
+ Curl_llist_destroy(&conn->send_pipe, NULL);
+ Curl_llist_destroy(&conn->recv_pipe, NULL);
+
+ free(conn->master_buffer);
free(conn->localdev);
#ifdef USE_SSL
free(conn->ssl_extra);
@@ -1718,50 +2038,6 @@ CURLcode Curl_uc_to_curlcode(CURLUcode uc)
}
/*
- * If the URL was set with an IPv6 numerical address with a zone id part, set
- * the scope_id based on that!
- */
-
-static void zonefrom_url(CURLU *uh, struct connectdata *conn)
-{
- char *zoneid;
- CURLUcode uc;
-
- uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
-
- if(!uc && zoneid) {
- char *endp;
- unsigned long scope = strtoul(zoneid, &endp, 10);
- if(!*endp && (scope < UINT_MAX))
- /* A plain number, use it directly as a scope id. */
- conn->scope_id = (unsigned int)scope;
-#if defined(HAVE_IF_NAMETOINDEX)
- else {
-#elif defined(WIN32)
- else if(Curl_if_nametoindex) {
-#endif
-
-#if defined(HAVE_IF_NAMETOINDEX) || defined(WIN32)
- /* Zone identifier is not numeric */
- unsigned int scopeidx = 0;
-#if defined(WIN32)
- scopeidx = Curl_if_nametoindex(zoneid);
-#else
- scopeidx = if_nametoindex(zoneid);
-#endif
- if(!scopeidx)
- infof(conn->data, "Invalid zoneid: %s; %s\n", zoneid,
- strerror(errno));
- else
- conn->scope_id = scopeidx;
- }
-#endif /* HAVE_IF_NAMETOINDEX || WIN32 */
-
- free(zoneid);
- }
-}
-
-/*
* Parse URL and fill in the relevant members of the connection struct.
*/
static CURLcode parseurlandfillconn(struct Curl_easy *data,
@@ -1776,7 +2052,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
/* parse the URL */
if(data->set.uh) {
- uh = data->state.uh = curl_url_dup(data->set.uh);
+ uh = data->state.uh = data->set.uh;
}
else {
uh = data->state.uh = curl_url();
@@ -1799,7 +2075,6 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
}
if(!data->set.uh) {
- char *newurl;
uc = curl_url_set(uh, CURLUPART_URL, data->change.url,
CURLU_GUESS_SCHEME |
CURLU_NON_SUPPORT_SCHEME |
@@ -1810,15 +2085,6 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
DEBUGF(infof(data, "curl_url_set rejected %s\n", data->change.url));
return Curl_uc_to_curlcode(uc);
}
-
- /* after it was parsed, get the generated normalized version */
- uc = curl_url_get(uh, CURLUPART_URL, &newurl, 0);
- if(uc)
- return Curl_uc_to_curlcode(uc);
- if(data->change.url_alloc)
- free(data->change.url);
- data->change.url = newurl;
- data->change.url_alloc = TRUE;
}
uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
@@ -1879,27 +2145,76 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
}
else {
unsigned long port = strtoul(data->state.up.port, NULL, 10);
- conn->port = conn->remote_port = curlx_ultous(port);
+ conn->remote_port = curlx_ultous(port);
}
(void)curl_url_get(uh, CURLUPART_QUERY, &data->state.up.query, 0);
hostname = data->state.up.hostname;
- if(hostname && hostname[0] == '[') {
- /* This looks like an IPv6 address literal. See if there is an address
+ if(!hostname)
+ /* this is for file:// transfers, get a dummy made */
+ hostname = (char *)"";
+
+ if(hostname[0] == '[') {
+ /* This looks like an IPv6 address literal. See if there is an address
scope. */
- size_t hlen;
+ char *percent = strchr(++hostname, '%');
conn->bits.ipv6_ip = TRUE;
- /* cut off the brackets! */
- hostname++;
- hlen = strlen(hostname);
- hostname[hlen - 1] = 0;
+ if(percent) {
+ unsigned int identifier_offset = 3;
+ char *endp;
+ unsigned long scope;
+ if(strncmp("%25", percent, 3) != 0) {
+ infof(data,
+ "Please URL encode %% as %%25, see RFC 6874.\n");
+ identifier_offset = 1;
+ }
+ scope = strtoul(percent + identifier_offset, &endp, 10);
+ if(*endp == ']') {
+ /* The address scope was well formed. Knock it out of the
+ hostname. */
+ memmove(percent, endp, strlen(endp) + 1);
+ conn->scope_id = (unsigned int)scope;
+ }
+ else {
+ /* Zone identifier is not numeric */
+#if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ) && defined(HAVE_IF_NAMETOINDEX)
+ char ifname[IFNAMSIZ + 2];
+ char *square_bracket;
+ unsigned int scopeidx = 0;
+ strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2);
+ /* Ensure nullbyte termination */
+ ifname[IFNAMSIZ + 1] = '\0';
+ square_bracket = strchr(ifname, ']');
+ if(square_bracket) {
+ /* Remove ']' */
+ *square_bracket = '\0';
+ scopeidx = if_nametoindex(ifname);
+ if(scopeidx == 0) {
+ infof(data, "Invalid network interface: %s; %s\n", ifname,
+ strerror(errno));
+ }
+ }
+ if(scopeidx > 0) {
+ char *p = percent + identifier_offset + strlen(ifname);
- zonefrom_url(uh, conn);
+ /* Remove zone identifier from hostname */
+ memmove(percent, p, strlen(p) + 1);
+ conn->scope_id = scopeidx;
+ }
+ else
+#endif /* HAVE_NET_IF_H && IFNAMSIZ */
+ infof(data, "Invalid IPv6 address format\n");
+ }
+ }
+ percent = strchr(hostname, ']');
+ if(percent)
+ /* terminate IPv6 numerical at end bracket */
+ *percent = 0;
}
/* make sure the connect struct gets its own copy of the host name */
- conn->host.rawalloc = strdup(hostname ? hostname : "");
+ conn->host.rawalloc = strdup(hostname);
if(!conn->host.rawalloc)
return CURLE_OUT_OF_MEMORY;
conn->host.name = conn->host.rawalloc;
@@ -1957,6 +2272,7 @@ static CURLcode setup_connection_internals(struct connectdata *conn)
{
const struct Curl_handler * p;
CURLcode result;
+ conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
/* Perform setup complement if some. */
p = conn->handler;
@@ -1987,8 +2303,6 @@ void Curl_free_request_state(struct Curl_easy *data)
{
Curl_safefree(data->req.protop);
Curl_safefree(data->req.newurl);
- Curl_close(&data->req.doh.probe[0].easy);
- Curl_close(&data->req.doh.probe[1].easy);
}
@@ -2159,55 +2473,46 @@ static CURLcode parse_proxy(struct Curl_easy *data,
struct connectdata *conn, char *proxy,
curl_proxytype proxytype)
{
- char *portptr = NULL;
+ char *prox_portno;
+ char *endofprot;
+
+ /* We use 'proxyptr' to point to the proxy name from now on... */
+ char *proxyptr;
+ char *portptr;
+ char *atsign;
long port = -1;
char *proxyuser = NULL;
char *proxypasswd = NULL;
- char *host;
bool sockstype;
- CURLUcode uc;
- struct proxy_info *proxyinfo;
- CURLU *uhp = curl_url();
- CURLcode result = CURLE_OK;
- char *scheme = NULL;
- /* When parsing the proxy, allowing non-supported schemes since we have
- these made up ones for proxies. Guess scheme for URLs without it. */
- uc = curl_url_set(uhp, CURLUPART_URL, proxy,
- CURLU_NON_SUPPORT_SCHEME|CURLU_GUESS_SCHEME);
- if(!uc) {
- /* parsed okay as a URL */
- uc = curl_url_get(uhp, CURLUPART_SCHEME, &scheme, 0);
- if(uc) {
- result = CURLE_OUT_OF_MEMORY;
- goto error;
- }
+ /* We do the proxy host string parsing here. We want the host name and the
+ * port name. Accept a protocol:// prefix
+ */
- if(strcasecompare("https", scheme))
+ /* Parse the protocol part if present */
+ endofprot = strstr(proxy, "://");
+ if(endofprot) {
+ proxyptr = endofprot + 3;
+ if(checkprefix("https", proxy))
proxytype = CURLPROXY_HTTPS;
- else if(strcasecompare("socks5h", scheme))
+ else if(checkprefix("socks5h", proxy))
proxytype = CURLPROXY_SOCKS5_HOSTNAME;
- else if(strcasecompare("socks5", scheme))
+ else if(checkprefix("socks5", proxy))
proxytype = CURLPROXY_SOCKS5;
- else if(strcasecompare("socks4a", scheme))
+ else if(checkprefix("socks4a", proxy))
proxytype = CURLPROXY_SOCKS4A;
- else if(strcasecompare("socks4", scheme) ||
- strcasecompare("socks", scheme))
+ else if(checkprefix("socks4", proxy) || checkprefix("socks", proxy))
proxytype = CURLPROXY_SOCKS4;
- else if(strcasecompare("http", scheme))
+ else if(checkprefix("http:", proxy))
; /* leave it as HTTP or HTTP/1.0 */
else {
/* Any other xxx:// reject! */
failf(data, "Unsupported proxy scheme for \'%s\'", proxy);
- result = CURLE_COULDNT_CONNECT;
- goto error;
+ return CURLE_COULDNT_CONNECT;
}
}
- else {
- failf(data, "Unsupported proxy syntax in \'%s\'", proxy);
- result = CURLE_COULDNT_RESOLVE_PROXY;
- goto error;
- }
+ else
+ proxyptr = proxy; /* No xxx:// head: It's a HTTP proxy */
#ifdef USE_SSL
if(!(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY))
@@ -2215,44 +2520,93 @@ static CURLcode parse_proxy(struct Curl_easy *data,
if(proxytype == CURLPROXY_HTTPS) {
failf(data, "Unsupported proxy \'%s\', libcurl is built without the "
"HTTPS-proxy support.", proxy);
- result = CURLE_NOT_BUILT_IN;
- goto error;
+ return CURLE_NOT_BUILT_IN;
}
- sockstype =
- proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
- proxytype == CURLPROXY_SOCKS5 ||
- proxytype == CURLPROXY_SOCKS4A ||
- proxytype == CURLPROXY_SOCKS4;
-
- proxyinfo = sockstype ? &conn->socks_proxy : &conn->http_proxy;
- proxyinfo->proxytype = proxytype;
+ sockstype = proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
+ proxytype == CURLPROXY_SOCKS5 ||
+ proxytype == CURLPROXY_SOCKS4A ||
+ proxytype == CURLPROXY_SOCKS4;
/* Is there a username and password given in this proxy url? */
- curl_url_get(uhp, CURLUPART_USER, &proxyuser, CURLU_URLDECODE);
- curl_url_get(uhp, CURLUPART_PASSWORD, &proxypasswd, CURLU_URLDECODE);
- if(proxyuser || proxypasswd) {
- Curl_safefree(proxyinfo->user);
- proxyinfo->user = proxyuser;
- Curl_safefree(proxyinfo->passwd);
- if(!proxypasswd) {
- proxypasswd = strdup("");
- if(!proxypasswd) {
- result = CURLE_OUT_OF_MEMORY;
- goto error;
- }
+ atsign = strchr(proxyptr, '@');
+ if(atsign) {
+ CURLcode result =
+ Curl_parse_login_details(proxyptr, atsign - proxyptr,
+ &proxyuser, &proxypasswd, NULL);
+ if(result)
+ return result;
+ proxyptr = atsign + 1;
+ }
+
+ /* start scanning for port number at this point */
+ portptr = proxyptr;
+
+ /* detect and extract RFC6874-style IPv6-addresses */
+ if(*proxyptr == '[') {
+ char *ptr = ++proxyptr; /* advance beyond the initial bracket */
+ while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.')))
+ ptr++;
+ if(*ptr == '%') {
+ /* There might be a zone identifier */
+ if(strncmp("%25", ptr, 3))
+ infof(data, "Please URL encode %% as %%25, see RFC 6874.\n");
+ ptr++;
+ /* Allow unreserved characters as defined in RFC 3986 */
+ while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') ||
+ (*ptr == '.') || (*ptr == '_') || (*ptr == '~')))
+ ptr++;
}
- proxyinfo->passwd = proxypasswd;
- conn->bits.proxy_user_passwd = TRUE; /* enable it */
+ if(*ptr == ']')
+ /* yeps, it ended nicely with a bracket as well */
+ *ptr++ = 0;
+ else
+ infof(data, "Invalid IPv6 address format\n");
+ portptr = ptr;
+ /* Note that if this didn't end with a bracket, we still advanced the
+ * proxyptr first, but I can't see anything wrong with that as no host
+ * name nor a numeric can legally start with a bracket.
+ */
}
- curl_url_get(uhp, CURLUPART_PORT, &portptr, 0);
+ /* Get port number off proxy.server.com:1080 */
+ prox_portno = strchr(portptr, ':');
+ if(prox_portno) {
+ char *endp = NULL;
- if(portptr) {
- port = strtol(portptr, NULL, 10);
- free(portptr);
+ *prox_portno = 0x0; /* cut off number from host name */
+ prox_portno ++;
+ /* now set the local port number */
+ port = strtol(prox_portno, &endp, 10);
+ if((endp && *endp && (*endp != '/') && (*endp != ' ')) ||
+ (port < 0) || (port > 65535)) {
+ /* meant to detect for example invalid IPv6 numerical addresses without
+ brackets: "2a00:fac0:a000::7:13". Accept a trailing slash only
+ because we then allow "URL style" with the number followed by a
+ slash, used in curl test cases already. Space is also an acceptable
+ terminating symbol. */
+ infof(data, "No valid port number in proxy string (%s)\n",
+ prox_portno);
+ }
+ else
+ conn->port = port;
}
else {
+ if(proxyptr[0]=='/') {
+ /* If the first character in the proxy string is a slash, fail
+ immediately. The following code will otherwise clear the string which
+ will lead to code running as if no proxy was set! */
+ Curl_safefree(proxyuser);
+ Curl_safefree(proxypasswd);
+ return CURLE_COULDNT_RESOLVE_PROXY;
+ }
+
+ /* without a port number after the host name, some people seem to use
+ a slash so we strip everything from the first slash */
+ atsign = strchr(proxyptr, '/');
+ if(atsign)
+ *atsign = '\0'; /* cut off path part from host name */
+
if(data->set.proxyport)
/* None given in the proxy string, then get the default one if it is
given */
@@ -2264,33 +2618,57 @@ static CURLcode parse_proxy(struct Curl_easy *data,
port = CURL_DEFAULT_PROXY_PORT;
}
}
- if(port >= 0) {
- proxyinfo->port = port;
- if(conn->port < 0 || sockstype || !conn->socks_proxy.host.rawalloc)
- conn->port = port;
- }
- /* now, clone the proxy host name */
- uc = curl_url_get(uhp, CURLUPART_HOST, &host, CURLU_URLDECODE);
- if(uc) {
- result = CURLE_OUT_OF_MEMORY;
- goto error;
- }
- Curl_safefree(proxyinfo->host.rawalloc);
- proxyinfo->host.rawalloc = host;
- if(host[0] == '[') {
- /* this is a numerical IPv6, strip off the brackets */
- size_t len = strlen(host);
- host[len-1] = 0; /* clear the trailing bracket */
- host++;
- zonefrom_url(uhp, conn);
+ if(*proxyptr) {
+ struct proxy_info *proxyinfo =
+ sockstype ? &conn->socks_proxy : &conn->http_proxy;
+ proxyinfo->proxytype = proxytype;
+
+ if(proxyuser) {
+ /* found user and password, rip them out. note that we are unescaping
+ them, as there is otherwise no way to have a username or password
+ with reserved characters like ':' in them. */
+ Curl_safefree(proxyinfo->user);
+ proxyinfo->user = curl_easy_unescape(data, proxyuser, 0, NULL);
+ Curl_safefree(proxyuser);
+
+ if(!proxyinfo->user) {
+ Curl_safefree(proxypasswd);
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ Curl_safefree(proxyinfo->passwd);
+ if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH)
+ proxyinfo->passwd = curl_easy_unescape(data, proxypasswd, 0, NULL);
+ else
+ proxyinfo->passwd = strdup("");
+ Curl_safefree(proxypasswd);
+
+ if(!proxyinfo->passwd)
+ return CURLE_OUT_OF_MEMORY;
+
+ conn->bits.proxy_user_passwd = TRUE; /* enable it */
+ }
+
+ if(port >= 0) {
+ proxyinfo->port = port;
+ if(conn->port < 0 || sockstype || !conn->socks_proxy.host.rawalloc)
+ conn->port = port;
+ }
+
+ /* now, clone the cleaned proxy host name */
+ Curl_safefree(proxyinfo->host.rawalloc);
+ proxyinfo->host.rawalloc = strdup(proxyptr);
+ proxyinfo->host.name = proxyinfo->host.rawalloc;
+
+ if(!proxyinfo->host.rawalloc)
+ return CURLE_OUT_OF_MEMORY;
}
- proxyinfo->host.name = host;
- error:
- free(scheme);
- curl_url_cleanup(uhp);
- return result;
+ Curl_safefree(proxyuser);
+ Curl_safefree(proxypasswd);
+
+ return CURLE_OK;
}
/*
@@ -2708,7 +3086,8 @@ static CURLcode override_login(struct Curl_easy *data,
&netrc_user_changed, &netrc_passwd_changed,
data->set.str[STRING_NETRC_FILE]);
if(ret > 0) {
- infof(data, "Couldn't find host %s in the .netrc file; using defaults\n",
+ infof(data, "Couldn't find host %s in the "
+ DOT_CHAR "netrc file; using defaults\n",
conn->host.name);
}
else if(ret < 0) {
@@ -2774,6 +3153,13 @@ static CURLcode set_login(struct connectdata *conn)
result = CURLE_OUT_OF_MEMORY;
}
+ /* if there's a user without password, consider password blank */
+ if(conn->user && !conn->passwd) {
+ conn->passwd = strdup("");
+ if(!conn->passwd)
+ result = CURLE_OUT_OF_MEMORY;
+ }
+
return result;
}
@@ -2998,65 +3384,26 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
if(data->asi && !host && (port == -1) &&
(conn->handler->protocol == CURLPROTO_HTTPS)) {
/* no connect_to match, try alt-svc! */
- enum alpnid srcalpnid;
+ const char *nhost;
+ int nport;
+ enum alpnid nalpnid;
bool hit;
- struct altsvc *as;
- const int allowed_versions = ( ALPN_h1
-#ifdef USE_NGHTTP2
- | ALPN_h2
-#endif
-#ifdef ENABLE_QUIC
- | ALPN_h3
-#endif
- ) & data->asi->flags;
-
host = conn->host.rawalloc;
-#ifdef USE_NGHTTP2
- /* with h2 support, check that first */
- srcalpnid = ALPN_h2;
hit = Curl_altsvc_lookup(data->asi,
- srcalpnid, host, conn->remote_port, /* from */
- &as /* to */,
- allowed_versions);
- if(!hit)
-#endif
- {
- srcalpnid = ALPN_h1;
- hit = Curl_altsvc_lookup(data->asi,
- srcalpnid, host, conn->remote_port, /* from */
- &as /* to */,
- allowed_versions);
- }
+ ALPN_h1, host, conn->remote_port, /* from */
+ &nalpnid, &nhost, &nport /* to */);
if(hit) {
- char *hostd = strdup((char *)as->dst.host);
+ char *hostd = strdup((char *)nhost);
if(!hostd)
return CURLE_OUT_OF_MEMORY;
conn->conn_to_host.rawalloc = hostd;
conn->conn_to_host.name = hostd;
conn->bits.conn_to_host = TRUE;
- conn->conn_to_port = as->dst.port;
+ conn->conn_to_port = nport;
conn->bits.conn_to_port = TRUE;
- conn->bits.altused = TRUE;
infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
- Curl_alpnid2str(srcalpnid), host, conn->remote_port,
- Curl_alpnid2str(as->dst.alpnid), hostd, as->dst.port);
- if(srcalpnid != as->dst.alpnid) {
- /* protocol version switch */
- switch(as->dst.alpnid) {
- case ALPN_h1:
- conn->httpversion = 11;
- break;
- case ALPN_h2:
- conn->httpversion = 20;
- break;
- case ALPN_h3:
- conn->transport = TRNSPRT_QUIC;
- conn->httpversion = 30;
- break;
- default: /* shouldn't be possible */
- break;
- }
- }
+ Curl_alpnid2str(ALPN_h1), host, conn->remote_port,
+ Curl_alpnid2str(nalpnid), hostd, nport);
}
}
#endif
@@ -3267,7 +3614,11 @@ static void reuse_conn(struct connectdata *old_conn,
Curl_safefree(old_conn->http_proxy.passwd);
Curl_safefree(old_conn->socks_proxy.passwd);
Curl_safefree(old_conn->localdev);
- Curl_llist_destroy(&old_conn->easyq, NULL);
+
+ Curl_llist_destroy(&old_conn->send_pipe, NULL);
+ Curl_llist_destroy(&old_conn->recv_pipe, NULL);
+
+ Curl_safefree(old_conn->master_buffer);
#ifdef USE_UNIX_SOCKETS
Curl_safefree(old_conn->unix_domain_socket);
@@ -3343,14 +3694,6 @@ static CURLcode create_conn(struct Curl_easy *data,
}
}
- if(data->set.str[STRING_SASL_AUTHZID]) {
- conn->sasl_authzid = strdup(data->set.str[STRING_SASL_AUTHZID]);
- if(!conn->sasl_authzid) {
- result = CURLE_OUT_OF_MEMORY;
- goto out;
- }
- }
-
#ifdef USE_UNIX_SOCKETS
if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
@@ -3532,10 +3875,6 @@ static CURLcode create_conn(struct Curl_easy *data,
data->set.str[STRING_SSL_CIPHER13_LIST_ORIG];
data->set.proxy_ssl.primary.cipher_list13 =
data->set.str[STRING_SSL_CIPHER13_LIST_PROXY];
- data->set.ssl.primary.pinned_key =
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
- data->set.proxy_ssl.primary.pinned_key =
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY];
data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
@@ -3594,12 +3933,12 @@ static CURLcode create_conn(struct Curl_easy *data,
reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse, &waitpipe);
/* If we found a reusable connection that is now marked as in use, we may
- still want to open a new connection if we are multiplexing. */
- if(reuse && !force_reuse && IsMultiplexingPossible(data, conn_temp)) {
- size_t multiplexed = CONN_INUSE(conn_temp);
- if(multiplexed > 0) {
- infof(data, "Found connection %ld, with %zu requests on it\n",
- conn_temp->connection_id, multiplexed);
+ still want to open a new connection if we are pipelining. */
+ if(reuse && !force_reuse && IsPipeliningPossible(data, conn_temp)) {
+ size_t pipelen = conn_temp->send_pipe.size + conn_temp->recv_pipe.size;
+ if(pipelen > 0) {
+ infof(data, "Found connection %ld, with requests in the pipe (%zu)\n",
+ conn_temp->connection_id, pipelen);
if(Curl_conncache_bundle_size(conn_temp) < max_host_connections &&
Curl_conncache_size(data) < max_total_connections) {
@@ -3649,14 +3988,13 @@ static CURLcode create_conn(struct Curl_easy *data,
}
if(waitpipe)
- /* There is a connection that *might* become usable for multiplexing
+ /* There is a connection that *might* become usable for pipelining
"soon", and we wait for that */
connections_available = FALSE;
else {
/* this gets a lock on the conncache */
- const char *bundlehost;
struct connectbundle *bundle =
- Curl_conncache_find_bundle(conn, data->state.conn_cache, &bundlehost);
+ Curl_conncache_find_bundle(conn, data->state.conn_cache);
if(max_host_connections > 0 && bundle &&
(bundle->num_connections >= max_host_connections)) {
@@ -3670,8 +4008,8 @@ static CURLcode create_conn(struct Curl_easy *data,
(void)Curl_disconnect(data, conn_candidate,
/* dead_connection */ FALSE);
else {
- infof(data, "No more connections allowed to host %s: %zu\n",
- bundlehost, max_host_connections);
+ infof(data, "No more connections allowed to host: %zu\n",
+ max_host_connections);
connections_available = FALSE;
}
}
@@ -3832,9 +4170,7 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
}
else {
Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */
- if(conn->ssl[FIRSTSOCKET].use ||
- (conn->handler->protocol & PROTO_FAMILY_SSH))
- Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
+ Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
conn->bits.tcpconnect[FIRSTSOCKET] = TRUE;
*protocol_done = TRUE;
Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]);
@@ -3865,7 +4201,7 @@ CURLcode Curl_connect(struct Curl_easy *data,
if(!result) {
if(CONN_INUSE(conn))
- /* multiplexed */
+ /* pipelining */
*protocol_done = TRUE;
else if(!*asyncp) {
/* DNS resolution is done: that's either because this is a reused
@@ -3883,7 +4219,7 @@ CURLcode Curl_connect(struct Curl_easy *data,
connectdata struct, free those here */
Curl_disconnect(data, conn, TRUE);
}
- else if(!result && !data->conn)
+ else if(!data->conn)
/* FILE: transfers already have the connection attached */
Curl_attach_connnection(data, conn);
@@ -4055,3 +4391,34 @@ static unsigned int get_protocol_family(unsigned int protocol)
return family;
}
+
+
+/*
+ * Wrapper to call functions in Curl_conncache_foreach()
+ *
+ * Returns always 0.
+ */
+static int conn_upkeep(struct connectdata *conn,
+ void *param)
+{
+ /* Param is unused. */
+ (void)param;
+
+ if(conn->handler->connection_check) {
+ /* Do a protocol-specific keepalive check on the connection. */
+ conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
+ }
+
+ return 0; /* continue iteration */
+}
+
+CURLcode Curl_upkeep(struct conncache *conn_cache,
+ void *data)
+{
+ /* Loop over every connection and make connection alive. */
+ Curl_conncache_foreach(data,
+ conn_cache,
+ data,
+ conn_upkeep);
+ return CURLE_OK;
+}
diff --git a/lib/url.h b/lib/url.h
index 053fbdffc..fbd8ef925 100644
--- a/lib/url.h
+++ b/lib/url.h
@@ -48,24 +48,47 @@ CURLcode Curl_open(struct Curl_easy **curl);
CURLcode Curl_init_userdefined(struct Curl_easy *data);
void Curl_freeset(struct Curl_easy * data);
+/* free the URL pieces */
+void Curl_up_free(struct Curl_easy *data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
-CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
+CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
CURLcode Curl_disconnect(struct Curl_easy *data,
struct connectdata *, bool dead_connection);
+CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
+CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
+CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
CURLcode Curl_setup_conn(struct connectdata *conn,
bool *protocol_done);
void Curl_free_request_state(struct Curl_easy *data);
+
+int Curl_protocol_getsock(struct connectdata *conn,
+ curl_socket_t *socks,
+ int numsocks);
+int Curl_doing_getsock(struct connectdata *conn,
+ curl_socket_t *socks,
+ int numsocks);
CURLcode Curl_parse_login_details(const char *login, const size_t len,
char **userptr, char **passwdptr,
char **optionsptr);
+int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
+ struct curl_llist *pipeline);
+/* remove the specified connection from all (possible) pipelines and related
+ queues */
+void Curl_getoff_all_pipelines(struct Curl_easy *data,
+ struct connectdata *conn);
+
+CURLcode Curl_upkeep(struct conncache *conn_cache, void *data);
+
const struct Curl_handler *Curl_builtin_scheme(const char *scheme);
#define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
#define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
specified */
+CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex);
+
#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define Curl_verboseconnect(x) Curl_nop_stmt
#else
diff --git a/lib/urlapi-int.h b/lib/urlapi-int.h
index d14d53d97..75a360542 100644
--- a/lib/urlapi-int.h
+++ b/lib/urlapi-int.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,10 +22,14 @@
*
***************************************************************************/
#include "curl_setup.h"
-/* scheme is not URL encoded, the longest libcurl supported ones are... */
-#define MAX_SCHEME_LEN 40
+/* scheme is not URL encoded, the longest libcurl supported ones are 6
+ letters */
+#define MAX_SCHEME_LEN 8
bool Curl_is_absolute_url(const char *url, char *scheme, size_t buflen);
+char *Curl_concat_url(const char *base, const char *relurl);
+size_t Curl_strlen_url(const char *url, bool relative);
+void Curl_strcpy_url(char *output, const char *url, bool relative);
#ifdef DEBUGBUILD
CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname);
diff --git a/lib/urlapi.c b/lib/urlapi.c
index fa514bce5..a19867eb0 100644
--- a/lib/urlapi.c
+++ b/lib/urlapi.c
@@ -29,7 +29,6 @@
#include "url.h"
#include "escape.h"
#include "curl_ctype.h"
-#include "inet_pton.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -57,14 +56,12 @@ struct Curl_URL {
char *password;
char *options; /* IMAP only? */
char *host;
- char *zoneid; /* for numerical IPv6 addresses */
char *port;
char *path;
char *query;
char *fragment;
char *scratch; /* temporary scratch area */
- char *temppath; /* temporary path pointer */
long portnum; /* the numerical version */
};
@@ -77,13 +74,11 @@ static void free_urlhandle(struct Curl_URL *u)
free(u->password);
free(u->options);
free(u->host);
- free(u->zoneid);
free(u->port);
free(u->path);
free(u->query);
free(u->fragment);
free(u->scratch);
- free(u->temppath);
}
/* move the full contents of one handle onto another and
@@ -353,7 +348,7 @@ static char *concat_url(const char *base, const char *relurl)
else {
/* We got a new absolute path for this server */
- if(relurl[1] == '/') {
+ if((relurl[0] == '/') && (relurl[1] == '/')) {
/* the new URL starts with //, just keep the protocol part from the
original one */
*protsep = 0;
@@ -509,7 +504,7 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
portptr = &hostname[len];
else if('%' == endbracket) {
int zonelen = len;
- if(1 == sscanf(hostname + zonelen, "%*[^]]%c%n", &endbracket, &len)) {
+ if(1 == sscanf(hostname + zonelen, "25%*[^]]%c%n", &endbracket, &len)) {
if(']' != endbracket)
return CURLUE_MALFORMED_INPUT;
portptr = &hostname[--zonelen + len + 1];
@@ -592,57 +587,25 @@ static CURLUcode junkscan(char *part)
return CURLUE_OK;
}
-static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
+static CURLUcode hostname_check(char *hostname, unsigned int flags)
{
+ const char *l = NULL; /* accepted characters */
size_t len;
size_t hlen = strlen(hostname);
+ (void)flags;
if(hostname[0] == '[') {
-#ifdef ENABLE_IPV6
- char dest[16]; /* fits a binary IPv6 address */
-#endif
- const char *l = "0123456789abcdefABCDEF:.";
- if(hlen < 5) /* '[::1]' is the shortest possible valid string */
- return CURLUE_MALFORMED_INPUT;
hostname++;
+ l = "0123456789abcdefABCDEF::.%";
hlen -= 2;
+ }
- if(hostname[hlen] != ']')
- return CURLUE_MALFORMED_INPUT;
-
+ if(l) {
/* only valid letters are ok */
len = strspn(hostname, l);
- if(hlen != len) {
- hlen = len;
- if(hostname[len] == '%') {
- /* this could now be '%[zone id]' */
- char zoneid[16];
- int i = 0;
- char *h = &hostname[len + 1];
- /* pass '25' if present and is a url encoded percent sign */
- if(!strncmp(h, "25", 2) && h[2] && (h[2] != ']'))
- h += 2;
- while(*h && (*h != ']') && (i < 15))
- zoneid[i++] = *h++;
- if(!i || (']' != *h))
- return CURLUE_MALFORMED_INPUT;
- zoneid[i] = 0;
- u->zoneid = strdup(zoneid);
- if(!u->zoneid)
- return CURLUE_OUT_OF_MEMORY;
- hostname[len] = ']'; /* insert end bracket */
- hostname[len + 1] = 0; /* terminate the hostname */
- }
- else
- return CURLUE_MALFORMED_INPUT;
- /* hostname is fine */
- }
-#ifdef ENABLE_IPV6
- hostname[hlen] = 0; /* end the address there */
- if(1 != Curl_inet_pton(AF_INET6, hostname, dest))
+ if(hlen != len)
+ /* hostname with bad content */
return CURLUE_MALFORMED_INPUT;
- hostname[hlen] = ']'; /* restore ending bracket */
-#endif
}
else {
/* letters from the second string is not ok */
@@ -651,8 +614,6 @@ static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
/* hostname with bad content */
return CURLUE_MALFORMED_INPUT;
}
- if(!hostname[0])
- return CURLUE_NO_HOST;
return CURLUE_OK;
}
@@ -667,7 +628,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
char *fragment = NULL;
CURLUcode result;
bool url_has_scheme = FALSE;
- char schemebuf[MAX_SCHEME_LEN + 1];
+ char schemebuf[MAX_SCHEME_LEN];
char *schemep = NULL;
size_t schemelen = 0;
size_t urllen;
@@ -681,10 +642,6 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
************************************************************/
/* allocate scratch area */
urllen = strlen(url);
- if(urllen > CURL_MAX_INPUT_LENGTH)
- /* excessive input length */
- return CURLUE_MALFORMED_INPUT;
-
path = u->scratch = malloc(urllen * 2 + 2);
if(!path)
return CURLUE_OUT_OF_MEMORY;
@@ -790,7 +747,6 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(junkscan(schemep))
return CURLUE_MALFORMED_INPUT;
-
}
else {
/* no scheme! */
@@ -811,14 +767,11 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
p++;
len = p - hostp;
- if(len) {
- memcpy(hostname, hostp, len);
- hostname[len] = 0;
- }
- else {
- if(!(flags & CURLU_NO_AUTHORITY))
- return CURLUE_MALFORMED_INPUT;
- }
+ if(!len)
+ return CURLUE_MALFORMED_INPUT;
+
+ memcpy(hostname, hostp, len);
+ hostname[len] = 0;
if((flags & CURLU_GUESS_SCHEME) && !schemep) {
/* legacy curl-style guess based on host name */
@@ -853,60 +806,35 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(junkscan(path))
return CURLUE_MALFORMED_INPUT;
- if((flags & CURLU_URLENCODE) && path[0]) {
- /* worst case output length is 3x the original! */
- char *newp = malloc(strlen(path) * 3);
- if(!newp)
- return CURLUE_OUT_OF_MEMORY;
- path_alloced = TRUE;
- strcpy_url(newp, path, TRUE); /* consider it relative */
- u->temppath = path = newp;
- }
-
- fragment = strchr(path, '#');
- if(fragment) {
- *fragment++ = 0;
- if(fragment[0]) {
- u->fragment = strdup(fragment);
- if(!u->fragment)
- return CURLUE_OUT_OF_MEMORY;
- }
- }
-
query = strchr(path, '?');
- if(query) {
+ if(query)
*query++ = 0;
- /* done even if the query part is a blank string */
- u->query = strdup(query);
- if(!u->query)
- return CURLUE_OUT_OF_MEMORY;
- }
+
+ fragment = strchr(query?query:path, '#');
+ if(fragment)
+ *fragment++ = 0;
if(!path[0])
- /* if there's no path left set, unset */
+ /* if there's no path set, unset */
path = NULL;
- else {
- if(!(flags & CURLU_PATH_AS_IS)) {
- /* remove ../ and ./ sequences according to RFC3986 */
- char *newp = Curl_dedotdotify(path);
- if(!newp)
- return CURLUE_OUT_OF_MEMORY;
+ else if(!(flags & CURLU_PATH_AS_IS)) {
+ /* sanitise paths and remove ../ and ./ sequences according to RFC3986 */
+ char *newp = Curl_dedotdotify(path);
+ if(!newp)
+ return CURLUE_OUT_OF_MEMORY;
- if(strcmp(newp, path)) {
- /* if we got a new version */
- if(path_alloced)
- Curl_safefree(u->temppath);
- u->temppath = path = newp;
- path_alloced = TRUE;
- }
- else
- free(newp);
+ if(strcmp(newp, path)) {
+ /* if we got a new version */
+ path = newp;
+ path_alloced = TRUE;
}
-
+ else
+ free(newp);
+ }
+ if(path) {
u->path = path_alloced?path:strdup(path);
if(!u->path)
return CURLUE_OUT_OF_MEMORY;
- u->temppath = NULL; /* used now */
}
if(hostname) {
@@ -924,22 +852,28 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(result)
return result;
- if(0 == strlen(hostname) && (flags & CURLU_NO_AUTHORITY)) {
- /* Skip hostname check, it's allowed to be empty. */
- }
- else {
- result = hostname_check(u, hostname);
- if(result)
- return result;
- }
+ result = hostname_check(hostname, flags);
+ if(result)
+ return result;
u->host = strdup(hostname);
if(!u->host)
return CURLUE_OUT_OF_MEMORY;
}
- Curl_safefree(u->scratch);
- Curl_safefree(u->temppath);
+ if(query) {
+ u->query = strdup(query);
+ if(!u->query)
+ return CURLUE_OUT_OF_MEMORY;
+ }
+ if(fragment && fragment[0]) {
+ u->fragment = strdup(fragment);
+ if(!u->fragment)
+ return CURLUE_OUT_OF_MEMORY;
+ }
+
+ free(u->scratch);
+ u->scratch = NULL;
return CURLUE_OK;
}
@@ -1037,9 +971,6 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
ptr = u->host;
ifmissing = CURLUE_NO_HOST;
break;
- case CURLUPART_ZONEID:
- ptr = u->zoneid;
- break;
case CURLUPART_PORT:
ptr = u->port;
ifmissing = CURLUE_NO_PORT;
@@ -1086,7 +1017,6 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
char *scheme;
char *options = u->options;
char *port = u->port;
- char *allochost = NULL;
if(u->scheme && strcasecompare("file", u->scheme)) {
url = aprintf("file://%s%s%s",
u->path,
@@ -1104,38 +1034,27 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
else
return CURLUE_NO_SCHEME;
- h = Curl_builtin_scheme(scheme);
- if(!port && (flags & CURLU_DEFAULT_PORT)) {
- /* there's no stored port number, but asked to deliver
- a default one for the scheme */
- if(h) {
- msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
- port = portbuf;
+ if(scheme) {
+ h = Curl_builtin_scheme(scheme);
+ if(!port && (flags & CURLU_DEFAULT_PORT)) {
+ /* there's no stored port number, but asked to deliver
+ a default one for the scheme */
+ if(h) {
+ msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
+ port = portbuf;
+ }
+ }
+ else if(port) {
+ /* there is a stored port number, but asked to inhibit if it matches
+ the default one for the scheme */
+ if(h && (h->defport == u->portnum) &&
+ (flags & CURLU_NO_DEFAULT_PORT))
+ port = NULL;
}
}
- else if(port) {
- /* there is a stored port number, but asked to inhibit if it matches
- the default one for the scheme */
- if(h && (h->defport == u->portnum) &&
- (flags & CURLU_NO_DEFAULT_PORT))
- port = NULL;
- }
-
if(h && !(h->flags & PROTOPT_URLOPTIONS))
options = NULL;
- if((u->host[0] == '[') && u->zoneid) {
- /* make it '[ host %25 zoneid ]' */
- size_t hostlen = strlen(u->host);
- size_t alen = hostlen + 3 + strlen(u->zoneid) + 1;
- allochost = malloc(alen);
- if(!allochost)
- return CURLUE_OUT_OF_MEMORY;
- memcpy(allochost, u->host, hostlen - 1);
- msnprintf(&allochost[hostlen - 1], alen - hostlen + 1,
- "%%25%s]", u->zoneid);
- }
-
url = aprintf("%s://%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
scheme,
u->user ? u->user : "",
@@ -1144,7 +1063,7 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
options ? ";" : "",
options ? options : "",
(u->user || u->password || options) ? "@": "",
- allochost ? allochost : u->host,
+ u->host,
port ? ":": "",
port ? port : "",
(u->path && (u->path[0] != '/')) ? "/": "",
@@ -1153,7 +1072,6 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
(u->query && u->query[0]) ? u->query : "",
u->fragment? "#": "",
u->fragment? u->fragment : "");
- free(allochost);
}
if(!url)
return CURLUE_OUT_OF_MEMORY;
@@ -1226,11 +1144,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
case CURLUPART_HOST:
storep = &u->host;
break;
- case CURLUPART_ZONEID:
- storep = &u->zoneid;
- break;
case CURLUPART_PORT:
- u->portnum = 0;
storep = &u->port;
break;
case CURLUPART_PATH:
@@ -1254,9 +1168,6 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
switch(what) {
case CURLUPART_SCHEME:
- if(strlen(part) > MAX_SCHEME_LEN)
- /* too long */
- return CURLUE_MALFORMED_INPUT;
if(!(flags & CURLU_NON_SUPPORT_SCHEME) &&
/* verify that it is a fine scheme */
!Curl_builtin_scheme(part))
@@ -1275,25 +1186,14 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
break;
case CURLUPART_HOST:
storep = &u->host;
- free(u->zoneid);
- u->zoneid = NULL;
- break;
- case CURLUPART_ZONEID:
- storep = &u->zoneid;
break;
case CURLUPART_PORT:
- {
- char *endp;
urlencode = FALSE; /* never */
- port = strtol(part, &endp, 10); /* Port number must be decimal */
+ port = strtol(part, NULL, 10); /* Port number must be decimal */
if((port <= 0) || (port > 0xffff))
return CURLUE_BAD_PORT_NUMBER;
- if(*endp)
- /* weirdly provided number, not good! */
- return CURLUE_MALFORMED_INPUT;
storep = &u->port;
- }
- break;
+ break;
case CURLUPART_PATH:
urlskipslash = TRUE;
storep = &u->path;
@@ -1319,7 +1219,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
char *redired_url;
CURLU *handle2;
- if(Curl_is_absolute_url(part, NULL, MAX_SCHEME_LEN + 1)) {
+ if(Curl_is_absolute_url(part, NULL, MAX_SCHEME_LEN)) {
handle2 = curl_url();
if(!handle2)
return CURLUE_OUT_OF_MEMORY;
@@ -1368,17 +1268,12 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
default:
return CURLUE_UNKNOWN_PART;
}
- DEBUGASSERT(storep);
- {
+ if(storep) {
const char *newp = part;
size_t nalloc = strlen(part);
- if(nalloc > CURL_MAX_INPUT_LENGTH)
- /* excessive input length */
- return CURLUE_MALFORMED_INPUT;
-
if(urlencode) {
- const unsigned char *i;
+ const char *i;
char *o;
bool free_part = FALSE;
char *enc = malloc(nalloc * 3 + 1); /* for worst case! */
@@ -1386,7 +1281,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
return CURLUE_OUT_OF_MEMORY;
if(plusencode) {
/* space to plus */
- i = (const unsigned char *)part;
+ i = part;
for(o = enc; *i; ++o, ++i)
*o = (*i == ' ') ? '+' : *i;
*o = 0; /* zero terminate */
@@ -1397,7 +1292,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
}
free_part = TRUE;
}
- for(i = (const unsigned char *)part, o = enc; *i; i++) {
+ for(i = part, o = enc; *i; i++) {
if(Curl_isunreserved(*i) ||
((*i == '/') && urlskipslash) ||
((*i == '=') && equalsencode) ||
@@ -1460,18 +1355,6 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
}
}
- if(what == CURLUPART_HOST) {
- if(0 == strlen(newp) && (flags & CURLU_NO_AUTHORITY)) {
- /* Skip hostname check, it's allowed to be empty. */
- }
- else {
- if(hostname_check(u, (char *)newp)) {
- free((char *)newp);
- return CURLUE_MALFORMED_INPUT;
- }
- }
- }
-
free(*storep);
*storep = (char *)newp;
}
diff --git a/lib/urldata.h b/lib/urldata.h
index f9365b2e6..24187a4c4 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -68,7 +68,6 @@
#define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
#define PROTO_FAMILY_SMB (CURLPROTO_SMB|CURLPROTO_SMBS)
#define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
-#define PROTO_FAMILY_SSH (CURLPROTO_SCP|CURLPROTO_SFTP)
#define DEFAULT_CONNCACHE_SIZE 5
@@ -80,10 +79,6 @@
*/
#define RESP_TIMEOUT (120*1000)
-/* Max string intput length is a precaution against abuse and to detect junk
- input easier and better. */
-#define CURL_MAX_INPUT_LENGTH 8000000
-
#include "cookie.h"
#include "psl.h"
#include "formdata.h"
@@ -130,7 +125,6 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
#include "smb.h"
#include "wildcard.h"
#include "multihandle.h"
-#include "quic.h"
#ifdef HAVE_GSSAPI
# ifdef HAVE_GSSGNU
@@ -150,6 +144,10 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
#include <libssh2_sftp.h>
#endif /* HAVE_LIBSSH2_H */
+
+/* The "master buffer" is for HTTP pipelining */
+#define MASTERBUF_SIZE 16384
+
/* Initial size of the buffer to store headers in, it'll be enlarged in case
of need. */
#define HEADERSIZE 256
@@ -159,13 +157,7 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
/* the type we use for storing a single boolean bit */
-#ifdef _MSC_VER
-typedef bool bit;
-#define BIT(x) bool x
-#else
typedef unsigned int bit;
-#define BIT(x) bit x:1
-#endif
#ifdef HAVE_GSSAPI
/* Types needed for krb5-ftp connections */
@@ -173,7 +165,7 @@ struct krb5buffer {
void *data;
size_t size;
size_t index;
- BIT(eof_flag);
+ bit eof_flag:1;
};
enum protection_level {
@@ -216,7 +208,7 @@ struct ssl_connect_data {
#if defined(USE_SSL)
struct ssl_backend_data *backend;
#endif
- BIT(use);
+ bit use:1;
};
struct ssl_primary_config {
@@ -229,11 +221,10 @@ struct ssl_primary_config {
char *egdsocket; /* path to file containing the EGD daemon socket */
char *cipher_list; /* list of ciphers to use */
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
- char *pinned_key;
- BIT(verifypeer); /* set TRUE if this is desired */
- BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
- BIT(verifystatus); /* set TRUE if certificate status must be checked */
- BIT(sessionid); /* cache session IDs or not */
+ bit verifypeer:1; /* set TRUE if this is desired */
+ bit verifyhost:1; /* set TRUE if CN/SAN must match hostname */
+ bit verifystatus:1; /* set TRUE if certificate status must be checked */
+ bit sessionid:1; /* cache session IDs or not */
};
struct ssl_config_data {
@@ -253,10 +244,10 @@ struct ssl_config_data {
char *password; /* TLS password (for, e.g., SRP) */
enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
#endif
- BIT(certinfo); /* gather lots of certificate info */
- BIT(falsestart);
- BIT(enable_beast); /* allow this flaw for interoperability's sake*/
- BIT(no_revoke); /* disable SSL certificate revocation checks */
+ bit certinfo:1; /* gather lots of certificate info */
+ bit falsestart:1;
+ bit enable_beast:1; /* allow this flaw for interoperability's sake*/
+ bit no_revoke:1; /* disable SSL certificate revocation checks */
};
struct ssl_general_config {
@@ -299,8 +290,8 @@ struct digestdata {
char *qop;
char *algorithm;
int nc; /* nounce count */
- BIT(stale); /* set true for re-negotiation */
- BIT(userhash);
+ bit stale:1; /* set true for re-negotiation */
+ bit userhash:1;
#endif
};
@@ -312,14 +303,6 @@ typedef enum {
NTLMSTATE_LAST
} curlntlm;
-typedef enum {
- GSS_AUTHNONE,
- GSS_AUTHRECV,
- GSS_AUTHSENT,
- GSS_AUTHDONE,
- GSS_AUTHSUCC
-} curlnegotiate;
-
#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
#include <iconv.h>
#endif
@@ -345,6 +328,7 @@ struct kerberos5data {
/* Struct used for NTLM challenge-response authentication */
#if defined(USE_NTLM)
struct ntlmdata {
+ curlntlm state;
#ifdef USE_WINDOWS_SSPI
/* The sslContext is used for the Schannel bindings. The
* api is available on the Windows 7 SDK and later.
@@ -370,9 +354,13 @@ struct ntlmdata {
};
#endif
-/* Struct used for Negotiate (SPNEGO) authentication */
#ifdef USE_SPNEGO
struct negotiatedata {
+ /* When doing Negotiate (SPNEGO) auth, we first need to send a token
+ and then validate the received one. */
+ enum {
+ GSS_AUTHNONE, GSS_AUTHRECV, GSS_AUTHSENT, GSS_AUTHDONE, GSS_AUTHSUCC
+ } state;
#ifdef HAVE_GSSAPI
OM_uint32 status;
gss_ctx_id_t context;
@@ -394,10 +382,10 @@ struct negotiatedata {
size_t output_token_length;
#endif
#endif
- BIT(noauthpersist);
- BIT(havenoauthpersist);
- BIT(havenegdata);
- BIT(havemultiplerequests);
+ bool noauthpersist;
+ bool havenoauthpersist;
+ bool havenegdata;
+ bool havemultiplerequests;
};
#endif
@@ -411,64 +399,61 @@ struct ConnectBits {
is complete */
bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
the first time on the first connect function call */
- BIT(close); /* if set, we close the connection after this request */
- BIT(reuse); /* if set, this is a re-used connection */
- BIT(altused); /* this is an alt-svc "redirect" */
- BIT(conn_to_host); /* if set, this connection has a "connect to host"
- that overrides the host in the URL */
- BIT(conn_to_port); /* if set, this connection has a "connect to port"
- that overrides the port in the URL (remote port) */
- BIT(proxy); /* if set, this transfer is done through a proxy - any type */
- BIT(httpproxy); /* if set, this transfer is done through a http proxy */
- BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
- BIT(user_passwd); /* do we use user+password for this connection? */
- BIT(proxy_user_passwd); /* user+password for the proxy? */
- BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
- IP address */
- BIT(ipv6); /* we communicate with a site using an IPv6 address */
- BIT(do_more); /* this is set TRUE if the ->curl_do_more() function is
- supposed to be called, after ->curl_do() */
- BIT(protoconnstart);/* the protocol layer has STARTED its operation after
- the TCP layer connect */
- BIT(retry); /* this connection is about to get closed and then
- re-attempted at another connection. */
- BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy.
- This is implicit when SSL-protocols are used through
- proxies, but can also be enabled explicitly by
- apps */
- BIT(authneg); /* TRUE when the auth phase has started, which means
- that we are creating a request with an auth header,
- but it is not the final request in the auth
- negotiation. */
- BIT(rewindaftersend);/* TRUE when the sending couldn't be stopped even
- though it will be discarded. When the whole send
- operation is done, we must call the data rewind
- callback. */
-#ifndef CURL_DISABLE_FTP
- BIT(ftp_use_epsv); /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
- EPSV doesn't work we disable it for the forthcoming
- requests */
- BIT(ftp_use_eprt); /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
- EPRT doesn't work we disable it for the forthcoming
- requests */
- BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
-#endif
- BIT(netrc); /* name+password provided by netrc */
- BIT(userpwd_in_url); /* name+password found in url */
- BIT(stream_was_rewound); /* The stream was rewound after a request read
- past the end of its response byte boundary */
- BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
- in a CONNECT request with auth, so that
- libcurl should reconnect and continue. */
- BIT(bound); /* set true if bind() has already been done on this socket/
- connection */
- BIT(type_set); /* type= was used in the URL */
- BIT(multiplex); /* connection is multiplexed */
- BIT(tcp_fastopen); /* use TCP Fast Open */
- BIT(tls_enable_npn); /* TLS NPN extension? */
- BIT(tls_enable_alpn); /* TLS ALPN extension? */
- BIT(socksproxy_connecting); /* connecting through a socks proxy */
- BIT(connect_only);
+ bit close:1; /* if set, we close the connection after this request */
+ bit reuse:1; /* if set, this is a re-used connection */
+ bit conn_to_host:1; /* if set, this connection has a "connect to host"
+ that overrides the host in the URL */
+ bit conn_to_port:1; /* if set, this connection has a "connect to port"
+ that overrides the port in the URL (remote port) */
+ bit proxy:1; /* if set, this transfer is done through a proxy - any type */
+ bit httpproxy:1; /* if set, this transfer is done through a http proxy */
+ bit socksproxy:1; /* if set, this transfer is done through a socks proxy */
+ bit user_passwd:1; /* do we use user+password for this connection? */
+ bit proxy_user_passwd:1; /* user+password for the proxy? */
+ bit ipv6_ip:1; /* we communicate with a remote site specified with pure IPv6
+ IP address */
+ bit ipv6:1; /* we communicate with a site using an IPv6 address */
+ bit do_more:1; /* this is set TRUE if the ->curl_do_more() function is
+ supposed to be called, after ->curl_do() */
+ bit protoconnstart:1;/* the protocol layer has STARTED its operation after
+ the TCP layer connect */
+ bit retry:1; /* this connection is about to get closed and then
+ re-attempted at another connection. */
+ bit tunnel_proxy:1; /* if CONNECT is used to "tunnel" through the proxy.
+ This is implicit when SSL-protocols are used through
+ proxies, but can also be enabled explicitly by
+ apps */
+ bit authneg:1; /* TRUE when the auth phase has started, which means
+ that we are creating a request with an auth header,
+ but it is not the final request in the auth
+ negotiation. */
+ bit rewindaftersend:1;/* TRUE when the sending couldn't be stopped even
+ though it will be discarded. When the whole send
+ operation is done, we must call the data rewind
+ callback. */
+ bit ftp_use_epsv:1; /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
+ EPSV doesn't work we disable it for the forthcoming
+ requests */
+ bit ftp_use_eprt:1; /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
+ EPRT doesn't work we disable it for the forthcoming
+ requests */
+ bit ftp_use_data_ssl:1; /* Enabled SSL for the data connection */
+ bit netrc:1; /* name+password provided by netrc */
+ bit userpwd_in_url:1; /* name+password found in url */
+ bit stream_was_rewound:1; /* The stream was rewound after a request read
+ past the end of its response byte boundary */
+ bit proxy_connect_closed:1; /* TRUE if a proxy disconnected the connection
+ in a CONNECT request with auth, so that
+ libcurl should reconnect and continue. */
+ bit bound:1; /* set true if bind() has already been done on this socket/
+ connection */
+ bit type_set:1; /* type= was used in the URL */
+ bit multiplex:1; /* connection is multiplexed */
+ bit tcp_fastopen:1; /* use TCP Fast Open */
+ bit tls_enable_npn:1; /* TLS NPN extension? */
+ bit tls_enable_alpn:1; /* TLS ALPN extension? */
+ bit socksproxy_connecting:1; /* connecting through a socks proxy */
+ bit connect_only:1;
};
struct hostname {
@@ -501,7 +486,7 @@ struct Curl_async {
struct Curl_dns_entry *dns;
int status; /* if done is TRUE, this is the status from the callback */
void *os_specific; /* 'struct thread_data' for Windows */
- BIT(done); /* set TRUE when the lookup is complete */
+ bit done:1; /* set TRUE when the lookup is complete */
};
#define FIRSTSOCKET 0
@@ -619,23 +604,21 @@ struct SingleRequest {
char *upload_fromhere;
void *protop; /* Allocated protocol-specific data. Each protocol
handler makes sure this points to data it needs. */
-#ifndef CURL_DISABLE_DOH
struct dohdata doh; /* DoH specific data for this request */
-#endif
- BIT(header); /* incoming data has HTTP header */
- BIT(content_range); /* set TRUE if Content-Range: was found */
- BIT(upload_done); /* set to TRUE when doing chunked transfer-encoding
- upload and we're uploading the last chunk */
- BIT(ignorebody); /* we read a response-body but we ignore it! */
- BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
- 204 or 304 */
- BIT(chunk); /* if set, this is a chunked transfer-encoding */
- BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
- on upload */
- BIT(getheader); /* TRUE if header parsing is wanted */
- BIT(forbidchunk); /* used only to explicitly forbid chunk-upload for
- specific upload buffers. See readmoredata() in http.c
- for details. */
+ bit header:1; /* incoming data has HTTP header */
+ bit content_range:1; /* set TRUE if Content-Range: was found */
+ bit upload_done:1; /* set to TRUE when doing chunked transfer-encoding
+ upload and we're uploading the last chunk */
+ bit ignorebody:1; /* we read a response-body but we ignore it! */
+ bit ignorecl:1; /* This HTTP response has no body so we ignore the
+ Content-Length: header */
+ bit chunk:1; /* if set, this is a chunked transfer-encoding */
+ bit upload_chunky:1; /* set TRUE if we are doing chunked transfer-encoding
+ on upload */
+ bit getheader:1; /* TRUE if header parsing is wanted */
+ bit forbidchunk:1; /* used only to explicitly forbid chunk-upload for
+ specific upload buffers. See readmoredata() in http.c
+ for details. */
};
/*
@@ -673,23 +656,27 @@ struct Curl_handler {
/* Called from the multi interface during the PROTOCONNECT phase, and it
should then return a proper fd set */
int (*proto_getsock)(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
/* Called from the multi interface during the DOING phase, and it should
then return a proper fd set */
int (*doing_getsock)(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
/* Called from the multi interface during the DO_MORE phase, and it should
then return a proper fd set */
int (*domore_getsock)(struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
/* Called from the multi interface during the DO_DONE, PERFORM and
WAITPERFORM phases, and it should then return a proper fd set. Not setting
this will make libcurl use the generic default one. */
int (*perform_getsock)(const struct connectdata *conn,
- curl_socket_t *socks);
+ curl_socket_t *socks,
+ int numsocks);
/* This function *MAY* be set to a protocol-dependent function that is run
* by the curl_disconnect(), as a step in the disconnection. If the handler
@@ -784,12 +771,10 @@ struct http_connect_state {
TUNNEL_CONNECT, /* CONNECT has been sent off */
TUNNEL_COMPLETE /* CONNECT response received completely */
} tunnel_state;
- BIT(chunked_encoding);
- BIT(close_connection);
+ bit chunked_encoding:1;
+ bit close_connection:1;
};
-struct ldapconninfo;
-
/*
* The connectdata struct contains all fields and variables that should be
* unique for an entire connection.
@@ -811,10 +796,11 @@ struct connectdata {
void *closesocket_client;
/* This is used by the connection cache logic. If this returns TRUE, this
- handle is still used by one or more easy handles and can only used by any
+ handle is being used by one or more easy handles and can only used by any
other easy handle without careful consideration (== only for
- multiplexing) and it cannot be used by another multi handle! */
-#define CONN_INUSE(c) ((c)->easyq.size)
+ pipelining/multiplexing) and it cannot be used by another multi
+ handle! */
+#define CONN_INUSE(c) ((c)->send_pipe.size + (c)->recv_pipe.size)
/**** Fields set when inited and not modified again */
long connection_id; /* Contains a unique number to make it easier to
@@ -839,16 +825,7 @@ struct connectdata {
unsigned int scope_id; /* Scope id for IPv6 */
- enum {
- TRNSPRT_TCP = 3,
- TRNSPRT_UDP = 4,
- TRNSPRT_QUIC = 5
- } transport;
-
-#ifdef ENABLE_QUIC
- struct quicsocket hequic[2]; /* two, for happy eyeballs! */
- struct quicsocket *quic;
-#endif
+ int socktype; /* SOCK_STREAM or SOCK_DGRAM */
struct hostname host;
char *hostname_resolve; /* host name to resolve to address, allocated */
@@ -887,15 +864,13 @@ struct connectdata {
char *passwd; /* password string, allocated */
char *options; /* options string, allocated */
- char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
- char *sasl_authzid; /* authorisation identity string, allocated */
+ char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
int httpversion; /* the HTTP version*10 reported by the server */
int rtspversion; /* the RTSP version*10 reported by the server */
struct curltime now; /* "current" time */
struct curltime created; /* creation time */
- struct curltime lastused; /* when returned to the connection cache */
curl_socket_t sock[2]; /* two sockets, the second is used for the data
transfer when doing FTP */
curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
@@ -922,8 +897,8 @@ struct connectdata {
struct curltime connecttime;
/* The two fields below get set in Curl_connecthost */
int num_addr; /* number of addresses to try to connect to */
- timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
- trying to connect to each IP address */
+ time_t timeoutms_per_addr; /* how long time in milliseconds to spend on
+ trying to connect to each IP address */
const struct Curl_handler *handler; /* Connection's protocol handler */
const struct Curl_handler *given; /* The protocol first given */
@@ -960,7 +935,7 @@ struct connectdata {
} allocptr;
#ifdef HAVE_GSSAPI
- BIT(sec_complete); /* if Kerberos is enabled for this connection */
+ bit sec_complete:1; /* if Kerberos is enabled for this connection */
enum protection_level command_prot;
enum protection_level data_prot;
enum protection_level request_data_prot;
@@ -975,7 +950,16 @@ struct connectdata {
struct kerberos5data krb5; /* variables into the structure definition, */
#endif /* however, some of them are ftp specific. */
- struct curl_llist easyq; /* List of easy handles using this connection */
+ struct curl_llist send_pipe; /* List of handles waiting to send on this
+ pipeline */
+ struct curl_llist recv_pipe; /* List of handles waiting to read their
+ responses on this pipeline */
+ char *master_buffer; /* The master buffer allocated on-demand;
+ used for pipelining. */
+ size_t read_pos; /* Current read position in the master buffer */
+ size_t buf_len; /* Length of the buffer?? */
+
+
curl_seek_callback seek_func; /* function that seeks the input */
void *seek_client; /* pointer to pass to the seek() above */
@@ -985,9 +969,6 @@ struct connectdata {
#endif
#if defined(USE_NTLM)
- curlntlm http_ntlm_state;
- curlntlm proxy_ntlm_state;
-
struct ntlmdata ntlm; /* NTLM differs from other authentication schemes
because it authenticates connections, not
single requests! */
@@ -1003,9 +984,6 @@ struct connectdata {
#endif
#ifdef USE_SPNEGO
- curlnegotiate http_negotiate_state;
- curlnegotiate proxy_negotiate_state;
-
struct negotiatedata negotiate; /* state data for host Negotiate auth */
struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */
#endif
@@ -1028,8 +1006,7 @@ struct connectdata {
struct smtp_conn smtpc;
struct rtsp_conn rtspc;
struct smb_conn smbc;
- void *rtmp;
- struct ldapconninfo *ldapc;
+ void *generic; /* RTMP and LDAP use this */
} proto;
int cselect_bits; /* bitmask of socket events */
@@ -1053,16 +1030,16 @@ struct connectdata {
#ifdef USE_UNIX_SOCKETS
char *unix_domain_socket;
- BIT(abstract_unix_socket);
+ bit abstract_unix_socket:1;
#endif
- BIT(tls_upgraded);
+ bit tls_upgraded:1;
/* the two following *_inuse fields are only flags, not counters in any way.
If TRUE it means the channel is in use, and if FALSE it means the channel
is up for grabs by one. */
- BIT(readchannel_inuse); /* whether the read channel is in use by an easy
- handle */
- BIT(writechannel_inuse); /* whether the write channel is in use by an easy
- handle */
+ bit readchannel_inuse:1; /* whether the read channel is in use by an easy
+ handle */
+ bit writechannel_inuse:1; /* whether the write channel is in use by an easy
+ handle */
};
/* The end of connectdata. */
@@ -1084,7 +1061,6 @@ struct PureInfo {
long numconnects; /* how many new connection did libcurl created */
char *contenttype; /* the content type of the object */
char *wouldredirect; /* URL this would've been redirected to if asked to */
- curl_off_t retry_after; /* info from Retry-After: header */
/* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
and, 'conn_local_port' are copied over from the connectdata struct in
@@ -1101,11 +1077,11 @@ struct PureInfo {
const char *conn_scheme;
unsigned int conn_protocol;
struct curl_certinfo certs; /* info about the certs, only populated in
- OpenSSL, GnuTLS, Schannel, NSS and GSKit
- builds. Asked for with CURLOPT_CERTINFO
- / CURLINFO_CERTINFO */
- BIT(timecond); /* set to TRUE if the time condition didn't match, which
- thus made the document NOT get fetched */
+ OpenSSL builds. Asked for with
+ CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+
+ bit timecond:1; /* set to TRUE if the time condition didn't match, which
+ thus made the document NOT get fetched */
};
@@ -1122,17 +1098,17 @@ struct Progress {
int width; /* screen width at download start */
int flags; /* see progress.h */
- timediff_t timespent;
+ time_t timespent;
curl_off_t dlspeed;
curl_off_t ulspeed;
- timediff_t t_nslookup;
- timediff_t t_connect;
- timediff_t t_appconnect;
- timediff_t t_pretransfer;
- timediff_t t_starttransfer;
- timediff_t t_redirect;
+ time_t t_nslookup;
+ time_t t_connect;
+ time_t t_appconnect;
+ time_t t_pretransfer;
+ time_t t_starttransfer;
+ time_t t_redirect;
struct curltime start;
struct curltime t_startsingle;
@@ -1152,8 +1128,8 @@ struct Progress {
curl_off_t speeder[ CURR_TIME ];
struct curltime speeder_time[ CURR_TIME ];
int speeder_c;
- BIT(callback); /* set when progress callback is used */
- BIT(is_t_startransfer_set);
+ bit callback:1; /* set when progress callback is used */
+ bit is_t_startransfer_set:1;
};
typedef enum {
@@ -1201,12 +1177,12 @@ struct auth {
unsigned long picked;
unsigned long avail; /* Bitmask for what the server reports to support for
this resource */
- BIT(done); /* TRUE when the auth phase is done and ready to do the
- actual request */
- BIT(multipass); /* TRUE if this is not yet authenticated but within the
- auth multipass negotiation */
- BIT(iestyle); /* TRUE if digest should be done IE-style or FALSE if it
- should be RFC compliant */
+ bit done:1; /* TRUE when the auth phase is done and ready to do the
+ *actual* request */
+ bit multipass:1; /* TRUE if this is not yet authenticated but within the
+ auth multipass negotiation */
+ bit iestyle:1; /* TRUE if digest should be done IE-style or FALSE if it
+ should be RFC compliant */
};
struct Curl_http2_dep {
@@ -1233,14 +1209,12 @@ typedef enum {
EXPIRE_ASYNC_NAME,
EXPIRE_CONNECTTIMEOUT,
EXPIRE_DNS_PER_NAME,
- EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
EXPIRE_HAPPY_EYEBALLS,
EXPIRE_MULTI_PENDING,
EXPIRE_RUN_NOW,
EXPIRE_SPEEDCHECK,
EXPIRE_TIMEOUT,
EXPIRE_TOOFAST,
- EXPIRE_QUIC,
EXPIRE_LAST /* not an actual timer, used as a marker only */
} expire_id;
@@ -1313,6 +1287,7 @@ struct UrlState {
struct auth authhost; /* auth details for host */
struct auth authproxy; /* auth details for proxy */
+
void *resolver; /* resolver state, if it is used in the URL state -
ares_channel f.e. */
@@ -1336,7 +1311,7 @@ struct UrlState {
/* do FTP line-end conversions on most platforms */
#define CURL_DO_LINEEND_CONV
/* for FTP downloads: track CRLF sequences that span blocks */
- BIT(prev_block_had_trailing_cr);
+ bit prev_block_had_trailing_cr:1;
/* for FTP downloads: how many CRLFs did we converted to LFs? */
curl_off_t crlf_conversions;
#endif
@@ -1371,33 +1346,31 @@ struct UrlState {
trailers_state trailers_state; /* whether we are sending trailers
and what stage are we at */
#ifdef CURLDEBUG
- BIT(conncache_lock);
+ bit conncache_lock:1;
#endif
/* when curl_easy_perform() is called, the multi handle is "owned" by
the easy handle so curl_easy_cleanup() on such an easy handle will
also close the multi handle! */
- BIT(multi_owned_by_easy);
+ bit multi_owned_by_easy:1;
- BIT(this_is_a_follow); /* this is a followed Location: request */
- BIT(refused_stream); /* this was refused, try again */
- BIT(errorbuf); /* Set to TRUE if the error buffer is already filled in.
+ bit this_is_a_follow:1; /* this is a followed Location: request */
+ bit refused_stream:1; /* this was refused, try again */
+ bit errorbuf:1; /* Set to TRUE if the error buffer is already filled in.
This must be set to FALSE every time _easy_perform() is
called. */
- BIT(allow_port); /* Is set.use_port allowed to take effect or not. This
+ bit allow_port:1; /* Is set.use_port allowed to take effect or not. This
is always set TRUE when curl_easy_perform() is called. */
- BIT(authproblem); /* TRUE if there's some problem authenticating */
+ bit authproblem:1; /* TRUE if there's some problem authenticating */
/* set after initial USER failure, to prevent an authentication loop */
- BIT(ftp_trying_alternative);
- BIT(wildcardmatch); /* enable wildcard matching */
- BIT(expect100header); /* TRUE if we added Expect: 100-continue */
- BIT(use_range);
- BIT(rangestringalloc); /* the range string is malloc()'ed */
- BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE
+ bit ftp_trying_alternative:1;
+ bit wildcardmatch:1; /* enable wildcard matching */
+ bit expect100header:1; /* TRUE if we added Expect: 100-continue */
+ bit use_range:1;
+ bit rangestringalloc:1; /* the range string is malloc()'ed */
+ bit done:1; /* set to FALSE when Curl_init_do() is called and set to TRUE
when multi_done() is called, to prevent multi_done() to get
invoked twice when the multi interface is used. */
- BIT(stream_depends_e); /* set or don't set the Exclusive bit */
- BIT(previouslypending); /* this transfer WAS in the multi->pending queue */
- BIT(cookie_engine);
+ bit stream_depends_e:1; /* set or don't set the Exclusive bit */
};
@@ -1415,9 +1388,9 @@ struct DynamicStatic {
curl_easy_setopt(COOKIEFILE) calls */
struct curl_slist *resolve; /* set to point to the set.resolve list when
this should be dealt with in pretransfer */
- BIT(url_alloc); /* URL string is malloc()'ed */
- BIT(referer_alloc); /* referer string is malloc()ed */
- BIT(wildcard_resolve); /* Set to true if any resolve change is a
+ bit url_alloc:1; /* URL string is malloc()'ed */
+ bit referer_alloc:1; /* referer string is malloc()ed */
+ bit wildcard_resolve:1; /* Set to true if any resolve change is a
wildcard */
};
@@ -1488,7 +1461,7 @@ enum dupstring {
STRING_RTSP_SESSION_ID, /* Session ID to use */
STRING_RTSP_STREAM_URI, /* Stream URI for this request */
STRING_RTSP_TRANSPORT, /* Transport for this session */
-#ifdef USE_SSH
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */
STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
@@ -1514,10 +1487,6 @@ enum dupstring {
#ifdef USE_ALTSVC
STRING_ALTSVC, /* CURLOPT_ALTSVC */
#endif
- STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */
-#ifndef CURL_DISABLE_PROXY
- STRING_TEMP_URL, /* temp URL storage for proxy use */
-#endif
/* -- end of zero-terminated strings -- */
STRING_LASTZEROTERMINATED,
@@ -1597,8 +1566,6 @@ struct UserDefined {
long accepttimeout; /* in milliseconds, 0 means no timeout */
long happy_eyeballs_timeout; /* in milliseconds, 0 is a valid value */
long server_response_timeout; /* in milliseconds, 0 means no timeout */
- long maxage_conn; /* in seconds, max idle time to allow a connection that
- is to be reused */
long tftp_blksize; /* in bytes, 0 means use default */
curl_off_t filesize; /* size of file to upload, -1 means unknown */
long low_speed_limit; /* bytes/second */
@@ -1642,11 +1609,7 @@ struct UserDefined {
long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
0 - whatever, 1 - v2, 2 - v6 */
curl_off_t max_filesize; /* Maximum file size to download */
-#ifndef CURL_DISABLE_FTP
curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used */
- curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
- curl_ftpccc ftp_ccc; /* FTP CCC options */
-#endif
int ftp_create_missing_dirs; /* 1 - create directories that don't exist
2 - the same but also allow MKD to fail once
*/
@@ -1656,6 +1619,8 @@ struct UserDefined {
use_netrc; /* defined in include/curl.h */
curl_usessl use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
IMAP or POP3 or others! */
+ curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
+ curl_ftpccc ftp_ccc; /* FTP CCC options */
long new_file_perms; /* Permissions to use when creating remote files */
long new_directory_perms; /* Permissions to use when creating remote dirs */
long ssh_auth_types; /* allowed SSH auth types */
@@ -1697,88 +1662,90 @@ struct UserDefined {
CURLU *uh; /* URL handle for the current parsed URL */
void *trailer_data; /* pointer to pass to trailer data callback */
curl_trailer_callback trailer_callback; /* trailing data callback */
- BIT(is_fread_set); /* has read callback been set to non-NULL? */
- BIT(is_fwrite_set); /* has write callback been set to non-NULL? */
- BIT(free_referer); /* set TRUE if 'referer' points to a string we
+ bit is_fread_set:1; /* has read callback been set to non-NULL? */
+ bit is_fwrite_set:1; /* has write callback been set to non-NULL? */
+ bit free_referer:1; /* set TRUE if 'referer' points to a string we
allocated */
- BIT(tftp_no_options); /* do not send TFTP options requests */
- BIT(sep_headers); /* handle host and proxy headers separately */
- BIT(cookiesession); /* new cookie session? */
- BIT(crlf); /* convert crlf on ftp upload(?) */
- BIT(strip_path_slash); /* strip off initial slash from path */
- BIT(ssh_compression); /* enable SSH compression */
+ bit tftp_no_options:1; /* do not send TFTP options requests */
+ bit sep_headers:1; /* handle host and proxy headers separately */
+ bit cookiesession:1; /* new cookie session? */
+ bit crlf:1; /* convert crlf on ftp upload(?) */
+ bit strip_path_slash:1; /* strip off initial slash from path */
+ bit ssh_compression:1; /* enable SSH compression */
/* Here follows boolean settings that define how to behave during
this session. They are STATIC, set by libcurl users or at least initially
and they don't change during operations. */
- BIT(get_filetime); /* get the time and get of the remote file */
- BIT(tunnel_thru_httpproxy); /* use CONNECT through a HTTP proxy */
- BIT(prefer_ascii); /* ASCII rather than binary */
- BIT(ftp_append); /* append, not overwrite, on upload */
- BIT(ftp_list_only); /* switch FTP command for listing directories */
-#ifndef CURL_DISABLE_FTP
- BIT(ftp_use_port); /* use the FTP PORT command */
- BIT(ftp_use_epsv); /* if EPSV is to be attempted or not */
- BIT(ftp_use_eprt); /* if EPRT is to be attempted or not */
- BIT(ftp_use_pret); /* if PRET is to be used before PASV or not */
- BIT(ftp_skip_ip); /* skip the IP address the FTP server passes on to
+ bit get_filetime:1; /* get the time and get of the remote file */
+ bit tunnel_thru_httpproxy:1; /* use CONNECT through a HTTP proxy */
+ bit prefer_ascii:1; /* ASCII rather than binary */
+ bit ftp_append:1; /* append, not overwrite, on upload */
+ bit ftp_list_only:1; /* switch FTP command for listing directories */
+ bit ftp_use_port:1; /* use the FTP PORT command */
+ bit hide_progress:1; /* don't use the progress meter */
+ bit http_fail_on_error:1; /* fail on HTTP error codes >= 400 */
+ bit http_keep_sending_on_error:1; /* for HTTP status codes >= 300 */
+ bit http_follow_location:1; /* follow HTTP redirects */
+ bit http_transfer_encoding:1; /* request compressed HTTP
+ transfer-encoding */
+ bit allow_auth_to_other_hosts:1;
+ bit include_header:1; /* include received protocol headers in data output */
+ bit http_set_referer:1; /* is a custom referer used */
+ bit http_auto_referer:1; /* set "correct" referer when following
+ location: */
+ bit opt_no_body:1; /* as set with CURLOPT_NOBODY */
+ bit upload:1; /* upload request */
+ bit verbose:1; /* output verbosity */
+ bit krb:1; /* Kerberos connection requested */
+ bit reuse_forbid:1; /* forbidden to be reused, close after use */
+ bit reuse_fresh:1; /* do not re-use an existing connection */
+ bit ftp_use_epsv:1; /* if EPSV is to be attempted or not */
+ bit ftp_use_eprt:1; /* if EPRT is to be attempted or not */
+ bit ftp_use_pret:1; /* if PRET is to be used before PASV or not */
+
+ bit no_signal:1; /* do not use any signal/alarm handler */
+ bit global_dns_cache:1; /* subject for future removal */
+ bit tcp_nodelay:1; /* whether to enable TCP_NODELAY or not */
+ bit ignorecl:1; /* ignore content length */
+ bit ftp_skip_ip:1; /* skip the IP address the FTP server passes on to
us */
-#endif
- BIT(hide_progress); /* don't use the progress meter */
- BIT(http_fail_on_error); /* fail on HTTP error codes >= 400 */
- BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */
- BIT(http_follow_location); /* follow HTTP redirects */
- BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */
- BIT(allow_auth_to_other_hosts);
- BIT(include_header); /* include received protocol headers in data output */
- BIT(http_set_referer); /* is a custom referer used */
- BIT(http_auto_referer); /* set "correct" referer when following
- location: */
- BIT(opt_no_body); /* as set with CURLOPT_NOBODY */
- BIT(upload); /* upload request */
- BIT(verbose); /* output verbosity */
- BIT(krb); /* Kerberos connection requested */
- BIT(reuse_forbid); /* forbidden to be reused, close after use */
- BIT(reuse_fresh); /* do not re-use an existing connection */
- BIT(no_signal); /* do not use any signal/alarm handler */
- BIT(tcp_nodelay); /* whether to enable TCP_NODELAY or not */
- BIT(ignorecl); /* ignore content length */
- BIT(connect_only); /* make connection, let application use the socket */
- BIT(http_te_skip); /* pass the raw body data to the user, even when
- transfer-encoded (chunked, compressed) */
- BIT(http_ce_skip); /* pass the raw body data to the user, even when
- content-encoded (chunked, compressed) */
- BIT(proxy_transfer_mode); /* set transfer mode (;type=<a|i>) when doing
- FTP via an HTTP proxy */
+ bit connect_only:1; /* make connection, let application use the socket */
+ bit http_te_skip:1; /* pass the raw body data to the user, even when
+ transfer-encoded (chunked, compressed) */
+ bit http_ce_skip:1; /* pass the raw body data to the user, even when
+ content-encoded (chunked, compressed) */
+ bit proxy_transfer_mode:1; /* set transfer mode (;type=<a|i>) when doing
+ FTP via an HTTP proxy */
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- BIT(socks5_gssapi_nec); /* Flag to support NEC SOCKS5 server */
+ bit socks5_gssapi_nec:1; /* Flag to support NEC SOCKS5 server */
#endif
- BIT(sasl_ir); /* Enable/disable SASL initial response */
- BIT(wildcard_enabled); /* enable wildcard matching */
- BIT(tcp_keepalive); /* use TCP keepalives */
- BIT(tcp_fastopen); /* use TCP Fast Open */
- BIT(ssl_enable_npn); /* TLS NPN extension? */
- BIT(ssl_enable_alpn);/* TLS ALPN extension? */
- BIT(path_as_is); /* allow dotdots? */
- BIT(pipewait); /* wait for multiplex status before starting a new
- connection */
- BIT(suppress_connect_headers); /* suppress proxy CONNECT response headers
- from user callbacks */
- BIT(dns_shuffle_addresses); /* whether to shuffle addresses before use */
- BIT(stream_depends_e); /* set or don't set the Exclusive bit */
- BIT(haproxyprotocol); /* whether to send HAProxy PROXY protocol v1
- header */
- BIT(abstract_unix_socket);
- BIT(disallow_username_in_url); /* disallow username in url */
- BIT(doh); /* DNS-over-HTTPS enabled */
- BIT(doh_get); /* use GET for DoH requests, instead of POST */
- BIT(http09_allowed); /* allow HTTP/0.9 responses */
+ bit sasl_ir:1; /* Enable/disable SASL initial response */
+ bit wildcard_enabled:1; /* enable wildcard matching */
+ bit tcp_keepalive:1; /* use TCP keepalives */
+ bit tcp_fastopen:1; /* use TCP Fast Open */
+ bit ssl_enable_npn:1; /* TLS NPN extension? */
+ bit ssl_enable_alpn:1;/* TLS ALPN extension? */
+ bit path_as_is:1; /* allow dotdots? */
+ bit pipewait:1; /* wait for pipe/multiplex status before starting a
+ new connection */
+ bit suppress_connect_headers:1; /* suppress proxy CONNECT response headers
+ from user callbacks */
+ bit dns_shuffle_addresses:1; /* whether to shuffle addresses before use */
+ bit stream_depends_e:1; /* set or don't set the Exclusive bit */
+ bit haproxyprotocol:1; /* whether to send HAProxy PROXY protocol v1
+ header */
+ bit abstract_unix_socket:1;
+ bit disallow_username_in_url:1; /* disallow username in url */
+ bit doh:1; /* DNS-over-HTTPS enabled */
+ bit doh_get:1; /* use GET for DoH requests, instead of POST */
+ bit http09_allowed:1; /* allow HTTP/0.9 responses */
};
struct Names {
struct curl_hash *hostcache;
enum {
HCACHE_NONE, /* not pointing to anything */
+ HCACHE_GLOBAL, /* points to the (shrug) global one */
HCACHE_MULTI, /* points to a shared one in the multi handle */
HCACHE_SHARED /* points to a shared one in a shared object */
} hostcachetype;
@@ -1801,7 +1768,8 @@ struct Curl_easy {
struct connectdata *conn;
struct curl_llist_element connect_queue;
- struct curl_llist_element conn_queue; /* list per connectdata */
+ struct curl_llist_element pipeline_queue;
+ struct curl_llist_element sh_queue; /* list per Curl_sh_entry */
CURLMstate mstate; /* the handle's state */
CURLcode result; /* previous result */
@@ -1841,9 +1809,7 @@ struct Curl_easy {
struct Progress progress; /* for all the progress meter data */
struct UrlState state; /* struct for fields used for state info and
other dynamic purposes */
-#ifndef CURL_DISABLE_FTP
struct WildcardData wildcard; /* wildcard download state info */
-#endif
struct PureInfo info; /* stats, reports and info data */
struct curl_tlssessioninfo tsi; /* Information about the TLS session, only
valid after a client has asked for it */
diff --git a/lib/vauth/cleartext.c b/lib/vauth/cleartext.c
index 6f452c169..be6d6111e 100644
--- a/lib/vauth/cleartext.c
+++ b/lib/vauth/cleartext.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,9 +25,6 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) || \
- !defined(CURL_DISABLE_POP3)
-
#include <curl/curl.h>
#include "urldata.h"
@@ -52,9 +49,8 @@
* Parameters:
*
* data [in] - The session handle.
- * authzid [in] - The authorization identity.
- * authcid [in] - The authentication identity.
- * passwd [in] - The password.
+ * userp [in] - The user name.
+ * passwdp [in] - The user's password.
* outptr [in/out] - The address where a pointer to newly allocated memory
* holding the result will be stored upon completion.
* outlen [out] - The length of the output message.
@@ -62,40 +58,36 @@
* Returns CURLE_OK on success.
*/
CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
- const char *authzid,
- const char *authcid,
- const char *passwd,
+ const char *userp,
+ const char *passwdp,
char **outptr, size_t *outlen)
{
CURLcode result;
char *plainauth;
- size_t zlen;
- size_t clen;
+ size_t ulen;
size_t plen;
size_t plainlen;
*outlen = 0;
*outptr = NULL;
- zlen = (authzid == NULL ? 0 : strlen(authzid));
- clen = strlen(authcid);
- plen = strlen(passwd);
+ ulen = strlen(userp);
+ plen = strlen(passwdp);
/* Compute binary message length. Check for overflows. */
- if(((zlen + clen) > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
+ if((ulen > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
return CURLE_OUT_OF_MEMORY;
- plainlen = zlen + clen + plen + 2;
+ plainlen = 2 * ulen + plen + 2;
plainauth = malloc(plainlen);
if(!plainauth)
return CURLE_OUT_OF_MEMORY;
/* Calculate the reply */
- if(zlen != 0)
- memcpy(plainauth, authzid, zlen);
- plainauth[zlen] = '\0';
- memcpy(plainauth + zlen + 1, authcid, clen);
- plainauth[zlen + clen + 1] = '\0';
- memcpy(plainauth + zlen + clen + 2, passwd, plen);
+ memcpy(plainauth, userp, ulen);
+ plainauth[ulen] = '\0';
+ memcpy(plainauth + ulen + 1, userp, ulen);
+ plainauth[2 * ulen + 1] = '\0';
+ memcpy(plainauth + 2 * ulen + 2, passwdp, plen);
/* Base64 encode the reply */
result = Curl_base64_encode(data, plainauth, plainlen, outptr, outlen);
@@ -165,5 +157,3 @@ CURLcode Curl_auth_create_external_message(struct Curl_easy *data,
/* This is the same formatting as the login message */
return Curl_auth_create_login_message(data, user, outptr, outlen);
}
-
-#endif /* if no users */
diff --git a/lib/vauth/digest.c b/lib/vauth/digest.c
index 8cd4d83ed..0f2e6509e 100644
--- a/lib/vauth/digest.c
+++ b/lib/vauth/digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -357,6 +357,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
const char *service,
char **outptr, size_t *outlen)
{
+ CURLcode result = CURLE_OK;
size_t i;
MD5_context *ctxt;
char *response = NULL;
@@ -376,12 +377,10 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
char *spn = NULL;
/* Decode the challenge message */
- CURLcode result = auth_decode_digest_md5_message(chlg64, nonce,
- sizeof(nonce), realm,
- sizeof(realm), algorithm,
- sizeof(algorithm),
- qop_options,
- sizeof(qop_options));
+ result = auth_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
+ realm, sizeof(realm),
+ algorithm, sizeof(algorithm),
+ qop_options, sizeof(qop_options));
if(result)
return result;
@@ -786,7 +785,8 @@ static CURLcode _Curl_auth_create_digest_http_message(
return CURLE_OUT_OF_MEMORY;
if(digest->qop && strcasecompare(digest->qop, "auth-int")) {
- /* We don't support auth-int for PUT or POST */
+ /* We don't support auth-int for PUT or POST at the moment.
+ TODO: replace hash of empty string with entity-body for PUT/POST */
char hashed[65];
unsigned char *hashthis2;
diff --git a/lib/vauth/digest_sspi.c b/lib/vauth/digest_sspi.c
index a1090568b..fe8093e8b 100644
--- a/lib/vauth/digest_sspi.c
+++ b/lib/vauth/digest_sspi.c
@@ -61,11 +61,6 @@ bool Curl_auth_is_digest_supported(void)
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
&SecurityPackage);
- /* Release the package buffer as it is not required anymore */
- if(status == SEC_E_OK) {
- s_pSecFn->FreeContextBuffer(SecurityPackage);
- }
-
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -225,10 +220,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
free(output_token);
free(input_token);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
/* Base64 encode the response */
@@ -615,10 +607,7 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
Curl_safefree(digest->http_context);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
output_token_len = resp_buf.cbBuffer;
diff --git a/lib/vauth/krb5_gssapi.c b/lib/vauth/krb5_gssapi.c
index 95bab0e2e..55daec1ff 100644
--- a/lib/vauth/krb5_gssapi.c
+++ b/lib/vauth/krb5_gssapi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
* Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
@@ -121,7 +121,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
free(spn);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
free(spn);
@@ -168,7 +168,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
major_status, minor_status);
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
if(output_token.value && output_token.length) {
@@ -252,7 +252,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(chlg);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Convert the username from internal format to a displayable token */
@@ -264,7 +264,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(chlg);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Setup the challenge "input" security buffer */
@@ -355,7 +355,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(message);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Base64 encode the response */
@@ -372,7 +372,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
}
/*
- * Curl_auth_cleanup_gssapi()
+ * Curl_auth_gssapi_cleanup()
*
* This is used to clean up the GSSAPI (Kerberos V5) specific data.
*
@@ -381,7 +381,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
* krb5 [in/out] - The Kerberos 5 data struct being cleaned up.
*
*/
-void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5)
+void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5)
{
OM_uint32 minor_status;
diff --git a/lib/vauth/krb5_sspi.c b/lib/vauth/krb5_sspi.c
index 98041d915..cb11ed901 100644
--- a/lib/vauth/krb5_sspi.c
+++ b/lib/vauth/krb5_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -58,11 +58,6 @@ bool Curl_auth_is_gssapi_supported(void)
TEXT(SP_NAME_KERBEROS),
&SecurityPackage);
- /* Release the package buffer as it is not required anymore */
- if(status == SEC_E_OK) {
- s_pSecFn->FreeContextBuffer(SecurityPackage);
- }
-
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -222,12 +217,8 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
/* Free the decoded challenge as it is not required anymore */
free(chlg);
- if(status == SEC_E_INSUFFICIENT_MEMORY) {
- return CURLE_OUT_OF_MEMORY;
- }
-
if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
if(memcmp(&context, krb5->context, sizeof(context))) {
@@ -318,10 +309,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
if(status != SEC_E_OK) {
free(chlg);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Get the fully qualified username back from the context */
@@ -331,10 +319,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
if(status != SEC_E_OK) {
free(chlg);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
/* Setup the "input" security buffer */
@@ -453,10 +438,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
free(message);
free(trailer);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Allocate the encryption (wrap) buffer */
@@ -492,7 +474,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
}
/*
- * Curl_auth_cleanup_gssapi()
+ * Curl_auth_gssapi_cleanup()
*
* This is used to clean up the GSSAPI (Kerberos V5) specific data.
*
@@ -501,7 +483,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
* krb5 [in/out] - The Kerberos 5 data struct being cleaned up.
*
*/
-void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5)
+void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5)
{
/* Free our security context */
if(krb5->context) {
diff --git a/lib/vauth/ntlm.c b/lib/vauth/ntlm.c
index 047c2b5a3..6a8fc5ab3 100644
--- a/lib/vauth/ntlm.c
+++ b/lib/vauth/ntlm.c
@@ -403,7 +403,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
(void)hostname,
/* Clean up any former leftovers and initialise to defaults */
- Curl_auth_cleanup_ntlm(ntlm);
+ Curl_auth_ntlm_cleanup(ntlm);
#if defined(USE_NTRESPONSES) && defined(USE_NTLM2SESSION)
#define NTLM2FLAG NTLMFLAG_NEGOTIATE_NTLM2_KEY
@@ -844,22 +844,22 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
/* Return with binary blob encoded into base64 */
result = Curl_base64_encode(data, (char *)ntlmbuf, size, outptr, outlen);
- Curl_auth_cleanup_ntlm(ntlm);
+ Curl_auth_ntlm_cleanup(ntlm);
return result;
}
/*
- * Curl_auth_cleanup_ntlm()
- *
- * This is used to clean up the NTLM specific data.
- *
- * Parameters:
- *
- * ntlm [in/out] - The NTLM data struct being cleaned up.
- *
- */
-void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm)
+* Curl_auth_ntlm_cleanup()
+*
+* This is used to clean up the NTLM specific data.
+*
+* Parameters:
+*
+* ntlm [in/out] - The NTLM data struct being cleaned up.
+*
+*/
+void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm)
{
/* Free the target info */
Curl_safefree(ntlm->target_info);
diff --git a/lib/vauth/ntlm_sspi.c b/lib/vauth/ntlm_sspi.c
index cd6cb79c1..67112820e 100644
--- a/lib/vauth/ntlm_sspi.c
+++ b/lib/vauth/ntlm_sspi.c
@@ -56,11 +56,6 @@ bool Curl_auth_is_ntlm_supported(void)
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
&SecurityPackage);
- /* Release the package buffer as it is not required anymore */
- if(status == SEC_E_OK) {
- s_pSecFn->FreeContextBuffer(SecurityPackage);
- }
-
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -100,7 +95,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */
/* Clean up any former leftovers and initialise to defaults */
- Curl_auth_cleanup_ntlm(ntlm);
+ Curl_auth_ntlm_cleanup(ntlm);
/* Query the security package for NTLM */
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
@@ -174,10 +169,8 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
if(status == SEC_I_COMPLETE_NEEDED ||
status == SEC_I_COMPLETE_AND_CONTINUE)
s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);
- else if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED)
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
/* Base64 encode the response */
return Curl_base64_encode(data, (char *) ntlm->output_token,
@@ -323,23 +316,20 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
infof(data, "NTLM handshake failure (type-3 message): Status=%x\n",
status);
- if(status == SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
/* Base64 encode the response */
result = Curl_base64_encode(data, (char *) ntlm->output_token,
type_3_buf.cbBuffer, outptr, outlen);
- Curl_auth_cleanup_ntlm(ntlm);
+ Curl_auth_ntlm_cleanup(ntlm);
return result;
}
/*
- * Curl_auth_cleanup_ntlm()
+ * Curl_auth_ntlm_cleanup()
*
* This is used to clean up the NTLM specific data.
*
@@ -348,7 +338,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
* ntlm [in/out] - The NTLM data struct being cleaned up.
*
*/
-void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm)
+void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm)
{
/* Free our security context */
if(ntlm->context) {
diff --git a/lib/vauth/oauth2.c b/lib/vauth/oauth2.c
index b4e9f8e70..6288f89a3 100644
--- a/lib/vauth/oauth2.c
+++ b/lib/vauth/oauth2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,9 +24,6 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) || \
- !defined(CURL_DISABLE_POP3)
-
#include <curl/curl.h>
#include "urldata.h"
@@ -49,8 +46,8 @@
*
* data[in] - The session handle.
* user[in] - The user name.
- * host[in] - The host name.
- * port[in] - The port(when not Port 80).
+ * host[in] - The host name(for OAUTHBEARER).
+ * port[in] - The port(for OAUTHBEARER when not Port 80).
* bearer[in] - The bearer token.
* outptr[in / out] - The address where a pointer to newly allocated memory
* holding the result will be stored upon completion.
@@ -69,11 +66,13 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
char *oauth = NULL;
/* Generate the message */
- if(port == 0 || port == 80)
- oauth = aprintf("n,a=%s,\1host=%s\1auth=Bearer %s\1\1", user, host,
+ if(host == NULL && (port == 0 || port == 80))
+ oauth = aprintf("user=%s\1auth=Bearer %s\1\1", user, bearer);
+ else if(port == 0 || port == 80)
+ oauth = aprintf("user=%s\1host=%s\1auth=Bearer %s\1\1", user, host,
bearer);
else
- oauth = aprintf("n,a=%s,\1host=%s\1port=%ld\1auth=Bearer %s\1\1", user,
+ oauth = aprintf("user=%s\1host=%s\1port=%ld\1auth=Bearer %s\1\1", user,
host, port, bearer);
if(!oauth)
return CURLE_OUT_OF_MEMORY;
@@ -85,42 +84,3 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
return result;
}
-
-/*
- * Curl_auth_create_xoauth_bearer_message()
- *
- * This is used to generate an already encoded XOAuth 2.0 message ready for
- * sending to the recipient.
- *
- * Parameters:
- *
- * data[in] - The session handle.
- * user[in] - The user name.
- * bearer[in] - The bearer token.
- * outptr[in / out] - The address where a pointer to newly allocated memory
- * holding the result will be stored upon completion.
- * outlen[out] - The length of the output message.
- *
- * Returns CURLE_OK on success.
- */
-CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_easy *data,
- const char *user,
- const char *bearer,
- char **outptr, size_t *outlen)
-{
- CURLcode result = CURLE_OK;
-
- /* Generate the message */
- char *xoauth = aprintf("user=%s\1auth=Bearer %s\1\1", user, bearer);
- if(!xoauth)
- return CURLE_OUT_OF_MEMORY;
-
- /* Base64 encode the reply */
- result = Curl_base64_encode(data, xoauth, strlen(xoauth), outptr, outlen);
-
- free(xoauth);
-
- return result;
-}
-#endif /* disabled, no users */
-
diff --git a/lib/vauth/spnego_gssapi.c b/lib/vauth/spnego_gssapi.c
index ed7ce029e..7c4bd4b59 100644
--- a/lib/vauth/spnego_gssapi.c
+++ b/lib/vauth/spnego_gssapi.c
@@ -97,7 +97,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
/* We finished successfully our part of authentication, but server
* rejected it (since we're again here). Exit with an error since we
* can't invent anything better */
- Curl_auth_cleanup_spnego(nego);
+ Curl_auth_spnego_cleanup(nego);
return CURLE_LOGIN_DENIED;
}
@@ -121,7 +121,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
free(spn);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
free(spn);
@@ -170,14 +170,14 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
major_status, minor_status);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
if(!output_token.value || !output_token.length) {
if(output_token.value)
gss_release_buffer(&unused_status, &output_token);
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
/* Free previous token */
@@ -238,7 +238,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
}
/*
- * Curl_auth_cleanup_spnego()
+ * Curl_auth_spnego_cleanup()
*
* This is used to clean up the SPNEGO (Negotiate) specific data.
*
@@ -247,7 +247,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
* nego [in/out] - The Negotiate data struct being cleaned up.
*
*/
-void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
+void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
{
OM_uint32 minor_status;
@@ -273,6 +273,7 @@ void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
/* Reset any variables */
nego->status = 0;
+ nego->state = GSS_AUTHNONE;
nego->noauthpersist = FALSE;
nego->havenoauthpersist = FALSE;
nego->havenegdata = FALSE;
diff --git a/lib/vauth/spnego_sspi.c b/lib/vauth/spnego_sspi.c
index b9c2cf7d6..0171ec52b 100644
--- a/lib/vauth/spnego_sspi.c
+++ b/lib/vauth/spnego_sspi.c
@@ -59,12 +59,6 @@ bool Curl_auth_is_spnego_supported(void)
TEXT(SP_NAME_NEGOTIATE),
&SecurityPackage);
- /* Release the package buffer as it is not required anymore */
- if(status == SEC_E_OK) {
- s_pSecFn->FreeContextBuffer(SecurityPackage);
- }
-
-
return (status == SEC_E_OK ? TRUE : FALSE);
}
@@ -113,7 +107,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
/* We finished successfully our part of authentication, but server
* rejected it (since we're again here). Exit with an error since we
* can't invent anything better */
- Curl_auth_cleanup_spnego(nego);
+ Curl_auth_spnego_cleanup(nego);
return CURLE_LOGIN_DENIED;
}
@@ -171,7 +165,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
nego->p_identity, NULL, NULL,
nego->credentials, &expiry);
if(nego->status != SEC_E_OK)
- return CURLE_AUTH_ERROR;
+ return CURLE_LOGIN_DENIED;
/* Allocate our new context handle */
nego->context = calloc(1, sizeof(CtxtHandle));
@@ -257,25 +251,14 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
char buffer[STRERROR_LEN];
failf(data, "InitializeSecurityContext failed: %s",
Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
-
- if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_OUT_OF_MEMORY;
}
if(nego->status == SEC_I_COMPLETE_NEEDED ||
nego->status == SEC_I_COMPLETE_AND_CONTINUE) {
nego->status = s_pSecFn->CompleteAuthToken(nego->context, &resp_desc);
if(GSS_ERROR(nego->status)) {
- char buffer[STRERROR_LEN];
- failf(data, "CompleteAuthToken failed: %s",
- Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
-
- if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
- return CURLE_OUT_OF_MEMORY;
-
- return CURLE_AUTH_ERROR;
+ return CURLE_RECV_ERROR;
}
}
@@ -324,7 +307,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
}
/*
- * Curl_auth_cleanup_spnego()
+ * Curl_auth_spnego_cleanup()
*
* This is used to clean up the SPNEGO (Negotiate) specific data.
*
@@ -333,7 +316,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
* nego [in/out] - The Negotiate data struct being cleaned up.
*
*/
-void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
+void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
{
/* Free our security context */
if(nego->context) {
@@ -360,6 +343,7 @@ void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
/* Reset any variables */
nego->status = 0;
nego->token_max = 0;
+ nego->state = GSS_AUTHNONE;
nego->noauthpersist = FALSE;
nego->havenoauthpersist = FALSE;
nego->havenegdata = FALSE;
diff --git a/lib/vauth/vauth.c b/lib/vauth/vauth.c
index a9c5c9c4f..502d443ab 100644
--- a/lib/vauth/vauth.c
+++ b/lib/vauth/vauth.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -105,26 +105,26 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
#endif /* USE_WINDOWS_SSPI */
/*
- * Curl_auth_user_contains_domain()
- *
- * This is used to test if the specified user contains a Windows domain name as
- * follows:
- *
- * Domain\User (Down-level Logon Name)
- * Domain/User (curl Down-level format - for compatibility with existing code)
- * User@Domain (User Principal Name)
- *
- * Note: The user name may be empty when using a GSS-API library or Windows
- * SSPI as the user and domain are either obtained from the credentials cache
- * when using GSS-API or via the currently logged in user's credentials when
- * using Windows SSPI.
- *
- * Parameters:
- *
- * user [in] - The user name.
- *
- * Returns TRUE on success; otherwise FALSE.
- */
+* Curl_auth_user_contains_domain()
+*
+* This is used to test if the specified user contains a Windows domain name as
+* follows:
+*
+* User\Domain (Down-level Logon Name)
+* User/Domain (curl Down-level format - for compatibility with existing code)
+* User@Domain (User Principal Name)
+*
+* Note: The user name may be empty when using a GSS-API library or Windows SSPI
+* as the user and domain are either obtained from the credentials cache when
+* using GSS-API or via the currently logged in user's credentials when using
+* Windows SSPI.
+*
+* Parameters:
+*
+* user [in] - The user name.
+*
+* Returns TRUE on success; otherwise FALSE.
+*/
bool Curl_auth_user_contains_domain(const char *user)
{
bool valid = FALSE;
diff --git a/lib/vauth/vauth.h b/lib/vauth/vauth.h
index a1a557d2a..f43064211 100644
--- a/lib/vauth/vauth.h
+++ b/lib/vauth/vauth.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@ struct negotiatedata;
#endif
#if defined(USE_WINDOWS_SSPI)
-#define GSS_ERROR(status) ((status) & 0x80000000)
+#define GSS_ERROR(status) (status & 0x80000000)
#endif
/* This is used to build a SPN string */
@@ -60,9 +60,8 @@ bool Curl_auth_user_contains_domain(const char *user);
/* This is used to generate a base64 encoded PLAIN cleartext message */
CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
- const char *authzid,
- const char *authcid,
- const char *passwd,
+ const char *userp,
+ const char *passwdp,
char **outptr, size_t *outlen);
/* This is used to generate a base64 encoded LOGIN cleartext message */
@@ -142,7 +141,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
char **outptr, size_t *outlen);
/* This is used to clean up the NTLM specific data */
-void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm);
+void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm);
#endif /* USE_NTLM */
/* This is used to generate a base64 encoded OAuth 2.0 message */
@@ -152,13 +151,6 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
const long port,
const char *bearer,
char **outptr, size_t *outlen);
-
-/* This is used to generate a base64 encoded XOAuth 2.0 message */
-CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_easy *data,
- const char *user,
- const char *bearer,
- char **outptr, size_t *outlen);
-
#if defined(USE_KERBEROS5)
/* This is used to evaluate if GSSAPI (Kerberos V5) is supported */
bool Curl_auth_is_gssapi_supported(void);
@@ -184,7 +176,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
size_t *outlen);
/* This is used to clean up the GSSAPI specific data */
-void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5);
+void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5);
#endif /* USE_KERBEROS5 */
#if defined(USE_SPNEGO)
@@ -208,7 +200,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
char **outptr, size_t *outlen);
/* This is used to clean up the SPNEGO specifiec data */
-void Curl_auth_cleanup_spnego(struct negotiatedata *nego);
+void Curl_auth_spnego_cleanup(struct negotiatedata *nego);
#endif /* USE_SPNEGO */
diff --git a/lib/version.c b/lib/version.c
index cfd09e36d..9369ae8e3 100644
--- a/lib/version.c
+++ b/lib/version.c
@@ -27,12 +27,11 @@
#include "vtls/vtls.h"
#include "http2.h"
#include "ssh.h"
-#include "quic.h"
#include "curl_printf.h"
#ifdef USE_ARES
# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+ (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__))
# define CARES_STATICLIB
# endif
# include <ares.h>
@@ -54,6 +53,18 @@
#include <librtmp/rtmp.h>
#endif
+#ifdef USE_LIBSSH2
+#include <libssh2.h>
+#endif
+
+#ifdef HAVE_LIBSSH2_VERSION
+/* get it run-time if possible */
+#define CURL_LIBSSH2_VERSION libssh2_version(0)
+#else
+/* use build-time if run-time not possible */
+#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
+#endif
+
#ifdef HAVE_ZLIB_H
#include <zlib.h>
#ifdef __SYMBIAN32__
@@ -91,7 +102,7 @@ static size_t brotli_version(char *buf, size_t bufsz)
char *curl_version(void)
{
static bool initialized;
- static char version[250];
+ static char version[200];
char *ptr = version;
size_t len;
size_t left = sizeof(version);
@@ -104,12 +115,14 @@ char *curl_version(void)
left -= len;
ptr += len;
- len = Curl_ssl_version(ptr + 1, left - 1);
+ if(left > 1) {
+ len = Curl_ssl_version(ptr + 1, left - 1);
- if(len > 0) {
- *ptr = ' ';
- left -= ++len;
- ptr += len;
+ if(len > 0) {
+ *ptr = ' ';
+ left -= ++len;
+ ptr += len;
+ }
}
#ifdef HAVE_LIBZ
@@ -159,22 +172,18 @@ char *curl_version(void)
left -= len;
ptr += len;
#endif
-#ifdef USE_SSH
- if(left) {
- *ptr++=' ';
- left--;
- }
- len = Curl_ssh_version(ptr, left);
+#ifdef USE_LIBSSH2
+ len = msnprintf(ptr, left, " libssh2/%s", CURL_LIBSSH2_VERSION);
left -= len;
ptr += len;
#endif
-#ifdef USE_NGHTTP2
- len = Curl_http2_ver(ptr, left);
+#ifdef USE_LIBSSH
+ len = msnprintf(ptr, left, " libssh/%s", CURL_LIBSSH_VERSION);
left -= len;
ptr += len;
#endif
-#ifdef ENABLE_QUIC
- len = Curl_quic_ver(ptr, left);
+#ifdef USE_NGHTTP2
+ len = Curl_http2_ver(ptr, left);
left -= len;
ptr += len;
#endif
@@ -265,7 +274,7 @@ static const char * const protocols[] = {
#ifndef CURL_DISABLE_RTSP
"rtsp",
#endif
-#if defined(USE_SSH)
+#if defined(USE_LIBSSH) || defined(USE_LIBSSH2)
"scp",
"sftp",
#endif
@@ -349,9 +358,6 @@ static curl_version_info_data version_info = {
#if defined(USE_NGHTTP2)
| CURL_VERSION_HTTP2
#endif
-#if defined(ENABLE_QUIC)
- | CURL_VERSION_HTTP3
-#endif
#if defined(USE_UNIX_SOCKETS)
| CURL_VERSION_UNIX_SOCKETS
#endif
@@ -367,9 +373,6 @@ static curl_version_info_data version_info = {
#if defined(USE_ALTSVC)
| CURL_VERSION_ALTSVC
#endif
-#ifdef USE_ESNI
- | CURL_VERSION_ESNI
-#endif
,
NULL, /* ssl_version */
0, /* ssl_version_num, this is kept at zero */
@@ -382,24 +385,17 @@ static curl_version_info_data version_info = {
NULL, /* ssh lib version */
0, /* brotli_ver_num */
NULL, /* brotli version */
- 0, /* nghttp2 version number */
- NULL, /* nghttp2 version string */
- NULL /* quic library string */
};
curl_version_info_data *curl_version_info(CURLversion stamp)
{
static bool initialized;
-#if defined(USE_SSH)
+#if defined(USE_LIBSSH) || defined(USE_LIBSSH2)
static char ssh_buffer[80];
#endif
#ifdef USE_SSL
-#ifdef CURL_WITH_MULTI_SSL
- static char ssl_buffer[200];
-#else
static char ssl_buffer[80];
#endif
-#endif
#ifdef HAVE_BROTLI
static char brotli_buffer[80];
#endif
@@ -446,8 +442,11 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#endif /* _LIBICONV_VERSION */
#endif
-#if defined(USE_SSH)
- Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));
+#if defined(USE_LIBSSH2)
+ msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh2/%s", LIBSSH2_VERSION);
+ version_info.libssh_version = ssh_buffer;
+#elif defined(USE_LIBSSH)
+ msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh/%s", CURL_LIBSSH_VERSION);
version_info.libssh_version = ssh_buffer;
#endif
@@ -457,22 +456,6 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
version_info.brotli_version = brotli_buffer;
#endif
-#ifdef USE_NGHTTP2
- {
- nghttp2_info *h2 = nghttp2_version(0);
- version_info.nghttp2_ver_num = h2->version_num;
- version_info.nghttp2_version = h2->version_str;
- }
-#endif
-
-#ifdef ENABLE_QUIC
- {
- static char quicbuffer[80];
- Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
- version_info.quic_version = quicbuffer;
- }
-#endif
-
(void)stamp; /* avoid compiler warnings, we don't use this */
initialized = true;
diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c
deleted file mode 100644
index c0f9b16e3..000000000
--- a/lib/vquic/ngtcp2.c
+++ /dev/null
@@ -1,1593 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#ifdef USE_NGTCP2
-#include <ngtcp2/ngtcp2.h>
-#include <ngtcp2/ngtcp2_crypto.h>
-#include <nghttp3/nghttp3.h>
-#include <openssl/err.h>
-#include "urldata.h"
-#include "sendf.h"
-#include "strdup.h"
-#include "rand.h"
-#include "ngtcp2.h"
-#include "multiif.h"
-#include "strcase.h"
-#include "connect.h"
-#include "strerror.h"
-
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
-#include "memdebug.h"
-
-/* #define DEBUG_NGTCP2 */
-#ifdef CURLDEBUG
-#define DEBUG_HTTP3
-#endif
-#ifdef DEBUG_HTTP3
-#define H3BUGF(x) x
-#else
-#define H3BUGF(x) do { } WHILE_FALSE
-#endif
-
-/*
- * This holds outgoing HTTP/3 stream data that is used by nghttp3 until acked.
- * It is used as a circular buffer. Add new bytes at the end until it reaches
- * the far end, then start over at index 0 again.
- */
-
-#define H3_SEND_SIZE (20*1024)
-struct h3out {
- uint8_t buf[H3_SEND_SIZE];
- size_t used; /* number of bytes used in the buffer */
- size_t windex; /* index in the buffer where to start writing the next
- data block */
-};
-
-#define QUIC_MAX_STREAMS (256*1024)
-#define QUIC_MAX_DATA (1*1024*1024)
-#define QUIC_IDLE_TIMEOUT 60000 /* milliseconds */
-#define QUIC_CIPHERS \
- "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_" \
- "POLY1305_SHA256:TLS_AES_128_CCM_SHA256"
-#define QUIC_GROUPS "P-256:X25519:P-384:P-521"
-
-static CURLcode ng_process_ingress(struct connectdata *conn,
- curl_socket_t sockfd,
- struct quicsocket *qs);
-static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
- struct quicsocket *qs);
-static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
- size_t datalen, void *user_data,
- void *stream_user_data);
-
-static ngtcp2_tstamp timestamp(void)
-{
- struct curltime ct = Curl_now();
- return ct.tv_sec * NGTCP2_SECONDS + ct.tv_usec * NGTCP2_MICROSECONDS;
-}
-
-#ifdef DEBUG_NGTCP2
-static void quic_printf(void *user_data, const char *fmt, ...)
-{
- va_list ap;
- (void)user_data; /* TODO, use this to do infof() instead long-term */
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
-}
-#endif
-
-static ngtcp2_crypto_level
-quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
-{
- switch(ossl_level) {
- case ssl_encryption_initial:
- return NGTCP2_CRYPTO_LEVEL_INITIAL;
- case ssl_encryption_early_data:
- return NGTCP2_CRYPTO_LEVEL_EARLY;
- case ssl_encryption_handshake:
- return NGTCP2_CRYPTO_LEVEL_HANDSHAKE;
- case ssl_encryption_application:
- return NGTCP2_CRYPTO_LEVEL_APP;
- default:
- assert(0);
- }
-}
-
-static int setup_initial_crypto_context(struct quicsocket *qs)
-{
- const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(qs->qconn);
-
- if(ngtcp2_crypto_derive_and_install_initial_key(
- qs->qconn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, dcid,
- NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
- return -1;
-
- return 0;
-}
-
-static void quic_settings(ngtcp2_settings *s,
- uint64_t stream_buffer_size)
-{
- ngtcp2_settings_default(s);
-#ifdef DEBUG_NGTCP2
- s->log_printf = quic_printf;
-#else
- s->log_printf = NULL;
-#endif
- s->initial_ts = timestamp();
- s->transport_params.initial_max_stream_data_bidi_local = stream_buffer_size;
- s->transport_params.initial_max_stream_data_bidi_remote = QUIC_MAX_STREAMS;
- s->transport_params.initial_max_stream_data_uni = QUIC_MAX_STREAMS;
- s->transport_params.initial_max_data = QUIC_MAX_DATA;
- s->transport_params.initial_max_streams_bidi = 1;
- s->transport_params.initial_max_streams_uni = 3;
- s->transport_params.idle_timeout = QUIC_IDLE_TIMEOUT;
-}
-
-static FILE *keylog_file; /* not thread-safe */
-static void keylog_callback(const SSL *ssl, const char *line)
-{
- (void)ssl;
- fputs(line, keylog_file);
- fputc('\n', keylog_file);
- fflush(keylog_file);
-}
-
-static int init_ngh3_conn(struct quicsocket *qs);
-
-static int quic_set_encryption_secrets(SSL *ssl,
- OSSL_ENCRYPTION_LEVEL ossl_level,
- const uint8_t *rx_secret,
- const uint8_t *tx_secret,
- size_t secretlen)
-{
- struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
- int level = quic_from_ossl_level(ossl_level);
-
- if(ngtcp2_crypto_derive_and_install_key(
- qs->qconn, ssl, NULL, NULL, NULL, NULL, NULL, NULL, level, rx_secret,
- tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
- return 0;
-
- if(level == NGTCP2_CRYPTO_LEVEL_APP && init_ngh3_conn(qs) != CURLE_OK)
- return 0;
-
- return 1;
-}
-
-static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
- const uint8_t *data, size_t len)
-{
- struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
- struct quic_handshake *crypto_data;
- ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
- int rv;
-
- crypto_data = &qs->client_crypto_data[level];
- if(crypto_data->buf == NULL) {
- crypto_data->buf = malloc(4096);
- crypto_data->alloclen = 4096;
- /* TODO Explode if malloc failed */
- }
-
- /* TODO Just pretend that handshake does not grow more than 4KiB for
- now */
- assert(crypto_data->len + len <= crypto_data->alloclen);
-
- memcpy(&crypto_data->buf[crypto_data->len], data, len);
- crypto_data->len += len;
-
- rv = ngtcp2_conn_submit_crypto_data(
- qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
- len);
- if(rv) {
- H3BUGF(fprintf(stderr, "write_client_handshake failed\n"));
- }
- assert(0 == rv);
-
- return 1;
-}
-
-static int quic_flush_flight(SSL *ssl)
-{
- (void)ssl;
- return 1;
-}
-
-static int quic_send_alert(SSL *ssl, enum ssl_encryption_level_t level,
- uint8_t alert)
-{
- struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
- (void)level;
-
- qs->tls_alert = alert;
- return 1;
-}
-
-static SSL_QUIC_METHOD quic_method = {quic_set_encryption_secrets,
- quic_add_handshake_data,
- quic_flush_flight, quic_send_alert};
-
-static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
-{
- SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
- const char *keylog_filename;
-
- SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION);
- SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);
-
- SSL_CTX_set_default_verify_paths(ssl_ctx);
-
- if(SSL_CTX_set_ciphersuites(ssl_ctx, QUIC_CIPHERS) != 1) {
- failf(data, "SSL_CTX_set_ciphersuites: %s",
- ERR_error_string(ERR_get_error(), NULL));
- return NULL;
- }
-
- if(SSL_CTX_set1_groups_list(ssl_ctx, QUIC_GROUPS) != 1) {
- failf(data, "SSL_CTX_set1_groups_list failed");
- return NULL;
- }
-
- SSL_CTX_set_quic_method(ssl_ctx, &quic_method);
-
- keylog_filename = getenv("SSLKEYLOGFILE");
- if(keylog_filename) {
- keylog_file = fopen(keylog_filename, "wb");
- if(keylog_file) {
- SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
- }
- }
-
- return ssl_ctx;
-}
-
-/** SSL callbacks ***/
-
-static int quic_init_ssl(struct quicsocket *qs)
-{
- const uint8_t *alpn = NULL;
- size_t alpnlen = 0;
- /* this will need some attention when HTTPS proxy over QUIC get fixed */
- const char * const hostname = qs->conn->host.name;
-
- if(qs->ssl)
- SSL_free(qs->ssl);
-
- qs->ssl = SSL_new(qs->sslctx);
-
- SSL_set_app_data(qs->ssl, qs);
- SSL_set_connect_state(qs->ssl);
-
- switch(qs->version) {
-#ifdef NGTCP2_PROTO_VER
- case NGTCP2_PROTO_VER:
- alpn = (const uint8_t *)NGTCP2_ALPN_H3;
- alpnlen = sizeof(NGTCP2_ALPN_H3) - 1;
- break;
-#endif
- }
- if(alpn)
- SSL_set_alpn_protos(qs->ssl, alpn, (int)alpnlen);
-
- /* set SNI */
- SSL_set_tlsext_host_name(qs->ssl, hostname);
- return 0;
-}
-
-static int cb_initial(ngtcp2_conn *quic, void *user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
-
- if(ngtcp2_crypto_read_write_crypto_data(
- quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
- return NGTCP2_ERR_CALLBACK_FAILURE;
-
- return 0;
-}
-
-static int
-cb_recv_crypto_data(ngtcp2_conn *tconn, ngtcp2_crypto_level crypto_level,
- uint64_t offset,
- const uint8_t *data, size_t datalen,
- void *user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- (void)offset;
-
- if(ngtcp2_crypto_read_write_crypto_data(tconn, qs->ssl, crypto_level, data,
- datalen) != 0)
- return NGTCP2_ERR_CRYPTO;
-
- return 0;
-}
-
-static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- (void)tconn;
- infof(qs->conn->data, "QUIC handshake is completed\n");
-
- return 0;
-}
-
-static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
- int fin, uint64_t offset,
- const uint8_t *buf, size_t buflen,
- void *user_data, void *stream_user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- ssize_t nconsumed;
- (void)offset;
- (void)stream_user_data;
-
- infof(qs->conn->data, "Received %ld bytes data on stream %u\n",
- buflen, stream_id);
-
- nconsumed =
- nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
- if(nconsumed < 0) {
- failf(qs->conn->data, "nghttp3_conn_read_stream returned error: %s\n",
- nghttp3_strerror((int)nconsumed));
- return NGTCP2_ERR_CALLBACK_FAILURE;
- }
-
- ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
- ngtcp2_conn_extend_max_offset(tconn, nconsumed);
-
- return 0;
-}
-
-static int
-cb_acked_stream_data_offset(ngtcp2_conn *tconn, int64_t stream_id,
- uint64_t offset, size_t datalen, void *user_data,
- void *stream_user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- int rv;
- (void)stream_id;
- (void)tconn;
- (void)offset;
- (void)datalen;
- (void)stream_user_data;
-
- rv = nghttp3_conn_add_ack_offset(qs->h3conn, stream_id, datalen);
- if(rv != 0) {
- failf(qs->conn->data, "nghttp3_conn_add_ack_offset returned error: %s\n",
- nghttp3_strerror(rv));
- return NGTCP2_ERR_CALLBACK_FAILURE;
- }
-
- return 0;
-}
-
-static int cb_stream_close(ngtcp2_conn *tconn, int64_t stream_id,
- uint64_t app_error_code,
- void *user_data, void *stream_user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- int rv;
- (void)tconn;
- (void)stream_user_data;
- /* stream is closed... */
-
- rv = nghttp3_conn_close_stream(qs->h3conn, stream_id,
- app_error_code);
- if(rv != 0) {
- failf(qs->conn->data, "nghttp3_conn_close_stream returned error: %s\n",
- nghttp3_strerror(rv));
- return NGTCP2_ERR_CALLBACK_FAILURE;
- }
-
- return 0;
-}
-
-static int cb_stream_reset(ngtcp2_conn *tconn, int64_t stream_id,
- uint64_t final_size, uint64_t app_error_code,
- void *user_data, void *stream_user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- int rv;
- (void)tconn;
- (void)final_size;
- (void)app_error_code;
- (void)stream_user_data;
-
- rv = nghttp3_conn_reset_stream(qs->h3conn, stream_id);
- if(rv != 0) {
- failf(qs->conn->data, "nghttp3_conn_reset_stream returned error: %s\n",
- nghttp3_strerror(rv));
- return NGTCP2_ERR_CALLBACK_FAILURE;
- }
-
- return 0;
-}
-
-static int cb_recv_retry(ngtcp2_conn *tconn, const ngtcp2_pkt_hd *hd,
- const ngtcp2_pkt_retry *retry, void *user_data)
-{
- /* Re-generate handshake secrets here because connection ID might change. */
- struct quicsocket *qs = (struct quicsocket *)user_data;
- (void)tconn;
- (void)hd;
- (void)retry;
-
- setup_initial_crypto_context(qs);
-
- return 0;
-}
-
-static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn,
- uint64_t max_streams,
- void *user_data)
-{
- (void)tconn;
- (void)max_streams;
- (void)user_data;
-
- return 0;
-}
-
-static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
- uint64_t max_data, void *user_data,
- void *stream_user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- int rv;
- (void)tconn;
- (void)max_data;
- (void)stream_user_data;
-
- rv = nghttp3_conn_unblock_stream(qs->h3conn, stream_id);
- if(rv != 0) {
- failf(qs->conn->data, "nghttp3_conn_unblock_stream returned error: %s\n",
- nghttp3_strerror(rv));
- return NGTCP2_ERR_CALLBACK_FAILURE;
- }
-
- return 0;
-}
-
-static int cb_get_new_connection_id(ngtcp2_conn *tconn, ngtcp2_cid *cid,
- uint8_t *token, size_t cidlen,
- void *user_data)
-{
- struct quicsocket *qs = (struct quicsocket *)user_data;
- CURLcode result;
- (void)tconn;
-
- result = Curl_rand(qs->conn->data, cid->data, cidlen);
- if(result)
- return NGTCP2_ERR_CALLBACK_FAILURE;
- cid->datalen = cidlen;
-
- result = Curl_rand(qs->conn->data, token, NGTCP2_STATELESS_RESET_TOKENLEN);
- if(result)
- return NGTCP2_ERR_CALLBACK_FAILURE;
-
- return 0;
-}
-
-static ngtcp2_conn_callbacks ng_callbacks = {
- cb_initial,
- NULL, /* recv_client_initial */
- cb_recv_crypto_data,
- cb_handshake_completed,
- NULL, /* recv_version_negotiation */
- ngtcp2_crypto_encrypt_cb,
- ngtcp2_crypto_decrypt_cb,
- ngtcp2_crypto_hp_mask_cb,
- cb_recv_stream_data,
- NULL, /* acked_crypto_offset */
- cb_acked_stream_data_offset,
- NULL, /* stream_open */
- cb_stream_close,
- NULL, /* recv_stateless_reset */
- cb_recv_retry,
- cb_extend_max_local_streams_bidi,
- NULL, /* extend_max_local_streams_uni */
- NULL, /* rand */
- cb_get_new_connection_id,
- NULL, /* remove_connection_id */
- NULL, /* update_key */
- NULL, /* path_validation */
- NULL, /* select_preferred_addr */
- cb_stream_reset,
- NULL, /* extend_max_remote_streams_bidi */
- NULL, /* extend_max_remote_streams_uni */
- cb_extend_max_stream_data,
-};
-
-/*
- * Might be called twice for happy eyeballs.
- */
-CURLcode Curl_quic_connect(struct connectdata *conn,
- curl_socket_t sockfd,
- int sockindex,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- int rc;
- int rv;
- CURLcode result;
- ngtcp2_path path; /* TODO: this must be initialized properly */
- struct Curl_easy *data = conn->data;
- struct quicsocket *qs = &conn->hequic[sockindex];
- char ipbuf[40];
- long port;
- uint8_t paramsbuf[64];
- ngtcp2_transport_params params;
- ssize_t nwrite;
-
- qs->conn = conn;
-
- /* extract the used address as a string */
- if(!Curl_addr2string((struct sockaddr*)addr, addrlen, ipbuf, &port)) {
- char buffer[STRERROR_LEN];
- failf(data, "ssrem inet_ntop() failed with errno %d: %s",
- SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
-
- infof(data, "Connect socket %d over QUIC to %s:%ld\n",
- sockfd, ipbuf, port);
-
- qs->version = NGTCP2_PROTO_VER;
- qs->sslctx = quic_ssl_ctx(data);
- if(!qs->sslctx)
- return CURLE_FAILED_INIT; /* TODO: better return code */
-
- if(quic_init_ssl(qs))
- return CURLE_FAILED_INIT; /* TODO: better return code */
-
- qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
- result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
- if(result)
- return result;
-
- qs->scid.datalen = NGTCP2_MAX_CIDLEN;
- result = Curl_rand(data, qs->scid.data, NGTCP2_MAX_CIDLEN);
- if(result)
- return result;
-
- quic_settings(&qs->settings, data->set.buffer_size);
-
- qs->local_addrlen = sizeof(qs->local_addr);
- rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
- &qs->local_addrlen);
- if(rv == -1)
- return CURLE_FAILED_INIT;
-
- ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
- NULL);
- ngtcp2_addr_init(&path.remote, (uint8_t*)addr, addrlen, NULL);
-
-#ifdef NGTCP2_PROTO_VER
-#define QUICVER NGTCP2_PROTO_VER
-#else
-#error "unsupported ngtcp2 version"
-#endif
- rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
- &ng_callbacks, &qs->settings, NULL, qs);
- if(rc)
- return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */
-
- ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
- nwrite = ngtcp2_encode_transport_params(
- paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
- &params);
- if(nwrite < 0) {
- failf(data, "ngtcp2_encode_transport_params: %s\n",
- ngtcp2_strerror((int)nwrite));
- return CURLE_FAILED_INIT;
- }
-
- if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
- return CURLE_FAILED_INIT;
-
- rc = setup_initial_crypto_context(qs);
- if(rc)
- return CURLE_FAILED_INIT; /* TODO: better return code */
-
- return CURLE_OK;
-}
-
-/*
- * Store ngtp2 version info in this buffer, Prefix with a space. Return total
- * length written.
- */
-int Curl_quic_ver(char *p, size_t len)
-{
- ngtcp2_info *ng2 = ngtcp2_version(0);
- nghttp3_info *ht3 = nghttp3_version(0);
- return msnprintf(p, len, " ngtcp2/%s nghttp3/%s",
- ng2->version_str, ht3->version_str);
-}
-
-static int ng_getsock(struct connectdata *conn, curl_socket_t *socks)
-{
- struct SingleRequest *k = &conn->data->req;
- int bitmap = GETSOCK_BLANK;
-
- socks[0] = conn->sock[FIRSTSOCKET];
-
- /* in a HTTP/2 connection we can basically always get a frame so we should
- always be ready for one */
- bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
-
- /* we're still uploading or the HTTP/2 layer wants to send data */
- if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
- bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
-
- return bitmap;
-}
-
-static int ng_perform_getsock(const struct connectdata *conn,
- curl_socket_t *socks)
-{
- return ng_getsock((struct connectdata *)conn, socks);
-}
-
-static CURLcode ng_disconnect(struct connectdata *conn,
- bool dead_connection)
-{
- (void)conn;
- (void)dead_connection;
- return CURLE_OK;
-}
-
-static unsigned int ng_conncheck(struct connectdata *conn,
- unsigned int checks_to_perform)
-{
- (void)conn;
- (void)checks_to_perform;
- return CONNRESULT_NONE;
-}
-
-static const struct Curl_handler Curl_handler_http3 = {
- "HTTPS", /* scheme */
- ZERO_NULL, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ng_getsock, /* proto_getsock */
- ng_getsock, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ng_perform_getsock, /* perform_getsock */
- ng_disconnect, /* disconnect */
- ZERO_NULL, /* readwrite */
- ng_conncheck, /* connection_check */
- PORT_HTTP, /* defport */
- CURLPROTO_HTTPS, /* protocol */
- PROTOPT_SSL | PROTOPT_STREAM /* flags */
-};
-
-static int cb_h3_stream_close(nghttp3_conn *conn, int64_t stream_id,
- uint64_t app_error_code, void *user_data,
- void *stream_user_data)
-{
- struct Curl_easy *data = stream_user_data;
- struct HTTP *stream = data->req.protop;
- (void)conn;
- (void)stream_id;
- (void)app_error_code;
- (void)user_data;
- H3BUGF(infof(data, "cb_h3_stream_close CALLED\n"));
-
- stream->closed = TRUE;
- Curl_expire(data, 0, EXPIRE_QUIC);
- return 0;
-}
-
-static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
- const uint8_t *buf, size_t buflen,
- void *user_data, void *stream_user_data)
-{
- struct quicsocket *qs = user_data;
- size_t ncopy;
- struct Curl_easy *data = stream_user_data;
- struct HTTP *stream = data->req.protop;
- (void)conn;
- H3BUGF(infof(data, "cb_h3_recv_data CALLED with %d bytes\n", buflen));
-
- /* TODO: this needs to be handled properly */
- DEBUGASSERT(buflen <= stream->len);
-
- ncopy = CURLMIN(stream->len, buflen);
- memcpy(stream->mem, buf, ncopy);
- stream->len -= ncopy;
- stream->memlen += ncopy;
-#if 0 /* extra debugging of incoming h3 data */
- fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
- ncopy, stream->mem, stream->memlen);
- {
- size_t i;
- for(i = 0; i < ncopy; i++) {
- fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
- }
- }
-#endif
- stream->mem += ncopy;
-
- ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, buflen);
- ngtcp2_conn_extend_max_offset(qs->qconn, buflen);
-
- return 0;
-}
-
-static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
- size_t consumed, void *user_data,
- void *stream_user_data)
-{
- struct quicsocket *qs = user_data;
- (void)conn;
- (void)stream_user_data;
-
- ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
- ngtcp2_conn_extend_max_offset(qs->qconn, consumed);
-
- return 0;
-}
-
-/* Decode HTTP status code. Returns -1 if no valid status code was
- decoded. (duplicate from http2.c) */
-static int decode_status_code(const uint8_t *value, size_t len)
-{
- int i;
- int res;
-
- if(len != 3) {
- return -1;
- }
-
- res = 0;
-
- for(i = 0; i < 3; ++i) {
- char c = value[i];
-
- if(c < '0' || c > '9') {
- return -1;
- }
-
- res *= 10;
- res += c - '0';
- }
-
- return res;
-}
-
-static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
- void *user_data, void *stream_user_data)
-{
- struct Curl_easy *data = stream_user_data;
- struct HTTP *stream = data->req.protop;
- (void)conn;
- (void)stream_id;
- (void)user_data;
-
- if(stream->memlen >= 2) {
- memcpy(stream->mem, "\r\n", 2);
- stream->len -= 2;
- stream->memlen += 2;
- stream->mem += 2;
- }
- return 0;
-}
-
-static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
- int32_t token, nghttp3_rcbuf *name,
- nghttp3_rcbuf *value, uint8_t flags,
- void *user_data, void *stream_user_data)
-{
- nghttp3_vec h3name = nghttp3_rcbuf_get_buf(name);
- nghttp3_vec h3val = nghttp3_rcbuf_get_buf(value);
- struct Curl_easy *data = stream_user_data;
- struct HTTP *stream = data->req.protop;
- size_t ncopy;
- (void)conn;
- (void)stream_id;
- (void)token;
- (void)flags;
- (void)user_data;
-
- if(h3name.len == sizeof(":status") - 1 &&
- !memcmp(":status", h3name.base, h3name.len)) {
- int status = decode_status_code(h3val.base, h3val.len);
- DEBUGASSERT(status != -1);
- msnprintf(stream->mem, stream->len, "HTTP/3 %03d \r\n", status);
- }
- else {
- /* store as a HTTP1-style header */
- msnprintf(stream->mem, stream->len, "%.*s: %.*s\n",
- h3name.len, h3name.base, h3val.len, h3val.base);
- }
-
- ncopy = strlen(stream->mem);
- stream->len -= ncopy;
- stream->memlen += ncopy;
- stream->mem += ncopy;
- return 0;
-}
-
-static int cb_h3_send_stop_sending(nghttp3_conn *conn, int64_t stream_id,
- uint64_t app_error_code,
- void *user_data,
- void *stream_user_data)
-{
- (void)conn;
- (void)stream_id;
- (void)app_error_code;
- (void)user_data;
- (void)stream_user_data;
- return 0;
-}
-
-static nghttp3_conn_callbacks ngh3_callbacks = {
- cb_h3_acked_stream_data, /* acked_stream_data */
- cb_h3_stream_close,
- cb_h3_recv_data,
- cb_h3_deferred_consume,
- NULL, /* begin_headers */
- cb_h3_recv_header,
- cb_h3_end_headers,
- NULL, /* begin_trailers */
- cb_h3_recv_header,
- NULL, /* end_trailers */
- NULL, /* http_begin_push_promise */
- NULL, /* http_recv_push_promise */
- NULL, /* http_end_push_promise */
- NULL, /* http_cancel_push */
- cb_h3_send_stop_sending,
- NULL, /* push_stream */
- NULL, /* end_stream */
-};
-
-static int init_ngh3_conn(struct quicsocket *qs)
-{
- CURLcode result;
- int rc;
- int64_t ctrl_stream_id, qpack_enc_stream_id, qpack_dec_stream_id;
-
- if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
- failf(qs->conn->data, "too few available QUIC streams");
- return CURLE_FAILED_INIT;
- }
-
- nghttp3_conn_settings_default(&qs->h3settings);
-
- rc = nghttp3_conn_client_new(&qs->h3conn,
- &ngh3_callbacks,
- &qs->h3settings,
- nghttp3_mem_default(),
- qs);
- if(rc) {
- result = CURLE_OUT_OF_MEMORY;
- goto fail;
- }
-
- rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
- if(rc) {
- result = CURLE_FAILED_INIT;
- goto fail;
- }
-
- rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
- if(rc) {
- result = CURLE_FAILED_INIT;
- goto fail;
- }
-
- rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
- if(rc) {
- result = CURLE_FAILED_INIT;
- goto fail;
- }
-
- rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
- if(rc) {
- result = CURLE_FAILED_INIT;
- goto fail;
- }
-
- rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
- qpack_dec_stream_id);
- if(rc) {
- result = CURLE_FAILED_INIT;
- goto fail;
- }
-
- return CURLE_OK;
- fail:
-
- return result;
-}
-
-static Curl_recv ngh3_stream_recv;
-static Curl_send ngh3_stream_send;
-
-/* incoming data frames on the h3 stream */
-static ssize_t ngh3_stream_recv(struct connectdata *conn,
- int sockindex,
- char *buf,
- size_t buffersize,
- CURLcode *curlcode)
-{
- curl_socket_t sockfd = conn->sock[sockindex];
- struct HTTP *stream = conn->data->req.protop;
- struct quicsocket *qs = conn->quic;
-
- if(!stream->memlen) {
- /* remember where to store incoming data for this stream and how big the
- buffer is */
- stream->mem = buf;
- stream->len = buffersize;
- }
- /* else, there's data in the buffer already */
-
- if(ng_process_ingress(conn, sockfd, qs)) {
- *curlcode = CURLE_RECV_ERROR;
- return -1;
- }
- if(ng_flush_egress(conn, sockfd, qs)) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
-
- if(stream->memlen) {
- ssize_t memlen = stream->memlen;
- /* data arrived */
- *curlcode = CURLE_OK;
- /* reset to allow more data to come */
- stream->memlen = 0;
- stream->mem = buf;
- stream->len = buffersize;
- H3BUGF(infof(conn->data, "!! ngh3_stream_recv returns %zd bytes at %p\n",
- memlen, buf));
- return memlen;
- }
-
- if(stream->closed) {
- *curlcode = CURLE_OK;
- return 0;
- }
-
- infof(conn->data, "ngh3_stream_recv returns 0 bytes and EAGAIN\n");
- *curlcode = CURLE_AGAIN;
- return -1;
-}
-
-/* this amount of data has now been acked on this stream */
-static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
- size_t datalen, void *user_data,
- void *stream_user_data)
-{
- struct Curl_easy *data = stream_user_data;
- struct HTTP *stream = data->req.protop;
- (void)conn;
- (void)stream_id;
- (void)user_data;
-
- if(!data->set.postfields) {
- stream->h3out->used -= datalen;
- H3BUGF(infof(data,
- "cb_h3_acked_stream_data, %zd bytes, %zd left unacked\n",
- datalen, stream->h3out->used));
- DEBUGASSERT(stream->h3out->used < H3_SEND_SIZE);
- }
- return 0;
-}
-
-static ssize_t cb_h3_readfunction(nghttp3_conn *conn, int64_t stream_id,
- nghttp3_vec *vec, size_t veccnt,
- uint32_t *pflags, void *user_data,
- void *stream_user_data)
-{
- struct Curl_easy *data = stream_user_data;
- size_t nread;
- struct HTTP *stream = data->req.protop;
- (void)conn;
- (void)stream_id;
- (void)user_data;
- (void)veccnt;
-
- if(data->set.postfields) {
- vec[0].base = data->set.postfields;
- vec[0].len = data->state.infilesize;
- *pflags = NGHTTP3_DATA_FLAG_EOF;
- return 1;
- }
-
- nread = CURLMIN(stream->upload_len, H3_SEND_SIZE - stream->h3out->used);
- if(nread > 0) {
- /* nghttp3 wants us to hold on to the data until it tells us it is okay to
- delete it. Append the data at the end of the h3out buffer. Since we can
- only return consecutive data, copy the amount that fits and the next
- part comes in next invoke. */
- struct h3out *out = stream->h3out;
- if(nread + out->windex > H3_SEND_SIZE)
- nread = H3_SEND_SIZE - out->windex;
-
- memcpy(&out->buf[out->windex], stream->upload_mem, nread);
- out->windex += nread;
- out->used += nread;
-
- /* that's the chunk we return to nghttp3 */
- vec[0].base = &out->buf[out->windex];
- vec[0].len = nread;
-
- if(out->windex == H3_SEND_SIZE)
- out->windex = 0; /* wrap */
- stream->upload_mem += nread;
- stream->upload_len -= nread;
- if(data->state.infilesize != -1) {
- stream->upload_left -= nread;
- if(!stream->upload_left)
- *pflags = NGHTTP3_DATA_FLAG_EOF;
- }
- H3BUGF(infof(data, "cb_h3_readfunction %zd bytes%s (at %zd unacked)\n",
- nread, *pflags == NGHTTP3_DATA_FLAG_EOF?" EOF":"",
- out->used));
- }
- if(stream->upload_done && !stream->upload_len &&
- (stream->upload_left <= 0)) {
- H3BUGF(infof(data, "!!!!!!!!! cb_h3_readfunction sets EOF\n"));
- *pflags = NGHTTP3_DATA_FLAG_EOF;
- return 0;
- }
- else if(!nread) {
- return NGHTTP3_ERR_WOULDBLOCK;
- }
- return 1;
-}
-
-/* Index where :authority header field will appear in request header
- field list. */
-#define AUTHORITY_DST_IDX 3
-
-static CURLcode http_request(struct connectdata *conn, const void *mem,
- size_t len)
-{
- struct HTTP *stream = conn->data->req.protop;
- size_t nheader;
- size_t i;
- size_t authority_idx;
- char *hdbuf = (char *)mem;
- char *end, *line_end;
- struct quicsocket *qs = conn->quic;
- CURLcode result = CURLE_OK;
- struct Curl_easy *data = conn->data;
- nghttp3_nv *nva = NULL;
- int64_t stream3_id;
- int rc;
- struct h3out *h3out = NULL;
-
- rc = ngtcp2_conn_open_bidi_stream(qs->qconn, &stream3_id, NULL);
- if(rc) {
- failf(conn->data, "can get bidi streams");
- result = CURLE_SEND_ERROR;
- goto fail;
- }
-
- stream->stream3_id = stream3_id;
- stream->h3req = TRUE; /* senf off! */
-
- /* Calculate number of headers contained in [mem, mem + len). Assumes a
- correctly generated HTTP header field block. */
- nheader = 0;
- for(i = 1; i < len; ++i) {
- if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
- ++nheader;
- ++i;
- }
- }
- if(nheader < 2)
- goto fail;
-
- /* We counted additional 2 \r\n in the first and last line. We need 3
- new headers: :method, :path and :scheme. Therefore we need one
- more space. */
- nheader += 1;
- nva = malloc(sizeof(nghttp3_nv) * nheader);
- if(!nva) {
- result = CURLE_OUT_OF_MEMORY;
- goto fail;
- }
-
- /* Extract :method, :path from request line
- We do line endings with CRLF so checking for CR is enough */
- line_end = memchr(hdbuf, '\r', len);
- if(!line_end) {
- result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
- goto fail;
- }
-
- /* Method does not contain spaces */
- end = memchr(hdbuf, ' ', line_end - hdbuf);
- if(!end || end == hdbuf)
- goto fail;
- nva[0].name = (unsigned char *)":method";
- nva[0].namelen = strlen((char *)nva[0].name);
- nva[0].value = (unsigned char *)hdbuf;
- nva[0].valuelen = (size_t)(end - hdbuf);
- nva[0].flags = NGHTTP3_NV_FLAG_NONE;
-
- hdbuf = end + 1;
-
- /* Path may contain spaces so scan backwards */
- end = NULL;
- for(i = (size_t)(line_end - hdbuf); i; --i) {
- if(hdbuf[i - 1] == ' ') {
- end = &hdbuf[i - 1];
- break;
- }
- }
- if(!end || end == hdbuf)
- goto fail;
- nva[1].name = (unsigned char *)":path";
- nva[1].namelen = strlen((char *)nva[1].name);
- nva[1].value = (unsigned char *)hdbuf;
- nva[1].valuelen = (size_t)(end - hdbuf);
- nva[1].flags = NGHTTP3_NV_FLAG_NONE;
-
- nva[2].name = (unsigned char *)":scheme";
- nva[2].namelen = strlen((char *)nva[2].name);
- if(conn->handler->flags & PROTOPT_SSL)
- nva[2].value = (unsigned char *)"https";
- else
- nva[2].value = (unsigned char *)"http";
- nva[2].valuelen = strlen((char *)nva[2].value);
- nva[2].flags = NGHTTP3_NV_FLAG_NONE;
-
-
- authority_idx = 0;
- i = 3;
- while(i < nheader) {
- size_t hlen;
-
- hdbuf = line_end + 2;
-
- /* check for next CR, but only within the piece of data left in the given
- buffer */
- line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
- if(!line_end || (line_end == hdbuf))
- goto fail;
-
- /* header continuation lines are not supported */
- if(*hdbuf == ' ' || *hdbuf == '\t')
- goto fail;
-
- for(end = hdbuf; end < line_end && *end != ':'; ++end)
- ;
- if(end == hdbuf || end == line_end)
- goto fail;
- hlen = end - hdbuf;
-
- if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
- authority_idx = i;
- nva[i].name = (unsigned char *)":authority";
- nva[i].namelen = strlen((char *)nva[i].name);
- }
- else {
- nva[i].namelen = (size_t)(end - hdbuf);
- /* Lower case the header name for HTTP/3 */
- Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
- nva[i].name = (unsigned char *)hdbuf;
- }
- nva[i].flags = NGHTTP3_NV_FLAG_NONE;
- hdbuf = end + 1;
- while(*hdbuf == ' ' || *hdbuf == '\t')
- ++hdbuf;
- end = line_end;
-
-#if 0 /* This should probably go in more or less like this */
- switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
- end - hdbuf)) {
- case HEADERINST_IGNORE:
- /* skip header fields prohibited by HTTP/2 specification. */
- --nheader;
- continue;
- case HEADERINST_TE_TRAILERS:
- nva[i].value = (uint8_t*)"trailers";
- nva[i].value_len = sizeof("trailers") - 1;
- break;
- default:
- nva[i].value = (unsigned char *)hdbuf;
- nva[i].value_len = (size_t)(end - hdbuf);
- }
-#endif
- nva[i].value = (unsigned char *)hdbuf;
- nva[i].valuelen = (size_t)(end - hdbuf);
- nva[i].flags = NGHTTP3_NV_FLAG_NONE;
-
- ++i;
- }
-
- /* :authority must come before non-pseudo header fields */
- if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
- nghttp3_nv authority = nva[authority_idx];
- for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
- nva[i] = nva[i - 1];
- }
- nva[i] = authority;
- }
-
- /* Warn stream may be rejected if cumulative length of headers is too
- large. */
-#define MAX_ACC 60000 /* <64KB to account for some overhead */
- {
- size_t acc = 0;
- for(i = 0; i < nheader; ++i)
- acc += nva[i].namelen + nva[i].valuelen;
-
- if(acc > MAX_ACC) {
- infof(data, "http_request: Warning: The cumulative length of all "
- "headers exceeds %zu bytes and that could cause the "
- "stream to be rejected.\n", MAX_ACC);
- }
- }
-
- switch(data->set.httpreq) {
- case HTTPREQ_POST:
- case HTTPREQ_POST_FORM:
- case HTTPREQ_POST_MIME:
- case HTTPREQ_PUT: {
- nghttp3_data_reader data_reader;
- if(data->state.infilesize != -1)
- stream->upload_left = data->state.infilesize;
- else
- /* data sending without specifying the data amount up front */
- stream->upload_left = -1; /* unknown, but not zero */
-
- data_reader.read_data = cb_h3_readfunction;
-
- h3out = calloc(sizeof(struct h3out), 1);
- if(!h3out) {
- result = CURLE_OUT_OF_MEMORY;
- goto fail;
- }
- stream->h3out = h3out;
-
- rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
- nva, nheader, &data_reader,
- conn->data);
- if(rc) {
- result = CURLE_SEND_ERROR;
- goto fail;
- }
- break;
- }
- default:
- stream->upload_left = 0; /* nothing left to send */
- rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
- nva, nheader,
- NULL, /* no body! */
- conn->data);
- if(rc) {
- result = CURLE_SEND_ERROR;
- goto fail;
- }
- break;
- }
-
- Curl_safefree(nva);
-
- infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
- stream3_id, (void *)data);
-
- return CURLE_OK;
-
-fail:
- free(nva);
- return result;
-}
-static ssize_t ngh3_stream_send(struct connectdata *conn,
- int sockindex,
- const void *mem,
- size_t len,
- CURLcode *curlcode)
-{
- ssize_t sent;
- struct quicsocket *qs = conn->quic;
- curl_socket_t sockfd = conn->sock[sockindex];
- struct HTTP *stream = conn->data->req.protop;
-
- if(!stream->h3req) {
- CURLcode result = http_request(conn, mem, len);
- if(result) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
- sent = len;
- }
- else {
- H3BUGF(infof(conn->data, "ngh3_stream_send() wants to send %zd bytes\n",
- len));
- if(!stream->upload_len) {
- stream->upload_mem = mem;
- stream->upload_len = len;
- (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
- sent = len;
- }
- else {
- *curlcode = CURLE_AGAIN;
- return -1;
- }
- }
-
- if(ng_flush_egress(conn, sockfd, qs)) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
-
- *curlcode = CURLE_OK;
- return sent;
-}
-
-static void ng_has_connected(struct connectdata *conn, int tempindex)
-{
- conn->recv[FIRSTSOCKET] = ngh3_stream_recv;
- conn->send[FIRSTSOCKET] = ngh3_stream_send;
- conn->handler = &Curl_handler_http3;
- conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
- conn->httpversion = 30;
- conn->bundle->multiuse = BUNDLE_MULTIPLEX;
- conn->quic = &conn->hequic[tempindex];
- DEBUGF(infof(conn->data, "ngtcp2 established connection!\n"));
-}
-
-/*
- * There can be multiple connection attempts going on in parallel.
- */
-CURLcode Curl_quic_is_connected(struct connectdata *conn,
- int sockindex,
- bool *done)
-{
- CURLcode result;
- struct quicsocket *qs = &conn->hequic[sockindex];
- curl_socket_t sockfd = conn->tempsock[sockindex];
-
- result = ng_process_ingress(conn, sockfd, qs);
- if(result)
- return result;
-
- result = ng_flush_egress(conn, sockfd, qs);
- if(result)
- return result;
-
- if(ngtcp2_conn_get_handshake_completed(qs->qconn)) {
- *done = TRUE;
- ng_has_connected(conn, sockindex);
- }
-
- return result;
-}
-
-static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
- struct quicsocket *qs)
-{
- ssize_t recvd;
- int rv;
- uint8_t buf[65536];
- size_t bufsize = sizeof(buf);
- struct sockaddr_storage remote_addr;
- socklen_t remote_addrlen;
- ngtcp2_path path;
- ngtcp2_tstamp ts = timestamp();
-
- for(;;) {
- remote_addrlen = sizeof(remote_addr);
- while((recvd = recvfrom(sockfd, buf, bufsize, 0,
- (struct sockaddr *)&remote_addr,
- &remote_addrlen)) == -1 &&
- SOCKERRNO == EINTR)
- ;
- if(recvd == -1) {
- if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK)
- break;
-
- failf(conn->data, "ngtcp2: recvfrom() unexpectedly returned %d", recvd);
- return CURLE_RECV_ERROR;
- }
-
- ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr,
- qs->local_addrlen, NULL);
- ngtcp2_addr_init(&path.remote, (uint8_t *)&remote_addr, remote_addrlen,
- NULL);
-
- rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
- if(rv != 0) {
- /* TODO Send CONNECTION_CLOSE if possible */
- return CURLE_RECV_ERROR;
- }
- }
-
- return CURLE_OK;
-}
-
-static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
- struct quicsocket *qs)
-{
- int rv;
- ssize_t sent;
- ssize_t outlen;
- uint8_t out[NGTCP2_MAX_PKTLEN_IPV4];
- size_t pktlen;
- ngtcp2_path_storage ps;
- ngtcp2_tstamp ts = timestamp();
- struct sockaddr_storage remote_addr;
- ngtcp2_tstamp expiry;
- ngtcp2_duration timeout;
- int64_t stream_id;
- ssize_t veccnt;
- int fin;
- nghttp3_vec vec[16];
- ssize_t ndatalen;
-
- switch(qs->local_addr.ss_family) {
- case AF_INET:
- pktlen = NGTCP2_MAX_PKTLEN_IPV4;
- break;
- case AF_INET6:
- pktlen = NGTCP2_MAX_PKTLEN_IPV6;
- break;
- default:
- assert(0);
- }
-
- rv = ngtcp2_conn_handle_expiry(qs->qconn, ts);
- if(rv != 0) {
- failf(conn->data, "ngtcp2_conn_handle_expiry returned error: %s\n",
- ngtcp2_strerror(rv));
- return CURLE_SEND_ERROR;
- }
-
- ngtcp2_path_storage_zero(&ps);
-
- for(;;) {
- outlen = -1;
- if(qs->h3conn && ngtcp2_conn_get_max_data_left(qs->qconn)) {
- veccnt = nghttp3_conn_writev_stream(qs->h3conn, &stream_id, &fin, vec,
- sizeof(vec) / sizeof(vec[0]));
- if(veccnt < 0) {
- failf(conn->data, "nghttp3_conn_writev_stream returned error: %s\n",
- nghttp3_strerror((int)veccnt));
- return CURLE_SEND_ERROR;
- }
- else if(veccnt > 0) {
- outlen =
- ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
- out, pktlen, &ndatalen,
- NGTCP2_WRITE_STREAM_FLAG_MORE,
- stream_id, fin,
- (const ngtcp2_vec *)vec, veccnt, ts);
- if(outlen == 0) {
- break;
- }
- if(outlen < 0) {
- if(outlen == NGTCP2_ERR_STREAM_DATA_BLOCKED ||
- outlen == NGTCP2_ERR_STREAM_SHUT_WR) {
- rv = nghttp3_conn_block_stream(qs->h3conn, stream_id);
- if(rv != 0) {
- failf(conn->data,
- "nghttp3_conn_block_stream returned error: %s\n",
- nghttp3_strerror(rv));
- return CURLE_SEND_ERROR;
- }
- continue;
- }
- else if(outlen == NGTCP2_ERR_WRITE_STREAM_MORE) {
- assert(ndatalen > 0);
- rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id,
- ndatalen);
- if(rv != 0) {
- failf(conn->data,
- "nghttp3_conn_add_write_offset returned error: %s\n",
- nghttp3_strerror(rv));
- return CURLE_SEND_ERROR;
- }
- continue;
- }
- else {
- failf(conn->data, "ngtcp2_conn_writev_stream returned error: %s\n",
- ngtcp2_strerror((int)outlen));
- return CURLE_SEND_ERROR;
- }
- }
- else if(ndatalen >= 0) {
- rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id, ndatalen);
- if(rv != 0) {
- failf(conn->data,
- "nghttp3_conn_add_write_offset returned error: %s\n",
- nghttp3_strerror(rv));
- return CURLE_SEND_ERROR;
- }
- }
- }
- }
- if(outlen < 0) {
- outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
- if(outlen < 0) {
- failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
- ngtcp2_strerror((int)outlen));
- return CURLE_SEND_ERROR;
- }
- if(outlen == 0)
- break;
- }
-
- memcpy(&remote_addr, ps.path.remote.addr, ps.path.remote.addrlen);
- while((sent = send(sockfd, out, outlen, 0)) == -1 &&
- SOCKERRNO == EINTR)
- ;
-
- if(sent == -1) {
- if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
- /* TODO Cache packet */
- break;
- }
- else {
- failf(conn->data, "send() returned %zd (errno %d)\n", sent,
- SOCKERRNO);
- return CURLE_SEND_ERROR;
- }
- }
- }
-
- expiry = ngtcp2_conn_get_expiry(qs->qconn);
- if(expiry != UINT64_MAX) {
- if(expiry <= ts) {
- timeout = NGTCP2_MILLISECONDS;
- }
- else {
- timeout = expiry - ts;
- }
- Curl_expire(conn->data, timeout / NGTCP2_MILLISECONDS, EXPIRE_QUIC);
- }
-
- return CURLE_OK;
-}
-
-/*
- * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
- */
-CURLcode Curl_quic_done_sending(struct connectdata *conn)
-{
- if(conn->handler == &Curl_handler_http3) {
- /* only for HTTP/3 transfers */
- struct HTTP *stream = conn->data->req.protop;
- struct quicsocket *qs = conn->quic;
- stream->upload_done = TRUE;
- (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
- }
-
- return CURLE_OK;
-}
-#endif
diff --git a/lib/vquic/ngtcp2.h b/lib/vquic/ngtcp2.h
deleted file mode 100644
index 5570fc7e7..000000000
--- a/lib/vquic/ngtcp2.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef HEADER_CURL_VQUIC_NGTCP2_H
-#define HEADER_CURL_VQUIC_NGTCP2_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#ifdef USE_NGTCP2
-
-#include <ngtcp2/ngtcp2.h>
-#include <nghttp3/nghttp3.h>
-#include <openssl/ssl.h>
-
-struct quic_handshake {
- char *buf; /* pointer to the buffer */
- size_t alloclen; /* size of allocation */
- size_t len; /* size of content in buffer */
- size_t nread; /* how many bytes have been read */
-};
-
-struct quicsocket {
- struct connectdata *conn; /* point back to the connection */
- ngtcp2_conn *qconn;
- ngtcp2_cid dcid;
- ngtcp2_cid scid;
- uint32_t version;
- ngtcp2_settings settings;
- SSL_CTX *sslctx;
- SSL *ssl;
- struct quic_handshake client_crypto_data[3];
- /* the last TLS alert description generated by the local endpoint */
- uint8_t tls_alert;
- struct sockaddr_storage local_addr;
- socklen_t local_addrlen;
-
- nghttp3_conn *h3conn;
- nghttp3_conn_settings h3settings;
-};
-
-#include "urldata.h"
-
-#endif
-
-#endif /* HEADER_CURL_VQUIC_NGTCP2_H */
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
deleted file mode 100644
index 0ee360d07..000000000
--- a/lib/vquic/quiche.c
+++ /dev/null
@@ -1,783 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#ifdef USE_QUICHE
-#include <quiche.h>
-#include <openssl/err.h>
-#include "urldata.h"
-#include "sendf.h"
-#include "strdup.h"
-#include "rand.h"
-#include "quic.h"
-#include "strcase.h"
-#include "multiif.h"
-#include "connect.h"
-#include "strerror.h"
-
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
-#include "memdebug.h"
-
-#define DEBUG_HTTP3
-/* #define DEBUG_QUICHE */
-#ifdef DEBUG_HTTP3
-#define H3BUGF(x) x
-#else
-#define H3BUGF(x) do { } WHILE_FALSE
-#endif
-
-#define QUIC_MAX_STREAMS (256*1024)
-#define QUIC_MAX_DATA (1*1024*1024)
-#define QUIC_IDLE_TIMEOUT (60 * 1000) /* milliseconds */
-
-static CURLcode process_ingress(struct connectdata *conn,
- curl_socket_t sockfd,
- struct quicsocket *qs);
-
-static CURLcode flush_egress(struct connectdata *conn, curl_socket_t sockfd,
- struct quicsocket *qs);
-
-static CURLcode http_request(struct connectdata *conn, const void *mem,
- size_t len);
-static Curl_recv h3_stream_recv;
-static Curl_send h3_stream_send;
-
-
-static int quiche_getsock(struct connectdata *conn, curl_socket_t *socks)
-{
- struct SingleRequest *k = &conn->data->req;
- int bitmap = GETSOCK_BLANK;
-
- socks[0] = conn->sock[FIRSTSOCKET];
-
- /* in a HTTP/2 connection we can basically always get a frame so we should
- always be ready for one */
- bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
-
- /* we're still uploading or the HTTP/2 layer wants to send data */
- if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
- bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
-
- return bitmap;
-}
-
-static int quiche_perform_getsock(const struct connectdata *conn,
- curl_socket_t *socks)
-{
- return quiche_getsock((struct connectdata *)conn, socks);
-}
-
-static CURLcode quiche_disconnect(struct connectdata *conn,
- bool dead_connection)
-{
- struct quicsocket *qs = conn->quic;
- (void)dead_connection;
- quiche_h3_config_free(qs->h3config);
- quiche_h3_conn_free(qs->h3c);
- quiche_config_free(qs->cfg);
- quiche_conn_free(qs->conn);
- return CURLE_OK;
-}
-
-static unsigned int quiche_conncheck(struct connectdata *conn,
- unsigned int checks_to_perform)
-{
- (void)conn;
- (void)checks_to_perform;
- return CONNRESULT_NONE;
-}
-
-static CURLcode quiche_do(struct connectdata *conn, bool *done)
-{
- struct HTTP *stream = conn->data->req.protop;
- stream->h3req = FALSE; /* not sent */
- return Curl_http(conn, done);
-}
-
-static const struct Curl_handler Curl_handler_http3 = {
- "HTTPS", /* scheme */
- ZERO_NULL, /* setup_connection */
- quiche_do, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- quiche_getsock, /* proto_getsock */
- quiche_getsock, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- quiche_perform_getsock, /* perform_getsock */
- quiche_disconnect, /* disconnect */
- ZERO_NULL, /* readwrite */
- quiche_conncheck, /* connection_check */
- PORT_HTTP, /* defport */
- CURLPROTO_HTTPS, /* protocol */
- PROTOPT_SSL | PROTOPT_STREAM /* flags */
-};
-
-#ifdef DEBUG_QUICHE
-static void quiche_debug_log(const char *line, void *argp)
-{
- (void)argp;
- fprintf(stderr, "%s\n", line);
-}
-#endif
-
-CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
- int sockindex,
- const struct sockaddr *addr, socklen_t addrlen)
-{
- CURLcode result;
- struct quicsocket *qs = &conn->hequic[sockindex];
- struct Curl_easy *data = conn->data;
-
-#ifdef DEBUG_QUICHE
- /* initialize debug log callback only once */
- static int debug_log_init = 0;
- if(!debug_log_init) {
- quiche_enable_debug_logging(quiche_debug_log, NULL);
- debug_log_init = 1;
- }
-#endif
-
- (void)addr;
- (void)addrlen;
-
- qs->cfg = quiche_config_new(QUICHE_PROTOCOL_VERSION);
- if(!qs->cfg) {
- failf(data, "can't create quiche config");
- return CURLE_FAILED_INIT;
- }
-
- quiche_config_set_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
- quiche_config_set_initial_max_data(qs->cfg, QUIC_MAX_DATA);
- quiche_config_set_initial_max_stream_data_bidi_local(qs->cfg, QUIC_MAX_DATA);
- quiche_config_set_initial_max_stream_data_bidi_remote(qs->cfg,
- QUIC_MAX_DATA);
- quiche_config_set_initial_max_stream_data_uni(qs->cfg, QUIC_MAX_DATA);
- quiche_config_set_initial_max_streams_bidi(qs->cfg, QUIC_MAX_STREAMS);
- quiche_config_set_initial_max_streams_uni(qs->cfg, QUIC_MAX_STREAMS);
- quiche_config_set_application_protos(qs->cfg,
- (uint8_t *)
- QUICHE_H3_APPLICATION_PROTOCOL,
- sizeof(QUICHE_H3_APPLICATION_PROTOCOL)
- - 1);
-
- result = Curl_rand(data, qs->scid, sizeof(qs->scid));
- if(result)
- return result;
-
- if(getenv("SSLKEYLOGFILE"))
- quiche_config_log_keys(qs->cfg);
-
- qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
- sizeof(qs->scid), qs->cfg);
- if(!qs->conn) {
- failf(data, "can't create quiche connection");
- return CURLE_OUT_OF_MEMORY;
- }
-
- result = flush_egress(conn, sockfd, qs);
- if(result)
- return result;
-
- /* store the used address as a string */
- if(!Curl_addr2string((struct sockaddr*)addr, addrlen,
- conn->primary_ip, &conn->primary_port)) {
- char buffer[STRERROR_LEN];
- failf(data, "ssrem inet_ntop() failed with errno %d: %s",
- SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- return CURLE_BAD_FUNCTION_ARGUMENT;
- }
- memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
- Curl_persistconninfo(conn);
-
- /* for connection reuse purposes: */
- conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;
-
- infof(data, "Sent QUIC client Initial, ALPN: %s\n",
- QUICHE_H3_APPLICATION_PROTOCOL + 1);
-
- return CURLE_OK;
-}
-
-static CURLcode quiche_has_connected(struct connectdata *conn,
- int sockindex,
- int tempindex)
-{
- CURLcode result;
- struct quicsocket *qs = conn->quic = &conn->hequic[tempindex];
-
- conn->recv[sockindex] = h3_stream_recv;
- conn->send[sockindex] = h3_stream_send;
- conn->handler = &Curl_handler_http3;
- conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
- conn->httpversion = 30;
- conn->bundle->multiuse = BUNDLE_MULTIPLEX;
-
- qs->h3config = quiche_h3_config_new();
- if(!qs->h3config)
- return CURLE_OUT_OF_MEMORY;
-
- /* Create a new HTTP/3 connection on the QUIC connection. */
- qs->h3c = quiche_h3_conn_new_with_transport(qs->conn, qs->h3config);
- if(!qs->h3c) {
- result = CURLE_OUT_OF_MEMORY;
- goto fail;
- }
- if(conn->hequic[1-tempindex].cfg) {
- qs = &conn->hequic[1-tempindex];
- quiche_config_free(qs->cfg);
- quiche_conn_free(qs->conn);
- qs->cfg = NULL;
- qs->conn = NULL;
- }
- return CURLE_OK;
- fail:
- quiche_h3_config_free(qs->h3config);
- quiche_h3_conn_free(qs->h3c);
- return result;
-}
-
-/*
- * This function gets polled to check if this QUIC connection has connected.
- */
-CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
- bool *done)
-{
- CURLcode result;
- struct quicsocket *qs = &conn->hequic[sockindex];
- curl_socket_t sockfd = conn->tempsock[sockindex];
-
- result = process_ingress(conn, sockfd, qs);
- if(result)
- return result;
-
- result = flush_egress(conn, sockfd, qs);
- if(result)
- return result;
-
- if(quiche_conn_is_established(qs->conn)) {
- *done = TRUE;
- result = quiche_has_connected(conn, 0, sockindex);
- DEBUGF(infof(conn->data, "quiche established connection!\n"));
- }
-
- return result;
-}
-
-static CURLcode process_ingress(struct connectdata *conn, int sockfd,
- struct quicsocket *qs)
-{
- ssize_t recvd;
- struct Curl_easy *data = conn->data;
- uint8_t *buf = (uint8_t *)data->state.buffer;
- size_t bufsize = data->set.buffer_size;
-
- /* in case the timeout expired */
- quiche_conn_on_timeout(qs->conn);
-
- do {
- recvd = recv(sockfd, buf, bufsize, 0);
- if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK)))
- break;
-
- if(recvd < 0) {
- failf(conn->data, "quiche: recv() unexpectedly returned %d "
- "(errno: %d, socket %d)", recvd, SOCKERRNO, sockfd);
- return CURLE_RECV_ERROR;
- }
-
- recvd = quiche_conn_recv(qs->conn, buf, recvd);
- if(recvd == QUICHE_ERR_DONE)
- break;
-
- if(recvd < 0) {
- failf(conn->data, "quiche_conn_recv() == %d", recvd);
- return CURLE_RECV_ERROR;
- }
- } while(1);
-
- return CURLE_OK;
-}
-
-/*
- * flush_egress drains the buffers and sends off data.
- * Calls failf() on errors.
- */
-static CURLcode flush_egress(struct connectdata *conn, int sockfd,
- struct quicsocket *qs)
-{
- ssize_t sent;
- static uint8_t out[1200];
- int64_t timeout_ns;
-
- do {
- sent = quiche_conn_send(qs->conn, out, sizeof(out));
- if(sent == QUICHE_ERR_DONE)
- break;
-
- if(sent < 0) {
- failf(conn->data, "quiche_conn_send returned %zd\n",
- sent);
- return CURLE_SEND_ERROR;
- }
-
- sent = send(sockfd, out, sent, 0);
- if(sent < 0) {
- failf(conn->data, "send() returned %zd\n", sent);
- return CURLE_SEND_ERROR;
- }
- } while(1);
-
- /* time until the next timeout event, as nanoseconds. */
- timeout_ns = quiche_conn_timeout_as_nanos(qs->conn);
- if(timeout_ns)
- /* expire uses milliseconds */
- Curl_expire(conn->data, (timeout_ns + 999999) / 1000000, EXPIRE_QUIC);
-
- return CURLE_OK;
-}
-
-struct h3h1header {
- char *dest;
- size_t destlen; /* left to use */
- size_t nlen; /* used */
-};
-
-static int cb_each_header(uint8_t *name, size_t name_len,
- uint8_t *value, size_t value_len,
- void *argp)
-{
- struct h3h1header *headers = (struct h3h1header *)argp;
- size_t olen = 0;
-
- if((name_len == 7) && !strncmp(":status", (char *)name, 7)) {
- msnprintf(headers->dest,
- headers->destlen, "HTTP/3 %.*s\n",
- (int) value_len, value);
- }
- else {
- msnprintf(headers->dest,
- headers->destlen, "%.*s: %.*s\n",
- (int)name_len, name, (int) value_len, value);
- }
- olen = strlen(headers->dest);
- headers->destlen -= olen;
- headers->nlen += olen;
- headers->dest += olen;
- return 0;
-}
-
-static ssize_t h3_stream_recv(struct connectdata *conn,
- int sockindex,
- char *buf,
- size_t buffersize,
- CURLcode *curlcode)
-{
- ssize_t recvd = -1;
- ssize_t rcode;
- struct quicsocket *qs = conn->quic;
- curl_socket_t sockfd = conn->sock[sockindex];
- quiche_h3_event *ev;
- int rc;
- struct h3h1header headers;
- struct Curl_easy *data = conn->data;
- struct HTTP *stream = data->req.protop;
- headers.dest = buf;
- headers.destlen = buffersize;
- headers.nlen = 0;
-
- if(process_ingress(conn, sockfd, qs)) {
- infof(data, "h3_stream_recv returns on ingress\n");
- *curlcode = CURLE_RECV_ERROR;
- return -1;
- }
-
- while(recvd < 0) {
- int64_t s = quiche_h3_conn_poll(qs->h3c, qs->conn, &ev);
- if(s < 0)
- /* nothing more to do */
- break;
-
- if(s != stream->stream3_id) {
- /* another transfer, ignore for now */
- infof(data, "Got h3 for stream %u, expects %u\n",
- s, stream->stream3_id);
- continue;
- }
-
- switch(quiche_h3_event_type(ev)) {
- case QUICHE_H3_EVENT_HEADERS:
- rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
- if(rc) {
- /* what do we do about this? */
- }
- recvd = headers.nlen;
- break;
- case QUICHE_H3_EVENT_DATA:
- if(!stream->firstbody) {
- /* add a header-body separator CRLF */
- buf[0] = '\r';
- buf[1] = '\n';
- buf += 2;
- buffersize -= 2;
- stream->firstbody = TRUE;
- recvd = 2; /* two bytes already */
- }
- else
- recvd = 0;
- rcode = quiche_h3_recv_body(qs->h3c, qs->conn, s, (unsigned char *)buf,
- buffersize);
- if(rcode <= 0) {
- recvd = -1;
- break;
- }
- recvd += rcode;
- break;
-
- case QUICHE_H3_EVENT_FINISHED:
- streamclose(conn, "End of stream");
- recvd = 0; /* end of stream */
- break;
- default:
- break;
- }
-
- quiche_h3_event_free(ev);
- }
- if(flush_egress(conn, sockfd, qs)) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
-
- *curlcode = (-1 == recvd)? CURLE_AGAIN : CURLE_OK;
- if(recvd >= 0)
- /* Get this called again to drain the event queue */
- Curl_expire(data, 0, EXPIRE_QUIC);
-
- data->state.drain = (recvd >= 0) ? 1 : 0;
- return recvd;
-}
-
-static ssize_t h3_stream_send(struct connectdata *conn,
- int sockindex,
- const void *mem,
- size_t len,
- CURLcode *curlcode)
-{
- ssize_t sent;
- struct quicsocket *qs = conn->quic;
- curl_socket_t sockfd = conn->sock[sockindex];
- struct HTTP *stream = conn->data->req.protop;
-
- if(!stream->h3req) {
- CURLcode result = http_request(conn, mem, len);
- if(result) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
- sent = len;
- }
- else {
- H3BUGF(infof(conn->data, "Pass on %zd body bytes to quiche\n",
- len));
- sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
- (uint8_t *)mem, len, FALSE);
- if(sent < 0) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
- }
-
- if(flush_egress(conn, sockfd, qs)) {
- *curlcode = CURLE_SEND_ERROR;
- return -1;
- }
-
- *curlcode = CURLE_OK;
- return sent;
-}
-
-/*
- * Store quiche version info in this buffer, Prefix with a space. Return total
- * length written.
- */
-int Curl_quic_ver(char *p, size_t len)
-{
- return msnprintf(p, len, " quiche/%s", quiche_version());
-}
-
-/* Index where :authority header field will appear in request header
- field list. */
-#define AUTHORITY_DST_IDX 3
-
-static CURLcode http_request(struct connectdata *conn, const void *mem,
- size_t len)
-{
- /*
- */
- struct HTTP *stream = conn->data->req.protop;
- size_t nheader;
- size_t i;
- size_t authority_idx;
- char *hdbuf = (char *)mem;
- char *end, *line_end;
- int64_t stream3_id;
- quiche_h3_header *nva = NULL;
- struct quicsocket *qs = conn->quic;
- CURLcode result = CURLE_OK;
- struct Curl_easy *data = conn->data;
-
- stream->h3req = TRUE; /* senf off! */
-
- /* Calculate number of headers contained in [mem, mem + len). Assumes a
- correctly generated HTTP header field block. */
- nheader = 0;
- for(i = 1; i < len; ++i) {
- if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
- ++nheader;
- ++i;
- }
- }
- if(nheader < 2)
- goto fail;
-
- /* We counted additional 2 \r\n in the first and last line. We need 3
- new headers: :method, :path and :scheme. Therefore we need one
- more space. */
- nheader += 1;
- nva = malloc(sizeof(quiche_h3_header) * nheader);
- if(!nva) {
- result = CURLE_OUT_OF_MEMORY;
- goto fail;
- }
-
- /* Extract :method, :path from request line
- We do line endings with CRLF so checking for CR is enough */
- line_end = memchr(hdbuf, '\r', len);
- if(!line_end) {
- result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
- goto fail;
- }
-
- /* Method does not contain spaces */
- end = memchr(hdbuf, ' ', line_end - hdbuf);
- if(!end || end == hdbuf)
- goto fail;
- nva[0].name = (unsigned char *)":method";
- nva[0].name_len = strlen((char *)nva[0].name);
- nva[0].value = (unsigned char *)hdbuf;
- nva[0].value_len = (size_t)(end - hdbuf);
-
- hdbuf = end + 1;
-
- /* Path may contain spaces so scan backwards */
- end = NULL;
- for(i = (size_t)(line_end - hdbuf); i; --i) {
- if(hdbuf[i - 1] == ' ') {
- end = &hdbuf[i - 1];
- break;
- }
- }
- if(!end || end == hdbuf)
- goto fail;
- nva[1].name = (unsigned char *)":path";
- nva[1].name_len = strlen((char *)nva[1].name);
- nva[1].value = (unsigned char *)hdbuf;
- nva[1].value_len = (size_t)(end - hdbuf);
-
- nva[2].name = (unsigned char *)":scheme";
- nva[2].name_len = strlen((char *)nva[2].name);
- if(conn->handler->flags & PROTOPT_SSL)
- nva[2].value = (unsigned char *)"https";
- else
- nva[2].value = (unsigned char *)"http";
- nva[2].value_len = strlen((char *)nva[2].value);
-
-
- authority_idx = 0;
- i = 3;
- while(i < nheader) {
- size_t hlen;
-
- hdbuf = line_end + 2;
-
- /* check for next CR, but only within the piece of data left in the given
- buffer */
- line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
- if(!line_end || (line_end == hdbuf))
- goto fail;
-
- /* header continuation lines are not supported */
- if(*hdbuf == ' ' || *hdbuf == '\t')
- goto fail;
-
- for(end = hdbuf; end < line_end && *end != ':'; ++end)
- ;
- if(end == hdbuf || end == line_end)
- goto fail;
- hlen = end - hdbuf;
-
- if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
- authority_idx = i;
- nva[i].name = (unsigned char *)":authority";
- nva[i].name_len = strlen((char *)nva[i].name);
- }
- else {
- nva[i].name_len = (size_t)(end - hdbuf);
- /* Lower case the header name for HTTP/3 */
- Curl_strntolower((char *)hdbuf, hdbuf, nva[i].name_len);
- nva[i].name = (unsigned char *)hdbuf;
- }
- hdbuf = end + 1;
- while(*hdbuf == ' ' || *hdbuf == '\t')
- ++hdbuf;
- end = line_end;
-
-#if 0 /* This should probably go in more or less like this */
- switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
- end - hdbuf)) {
- case HEADERINST_IGNORE:
- /* skip header fields prohibited by HTTP/2 specification. */
- --nheader;
- continue;
- case HEADERINST_TE_TRAILERS:
- nva[i].value = (uint8_t*)"trailers";
- nva[i].value_len = sizeof("trailers") - 1;
- break;
- default:
- nva[i].value = (unsigned char *)hdbuf;
- nva[i].value_len = (size_t)(end - hdbuf);
- }
-#endif
- nva[i].value = (unsigned char *)hdbuf;
- nva[i].value_len = (size_t)(end - hdbuf);
-
- ++i;
- }
-
- /* :authority must come before non-pseudo header fields */
- if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
- quiche_h3_header authority = nva[authority_idx];
- for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
- nva[i] = nva[i - 1];
- }
- nva[i] = authority;
- }
-
- /* Warn stream may be rejected if cumulative length of headers is too
- large. */
-#define MAX_ACC 60000 /* <64KB to account for some overhead */
- {
- size_t acc = 0;
-
- for(i = 0; i < nheader; ++i) {
- acc += nva[i].name_len + nva[i].value_len;
-
- H3BUGF(infof(data, "h3 [%.*s: %.*s]\n",
- nva[i].name_len, nva[i].name,
- nva[i].value_len, nva[i].value));
- }
-
- if(acc > MAX_ACC) {
- infof(data, "http_request: Warning: The cumulative length of all "
- "headers exceeds %zu bytes and that could cause the "
- "stream to be rejected.\n", MAX_ACC);
- }
- }
-
- switch(data->set.httpreq) {
- case HTTPREQ_POST:
- case HTTPREQ_POST_FORM:
- case HTTPREQ_POST_MIME:
- case HTTPREQ_PUT:
- if(data->state.infilesize != -1)
- stream->upload_left = data->state.infilesize;
- else
- /* data sending without specifying the data amount up front */
- stream->upload_left = -1; /* unknown, but not zero */
-
- stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
- stream->upload_left ? FALSE: TRUE);
- if((stream3_id >= 0) && data->set.postfields) {
- ssize_t sent = quiche_h3_send_body(qs->h3c, qs->conn, stream3_id,
- (uint8_t *)data->set.postfields,
- stream->upload_left, TRUE);
- if(sent <= 0) {
- failf(data, "quiche_h3_send_body failed!");
- result = CURLE_SEND_ERROR;
- }
- stream->upload_left = 0; /* nothing left to send */
- }
- break;
- default:
- stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
- TRUE);
- break;
- }
-
- Curl_safefree(nva);
-
- if(stream3_id < 0) {
- H3BUGF(infof(data, "quiche_h3_send_request returned %d\n",
- stream3_id));
- result = CURLE_SEND_ERROR;
- goto fail;
- }
-
- infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
- stream3_id, (void *)data);
- stream->stream3_id = stream3_id;
-
- return CURLE_OK;
-
-fail:
- free(nva);
- return result;
-}
-
-/*
- * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
- */
-CURLcode Curl_quic_done_sending(struct connectdata *conn)
-{
- if(conn->handler == &Curl_handler_http3) {
- /* only for HTTP/3 transfers */
- ssize_t sent;
- struct HTTP *stream = conn->data->req.protop;
- struct quicsocket *qs = conn->quic;
- fprintf(stderr, "!!! Curl_quic_done_sending\n");
- stream->upload_done = TRUE;
- sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
- NULL, 0, TRUE);
- if(sent < 0)
- return CURLE_SEND_ERROR;
- }
-
- return CURLE_OK;
-}
-
-#endif
diff --git a/lib/vquic/quiche.h b/lib/vquic/quiche.h
deleted file mode 100644
index c8d1837b5..000000000
--- a/lib/vquic/quiche.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef HEADER_CURL_VQUIC_QUICHE_H
-#define HEADER_CURL_VQUIC_QUICHE_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#ifdef USE_QUICHE
-
-#include <quiche.h>
-
-struct quic_handshake {
- char *buf; /* pointer to the buffer */
- size_t alloclen; /* size of allocation */
- size_t len; /* size of content in buffer */
- size_t nread; /* how many bytes have been read */
-};
-
-struct quicsocket {
- quiche_config *cfg;
- quiche_conn *conn;
- quiche_h3_conn *h3c;
- quiche_h3_config *h3config;
- uint8_t scid[QUICHE_MAX_CONN_ID_LEN];
- uint32_t version;
-};
-
-#endif
-
-#endif /* HEADER_CURL_VQUIC_QUICHE_H */
diff --git a/lib/vtls/wolfssl.c b/lib/vtls/cyassl.c
index 890bcbf79..c7a3268ef 100644
--- a/lib/vtls/wolfssl.c
+++ b/lib/vtls/cyassl.c
@@ -21,21 +21,31 @@
***************************************************************************/
/*
- * Source file for all wolfSSL specific code for the TLS/SSL layer. No code
+ * Source file for all CyaSSL-specific code for the TLS/SSL layer. No code
* but vtls.c should ever call or use these functions.
*
*/
#include "curl_setup.h"
-#ifdef USE_WOLFSSL
+#ifdef USE_CYASSL
#define WOLFSSL_OPTIONS_IGNORE_SYS
-#include <wolfssl/version.h>
-#include <wolfssl/options.h>
+/* CyaSSL's version.h, which should contain only the version, should come
+before all other CyaSSL includes and be immediately followed by build config
+aka options.h. https://curl.haxx.se/mail/lib-2015-04/0069.html */
+#include <cyassl/version.h>
+#if defined(HAVE_CYASSL_OPTIONS_H) && (LIBCYASSL_VERSION_HEX > 0x03004008)
+#if defined(CYASSL_API) || defined(WOLFSSL_API)
+/* Safety measure. If either is defined some API include was already included
+and that's a problem since options.h hasn't been included yet. */
+#error "CyaSSL API was included before the CyaSSL build options."
+#endif
+#include <cyassl/options.h>
+#endif
/* To determine what functions are available we rely on one or both of:
- - the user's options.h generated by wolfSSL
+ - the user's options.h generated by CyaSSL/wolfSSL
- the symbols detected by curl's configure
Since they are markedly different from one another, and one or the other may
not be available, we do some checking below to bring things in sync. */
@@ -51,8 +61,8 @@
options.h, but is only seen in >= 3.6.6 since that's when they started
disabling SSLv3 by default. */
#ifndef WOLFSSL_ALLOW_SSLV3
-#if (LIBWOLFSSL_VERSION_HEX < 0x03006006) || \
- defined(HAVE_WOLFSSLV3_CLIENT_METHOD)
+#if (LIBCYASSL_VERSION_HEX < 0x03006006) || \
+ defined(HAVE_WOLFSSLV3_CLIENT_METHOD)
#define WOLFSSL_ALLOW_SSLV3
#endif
#endif
@@ -69,23 +79,34 @@
#include "strcase.h"
#include "x509asn1.h"
#include "curl_printf.h"
-#include "multiif.h"
-#include <wolfssl/openssl/ssl.h>
-#include <wolfssl/ssl.h>
-#include <wolfssl/error-ssl.h>
-#include "wolfssl.h"
+#include <cyassl/openssl/ssl.h>
+#include <cyassl/ssl.h>
+#ifdef HAVE_CYASSL_ERROR_SSL_H
+#include <cyassl/error-ssl.h>
+#else
+#include <cyassl/error.h>
+#endif
+#include <cyassl/ctaocrypt/random.h>
+#include <cyassl/ctaocrypt/sha256.h>
+
+#include "cyassl.h"
/* The last #include files should be: */
#include "curl_memory.h"
#include "memdebug.h"
+#if LIBCYASSL_VERSION_HEX < 0x02007002 /* < 2.7.2 */
+#define CYASSL_MAX_ERROR_SZ 80
+#endif
+
/* KEEP_PEER_CERT is a product of the presence of build time symbol
OPENSSL_EXTRA without NO_CERTS, depending on the version. KEEP_PEER_CERT is
in wolfSSL's settings.h, and the latter two are build time symbols in
options.h. */
#ifndef KEEP_PEER_CERT
-#if defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
+#if defined(HAVE_CYASSL_GET_PEER_CERTIFICATE) || \
+ defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
(defined(OPENSSL_EXTRA) && !defined(NO_CERTS))
#define KEEP_PEER_CERT
#endif
@@ -98,8 +119,8 @@ struct ssl_backend_data {
#define BACKEND connssl->backend
-static Curl_recv wolfssl_recv;
-static Curl_send wolfssl_send;
+static Curl_recv cyassl_recv;
+static Curl_send cyassl_send;
static int do_file_type(const char *type)
@@ -118,9 +139,10 @@ static int do_file_type(const char *type)
* layer and do all necessary magic.
*/
static CURLcode
-wolfssl_connect_step1(struct connectdata *conn,
+cyassl_connect_step1(struct connectdata *conn,
int sockindex)
{
+ char error_buffer[CYASSL_MAX_ERROR_SZ];
char *ciphers;
struct Curl_easy *data = conn->data;
struct ssl_connect_data* connssl = &conn->ssl[sockindex];
@@ -137,7 +159,7 @@ wolfssl_connect_step1(struct connectdata *conn,
return CURLE_OK;
if(SSL_CONN_CONFIG(version_max) != CURL_SSLVERSION_MAX_NONE) {
- failf(data, "wolfSSL does not support to set maximum SSL/TLS version");
+ failf(data, "CyaSSL does not support to set maximum SSL/TLS version");
return CURLE_SSL_CONNECT_ERROR;
}
@@ -145,11 +167,11 @@ wolfssl_connect_step1(struct connectdata *conn,
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
-#if LIBWOLFSSL_VERSION_HEX >= 0x03003000 /* >= 3.3.0 */
+#if LIBCYASSL_VERSION_HEX >= 0x03003000 /* >= 3.3.0 */
/* minimum protocol version is set later after the CTX object is created */
req_method = SSLv23_client_method();
#else
- infof(data, "wolfSSL <3.3.0 cannot be configured to use TLS 1.0-1.2, "
+ infof(data, "CyaSSL <3.3.0 cannot be configured to use TLS 1.0-1.2, "
"TLS 1.0 is used exclusively\n");
req_method = TLSv1_client_method();
#endif
@@ -160,7 +182,7 @@ wolfssl_connect_step1(struct connectdata *conn,
req_method = TLSv1_client_method();
use_sni(TRUE);
#else
- failf(data, "wolfSSL does not support TLS 1.0");
+ failf(data, "CyaSSL does not support TLS 1.0");
return CURLE_NOT_BUILT_IN;
#endif
break;
@@ -178,7 +200,7 @@ wolfssl_connect_step1(struct connectdata *conn,
use_sni(TRUE);
break;
#else
- failf(data, "wolfSSL: TLS 1.3 is not yet supported");
+ failf(data, "CyaSSL: TLS 1.3 is not yet supported");
return CURLE_SSL_CONNECT_ERROR;
#endif
case CURL_SSLVERSION_SSLv3:
@@ -186,12 +208,12 @@ wolfssl_connect_step1(struct connectdata *conn,
req_method = SSLv3_client_method();
use_sni(FALSE);
#else
- failf(data, "wolfSSL does not support SSLv3");
+ failf(data, "CyaSSL does not support SSLv3");
return CURLE_NOT_BUILT_IN;
#endif
break;
case CURL_SSLVERSION_SSLv2:
- failf(data, "wolfSSL does not support SSLv2");
+ failf(data, "CyaSSL does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
@@ -215,12 +237,13 @@ wolfssl_connect_step1(struct connectdata *conn,
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
-#if LIBWOLFSSL_VERSION_HEX > 0x03004006 /* > 3.4.6 */
- /* Versions 3.3.0 to 3.4.6 we know the minimum protocol version is
- * whatever minimum version of TLS was built in and at least TLS 1.0. For
- * later library versions that could change (eg TLS 1.0 built in but
- * defaults to TLS 1.1) so we have this short circuit evaluation to find
- * the minimum supported TLS version.
+#if LIBCYASSL_VERSION_HEX > 0x03004006 /* > 3.4.6 */
+ /* Versions 3.3.0 to 3.4.6 we know the minimum protocol version is whatever
+ minimum version of TLS was built in and at least TLS 1.0. For later library
+ versions that could change (eg TLS 1.0 built in but defaults to TLS 1.1) so
+ we have this short circuit evaluation to find the minimum supported TLS
+ version. We use wolfSSL_CTX_SetMinVersion and not CyaSSL_SetMinVersion
+ because only the former will work before the user's CTX callback is called.
*/
if((wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1) != 1) &&
(wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_1) != 1) &&
@@ -324,7 +347,7 @@ wolfssl_connect_step1(struct connectdata *conn,
#ifdef ENABLE_IPV6
(0 == Curl_inet_pton(AF_INET6, hostname, &addr6)) &&
#endif
- (wolfSSL_CTX_UseSNI(BACKEND->ctx, WOLFSSL_SNI_HOST_NAME, hostname,
+ (CyaSSL_CTX_UseSNI(BACKEND->ctx, CYASSL_SNI_HOST_NAME, hostname,
(unsigned short)hostname_len) != 1)) {
infof(data, "WARNING: failed to configure server name indication (SNI) "
"TLS extension\n");
@@ -334,8 +357,9 @@ wolfssl_connect_step1(struct connectdata *conn,
/* give application a chance to interfere with SSL set up. */
if(data->set.ssl.fsslctx) {
- CURLcode result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
- data->set.ssl.fsslctxp);
+ CURLcode result = CURLE_OK;
+ result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
+ data->set.ssl.fsslctxp);
if(result) {
failf(data, "error signaled by ssl ctx callback");
return result;
@@ -343,7 +367,7 @@ wolfssl_connect_step1(struct connectdata *conn,
}
#ifdef NO_FILESYSTEM
else if(SSL_CONN_CONFIG(verifypeer)) {
- failf(data, "SSL: Certificates can't be loaded because wolfSSL was built"
+ failf(data, "SSL: Certificates couldn't be loaded because CyaSSL was built"
" with \"no filesystem\". Either disable peer verification"
" (insecure) or if you are building an application with libcurl you"
" can load certificates via CURLOPT_SSL_CTX_FUNCTION.");
@@ -395,11 +419,10 @@ wolfssl_connect_step1(struct connectdata *conn,
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
/* we got a session id, use it! */
if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
- char error_buffer[WOLFSSL_MAX_ERROR_SZ];
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
ERR_error_string(SSL_get_error(BACKEND->handle, 0),
- error_buffer));
+ error_buffer));
return CURLE_SSL_CONNECT_ERROR;
}
/* Informational message */
@@ -420,7 +443,7 @@ wolfssl_connect_step1(struct connectdata *conn,
static CURLcode
-wolfssl_connect_step2(struct connectdata *conn,
+cyassl_connect_step2(struct connectdata *conn,
int sockindex)
{
int ret = -1;
@@ -434,19 +457,19 @@ wolfssl_connect_step2(struct connectdata *conn,
data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
- conn->recv[sockindex] = wolfssl_recv;
- conn->send[sockindex] = wolfssl_send;
+ conn->recv[sockindex] = cyassl_recv;
+ conn->send[sockindex] = cyassl_send;
/* Enable RFC2818 checks */
if(SSL_CONN_CONFIG(verifyhost)) {
- ret = wolfSSL_check_domain_name(BACKEND->handle, hostname);
+ ret = CyaSSL_check_domain_name(BACKEND->handle, hostname);
if(ret == SSL_FAILURE)
return CURLE_OUT_OF_MEMORY;
}
ret = SSL_connect(BACKEND->handle);
if(ret != 1) {
- char error_buffer[WOLFSSL_MAX_ERROR_SZ];
+ char error_buffer[CYASSL_MAX_ERROR_SZ];
int detail = SSL_get_error(BACKEND->handle, ret);
if(SSL_ERROR_WANT_READ == detail) {
@@ -466,12 +489,11 @@ wolfssl_connect_step2(struct connectdata *conn,
dispname);
return CURLE_PEER_FAILED_VERIFICATION;
#else
- /* When the wolfssl_check_domain_name() is used and you desire to
- * continue on a DOMAIN_NAME_MISMATCH, i.e. 'conn->ssl_config.verifyhost
- * == 0', CyaSSL version 2.4.0 will fail with an INCOMPLETE_DATA
- * error. The only way to do this is currently to switch the
- * Wolfssl_check_domain_name() in and out based on the
- * 'conn->ssl_config.verifyhost' value. */
+ /* When the CyaSSL_check_domain_name() is used and you desire to continue
+ * on a DOMAIN_NAME_MISMATCH, i.e. 'conn->ssl_config.verifyhost == 0',
+ * CyaSSL version 2.4.0 will fail with an INCOMPLETE_DATA error. The only
+ * way to do this is currently to switch the CyaSSL_check_domain_name()
+ * in and out based on the 'conn->ssl_config.verifyhost' value. */
if(SSL_CONN_CONFIG(verifyhost)) {
failf(data,
"\tsubject alt name(s) or common name do not match \"%s\"\n",
@@ -486,7 +508,7 @@ wolfssl_connect_step2(struct connectdata *conn,
}
#endif
}
-#if LIBWOLFSSL_VERSION_HEX >= 0x02007000 /* 2.7.0 */
+#if LIBCYASSL_VERSION_HEX >= 0x02007000 /* 2.7.0 */
else if(ASN_NO_SIGNER_E == detail) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data, "\tCA signer not available for verification\n");
@@ -522,7 +544,7 @@ wolfssl_connect_step2(struct connectdata *conn,
return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
}
- x509_der = (const char *)wolfSSL_X509_get_der(x509, &x509_der_len);
+ x509_der = (const char *)CyaSSL_X509_get_der(x509, &x509_der_len);
if(!x509_der) {
failf(data, "SSL: failed retrieving ASN.1 server certificate");
return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -577,8 +599,6 @@ wolfssl_connect_step2(struct connectdata *conn,
else
infof(data, "ALPN, unrecognized protocol %.*s\n", protocol_len,
protocol);
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
else if(rc == SSL_ALPN_NOT_FOUND)
infof(data, "ALPN, server did not agree to a protocol\n");
@@ -590,7 +610,7 @@ wolfssl_connect_step2(struct connectdata *conn,
#endif /* HAVE_ALPN */
connssl->connecting_state = ssl_connect_3;
-#if (LIBWOLFSSL_VERSION_HEX >= 0x03009010)
+#if (LIBCYASSL_VERSION_HEX >= 0x03009010)
infof(data, "SSL connection using %s / %s\n",
wolfSSL_get_version(BACKEND->handle),
wolfSSL_get_cipher_name(BACKEND->handle));
@@ -603,7 +623,7 @@ wolfssl_connect_step2(struct connectdata *conn,
static CURLcode
-wolfssl_connect_step3(struct connectdata *conn,
+cyassl_connect_step3(struct connectdata *conn,
int sockindex)
{
CURLcode result = CURLE_OK;
@@ -648,14 +668,14 @@ wolfssl_connect_step3(struct connectdata *conn,
}
-static ssize_t wolfssl_send(struct connectdata *conn,
+static ssize_t cyassl_send(struct connectdata *conn,
int sockindex,
const void *mem,
size_t len,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- char error_buffer[WOLFSSL_MAX_ERROR_SZ];
+ char error_buffer[CYASSL_MAX_ERROR_SZ];
int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
int rc = SSL_write(BACKEND->handle, mem, memlen);
@@ -679,7 +699,7 @@ static ssize_t wolfssl_send(struct connectdata *conn,
return rc;
}
-static void Curl_wolfssl_close(struct connectdata *conn, int sockindex)
+static void Curl_cyassl_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -694,14 +714,14 @@ static void Curl_wolfssl_close(struct connectdata *conn, int sockindex)
}
}
-static ssize_t wolfssl_recv(struct connectdata *conn,
+static ssize_t cyassl_recv(struct connectdata *conn,
int num,
char *buf,
size_t buffersize,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[num];
- char error_buffer[WOLFSSL_MAX_ERROR_SZ];
+ char error_buffer[CYASSL_MAX_ERROR_SZ];
int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
int nread = SSL_read(BACKEND->handle, buf, buffsize);
@@ -728,36 +748,40 @@ static ssize_t wolfssl_recv(struct connectdata *conn,
}
-static void Curl_wolfssl_session_free(void *ptr)
+static void Curl_cyassl_session_free(void *ptr)
{
(void)ptr;
- /* wolfSSL reuses sessions on own, no free */
+ /* CyaSSL reuses sessions on own, no free */
}
-static size_t Curl_wolfssl_version(char *buffer, size_t size)
+static size_t Curl_cyassl_version(char *buffer, size_t size)
{
-#if LIBWOLFSSL_VERSION_HEX >= 0x03006000
+#if LIBCYASSL_VERSION_HEX >= 0x03006000
return msnprintf(buffer, size, "wolfSSL/%s", wolfSSL_lib_version());
#elif defined(WOLFSSL_VERSION)
return msnprintf(buffer, size, "wolfSSL/%s", WOLFSSL_VERSION);
+#elif defined(CYASSL_VERSION)
+ return msnprintf(buffer, size, "CyaSSL/%s", CYASSL_VERSION);
+#else
+ return msnprintf(buffer, size, "CyaSSL/%s", "<1.8.8");
#endif
}
-static int Curl_wolfssl_init(void)
+static int Curl_cyassl_init(void)
{
- return (wolfSSL_Init() == SSL_SUCCESS);
+ return (CyaSSL_Init() == SSL_SUCCESS);
}
-static void Curl_wolfssl_cleanup(void)
+static void Curl_cyassl_cleanup(void)
{
- wolfSSL_Cleanup();
+ CyaSSL_Cleanup();
}
-static bool Curl_wolfssl_data_pending(const struct connectdata* conn,
+static bool Curl_cyassl_data_pending(const struct connectdata* conn,
int connindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
@@ -772,7 +796,7 @@ static bool Curl_wolfssl_data_pending(const struct connectdata* conn,
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
-static int Curl_wolfssl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex)
{
int retval = 0;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -786,7 +810,7 @@ static int Curl_wolfssl_shutdown(struct connectdata *conn, int sockindex)
static CURLcode
-wolfssl_connect_common(struct connectdata *conn,
+cyassl_connect_common(struct connectdata *conn,
int sockindex,
bool nonblocking,
bool *done)
@@ -814,7 +838,7 @@ wolfssl_connect_common(struct connectdata *conn,
return CURLE_OPERATION_TIMEDOUT;
}
- result = wolfssl_connect_step1(conn, sockindex);
+ result = cyassl_connect_step1(conn, sockindex);
if(result)
return result;
}
@@ -869,7 +893,7 @@ wolfssl_connect_common(struct connectdata *conn,
* ensuring that a client using select() or epoll() will always
* have a valid fdset to wait on.
*/
- result = wolfssl_connect_step2(conn, sockindex);
+ result = cyassl_connect_step2(conn, sockindex);
if(result || (nonblocking &&
(ssl_connect_2 == connssl->connecting_state ||
ssl_connect_2_reading == connssl->connecting_state ||
@@ -878,15 +902,15 @@ wolfssl_connect_common(struct connectdata *conn,
} /* repeat step2 until all transactions are done. */
if(ssl_connect_3 == connssl->connecting_state) {
- result = wolfssl_connect_step3(conn, sockindex);
+ result = cyassl_connect_step3(conn, sockindex);
if(result)
return result;
}
if(ssl_connect_done == connssl->connecting_state) {
connssl->state = ssl_connection_complete;
- conn->recv[sockindex] = wolfssl_recv;
- conn->send[sockindex] = wolfssl_send;
+ conn->recv[sockindex] = cyassl_recv;
+ conn->send[sockindex] = cyassl_send;
*done = TRUE;
}
else
@@ -899,19 +923,19 @@ wolfssl_connect_common(struct connectdata *conn,
}
-static CURLcode Curl_wolfssl_connect_nonblocking(struct connectdata *conn,
+static CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn,
int sockindex, bool *done)
{
- return wolfssl_connect_common(conn, sockindex, TRUE, done);
+ return cyassl_connect_common(conn, sockindex, TRUE, done);
}
-static CURLcode Curl_wolfssl_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
bool done = FALSE;
- result = wolfssl_connect_common(conn, sockindex, FALSE, &done);
+ result = cyassl_connect_common(conn, sockindex, FALSE, &done);
if(result)
return result;
@@ -920,43 +944,43 @@ static CURLcode Curl_wolfssl_connect(struct connectdata *conn, int sockindex)
return CURLE_OK;
}
-static CURLcode Curl_wolfssl_random(struct Curl_easy *data,
+static CURLcode Curl_cyassl_random(struct Curl_easy *data,
unsigned char *entropy, size_t length)
{
RNG rng;
(void)data;
- if(wc_InitRng(&rng))
+ if(InitRng(&rng))
return CURLE_FAILED_INIT;
if(length > UINT_MAX)
return CURLE_FAILED_INIT;
- if(wc_RNG_GenerateBlock(&rng, entropy, (unsigned)length))
+ if(RNG_GenerateBlock(&rng, entropy, (unsigned)length))
return CURLE_FAILED_INIT;
- if(wc_FreeRng(&rng))
+ if(FreeRng(&rng))
return CURLE_FAILED_INIT;
return CURLE_OK;
}
-static CURLcode Curl_wolfssl_sha256sum(const unsigned char *tmp, /* input */
+static CURLcode Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
size_t tmplen,
unsigned char *sha256sum /* output */,
size_t unused)
{
Sha256 SHA256pw;
(void)unused;
- wc_InitSha256(&SHA256pw);
- wc_Sha256Update(&SHA256pw, tmp, (word32)tmplen);
- wc_Sha256Final(&SHA256pw, sha256sum);
+ InitSha256(&SHA256pw);
+ Sha256Update(&SHA256pw, tmp, (word32)tmplen);
+ Sha256Final(&SHA256pw, sha256sum);
return CURLE_OK;
}
-static void *Curl_wolfssl_get_internals(struct ssl_connect_data *connssl,
+static void *Curl_cyassl_get_internals(struct ssl_connect_data *connssl,
CURLINFO info UNUSED_PARAM)
{
(void)info;
return BACKEND->handle;
}
-const struct Curl_ssl Curl_ssl_wolfssl = {
+const struct Curl_ssl Curl_ssl_cyassl = {
{ CURLSSLBACKEND_WOLFSSL, "WolfSSL" }, /* info */
#ifdef KEEP_PEER_CERT
@@ -966,26 +990,26 @@ const struct Curl_ssl Curl_ssl_wolfssl = {
sizeof(struct ssl_backend_data),
- Curl_wolfssl_init, /* init */
- Curl_wolfssl_cleanup, /* cleanup */
- Curl_wolfssl_version, /* version */
+ Curl_cyassl_init, /* init */
+ Curl_cyassl_cleanup, /* cleanup */
+ Curl_cyassl_version, /* version */
Curl_none_check_cxn, /* check_cxn */
- Curl_wolfssl_shutdown, /* shutdown */
- Curl_wolfssl_data_pending, /* data_pending */
- Curl_wolfssl_random, /* random */
+ Curl_cyassl_shutdown, /* shutdown */
+ Curl_cyassl_data_pending, /* data_pending */
+ Curl_cyassl_random, /* random */
Curl_none_cert_status_request, /* cert_status_request */
- Curl_wolfssl_connect, /* connect */
- Curl_wolfssl_connect_nonblocking, /* connect_nonblocking */
- Curl_wolfssl_get_internals, /* get_internals */
- Curl_wolfssl_close, /* close_one */
+ Curl_cyassl_connect, /* connect */
+ Curl_cyassl_connect_nonblocking, /* connect_nonblocking */
+ Curl_cyassl_get_internals, /* get_internals */
+ Curl_cyassl_close, /* close_one */
Curl_none_close_all, /* close_all */
- Curl_wolfssl_session_free, /* session_free */
+ Curl_cyassl_session_free, /* session_free */
Curl_none_set_engine, /* set_engine */
Curl_none_set_engine_default, /* set_engine_default */
Curl_none_engines_list, /* engines_list */
Curl_none_false_start, /* false_start */
Curl_none_md5sum, /* md5sum */
- Curl_wolfssl_sha256sum /* sha256sum */
+ Curl_cyassl_sha256sum /* sha256sum */
};
#endif
diff --git a/lib/vtls/wolfssl.h b/lib/vtls/cyassl.h
index 2b9673c0f..01e11cc23 100644
--- a/lib/vtls/wolfssl.h
+++ b/lib/vtls/cyassl.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_WOLFSSL_H
-#define HEADER_CURL_WOLFSSL_H
+#ifndef HEADER_CURL_CYASSL_H
+#define HEADER_CURL_CYASSL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,9 +23,9 @@
***************************************************************************/
#include "curl_setup.h"
-#ifdef USE_WOLFSSL
+#ifdef USE_CYASSL
-extern const struct Curl_ssl Curl_ssl_wolfssl;
+extern const struct Curl_ssl Curl_ssl_cyassl;
-#endif /* USE_WOLFSSL */
-#endif /* HEADER_CURL_WOLFSSL_H */
+#endif /* USE_CYASSL */
+#endif /* HEADER_CURL_CYASSL_H */
diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c
index 32153dd07..c4afc8904 100644
--- a/lib/vtls/gskit.c
+++ b/lib/vtls/gskit.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,8 +26,6 @@
#include <gskssl.h>
#include <qsoasync.h>
-#undef HAVE_SOCKETPAIR /* because the native one isn't good enough */
-#include "socketpair.h"
/* Some symbols are undefined/unsupported on OS400 versions < V7R1. */
#ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST
@@ -513,6 +511,100 @@ static void close_async_handshake(struct ssl_connect_data *connssl)
BACKEND->iocport = -1;
}
+/* SSL over SSL
+ * Problems:
+ * 1) GSKit can only perform SSL on an AF_INET or AF_INET6 stream socket. To
+ * pipe an SSL stream into another, it is therefore needed to have a pair
+ * of such communicating sockets and handle the pipelining explicitly.
+ * 2) OS/400 socketpair() is only implemented for domain AF_UNIX, thus cannot
+ * be used to produce the pipeline.
+ * The solution is to simulate socketpair() for AF_INET with low-level API
+ * listen(), bind() and connect().
+ */
+
+static int
+inetsocketpair(int sv[2])
+{
+ int lfd; /* Listening socket. */
+ int sfd; /* Server socket. */
+ int cfd; /* Client socket. */
+ int len;
+ struct sockaddr_in addr1;
+ struct sockaddr_in addr2;
+
+ /* Create listening socket on a local dynamic port. */
+ lfd = socket(AF_INET, SOCK_STREAM, 0);
+ if(lfd < 0)
+ return -1;
+ memset((char *) &addr1, 0, sizeof(addr1));
+ addr1.sin_family = AF_INET;
+ addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ addr1.sin_port = 0;
+ if(bind(lfd, (struct sockaddr *) &addr1, sizeof(addr1)) ||
+ listen(lfd, 2) < 0) {
+ close(lfd);
+ return -1;
+ }
+
+ /* Get the allocated port. */
+ len = sizeof(addr1);
+ if(getsockname(lfd, (struct sockaddr *) &addr1, &len) < 0) {
+ close(lfd);
+ return -1;
+ }
+
+ /* Create the client socket. */
+ cfd = socket(AF_INET, SOCK_STREAM, 0);
+ if(cfd < 0) {
+ close(lfd);
+ return -1;
+ }
+
+ /* Request unblocking connection to the listening socket. */
+ curlx_nonblock(cfd, TRUE);
+ if(connect(cfd, (struct sockaddr *) &addr1, sizeof(addr1)) < 0 &&
+ errno != EINPROGRESS) {
+ close(lfd);
+ close(cfd);
+ return -1;
+ }
+
+ /* Get the client dynamic port for intrusion check below. */
+ len = sizeof(addr2);
+ if(getsockname(cfd, (struct sockaddr *) &addr2, &len) < 0) {
+ close(lfd);
+ close(cfd);
+ return -1;
+ }
+
+ /* Accept the incoming connection and get the server socket. */
+ curlx_nonblock(lfd, TRUE);
+ for(;;) {
+ len = sizeof(addr1);
+ sfd = accept(lfd, (struct sockaddr *) &addr1, &len);
+ if(sfd < 0) {
+ close(lfd);
+ close(cfd);
+ return -1;
+ }
+
+ /* Check for possible intrusion from an external process. */
+ if(addr1.sin_addr.s_addr == addr2.sin_addr.s_addr &&
+ addr1.sin_port == addr2.sin_port)
+ break;
+
+ /* Intrusion: reject incoming connection. */
+ close(sfd);
+ }
+
+ /* Done, return sockets and succeed. */
+ close(lfd);
+ curlx_nonblock(cfd, FALSE);
+ sv[0] = cfd;
+ sv[1] = sfd;
+ return 0;
+}
+
static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
int directions)
{
@@ -642,11 +734,12 @@ static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf,
{
struct ssl_connect_data *connssl = &conn->ssl[num];
struct Curl_easy *data = conn->data;
+ int buffsize;
int nread;
CURLcode cc = CURLE_RECV_ERROR;
if(pipe_ssloverssl(conn, num, SOS_READ) >= 0) {
- int buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
+ buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
cc = gskit_status(data, gsk_secure_soc_read(BACKEND->handle,
buf, buffsize, &nread),
"gsk_secure_soc_read()", CURLE_RECV_ERROR);
@@ -713,6 +806,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
conn->host.name;
const char *sni;
unsigned int protoflags = 0;
+ long timeout;
Qso_OverlappedIO_t commarea;
int sockpair[2];
static const int sobufsize = CURL_MAX_WRITE_SIZE;
@@ -763,7 +857,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
/* Establish a pipelining socket pair for SSL over SSL. */
if(conn->proxy_ssl[sockindex].use) {
- if(Curl_socketpair(0, 0, 0, sockpair))
+ if(inetsocketpair(sockpair))
return CURLE_SSL_CONNECT_ERROR;
BACKEND->localfd = sockpair[0];
BACKEND->remotefd = sockpair[1];
@@ -820,7 +914,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
if(!result) {
/* Compute the handshake timeout. Since GSKit granularity is 1 second,
we round up the required value. */
- long timeout = Curl_timeleft(data, NULL, TRUE);
+ timeout = Curl_timeleft(data, NULL, TRUE);
if(timeout < 0)
result = CURLE_OPERATION_TIMEDOUT;
else
@@ -927,13 +1021,14 @@ static CURLcode gskit_connect_step2(struct connectdata *conn, int sockindex,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
Qso_OverlappedIO_t cstat;
+ long timeout_ms;
struct timeval stmv;
CURLcode result;
/* Poll or wait for end of SSL asynchronous handshake. */
for(;;) {
- long timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
+ timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0)
timeout_ms = 0;
stmv.tv_sec = timeout_ms / 1000;
@@ -982,6 +1077,7 @@ static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex)
const char *cert = (const char *) NULL;
const char *certend;
const char *ptr;
+ int i;
CURLcode result;
/* SSL handshake done: gather certificate info and verify host. */
@@ -991,8 +1087,6 @@ static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex)
&cdev, &cdec),
"gsk_attribute_get_cert_info()", CURLE_SSL_CONNECT_ERROR) ==
CURLE_OK) {
- int i;
-
infof(data, "Server certificate:\n");
p = cdev;
for(i = 0; i++ < cdec; p++)
@@ -1065,7 +1159,8 @@ static CURLcode gskit_connect_common(struct connectdata *conn, int sockindex,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- timediff_t timeout_ms;
+ long timeout_ms;
+ Qso_OverlappedIO_t cstat;
CURLcode result = CURLE_OK;
*done = connssl->state == ssl_connection_complete;
@@ -1167,6 +1262,7 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct Curl_easy *data = conn->data;
+ ssize_t nread;
int what;
int rc;
char buf[120];
@@ -1174,10 +1270,8 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
if(!BACKEND->handle)
return 0;
-#ifndef CURL_DISABLE_FTP
if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
return 0;
-#endif
close_one(connssl, conn, sockindex);
rc = 0;
@@ -1185,8 +1279,6 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
SSL_SHUTDOWN_TIMEOUT);
for(;;) {
- ssize_t nread;
-
if(what < 0) {
/* anything that gets here is fatally bad */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index 3737d7c68..e224861c4 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -55,7 +55,6 @@
#include "strcase.h"
#include "warnless.h"
#include "x509asn1.h"
-#include "multiif.h"
#include "curl_printf.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -286,11 +285,11 @@ static CURLcode handshake(struct connectdata *conn,
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
gnutls_session_t session = BACKEND->session;
curl_socket_t sockfd = conn->sock[sockindex];
+ time_t timeout_ms;
+ int rc;
+ int what;
for(;;) {
- timediff_t timeout_ms;
- int rc;
-
/* check allowed time left */
timeout_ms = Curl_timeleft(data, NULL, duringconnect);
@@ -303,7 +302,7 @@ static CURLcode handshake(struct connectdata *conn,
/* if ssl is expecting something, check if it's available. */
if(connssl->connecting_state == ssl_connect_2_reading
|| connssl->connecting_state == ssl_connect_2_writing) {
- int what;
+
curl_socket_t writefd = ssl_connect_2_writing ==
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
curl_socket_t readfd = ssl_connect_2_reading ==
@@ -311,7 +310,7 @@ static CURLcode handshake(struct connectdata *conn,
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
nonblocking?0:
- timeout_ms?(time_t)timeout_ms:1000);
+ timeout_ms?timeout_ms:1000);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -957,6 +956,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
gnutls_pubkey_t key = NULL;
/* Result is returned to caller */
+ int ret = 0;
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
/* if a path wasn't specified, don't pin */
@@ -967,8 +967,6 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
return result;
do {
- int ret;
-
/* Begin Gyrations to get the public key */
gnutls_pubkey_init(&key);
@@ -1280,7 +1278,10 @@ gtls_connect_step3(struct connectdata *conn,
#define use_addr in_addr
#endif
unsigned char addrbuf[sizeof(struct use_addr)];
- size_t addrlen = 0;
+ unsigned char certaddr[sizeof(struct use_addr)];
+ size_t addrlen = 0, certaddrlen;
+ int i;
+ int ret = 0;
if(Curl_inet_pton(AF_INET, hostname, addrbuf) > 0)
addrlen = 4;
@@ -1290,13 +1291,10 @@ gtls_connect_step3(struct connectdata *conn,
#endif
if(addrlen) {
- unsigned char certaddr[sizeof(struct use_addr)];
- int i;
-
for(i = 0; ; i++) {
- size_t certaddrlen = sizeof(certaddr);
- int ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr,
- &certaddrlen, NULL);
+ certaddrlen = sizeof(certaddr);
+ ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr,
+ &certaddrlen, NULL);
/* If this happens, it wasn't an IP address. */
if(ret == GNUTLS_E_SHORT_MEMORY_BUFFER)
continue;
@@ -1451,9 +1449,6 @@ gtls_connect_step3(struct connectdata *conn,
}
else
infof(data, "ALPN, server did not agree to a protocol\n");
-
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
#endif
@@ -1466,6 +1461,8 @@ gtls_connect_step3(struct connectdata *conn,
already got it from the cache and asked to use it in the connection, it
might've been rejected and then a new one is in use now and we need to
detect that. */
+ bool incache;
+ void *ssl_sessionid;
void *connect_sessionid;
size_t connect_idsize = 0;
@@ -1474,9 +1471,6 @@ gtls_connect_step3(struct connectdata *conn,
connect_sessionid = malloc(connect_idsize); /* get a buffer for it */
if(connect_sessionid) {
- bool incache;
- void *ssl_sessionid;
-
/* extract session ID to the allocated buffer */
gnutls_session_get_data(session, connect_sessionid, &connect_idsize);
@@ -1608,7 +1602,7 @@ static ssize_t gtls_send(struct connectdata *conn,
static void close_one(struct ssl_connect_data *connssl)
{
if(BACKEND->session) {
- gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
+ gnutls_bye(BACKEND->session, GNUTLS_SHUT_RDWR);
gnutls_deinit(BACKEND->session);
BACKEND->session = NULL;
}
@@ -1637,10 +1631,12 @@ static void Curl_gtls_close(struct connectdata *conn, int sockindex)
static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ ssize_t result;
int retval = 0;
struct Curl_easy *data = conn->data;
+ bool done = FALSE;
+ char buf[120];
-#ifndef CURL_DISABLE_FTP
/* This has only been tested on the proftpd server, and the mod_tls code
sends a close notify alert without waiting for a close notify alert in
response. Thus we wait for a close notify alert from the server, but
@@ -1648,13 +1644,8 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
-#endif
if(BACKEND->session) {
- ssize_t result;
- bool done = FALSE;
- char buf[120];
-
while(!done) {
int what = SOCKET_READABLE(conn->sock[sockindex],
SSL_SHUTDOWN_TIMEOUT);
@@ -1767,6 +1758,12 @@ static int Curl_gtls_seed(struct Curl_easy *data)
if(!ssl_seeded || data->set.str[STRING_SSL_RANDOM_FILE] ||
data->set.str[STRING_SSL_EGDSOCKET]) {
+
+ /* TODO: to a good job seeding the RNG
+ This may involve the gcry_control function and these options:
+ GCRYCTL_SET_RANDOM_SEED_FILE
+ GCRYCTL_SET_RNDEGD_SOCKET
+ */
ssl_seeded = TRUE;
}
return 0;
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index e34ec9d13..27a9402cb 100644
--- a/lib/vtls/mbedtls.c
+++ b/lib/vtls/mbedtls.c
@@ -54,7 +54,6 @@
#include "parsedate.h"
#include "connect.h" /* for the connect timeout */
#include "select.h"
-#include "multiif.h"
#include "polarssl_threadlock.h"
/* The last 3 #include files should be in this order */
@@ -343,8 +342,7 @@ mbed_connect_step1(struct connectdata *conn,
if(SSL_SET_OPTION(key)) {
ret = mbedtls_pk_parse_keyfile(&BACKEND->pk, SSL_SET_OPTION(key),
SSL_SET_OPTION(key_passwd));
- if(ret == 0 && !(mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA) ||
- mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_ECKEY)))
+ if(ret == 0 && !mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA))
ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
if(ret) {
@@ -541,6 +539,13 @@ mbed_connect_step2(struct connectdata *conn,
data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+#ifdef HAS_ALPN
+ const char *next_protocol;
+#endif
+
+ char errorbuf[128];
+ errorbuf[0] = 0;
+
conn->recv[sockindex] = mbed_recv;
conn->send[sockindex] = mbed_send;
@@ -555,8 +560,6 @@ mbed_connect_step2(struct connectdata *conn,
return CURLE_OK;
}
else if(ret) {
- char errorbuf[128];
- errorbuf[0] = 0;
#ifdef MBEDTLS_ERROR_C
mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
#endif /* MBEDTLS_ERROR_C */
@@ -588,9 +591,6 @@ mbed_connect_step2(struct connectdata *conn,
else if(ret & MBEDTLS_X509_BADCERT_NOT_TRUSTED)
failf(data, "Cert verify failed: BADCERT_NOT_TRUSTED");
- else if(ret & MBEDTLS_X509_BADCERT_FUTURE)
- failf(data, "Cert verify failed: BADCERT_FUTURE");
-
return CURLE_PEER_FAILED_VERIFICATION;
}
@@ -664,7 +664,7 @@ mbed_connect_step2(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- const char *next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
+ next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
if(next_protocol) {
infof(data, "ALPN, server accepted to use %s\n", next_protocol);
@@ -684,8 +684,6 @@ mbed_connect_step2(struct connectdata *conn,
else {
infof(data, "ALPN, server did not agree to a protocol\n");
}
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
#endif
@@ -887,7 +885,7 @@ mbed_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ long timeout_ms;
int what;
/* check if the connection has already been established */
@@ -933,7 +931,7 @@ mbed_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
diff --git a/lib/vtls/mesalink.c b/lib/vtls/mesalink.c
index cab1e390b..db1411559 100644
--- a/lib/vtls/mesalink.c
+++ b/lib/vtls/mesalink.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2017 - 2018, Yiming Jing, <jingyiming@baidu.com>
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,17 +73,6 @@ struct ssl_backend_data
static Curl_recv mesalink_recv;
static Curl_send mesalink_send;
-static int do_file_type(const char *type)
-{
- if(!type || !type[0])
- return SSL_FILETYPE_PEM;
- if(strcasecompare(type, "PEM"))
- return SSL_FILETYPE_PEM;
- if(strcasecompare(type, "DER"))
- return SSL_FILETYPE_ASN1;
- return -1;
-}
-
/*
* This function loads all the client/CA certificates and CRLs. Setup the TLS
* layer and do all necessary magic.
@@ -94,6 +83,9 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
char *ciphers;
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
+ const char *const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+ const char *const ssl_capath = SSL_CONN_CONFIG(CApath);
struct in_addr addr4;
#ifdef ENABLE_IPV6
struct in6_addr addr6;
@@ -150,25 +142,21 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
}
SSL_CTX_set_verify(
- BACKEND->ctx, SSL_CONN_CONFIG(verifypeer) ?
- SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
+ BACKEND->ctx, verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
- if(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath)) {
- if(!SSL_CTX_load_verify_locations(BACKEND->ctx, SSL_CONN_CONFIG(CAfile),
- SSL_CONN_CONFIG(CApath))) {
- if(SSL_CONN_CONFIG(verifypeer)) {
+ if(ssl_cafile || ssl_capath) {
+ if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
+ if(verifypeer) {
failf(data,
"error setting certificate verify locations:\n"
" CAfile: %s\n CApath: %s",
- SSL_CONN_CONFIG(CAfile) ?
- SSL_CONN_CONFIG(CAfile) : "none",
- SSL_CONN_CONFIG(CApath) ?
- SSL_CONN_CONFIG(CApath) : "none");
+ ssl_cafile ? ssl_cafile : "none",
+ ssl_capath ? ssl_capath : "none");
return CURLE_SSL_CACERT_BADFILE;
}
infof(data,
- "error setting certificate verify locations,"
- " continuing anyway:\n");
+ "error setting certificate verify locations,"
+ " continuing anyway:\n");
}
else {
infof(data, "successfully set certificate verify locations:\n");
@@ -176,32 +164,8 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
infof(data,
" CAfile: %s\n"
" CApath: %s\n",
- SSL_CONN_CONFIG(CAfile)?
- SSL_CONN_CONFIG(CAfile): "none",
- SSL_CONN_CONFIG(CApath)?
- SSL_CONN_CONFIG(CApath): "none");
- }
-
- if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
- int file_type = do_file_type(SSL_SET_OPTION(cert_type));
-
- if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
- file_type) != 1) {
- failf(data, "unable to use client certificate (no key or wrong pass"
- " phrase?)");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- file_type = do_file_type(SSL_SET_OPTION(key_type));
- if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
- file_type) != 1) {
- failf(data, "unable to set private key");
- return CURLE_SSL_CONNECT_ERROR;
- }
- infof(data,
- "client cert: %s\n",
- SSL_CONN_CONFIG(clientcert)?
- SSL_CONN_CONFIG(clientcert): "none");
+ ssl_cafile ? ssl_cafile : "none",
+ ssl_capath ? ssl_capath : "none");
}
ciphers = SSL_CONN_CONFIG(cipher_list);
@@ -301,14 +265,14 @@ mesalink_connect_step2(struct connectdata *conn, int sockindex)
ret = SSL_connect(BACKEND->handle);
if(ret != SSL_SUCCESS) {
+ char error_buffer[MESALINK_MAX_ERROR_SZ];
int detail = SSL_get_error(BACKEND->handle, ret);
- if(SSL_ERROR_WANT_CONNECT == detail || SSL_ERROR_WANT_READ == detail) {
+ if(SSL_ERROR_WANT_CONNECT == detail) {
connssl->connecting_state = ssl_connect_2_reading;
return CURLE_OK;
}
else {
- char error_buffer[MESALINK_MAX_ERROR_SZ];
failf(data,
"SSL_connect failed with error %d: %s",
detail,
@@ -494,7 +458,7 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ time_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -543,8 +507,7 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
: CURL_SOCKET_BAD;
what = Curl_socket_check(
- readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ readfd, CURL_SOCKET_BAD, writefd, nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index a375f00da..08ee1aaaf 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -38,7 +38,6 @@
#include "select.h"
#include "vtls.h"
#include "llist.h"
-#include "multiif.h"
#include "curl_printf.h"
#include "nssg.h"
#include <nspr.h>
@@ -216,19 +215,11 @@ static const cipher_s cipherlist[] = {
{"dhe_rsa_chacha20_poly1305_sha_256",
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
#endif
-#ifdef TLS_AES_256_GCM_SHA384
- {"aes_128_gcm_sha_256", TLS_AES_128_GCM_SHA256},
- {"aes_256_gcm_sha_384", TLS_AES_256_GCM_SHA384},
- {"chacha20_poly1305_sha_256", TLS_CHACHA20_POLY1305_SHA256},
-#endif
};
-#if defined(WIN32)
+#ifdef WIN32
static const char *pem_library = "nsspem.dll";
static const char *trust_library = "nssckbi.dll";
-#elif defined(__APPLE__)
-static const char *pem_library = "libnsspem.dylib";
-static const char *trust_library = "libnssckbi.dylib";
#else
static const char *pem_library = "libnsspem.so";
static const char *trust_library = "libnssckbi.so";
@@ -386,7 +377,7 @@ static int is_file(const char *filename)
return 0;
if(stat(filename, &st) == 0)
- if(S_ISREG(st.st_mode) || S_ISFIFO(st.st_mode) || S_ISCHR(st.st_mode))
+ if(S_ISREG(st.st_mode))
return 1;
return 0;
@@ -581,19 +572,17 @@ static CURLcode nss_cache_crl(SECItem *crl_der)
/* acquire lock before call of CERT_CacheCRL() and accessing nss_crl_list */
PR_Lock(nss_crllock);
- if(SECSuccess != CERT_CacheCRL(db, crl_der)) {
- /* unable to cache CRL */
+ /* store the CRL item so that we can free it in Curl_nss_cleanup() */
+ if(insert_wrapped_ptr(&nss_crl_list, crl_der) != CURLE_OK) {
SECITEM_FreeItem(crl_der, PR_TRUE);
PR_Unlock(nss_crllock);
- return CURLE_SSL_CRL_BADFILE;
+ return CURLE_OUT_OF_MEMORY;
}
- /* store the CRL item so that we can free it in Curl_nss_cleanup() */
- if(insert_wrapped_ptr(&nss_crl_list, crl_der) != CURLE_OK) {
- if(SECSuccess == CERT_UncacheCRL(db, crl_der))
- SECITEM_FreeItem(crl_der, PR_TRUE);
+ if(SECSuccess != CERT_CacheCRL(db, crl_der)) {
+ /* unable to cache CRL */
PR_Unlock(nss_crllock);
- return CURLE_OUT_OF_MEMORY;
+ return CURLE_SSL_CRL_BADFILE;
}
/* we need to clear session cache, so that the CRL could take effect */
@@ -691,10 +680,7 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex,
tmp = SECMOD_WaitForAnyTokenEvent(pem_module, 0, 0);
if(tmp)
PK11_FreeSlot(tmp);
- if(!PK11_IsPresent(slot)) {
- PK11_FreeSlot(slot);
- return CURLE_SSL_CERTPROBLEM;
- }
+ PK11_IsPresent(slot);
status = PK11_Authenticate(slot, PR_TRUE, SSL_SET_OPTION(key_passwd));
PK11_FreeSlot(slot);
@@ -857,8 +843,6 @@ static void HandshakeCallback(PRFileDesc *sock, void *arg)
!memcmp(ALPN_HTTP_1_1, buf, ALPN_HTTP_1_1_LENGTH)) {
conn->negnpn = CURL_HTTP_VERSION_1_1;
}
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
}
@@ -1321,8 +1305,6 @@ static void nss_unload_module(SECMODModule **pmod)
static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
{
NSSInitParameters initparams;
- PRErrorCode err;
- const char *err_name;
if(nss_context != NULL)
return CURLE_OK;
@@ -1343,9 +1325,7 @@ static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
if(nss_context != NULL)
return CURLE_OK;
- err = PR_GetError();
- err_name = nss_error_to_name(err);
- infof(data, "Unable to initialize NSS database: %d (%s)\n", err, err_name);
+ infof(data, "Unable to initialize NSS database\n");
}
infof(data, "Initializing NSS with certpath: none\n");
@@ -1355,9 +1335,7 @@ static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
if(nss_context != NULL)
return CURLE_OK;
- err = PR_GetError();
- err_name = nss_error_to_name(err);
- failf(data, "Unable to initialize NSS: %d (%s)", err, err_name);
+ infof(data, "Unable to initialize NSS\n");
return CURLE_SSL_CACERT_BADFILE;
}
@@ -1429,7 +1407,7 @@ static int Curl_nss_init(void)
{
/* curl_global_init() is not thread-safe so this test is ok */
if(nss_initlock == NULL) {
- PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
+ PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 256);
nss_initlock = PR_NewLock();
nss_crllock = PR_NewLock();
nss_findslot_lock = PR_NewLock();
@@ -1734,16 +1712,20 @@ static CURLcode nss_init_sslver(SSLVersionRange *sslver,
CURLcode result;
const long min = SSL_CONN_CONFIG(version);
const long max = SSL_CONN_CONFIG(version_max);
- SSLVersionRange vrange;
+
+ /* map CURL_SSLVERSION_DEFAULT to NSS default */
+ if(min == CURL_SSLVERSION_DEFAULT || max == CURL_SSLVERSION_MAX_DEFAULT) {
+ /* map CURL_SSLVERSION_DEFAULT to NSS default */
+ if(SSL_VersionRangeGetDefault(ssl_variant_stream, sslver) != SECSuccess)
+ return CURLE_SSL_CONNECT_ERROR;
+ /* ... but make sure we use at least TLSv1.0 according to libcurl API */
+ if(sslver->min < SSL_LIBRARY_VERSION_TLS_1_0)
+ sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
+ }
switch(min) {
case CURL_SSLVERSION_TLSv1:
case CURL_SSLVERSION_DEFAULT:
- /* Bump our minimum TLS version if NSS has stricter requirements. */
- if(SSL_VersionRangeGetDefault(ssl_variant_stream, &vrange) != SECSuccess)
- return CURLE_SSL_CONNECT_ERROR;
- if(sslver->min < vrange.min)
- sslver->min = vrange.min;
break;
default:
result = nss_sslver_from_curl(&sslver->min, min);
@@ -1840,6 +1822,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
/* list of all NSS objects we need to destroy in Curl_nss_close() */
Curl_llist_init(&BACKEND->obj_list, nss_destroy_object);
+ /* FIXME. NSS doesn't support multiple databases open at the same time. */
PR_Lock(nss_initlock);
result = nss_init(conn->data);
if(result) {
@@ -2127,7 +2110,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
/* check timeout situation */
- const timediff_t time_left = Curl_timeleft(data, NULL, TRUE);
+ const time_t time_left = Curl_timeleft(data, NULL, TRUE);
if(time_left < 0) {
failf(data, "timed out before SSL handshake");
result = CURLE_OPERATION_TIMEDOUT;
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index 760758d23..eff5c2106 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -25,6 +25,11 @@
* but vtls.c should ever call or use these functions.
*/
+/*
+ * The original SSLeay-using code for curl was written by Linas Vepstas and
+ * Sampo Kellomaki 1998.
+ */
+
#include "curl_setup.h"
#ifdef USE_OPENSSL
@@ -43,8 +48,6 @@
#include "vtls.h"
#include "strcase.h"
#include "hostcheck.h"
-#include "multiif.h"
-#include "strerror.h"
#include "curl_printf.h"
#include <openssl/ssl.h>
#include <openssl/rand.h>
@@ -71,7 +74,7 @@
#endif
#if (OPENSSL_VERSION_NUMBER >= 0x0090700fL) && /* 0.9.7 or later */ \
- !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_UI_CONSOLE)
+ !defined(OPENSSL_NO_ENGINE)
#define USE_OPENSSL_ENGINE
#include <openssl/engine.h>
#endif
@@ -152,10 +155,6 @@
#define HAVE_X509_GET0_SIGNATURE 1
#endif
-#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) /* 1.0.2 or later */
-#define HAVE_SSL_GET_SHUTDOWN 1
-#endif
-
#if OPENSSL_VERSION_NUMBER >= 0x10002003L && \
OPENSSL_VERSION_NUMBER <= 0x10002FFFL && \
!defined(OPENSSL_NO_COMP)
@@ -392,11 +391,7 @@ static const char *SSL_ERROR_to_str(int err)
*/
static char *ossl_strerror(unsigned long error, char *buf, size_t size)
{
-#ifdef OPENSSL_IS_BORINGSSL
- ERR_error_string_n((uint32_t)error, buf, size);
-#else
ERR_error_string_n(error, buf, size);
-#endif
return buf;
}
@@ -1026,8 +1021,14 @@ static int Curl_ossl_init(void)
ENGINE_load_builtin_engines();
#endif
-/* CONF_MFLAGS_DEFAULT_SECTION was introduced some time between 0.9.8b and
- 0.9.8e */
+ /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately
+ that function makes an exit() call on wrongly formatted config files
+ which makes it hard to use in some situations. OPENSSL_config() itself
+ calls CONF_modules_load_file() and we use that instead and we ignore
+ its return code! */
+
+ /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and
+ 0.9.8e */
#ifndef CONF_MFLAGS_DEFAULT_SECTION
#define CONF_MFLAGS_DEFAULT_SECTION 0x0
#endif
@@ -1306,7 +1307,6 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
int err;
bool done = FALSE;
-#ifndef CURL_DISABLE_FTP
/* This has only been tested on the proftpd server, and the mod_tls code
sends a close notify alert without waiting for a close notify alert in
response. Thus we wait for a close notify alert from the server, but
@@ -1314,7 +1314,6 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
(void)SSL_shutdown(BACKEND->handle);
-#endif
if(BACKEND->handle) {
buffsize = (int)sizeof(buf);
@@ -1534,13 +1533,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);
if(altnames) {
-#ifdef OPENSSL_IS_BORINGSSL
- size_t numalts;
- size_t i;
-#else
int numalts;
int i;
-#endif
bool dnsmatched = FALSE;
bool ipmatched = FALSE;
@@ -1570,10 +1564,11 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
assumed that the data returned by ASN1_STRING_data() is null
terminated or does not contain embedded nulls." But also that
"The actual format of the data will depend on the actual string
- type itself: for example for an IA5String the data will be ASCII"
+ type itself: for example for and IA5String the data will be ASCII"
- It has been however verified that in 0.9.6 and 0.9.7, IA5String
- is always zero-terminated.
+ Gisle researched the OpenSSL sources:
+ "I checked the 0.9.6 and 0.9.8 sources before my patch and
+ it always 0-terminates an IA5String."
*/
if((altlen == strlen(altptr)) &&
/* if this isn't true, there was an embedded zero in the name
@@ -1637,7 +1632,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
/* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
is already UTF-8 encoded. We check for this case and copy the raw
string manually to avoid the problem. This code can be made
- conditional in the future when OpenSSL has been fixed. */
+ conditional in the future when OpenSSL has been fixed. Work-around
+ brought by Alexis S. L. Carvalho. */
if(tmp) {
if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
j = ASN1_STRING_length(tmp);
@@ -2157,101 +2153,9 @@ get_ssl_version_txt(SSL *ssl)
}
#endif
-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
static CURLcode
-set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
-{
- /* first, TLS min version... */
- long curl_ssl_version_min = SSL_CONN_CONFIG(version);
- long curl_ssl_version_max;
-
- /* convert cURL min SSL version option to OpenSSL constant */
-#if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER)
- uint16_t ossl_ssl_version_min = 0;
- uint16_t ossl_ssl_version_max = 0;
-#else
- long ossl_ssl_version_min = 0;
- long ossl_ssl_version_max = 0;
-#endif
- switch(curl_ssl_version_min) {
- case CURL_SSLVERSION_TLSv1: /* TLS 1.x */
- case CURL_SSLVERSION_TLSv1_0:
- ossl_ssl_version_min = TLS1_VERSION;
- break;
- case CURL_SSLVERSION_TLSv1_1:
- ossl_ssl_version_min = TLS1_1_VERSION;
- break;
- case CURL_SSLVERSION_TLSv1_2:
- ossl_ssl_version_min = TLS1_2_VERSION;
- break;
-#ifdef TLS1_3_VERSION
- case CURL_SSLVERSION_TLSv1_3:
- ossl_ssl_version_min = TLS1_3_VERSION;
- break;
-#endif
- }
-
- /* CURL_SSLVERSION_DEFAULT means that no option was selected.
- We don't want to pass 0 to SSL_CTX_set_min_proto_version as
- it would enable all versions down to the lowest supported by
- the library.
- So we skip this, and stay with the OS default
- */
- if(curl_ssl_version_min != CURL_SSLVERSION_DEFAULT) {
- if(!SSL_CTX_set_min_proto_version(ctx, ossl_ssl_version_min)) {
- return CURLE_SSL_CONNECT_ERROR;
- }
- }
-
- /* ... then, TLS max version */
- curl_ssl_version_max = SSL_CONN_CONFIG(version_max);
-
- /* convert cURL max SSL version option to OpenSSL constant */
- ossl_ssl_version_max = 0;
- switch(curl_ssl_version_max) {
- case CURL_SSLVERSION_MAX_TLSv1_0:
- ossl_ssl_version_max = TLS1_VERSION;
- break;
- case CURL_SSLVERSION_MAX_TLSv1_1:
- ossl_ssl_version_max = TLS1_1_VERSION;
- break;
- case CURL_SSLVERSION_MAX_TLSv1_2:
- ossl_ssl_version_max = TLS1_2_VERSION;
- break;
-#ifdef TLS1_3_VERSION
- case CURL_SSLVERSION_MAX_TLSv1_3:
- ossl_ssl_version_max = TLS1_3_VERSION;
- break;
-#endif
- case CURL_SSLVERSION_MAX_NONE: /* none selected */
- case CURL_SSLVERSION_MAX_DEFAULT: /* max selected */
- default:
- /* SSL_CTX_set_max_proto_version states that:
- setting the maximum to 0 will enable
- protocol versions up to the highest version
- supported by the library */
- ossl_ssl_version_max = 0;
- break;
- }
-
- if(!SSL_CTX_set_max_proto_version(ctx, ossl_ssl_version_max)) {
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- return CURLE_OK;
-}
-#endif
-
-#ifdef OPENSSL_IS_BORINGSSL
-typedef uint32_t ctx_option_t;
-#else
-typedef long ctx_option_t;
-#endif
-
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L) /* 1.1.0 */
-static CURLcode
-set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
- struct connectdata *conn, int sockindex)
+set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
+ int sockindex)
{
#if (OPENSSL_VERSION_NUMBER < 0x1000100FL) || !defined(TLS1_3_VERSION)
/* convoluted #if condition just to avoid compiler warnings on unused
@@ -2323,7 +2227,6 @@ set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
}
return CURLE_OK;
}
-#endif
/* The "new session" callback must return zero if the session can be removed
* or non-zero if the session has been put into the session cache.
@@ -2390,8 +2293,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
X509_LOOKUP *lookup = NULL;
curl_socket_t sockfd = conn->sock[sockindex];
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- ctx_option_t ctx_options = 0;
-
+ long ctx_options = 0;
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
bool sni;
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
@@ -2554,66 +2456,48 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#endif
switch(ssl_version) {
- /* "--sslv2" option means SSLv2 only, disable all others */
- case CURL_SSLVERSION_SSLv2:
-#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
- SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL2_VERSION);
- SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL2_VERSION);
-#else
- ctx_options |= SSL_OP_NO_SSLv3;
- ctx_options |= SSL_OP_NO_TLSv1;
-# if OPENSSL_VERSION_NUMBER >= 0x1000100FL
- ctx_options |= SSL_OP_NO_TLSv1_1;
- ctx_options |= SSL_OP_NO_TLSv1_2;
-# ifdef TLS1_3_VERSION
- ctx_options |= SSL_OP_NO_TLSv1_3;
-# endif
-# endif
+ case CURL_SSLVERSION_SSLv3:
+ ctx_options |= SSL_OP_NO_SSLv2;
+ ctx_options |= SSL_OP_NO_TLSv1;
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ ctx_options |= SSL_OP_NO_TLSv1_1;
+ ctx_options |= SSL_OP_NO_TLSv1_2;
+#ifdef TLS1_3_VERSION
+ ctx_options |= SSL_OP_NO_TLSv1_3;
#endif
- break;
-
- /* "--sslv3" option means SSLv3 only, disable all others */
- case CURL_SSLVERSION_SSLv3:
-#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
- SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL3_VERSION);
- SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL3_VERSION);
-#else
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_TLSv1;
-# if OPENSSL_VERSION_NUMBER >= 0x1000100FL
- ctx_options |= SSL_OP_NO_TLSv1_1;
- ctx_options |= SSL_OP_NO_TLSv1_2;
-# ifdef TLS1_3_VERSION
- ctx_options |= SSL_OP_NO_TLSv1_3;
-# endif
-# endif
#endif
- break;
+ break;
- /* "--tlsv<x.y>" options mean TLS >= version <x.y> */
- case CURL_SSLVERSION_DEFAULT:
- case CURL_SSLVERSION_TLSv1: /* TLS >= version 1.0 */
- case CURL_SSLVERSION_TLSv1_0: /* TLS >= version 1.0 */
- case CURL_SSLVERSION_TLSv1_1: /* TLS >= version 1.1 */
- case CURL_SSLVERSION_TLSv1_2: /* TLS >= version 1.2 */
- case CURL_SSLVERSION_TLSv1_3: /* TLS >= version 1.3 */
- /* asking for any TLS version as the minimum, means no SSL versions
- allowed */
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_SSLv3;
-
-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
- result = set_ssl_version_min_max(BACKEND->ctx, conn);
-#else
- result = set_ssl_version_min_max_legacy(&ctx_options, conn, sockindex);
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ case CURL_SSLVERSION_TLSv1_0:
+ case CURL_SSLVERSION_TLSv1_1:
+ case CURL_SSLVERSION_TLSv1_2:
+ case CURL_SSLVERSION_TLSv1_3:
+ /* asking for any TLS version as the minimum, means no SSL versions
+ allowed */
+ ctx_options |= SSL_OP_NO_SSLv2;
+ ctx_options |= SSL_OP_NO_SSLv3;
+ result = set_ssl_version_min_max(&ctx_options, conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
+ break;
+
+ case CURL_SSLVERSION_SSLv2:
+ ctx_options |= SSL_OP_NO_SSLv3;
+ ctx_options |= SSL_OP_NO_TLSv1;
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ ctx_options |= SSL_OP_NO_TLSv1_1;
+ ctx_options |= SSL_OP_NO_TLSv1_2;
+#ifdef TLS1_3_VERSION
+ ctx_options |= SSL_OP_NO_TLSv1_3;
#endif
- if(result != CURLE_OK)
- return result;
- break;
+#endif
+ break;
- default:
- failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
- return CURLE_SSL_CONNECT_ERROR;
+ default:
+ failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
+ return CURLE_SSL_CONNECT_ERROR;
}
SSL_CTX_set_options(BACKEND->ctx, ctx_options);
@@ -2769,11 +2653,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
/* Try building a chain using issuers in the trusted store first to avoid
- problems with server-sent legacy intermediates. Newer versions of
- OpenSSL do alternate chain checking by default which gives us the same
- fix without as much of a performance hit (slight), so we prefer that if
- available.
- https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
+ problems with server-sent legacy intermediates.
+ Newer versions of OpenSSL do alternate chain checking by default which
+ gives us the same fix without as much of a performance hit (slight), so we
+ prefer that if available.
+ https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
*/
#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
if(verifypeer) {
@@ -3033,9 +2917,6 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
}
else
infof(data, "ALPN, server did not agree to a protocol\n");
-
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
#endif
@@ -3153,12 +3034,6 @@ static int X509V3_ext(struct Curl_easy *data,
return 0; /* all is fine */
}
-#ifdef OPENSSL_IS_BORINGSSL
-typedef size_t numcert_t;
-#else
-typedef int numcert_t;
-#endif
-
static CURLcode get_cert_chain(struct connectdata *conn,
struct ssl_connect_data *connssl)
@@ -3167,7 +3042,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
STACK_OF(X509) *sk;
int i;
struct Curl_easy *data = conn->data;
- numcert_t numcerts;
+ int numcerts;
BIO *mem;
sk = SSL_get_peer_cert_chain(BACKEND->handle);
@@ -3177,14 +3052,14 @@ static CURLcode get_cert_chain(struct connectdata *conn,
numcerts = sk_X509_num(sk);
- result = Curl_ssl_init_certinfo(data, (int)numcerts);
+ result = Curl_ssl_init_certinfo(data, numcerts);
if(result) {
return result;
}
mem = BIO_new(BIO_s_mem());
- for(i = 0; i < (int)numcerts; i++) {
+ for(i = 0; i < numcerts; i++) {
ASN1_INTEGER *num;
X509 *x = sk_X509_value(sk, i);
EVP_PKEY *pubkey = NULL;
@@ -3210,25 +3085,18 @@ static CURLcode get_cert_chain(struct connectdata *conn,
#if defined(HAVE_X509_GET0_SIGNATURE) && defined(HAVE_X509_GET0_EXTENSIONS)
{
- const X509_ALGOR *sigalg = NULL;
- X509_PUBKEY *xpubkey = NULL;
- ASN1_OBJECT *pubkeyoid = NULL;
-
- X509_get0_signature(&psig, &sigalg, x);
- if(sigalg) {
- i2a_ASN1_OBJECT(mem, sigalg->algorithm);
- push_certinfo("Signature Algorithm", i);
- }
-
- xpubkey = X509_get_X509_PUBKEY(x);
- if(xpubkey) {
- X509_PUBKEY_get0_param(&pubkeyoid, NULL, NULL, NULL, xpubkey);
- if(pubkeyoid) {
- i2a_ASN1_OBJECT(mem, pubkeyoid);
+ const X509_ALGOR *palg = NULL;
+ ASN1_STRING *a = ASN1_STRING_new();
+ if(a) {
+ X509_get0_signature(&psig, &palg, x);
+ X509_signature_print(mem, ARG2_X509_signature_print palg, a);
+ ASN1_STRING_free(a);
+
+ if(palg) {
+ i2a_ASN1_OBJECT(mem, palg->algorithm);
push_certinfo("Public Key Algorithm", i);
}
}
-
X509V3_ext(data, i, X509_get0_extensions(x));
}
#else
@@ -3280,7 +3148,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
const BIGNUM *e;
RSA_get0_key(rsa, &n, &e, NULL);
- BIO_printf(mem, "%d", BN_num_bits(n));
+ BN_print(mem, n);
push_certinfo("RSA Public Key", i);
print_pubkey_BN(rsa, n, i);
print_pubkey_BN(rsa, e, i);
@@ -3355,6 +3223,11 @@ static CURLcode get_cert_chain(struct connectdata *conn,
#endif
break;
}
+#if 0
+ case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */
+ /* left TODO */
+ break;
+#endif
}
EVP_PKEY_free(pubkey);
}
@@ -3405,6 +3278,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
if(len1 < 1)
break; /* failed */
+ /* https://www.openssl.org/docs/crypto/buffer.html */
buff1 = temp = malloc(len1);
if(!buff1)
break; /* failed */
@@ -3426,6 +3300,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
result = Curl_pin_peer_pubkey(data, pinnedpubkey, buff1, len1);
} while(0);
+ /* https://www.openssl.org/docs/crypto/buffer.html */
if(buff1)
free(buff1);
@@ -3655,7 +3530,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ time_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -3702,7 +3577,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
+ nonblocking?0:timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -3826,8 +3701,8 @@ static ssize_t ossl_send(struct connectdata *conn,
*curlcode = CURLE_AGAIN;
return -1;
case SSL_ERROR_SYSCALL:
- Curl_strerror(SOCKERRNO, error_buffer, sizeof(error_buffer));
- failf(conn->data, OSSL_PACKAGE " SSL_write: %s", error_buffer);
+ failf(conn->data, "SSL_write() returned SYSCALL, errno = %d",
+ SOCKERRNO);
*curlcode = CURLE_SEND_ERROR;
return -1;
case SSL_ERROR_SSL:
@@ -3881,24 +3756,13 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
switch(err) {
case SSL_ERROR_NONE: /* this is not an error */
- break;
case SSL_ERROR_ZERO_RETURN: /* no more data */
- /* close_notify alert */
- if(num == FIRSTSOCKET)
- /* mark the connection for close if it is indeed the control
- connection */
- connclose(conn, "TLS close_notify");
break;
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
/* there's data pending, re-invoke SSL_read() */
*curlcode = CURLE_AGAIN;
return -1;
- case SSL_ERROR_SYSCALL:
- Curl_strerror(SOCKERRNO, error_buffer, sizeof(error_buffer));
- failf(conn->data, OSSL_PACKAGE " SSL_read: %s", error_buffer);
- *curlcode = CURLE_RECV_ERROR;
- return -1;
default:
/* openssl/ssl.h for SSL_ERROR_SYSCALL says "look at error stack/return
value/errno" */
@@ -3955,11 +3819,7 @@ static size_t Curl_ossl_version(char *buffer, size_t size)
sub[0]='\0';
}
- return msnprintf(buffer, size, "%s/%lx.%lx.%lx%s"
-#ifdef OPENSSL_FIPS
- "-fips"
-#endif
- ,
+ return msnprintf(buffer, size, "%s/%lx.%lx.%lx%s",
OSSL_PACKAGE,
(ssleay_value>>28)&0xf,
(ssleay_value>>20)&0xff,
diff --git a/lib/vtls/polarssl.c b/lib/vtls/polarssl.c
index 9e7dd9043..6ecabe94b 100644
--- a/lib/vtls/polarssl.c
+++ b/lib/vtls/polarssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -55,7 +55,6 @@
#include "select.h"
#include "strcase.h"
#include "polarssl_threadlock.h"
-#include "multiif.h"
#include "curl_printf.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -594,8 +593,6 @@ polarssl_connect_step2(struct connectdata *conn,
}
else
infof(data, "ALPN, server did not agree to a protocol\n");
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
#endif
@@ -734,7 +731,7 @@ polarssl_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ long timeout_ms;
int what;
/* check if the connection has already been established */
@@ -781,7 +778,7 @@ polarssl_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
+ nonblocking?0:timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -911,7 +908,9 @@ const struct Curl_ssl Curl_ssl_polarssl = {
Curl_none_check_cxn, /* check_cxn */
Curl_none_shutdown, /* shutdown */
Curl_polarssl_data_pending, /* data_pending */
- /* This might cause libcurl to use a weeker random! */
+ /* This might cause libcurl to use a weeker random!
+ * TODO: use Polarssl's CTR-DRBG or HMAC-DRBG
+ */
Curl_none_random, /* random */
Curl_none_cert_status_request, /* cert_status_request */
Curl_polarssl_connect, /* connect */
diff --git a/lib/vtls/polarssl_threadlock.c b/lib/vtls/polarssl_threadlock.c
index 27c94b11e..dd5fbd7ec 100644
--- a/lib/vtls/polarssl_threadlock.c
+++ b/lib/vtls/polarssl_threadlock.c
@@ -23,15 +23,16 @@
#include "curl_setup.h"
#if (defined(USE_POLARSSL) || defined(USE_MBEDTLS)) && \
- ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
- (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
-
-#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
-# include <pthread.h>
-# define POLARSSL_MUTEX_T pthread_mutex_t
-#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
-# include <process.h>
-# define POLARSSL_MUTEX_T HANDLE
+ (defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32))
+
+#if defined(USE_THREADS_POSIX)
+# ifdef HAVE_PTHREAD_H
+# include <pthread.h>
+# endif
+#elif defined(USE_THREADS_WIN32)
+# ifdef HAVE_PROCESS_H
+# include <process.h>
+# endif
#endif
#include "polarssl_threadlock.h"
@@ -49,23 +50,25 @@ static POLARSSL_MUTEX_T *mutex_buf = NULL;
int Curl_polarsslthreadlock_thread_setup(void)
{
int i;
+ int ret;
mutex_buf = calloc(NUMT * sizeof(POLARSSL_MUTEX_T), 1);
if(!mutex_buf)
return 0; /* error, no number of threads defined */
+#ifdef HAVE_PTHREAD_H
for(i = 0; i < NUMT; i++) {
- int ret;
-#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
ret = pthread_mutex_init(&mutex_buf[i], NULL);
if(ret)
return 0; /* pthread_mutex_init failed */
-#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
+ }
+#elif defined(HAVE_PROCESS_H)
+ for(i = 0; i < NUMT; i++) {
mutex_buf[i] = CreateMutex(0, FALSE, 0);
if(mutex_buf[i] == 0)
return 0; /* CreateMutex failed */
-#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
}
+#endif /* HAVE_PTHREAD_H */
return 1; /* OK */
}
@@ -73,22 +76,24 @@ int Curl_polarsslthreadlock_thread_setup(void)
int Curl_polarsslthreadlock_thread_cleanup(void)
{
int i;
+ int ret;
if(!mutex_buf)
return 0; /* error, no threads locks defined */
+#ifdef HAVE_PTHREAD_H
for(i = 0; i < NUMT; i++) {
- int ret;
-#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
ret = pthread_mutex_destroy(&mutex_buf[i]);
if(ret)
return 0; /* pthread_mutex_destroy failed */
-#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
+ }
+#elif defined(HAVE_PROCESS_H)
+ for(i = 0; i < NUMT; i++) {
ret = CloseHandle(mutex_buf[i]);
if(!ret)
return 0; /* CloseHandle failed */
-#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
}
+#endif /* HAVE_PTHREAD_H */
free(mutex_buf);
mutex_buf = NULL;
@@ -97,47 +102,51 @@ int Curl_polarsslthreadlock_thread_cleanup(void)
int Curl_polarsslthreadlock_lock_function(int n)
{
+ int ret;
+#ifdef HAVE_PTHREAD_H
if(n < NUMT) {
- int ret;
-#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
ret = pthread_mutex_lock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
"Error: polarsslthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
-#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
+ }
+#elif defined(HAVE_PROCESS_H)
+ if(n < NUMT) {
ret = (WaitForSingleObject(mutex_buf[n], INFINITE) == WAIT_FAILED?1:0);
if(ret) {
DEBUGF(fprintf(stderr,
"Error: polarsslthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
-#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
}
+#endif /* HAVE_PTHREAD_H */
return 1; /* OK */
}
int Curl_polarsslthreadlock_unlock_function(int n)
{
+ int ret;
+#ifdef HAVE_PTHREAD_H
if(n < NUMT) {
- int ret;
-#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
ret = pthread_mutex_unlock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
"Error: polarsslthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_unlock failed */
}
-#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
+ }
+#elif defined(HAVE_PROCESS_H)
+ if(n < NUMT) {
ret = ReleaseMutex(mutex_buf[n]);
if(!ret) {
DEBUGF(fprintf(stderr,
"Error: polarsslthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
-#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
}
+#endif /* HAVE_PTHREAD_H */
return 1; /* OK */
}
diff --git a/lib/vtls/polarssl_threadlock.h b/lib/vtls/polarssl_threadlock.h
index 122647528..dda5359b8 100644
--- a/lib/vtls/polarssl_threadlock.h
+++ b/lib/vtls/polarssl_threadlock.h
@@ -26,8 +26,13 @@
#if (defined USE_POLARSSL) || (defined USE_MBEDTLS)
-#if (defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
- (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H))
+#if defined(USE_THREADS_POSIX)
+# define POLARSSL_MUTEX_T pthread_mutex_t
+#elif defined(USE_THREADS_WIN32)
+# define POLARSSL_MUTEX_T HANDLE
+#endif
+
+#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
int Curl_polarsslthreadlock_thread_setup(void);
int Curl_polarsslthreadlock_thread_cleanup(void);
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c
index bbd2fe921..39ac080e8 100644
--- a/lib/vtls/schannel.c
+++ b/lib/vtls/schannel.c
@@ -58,7 +58,6 @@
#include "warnless.h"
#include "x509asn1.h"
#include "curl_printf.h"
-#include "multiif.h"
#include "system_win32.h"
/* The last #include file should be: */
@@ -523,6 +522,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#endif
schannel_cred.dwFlags = SCH_CRED_AUTO_CRED_VALIDATION;
+ /* TODO s/data->set.ssl.no_revoke/SSL_SET_OPTION(no_revoke)/g */
if(data->set.ssl.no_revoke) {
schannel_cred.dwFlags |= SCH_CRED_IGNORE_NO_REVOCATION_CHECK |
SCH_CRED_IGNORE_REVOCATION_OFFLINE;
@@ -868,11 +868,13 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
unsigned char *reallocated_buffer;
+ size_t reallocated_length;
SecBuffer outbuf[3];
SecBufferDesc outbuf_desc;
SecBuffer inbuf[2];
SecBufferDesc inbuf_desc;
SECURITY_STATUS sspi_status = SEC_E_OK;
+ TCHAR *host_name;
CURLcode result;
bool doread;
char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
@@ -915,7 +917,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
if(BACKEND->encdata_length - BACKEND->encdata_offset <
CURL_SCHANNEL_BUFFER_FREE_SIZE) {
/* increase internal encrypted data buffer */
- size_t reallocated_length = BACKEND->encdata_offset +
+ reallocated_length = BACKEND->encdata_offset +
CURL_SCHANNEL_BUFFER_FREE_SIZE;
reallocated_buffer = realloc(BACKEND->encdata_buffer,
reallocated_length);
@@ -931,7 +933,6 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
}
for(;;) {
- TCHAR *host_name;
if(doread) {
/* read encrypted handshake data from socket */
result = Curl_read_plain(conn->sock[sockindex],
@@ -1181,7 +1182,6 @@ struct Adder_args
struct connectdata *conn;
CURLcode result;
int idx;
- int certs_count;
};
static bool
@@ -1192,9 +1192,7 @@ add_cert_to_certinfo(const CERT_CONTEXT *ccert_context, void *raw_arg)
if(valid_cert_encoding(ccert_context)) {
const char *beg = (const char *) ccert_context->pbCertEncoded;
const char *end = beg + ccert_context->cbCertEncoded;
- int insert_index = (args->certs_count - 1) - args->idx;
- args->result = Curl_extract_certinfo(args->conn, insert_index, beg, end);
- args->idx++;
+ args->result = Curl_extract_certinfo(args->conn, (args->idx)++, beg, end);
}
return args->result == CURLE_OK;
}
@@ -1271,8 +1269,6 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
else
infof(data, "ALPN, server did not agree to a protocol\n");
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
#endif
@@ -1329,7 +1325,6 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
struct Adder_args args;
args.conn = conn;
args.idx = 0;
- args.certs_count = certs_count;
traverse_cert_store(ccert_context, add_cert_to_certinfo, &args);
result = args.result;
}
@@ -1351,7 +1346,7 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ time_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -1398,7 +1393,7 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
connssl->connecting_state ? sockfd : CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL/TLS socket, errno: %d", SOCKERRNO);
@@ -1548,7 +1543,7 @@ schannel_send(struct connectdata *conn, int sockindex,
/* send entire message or fail */
while(len > (size_t)written) {
ssize_t this_write;
- timediff_t timeleft;
+ time_t timeleft;
int what;
this_write = 0;
@@ -2134,9 +2129,14 @@ static CURLcode Curl_schannel_random(struct Curl_easy *data UNUSED_PARAM,
static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
const char *pinnedpubkey)
{
+ SECURITY_STATUS sspi_status;
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
CERT_CONTEXT *pCertContextServer = NULL;
+ const char *x509_der;
+ DWORD x509_der_len;
+ curl_X509certificate x509_parsed;
+ curl_asn1Element *pubkey;
/* Result is returned to caller */
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -2146,12 +2146,6 @@ static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
return CURLE_OK;
do {
- SECURITY_STATUS sspi_status;
- const char *x509_der;
- DWORD x509_der_len;
- curl_X509certificate x509_parsed;
- curl_asn1Element *pubkey;
-
sspi_status =
s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
SECPKG_ATTR_REMOTE_CERT_CONTEXT,
diff --git a/lib/vtls/schannel_verify.c b/lib/vtls/schannel_verify.c
index 1bdf50a55..5a09e969e 100644
--- a/lib/vtls/schannel_verify.c
+++ b/lib/vtls/schannel_verify.c
@@ -111,7 +111,7 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
*/
ca_file_handle = CreateFile(ca_file_tstr,
GENERIC_READ,
- FILE_SHARE_READ,
+ 0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
diff --git a/lib/vtls/sectransp.c b/lib/vtls/sectransp.c
index 4eece89d5..971dd78e6 100644
--- a/lib/vtls/sectransp.c
+++ b/lib/vtls/sectransp.c
@@ -31,7 +31,6 @@
#include "urldata.h" /* for the Curl_easy definition */
#include "curl_base64.h"
#include "strtok.h"
-#include "multiif.h"
#ifdef USE_SECTRANSP
@@ -79,7 +78,7 @@
/* These macros mean "the following code is present to allow runtime backward
compatibility with at least this cat or earlier":
(You set this at build-time using the compiler command line option
- "-mmacosx-version-min.") */
+ "-mmacos-version-min.") */
#define CURL_SUPPORT_MAC_10_5 MAC_OS_X_VERSION_MIN_REQUIRED <= 1050
#define CURL_SUPPORT_MAC_10_6 MAC_OS_X_VERSION_MIN_REQUIRED <= 1060
#define CURL_SUPPORT_MAC_10_7 MAC_OS_X_VERSION_MIN_REQUIRED <= 1070
@@ -1903,6 +1902,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
/* We want to enable 1/n-1 when using a CBC cipher unless the user
specifically doesn't want us doing that: */
if(SSLSetSessionOption != NULL) {
+ /* TODO s/data->set.ssl.enable_beast/SSL_SET_OPTION(enable_beast)/g */
SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
!data->set.ssl.enable_beast);
SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionFalseStart,
@@ -2111,8 +2111,8 @@ static int append_cert_to_array(struct Curl_easy *data,
return CURLE_OK;
}
-static CURLcode verify_cert(const char *cafile, struct Curl_easy *data,
- SSLContextRef ctx)
+static int verify_cert(const char *cafile, struct Curl_easy *data,
+ SSLContextRef ctx)
{
int n = 0, rc;
long res;
@@ -2370,10 +2370,10 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
Leopard's headers */
case -9841:
if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
- CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), data,
- BACKEND->ssl_ctx);
- if(result)
- return result;
+ int res = verify_cert(SSL_CONN_CONFIG(CAfile), data,
+ BACKEND->ssl_ctx);
+ if(res != CURLE_OK)
+ return res;
}
/* the documentation says we need to call SSLHandshake() again */
return sectransp_connect_step2(conn, sockindex);
@@ -2651,9 +2651,6 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
else
infof(data, "ALPN, server did not agree to a protocol\n");
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
-
/* chosenProtocol is a reference to the string within alpnArr
and doesn't need to be freed separately */
if(alpnArr)
@@ -2805,7 +2802,7 @@ sectransp_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
+ long timeout_ms;
int what;
/* check if the connection has already been established */
@@ -2852,7 +2849,7 @@ sectransp_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
+ nonblocking?0:timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -2963,10 +2960,8 @@ static int Curl_sectransp_shutdown(struct connectdata *conn, int sockindex)
if(!BACKEND->ssl_ctx)
return 0;
-#ifndef CURL_DISABLE_FTP
if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
return 0;
-#endif
Curl_sectransp_close(conn, sockindex);
@@ -3186,10 +3181,7 @@ static ssize_t sectransp_recv(struct connectdata *conn,
/*struct Curl_easy *data = conn->data;*/
struct ssl_connect_data *connssl = &conn->ssl[num];
size_t processed = 0UL;
- OSStatus err;
-
- again:
- err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
+ OSStatus err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
if(err != noErr) {
switch(err) {
@@ -3210,16 +3202,6 @@ static ssize_t sectransp_recv(struct connectdata *conn,
return -1L;
break;
- /* The below is errSSLPeerAuthCompleted; it's not defined in
- Leopard's headers */
- case -9841:
- if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
- CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), conn->data,
- BACKEND->ssl_ctx);
- if(result)
- return result;
- }
- goto again;
default:
failf(conn->data, "SSLRead() return error %d", err);
*curlcode = CURLE_RECV_ERROR;
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index e6d756225..8a405c05c 100644
--- a/lib/vtls/vtls.c
+++ b/lib/vtls/vtls.c
@@ -97,8 +97,7 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
Curl_safe_strcasecompare(data->random_file, needle->random_file) &&
Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) &&
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
- Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
- Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
+ Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13))
return TRUE;
return FALSE;
@@ -122,7 +121,6 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
CLONE_STRING(egdsocket);
CLONE_STRING(cipher_list);
CLONE_STRING(cipher_list13);
- CLONE_STRING(pinned_key);
return TRUE;
}
@@ -136,7 +134,6 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
Curl_safefree(sslc->egdsocket);
Curl_safefree(sslc->cipher_list);
Curl_safefree(sslc->cipher_list13);
- Curl_safefree(sslc->pinned_key);
}
#ifdef USE_SSL
@@ -501,9 +498,9 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
void Curl_ssl_close_all(struct Curl_easy *data)
{
+ size_t i;
/* kill the session ID cache if not shared */
if(data->state.session && !SSLSESSION_SHARED(data)) {
- size_t i;
for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++)
/* the single-killer function handles empty table slots */
Curl_ssl_kill_session(&data->state.session[i]);
@@ -517,11 +514,15 @@ void Curl_ssl_close_all(struct Curl_easy *data)
#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
defined(USE_SECTRANSP) || defined(USE_POLARSSL) || defined(USE_NSS) || \
- defined(USE_MBEDTLS) || defined(USE_WOLFSSL)
-int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks)
+ defined(USE_MBEDTLS) || defined(USE_CYASSL)
+int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks)
{
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
+ if(!numsocks)
+ return GETSOCK_BLANK;
+
if(connssl->connecting_state == ssl_connect_2_writing) {
/* write mode */
socks[0] = conn->sock[FIRSTSOCKET];
@@ -537,10 +538,12 @@ int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks)
}
#else
int Curl_ssl_getsock(struct connectdata *conn,
- curl_socket_t *socks)
+ curl_socket_t *socks,
+ int numsocks)
{
(void)conn;
(void)socks;
+ (void)numsocks;
return GETSOCK_BLANK;
}
/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_SECTRANSP || USE_NSS */
@@ -641,11 +644,11 @@ bool Curl_ssl_data_pending(const struct connectdata *conn,
void Curl_ssl_free_certinfo(struct Curl_easy *data)
{
+ int i;
struct curl_certinfo *ci = &data->info.certs;
if(ci->num_of_certs) {
/* free all individual lists used */
- int i;
for(i = 0; i<ci->num_of_certs; i++) {
curl_slist_free_all(ci->certinfo[i]);
ci->certinfo[i] = NULL;
@@ -805,7 +808,14 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
{
FILE *fp;
unsigned char *buf = NULL, *pem_ptr = NULL;
+ long filesize;
+ size_t size, pem_len;
+ CURLcode pem_read;
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
+ CURLcode encode;
+ size_t encodedlen, pinkeylen;
+ char *encoded, *pinkeycopy, *begin_pos, *end_pos;
+ unsigned char *sha256sumdigest = NULL;
/* if a path wasn't specified, don't pin */
if(!pinnedpubkey)
@@ -815,11 +825,6 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
/* only do this if pinnedpubkey starts with "sha256//", length 8 */
if(strncmp(pinnedpubkey, "sha256//", 8) == 0) {
- CURLcode encode;
- size_t encodedlen, pinkeylen;
- char *encoded, *pinkeycopy, *begin_pos, *end_pos;
- unsigned char *sha256sumdigest;
-
if(!Curl_ssl->sha256sum) {
/* without sha256 support, this cannot match */
return result;
@@ -890,10 +895,6 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
return result;
do {
- long filesize;
- size_t size, pem_len;
- CURLcode pem_read;
-
/* Determine the file's size */
if(fseek(fp, 0, SEEK_END))
break;
@@ -1169,8 +1170,8 @@ static const struct Curl_ssl Curl_ssl_multi = {
const struct Curl_ssl *Curl_ssl =
#if defined(CURL_WITH_MULTI_SSL)
&Curl_ssl_multi;
-#elif defined(USE_WOLFSSL)
- &Curl_ssl_wolfssl;
+#elif defined(USE_CYASSL)
+ &Curl_ssl_cyassl;
#elif defined(USE_SECTRANSP)
&Curl_ssl_sectransp;
#elif defined(USE_GNUTLS)
@@ -1194,8 +1195,8 @@ const struct Curl_ssl *Curl_ssl =
#endif
static const struct Curl_ssl *available_backends[] = {
-#if defined(USE_WOLFSSL)
- &Curl_ssl_wolfssl,
+#if defined(USE_CYASSL)
+ &Curl_ssl_cyassl,
#endif
#if defined(USE_SECTRANSP)
&Curl_ssl_sectransp,
@@ -1238,17 +1239,16 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
if(current != selected) {
char *p = backends;
- char *end = backends + sizeof(backends);
int i;
selected = current;
- for(i = 0; available_backends[i] && p < (end - 4); i++) {
+ for(i = 0; available_backends[i]; i++) {
if(i)
*(p++) = ' ';
if(selected != available_backends[i])
*(p++) = '(';
- p += available_backends[i]->version(p, end - p - 2);
+ p += available_backends[i]->version(p, backends + sizeof(backends) - p);
if(selected != available_backends[i])
*(p++) = ')';
}
@@ -1256,20 +1256,21 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
total = p - backends;
}
- if(size > total)
+ if(size < total)
memcpy(buffer, backends, total + 1);
else {
memcpy(buffer, backends, size - 1);
buffer[size - 1] = '\0';
}
- return CURLMIN(size - 1, total);
+ return total;
}
static int multissl_init(const struct Curl_ssl *backend)
{
const char *env;
char *env_tmp;
+ int i;
if(Curl_ssl != &Curl_ssl_multi)
return 1;
@@ -1288,7 +1289,6 @@ static int multissl_init(const struct Curl_ssl *backend)
env = CURL_DEFAULT_SSL_BACKEND;
#endif
if(env) {
- int i;
for(i = 0; available_backends[i]; i++) {
if(strcasecompare(env, available_backends[i]->info.name)) {
Curl_ssl = available_backends[i];
diff --git a/lib/vtls/vtls.h b/lib/vtls/vtls.h
index 61d8416c2..2a87ca1f7 100644
--- a/lib/vtls/vtls.h
+++ b/lib/vtls/vtls.h
@@ -103,7 +103,7 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
#include "nssg.h" /* NSS versions */
#include "gskit.h" /* Global Secure ToolKit versions */
#include "polarssl.h" /* PolarSSL versions */
-#include "wolfssl.h" /* wolfSSL versions */
+#include "cyassl.h" /* CyaSSL versions */
#include "schannel.h" /* Schannel SSPI version */
#include "sectransp.h" /* SecureTransport (Darwin) version */
#include "mbedtls.h" /* mbedTLS versions */
@@ -143,7 +143,8 @@ bool Curl_ssl_config_matches(struct ssl_primary_config* data,
bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
struct ssl_primary_config *dest);
void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc);
-int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks);
+int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
+ int numsocks);
int Curl_ssl_backend(void);
diff --git a/lib/wildcard.c b/lib/wildcard.c
index e94d3c544..8ba0989b4 100644
--- a/lib/wildcard.c
+++ b/lib/wildcard.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,8 +22,6 @@
#include "curl_setup.h"
-#ifndef CURL_DISABLE_FTP
-
#include "wildcard.h"
#include "llist.h"
#include "fileinfo.h"
@@ -69,5 +67,3 @@ void Curl_wildcard_dtor(struct WildcardData *wc)
wc->customptr = NULL;
wc->state = CURLWC_INIT;
}
-
-#endif /* if disabled */
diff --git a/lib/wildcard.h b/lib/wildcard.h
index 306c8c99f..b7826123a 100644
--- a/lib/wildcard.h
+++ b/lib/wildcard.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,9 +22,8 @@
*
***************************************************************************/
-#include "curl_setup.h"
+#include <curl/curl.h>
-#ifndef CURL_DISABLE_FTP
#include "llist.h"
/* list of wildcard process states */
@@ -59,9 +58,4 @@ void Curl_wildcard_dtor(struct WildcardData *wc);
struct Curl_easy;
-#else
-/* FTP is disabled */
-#define Curl_wildcard_dtor(x)
-#endif
-
#endif /* HEADER_CURL_WILDCARD_H */
diff --git a/lib/x509asn1.c b/lib/x509asn1.c
index ece5364d8..25231921c 100644
--- a/lib/x509asn1.c
+++ b/lib/x509asn1.c
@@ -23,7 +23,7 @@
#include "curl_setup.h"
#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
- defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
+ defined(USE_CYASSL) || defined(USE_SCHANNEL)
#include <curl/curl.h>
#include "urldata.h"
@@ -266,6 +266,8 @@ utf8asn1str(char **to, int type, const char *from, const char *end)
size_t inlength = end - from;
int size = 1;
size_t outlength;
+ int charsize;
+ unsigned int wc;
char *buf;
*to = NULL;
@@ -303,9 +305,6 @@ utf8asn1str(char **to, int type, const char *from, const char *end)
}
else {
for(outlength = 0; from < end;) {
- int charsize;
- unsigned int wc;
-
wc = 0;
switch(size) {
case 4:
@@ -878,6 +877,9 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
curl_asn1Element elem;
curl_asn1Element pk;
const char *p;
+ const char *q;
+ unsigned long len;
+ unsigned int i;
/* Generate all information records for the public key. */
@@ -886,9 +888,6 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
return;
if(strcasecompare(algo, "rsaEncryption")) {
- const char *q;
- unsigned long len;
-
p = getASN1Element(&elem, pk.beg, pk.end);
if(!p)
return;
@@ -897,11 +896,9 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
for(q = elem.beg; !*q && q < elem.end; q++)
;
len = (unsigned long)((elem.end - q) * 8);
- if(len) {
- unsigned int i;
+ if(len)
for(i = *(unsigned char *) q; !(i & 0x80); i <<= 1)
len--;
- }
if(len > 32)
elem.beg = q; /* Strip leading zero bytes. */
if(!certnum)
@@ -1059,6 +1056,8 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
do_pubkey(data, certnum, ccp, &param, &cert.subjectPublicKey);
free((char *) ccp);
+/* TODO: extensions. */
+
/* Signature. */
ccp = ASN1tostr(&cert.signature, 0);
if(!ccp)
@@ -1104,7 +1103,7 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
return CURLE_OK;
}
-#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_WOLFSSL or USE_SCHANNEL */
+#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_CYASSL or USE_SCHANNEL */
#if defined(USE_GSKIT)
diff --git a/lib/x509asn1.h b/lib/x509asn1.h
index 205fdc0d7..ce4029792 100644
--- a/lib/x509asn1.h
+++ b/lib/x509asn1.h
@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
#include "curl_setup.h"
#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
- defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
+ defined(USE_CYASSL) || defined(USE_SCHANNEL)
#include "urldata.h"
@@ -130,5 +130,5 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn, int certnum,
const char *beg, const char *end);
CURLcode Curl_verifyhost(struct connectdata *conn,
const char *beg, const char *end);
-#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_WOLFSSL or USE_SCHANNEL */
+#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_CYASSL or USE_SCHANNEL */
#endif /* HEADER_CURL_X509ASN1_H */
diff --git a/local-configure.patch b/local-configure.patch
index 8cab352ba..e68c188e2 100644
--- a/local-configure.patch
+++ b/local-configure.patch
@@ -2,7 +2,7 @@ Index: curl/lib/curl_config.h
===================================================================
--- curl.orig/lib/curl_config.h
+++ curl/lib/curl_config.h
-@@ -473,7 +473,7 @@
+@@ -461,7 +461,7 @@
#define HAVE_NETDB_H 1
/* Define to 1 if you have the <netinet/in6.h> header file. */
@@ -11,7 +11,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
-@@ -513,7 +513,7 @@
+@@ -492,7 +492,7 @@
#define HAVE_OPENSSL_RSA_H 1
/* if you have the function SRP_Calc_client_key */
@@ -20,7 +20,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <openssl/ssl.h> header file. */
#define HAVE_OPENSSL_SSL_H 1
-@@ -836,9 +836,6 @@
+@@ -809,9 +809,6 @@
/* Define absolute filename for winbind's ntlm_auth helper. */
/* #undef NTLM_WB_FILE */
@@ -30,7 +30,7 @@ Index: curl/lib/curl_config.h
/* Name of package */
#define PACKAGE "curl"
-@@ -894,7 +891,7 @@
+@@ -867,7 +864,7 @@
#define SELECT_TYPE_ARG5 struct timeval *
/* Define to the function return type for select. */
@@ -39,7 +39,7 @@ Index: curl/lib/curl_config.h
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2 const
-@@ -920,24 +917,9 @@
+@@ -893,24 +890,9 @@
/* The number of bytes in type int */
#define SIZEOF_INT 4
@@ -64,7 +64,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
-@@ -1026,7 +1008,7 @@
+@@ -990,7 +972,7 @@
/* #undef USE_THREADS_WIN32 */
/* Use TLS-SRP authentication */
@@ -73,7 +73,7 @@ Index: curl/lib/curl_config.h
/* Use Unix domain sockets */
#define USE_UNIX_SOCKETS 1
-@@ -1068,7 +1050,7 @@
+@@ -1029,7 +1011,7 @@
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
diff --git a/ltmain.sh b/ltmain.sh
index c12c197be..a736cf994 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -31,7 +31,7 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION="2.4.6 Debian-2.4.6-9"
+VERSION="2.4.6 Debian-2.4.6-2"
package_revision=2.4.6
@@ -1370,7 +1370,7 @@ func_lt_ver ()
#! /bin/sh
# Set a version string for this script.
-scriptversion=2015-10-07.11; # UTC
+scriptversion=2014-01-07.03; # UTC
# A portable, pluggable option parser for Bourne shell.
# Written by Gary V. Vaughan, 2010
@@ -1530,8 +1530,6 @@ func_run_hooks ()
{
$debug_cmd
- _G_rc_run_hooks=false
-
case " $hookable_fns " in
*" $1 "*) ;;
*) func_fatal_error "'$1' does not support hook funcions.n" ;;
@@ -1540,16 +1538,16 @@ func_run_hooks ()
eval _G_hook_fns=\$$1_hooks; shift
for _G_hook in $_G_hook_fns; do
- if eval $_G_hook '"$@"'; then
- # store returned options list back into positional
- # parameters for next 'cmd' execution.
- eval _G_hook_result=\$${_G_hook}_result
- eval set dummy "$_G_hook_result"; shift
- _G_rc_run_hooks=:
- fi
+ eval $_G_hook '"$@"'
+
+ # store returned options list back into positional
+ # parameters for next 'cmd' execution.
+ eval _G_hook_result=\$${_G_hook}_result
+ eval set dummy "$_G_hook_result"; shift
done
- $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result
+ func_quote_for_eval ${1+"$@"}
+ func_run_hooks_result=$func_quote_for_eval_result
}
@@ -1559,16 +1557,10 @@ func_run_hooks ()
## --------------- ##
# In order to add your own option parsing hooks, you must accept the
-# full positional parameter list in your hook function, you may remove/edit
-# any options that you action, and then pass back the remaining unprocessed
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
# options in '<hooked_function_name>_result', escaped suitably for
-# 'eval'. In this case you also must return $EXIT_SUCCESS to let the
-# hook's caller know that it should pay attention to
-# '<hooked_function_name>_result'. Returning $EXIT_FAILURE signalizes that
-# arguments are left untouched by the hook and therefore caller will ignore the
-# result variable.
-#
-# Like this:
+# 'eval'. Like this:
#
# my_options_prep ()
# {
@@ -1578,11 +1570,9 @@ func_run_hooks ()
# usage_message=$usage_message'
# -s, --silent don'\''t print informational messages
# '
-# # No change in '$@' (ignored completely by this hook). There is
-# # no need to do the equivalent (but slower) action:
-# # func_quote_for_eval ${1+"$@"}
-# # my_options_prep_result=$func_quote_for_eval_result
-# false
+#
+# func_quote_for_eval ${1+"$@"}
+# my_options_prep_result=$func_quote_for_eval_result
# }
# func_add_hook func_options_prep my_options_prep
#
@@ -1591,37 +1581,25 @@ func_run_hooks ()
# {
# $debug_cmd
#
-# args_changed=false
-#
# # Note that for efficiency, we parse as many options as we can
# # recognise in a loop before passing the remainder back to the
# # caller on the first unrecognised argument we encounter.
# while test $# -gt 0; do
# opt=$1; shift
# case $opt in
-# --silent|-s) opt_silent=:
-# args_changed=:
-# ;;
+# --silent|-s) opt_silent=: ;;
# # Separate non-argument short options:
# -s*) func_split_short_opt "$_G_opt"
# set dummy "$func_split_short_opt_name" \
# "-$func_split_short_opt_arg" ${1+"$@"}
# shift
-# args_changed=:
# ;;
-# *) # Make sure the first unrecognised option "$_G_opt"
-# # is added back to "$@", we could need that later
-# # if $args_changed is true.
-# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+# *) set dummy "$_G_opt" "$*"; shift; break ;;
# esac
# done
#
-# if $args_changed; then
-# func_quote_for_eval ${1+"$@"}
-# my_silent_option_result=$func_quote_for_eval_result
-# fi
-#
-# $args_changed
+# func_quote_for_eval ${1+"$@"}
+# my_silent_option_result=$func_quote_for_eval_result
# }
# func_add_hook func_parse_options my_silent_option
#
@@ -1633,32 +1611,16 @@ func_run_hooks ()
# $opt_silent && $opt_verbose && func_fatal_help "\
# '--silent' and '--verbose' options are mutually exclusive."
#
-# false
+# func_quote_for_eval ${1+"$@"}
+# my_option_validation_result=$func_quote_for_eval_result
# }
# func_add_hook func_validate_options my_option_validation
#
-# You'll also need to manually amend $usage_message to reflect the extra
+# You'll alse need to manually amend $usage_message to reflect the extra
# options you parse. It's preferable to append if you can, so that
# multiple option parsing hooks can be added safely.
-# func_options_finish [ARG]...
-# ----------------------------
-# Finishing the option parse loop (call 'func_options' hooks ATM).
-func_options_finish ()
-{
- $debug_cmd
-
- _G_func_options_finish_exit=false
- if func_run_hooks func_options ${1+"$@"}; then
- func_options_finish_result=$func_run_hooks_result
- _G_func_options_finish_exit=:
- fi
-
- $_G_func_options_finish_exit
-}
-
-
# func_options [ARG]...
# ---------------------
# All the functions called inside func_options are hookable. See the
@@ -1668,28 +1630,17 @@ func_options ()
{
$debug_cmd
- _G_rc_options=false
+ func_options_prep ${1+"$@"}
+ eval func_parse_options \
+ ${func_options_prep_result+"$func_options_prep_result"}
+ eval func_validate_options \
+ ${func_parse_options_result+"$func_parse_options_result"}
- for my_func in options_prep parse_options validate_options options_finish
- do
- if eval func_$my_func '${1+"$@"}'; then
- eval _G_res_var='$'"func_${my_func}_result"
- eval set dummy "$_G_res_var" ; shift
- _G_rc_options=:
- fi
- done
-
- # Save modified positional parameters for caller. As a top-level
- # options-parser function we always need to set the 'func_options_result'
- # variable (regardless the $_G_rc_options value).
- if $_G_rc_options; then
- func_options_result=$_G_res_var
- else
- func_quote_for_eval ${1+"$@"}
- func_options_result=$func_quote_for_eval_result
- fi
+ eval func_run_hooks func_options \
+ ${func_validate_options_result+"$func_validate_options_result"}
- $_G_rc_options
+ # save modified positional parameters for caller
+ func_options_result=$func_run_hooks_result
}
@@ -1698,9 +1649,9 @@ func_options ()
# All initialisations required before starting the option parse loop.
# Note that when calling hook functions, we pass through the list of
# positional parameters. If a hook function modifies that list, and
-# needs to propagate that back to rest of this script, then the complete
+# needs to propogate that back to rest of this script, then the complete
# modified list must be put in 'func_run_hooks_result' before
-# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned).
+# returning.
func_hookable func_options_prep
func_options_prep ()
{
@@ -1710,14 +1661,10 @@ func_options_prep ()
opt_verbose=false
opt_warning_types=
- _G_rc_options_prep=false
- if func_run_hooks func_options_prep ${1+"$@"}; then
- _G_rc_options_prep=:
- # save modified positional parameters for caller
- func_options_prep_result=$func_run_hooks_result
- fi
+ func_run_hooks func_options_prep ${1+"$@"}
- $_G_rc_options_prep
+ # save modified positional parameters for caller
+ func_options_prep_result=$func_run_hooks_result
}
@@ -1731,20 +1678,18 @@ func_parse_options ()
func_parse_options_result=
- _G_rc_parse_options=false
# this just eases exit handling
while test $# -gt 0; do
# Defer to hook functions for initial option parsing, so they
# get priority in the event of reusing an option name.
- if func_run_hooks func_parse_options ${1+"$@"}; then
- eval set dummy "$func_run_hooks_result"; shift
- _G_rc_parse_options=:
- fi
+ func_run_hooks func_parse_options ${1+"$@"}
+
+ # Adjust func_parse_options positional parameters to match
+ eval set dummy "$func_run_hooks_result"; shift
# Break out of the loop if we already parsed every option.
test $# -gt 0 || break
- _G_match_parse_options=:
_G_opt=$1
shift
case $_G_opt in
@@ -1759,10 +1704,7 @@ func_parse_options ()
;;
--warnings|--warning|-W)
- if test $# = 0 && func_missing_arg $_G_opt; then
- _G_rc_parse_options=:
- break
- fi
+ test $# = 0 && func_missing_arg $_G_opt && break
case " $warning_categories $1" in
*" $1 "*)
# trailing space prevents matching last $1 above
@@ -1815,25 +1757,15 @@ func_parse_options ()
shift
;;
- --) _G_rc_parse_options=: ; break ;;
+ --) break ;;
-*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
- *) set dummy "$_G_opt" ${1+"$@"}; shift
- _G_match_parse_options=false
- break
- ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
esac
-
- $_G_match_parse_options && _G_rc_parse_options=:
done
-
- if $_G_rc_parse_options; then
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- func_parse_options_result=$func_quote_for_eval_result
- fi
-
- $_G_rc_parse_options
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ func_parse_options_result=$func_quote_for_eval_result
}
@@ -1846,21 +1778,16 @@ func_validate_options ()
{
$debug_cmd
- _G_rc_validate_options=false
-
# Display all warnings if -W was not given.
test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
- if func_run_hooks func_validate_options ${1+"$@"}; then
- # save modified positional parameters for caller
- func_validate_options_result=$func_run_hooks_result
- _G_rc_validate_options=:
- fi
+ func_run_hooks func_validate_options ${1+"$@"}
# Bail if the options were screwed!
$exit_cmd $EXIT_FAILURE
- $_G_rc_validate_options
+ # save modified positional parameters for caller
+ func_validate_options_result=$func_run_hooks_result
}
@@ -2141,7 +2068,7 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname $scriptversion Debian-2.4.6-9
+ version: $progname $scriptversion Debian-2.4.6-2
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
@@ -2343,8 +2270,6 @@ libtool_options_prep ()
nonopt=
preserve_args=
- _G_rc_lt_options_prep=:
-
# Shorthand for --mode=foo, only valid as the first argument
case $1 in
clean|clea|cle|cl)
@@ -2368,18 +2293,11 @@ libtool_options_prep ()
uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
shift; set dummy --mode uninstall ${1+"$@"}; shift
;;
- *)
- _G_rc_lt_options_prep=false
- ;;
esac
- if $_G_rc_lt_options_prep; then
- # Pass back the list of options.
- func_quote_for_eval ${1+"$@"}
- libtool_options_prep_result=$func_quote_for_eval_result
- fi
-
- $_G_rc_lt_options_prep
+ # Pass back the list of options.
+ func_quote_for_eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_for_eval_result
}
func_add_hook func_options_prep libtool_options_prep
@@ -2391,12 +2309,9 @@ libtool_parse_options ()
{
$debug_cmd
- _G_rc_lt_parse_options=false
-
# Perform our own loop to consume as many options as possible in
# each iteration.
while test $# -gt 0; do
- _G_match_lt_parse_options=:
_G_opt=$1
shift
case $_G_opt in
@@ -2471,22 +2386,15 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
- # An option not handled by this hook function:
- *) set dummy "$_G_opt" ${1+"$@"} ; shift
- _G_match_lt_parse_options=false
- break
- ;;
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
esac
- $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
done
- if $_G_rc_lt_parse_options; then
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- libtool_parse_options_result=$func_quote_for_eval_result
- fi
- $_G_rc_lt_parse_options
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_for_eval_result
}
func_add_hook func_parse_options libtool_parse_options
@@ -7367,11 +7275,10 @@ func_mode_link ()
# -specs=* GCC specs files
# -stdlib=* select c++ std lib with clang
# -fsanitize=* Clang/GCC memory and address sanitizer
- # -fuse-ld=* Linker select flags for GCC
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
- -specs=*|-fsanitize=*|-fuse-ld=*)
+ -specs=*|-fsanitize=*)
func_quote_for_eval "$arg"
arg=$func_quote_for_eval_result
func_append compile_command " $arg"
diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4
index af15a85d9..20fcc5266 100644
--- a/m4/curl-confopts.m4
+++ b/m4/curl-confopts.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -648,39 +648,3 @@ AC_DEFUN([CURL_CHECK_NTLM_WB], [
NTLM_WB_ENABLED=1
fi
])
-
-dnl CURL_CHECK_OPTION_ESNI
-dnl -----------------------------------------------------
-dnl Verify whether configure has been invoked with option
-dnl --enable-esni or --disable-esni, and set
-dnl shell variable want_esni as appropriate.
-
-AC_DEFUN([CURL_CHECK_OPTION_ESNI], [
- AC_MSG_CHECKING([whether to enable ESNI support])
- OPT_ESNI="default"
- AC_ARG_ENABLE(esni,
-AC_HELP_STRING([--enable-esni],[Enable ESNI support])
-AC_HELP_STRING([--disable-esni],[Disable ESNI support]),
- OPT_ESNI=$enableval)
- case "$OPT_ESNI" in
- no)
- dnl --disable-esni option used
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
- AC_MSG_RESULT([no])
- ;;
- default)
- dnl configure option not specified
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
- AC_MSG_RESULT([no])
- ;;
- *)
- dnl --enable-esni option used
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
- AC_MSG_RESULT([yes])
- ;;
- esac
-])
diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4
index 9020f3942..8249108bb 100644
--- a/m4/curl-functions.m4
+++ b/m4/curl-functions.m4
@@ -563,23 +563,6 @@ curl_includes_bsdsocket="\
[], [], [ $curl_includes_bsdsocket])
])
-dnl CURL_INCLUDES_NETIF
-dnl -------------------------------------------------
-dnl Set up variable with list of headers that must be
-dnl included when net/if.h is to be included.
-
-AC_DEFUN([CURL_INCLUDES_NETIF], [
-curl_includes_netif="\
-/* includes start */
-#ifdef HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-/* includes end */"
- AC_CHECK_HEADERS(
- net/if.h,
- [], [], [$curl_includes_netif])
-])
-
dnl CURL_PREPROCESS_CALLCONV
dnl -------------------------------------------------
@@ -2929,297 +2912,6 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
fi
])
-dnl CURL_CHECK_FUNC_GETPEERNAME
-dnl -------------------------------------------------
-dnl Verify if getpeername is available, prototyped, and
-dnl can be compiled. If all of these are true, and
-dnl usage has not been previously disallowed with
-dnl shell variable curl_disallow_getpeername, then
-dnl HAVE_GETPEERNAME will be defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_GETPEERNAME], [
- AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
- AC_REQUIRE([CURL_INCLUDES_UNISTD])dnl
- AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
- AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
- #
- tst_links_getpeername="unknown"
- tst_proto_getpeername="unknown"
- tst_compi_getpeername="unknown"
- tst_allow_getpeername="unknown"
- #
- AC_MSG_CHECKING([if getpeername can be linked])
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ]],[[
- if(0 != getpeername(0, (void *)0, (void *)0))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_links_getpeername="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_links_getpeername="no"
- ])
- #
- if test "$tst_links_getpeername" = "yes"; then
- AC_MSG_CHECKING([if getpeername is prototyped])
- AC_EGREP_CPP([getpeername],[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ],[
- AC_MSG_RESULT([yes])
- tst_proto_getpeername="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_proto_getpeername="no"
- ])
- fi
- #
- if test "$tst_proto_getpeername" = "yes"; then
- AC_MSG_CHECKING([if getpeername is compilable])
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ]],[[
- if(0 != getpeername(0, (void *)0, (void *)0))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_compi_getpeername="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_compi_getpeername="no"
- ])
- fi
- #
- if test "$tst_compi_getpeername" = "yes"; then
- AC_MSG_CHECKING([if getpeername usage allowed])
- if test "x$curl_disallow_getpeername" != "xyes"; then
- AC_MSG_RESULT([yes])
- tst_allow_getpeername="yes"
- else
- AC_MSG_RESULT([no])
- tst_allow_getpeername="no"
- fi
- fi
- #
- AC_MSG_CHECKING([if getpeername might be used])
- if test "$tst_links_getpeername" = "yes" &&
- test "$tst_proto_getpeername" = "yes" &&
- test "$tst_compi_getpeername" = "yes" &&
- test "$tst_allow_getpeername" = "yes"; then
- AC_MSG_RESULT([yes])
- AC_DEFINE_UNQUOTED(HAVE_GETPEERNAME, 1,
- [Define to 1 if you have the getpeername function.])
- curl_cv_func_getpeername="yes"
- else
- AC_MSG_RESULT([no])
- curl_cv_func_getpeername="no"
- fi
-])
-
-dnl CURL_CHECK_FUNC_GETSOCKNAME
-dnl -------------------------------------------------
-dnl Verify if getsockname is available, prototyped, and
-dnl can be compiled. If all of these are true, and
-dnl usage has not been previously disallowed with
-dnl shell variable curl_disallow_getsockname, then
-dnl HAVE_GETSOCKNAME will be defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_GETSOCKNAME], [
- AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
- AC_REQUIRE([CURL_INCLUDES_UNISTD])dnl
- AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
- AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
- #
- tst_links_getsockname="unknown"
- tst_proto_getsockname="unknown"
- tst_compi_getsockname="unknown"
- tst_allow_getsockname="unknown"
- #
- AC_MSG_CHECKING([if getsockname can be linked])
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ]],[[
- if(0 != getsockname(0, (void *)0, (void *)0))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_links_getsockname="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_links_getsockname="no"
- ])
- #
- if test "$tst_links_getsockname" = "yes"; then
- AC_MSG_CHECKING([if getsockname is prototyped])
- AC_EGREP_CPP([getsockname],[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ],[
- AC_MSG_RESULT([yes])
- tst_proto_getsockname="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_proto_getsockname="no"
- ])
- fi
- #
- if test "$tst_proto_getsockname" = "yes"; then
- AC_MSG_CHECKING([if getsockname is compilable])
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- $curl_includes_sys_socket
- ]],[[
- if(0 != getsockname(0, (void *)0, (void *)0))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_compi_getsockname="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_compi_getsockname="no"
- ])
- fi
- #
- if test "$tst_compi_getsockname" = "yes"; then
- AC_MSG_CHECKING([if getsockname usage allowed])
- if test "x$curl_disallow_getsockname" != "xyes"; then
- AC_MSG_RESULT([yes])
- tst_allow_getsockname="yes"
- else
- AC_MSG_RESULT([no])
- tst_allow_getsockname="no"
- fi
- fi
- #
- AC_MSG_CHECKING([if getsockname might be used])
- if test "$tst_links_getsockname" = "yes" &&
- test "$tst_proto_getsockname" = "yes" &&
- test "$tst_compi_getsockname" = "yes" &&
- test "$tst_allow_getsockname" = "yes"; then
- AC_MSG_RESULT([yes])
- AC_DEFINE_UNQUOTED(HAVE_GETSOCKNAME, 1,
- [Define to 1 if you have the getsockname function.])
- curl_cv_func_getsockname="yes"
- else
- AC_MSG_RESULT([no])
- curl_cv_func_getsockname="no"
- fi
-])
-
-dnl CURL_CHECK_FUNC_IF_NAMETOINDEX
-dnl -------------------------------------------------
-dnl Verify if if_nametoindex is available, prototyped, and
-dnl can be compiled. If all of these are true, and
-dnl usage has not been previously disallowed with
-dnl shell variable curl_disallow_if_nametoindex, then
-dnl HAVE_IF_NAMETOINDEX will be defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_IF_NAMETOINDEX], [
- AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
- AC_REQUIRE([CURL_INCLUDES_NETIF])dnl
- AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
- #
- tst_links_if_nametoindex="unknown"
- tst_proto_if_nametoindex="unknown"
- tst_compi_if_nametoindex="unknown"
- tst_allow_if_nametoindex="unknown"
- #
- AC_MSG_CHECKING([if if_nametoindex can be linked])
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_bsdsocket
- #include <net/if.h>
- ]],[[
- if(0 != if_nametoindex(""))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_links_if_nametoindex="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_links_if_nametoindex="no"
- ])
- #
- if test "$tst_links_if_nametoindex" = "yes"; then
- AC_MSG_CHECKING([if if_nametoindex is prototyped])
- AC_EGREP_CPP([if_nametoindex],[
- $curl_includes_winsock2
- $curl_includes_netif
- ],[
- AC_MSG_RESULT([yes])
- tst_proto_if_nametoindex="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_proto_if_nametoindex="no"
- ])
- fi
- #
- if test "$tst_proto_if_nametoindex" = "yes"; then
- AC_MSG_CHECKING([if if_nametoindex is compilable])
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[
- $curl_includes_winsock2
- $curl_includes_netif
- ]],[[
- if(0 != if_nametoindex(""))
- return 1;
- ]])
- ],[
- AC_MSG_RESULT([yes])
- tst_compi_if_nametoindex="yes"
- ],[
- AC_MSG_RESULT([no])
- tst_compi_if_nametoindex="no"
- ])
- fi
- #
- if test "$tst_compi_if_nametoindex" = "yes"; then
- AC_MSG_CHECKING([if if_nametoindex usage allowed])
- if test "x$curl_disallow_if_nametoindex" != "xyes"; then
- AC_MSG_RESULT([yes])
- tst_allow_if_nametoindex="yes"
- else
- AC_MSG_RESULT([no])
- tst_allow_if_nametoindex="no"
- fi
- fi
- #
- AC_MSG_CHECKING([if if_nametoindex might be used])
- if test "$tst_links_if_nametoindex" = "yes" &&
- test "$tst_proto_if_nametoindex" = "yes" &&
- test "$tst_compi_if_nametoindex" = "yes" &&
- test "$tst_allow_if_nametoindex" = "yes"; then
- AC_MSG_RESULT([yes])
- AC_DEFINE_UNQUOTED(HAVE_IF_NAMETOINDEX, 1,
- [Define to 1 if you have the if_nametoindex function.])
- curl_cv_func_if_nametoindex="yes"
- else
- AC_MSG_RESULT([no])
- curl_cv_func_if_nametoindex="no"
- fi
-])
-
dnl CURL_CHECK_FUNC_GETIFADDRS
dnl -------------------------------------------------
@@ -7313,7 +7005,8 @@ AC_DEFUN([CURL_COVERAGE],[
dnl check if enabled by argument
AC_ARG_ENABLE(code-coverage,
AC_HELP_STRING([--enable-code-coverage], [Provide code coverage]),
- coverage="$enableval")
+ coverage="yes",
+ coverage="no")
dnl if not gcc switch off again
AS_IF([ test "$GCC" != "yes" ], coverage="no" )
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 013074655..94b2e7ab4 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -4063,8 +4063,7 @@ _LT_EOF
if AC_TRY_EVAL(ac_compile); then
# Now try to grab the symbols.
nlist=conftest.nm
- $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD
- if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
@@ -6439,7 +6438,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
GXX=no
@@ -6814,7 +6813,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -6879,7 +6878,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -7218,7 +7217,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# FIXME: insert proper C++ library support
@@ -7302,7 +7301,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# g++ 2.7 appears to require '-G' NOT '-shared' on this
# platform.
@@ -7313,7 +7312,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
fi
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
diff --git a/missing b/missing
index 625aeb118..f62bbae30 100755
--- a/missing
+++ b/missing
@@ -1,9 +1,9 @@
#! /bin/sh
# Common wrapper for a few potentially missing GNU programs.
-scriptversion=2018-03-07.03; # UTC
+scriptversion=2013-10-28.13; # UTC
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
@@ -17,7 +17,7 @@ scriptversion=2018-03-07.03; # UTC
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -101,9 +101,9 @@ else
exit $st
fi
-perl_URL=https://www.perl.org/
-flex_URL=https://github.com/westes/flex
-gnu_software_URL=https://www.gnu.org/software
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
program_details ()
{
@@ -207,9 +207,9 @@ give_advice "$1" | sed -e '1s/^/WARNING: /' \
exit $st
# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
diff --git a/packages/OS400/README.OS400 b/packages/OS400/README.OS400
index 95a558411..c653ceceb 100644
--- a/packages/OS400/README.OS400
+++ b/packages/OS400/README.OS400
@@ -120,7 +120,6 @@ options:
CURLOPT_RTSP_SESSION_UID
CURLOPT_RTSP_STREAM_URI
CURLOPT_RTSP_TRANSPORT
- CURLOPT_SASL_AUTHZID
CURLOPT_SERVICE_NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c
index 11e4c777e..a4cae27ee 100644
--- a/packages/OS400/ccsidcurl.c
+++ b/packages/OS400/ccsidcurl.c
@@ -94,7 +94,7 @@ iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin,
makeOS400IconvCode(fromcode, ccsidin);
makeOS400IconvCode(tocode, ccsidout);
- memset(tocode + 13, 0, sizeof(tocode) - 13); /* Dest. code id format. */
+ memset(tocode + 13, 0, sizeof tocode - 13); /* Dest. code id format. */
if(cstr)
fromcode[18] = '1'; /* Set null-terminator flag. */
@@ -104,8 +104,8 @@ iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin,
static int
-convert(char *d, size_t dlen, int dccsid,
- const char *s, int slen, int sccsid)
+convert(char * d, size_t dlen, int dccsid,
+ const char * s, int slen, int sccsid)
{
int i;
@@ -161,11 +161,11 @@ convert(char *d, size_t dlen, int dccsid,
static char *
-dynconvert(int dccsid, const char *s, int slen, int sccsid)
+dynconvert(int dccsid, const char * s, int slen, int sccsid)
{
- char *d;
- char *cp;
+ char * d;
+ char * cp;
size_t dlen;
int l;
static const char nullbyte = 0;
@@ -213,14 +213,14 @@ dynconvert(int dccsid, const char *s, int slen, int sccsid)
static struct curl_slist *
-slist_convert(int dccsid, struct curl_slist *from, int sccsid)
+slist_convert(int dccsid, struct curl_slist * from, int sccsid)
{
- struct curl_slist *to = (struct curl_slist *) NULL;
+ struct curl_slist * to = (struct curl_slist *) NULL;
for(; from; from = from->next) {
struct curl_slist *nl;
- char *cp = dynconvert(dccsid, from->data, -1, sccsid);
+ char * cp = dynconvert(dccsid, from->data, -1, sccsid);
if(!cp) {
curl_slist_free_all(to);
@@ -243,8 +243,8 @@ curl_version_ccsid(unsigned int ccsid)
{
int i;
- char *aversion;
- char *eversion;
+ char * aversion;
+ char * eversion;
aversion = curl_version();
@@ -254,8 +254,7 @@ curl_version_ccsid(unsigned int ccsid)
i = strlen(aversion) + 1;
i *= MAX_CONV_EXPANSION;
- eversion = Curl_thread_buffer(LK_CURL_VERSION, i);
- if(!eversion)
+ if(!(eversion = Curl_thread_buffer(LK_CURL_VERSION, i)))
return (char *) NULL;
if(convert(eversion, i, ccsid, aversion, -1, ASCII_CCSID) < 0)
@@ -266,12 +265,12 @@ curl_version_ccsid(unsigned int ccsid)
char *
-curl_easy_escape_ccsid(CURL *handle, const char *string, int length,
+curl_easy_escape_ccsid(CURL * handle, const char * string, int length,
unsigned int sccsid, unsigned int dccsid)
{
- char *s;
- char *d;
+ char * s;
+ char * d;
if(!string) {
errno = EINVAL;
@@ -296,13 +295,13 @@ curl_easy_escape_ccsid(CURL *handle, const char *string, int length,
char *
-curl_easy_unescape_ccsid(CURL *handle, const char *string, int length,
- int *outlength,
+curl_easy_unescape_ccsid(CURL * handle, const char * string, int length,
+ int * outlength,
unsigned int sccsid, unsigned int dccsid)
{
- char *s;
- char *d;
+ char * s;
+ char * d;
if(!string) {
errno = EINVAL;
@@ -331,11 +330,11 @@ curl_easy_unescape_ccsid(CURL *handle, const char *string, int length,
struct curl_slist *
-curl_slist_append_ccsid(struct curl_slist *list,
- const char *data, unsigned int ccsid)
+curl_slist_append_ccsid(struct curl_slist * list,
+ const char * data, unsigned int ccsid)
{
- char *s;
+ char * s;
s = (char *) NULL;
@@ -354,10 +353,10 @@ curl_slist_append_ccsid(struct curl_slist *list,
time_t
-curl_getdate_ccsid(const char *p, const time_t * unused, unsigned int ccsid)
+curl_getdate_ccsid(const char * p, const time_t * unused, unsigned int ccsid)
{
- char *s;
+ char * s;
time_t t;
if(!p)
@@ -376,7 +375,7 @@ curl_getdate_ccsid(const char *p, const time_t * unused, unsigned int ccsid)
static int
convert_version_info_string(const char * * stringp,
- char * * bufp, int *left, unsigned int ccsid)
+ char * * bufp, int * left, unsigned int ccsid)
{
/* Helper for curl_version_info_ccsid(): convert a string if defined.
@@ -404,7 +403,7 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
{
curl_version_info_data * p;
- char *cp;
+ char * cp;
int n;
int nproto;
curl_version_info_data * id;
@@ -469,17 +468,17 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
cp = Curl_thread_buffer(LK_VERSION_INFO_DATA, n);
id = (curl_version_info_data *) Curl_thread_buffer(LK_VERSION_INFO,
- sizeof(*id));
+ sizeof *id);
if(!id || !cp)
return (curl_version_info_data *) NULL;
/* Copy data and convert strings. */
- memcpy((char *) id, (char *) p, sizeof(*p));
+ memcpy((char *) id, (char *) p, sizeof *p);
if(id->protocols) {
- int i = nproto * sizeof(id->protocols[0]);
+ int i = nproto * sizeof id->protocols[0];
id->protocols = (const char * const *) cp;
memcpy(cp, (char *) p->protocols, i);
@@ -522,8 +521,8 @@ curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid)
{
int i;
- const char *s;
- char *buf;
+ const char * s;
+ char * buf;
s = curl_easy_strerror(error);
@@ -532,8 +531,7 @@ curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid)
i = MAX_CONV_EXPANSION * (strlen(s) + 1);
- buf = Curl_thread_buffer(LK_EASY_STRERROR, i);
- if(!buf)
+ if(!(buf = Curl_thread_buffer(LK_EASY_STRERROR, i)))
return (const char *) NULL;
if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -548,8 +546,8 @@ curl_share_strerror_ccsid(CURLSHcode error, unsigned int ccsid)
{
int i;
- const char *s;
- char *buf;
+ const char * s;
+ char * buf;
s = curl_share_strerror(error);
@@ -558,8 +556,7 @@ curl_share_strerror_ccsid(CURLSHcode error, unsigned int ccsid)
i = MAX_CONV_EXPANSION * (strlen(s) + 1);
- buf = Curl_thread_buffer(LK_SHARE_STRERROR, i);
- if(!buf)
+ if(!(buf = Curl_thread_buffer(LK_SHARE_STRERROR, i)))
return (const char *) NULL;
if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -574,8 +571,8 @@ curl_multi_strerror_ccsid(CURLMcode error, unsigned int ccsid)
{
int i;
- const char *s;
- char *buf;
+ const char * s;
+ char * buf;
s = curl_multi_strerror(error);
@@ -584,8 +581,7 @@ curl_multi_strerror_ccsid(CURLMcode error, unsigned int ccsid)
i = MAX_CONV_EXPANSION * (strlen(s) + 1);
- buf = Curl_thread_buffer(LK_MULTI_STRERROR, i);
- if(!buf)
+ if(!(buf = Curl_thread_buffer(LK_MULTI_STRERROR, i)))
return (const char *) NULL;
if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -614,13 +610,18 @@ curl_certinfo_free_all(struct curl_certinfo *info)
CURLcode
-curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
+curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...)
{
va_list arg;
- void *paramp;
+ void * paramp;
CURLcode ret;
+ unsigned int ccsid;
+ char * * cpp;
struct Curl_easy * data;
+ struct curl_slist * * slp;
+ struct curl_certinfo * cipf;
+ struct curl_certinfo * cipt;
/* WARNING: unlike curl_easy_getinfo(), the strings returned by this
procedure have to be free'ed. */
@@ -630,14 +631,8 @@ curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
paramp = va_arg(arg, void *);
ret = Curl_getinfo(data, info, paramp);
- if(ret == CURLE_OK) {
- unsigned int ccsid;
- char **cpp;
- struct curl_slist **slp;
- struct curl_certinfo *cipf;
- struct curl_certinfo *cipt;
-
- switch((int) info & CURLINFO_TYPEMASK) {
+ if(ret == CURLE_OK)
+ switch ((int) info & CURLINFO_TYPEMASK) {
case CURLINFO_STRING:
ccsid = va_arg(arg, unsigned int);
@@ -654,17 +649,16 @@ curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
case CURLINFO_SLIST:
ccsid = va_arg(arg, unsigned int);
- switch(info) {
+ switch (info) {
case CURLINFO_CERTINFO:
cipf = *(struct curl_certinfo * *) paramp;
if(cipf) {
- cipt = (struct curl_certinfo *) malloc(sizeof(*cipt));
- if(!cipt)
+ if(!(cipt = (struct curl_certinfo *) malloc(sizeof *cipt)))
ret = CURLE_OUT_OF_MEMORY;
else {
- cipt->certinfo = (struct curl_slist **)
- calloc(cipf->num_of_certs +
- 1, sizeof(struct curl_slist *));
+ cipt->certinfo = (struct curl_slist * *)
+ calloc(cipf->num_of_certs +
+ 1, sizeof(struct curl_slist *));
if(!cipt->certinfo)
ret = CURLE_OUT_OF_MEMORY;
else {
@@ -698,16 +692,13 @@ curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
break;
default:
- slp = (struct curl_slist **) paramp;
- if(*slp) {
- *slp = slist_convert(ccsid, *slp, ASCII_CCSID);
- if(!*slp)
+ slp = (struct curl_slist * *) paramp;
+ if(*slp)
+ if(!(*slp = slist_convert(ccsid, *slp, ASCII_CCSID)))
ret = CURLE_OUT_OF_MEMORY;
- }
break;
}
}
- }
va_end(arg);
return ret;
@@ -718,7 +709,7 @@ static int
Curl_is_formadd_string(CURLformoption option)
{
- switch(option) {
+ switch (option) {
case CURLFORM_FILENAME:
case CURLFORM_CONTENTTYPE:
@@ -754,8 +745,8 @@ Curl_formadd_convert(struct curl_forms * forms,
{
int l;
- char *cp;
- char *cp2;
+ char * cp;
+ char * cp2;
if(formx < 0 || !forms[formx].value)
return 0;
@@ -804,7 +795,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
struct curl_forms * lforms;
struct curl_forms * tforms;
unsigned int lformlen;
- const char *value;
+ const char * value;
unsigned int ccsid;
int nargs;
int namex;
@@ -832,7 +823,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
/* Allocate the local curl_forms array. */
lformlen = ALLOC_GRANULE;
- lforms = malloc(lformlen * sizeof(*lforms));
+ lforms = malloc(lformlen * sizeof *lforms);
if(!lforms)
return CURL_FORMADD_MEMORY;
@@ -854,7 +845,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
if(nargs >= lformlen) {
lformlen += ALLOC_GRANULE;
- tforms = realloc(lforms, lformlen * sizeof(*lforms));
+ tforms = realloc(lforms, lformlen * sizeof *lforms);
if(!tforms) {
result = CURL_FORMADD_MEMORY;
@@ -884,7 +875,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
/* Dispatch by option. */
- switch(option) {
+ switch (option) {
case CURLFORM_END:
forms = (struct curl_forms *) NULL; /* Leave array mode. */
@@ -1074,11 +1065,11 @@ typedef struct {
static size_t
-Curl_formget_callback_ccsid(void *arg, const char *buf, size_t len)
+Curl_formget_callback_ccsid(void * arg, const char * buf, size_t len)
{
cfcdata * p;
- char *b;
+ char * b;
int l;
size_t ret;
@@ -1106,7 +1097,7 @@ Curl_formget_callback_ccsid(void *arg, const char *buf, size_t len)
int
-curl_formget_ccsid(struct curl_httppost *form, void *arg,
+curl_formget_ccsid(struct curl_httppost * form, void * arg,
curl_formget_callback append, unsigned int ccsid)
{
@@ -1120,14 +1111,14 @@ curl_formget_ccsid(struct curl_httppost *form, void *arg,
CURLcode
-curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
+curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
{
CURLcode result;
va_list arg;
- struct Curl_easy *data;
- char *s;
- char *cp;
+ struct Curl_easy * data;
+ char * s;
+ char * cp;
unsigned int ccsid;
curl_off_t pfsize;
static char testwarn = 1;
@@ -1141,16 +1132,21 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
if(testwarn) {
testwarn = 0;
- if((int) STRING_LASTZEROTERMINATED != (int) STRING_SASL_AUTHZID + 1 ||
+ if(
+#ifdef USE_ALTSVC
+ (int) STRING_LASTZEROTERMINATED != (int) STRING_ALTSVC + 1 ||
+#else
+ (int) STRING_LASTZEROTERMINATED != (int) STRING_DOH + 1 ||
+#endif
(int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1)
curl_mfprintf(stderr,
"*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n");
- }
+ }
data = (struct Curl_easy *) curl;
va_start(arg, tag);
- switch(tag) {
+ switch (tag) {
case CURLOPT_ABSTRACT_UNIX_SOCKET:
case CURLOPT_ALTSVC:
@@ -1208,7 +1204,6 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
case CURLOPT_RTSP_SESSION_ID:
case CURLOPT_RTSP_STREAM_URI:
case CURLOPT_RTSP_TRANSPORT:
- case CURLOPT_SASL_AUTHZID:
case CURLOPT_SERVICE_NAME:
case CURLOPT_SOCKS5_GSSAPI_SERVICE:
case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
@@ -1240,8 +1235,8 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
if(!s) {
result = CURLE_OUT_OF_MEMORY;
break;
+ }
}
- }
result = curl_easy_setopt(curl, tag, s);
free(s);
@@ -1259,7 +1254,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
if(!s || !pfsize || ccsid == NOCONV_CCSID || ccsid == ASCII_CCSID) {
result = curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, s);
break;
- }
+ }
if(pfsize == -1) {
/* Data is null-terminated. */
@@ -1277,7 +1272,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
if(pfsize < 0 || pfsize > SIZE_MAX) {
result = CURLE_OUT_OF_MEMORY;
break;
- }
+ }
len = pfsize;
pfsize = len * MAX_CONV_EXPANSION;
@@ -1290,7 +1285,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
if(!cp) {
result = CURLE_OUT_OF_MEMORY;
break;
- }
+ }
pfsize = convert(cp, pfsize, ASCII_CCSID, s, len, ccsid);
@@ -1298,11 +1293,11 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
free(cp);
result = CURLE_OUT_OF_MEMORY;
break;
- }
+ }
data->set.postfieldsize = pfsize; /* Replace data size. */
s = cp;
- }
+ }
result = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, s);
data->set.str[STRING_COPYPOSTFIELDS] = s; /* Give to library. */
@@ -1310,9 +1305,9 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
case CURLOPT_ERRORBUFFER: /* This is an output buffer. */
default:
- result = Curl_vsetopt(curl, tag, arg);
+ result = Curl_vsetopt(data, tag, arg);
break;
- }
+ }
va_end(arg);
return result;
@@ -1350,12 +1345,13 @@ curl_pushheader_byname_ccsid(struct curl_pushheaders *h, const char *header,
{
char *d = (char *) NULL;
+ char *s;
if(header) {
header = dynconvert(ASCII_CCSID, header, -1, ccsidin);
if(header) {
- char *s = curl_pushheader_byname(h, header);
+ s = curl_pushheader_byname(h, header);
free((char *) header);
if(s)
diff --git a/packages/OS400/ccsidcurl.h b/packages/OS400/ccsidcurl.h
index 9594f6610..895db7002 100644
--- a/packages/OS400/ccsidcurl.h
+++ b/packages/OS400/ccsidcurl.h
@@ -1,5 +1,3 @@
-#ifndef CURLINC_CCSIDCURL_H
-#define CURLINC_CCSIDCURL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +20,10 @@
*
*
***************************************************************************/
+
+#ifndef __CURL_CCSIDCURL_H
+#define __CURL_CCSIDCURL_H
+
#include "curl.h"
#include "easy.h"
#include "multi.h"
diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in
index 8be6c8986..72a769f1d 100644
--- a/packages/OS400/curl.inc.in
+++ b/packages/OS400/curl.inc.in
@@ -138,8 +138,6 @@
d c X'00800000'
d CURL_VERSION_ALTSVC...
d c X'01000000'
- d CURL_VERSION_HTTP3...
- d c X'02000000'
*
d CURL_HTTPPOST_FILENAME...
d c X'00000001'
@@ -1418,10 +1416,6 @@
d c 00286
d CURLOPT_ALTSVC...
d c 10287
- d CURLOPT_MAXAGE_CONN...
- d c 00288
- d CURLOPT_SASL_AUTHZID...
- d c 10289
*
/if not defined(CURL_NO_OLDIES)
d CURLOPT_FILE c 10001
@@ -1841,8 +1835,6 @@
d c 20014
d CURLMOPT_PUSHDATA...
d c 10015
- d CURLMOPT_MAX_CONCURRENT_STREAMS...
- d c 10016
*
* Bitmask bits for CURLMOPT_PIPELING.
*
diff --git a/packages/OS400/os400sys.c b/packages/OS400/os400sys.c
index 3490fc779..c80f01080 100644
--- a/packages/OS400/os400sys.c
+++ b/packages/OS400/os400sys.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -195,7 +195,7 @@ buffer_threaded(localkey_t key, long size)
/* Allocate buffer descriptors for the current thread. */
- bufs = calloc((size_t) LK_LAST, sizeof(*bufs));
+ bufs = calloc((size_t) LK_LAST, sizeof *bufs);
if(!bufs)
return (char *) NULL;
@@ -224,7 +224,7 @@ buffer_undef(localkey_t key, long size)
if(Curl_thread_buffer == buffer_undef) { /* If unchanged during lock. */
if(!pthread_key_create(&thdkey, thdbufdestroy))
Curl_thread_buffer = buffer_threaded;
- else if(!(locbufs = calloc((size_t) LK_LAST, sizeof(*locbufs)))) {
+ else if(!(locbufs = calloc((size_t) LK_LAST, sizeof *locbufs))) {
pthread_mutex_unlock(&mutex);
return (char *) NULL;
}
@@ -268,9 +268,13 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
int flags)
{
- char *enodename = NULL;
- char *eservname = NULL;
+ char * enodename;
+ char * eservname;
int status;
+ int i;
+
+ enodename = (char *) NULL;
+ eservname = (char *) NULL;
if(nodename && nodenamelen) {
enodename = malloc(nodenamelen);
@@ -290,7 +294,6 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
eservname, servnamelen, flags);
if(!status) {
- int i;
if(enodename) {
i = QadrtConvertE2A(nodename, enodename,
nodenamelen - 1, strlen(enodename));
@@ -386,11 +389,12 @@ Curl_gsk_environment_open(gsk_handle * my_env_handle)
{
struct Curl_gsk_descriptor * p;
+ gsk_handle h;
int rc;
if(!my_env_handle)
return GSK_OS400_ERROR_INVALID_POINTER;
- p = (struct Curl_gsk_descriptor *) malloc(sizeof(*p));
+ p = (struct Curl_gsk_descriptor *) malloc(sizeof *p);
if(!p)
return GSK_INSUFFICIENT_STORAGE;
p->strlist = (struct gskstrlist *) NULL;
@@ -417,7 +421,7 @@ Curl_gsk_secure_soc_open(gsk_handle my_env_handle,
if(!my_session_handle)
return GSK_OS400_ERROR_INVALID_POINTER;
h = ((struct Curl_gsk_descriptor *) my_env_handle)->h;
- p = (struct Curl_gsk_descriptor *) malloc(sizeof(*p));
+ p = (struct Curl_gsk_descriptor *) malloc(sizeof *p);
if(!p)
return GSK_INSUFFICIENT_STORAGE;
p->strlist = (struct gskstrlist *) NULL;
@@ -598,7 +602,7 @@ cachestring(struct Curl_gsk_descriptor * p,
if(sp->ebcdicstr == ebcdicbuf)
break;
if(!sp) {
- sp = (struct gskstrlist *) malloc(sizeof(*sp));
+ sp = (struct gskstrlist *) malloc(sizeof *sp);
if(!sp)
return GSK_INSUFFICIENT_STORAGE;
asciibuf = malloc(bufsize + 1);
@@ -763,13 +767,16 @@ static int
Curl_gss_convert_in_place(OM_uint32 * minor_status, gss_buffer_t buf)
{
- unsigned int i = buf->length;
+ unsigned int i;
+ char * t;
/* Convert `buf' in place, from EBCDIC to ASCII.
If error, release the buffer and return -1. Else return 0. */
+ i = buf->length;
+
if(i) {
- char *t = malloc(i);
+ t = malloc(i);
if(!t) {
gss_release_buffer(minor_status, buf);
@@ -800,7 +807,7 @@ Curl_gss_import_name_a(OM_uint32 * minor_status, gss_buffer_t in_name,
if(!in_name || !in_name->value || !in_name->length)
return gss_import_name(minor_status, in_name, in_name_type, out_name);
- memcpy((char *) &in, (char *) in_name, sizeof(in));
+ memcpy((char *) &in, (char *) in_name, sizeof in);
i = in.length;
in.value = malloc(i + 1);
@@ -859,6 +866,7 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status,
{
int rc;
+ unsigned int i;
gss_buffer_desc in;
gss_buffer_t inp;
@@ -867,7 +875,7 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status,
if(inp) {
if(inp->length && inp->value) {
- unsigned int i = inp->length;
+ i = inp->length;
in.value = malloc(i + 1);
if(!in.value) {
@@ -1048,7 +1056,7 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
for(i = 0; attrs[i++];)
;
- eattrs = calloc(i, sizeof(*eattrs));
+ eattrs = calloc(i, sizeof *eattrs);
if(!eattrs)
status = LDAP_NO_MEMORY;
else {
@@ -1227,18 +1235,19 @@ Curl_ldap_next_attribute_a(void * ld,
static int
-sockaddr2ebcdic(struct sockaddr_storage *dstaddr,
- const struct sockaddr *srcaddr, int srclen)
+convert_sockaddr(struct sockaddr_storage * dstaddr,
+ const struct sockaddr * srcaddr, int srclen)
+
{
- const struct sockaddr_un *srcu;
- struct sockaddr_un *dstu;
+ const struct sockaddr_un * srcu;
+ struct sockaddr_un * dstu;
unsigned int i;
unsigned int dstsize;
- /* Convert a socket address to job CCSID, if needed. */
+ /* Convert a socket address into job CCSID, if needed. */
if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
- sizeof(srcaddr->sa_family) || srclen > sizeof(*dstaddr)) {
+ sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
errno = EINVAL;
return -1;
}
@@ -1250,55 +1259,13 @@ sockaddr2ebcdic(struct sockaddr_storage *dstaddr,
case AF_UNIX:
srcu = (const struct sockaddr_un *) srcaddr;
dstu = (struct sockaddr_un *) dstaddr;
- dstsize = sizeof(*dstaddr) - offsetof(struct sockaddr_un, sun_path);
+ dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);
srclen -= offsetof(struct sockaddr_un, sun_path);
i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);
dstu->sun_path[i] = '\0';
- srclen = i + offsetof(struct sockaddr_un, sun_path);
- }
-
- return srclen;
-}
-
-
-static int
-sockaddr2ascii(struct sockaddr *dstaddr, int dstlen,
- const struct sockaddr_storage *srcaddr, int srclen)
-{
- const struct sockaddr_un *srcu;
- struct sockaddr_un *dstu;
- unsigned int dstsize;
-
- /* Convert a socket address to ASCII, if needed. */
-
- if(!srclen)
- return 0;
- if(srclen > dstlen)
- srclen = dstlen;
- if(!srcaddr || srclen < 0) {
- errno = EINVAL;
- return -1;
- }
-
- memcpy((char *) dstaddr, (char *) srcaddr, srclen);
-
- if(srclen >= offsetof(struct sockaddr_storage, ss_family) +
- sizeof(srcaddr->ss_family)) {
- switch (srcaddr->ss_family) {
-
- case AF_UNIX:
- srcu = (const struct sockaddr_un *) srcaddr;
- dstu = (struct sockaddr_un *) dstaddr;
- dstsize = dstlen - offsetof(struct sockaddr_un, sun_path);
- srclen -= offsetof(struct sockaddr_un, sun_path);
- if(dstsize > 0 && srclen > 0) {
- srclen = QadrtConvertE2A(dstu->sun_path, srcu->sun_path,
- dstsize - 1, srclen);
- dstu->sun_path[srclen] = '\0';
- }
- srclen += offsetof(struct sockaddr_un, sun_path);
+ i += offsetof(struct sockaddr_un, sun_path);
+ srclen = i;
}
- }
return srclen;
}
@@ -1306,11 +1273,12 @@ sockaddr2ascii(struct sockaddr *dstaddr, int dstlen,
int
Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
+
{
int i;
struct sockaddr_storage laddr;
- i = sockaddr2ebcdic(&laddr, destaddr, addrlen);
+ i = convert_sockaddr(&laddr, destaddr, addrlen);
if(i < 0)
return -1;
@@ -1321,11 +1289,12 @@ Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
int
Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
+
{
int i;
struct sockaddr_storage laddr;
- i = sockaddr2ebcdic(&laddr, localaddr, addrlen);
+ i = convert_sockaddr(&laddr, localaddr, addrlen);
if(i < 0)
return -1;
@@ -1337,11 +1306,12 @@ Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
int
Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
struct sockaddr * dstaddr, int addrlen)
+
{
int i;
struct sockaddr_storage laddr;
- i = sockaddr2ebcdic(&laddr, dstaddr, addrlen);
+ i = convert_sockaddr(&laddr, dstaddr, addrlen);
if(i < 0)
return -1;
@@ -1353,14 +1323,19 @@ Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
int
Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
struct sockaddr * fromaddr, int * addrlen)
+
{
+ int i;
int rcvlen;
+ int laddrlen;
+ const struct sockaddr_un * srcu;
+ struct sockaddr_un * dstu;
struct sockaddr_storage laddr;
- int laddrlen = sizeof(laddr);
if(!fromaddr || !addrlen || *addrlen <= 0)
return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
+ laddrlen = sizeof laddr;
laddr.ss_family = AF_UNSPEC; /* To detect if unused. */
rcvlen = recvfrom(sd, buffer, buflen, flags,
(struct sockaddr *) &laddr, &laddrlen);
@@ -1368,51 +1343,36 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
if(rcvlen < 0)
return rcvlen;
- if(laddr.ss_family == AF_UNSPEC)
- laddrlen = 0;
- else {
- laddrlen = sockaddr2ascii(fromaddr, *addrlen, &laddr, laddrlen);
- if(laddrlen < 0)
- return laddrlen;
- }
- *addrlen = laddrlen;
- return rcvlen;
-}
+ switch (laddr.ss_family) {
+ case AF_UNIX:
+ srcu = (const struct sockaddr_un *) &laddr;
+ dstu = (struct sockaddr_un *) fromaddr;
+ i = *addrlen - offsetof(struct sockaddr_un, sun_path);
+ laddrlen -= offsetof(struct sockaddr_un, sun_path);
+ i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
+ laddrlen = i + offsetof(struct sockaddr_un, sun_path);
-int
-Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen)
-{
- struct sockaddr_storage laddr;
- int laddrlen = sizeof(laddr);
- int retcode = getpeername(sd, (struct sockaddr *) &laddr, &laddrlen);
-
- if(!retcode) {
- laddrlen = sockaddr2ascii(addr, *addrlen, &laddr, laddrlen);
- if(laddrlen < 0)
- return laddrlen;
- *addrlen = laddrlen;
- }
+ if(laddrlen < *addrlen)
+ dstu->sun_path[i] = '\0';
- return retcode;
-}
+ break;
+ case AF_UNSPEC:
+ break;
-int
-Curl_os400_getsockname(int sd, struct sockaddr *addr, int *addrlen)
-{
- struct sockaddr_storage laddr;
- int laddrlen = sizeof(laddr);
- int retcode = getsockname(sd, (struct sockaddr *) &laddr, &laddrlen);
-
- if(!retcode) {
- laddrlen = sockaddr2ascii(addr, *addrlen, &laddr, laddrlen);
- if(laddrlen < 0)
- return laddrlen;
- *addrlen = laddrlen;
- }
+ default:
+ if(laddrlen > *addrlen)
+ laddrlen = *addrlen;
+
+ if(laddrlen)
+ memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
+
+ break;
+ }
- return retcode;
+ *addrlen = laddrlen;
+ return rcvlen;
}
diff --git a/packages/vms/config_h.com b/packages/vms/config_h.com
index 967eb40de..0f1fa0f62 100644
--- a/packages/vms/config_h.com
+++ b/packages/vms/config_h.com
@@ -825,6 +825,19 @@ $ endif
$ goto cfgh_in_loop1
$ endif
$!
+$ if key2 .eqs. "HAVE_SSL_GET_SHUTDOWN"
+$ then
+$ if f$search("''ssl_header_dir'ssl.h") .nes. ""
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ else
+$ write tf "/* #undef ''key2' */"
+$ endif
+$ goto cfgh_in_loop1
+$ endif
+$!
$ if key2b .eqs. "RAND" .and. key2c .nes. "" .and. key2d .eqs. ""
$ then
$ if (key2c .eqs. "EGD") .or. -
diff --git a/packages/vms/curl_crtl_init.c b/packages/vms/curl_crtl_init.c
index 7a8d84743..01a34e555 100644
--- a/packages/vms/curl_crtl_init.c
+++ b/packages/vms/curl_crtl_init.c
@@ -183,6 +183,7 @@ static void set_features(void)
status = sys_trnlnm("GNV$UNIX_SHELL",
unix_shell_name, sizeof unix_shell_name -1);
if (!$VMS_STATUS_SUCCESS(status)) {
+ unix_shell_name[0] = 0;
use_unix_settings = 0;
}
diff --git a/packages/vms/generate_config_vms_h_curl.com b/packages/vms/generate_config_vms_h_curl.com
index 62870da5e..16e6dd7a2 100644
--- a/packages/vms/generate_config_vms_h_curl.com
+++ b/packages/vms/generate_config_vms_h_curl.com
@@ -328,6 +328,9 @@ $write cvh "#endif"
$write cvh "#ifdef USE_CYASSL"
$write cvh "#undef USE_CYASSL"
$write cvh "#endif"
+$write cvh "#ifdef USE_DARWINSSL"
+$write cvh "#undef USE_DARWINSSL"
+$write cvh "#endif"
$write cvh "#ifdef USE_GNUTLS"
$write cvh "#undef USE_GNUTLS"
$write cvh "#endif"
@@ -352,6 +355,9 @@ $write cvh "#endif"
$write cvh "#ifdef USE_POLARSSL"
$write cvh "#undef USE_POLARSSL"
$write cvh "#endif"
+$write cvh "#ifdef USE_SCHANNEL"
+$write cvh "#undef USE_SCHANNEL"
+$write cvh "#endif"
$write cvh "#ifdef USE_THREADS_POSIX"
$write cvh "#undef USE_THREADS_POSIX"
$write cvh "#endif"
@@ -361,6 +367,9 @@ $write cvh "#endif"
$write cvh "#ifdef USE_UNIX_SOCKETS"
$write cvh "#undef USE_UNIX_SOCKETS"
$write cvh "#endif"
+$write cvh "#ifdef USE_WINDOWS_SSPI"
+$write cvh "#undef USE_WINDOWS_SSPI"
+$write cvh "#endif"
$!
$write cvh "#ifndef HAVE_OLD_GSSMIT"
$write cvh "#define gss_nt_service_name GSS_C_NT_HOSTBASED_SERVICE"
diff --git a/plan9/BUILD.PLAN9.txt b/plan9/BUILD.PLAN9.txt
deleted file mode 100644
index 6df23d31a..000000000
--- a/plan9/BUILD.PLAN9.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-Prerequirement
-==============
-This document describes how to compile, build and install curl and libcurl
-from sources using mk. To build it, you will require to install latest
-9legacy patches into Plan 9. Also Plan 9 still have no configuration option so
-both zlib and libopenssl are required too.
-
-The zlib that is available on Plan 9 can be downloaded from:
-
- https://github.com/madler/zlib/pull/398
-
-LibreSSL Portable can be downloaded from:
-
- https://github.com/libressl-portable/portable/pull/510
-
-Instruction
-===========
-First, you should construct namespace as like described below:
-
-% bind -ac ../lib lib
-% bind -ac ../src src
-% bind -ac ../include include
-% bind -ac .. .
-
-Then you will see as shown below (excerpt):
-
- curl.git/
- |_plan9
- | |_BUILD.PLAN9.txt
- | |_CHANGES
- | |_CMake
- | | :
- | |_mkfile
- | |_mkfile.proto
- | |_include
- | | |_Makefile.am
- | | | :
- | | |_mkfile
- | |_lib
- | | |_CMakeLists.txt
- | | | :
- | | |_mkfile
- | | |_mkfile.inc
- | |_src
- | | |_CMakeLists.txt
- | | | :
- | | |_mkfile
- | | |_mkfile.inc
- |_lib
- |_src
-
-After constructing namespace, you can run mk on plan9 directory.
-
-% mk
-% mk install
diff --git a/plan9/include/mkfile b/plan9/include/mkfile
deleted file mode 100644
index c1ed850fa..000000000
--- a/plan9/include/mkfile
+++ /dev/null
@@ -1,34 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-DIR=/sys/include/ape/curl
-HFILES=`{ls curl/*.h}
-
-all:V: $HFILES
-
-install:V: all
- mkdir -p $DIR
- cp curl/*.h $DIR/
-
-clean:V: $HFILES # do nothing
-
-nuke:V: clean
diff --git a/plan9/lib/mkfile b/plan9/lib/mkfile
deleted file mode 100644
index d7a7ac5e2..000000000
--- a/plan9/lib/mkfile
+++ /dev/null
@@ -1,39 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-<../mkfile.proto
-<|mkfile.inc
-
-CFLAGS=$CFLAGS -I../include -I. -c
-
-OFILES=${CSOURCES:%.c=%.$O}
-HFILES=$HHEADERS
-LIB=/$objtype/lib/ape/libcurl.a
-
-CLEANFILES=\
- ${LIB_VAUTH_CFILES:%.c=%.$O}\
- ${LIB_VTLS_CFILES:%.c=%.$O}\
-
-</sys/src/cmd/mklib
-
-%.$O: %.c
- $CC $CFLAGS -o $target $stem.c
diff --git a/plan9/lib/mkfile.inc b/plan9/lib/mkfile.inc
deleted file mode 100755
index 0966d773e..000000000
--- a/plan9/lib/mkfile.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/rc
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-# rename $(VAR) -> $VAR
-sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
diff --git a/plan9/mkfile b/plan9/mkfile
deleted file mode 100644
index a9b4fe6da..000000000
--- a/plan9/mkfile
+++ /dev/null
@@ -1,36 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-</sys/src/ape/config
-
-DIRS=\
- lib\
- src\
- include\
-
-default:V: all
-
-all install clean nuke:V:
- for(i in $DIRS) @{
- cd $i
- mk $target
- }
diff --git a/plan9/mkfile.proto b/plan9/mkfile.proto
deleted file mode 100644
index edb79f50d..000000000
--- a/plan9/mkfile.proto
+++ /dev/null
@@ -1,30 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-</sys/src/ape/config
-
-CFLAGS=\
- -D__PLAN9__\
- -D_POSIX_SOURCE\
- -D_BSD_EXTENSION\
- -D_SUSV2_SOURCE\
- -D_REENTRANT_SOURCE\
diff --git a/plan9/src/mkfile b/plan9/src/mkfile
deleted file mode 100644
index 889d06686..000000000
--- a/plan9/src/mkfile
+++ /dev/null
@@ -1,45 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-<../mkfile.proto
-<|mkfile.inc
-
-CFLAGS=$CFLAGS -I../include -I../lib -c
-
-OFILES=${CURL_CFILES:%.c=%.$O}
-HFILES=$CURL_HFILES
-
-LIB=\
- /$objtype/lib/ape/libcurl.a\
- /$objtype/lib/ape/libssl.a\
- /$objtype/lib/ape/libcrypto.a\
- /$objtype/lib/ape/libz.a\
-
-BIN=/$objtype/bin
-TARG=curl
-
-CLEANFILES=tool_hugehelp.c
-
-</sys/src/cmd/mkone
-
-tool_hugehelp.c:
- echo 'void hugehelp(void) {}' >$target
diff --git a/plan9/src/mkfile.inc b/plan9/src/mkfile.inc
deleted file mode 100755
index 0966d773e..000000000
--- a/plan9/src/mkfile.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/rc
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-
-# rename $(VAR) -> $VAR
-sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
diff --git a/projects/README b/projects/README
index 62b998656..be3e1e0e3 100644
--- a/projects/README
+++ b/projects/README
@@ -151,9 +151,9 @@ Notes
Legacy Windows and SSL
======================
- Some of the project configurations allow the use of Schannel, the native
- SSL library in Windows which forms part of Windows SSPI. However, Schannel
- in Windows <= XP is unable to connect to servers that no longer support the
- legacy handshakes and algorithms used by those versions. If you will be
- using curl in one of those earlier versions of Windows you should choose
- another SSL backend such as OpenSSL.
+ Some of the project configurations allow the use of WinSSL (specifically
+ Schannel from Windows SSPI), the native SSL library in Windows. However,
+ WinSSL in Windows <= XP is unable to connect to servers that no longer
+ support the legacy handshakes and algorithms used by those versions. If
+ you will be using curl in one of those earlier versions of Windows you
+ should choose another SSL backend such as OpenSSL.
diff --git a/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj
index 3765afd04..6ecf7ded6 100644
--- a/projects/Windows/VC10/lib/libcurl.vcxproj
+++ b/projects/Windows/VC10/lib/libcurl.vcxproj
@@ -234,282 +234,282 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -2338,7 +2338,6 @@
<ClCompile Include="..\..\..\..\lib\curl_endian.c" />
<ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />
<ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />
- <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />
<ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
@@ -2398,6 +2397,7 @@
<ClCompile Include="..\..\..\..\lib\openldap.c" />
<ClCompile Include="..\..\..\..\lib\parsedate.c" />
<ClCompile Include="..\..\..\..\lib\pingpong.c" />
+ <ClCompile Include="..\..\..\..\lib\pipeline.c" />
<ClCompile Include="..\..\..\..\lib\pop3.c" />
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
@@ -2412,12 +2412,13 @@
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
<ClCompile Include="..\..\..\..\lib\smtp.c" />
- <ClCompile Include="..\..\..\..\lib\socketpair.c" />
<ClCompile Include="..\..\..\..\lib\socks.c" />
<ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
<ClCompile Include="..\..\..\..\lib\speedcheck.c" />
<ClCompile Include="..\..\..\..\lib\splay.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
<ClCompile Include="..\..\..\..\lib\strcase.c" />
<ClCompile Include="..\..\..\..\lib\strdup.c" />
<ClCompile Include="..\..\..\..\lib\strerror.c" />
@@ -2446,6 +2447,7 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
@@ -2458,7 +2460,6 @@
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
<ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\altsvc.h" />
@@ -2477,7 +2478,6 @@
<ClInclude Include="..\..\..\..\lib\curl_endian.h" />
<ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />
<ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />
- <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
@@ -2536,10 +2536,10 @@
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\parsedate.h" />
<ClInclude Include="..\..\..\..\lib\pingpong.h" />
+ <ClInclude Include="..\..\..\..\lib\pipeline.h" />
<ClInclude Include="..\..\..\..\lib\pop3.h" />
<ClInclude Include="..\..\..\..\lib\progress.h" />
<ClInclude Include="..\..\..\..\lib\psl.h" />
- <ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
@@ -2552,7 +2552,6 @@
<ClInclude Include="..\..\..\..\lib\smb.h" />
<ClInclude Include="..\..\..\..\lib\smtp.h" />
<ClInclude Include="..\..\..\..\lib\sockaddr.h" />
- <ClInclude Include="..\..\..\..\lib\socketpair.h" />
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
@@ -2576,6 +2575,7 @@
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
@@ -2587,7 +2587,6 @@
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />
diff --git a/projects/Windows/VC10/src/curl.vcxproj b/projects/Windows/VC10/src/curl.vcxproj
index a4dfabca7..c4082ad72 100644
--- a/projects/Windows/VC10/src/curl.vcxproj
+++ b/projects/Windows/VC10/src/curl.vcxproj
@@ -234,282 +234,282 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -2662,7 +2662,6 @@
<ClCompile Include="..\..\..\..\src\tool_panykey.c" />
<ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
<ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
- <ClCompile Include="..\..\..\..\src\tool_progress.c" />
<ClCompile Include="..\..\..\..\src\tool_setopt.c" />
<ClCompile Include="..\..\..\..\src\tool_sleep.c" />
<ClCompile Include="..\..\..\..\src\tool_strdup.c" />
@@ -2710,7 +2709,6 @@
<ClInclude Include="..\..\..\..\src\tool_panykey.h" />
<ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
<ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
- <ClInclude Include="..\..\..\..\src\tool_progress.h" />
<ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
<ClInclude Include="..\..\..\..\src\tool_setopt.h" />
<ClInclude Include="..\..\..\..\src\tool_setup.h" />
diff --git a/projects/Windows/VC11/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj
index 595e4f7eb..42636c596 100644
--- a/projects/Windows/VC11/lib/libcurl.vcxproj
+++ b/projects/Windows/VC11/lib/libcurl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2394,7 +2394,6 @@
<ClCompile Include="..\..\..\..\lib\curl_endian.c" />
<ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />
<ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />
- <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />
<ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
@@ -2454,6 +2453,7 @@
<ClCompile Include="..\..\..\..\lib\openldap.c" />
<ClCompile Include="..\..\..\..\lib\parsedate.c" />
<ClCompile Include="..\..\..\..\lib\pingpong.c" />
+ <ClCompile Include="..\..\..\..\lib\pipeline.c" />
<ClCompile Include="..\..\..\..\lib\pop3.c" />
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
@@ -2468,12 +2468,13 @@
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
<ClCompile Include="..\..\..\..\lib\smtp.c" />
- <ClCompile Include="..\..\..\..\lib\socketpair.c" />
<ClCompile Include="..\..\..\..\lib\socks.c" />
<ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
<ClCompile Include="..\..\..\..\lib\speedcheck.c" />
<ClCompile Include="..\..\..\..\lib\splay.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
<ClCompile Include="..\..\..\..\lib\strcase.c" />
<ClCompile Include="..\..\..\..\lib\strdup.c" />
<ClCompile Include="..\..\..\..\lib\strerror.c" />
@@ -2502,6 +2503,7 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
@@ -2514,7 +2516,6 @@
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
<ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\altsvc.h" />
@@ -2533,7 +2534,6 @@
<ClInclude Include="..\..\..\..\lib\curl_endian.h" />
<ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />
<ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />
- <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
@@ -2592,10 +2592,10 @@
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\parsedate.h" />
<ClInclude Include="..\..\..\..\lib\pingpong.h" />
+ <ClInclude Include="..\..\..\..\lib\pipeline.h" />
<ClInclude Include="..\..\..\..\lib\pop3.h" />
<ClInclude Include="..\..\..\..\lib\progress.h" />
<ClInclude Include="..\..\..\..\lib\psl.h" />
- <ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
@@ -2608,7 +2608,6 @@
<ClInclude Include="..\..\..\..\lib\smb.h" />
<ClInclude Include="..\..\..\..\lib\smtp.h" />
<ClInclude Include="..\..\..\..\lib\sockaddr.h" />
- <ClInclude Include="..\..\..\..\lib\socketpair.h" />
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
@@ -2632,6 +2631,7 @@
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
@@ -2643,7 +2643,6 @@
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />
diff --git a/projects/Windows/VC11/src/curl.vcxproj b/projects/Windows/VC11/src/curl.vcxproj
index 0c9adcbc6..1682373d9 100644
--- a/projects/Windows/VC11/src/curl.vcxproj
+++ b/projects/Windows/VC11/src/curl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2718,7 +2718,6 @@
<ClCompile Include="..\..\..\..\src\tool_panykey.c" />
<ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
<ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
- <ClCompile Include="..\..\..\..\src\tool_progress.c" />
<ClCompile Include="..\..\..\..\src\tool_setopt.c" />
<ClCompile Include="..\..\..\..\src\tool_sleep.c" />
<ClCompile Include="..\..\..\..\src\tool_strdup.c" />
@@ -2766,7 +2765,6 @@
<ClInclude Include="..\..\..\..\src\tool_panykey.h" />
<ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
<ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
- <ClInclude Include="..\..\..\..\src\tool_progress.h" />
<ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
<ClInclude Include="..\..\..\..\src\tool_setopt.h" />
<ClInclude Include="..\..\..\..\src\tool_setup.h" />
diff --git a/projects/Windows/VC12/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj
index 2321d70ee..e0f168278 100644
--- a/projects/Windows/VC12/lib/libcurl.vcxproj
+++ b/projects/Windows/VC12/lib/libcurl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2394,7 +2394,6 @@
<ClCompile Include="..\..\..\..\lib\curl_endian.c" />
<ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />
<ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />
- <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />
<ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
@@ -2454,6 +2453,7 @@
<ClCompile Include="..\..\..\..\lib\openldap.c" />
<ClCompile Include="..\..\..\..\lib\parsedate.c" />
<ClCompile Include="..\..\..\..\lib\pingpong.c" />
+ <ClCompile Include="..\..\..\..\lib\pipeline.c" />
<ClCompile Include="..\..\..\..\lib\pop3.c" />
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
@@ -2468,12 +2468,13 @@
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
<ClCompile Include="..\..\..\..\lib\smtp.c" />
- <ClCompile Include="..\..\..\..\lib\socketpair.c" />
<ClCompile Include="..\..\..\..\lib\socks.c" />
<ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
<ClCompile Include="..\..\..\..\lib\speedcheck.c" />
<ClCompile Include="..\..\..\..\lib\splay.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
<ClCompile Include="..\..\..\..\lib\strcase.c" />
<ClCompile Include="..\..\..\..\lib\strdup.c" />
<ClCompile Include="..\..\..\..\lib\strerror.c" />
@@ -2502,6 +2503,7 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
@@ -2514,7 +2516,6 @@
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
<ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\altsvc.h" />
@@ -2533,7 +2534,6 @@
<ClInclude Include="..\..\..\..\lib\curl_endian.h" />
<ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />
<ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />
- <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
@@ -2592,10 +2592,10 @@
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\parsedate.h" />
<ClInclude Include="..\..\..\..\lib\pingpong.h" />
+ <ClInclude Include="..\..\..\..\lib\pipeline.h" />
<ClInclude Include="..\..\..\..\lib\pop3.h" />
<ClInclude Include="..\..\..\..\lib\progress.h" />
<ClInclude Include="..\..\..\..\lib\psl.h" />
- <ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
@@ -2608,7 +2608,6 @@
<ClInclude Include="..\..\..\..\lib\smb.h" />
<ClInclude Include="..\..\..\..\lib\smtp.h" />
<ClInclude Include="..\..\..\..\lib\sockaddr.h" />
- <ClInclude Include="..\..\..\..\lib\socketpair.h" />
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
@@ -2632,6 +2631,7 @@
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
@@ -2643,7 +2643,6 @@
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />
diff --git a/projects/Windows/VC12/src/curl.vcxproj b/projects/Windows/VC12/src/curl.vcxproj
index c03c56deb..8a865033b 100644
--- a/projects/Windows/VC12/src/curl.vcxproj
+++ b/projects/Windows/VC12/src/curl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2718,7 +2718,6 @@
<ClCompile Include="..\..\..\..\src\tool_panykey.c" />
<ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
<ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
- <ClCompile Include="..\..\..\..\src\tool_progress.c" />
<ClCompile Include="..\..\..\..\src\tool_setopt.c" />
<ClCompile Include="..\..\..\..\src\tool_sleep.c" />
<ClCompile Include="..\..\..\..\src\tool_strdup.c" />
@@ -2766,7 +2765,6 @@
<ClInclude Include="..\..\..\..\src\tool_panykey.h" />
<ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
<ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
- <ClInclude Include="..\..\..\..\src\tool_progress.h" />
<ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
<ClInclude Include="..\..\..\..\src\tool_setopt.h" />
<ClInclude Include="..\..\..\..\src\tool_setup.h" />
diff --git a/projects/Windows/VC14/lib/libcurl.vcxproj b/projects/Windows/VC14/lib/libcurl.vcxproj
index b57db7aaa..3a5ff95ec 100644
--- a/projects/Windows/VC14/lib/libcurl.vcxproj
+++ b/projects/Windows/VC14/lib/libcurl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2394,7 +2394,6 @@
<ClCompile Include="..\..\..\..\lib\curl_endian.c" />
<ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />
<ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />
- <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />
<ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
@@ -2454,6 +2453,7 @@
<ClCompile Include="..\..\..\..\lib\openldap.c" />
<ClCompile Include="..\..\..\..\lib\parsedate.c" />
<ClCompile Include="..\..\..\..\lib\pingpong.c" />
+ <ClCompile Include="..\..\..\..\lib\pipeline.c" />
<ClCompile Include="..\..\..\..\lib\pop3.c" />
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
@@ -2468,12 +2468,13 @@
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
<ClCompile Include="..\..\..\..\lib\smtp.c" />
- <ClCompile Include="..\..\..\..\lib\socketpair.c" />
<ClCompile Include="..\..\..\..\lib\socks.c" />
<ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
<ClCompile Include="..\..\..\..\lib\speedcheck.c" />
<ClCompile Include="..\..\..\..\lib\splay.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
<ClCompile Include="..\..\..\..\lib\strcase.c" />
<ClCompile Include="..\..\..\..\lib\strdup.c" />
<ClCompile Include="..\..\..\..\lib\strerror.c" />
@@ -2502,6 +2503,7 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
@@ -2514,7 +2516,6 @@
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
<ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\altsvc.h" />
@@ -2533,7 +2534,6 @@
<ClInclude Include="..\..\..\..\lib\curl_endian.h" />
<ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />
<ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />
- <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
@@ -2592,10 +2592,10 @@
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\parsedate.h" />
<ClInclude Include="..\..\..\..\lib\pingpong.h" />
+ <ClInclude Include="..\..\..\..\lib\pipeline.h" />
<ClInclude Include="..\..\..\..\lib\pop3.h" />
<ClInclude Include="..\..\..\..\lib\progress.h" />
<ClInclude Include="..\..\..\..\lib\psl.h" />
- <ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
@@ -2608,7 +2608,6 @@
<ClInclude Include="..\..\..\..\lib\smb.h" />
<ClInclude Include="..\..\..\..\lib\smtp.h" />
<ClInclude Include="..\..\..\..\lib\sockaddr.h" />
- <ClInclude Include="..\..\..\..\lib\socketpair.h" />
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
@@ -2632,6 +2631,7 @@
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
@@ -2643,7 +2643,6 @@
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />
diff --git a/projects/Windows/VC14/src/curl.vcxproj b/projects/Windows/VC14/src/curl.vcxproj
index 368066098..481e0be5d 100644
--- a/projects/Windows/VC14/src/curl.vcxproj
+++ b/projects/Windows/VC14/src/curl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2718,7 +2718,6 @@
<ClCompile Include="..\..\..\..\src\tool_panykey.c" />
<ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
<ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
- <ClCompile Include="..\..\..\..\src\tool_progress.c" />
<ClCompile Include="..\..\..\..\src\tool_setopt.c" />
<ClCompile Include="..\..\..\..\src\tool_sleep.c" />
<ClCompile Include="..\..\..\..\src\tool_strdup.c" />
@@ -2766,7 +2765,6 @@
<ClInclude Include="..\..\..\..\src\tool_panykey.h" />
<ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
<ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
- <ClInclude Include="..\..\..\..\src\tool_progress.h" />
<ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
<ClInclude Include="..\..\..\..\src\tool_setopt.h" />
<ClInclude Include="..\..\..\..\src\tool_setup.h" />
diff --git a/projects/Windows/VC15/lib/libcurl.vcxproj b/projects/Windows/VC15/lib/libcurl.vcxproj
index 1a19d32ef..bcc3ba237 100644
--- a/projects/Windows/VC15/lib/libcurl.vcxproj
+++ b/projects/Windows/VC15/lib/libcurl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -2366,7 +2366,6 @@
<ClCompile Include="..\..\..\..\lib\curl_endian.c" />
<ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />
<ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />
- <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />
<ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
@@ -2426,6 +2425,7 @@
<ClCompile Include="..\..\..\..\lib\openldap.c" />
<ClCompile Include="..\..\..\..\lib\parsedate.c" />
<ClCompile Include="..\..\..\..\lib\pingpong.c" />
+ <ClCompile Include="..\..\..\..\lib\pipeline.c" />
<ClCompile Include="..\..\..\..\lib\pop3.c" />
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
@@ -2440,12 +2440,13 @@
<ClCompile Include="..\..\..\..\lib\slist.c" />
<ClCompile Include="..\..\..\..\lib\smb.c" />
<ClCompile Include="..\..\..\..\lib\smtp.c" />
- <ClCompile Include="..\..\..\..\lib\socketpair.c" />
<ClCompile Include="..\..\..\..\lib\socks.c" />
<ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
<ClCompile Include="..\..\..\..\lib\speedcheck.c" />
<ClCompile Include="..\..\..\..\lib\splay.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh.c" />
+ <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
<ClCompile Include="..\..\..\..\lib\strcase.c" />
<ClCompile Include="..\..\..\..\lib\strdup.c" />
<ClCompile Include="..\..\..\..\lib\strerror.c" />
@@ -2474,6 +2475,7 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
@@ -2486,7 +2488,6 @@
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
<ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\altsvc.h" />
@@ -2505,7 +2506,6 @@
<ClInclude Include="..\..\..\..\lib\curl_endian.h" />
<ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />
<ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />
- <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
@@ -2564,10 +2564,10 @@
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\parsedate.h" />
<ClInclude Include="..\..\..\..\lib\pingpong.h" />
+ <ClInclude Include="..\..\..\..\lib\pipeline.h" />
<ClInclude Include="..\..\..\..\lib\pop3.h" />
<ClInclude Include="..\..\..\..\lib\progress.h" />
<ClInclude Include="..\..\..\..\lib\psl.h" />
- <ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
@@ -2580,7 +2580,6 @@
<ClInclude Include="..\..\..\..\lib\smb.h" />
<ClInclude Include="..\..\..\..\lib\smtp.h" />
<ClInclude Include="..\..\..\..\lib\sockaddr.h" />
- <ClInclude Include="..\..\..\..\lib\socketpair.h" />
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
@@ -2604,6 +2603,7 @@
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
@@ -2615,7 +2615,6 @@
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />
diff --git a/projects/Windows/VC15/src/curl.vcxproj b/projects/Windows/VC15/src/curl.vcxproj
index f1d448339..92043d4d7 100644
--- a/projects/Windows/VC15/src/curl.vcxproj
+++ b/projects/Windows/VC15/src/curl.vcxproj
@@ -234,337 +234,337 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
- <CharacterSet>Unicode</CharacterSet>
+ <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -1220,6 +1220,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1250,6 +1251,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1281,6 +1283,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1312,6 +1315,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1342,6 +1346,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1372,6 +1377,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1403,6 +1409,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1434,6 +1441,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1464,6 +1472,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1495,6 +1504,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1525,6 +1535,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1555,6 +1566,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1586,6 +1598,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1617,6 +1630,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1824,6 +1838,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1855,6 +1870,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1944,6 +1960,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1975,6 +1992,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2064,6 +2082,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2095,6 +2114,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2184,6 +2204,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2215,6 +2236,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2304,6 +2326,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2335,6 +2358,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2424,6 +2448,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2454,6 +2479,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2485,6 +2511,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2516,6 +2543,7 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -2690,7 +2718,6 @@
<ClCompile Include="..\..\..\..\src\tool_panykey.c" />
<ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
<ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
- <ClCompile Include="..\..\..\..\src\tool_progress.c" />
<ClCompile Include="..\..\..\..\src\tool_setopt.c" />
<ClCompile Include="..\..\..\..\src\tool_sleep.c" />
<ClCompile Include="..\..\..\..\src\tool_strdup.c" />
@@ -2738,7 +2765,6 @@
<ClInclude Include="..\..\..\..\src\tool_panykey.h" />
<ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
<ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
- <ClInclude Include="..\..\..\..\src\tool_progress.h" />
<ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
<ClInclude Include="..\..\..\..\src\tool_setopt.h" />
<ClInclude Include="..\..\..\..\src\tool_setup.h" />
diff --git a/projects/Windows/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp
index cd7bcd9df..9681f6bf2 100644
--- a/projects/Windows/VC6/lib/libcurl.dsp
+++ b/projects/Windows/VC6/lib/libcurl.dsp
@@ -790,10 +790,6 @@ SOURCE=..\..\..\..\lib\curl_gethostname.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\curl_get_line.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\curl_gssapi.c
# End Source File
# Begin Source File
@@ -1030,6 +1026,10 @@ SOURCE=..\..\..\..\lib\pingpong.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\pipeline.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\pop3.c
# End Source File
# Begin Source File
@@ -1086,10 +1086,6 @@ SOURCE=..\..\..\..\lib\smtp.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\socketpair.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\socks.c
# End Source File
# Begin Source File
@@ -1110,6 +1106,14 @@ SOURCE=..\..\..\..\lib\splay.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\ssh.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\ssh-libssh.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\strcase.c
# End Source File
# Begin Source File
@@ -1222,6 +1226,10 @@ SOURCE=..\..\..\..\lib\vauth\vauth.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\vtls\cyassl.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\vtls\gskit.c
# End Source File
# Begin Source File
@@ -1268,10 +1276,6 @@ SOURCE=..\..\..\..\lib\vtls\sectransp.c
SOURCE=..\..\..\..\lib\vtls\vtls.c
# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\lib\vtls\wolfssl.c
-# End Source File
# End Group
# Begin Group "Header Files"
@@ -1342,10 +1346,6 @@ SOURCE=..\..\..\..\lib\curl_gethostname.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\curl_get_line.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\curl_gssapi.h
# End Source File
# Begin Source File
@@ -1578,19 +1578,19 @@ SOURCE=..\..\..\..\lib\pingpong.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\pop3.h
+SOURCE=..\..\..\..\lib\pipeline.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\progress.h
+SOURCE=..\..\..\..\lib\pop3.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\psl.h
+SOURCE=..\..\..\..\lib\progress.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\quic.h
+SOURCE=..\..\..\..\lib\psl.h
# End Source File
# Begin Source File
@@ -1642,10 +1642,6 @@ SOURCE=..\..\..\..\lib\sockaddr.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\socketpair.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\socks.h
# End Source File
# Begin Source File
@@ -1738,6 +1734,10 @@ SOURCE=..\..\..\..\lib\vauth\vauth.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\vtls\cyassl.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\vtls\gskit.h
# End Source File
# Begin Source File
@@ -1780,10 +1780,6 @@ SOURCE=..\..\..\..\lib\vtls\sectransp.h
SOURCE=..\..\..\..\lib\vtls\vtls.h
# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\lib\vtls\wolfssl.h
-# End Source File
# End Group
# Begin Group "Resource Files"
diff --git a/projects/Windows/VC6/src/curl.dsp b/projects/Windows/VC6/src/curl.dsp
index ff2617a92..05dd73c78 100644
--- a/projects/Windows/VC6/src/curl.dsp
+++ b/projects/Windows/VC6/src/curl.dsp
@@ -819,10 +819,6 @@ SOURCE=..\..\..\..\src\tool_parsecfg.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_progress.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_setopt.c
# End Source File
# Begin Source File
@@ -1007,10 +1003,6 @@ SOURCE=..\..\..\..\src\tool_parsecfg.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_progress.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_sdecls.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj
index 9b35114c2..4c7cce6ef 100644
--- a/projects/Windows/VC7.1/lib/libcurl.vcproj
+++ b/projects/Windows/VC7.1/lib/libcurl.vcproj
@@ -1301,9 +1301,6 @@
RelativePath="..\..\..\..\lib\curl_gethostname.c">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.c">
</File>
<File
@@ -1481,6 +1478,9 @@
RelativePath="..\..\..\..\lib\pingpong.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.c">
</File>
<File
@@ -1523,9 +1523,6 @@
RelativePath="..\..\..\..\lib\smtp.c">
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.c">
</File>
<File
@@ -1541,6 +1538,12 @@
RelativePath="..\..\..\..\lib\splay.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\ssh.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\ssh-libssh.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\strcase.c">
</File>
<File
@@ -1641,9 +1644,6 @@
RelativePath="..\..\..\..\lib\curl_gethostname.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.h">
</File>
<File
@@ -1818,6 +1818,9 @@
RelativePath="..\..\..\..\lib\pingpong.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.h">
</File>
<File
@@ -1827,9 +1830,6 @@
RelativePath="..\..\..\..\lib\psl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\quic.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\rand.h">
</File>
<File
@@ -1866,9 +1866,6 @@
RelativePath="..\..\..\..\lib\sockaddr.h">
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.h">
</File>
<File
@@ -2000,6 +1997,9 @@
Name="Source Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c">
</File>
<File
@@ -2035,14 +2035,14 @@
<File
RelativePath="..\..\..\..\lib\vtls\vtls.c">
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.c">
- </File>
</Filter>
<Filter
Name="Header Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h">
</File>
<File
@@ -2075,9 +2075,6 @@
<File
RelativePath="..\..\..\..\lib\vtls\vtls.h">
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.h">
- </File>
</Filter>
</Filter>
</Files>
diff --git a/projects/Windows/VC7.1/src/curl.vcproj b/projects/Windows/VC7.1/src/curl.vcproj
index 00f6a7f6a..8fecea6b7 100644
--- a/projects/Windows/VC7.1/src/curl.vcproj
+++ b/projects/Windows/VC7.1/src/curl.vcproj
@@ -1467,9 +1467,6 @@
RelativePath="..\..\..\..\src\tool_parsecfg.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_setopt.c">
</File>
<File
@@ -1609,9 +1606,6 @@
RelativePath="..\..\..\..\src\tool_parsecfg.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_sdecls.h">
</File>
<File
diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj
index ce38525fb..8d873874c 100644
--- a/projects/Windows/VC7/lib/libcurl.vcproj
+++ b/projects/Windows/VC7/lib/libcurl.vcproj
@@ -1155,9 +1155,6 @@
RelativePath="..\..\..\..\lib\curl_gethostname.c">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.c">
</File>
<File
@@ -1335,6 +1332,9 @@
RelativePath="..\..\..\..\lib\pingpong.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.c">
</File>
<File
@@ -1377,9 +1377,6 @@
RelativePath="..\..\..\..\lib\smtp.c">
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.c">
</File>
<File
@@ -1395,6 +1392,12 @@
RelativePath="..\..\..\..\lib\splay.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\ssh.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\ssh-libssh.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\strcase.c">
</File>
<File
@@ -1495,9 +1498,6 @@
RelativePath="..\..\..\..\lib\curl_gethostname.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.h">
</File>
<File
@@ -1672,6 +1672,9 @@
RelativePath="..\..\..\..\lib\pingpong.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.h">
</File>
<File
@@ -1681,9 +1684,6 @@
RelativePath="..\..\..\..\lib\psl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\quic.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\rand.h">
</File>
<File
@@ -1720,9 +1720,6 @@
RelativePath="..\..\..\..\lib\sockaddr.h">
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.h">
</File>
<File
@@ -1854,6 +1851,9 @@
Name="Source Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c">
</File>
<File
@@ -1889,14 +1889,14 @@
<File
RelativePath="..\..\..\..\lib\vtls\vtls.c">
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.c">
- </File>
</Filter>
<Filter
Name="Header Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h">
</File>
<File
@@ -1929,9 +1929,6 @@
<File
RelativePath="..\..\..\..\lib\vtls\vtls.h">
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.h">
- </File>
</Filter>
</Filter>
</Files>
diff --git a/projects/Windows/VC7/src/curl.vcproj b/projects/Windows/VC7/src/curl.vcproj
index fe5a6a8fb..821aebc33 100644
--- a/projects/Windows/VC7/src/curl.vcproj
+++ b/projects/Windows/VC7/src/curl.vcproj
@@ -1321,9 +1321,6 @@
RelativePath="..\..\..\..\src\tool_parsecfg.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_setopt.c">
</File>
<File
@@ -1463,9 +1460,6 @@
RelativePath="..\..\..\..\src\tool_parsecfg.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_sdecls.h">
</File>
<File
diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj
index d572cc851..ce2bae6e5 100644
--- a/projects/Windows/VC8/lib/libcurl.vcproj
+++ b/projects/Windows/VC8/lib/libcurl.vcproj
@@ -3677,10 +3677,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.c"
>
</File>
@@ -3917,6 +3913,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.c"
>
</File>
@@ -3973,10 +3973,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.c"
>
</File>
@@ -3997,6 +3993,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\ssh.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\ssh-libssh.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\strcase.c"
>
</File>
@@ -4129,10 +4133,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.h"
>
</File>
@@ -4365,19 +4365,19 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\pop3.h"
+ RelativePath="..\..\..\..\lib\pipeline.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\progress.h"
+ RelativePath="..\..\..\..\lib\pop3.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\psl.h"
+ RelativePath="..\..\..\..\lib\progress.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\quic.h"
+ RelativePath="..\..\..\..\lib\psl.h"
>
</File>
<File
@@ -4429,10 +4429,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.h"
>
</File>
@@ -4600,6 +4596,10 @@
Name="Source Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c"
>
</File>
@@ -4647,15 +4647,15 @@
RelativePath="..\..\..\..\lib\vtls\vtls.c"
>
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.c"
- >
- </File>
</Filter>
<Filter
Name="Header Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h"
>
</File>
@@ -4699,10 +4699,6 @@
RelativePath="..\..\..\..\lib\vtls\vtls.h"
>
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.h"
- >
- </File>
</Filter>
</Filter>
</Files>
diff --git a/projects/Windows/VC8/src/curl.vcproj b/projects/Windows/VC8/src/curl.vcproj
index 7b554c788..fb031cf13 100644
--- a/projects/Windows/VC8/src/curl.vcproj
+++ b/projects/Windows/VC8/src/curl.vcproj
@@ -4221,10 +4221,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_setopt.c"
>
</File>
@@ -4409,10 +4405,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_sdecls.h"
>
</File>
diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj
index 77c2e8bc3..45689a125 100644
--- a/projects/Windows/VC9/lib/libcurl.vcproj
+++ b/projects/Windows/VC9/lib/libcurl.vcproj
@@ -3618,10 +3618,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.c"
>
</File>
@@ -3858,6 +3854,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\pipeline.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\pop3.c"
>
</File>
@@ -3914,10 +3914,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.c"
>
</File>
@@ -3938,6 +3934,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\ssh.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\ssh-libssh.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\strcase.c"
>
</File>
@@ -4070,10 +4074,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_get_line.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_gssapi.h"
>
</File>
@@ -4306,19 +4306,19 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\pop3.h"
+ RelativePath="..\..\..\..\lib\pipeline.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\progress.h"
+ RelativePath="..\..\..\..\lib\pop3.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\psl.h"
+ RelativePath="..\..\..\..\lib\progress.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\quic.h"
+ RelativePath="..\..\..\..\lib\psl.h"
>
</File>
<File
@@ -4370,10 +4370,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\socketpair.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\socks.h"
>
</File>
@@ -4541,6 +4537,10 @@
Name="Source Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c"
>
</File>
@@ -4588,15 +4588,15 @@
RelativePath="..\..\..\..\lib\vtls\vtls.c"
>
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.c"
- >
- </File>
</Filter>
<Filter
Name="Header Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\cyassl.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h"
>
</File>
@@ -4640,10 +4640,6 @@
RelativePath="..\..\..\..\lib\vtls\vtls.h"
>
</File>
- <File
- RelativePath="..\..\..\..\lib\vtls\wolfssl.h"
- >
- </File>
</Filter>
</Filter>
</Files>
diff --git a/projects/Windows/VC9/src/curl.vcproj b/projects/Windows/VC9/src/curl.vcproj
index 6e702f497..1d0ae65e2 100644
--- a/projects/Windows/VC9/src/curl.vcproj
+++ b/projects/Windows/VC9/src/curl.vcproj
@@ -4078,10 +4078,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_setopt.c"
>
</File>
@@ -4266,10 +4262,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_progress.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_sdecls.h"
>
</File>
diff --git a/projects/build-openssl.bat b/projects/build-openssl.bat
index c9633b448..96fccf87a 100644
--- a/projects/build-openssl.bat
+++ b/projects/build-openssl.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 2012 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2012 - 2018, Steve Holme, <steve_holme@hotmail.com>.
rem *
rem * This software is licensed as described in the file COPYING, which
rem * you should have received as part of this distribution. The terms
@@ -26,10 +26,9 @@ rem ***************************************************************************
if not "%OS%" == "Windows_NT" goto nodos
rem Set our variables
- setlocal ENABLEDELAYEDEXPANSION
+ setlocal
set VC_VER=
set BUILD_PLATFORM=
- set BUILD_CONFIG=
rem Ensure we have the required arguments
if /i "%~1" == "" goto syntax
@@ -45,112 +44,99 @@ rem ***************************************************************************
)
:parseArgs
- if not "%~1" == "" (
- if /i "%~1" == "vc6" (
- set VC_VER=6.0
- set VC_DESC=VC6
- set "VC_PATH=Microsoft Visual Studio\VC98"
- ) else if /i "%~1" == "vc7" (
- set VC_VER=7.0
- set VC_DESC=VC7
- set "VC_PATH=Microsoft Visual Studio .NET\Vc7"
- ) else if /i "%~1" == "vc7.1" (
- set VC_VER=7.1
- set VC_DESC=VC7.1
- set "VC_PATH=Microsoft Visual Studio .NET 2003\Vc7"
- ) else if /i "%~1" == "vc8" (
- set VC_VER=8.0
- set VC_DESC=VC8
- set "VC_PATH=Microsoft Visual Studio 8\VC"
- ) else if /i "%~1" == "vc9" (
- set VC_VER=9.0
- set VC_DESC=VC9
- set "VC_PATH=Microsoft Visual Studio 9.0\VC"
- ) else if /i "%~1" == "vc10" (
- set VC_VER=10.0
- set VC_DESC=VC10
- set "VC_PATH=Microsoft Visual Studio 10.0\VC"
- ) else if /i "%~1" == "vc11" (
- set VC_VER=11.0
- set VC_DESC=VC11
- set "VC_PATH=Microsoft Visual Studio 11.0\VC"
- ) else if /i "%~1" == "vc12" (
- set VC_VER=12.0
- set VC_DESC=VC12
- set "VC_PATH=Microsoft Visual Studio 12.0\VC"
- ) else if /i "%~1" == "vc14" (
- set VC_VER=14.0
- set VC_DESC=VC14
- set "VC_PATH=Microsoft Visual Studio 14.0\VC"
- ) else if /i "%~1" == "vc14.1" (
- set VC_VER=14.1
- set VC_DESC=VC14.1
-
- rem Determine the VC14.1 path based on the installed edition in descending
- rem order (Enterprise, then Professional and finally Community)
- if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
- set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
- ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
- set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
- ) else (
- set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
- )
- ) else if /i "%~1" == "vc14.2" (
- set VC_VER=14.2
- set VC_DESC=VC14.2
-
- rem Determine the VC14.2 path based on the installed edition in descending
- rem order (Enterprise, then Professional and finally Community)
- if exist "%PF%\Microsoft Visual Studio\2019\Enterprise\VC" (
- set "VC_PATH=Microsoft Visual Studio\2019\Enterprise\VC"
- ) else if exist "%PF%\Microsoft Visual Studio\2019\Professional\VC" (
- set "VC_PATH=Microsoft Visual Studio\2019\Professional\VC"
- ) else (
- set "VC_PATH=Microsoft Visual Studio\2019\Community\VC"
- )
- ) else if /i "%~1%" == "x86" (
- set BUILD_PLATFORM=x86
- ) else if /i "%~1%" == "x64" (
- set BUILD_PLATFORM=x64
- ) else if /i "%~1%" == "debug" (
- set BUILD_CONFIG=debug
- ) else if /i "%~1%" == "release" (
- set BUILD_CONFIG=release
- ) else if /i "%~1" == "-?" (
- goto syntax
- ) else if /i "%~1" == "-h" (
- goto syntax
- ) else if /i "%~1" == "-help" (
- goto syntax
- ) else if /i "%~1" == "-VSpath" (
- if "%~2" == "" (
- echo.
- echo Error. Please provide VS Path.
- goto error
- ) else (
- set "ABS_VC_PATH=%~2\VC"
- shift
- )
- ) else if /i "%~1" == "-perlpath" (
- if "%~2" == "" (
- echo.
- echo Error. Please provide Perl root Path.
- goto error
- ) else (
- set "PERL_PATH=%~2"
- shift
- )
+ if "%~1" == "" goto prerequisites
+
+ if /i "%~1" == "vc6" (
+ set VC_VER=6.0
+ set VC_DESC=VC6
+ set "VC_PATH=Microsoft Visual Studio\VC98"
+ ) else if /i "%~1" == "vc7" (
+ set VC_VER=7.0
+ set VC_DESC=VC7
+ set "VC_PATH=Microsoft Visual Studio .NET\Vc7"
+ ) else if /i "%~1" == "vc7.1" (
+ set VC_VER=7.1
+ set VC_DESC=VC7.1
+ set "VC_PATH=Microsoft Visual Studio .NET 2003\Vc7"
+ ) else if /i "%~1" == "vc8" (
+ set VC_VER=8.0
+ set VC_DESC=VC8
+ set "VC_PATH=Microsoft Visual Studio 8\VC"
+ ) else if /i "%~1" == "vc9" (
+ set VC_VER=9.0
+ set VC_DESC=VC9
+ set "VC_PATH=Microsoft Visual Studio 9.0\VC"
+ ) else if /i "%~1" == "vc10" (
+ set VC_VER=10.0
+ set VC_DESC=VC10
+ set "VC_PATH=Microsoft Visual Studio 10.0\VC"
+ ) else if /i "%~1" == "vc11" (
+ set VC_VER=11.0
+ set VC_DESC=VC11
+ set "VC_PATH=Microsoft Visual Studio 11.0\VC"
+ ) else if /i "%~1" == "vc12" (
+ set VC_VER=12.0
+ set VC_DESC=VC12
+ set "VC_PATH=Microsoft Visual Studio 12.0\VC"
+ ) else if /i "%~1" == "vc14" (
+ set VC_VER=14.0
+ set VC_DESC=VC14
+ set "VC_PATH=Microsoft Visual Studio 14.0\VC"
+ ) else if /i "%~1" == "vc14.1" (
+ set VC_VER=14.1
+ set VC_DESC=VC14.1
+
+ rem Determine the VC14.1 path based on the installed edition in descending
+ rem order (Enterprise, then Professional and finally Community)
+ if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
+ ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
) else (
- if not defined START_DIR (
- set START_DIR=%~1%
- ) else (
- goto unknown
- )
+ set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
+ )
+ ) else if /i "%~1%" == "x86" (
+ set BUILD_PLATFORM=x86
+ ) else if /i "%~1%" == "x64" (
+ set BUILD_PLATFORM=x64
+ ) else if /i "%~1%" == "debug" (
+ set BUILD_CONFIG=debug
+ ) else if /i "%~1%" == "release" (
+ set BUILD_CONFIG=release
+ ) else if /i "%~1" == "-?" (
+ goto syntax
+ ) else if /i "%~1" == "-h" (
+ goto syntax
+ ) else if /i "%~1" == "-help" (
+ goto syntax
+ ) else if /i "%~1" == "-VSpath" (
+ if "%~2" == "" (
+ echo.
+ echo Error. Please provide VS Path.
+ goto error
+ ) else (
+ set "ABS_VC_PATH=%~2\VC"
+ shift
+ )
+ ) else if /i "%~1" == "-perlpath" (
+ if "%~2" == "" (
+ echo.
+ echo Error. Please provide Perl root Path.
+ goto error
+ ) else (
+ set "PERL_PATH=%~2"
+ shift
+ )
+ ) else (
+ if not defined START_DIR (
+ set START_DIR=%~1%
+ ) else (
+ goto unknown
)
-
- shift & goto parseArgs
)
+ shift & goto parseArgs
+
:prerequisites
rem Compiler is a required parameter
if not defined VC_VER goto syntax
@@ -189,7 +175,10 @@ rem ***************************************************************************
rem Check the start directory exists
if not exist "%START_DIR%" goto noopenssl
-:setup
+ rem Check that OpenSSL is not unsupported version 1.1.0
+ if not exist "%START_DIR%\ms\do_ms.bat" goto unsupported
+
+:configure
if "%BUILD_PLATFORM%" == "" (
if "%VC_VER%" == "6.0" (
set BUILD_PLATFORM=x86
@@ -215,13 +204,6 @@ rem ***************************************************************************
if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
- if "%VC_VER%" == "14.2" set VCVARS_PLATFORM=amd64
- )
-
- if exist "%START_DIR%\ms\do_ms.bat" (
- set LEGACY_BUILD=TRUE
- ) else (
- set LEGACY_BUILD=FALSE
)
:start
@@ -236,8 +218,6 @@ rem ***************************************************************************
call "%ABS_VC_PATH%\bin\vcvars32"
) else if "%VC_VER%" == "14.1" (
call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
- ) else if "%VC_VER%" == "14.2" (
- call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
) else (
call "%ABS_VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
)
@@ -252,46 +232,72 @@ rem ***************************************************************************
set OUTDIR=build\Win64\%VC_DESC%
if not exist %OUTDIR% md %OUTDIR%
- if not "%BUILD_CONFIG%" == "release" (
- rem Configuring 64-bit Static Library Debug Build
- call :configure x64 debug static %LEGACY_BUILD%
-
- rem Perform the build
- call :build x64 static %LEGACY_BUILD%
+ if "%BUILD_CONFIG%" == "release" goto x64release
- rem Perform the install
- call :install debug static %LEGACY_BUILD%
+:x64debug
+ rem Configuring 64-bit Debug Build
+ perl Configure debug-VC-WIN64A --prefix=%CD%
- rem Configuring 64-bit Shared Library Debug Build
- call :configure x64 debug shared %LEGACY_BUILD%
+ rem Perform the build
+ call ms\do_win64a
+ nmake -f ms\nt.mak
+ nmake -f ms\ntdll.mak
- rem Perform the build
- call :build x64 shared %LEGACY_BUILD%
-
- rem Perform the install
- call :install debug shared %LEGACY_BUILD%
+ rem Move the output directories
+ if exist "%OUTDIR%\LIB Debug" (
+ copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
+ rd out32.dbg /s /q
+ ) else (
+ move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
+ )
+ if exist "%OUTDIR%\DLL Debug" (
+ copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
+ rd out32dll.dbg /s /q
+ ) else (
+ move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
)
- if not "%BUILD_CONFIG%" == "debug" (
- rem Configuring 64-bit Static Library Release Build
- call :configure x64 release static %LEGACY_BUILD%
+ rem Move the PDB files
+ move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
+ move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
- rem Perform the build
- call :build x64 static %LEGACY_BUILD%
+ rem Remove the intermediate directories
+ rd tmp32.dbg /s /q
+ rd tmp32dll.dbg /s /q
- rem Perform the install
- call :install release static %LEGACY_BUILD%
+ if "%BUILD_CONFIG%" == "debug" goto success
- rem Configuring 64-bit Shared Library Release Build
- call :configure x64 release shared %LEGACY_BUILD%
+:x64release
+ rem Configuring 64-bit Release Build
+ perl Configure VC-WIN64A --prefix=%CD%
- rem Perform the build
- call :build x64 shared %LEGACY_BUILD%
+ rem Perform the build
+ call ms\do_win64a
+ nmake -f ms\nt.mak
+ nmake -f ms\ntdll.mak
- rem Perform the install
- call :install release shared %LEGACY_BUILD%
+ rem Move the output directories
+ if exist "%OUTDIR%\LIB Release" (
+ copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
+ rd out32 /s /q
+ ) else (
+ move out32 "%OUTDIR%\LIB Release" 1>nul
+ )
+ if exist "%OUTDIR%\DLL Release" (
+ copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
+ rd out32dll /s /q
+ ) else (
+ move out32dll "%OUTDIR%\DLL Release" 1>nul
)
+ rem Move the PDB files
+ move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
+ move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
+
+ rem Remove the intermediate directories
+ rd tmp32 /s /q
+ rd tmp32dll /s /q
+
goto success
:x86
@@ -299,310 +305,73 @@ rem ***************************************************************************
set OUTDIR=build\Win32\%VC_DESC%
if not exist %OUTDIR% md %OUTDIR%
- if not "%BUILD_CONFIG%" == "release" (
- rem Configuring 32-bit Static Library Debug Build
- call :configure x86 debug static %LEGACY_BUILD%
-
- rem Perform the build
- call :build x86 static %LEGACY_BUILD%
-
- rem Perform the install
- call :install debug static %LEGACY_BUILD%
+ if "%BUILD_CONFIG%" == "release" goto x86release
- rem Configuring 32-bit Shared Library Debug Build
- call :configure x86 debug shared %LEGACY_BUILD%
+:x86debug
+ rem Configuring 32-bit Debug Build
+ perl Configure debug-VC-WIN32 no-asm --prefix=%CD%
- rem Perform the build
- call :build x86 shared %LEGACY_BUILD%
+ rem Perform the build
+ call ms\do_ms
+ nmake -f ms\nt.mak
+ nmake -f ms\ntdll.mak
- rem Perform the install
- call :install debug shared %LEGACY_BUILD%
+ rem Move the output directories
+ if exist "%OUTDIR%\LIB Debug" (
+ copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
+ rd out32.dbg /s /q
+ ) else (
+ move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
)
-
- if not "%BUILD_CONFIG%" == "debug" (
- rem Configuring 32-bit Static Library Release Build
- call :configure x86 release static %LEGACY_BUILD%
-
- rem Perform the build
- call :build x86 static %LEGACY_BUILD%
-
- rem Perform the install
- call :install release static %LEGACY_BUILD%
-
- rem Configuring 32-bit Shared Library Release Build
- call :configure x86 release shared %LEGACY_BUILD%
-
- rem Perform the build
- call :build x86 shared %LEGACY_BUILD%
-
- rem Perform the install
- call :install release shared %LEGACY_BUILD%
+ if exist "%OUTDIR%\DLL Debug" (
+ copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
+ rd out32dll.dbg /s /q
+ ) else (
+ move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
)
- goto success
+ rem Move the PDB files
+ move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
+ move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
-rem Function to configure the build.
-rem
-rem %1 - Platform (x86 or x64)
-rem %2 - Configuration (release or debug)
-rem %3 - Build Type (static or shared)
-rem %4 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
-rem
-:configure
- setlocal
+ rem Remove the intermediate directories
+ rd tmp32.dbg /s /q
+ rd tmp32dll.dbg /s /q
- if "%1" == "" exit /B 1
- if "%2" == "" exit /B 1
- if "%3" == "" exit /B 1
- if "%4" == "" exit /B 1
-
- if "%4" == "TRUE" (
- rem Calculate the build directory
- set build_dir=%cd%
-
- rem Calculate the configure options
- if "%1" == "x86" (
- if "%2" == "debug" (
- set options=debug-VC-WIN32
- ) else if "%2" == "release" (
- set options=VC-WIN32
- ) else (
- exit /B 1
- )
+ if "%BUILD_CONFIG%" == "debug" goto success
- set options=!options! no-asm
- ) else if "%1" == "x64" (
- if "%2" == "debug" (
- set options=debug-VC-WIN64A
- ) else if "%2" == "release" (
- set options=VC-WIN64A
- ) else (
- exit /B 1
- )
- ) else (
- exit /B 1
- )
- ) else if "%4" == "FALSE" (
- rem Has configure already been ran?
- if exist makefile (
- rem Clean up the previous build
- nmake clean
-
- rem Remove the old makefile
- del makefile 1>nul
- )
+:x86release
+ rem Configuring 32-bit Release Build
+ perl Configure VC-WIN32 no-asm --prefix=%CD%
- rem Calculate the build directory
- set build_dir=%cd%\build\tmp
+ rem Perform the build
+ call ms\do_ms
+ nmake -f ms\nt.mak
+ nmake -f ms\ntdll.mak
- rem Calculate the configure options
- if "%1" == "x86" (
- set options=VC-WIN32
- ) else if "%1" == "x64" (
- set options=VC-WIN64A
- ) else (
- exit /B 1
- )
-
- if "%2" == "debug" (
- set options=!options! --debug
- ) else if "%2" == "release" (
- set options=!options! --release
- ) else (
- exit /B 1
- )
-
- if "%3" == "static" (
- set options=!options! no-shared
- ) else if not "%3" == "shared" (
- exit /B 1
- )
-
- set options=!options! no-asm
+ rem Move the output directories
+ if exist "%OUTDIR%\LIB Release" (
+ copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
+ rd out32 /s /q
) else (
- exit /B 1
+ move out32 "%OUTDIR%\LIB Release" 1>nul
)
-
- set options=%options% --prefix=%build_dir%
-
- rem Run the configure
- perl Configure %options%
-
- exit /B %ERRORLEVEL
-
-rem Main build function.
-rem
-rem %1 - Platform (x86 or x64)
-rem %2 - Build Type (static or shared)
-rem %3 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
-rem
-:build
- setlocal
-
- if "%1" == "" exit /B 1
- if "%2" == "" exit /B 1
- if "%3" == "" exit /B 1
-
- if "%3" == "TRUE" (
- if "%1" == "x86" (
- call ms\do_ms.bat
- ) else if "%1" == "x64" (
- call ms\do_win64a.bat
- ) else (
- exit /B 1
- )
-
- if "%2" == "static" (
- nmake -f ms\nt.mak
- ) else if "%2" == "shared" (
- nmake -f ms\ntdll.mak
- ) else (
- exit /B 1
- )
- ) else if "%2" == "FALSE" (
- nmake
+ if exist "%OUTDIR%\DLL Release" (
+ copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
+ rd out32dll /s /q
) else (
- exit /B 1
+ move out32dll "%OUTDIR%\DLL Release" 1>nul
)
- exit /B 0
-
-rem Main installation function.
-rem
-rem %1 - Configuration (release or debug)
-rem %2 - Build Type (static or shared)
-rem %3 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
-rem
-:install
- setlocal
-
- if "%1" == "" exit /B 1
- if "%2" == "" exit /B 1
- if "%3" == "" exit /B 1
-
- rem Copy the generated files to our directory structure
- if "%3" == "TRUE" (
- if "%1" == "debug" (
- if "%2" == "static" (
- rem Move the output directories
- if exist "%OUTDIR%\LIB Debug" (
- copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
- rd out32.dbg /s /q
- ) else (
- move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
- )
-
- rem Move the PDB files
- move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
-
- rem Remove the intermediate directories
- rd tmp32.dbg /s /q
- ) else if "%2" == "shared" (
- if exist "%OUTDIR%\DLL Debug" (
- copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
- rd out32dll.dbg /s /q
- ) else (
- move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
- )
-
- rem Move the PDB files
- move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
-
- rem Remove the intermediate directories
- rd tmp32dll.dbg /s /q
- ) else (
- exit /B 1
- )
- ) else if "%1" == "release" (
- if "%2" == "static" (
- rem Move the output directories
- if exist "%OUTDIR%\LIB Release" (
- copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
- rd out32 /s /q
- ) else (
- move out32 "%OUTDIR%\LIB Release" 1>nul
- )
+ rem Move the PDB files
+ move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
+ move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
- rem Move the PDB files
- move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
+ rem Remove the intermediate directories
+ rd tmp32 /s /q
+ rd tmp32dll /s /q
- rem Remove the intermediate directories
- rd tmp32 /s /q
- ) else if "%2" == "shared" (
- if exist "%OUTDIR%\DLL Release" (
- copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
- rd out32dll /s /q
- ) else (
- move out32dll "%OUTDIR%\DLL Release" 1>nul
- )
-
- rem Move the PDB files
- move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
-
- rem Remove the intermediate directories
- rd tmp32dll /s /q
- ) else (
- exit /B 1
- )
- )
- ) else if "%3" == "FALSE" (
- rem Calculate the build directory
- set build_dir=%cd%\build\tmp
-
- rem Perform the installation
- nmake install_sw
-
- rem Move the output directories
- if "%1" == "debug" (
- if "%2" == "static" (
- if not exist "%OUTDIR%\LIB Debug" (
- mkdir "%OUTDIR%\LIB Debug" 1>nul
- )
-
- move !build_dir!\lib\*.lib "%OUTDIR%\LIB Debug" 1>nul
- move !build_dir!\bin\*.exe "%OUTDIR%\LIB Debug" 1>nul
- ) else if "%2" == "shared" (
- if not exist "%OUTDIR%\DLL Debug" (
- mkdir "%OUTDIR%\DLL Debug" 1>nul
- )
-
- move !build_dir!\lib\*.lib "%OUTDIR%\DLL Debug" 1>nul
- move !build_dir!\bin\*.dll "%OUTDIR%\DLL Debug" 1>nul
- move !build_dir!\bin\*.exe "%OUTDIR%\DLL Debug" 1>nul
- move !build_dir!\bin\*.pdb "%OUTDIR%\DLL Debug" 1>nul
- ) else (
- exit /B 1
- )
- ) else if "%1" == "release" (
- if "%2" == "static" (
- if not exist "%OUTDIR%\LIB Release" (
- mkdir "%OUTDIR%\LIB Release" 1>nul
- )
-
- move !build_dir!\lib\*.lib "%OUTDIR%\LIB Release" 1>nul
- move !build_dir!\bin\*.exe "%OUTDIR%\LIB Release" 1>nul
- ) else if "%2" == "shared" (
- if not exist "%OUTDIR%\DLL Release" (
- mkdir "%OUTDIR%\DLL Release" 1>nul
- )
-
- move !build_dir!\lib\*.lib "%OUTDIR%\DLL Release" 1>nul
- move !build_dir!\bin\*.dll "%OUTDIR%\DLL Release" 1>nul
- move !build_dir!\bin\*.exe "%OUTDIR%\DLL Release" 1>nul
- ) else (
- exit /B 1
- )
- ) else (
- exit /B 1
- )
-
- rem Remove the output directories
- rd !build_dir! /s /q
- ) else (
- exit /B 1
- )
-
- exit /B 0
+ goto success
:syntax
rem Display the help
@@ -621,7 +390,6 @@ rem
echo vc12 - Use Visual Studio 2013
echo vc14 - Use Visual Studio 2015
echo vc14.1 - Use Visual Studio 2017
- echo vc14.2 - Use Visual Studio 2019
echo.
echo Platform:
echo.
@@ -685,6 +453,14 @@ rem
echo Error: Cannot locate OpenSSL source directory
goto error
+:unsupported
+ echo.
+ echo Error: Unsupported OpenSSL version.
+ echo The pre-generated project files and this build script only support the
+ echo LTS version of OpenSSL ^(v1.0.2^). The next version of this build script
+ echo will support OpenSSL v1.1.0.
+ goto error
+
:error
if "%OS%" == "Windows_NT" endlocal
exit /B 1
diff --git a/projects/checksrc.bat b/projects/checksrc.bat
index 54c976ad1..5c8debf11 100644
--- a/projects/checksrc.bat
+++ b/projects/checksrc.bat
@@ -143,7 +143,7 @@ rem ***************************************************************************
if "%CHECK_EXAMPLES%" == "TRUE" (
rem Check the docs\examples directory
if exist %SRC_DIR%\docs\examples (
- for /f "delims=" %%i in ('dir "%SRC_DIR%\docs\examples\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\docs\examples" -ASNPRINTF "%%i"
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\docs\examples\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\docs\examples" "%%i"
)
)
diff --git a/src/Makefile.am b/src/Makefile.am
index 90f156248..a26a57076 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -123,7 +123,7 @@ $(HUGE): $(MANPAGE) $(MKHELP)
else # HAVE_LIBZ
# This generates the tool_hugehelp.c file uncompressed only
$(HUGE): $(MANPAGE) $(MKHELP)
- $(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE); \
+ $(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE): \
$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )
endif
diff --git a/src/Makefile.inc b/src/Makefile.inc
index dd6b9d336..e1e8306bd 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -54,7 +54,6 @@ CURL_CFILES = \
tool_panykey.c \
tool_paramhlp.c \
tool_parsecfg.c \
- tool_progress.c \
tool_strdup.c \
tool_setopt.c \
tool_sleep.c \
@@ -96,7 +95,6 @@ CURL_HFILES = \
tool_panykey.h \
tool_paramhlp.h \
tool_parsecfg.h \
- tool_progress.h \
tool_sdecls.h \
tool_setopt.h \
tool_setup.h \
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index b0880f186..3844904c9 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,7 +32,6 @@
#include "tool_msgs.h"
#include "tool_cb_hdr.h"
#include "tool_cb_wrt.h"
-#include "tool_operate.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -55,10 +54,9 @@ static char *parse_filename(const char *ptr, size_t len);
size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
{
- struct per_transfer *per = userdata;
- struct HdrCbData *hdrcbdata = &per->hdrcbdata;
- struct OutStruct *outs = &per->outs;
- struct OutStruct *heads = &per->heads;
+ struct HdrCbData *hdrcbdata = userdata;
+ struct OutStruct *outs = hdrcbdata->outs;
+ struct OutStruct *heads = hdrcbdata->heads;
const char *str = ptr;
const size_t cb = size * nmemb;
const char *end = (char *)ptr + cb;
@@ -102,7 +100,7 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
* Content-Disposition header specifying a filename property.
*/
- curl_easy_getinfo(per->curl, CURLINFO_PROTOCOL, &protocol);
+ curl_easy_getinfo(outs->config->easy, CURLINFO_PROTOCOL, &protocol);
if(hdrcbdata->honor_cd_filename &&
(cb > 20) && checkprefix("Content-disposition:", str) &&
(protocol & (CURLPROTO_HTTPS|CURLPROTO_HTTP))) {
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index a18827c8b..0539e9895 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -125,19 +125,14 @@ int tool_progress_cb(void *clientp,
curl_off_t total;
curl_off_t point;
- /* Calculate expected transfer size. initial_size can be less than zero
- when indicating that we are expecting to get the filesize from the
- remote */
- if(bar->initial_size < 0 ||
- ((CURL_OFF_T_MAX - bar->initial_size) < (dltotal + ultotal)))
+ /* expected transfer size */
+ if((CURL_OFF_T_MAX - bar->initial_size) < (dltotal + ultotal))
total = CURL_OFF_T_MAX;
else
total = dltotal + ultotal + bar->initial_size;
- /* Calculate the current progress. initial_size can be less than zero when
- indicating that we are expecting to get the filesize from the remote */
- if(bar->initial_size < 0 ||
- ((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow)))
+ /* we've come this far */
+ if((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow))
point = CURL_OFF_T_MAX;
else
point = dlnow + ulnow + bar->initial_size;
@@ -210,8 +205,7 @@ void progressbarinit(struct ProgressData *bar,
if(colp) {
char *endptr;
long num = strtol(colp, &endptr, 10);
- if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20) &&
- (num < 10000))
+ if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20))
bar->width = (int)num;
curl_free(colp);
}
@@ -227,7 +221,7 @@ void progressbarinit(struct ProgressData *bar,
struct winsize ts;
if(!ioctl(STDIN_FILENO, TIOCGWINSZ, &ts))
cols = ts.ws_col;
-#elif defined(WIN32)
+#elif defined(_WIN32)
{
HANDLE stderr_hnd = GetStdHandle(STD_ERROR_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO console_info;
diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c
index 0f47b4d0f..1944f16c2 100644
--- a/src/tool_cb_wrt.c
+++ b/src/tool_cb_wrt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,6 @@
#include "tool_cfgable.h"
#include "tool_msgs.h"
#include "tool_cb_wrt.h"
-#include "tool_operate.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -76,14 +75,12 @@ bool tool_create_output_file(struct OutStruct *outs)
size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
{
size_t rc;
- struct per_transfer *per = userdata;
- struct OutStruct *outs = &per->outs;
+ struct OutStruct *outs = userdata;
struct OperationConfig *config = outs->config;
size_t bytes = sz * nmemb;
bool is_tty = config->global->isatty;
#ifdef WIN32
CONSOLE_SCREEN_BUFFER_INFO console_info;
- intptr_t fhnd;
#endif
/*
@@ -161,13 +158,14 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
}
}
-#ifdef WIN32
- fhnd = _get_osfhandle(fileno(outs->stream));
+#ifdef _WIN32
if(isatty(fileno(outs->stream)) &&
- GetConsoleScreenBufferInfo((HANDLE)fhnd, &console_info)) {
+ GetConsoleScreenBufferInfo(
+ (HANDLE)_get_osfhandle(fileno(outs->stream)), &console_info)) {
DWORD in_len = (DWORD)(sz * nmemb);
wchar_t* wc_buf;
DWORD wc_len;
+ intptr_t fhnd;
/* calculate buffer size for wide characters */
wc_len = MultiByteToWideChar(CP_UTF8, 0, buffer, in_len, NULL, 0);
@@ -182,6 +180,8 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
return failure;
}
+ fhnd = _get_osfhandle(fileno(outs->stream));
+
if(!WriteConsoleW(
(HANDLE) fhnd,
wc_buf,
@@ -204,7 +204,7 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
if(config->readbusy) {
config->readbusy = FALSE;
- curl_easy_pause(per->curl, CURLPAUSE_CONT);
+ curl_easy_pause(config->easy, CURLPAUSE_CONT);
}
if(config->nobuffer) {
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index efa8c50b2..fabd6d635 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -34,16 +34,16 @@ void config_init(struct OperationConfig* config)
config->use_httpget = FALSE;
config->create_dirs = FALSE;
config->maxredirs = DEFAULT_MAXREDIRS;
- config->proto = CURLPROTO_ALL;
+ config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */
config->proto_present = FALSE;
config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
- ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
- CURLPROTO_SMBS);
+ ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
+ CURLPROTO_SMBS);
config->proto_redir_present = FALSE;
config->proto_default = NULL;
config->tcp_nodelay = TRUE; /* enabled by default */
config->happy_eyeballs_timeout_ms = CURL_HET_DEFAULT;
- config->http09_allowed = FALSE;
+ config->http09_allowed = TRUE;
}
static void free_config_fields(struct OperationConfig *config)
@@ -133,7 +133,6 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->krblevel);
Curl_safefree(config->oauth_bearer);
- Curl_safefree(config->sasl_authzid);
Curl_safefree(config->unix_socket_path);
Curl_safefree(config->writeout);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 7232c35e3..e374a7f0e 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -22,9 +22,11 @@
*
***************************************************************************/
#include "tool_setup.h"
+
#include "tool_sdecls.h"
+
#include "tool_metalink.h"
-#include "tool_urlglob.h"
+
#include "tool_formparse.h"
typedef enum {
@@ -35,21 +37,8 @@ typedef enum {
struct GlobalConfig;
-struct State {
- struct getout *urlnode;
- URLGlob *inglob;
- URLGlob *urls;
- char *outfiles;
- char *httpgetfields;
- char *uploadfile;
- unsigned long infilenum; /* number of files to upload */
- unsigned long up; /* upload file counter within a single upload glob */
- unsigned long urlnum; /* how many iterations this single URL has with ranges
- etc */
- unsigned long li;
-};
-
struct OperationConfig {
+ CURL *easy; /* A copy of the handle from GlobalConfig */
bool remote_time;
char *random_file;
char *egd_file;
@@ -108,7 +97,6 @@ struct OperationConfig {
char *mail_from;
struct curl_slist *mail_rcpt;
char *mail_auth;
- char *sasl_authzid; /* Authorisation identity (identity to use) */
bool sasl_ir; /* Enable/disable SASL initial response */
bool proxytunnel;
bool ftp_append; /* APPE on ftp */
@@ -254,6 +242,9 @@ struct OperationConfig {
bool use_metalink; /* process given URLs as metalink XML file */
metalinkfile *metalinkfile_list; /* point to the first node */
metalinkfile *metalinkfile_last; /* point to the last/current node */
+#ifdef CURLDEBUG
+ bool test_event_based;
+#endif
char *oauth_bearer; /* OAuth 2.0 bearer token */
bool nonpn; /* enable/disable TLS NPN extension */
bool noalpn; /* enable/disable TLS ALPN extension */
@@ -274,10 +265,10 @@ struct OperationConfig {
struct GlobalConfig *global;
struct OperationConfig *prev;
struct OperationConfig *next; /* Always last in the struct */
- struct State state; /* for create_transfer() */
};
struct GlobalConfig {
+ CURL *easy; /* Once we have one, we keep it here */
int showerror; /* -1 == unset, default => show errors
0 => -s is used to NOT show errors
1 => -S has been used to show errors */
@@ -295,11 +286,6 @@ struct GlobalConfig {
char *libcurl; /* Output libcurl code to this file name */
bool fail_early; /* exit on first transfer error */
bool styled_output; /* enable fancy output style detection */
-#ifdef CURLDEBUG
- bool test_event_based;
-#endif
- bool parallel;
- long parallel_max;
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */
diff --git a/src/tool_doswin.c b/src/tool_doswin.c
index 779a3cb8f..8b5bdadaf 100644
--- a/src/tool_doswin.c
+++ b/src/tool_doswin.c
@@ -599,6 +599,7 @@ SANITIZEcode rename_if_reserved_dos_device_name(char **const sanitized,
}
memmove(base + 1, base, blen + 1);
base[0] = '_';
+ ++blen;
}
}
#endif
diff --git a/src/tool_formparse.c b/src/tool_formparse.c
index 74d1533e4..49993470b 100644
--- a/src/tool_formparse.c
+++ b/src/tool_formparse.c
@@ -347,11 +347,12 @@ CURLcode tool2curlmime(CURL *curl, tool_mime *m, curl_mime **mime)
static char *get_param_word(char **str, char **end_pos, char endchar)
{
char *ptr = *str;
- /* the first non-space char is here */
- char *word_begin = ptr;
+ char *word_begin = NULL;
char *ptr2;
char *escape = NULL;
+ /* the first non-space char is here */
+ word_begin = ptr;
if(*ptr == '"') {
++ptr;
while(*ptr) {
@@ -567,6 +568,7 @@ static int get_param_part(struct OperationConfig *config, char endchar,
endpos--;
sep = *p;
*endpos = '\0';
+ /* TODO: maybe special fopen for VMS? */
fp = fopen(hdrfile, FOPEN_READTEXT);
if(!fp)
warnf(config->global, "Cannot read from %s: %s\n", hdrfile,
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 3882cb97e..b133cb87e 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -40,7 +40,6 @@
#include "tool_msgs.h"
#include "tool_paramhlp.h"
#include "tool_parsecfg.h"
-#include "tool_main.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -178,8 +177,7 @@ static const struct LongShort aliases[]= {
{"$H", "mail-auth", ARG_STRING},
{"$I", "post303", ARG_BOOL},
{"$J", "metalink", ARG_BOOL},
- {"$6", "sasl-authzid", ARG_STRING},
- {"$K", "sasl-ir", ARG_BOOL },
+ {"$K", "sasl-ir", ARG_BOOL},
{"$L", "test-event", ARG_BOOL},
{"$M", "unix-socket", ARG_FILENAME},
{"$N", "path-as-is", ARG_BOOL},
@@ -201,7 +199,6 @@ static const struct LongShort aliases[]= {
{"01", "http1.1", ARG_NONE},
{"02", "http2", ARG_NONE},
{"03", "http2-prior-knowledge", ARG_NONE},
- {"04", "http3", ARG_NONE},
{"09", "http0.9", ARG_BOOL},
{"1", "tlsv1", ARG_NONE},
{"10", "tlsv1.0", ARG_NONE},
@@ -243,7 +240,7 @@ static const struct LongShort aliases[]= {
{"El", "tlspassword", ARG_STRING},
{"Em", "tlsauthtype", ARG_STRING},
{"En", "ssl-allow-beast", ARG_BOOL},
- /* Eo */
+ {"Eo", "login-options", ARG_STRING},
{"Ep", "pinnedpubkey", ARG_STRING},
{"EP", "proxy-pinnedpubkey", ARG_STRING},
{"Eq", "cert-status", ARG_BOOL},
@@ -319,10 +316,7 @@ static const struct LongShort aliases[]= {
{"Y", "speed-limit", ARG_STRING},
{"y", "speed-time", ARG_STRING},
{"z", "time-cond", ARG_STRING},
- {"Z", "parallel", ARG_BOOL},
- {"Zb", "parallel-max", ARG_STRING},
{"#", "progress-bar", ARG_BOOL},
- {"#m", "progress-meter", ARG_BOOL},
{":", "next", ARG_NONE},
};
@@ -521,13 +515,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
const char *word = ('-' == flag[0]) ? flag + 2 : flag;
size_t fnam = strlen(word);
int numhits = 0;
- bool noflagged = FALSE;
if(!strncmp(word, "no-", 3)) {
/* disable this option but ignore the "no-" part when looking for it */
word += 3;
toggle = FALSE;
- noflagged = TRUE;
}
for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) {
@@ -551,9 +543,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(hit < 0) {
return PARAM_OPTION_UNKNOWN;
}
- if(noflagged && (aliases[hit].desc != ARG_BOOL))
- /* --no- prefixed an option that isn't boolean! */
- return PARAM_NO_NOT_BOOLEAN;
}
else {
flag++; /* prefixed with one dash, pass it */
@@ -913,12 +902,12 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->retry_connrefused = toggle;
break;
case 'h': /* --retry-delay */
- err = str2unummax(&config->retry_delay, nextarg, LONG_MAX/1000);
+ err = str2unum(&config->retry_delay, nextarg);
if(err)
return err;
break;
case 'i': /* --retry-max-time */
- err = str2unummax(&config->retry_maxtime, nextarg, LONG_MAX/1000);
+ err = str2unum(&config->retry_maxtime, nextarg);
if(err)
return err;
break;
@@ -1105,15 +1094,12 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
#endif
break;
}
- case '6': /* --sasl-authzid */
- GetStr(&config->sasl_authzid, nextarg);
- break;
case 'K': /* --sasl-ir */
config->sasl_ir = toggle;
break;
case 'L': /* --test-event */
#ifdef CURLDEBUG
- global->test_event_based = toggle;
+ config->test_event_based = toggle;
#else
warnf(global, "--test-event is ignored unless a debug build!\n");
#endif
@@ -1173,16 +1159,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
}
break;
- case '#':
- switch(subletter) {
- case 'm': /* --progress-meter */
- global->noprogress = !toggle;
- break;
- default: /* --progress-bar */
- global->progressmode =
- toggle ? CURL_PROGRESS_BAR : CURL_PROGRESS_STATS;
- break;
- }
+ case '#': /* --progress-bar */
+ if(toggle)
+ global->progressmode = CURL_PROGRESS_BAR;
+ else
+ global->progressmode = CURL_PROGRESS_STATS;
break;
case ':': /* --next */
return PARAM_NEXT_OPERATION;
@@ -1200,14 +1181,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
/* HTTP version 2.0 */
config->httpversion = CURL_HTTP_VERSION_2_0;
break;
- case '3': /* --http2-prior-knowledge */
+ case '3':
/* HTTP version 2.0 over clean TCP*/
config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE;
break;
- case '4': /* --http3 */
- /* HTTP version 3 go over QUIC - at once */
- config->httpversion = CURL_HTTP_VERSION_3;
- break;
case '9':
/* Allow HTTP/0.9 responses! */
config->http09_allowed = toggle;
@@ -1374,7 +1351,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
size = 0;
}
else {
- char *enc = curl_easy_escape(NULL, postdata, (int)size);
+ char *enc = curl_easy_escape(config->easy, postdata, (int)size);
Curl_safefree(postdata); /* no matter if it worked or not */
if(enc) {
/* now make a string with the name from above and append the
@@ -1575,6 +1552,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->ssl_allow_beast = toggle;
break;
+ case 'o': /* --login-options */
+ GetStr(&config->login_options, nextarg);
+ break;
+
case 'p': /* Pinned public key DER file */
GetStr(&config->pinnedpubkey, nextarg);
break;
@@ -2141,21 +2122,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(!config->low_speed_time)
config->low_speed_time = 30;
break;
- case 'Z':
- switch(subletter) {
- case '\0': /* --parallel */
- global->parallel = toggle;
- break;
- case 'b': /* --parallel-max */
- err = str2unum(&global->parallel_max, nextarg);
- if(err)
- return err;
- if((global->parallel_max > MAX_PARALLEL) ||
- (global->parallel_max < 1))
- global->parallel_max = PARALLEL_DEFAULT;
- break;
- }
- break;
case 'z': /* time condition coming up */
switch(*nextarg) {
case '+':
@@ -2205,14 +2171,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
return PARAM_OK;
}
-ParameterError parse_args(struct GlobalConfig *global, int argc,
+ParameterError parse_args(struct GlobalConfig *config, int argc,
argv_item_t argv[])
{
int i;
bool stillflags;
char *orig_opt = NULL;
ParameterError result = PARAM_OK;
- struct OperationConfig *config = global->first;
+ struct OperationConfig *operation = config->first;
for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
orig_opt = argv[i];
@@ -2228,28 +2194,31 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
else {
char *nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;
- result = getparameter(flag, nextarg, &passarg, global, config);
+ result = getparameter(flag, nextarg, &passarg, config, operation);
if(result == PARAM_NEXT_OPERATION) {
/* Reset result as PARAM_NEXT_OPERATION is only used here and not
returned from this function */
result = PARAM_OK;
- if(config->url_list && config->url_list->url) {
+ if(operation->url_list && operation->url_list->url) {
/* Allocate the next config */
- config->next = malloc(sizeof(struct OperationConfig));
- if(config->next) {
+ operation->next = malloc(sizeof(struct OperationConfig));
+ if(operation->next) {
/* Initialise the newly created config */
- config_init(config->next);
+ config_init(operation->next);
+
+ /* Copy the easy handle */
+ operation->next->easy = config->easy;
/* Set the global config pointer */
- config->next->global = global;
+ operation->next->global = config;
- /* Update the last config pointer */
- global->last = config->next;
+ /* Update the last operation pointer */
+ config->last = operation->next;
/* Move onto the new config */
- config->next->prev = config;
- config = config->next;
+ operation->next->prev = operation;
+ operation = operation->next;
}
else
result = PARAM_NO_MEM;
@@ -2263,8 +2232,8 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
bool used;
/* Just add the URL please */
- result = getparameter((char *)"--url", argv[i], &used, global,
- config);
+ result = getparameter((char *)"--url", argv[i], &used, config,
+ operation);
}
}
@@ -2275,9 +2244,9 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
const char *reason = param2text(result);
if(orig_opt && strcmp(":", orig_opt))
- helpf(global->errors, "option %s: %s\n", orig_opt, reason);
+ helpf(config->errors, "option %s: %s\n", orig_opt, reason);
else
- helpf(global->errors, "%s\n", reason);
+ helpf(config->errors, "%s\n", reason);
}
return result;
diff --git a/src/tool_getparam.h b/src/tool_getparam.h
index f6fcd5a35..daf83b884 100644
--- a/src/tool_getparam.h
+++ b/src/tool_getparam.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,7 +42,6 @@ typedef enum {
PARAM_NEXT_OPERATION,
PARAM_NO_PREFIX,
PARAM_NUMBER_TOO_LARGE,
- PARAM_NO_NOT_BOOLEAN,
PARAM_LAST
} ParameterError;
diff --git a/src/tool_getpass.c b/src/tool_getpass.c
index dfe363b21..bf531a537 100644
--- a/src/tool_getpass.c
+++ b/src/tool_getpass.c
@@ -93,7 +93,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
if((sts & 1) && (iosb.iosb$w_status & 1))
buffer[iosb.iosb$w_bcnt] = '\0';
- sys$dassgn(chan);
+ sts = sys$dassgn(chan);
}
return buffer; /* we always return success */
}
diff --git a/src/tool_help.c b/src/tool_help.c
index 022956676..8a3c25820 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -20,9 +20,6 @@
*
***************************************************************************/
#include "tool_setup.h"
-#if defined(HAVE_STRCASECMP) && defined(HAVE_STRINGS_H)
-#include <strings.h>
-#endif
#include "tool_panykey.h"
#include "tool_help.h"
@@ -191,8 +188,6 @@ static const struct helptxt helptext[] = {
"Use HTTP 2"},
{" --http2-prior-knowledge",
"Use HTTP 2 without HTTP/1.1 Upgrade"},
- {" --http3",
- "Use HTTP v3"},
{" --ignore-content-length",
"Ignore the size of the remote resource"},
{"-i, --include",
@@ -263,8 +258,6 @@ static const struct helptxt helptext[] = {
"Disable TCP keepalive on the connection"},
{" --no-npn",
"Disable the NPN TLS extension"},
- {" --no-progress-meter",
- "Do not show the progress meter"},
{" --no-sessionid",
"Disable SSL session-ID reusing"},
{" --noproxy <no-proxy-list>",
@@ -277,10 +270,6 @@ static const struct helptxt helptext[] = {
"OAuth 2 Bearer Token"},
{"-o, --output <file>",
"Write to file instead of stdout"},
- {"-Z, --parallel",
- "Perform transfers in parallel"},
- {" --parallel-max",
- "Maximum concurrency for parallel transfers"},
{" --pass <phrase>",
"Pass phrase for the private key"},
{" --path-as-is",
@@ -343,8 +332,8 @@ static const struct helptxt helptext[] = {
"SPNEGO proxy service name"},
{" --proxy-ssl-allow-beast",
"Allow security flaw for interop for HTTPS proxy"},
- {" --proxy-tls13-ciphers <list>",
- "TLS 1.3 ciphersuites for proxy (OpenSSL)"},
+ {" --proxy-tls13-ciphers <ciphersuite list>",
+ "TLS 1.3 proxy cipher suites"},
{" --proxy-tlsauthtype <type>",
"TLS authentication type for HTTPS proxy"},
{" --proxy-tlspassword <string>",
@@ -393,8 +382,6 @@ static const struct helptxt helptext[] = {
"Wait time between retries"},
{" --retry-max-time <seconds>",
"Retry only within this period"},
- {" --sasl-authzid <identity> ",
- "Use this identity to act as during SASL PLAIN authentication"},
{" --sasl-ir",
"Enable initial response in SASL authentication"},
{" --service-name <name>",
@@ -455,8 +442,8 @@ static const struct helptxt helptext[] = {
"Transfer based on a time condition"},
{" --tls-max <VERSION>",
"Set maximum allowed TLS version"},
- {" --tls13-ciphers <list>",
- "TLS 1.3 ciphersuites (OpenSSL)"},
+ {" --tls13-ciphers <list of TLS 1.3 ciphersuites>",
+ "TLS 1.3 cipher suites to use"},
{" --tlsauthtype <type>",
"TLS authentication type"},
{" --tlspassword",
@@ -536,13 +523,11 @@ static const struct feat feats[] = {
{"CharConv", CURL_VERSION_CONV},
{"TLS-SRP", CURL_VERSION_TLSAUTH_SRP},
{"HTTP2", CURL_VERSION_HTTP2},
- {"HTTP3", CURL_VERSION_HTTP3},
{"UnixSockets", CURL_VERSION_UNIX_SOCKETS},
{"HTTPS-proxy", CURL_VERSION_HTTPS_PROXY},
{"MultiSSL", CURL_VERSION_MULTI_SSL},
{"PSL", CURL_VERSION_PSL},
{"alt-svc", CURL_VERSION_ALTSVC},
- {"ESNI", CURL_VERSION_ESNI},
};
void tool_help(void)
@@ -608,15 +593,10 @@ void tool_version_info(void)
printf(" %s", featp[i]);
puts(""); /* newline */
}
- if(strcmp(CURL_VERSION, curlinfo->version)) {
- printf("WARNING: curl and libcurl versions do not match. "
- "Functionality may be affected.\n");
- }
}
-void tool_list_engines(void)
+void tool_list_engines(CURL *curl)
{
- CURL *curl = curl_easy_init();
struct curl_slist *engines = NULL;
/* Get the list of engines */
@@ -633,5 +613,4 @@ void tool_list_engines(void)
/* Cleanup the list of engines */
curl_slist_free_all(engines);
- curl_easy_cleanup(curl);
}
diff --git a/src/tool_help.h b/src/tool_help.h
index bfb5dcdf3..0289f3015 100644
--- a/src/tool_help.h
+++ b/src/tool_help.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
#include "tool_setup.h"
void tool_help(void);
-void tool_list_engines(void);
+void tool_list_engines(CURL *curl);
void tool_version_info(void);
#endif /* HEADER_CURL_TOOL_HELP_H */
diff --git a/src/tool_helpers.c b/src/tool_helpers.c
index 61788b7f8..b3a9516a8 100644
--- a/src/tool_helpers.c
+++ b/src/tool_helpers.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -66,8 +66,6 @@ const char *param2text(int res)
return "the given option can't be reversed with a --no- prefix";
case PARAM_NUMBER_TOO_LARGE:
return "too large number";
- case PARAM_NO_NOT_BOOLEAN:
- return "used '--no-' for option that isn't a boolean";
default:
return "unknown error";
}
diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c
index 1a4c4983f..074a8cf36 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -183,8 +183,8 @@ void hugehelp(void)
" ter a completed transfer, the cache will be saved to the file\n"
" name again if it has been modified.\n"
"\n"
-" Specify a \"\" file name (zero length) to avoid loading/saving and\n"
-" make curl just handle the cache in memory.\n"
+" Specifiy a \"\" file name (zero length) to avoid loading/saving\n"
+" and make curl just handle the cache in memory.\n"
"\n"
" If this option is used several times, curl will load contents\n"
" from all the files but the the last one will be used for saving.\n"
@@ -431,15 +431,15 @@ void hugehelp(void)
" with one or two dashes, there can be no colon or equals charac-\n"
" ter between the option and its parameter.\n"
"\n"
-" If the parameter contains whitespace (or starts with : or =),\n"
-" the parameter must be enclosed within quotes. Within double\n"
+" If the parameter is to contain whitespace, the parameter must be\n"
+" enclosed within quotes. Within double quotes, the following es-\n"
, stdout);
fputs(
-" quotes, the following escape sequences are available: \\\\, \\\",\n"
-" \\t, \\n, \\r and \\v. A backslash preceding any other letter is ig-\n"
-" nored. If the first column of a config line is a '#' character,\n"
-" the rest of the line will be treated as a comment. Only write\n"
-" one option per physical line in the config file.\n"
+" cape sequences are available: \\\\, \\\", \\t, \\n, \\r and \\v. A back-\n"
+" slash preceding any other letter is ignored. If the first column\n"
+" of a config line is a '#' character, the rest of the line will\n"
+" be treated as a comment. Only write one option per physical line\n"
+" in the config file.\n"
"\n"
" Specify the filename to -K, --config as '-' to make curl read\n"
" the file from stdin.\n"
@@ -468,7 +468,7 @@ void hugehelp(void)
fputs(
" PROFILE%\\Application Data'.\n"
"\n"
-" 2) On windows, if there is no .curlrc file in the home dir, it\n"
+" 2) On windows, if there is no _curlrc file in the home dir, it\n"
" checks for one in the same dir the curl executable is placed. On\n"
" Unix-like systems, it will simply try to load .curlrc from the\n"
" determined home dir.\n"
@@ -751,172 +751,166 @@ void hugehelp(void)
" If you start the data with the letter @, the rest should be a\n"
" file name to read the data from, or - if you want curl to read\n"
" the data from stdin. Multiple files can also be specified. Post-\n"
-" ing data from a file named 'foobar' would thus be done with -d,\n"
+" ing data from a file named from a file like that, carriage re-\n"
, stdout);
fputs(
-" --data @foobar. When --data is told to read from a file like\n"
-" that, carriage returns and newlines will be stripped out. If you\n"
-" don't want the @ character to have a special interpretation use\n"
-" --data-raw instead.\n"
+" turns and newlines will be stripped out. If you don't want the @\n"
+" character to have a special interpretation use --data-raw in-\n"
+" stead.\n"
"\n"
" See also --data-binary and --data-urlencode and --data-raw. This\n"
-" option overrides -F, --form and -I, --head and -T, --upload-\n"
+" option overrides -F, --form and -I, --head and -T, --upload-\n"
" file.\n"
"\n"
" --delegation <LEVEL>\n"
+" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
, stdout);
fputs(
-" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
" to delegate when it comes to user credentials.\n"
"\n"
" none Don't allow any delegation.\n"
"\n"
-" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
-" in the Kerberos service ticket, which is a matter of\n"
+" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
+" in the Kerberos service ticket, which is a matter of\n"
" realm policy.\n"
"\n"
" always Unconditionally allow the server to delegate.\n"
"\n"
" --digest\n"
+" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
, stdout);
fputs(
-" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
-" cation scheme that prevents the password from being sent over\n"
-" the wire in clear text. Use this in combination with the normal\n"
+" cation scheme that prevents the password from being sent over\n"
+" the wire in clear text. Use this in combination with the normal\n"
" -u, --user option to set user name and password.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also -u, --user and --proxy-digest and --anyauth. This op-\n"
-, stdout);
- fputs(
+" See also -u, --user and --proxy-digest and --anyauth. This op-\n"
" tion overrides --basic and --ntlm and --negotiate.\n"
"\n"
" --disable-eprt\n"
+, stdout);
+ fputs(
" (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n"
" when doing active FTP transfers. Curl will normally always first\n"
-" attempt to use EPRT, then LPRT before using PORT, but with this\n"
-" option, it will use PORT right away. EPRT and LPRT are exten-\n"
-" sions to the original FTP protocol, and may not work on all\n"
+" attempt to use EPRT, then LPRT before using PORT, but with this\n"
+" option, it will use PORT right away. EPRT and LPRT are exten-\n"
+" sions to the original FTP protocol, and may not work on all\n"
+" servers, but they enable more functionality in a better way than\n"
, stdout);
fputs(
-" servers, but they enable more functionality in a better way than\n"
" the traditional PORT command.\n"
"\n"
" --eprt can be used to explicitly enable EPRT again and --no-eprt\n"
" is an alias for --disable-eprt.\n"
"\n"
-" If the server is accessed using IPv6, this option will have no\n"
+" If the server is accessed using IPv6, this option will have no\n"
" effect as EPRT is necessary then.\n"
"\n"
-" Disabling EPRT only changes the active behavior. If you want to\n"
-, stdout);
- fputs(
-" switch to passive mode you need to not use -P, --ftp-port or\n"
+" Disabling EPRT only changes the active behavior. If you want to\n"
+" switch to passive mode you need to not use -P, --ftp-port or\n"
" force it with --ftp-pasv.\n"
"\n"
+, stdout);
+ fputs(
" --disable-epsv\n"
-" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
-" when doing passive FTP transfers. Curl will normally always\n"
-" first attempt to use EPSV before PASV, but with this option, it\n"
+" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
+" when doing passive FTP transfers. Curl will normally always\n"
+" first attempt to use EPSV before PASV, but with this option, it\n"
" will not try using EPSV.\n"
"\n"
" --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
-, stdout);
- fputs(
" is an alias for --disable-epsv.\n"
"\n"
-" If the server is an IPv6 host, this option will have no effect\n"
+, stdout);
+ fputs(
+" If the server is an IPv6 host, this option will have no effect\n"
" as EPSV is necessary then.\n"
"\n"
" Disabling EPSV only changes the passive behavior. If you want to\n"
" switch to active mode you need to use -P, --ftp-port.\n"
"\n"
" -q, --disable\n"
-" If used as the first parameter on the command line, the curlrc\n"
-" config file will not be read and used. See the -K, --config for\n"
+" If used as the first parameter on the command line, the curlrc\n"
+" config file will not be read and used. See the -K, --config for\n"
, stdout);
fputs(
" details on the default config file search path.\n"
"\n"
" --disallow-username-in-url\n"
-" (HTTP) This tells curl to exit if passed a url containing a\n"
+" (HTTP) This tells curl to exit if passed a url containing a\n"
" username.\n"
"\n"
" See also --proto. Added in 7.61.0.\n"
"\n"
" --dns-interface <interface>\n"
-" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
-" face>. This option is a counterpart to --interface (which does\n"
+" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
+" face>. This option is a counterpart to --interface (which does\n"
, stdout);
fputs(
-" not affect DNS). The supplied string must be an interface name\n"
+" not affect DNS). The supplied string must be an interface name\n"
" (not an address).\n"
"\n"
-" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv4-addr <address>\n"
" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
+" quests, so that the DNS requests originate from this address.\n"
, stdout);
fputs(
" The argument should be a single IPv4 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv6-addr <address>\n"
" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
+" quests, so that the DNS requests originate from this address.\n"
, stdout);
fputs(
" The argument should be a single IPv6 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-servers <addresses>\n"
" Set the list of DNS servers to be used instead of the system de-\n"
-" fault. The list of IP addresses should be separated with com-\n"
+" fault. The list of IP addresses should be separated with com-\n"
, stdout);
fputs(
" mas. Port numbers may also optionally be given as :<port-number>\n"
" after each IP address.\n"
"\n"
-" --dns-servers requires that the underlying libcurl was built to\n"
+" --dns-servers requires that the underlying libcurl was built to\n"
" support c-ares. Added in 7.33.0.\n"
"\n"
" --doh-url <URL>\n"
-" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
-" solve hostnames, instead of using the default name resolver\n"
+" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
+" solve hostnames, instead of using the default name resolver\n"
" mechanism. The URL must be HTTPS.\n"
"\n"
, stdout);
fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
-" Added in 7.62.0.\n"
-"\n"
" -D, --dump-header <filename>\n"
-" (HTTP FTP) Write the received protocol headers to the specified\n"
+" (HTTP FTP) Write the received protocol headers to the specified\n"
" file.\n"
"\n"
-" This option is handy to use when you want to store the headers\n"
-" that an HTTP site sends to you. Cookies from the headers could\n"
-" then be read in a second curl invocation by using the -b,\n"
+" This option is handy to use when you want to store the headers\n"
+" that an HTTP site sends to you. Cookies from the headers could\n"
+" then be read in a second curl invocation by using the -b,\n"
, stdout);
fputs(
-" --cookie option! The -c, --cookie-jar option is a better way to\n"
+" --cookie option! The -c, --cookie-jar option is a better way to\n"
" store cookies.\n"
"\n"
-" If no headers are received, the use of this option will create\n"
-" an empty file.\n"
-"\n"
" When used in FTP, the FTP server response lines are considered\n"
" being \"headers\" and thus are saved there.\n"
"\n"
@@ -925,9 +919,9 @@ void hugehelp(void)
" See also -o, --output.\n"
"\n"
" --egd-file <file>\n"
+" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
, stdout);
fputs(
-" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
" socket. The socket is used to seed the random engine for SSL\n"
" connections.\n"
"\n"
@@ -937,44 +931,44 @@ void hugehelp(void)
" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
" tions. Use --engine list to print a list of build-time supported\n"
" engines. Note that not all (or none) of the engines may be\n"
-, stdout);
- fputs(
" available at run-time.\n"
"\n"
" --expect100-timeout <seconds>\n"
+, stdout);
+ fputs(
" (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
" 100-continue response when curl emits an Expects: 100-continue\n"
" header in its request. By default curl will wait one second.\n"
" This option accepts decimal values! When curl stops waiting, it\n"
" will continue as if the response has been received.\n"
"\n"
-, stdout);
- fputs(
" See also --connect-timeout. Added in 7.47.0.\n"
"\n"
" --fail-early\n"
+, stdout);
+ fputs(
" Fail and exit on the first detected transfer error.\n"
"\n"
" When curl is used to do multiple transfers on the command line,\n"
" it will attempt to operate on each given URL, one by one. By de-\n"
" fault, it will ignore errors if there are more URLs given and\n"
" the last URL's success will determine the error code curl re-\n"
-, stdout);
- fputs(
" turns. So early failures will be \"hidden\" by subsequent success-\n"
" ful transfers.\n"
"\n"
+, stdout);
+ fputs(
" Using this option, curl will instead return an error on the\n"
" first transfer that fails, independent of the amount of URLs\n"
" that are given on the command line. This way, no transfer fail-\n"
" ures go undetected by scripts and similar.\n"
"\n"
" This option is global and does not need to be specified for each\n"
-, stdout);
- fputs(
" use of -:, --next.\n"
"\n"
" This option does not imply -f, --fail, which causes transfers to\n"
+, stdout);
+ fputs(
" fail due to the server's HTTP status code. You can combine the\n"
" two options, however note -f, --fail is not global and is there-\n"
" fore contained by -:, --next.\n"
@@ -983,77 +977,75 @@ void hugehelp(void)
"\n"
" -f, --fail\n"
" (HTTP) Fail silently (no output at all) on server errors. This\n"
-, stdout);
- fputs(
" is mostly done to better enable scripts etc to better deal with\n"
" failed attempts. In normal cases when an HTTP server fails to\n"
+, stdout);
+ fputs(
" deliver a document, it returns an HTML document stating so\n"
" (which often also describes why and more). This flag will pre-\n"
" vent curl from outputting that and return error 22.\n"
"\n"
" This method is not fail-safe and there are occasions where non-\n"
-, stdout);
- fputs(
" successful response codes will slip through, especially when au-\n"
" thentication is involved (response codes 401 and 407).\n"
"\n"
" --false-start\n"
+, stdout);
+ fputs(
" (TLS) Tells curl to use false start during the TLS handshake.\n"
" False start is a mode where a TLS client will start sending ap-\n"
" plication data before verifying the server's Finished message,\n"
" thus saving a round trip when performing a full handshake.\n"
"\n"
-, stdout);
- fputs(
" This is currently only implemented in the NSS and Secure Trans-\n"
" port (on iOS 7.0 or later, or OS X 10.9 or later) backends.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
+, stdout);
+ fputs(
" --form-string <name=string>\n"
" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
" string for the named parameter is used literally. Leading '@'\n"
" and '<' characters, and the ';type=' string in the value have no\n"
-, stdout);
- fputs(
" special meaning. Use this in preference to -F, --form if there's\n"
" any possibility that the string value may accidentally trigger\n"
" the '@' or '<' features of -F, --form.\n"
"\n"
+, stdout);
+ fputs(
" See also -F, --form.\n"
"\n"
" -F, --form <name=content>\n"
" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
" late a filled-in form in which a user has pressed the submit\n"
-, stdout);
- fputs(
" button. This causes curl to POST data using the Content-Type\n"
" multipart/form-data according to RFC 2388.\n"
"\n"
" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
" tipart mail message to transmit.\n"
"\n"
-" This enables uploading of binary files etc. To force the 'con-\n"
-" tent' part to be a file, prefix the file name with an @ sign. To\n"
, stdout);
fputs(
+" This enables uploading of binary files etc. To force the 'con-\n"
+" tent' part to be a file, prefix the file name with an @ sign. To\n"
" just get the content part from a file, prefix the file name with\n"
" the symbol <. The difference between @ and < is then that @\n"
" makes a file get attached in the post as a file upload, while\n"
" the < makes a text field and just get the contents for that text\n"
+, stdout);
+ fputs(
" field from a file.\n"
"\n"
" Tell curl to read content from stdin instead of a file by using\n"
-, stdout);
- fputs(
" - as filename. This goes for both @ and < constructs. When stdin\n"
" is used, the contents is buffered in memory first by curl to de-\n"
" termine its size and allow a possible resend. Defining a part's\n"
" data from a named non-regular file (such as a named pipe or sim-\n"
-" ilar) is unfortunately not subject to buffering and will be ef-\n"
-" fectively read at transmission time; since the full size is un-\n"
, stdout);
fputs(
+" ilar) is unfortunately not subject to buffering and will be ef-\n"
+" fectively read at transmission time; since the full size is un-\n"
" known before the transfer starts, such data is sent as chunks by\n"
" HTTP and rejected by IMAP.\n"
"\n"
@@ -1061,26 +1053,26 @@ void hugehelp(void)
" name of the form-field to which the file portrait.jpg will be\n"
" the input:\n"
"\n"
+, stdout);
+ fputs(
" curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
"\n"
" Example: send a your name and shoe size in two text fields to\n"
" the server:\n"
"\n"
-, stdout);
- fputs(
" curl -F name=John -F shoesize=11 https://example.com/\n"
"\n"
" Example: send a your essay in a text field to the server. Send\n"
" it as a plain text field, but get the contents for it from a lo-\n"
" cal file:\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"story=<hugefile.txt\" https://example.com/\n"
"\n"
" You can also tell curl what Content-Type to use by using\n"
" 'type=', in a manner similar to:\n"
"\n"
-, stdout);
- fputs(
" curl -F \"web=@index.html;type=text/html\" example.com\n"
"\n"
" or\n"
@@ -1090,13 +1082,13 @@ void hugehelp(void)
" You can also explicitly change the name field of a file upload\n"
" part by setting filename=, like this:\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
"\n"
" If filename/path contains ',' or ';', it must be quoted by dou-\n"
" ble-quotes like:\n"
"\n"
-, stdout);
- fputs(
" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
" ple.com\n"
"\n"
@@ -1105,12 +1097,12 @@ void hugehelp(void)
" curl -F 'file=@\"localfile\";filename=\"nameinpost\"' example.com\n"
"\n"
" Note that if a filename/path is quoted by double-quotes, any\n"
+, stdout);
+ fputs(
" double-quote or backslash within the filename must be escaped by\n"
" backslash.\n"
"\n"
" Quoting must also be applied to non-file data if it contains\n"
-, stdout);
- fputs(
" semicolons, leading/trailing spaces or leading double quotes:\n"
"\n"
" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
@@ -1119,22 +1111,22 @@ void hugehelp(void)
" You can add custom headers to the field by setting headers=,\n"
" like\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"submit=OK;headers=\\\"X-submit-type: OK\\\"\" example.com\n"
"\n"
" or\n"
"\n"
" curl -F \"submit=OK;headers=@headerfile\" example.com\n"
"\n"
-, stdout);
- fputs(
" The headers= keyword may appear more that once and above notes\n"
" about quoting apply. When headers are read from a file, Empty\n"
" lines and lines starting with '#' are comments and ignored; each\n"
" header can be folded by splitting between two words and starting\n"
-" the continuation line with a space; embedded carriage-returns\n"
-" and trailing spaces are stripped. Here is an example of a\n"
, stdout);
fputs(
+" the continuation line with a space; embedded carriage-returns\n"
+" and trailing spaces are stripped. Here is an example of a\n"
" header file contents:\n"
"\n"
" # This file contain two headers.\n"
@@ -1145,43 +1137,43 @@ void hugehelp(void)
" another header\n"
"\n"
" To support sending multipart mail messages, the syntax is ex-\n"
+, stdout);
+ fputs(
" tended as follows:\n"
" - name can be omitted: the equal sign is the first character of\n"
" the argument,\n"
-, stdout);
- fputs(
" - if data starts with '(', this signals to start a new multi-\n"
" part: it can be followed by a content type specification.\n"
" - a multipart can be terminated with a '=)' argument.\n"
"\n"
" Example: the following command sends an SMTP mime e-mail con-\n"
+, stdout);
+ fputs(
" sisting in an inline part in two alternative formats: plain text\n"
" and HTML. It attaches a text file:\n"
"\n"
" curl -F '=(;type=multipart/alternative' \\\n"
-, stdout);
- fputs(
" -F '=plain text message' \\\n"
" -F '= <body>HTML message</body>;type=text/html' \\\n"
" -F '=)' -F '=@textfile.txt' ... smtp://example.com\n"
"\n"
" Data can be encoded for transfer using encoder=. Available en-\n"
-" codings are binary and 8bit that do nothing else than adding the\n"
-" corresponding Content-Transfer-Encoding header, 7bit that only\n"
, stdout);
fputs(
+" codings are binary and 8bit that do nothing else than adding the\n"
+" corresponding Content-Transfer-Encoding header, 7bit that only\n"
" rejects 8-bit characters with a transfer error, quoted-printable\n"
" and base64 that encodes data according to the corresponding\n"
" schemes, limiting lines length to 76 characters.\n"
"\n"
" Example: send multipart mail with a quoted-printable text mes-\n"
+, stdout);
+ fputs(
" sage and a base64 attached file:\n"
"\n"
" curl -F '=text message;encoder=quoted-printable' \\\n"
" -F '=@localfile;encoder=base64' ... smtp://example.com\n"
"\n"
-, stdout);
- fputs(
" See further examples and details in the MANUAL.\n"
"\n"
" This option can be used multiple times.\n"
@@ -1190,47 +1182,47 @@ void hugehelp(void)
" load-file.\n"
"\n"
" --ftp-account <data>\n"
+, stdout);
+ fputs(
" (FTP) When an FTP server asks for \"account data\" after user name\n"
" and password has been provided, this data is sent off using the\n"
" ACCT command.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.13.0.\n"
"\n"
" --ftp-alternative-to-user <command>\n"
" (FTP) If authenticating with the USER and PASS commands fails,\n"
+, stdout);
+ fputs(
" send this command. When connecting to Tumbleweed's Secure\n"
" Transport server over FTPS using a client certificate, using\n"
" \"SITE AUTH\" will tell the server to retrieve the username from\n"
-, stdout);
- fputs(
" the certificate.\n"
" Added in 7.15.5.\n"
"\n"
" --ftp-create-dirs\n"
" (FTP SFTP) When an FTP or SFTP URL/operation uses a path that\n"
" doesn't currently exist on the server, the standard behavior of\n"
+, stdout);
+ fputs(
" curl is to fail. Using this option, curl will instead attempt to\n"
" create missing directories.\n"
"\n"
" See also --create-dirs.\n"
"\n"
" --ftp-method <method>\n"
-, stdout);
- fputs(
" (FTP) Control what method curl should use to reach a file on an\n"
" FTP(S) server. The method argument should be one of the follow-\n"
" ing alternatives:\n"
"\n"
" multicwd\n"
" curl does a single CWD operation for each path part in\n"
-" the given URL. For deep hierarchies this means very many\n"
-" commands. This is how RFC 1738 says it should be done.\n"
, stdout);
fputs(
+" the given URL. For deep hierarchies this means very many\n"
+" commands. This is how RFC 1738 says it should be done.\n"
" This is the default but the slowest behavior.\n"
"\n"
" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
@@ -1238,10 +1230,10 @@ void hugehelp(void)
" mands. This is the fastest behavior.\n"
"\n"
" singlecwd\n"
-" curl does one CWD with the full target directory and then\n"
-" operates on the file \"normally\" (like in the multicwd\n"
, stdout);
fputs(
+" curl does one CWD with the full target directory and then\n"
+" operates on the file \"normally\" (like in the multicwd\n"
" case). This is somewhat more standards compliant than\n"
" 'nocwd' but without the full penalty of 'multicwd'.\n"
"\n"
@@ -1249,26 +1241,28 @@ void hugehelp(void)
"\n"
" --ftp-pasv\n"
" (FTP) Use passive mode for the data connection. Passive is the\n"
+, stdout);
+ fputs(
" internal default behavior, but using this option can be used to\n"
" override a previous -P, --ftp-port option.\n"
"\n"
" If this option is used several times, only the first one is\n"
-, stdout);
- fputs(
" used. Undoing an enforced passive really isn't doable but you\n"
" must then instead enforce the correct -P, --ftp-port again.\n"
"\n"
" Passive mode means that curl will try the EPSV command first and\n"
+, stdout);
+ fputs(
" then PASV, unless --disable-epsv is used.\n"
" See also --disable-epsv. Added in 7.11.0.\n"
"\n"
" -P, --ftp-port <address>\n"
" (FTP) Reverses the default initiator/listener roles when con-\n"
-, stdout);
- fputs(
" necting with FTP. This option makes curl use active mode. curl\n"
" then tells the server to connect back to the client's specified\n"
" address and port, while passive mode asks the server to setup an\n"
+, stdout);
+ fputs(
" IP address and port for it to connect to. <address> should be\n"
" one of:\n"
"\n"
@@ -1276,25 +1270,25 @@ void hugehelp(void)
" e.g. \"eth0\" to specify which interface's IP address you\n"
" want to use (Unix only)\n"
"\n"
-, stdout);
- fputs(
" IP address\n"
" e.g. \"192.168.10.1\" to specify the exact IP address\n"
"\n"
" host name\n"
" e.g. \"my.host.domain\" to specify the machine\n"
"\n"
+, stdout);
+ fputs(
" - make curl pick the same IP address that is already used\n"
" for the control connection\n"
"\n"
" If this option is used several times, the last one will be used. Dis-\n"
" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n"
-, stdout);
- fputs(
" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n"
" PORT++.\n"
"\n"
" Since 7.19.5, you can append \":[start]-[end]\" to the right of the ad-\n"
+, stdout);
+ fputs(
" dress, to tell curl what TCP port range to use. That means you specify\n"
" a port range, from a lower to a higher number. A single number works as\n"
" well, but do note that it increases the risk of failure since the port\n"
@@ -1302,11 +1296,11 @@ void hugehelp(void)
"\n"
" See also --ftp-pasv and --disable-eprt.\n"
"\n"
-, stdout);
- fputs(
" --ftp-pret\n"
" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n"
" Certain FTP servers, mainly drftpd, require this non-standard\n"
+, stdout);
+ fputs(
" command for directory listings as well as up and downloads in\n"
" PASV mode.\n"
"\n"
@@ -1315,11 +1309,11 @@ void hugehelp(void)
" --ftp-skip-pasv-ip\n"
" (FTP) Tell curl to not use the IP address the server suggests in\n"
" its response to curl's PASV command when curl connects the data\n"
-, stdout);
- fputs(
" connection. Instead curl will re-use the same IP address it al-\n"
" ready uses for the control connection.\n"
"\n"
+, stdout);
+ fputs(
" This option has no effect if PORT, EPRT or EPSV is used instead\n"
" of PASV.\n"
"\n"
@@ -1328,9 +1322,9 @@ void hugehelp(void)
" --ftp-ssl-ccc-mode <active/passive>\n"
" (FTP) Sets the CCC mode. The passive mode will not initiate the\n"
" shutdown, but instead wait for the server to do it, and will not\n"
+" reply to the shutdown from the server. The active mode initiates\n"
, stdout);
fputs(
-" reply to the shutdown from the server. The active mode initiates\n"
" the shutdown and waits for a reply from the server.\n"
"\n"
" See also --ftp-ssl-ccc. Added in 7.16.2.\n"
@@ -1339,10 +1333,10 @@ void hugehelp(void)
" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
" layer after authenticating. The rest of the control channel com-\n"
" munication will be unencrypted. This allows NAT routers to fol-\n"
-, stdout);
- fputs(
" low the FTP transaction. The default mode is passive.\n"
"\n"
+, stdout);
+ fputs(
" See also --ssl and --ftp-ssl-ccc-mode. Added in 7.16.1.\n"
"\n"
" --ftp-ssl-control\n"
@@ -1354,18 +1348,18 @@ void hugehelp(void)
" Added in 7.16.0.\n"
"\n"
" -G, --get\n"
+" When used, this option will make all data specified with -d,\n"
, stdout);
fputs(
-" When used, this option will make all data specified with -d,\n"
" --data, --data-binary or --data-urlencode to be used in an HTTP\n"
" GET request instead of the POST request that otherwise would be\n"
" used. The data will be appended to the URL with a '?' separator.\n"
" If used in combination with -I, --head, the POST data will in-\n"
" stead be appended to the URL with a HEAD request.\n"
"\n"
+" If this option is used several times, only the first one is\n"
, stdout);
fputs(
-" If this option is used several times, only the first one is\n"
" used. This is because undoing a GET doesn't make sense, but you\n"
" should then instead enforce the alternative method you prefer.\n"
"\n"
@@ -1373,29 +1367,29 @@ void hugehelp(void)
" This option switches off the \"URL globbing parser\". When you set\n"
" this option, you can specify URLs that contain the letters {}[]\n"
" without having them being interpreted by curl itself. Note that\n"
+" these letters are not normal legal URL contents but they should\n"
, stdout);
fputs(
-" these letters are not normal legal URL contents but they should\n"
" be encoded according to the URI standard.\n"
"\n"
" --happy-eyeballs-timeout-ms <milliseconds>\n"
" Happy eyeballs is an algorithm that attempts to connect to both\n"
" IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6\n"
" first for the number of milliseconds. If the IPv6 address cannot\n"
+" be connected to within that time then a connection attempt is\n"
, stdout);
fputs(
-" be connected to within that time then a connection attempt is\n"
" made to the IPv4 address in parallel. The first connection to be\n"
" established is the one that is used.\n"
"\n"
" The range of suggested useful values is limited. Happy Eyeballs\n"
" RFC 6555 says \"It is RECOMMENDED that connection attempts be\n"
" paced 150-250 ms apart to balance human factors against network\n"
-, stdout);
- fputs(
" load.\" libcurl currently defaults to 200 ms. Firefox and Chrome\n"
" currently default to 300 ms.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.59.0.\n"
@@ -1404,9 +1398,9 @@ void hugehelp(void)
" (HTTP) Send a HAProxy PROXY protocol v1 header at the beginning\n"
" of the connection. This is used by some load balancers and re-\n"
" verse proxies to indicate the client's true IP address and port.\n"
+" This option is primarily useful when sending test requests to a\n"
, stdout);
fputs(
-" This option is primarily useful when sending test requests to a\n"
" service that expects this header.\n"
"\n"
" Added in 7.60.0.\n"
@@ -1417,35 +1411,35 @@ void hugehelp(void)
" document. When used on an FTP or FILE file, curl displays the\n"
" file size and last modification time only.\n"
"\n"
+" -H, --header <header/@file>\n"
, stdout);
fputs(
-" -H, --header <header/@file>\n"
" (HTTP) Extra header to include in the request when sending HTTP\n"
" to a server. You may specify any number of extra headers. Note\n"
" that if you should add a custom header that has the same name as\n"
" one of the internal ones curl would use, your externally set\n"
" header will be used instead of the internal one. This allows you\n"
+" to make even trickier stuff than curl would normally do. You\n"
, stdout);
fputs(
-" to make even trickier stuff than curl would normally do. You\n"
" should not replace internally set headers without knowing per-\n"
" fectly well what you're doing. Remove an internal header by giv-\n"
" ing a replacement without content on the right side of the\n"
" colon, as in: -H \"Host:\". If you send the custom header with no-\n"
" value then its header must be terminated with a semicolon, such\n"
-, stdout);
- fputs(
" as -H \"X-Custom-Header;\" to send \"X-Custom-Header:\".\n"
"\n"
+, stdout);
+ fputs(
" curl will make sure that each header you add/replace is sent\n"
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
" Starting in 7.55.0, this option can take an argument in @file-\n"
+" name style, which then adds a header for each line in the input\n"
, stdout);
fputs(
-" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
" See also the -A, --user-agent and -e, --referer options.\n"
@@ -1457,9 +1451,9 @@ void hugehelp(void)
"\n"
" curl -H \"X-First-Name: Joe\" http://example.com/\n"
"\n"
+" WARNING: headers set with this option will be set in all re-\n"
, stdout);
fputs(
-" WARNING: headers set with this option will be set in all re-\n"
" quests - even after redirects are followed, like when told with\n"
" -L, --location. This can lead to the header being sent to other\n"
" hosts than the original host, so sensitive headers should be\n"
@@ -1468,9 +1462,9 @@ void hugehelp(void)
" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
+" -h, --help\n"
, stdout);
fputs(
-" -h, --help\n"
" Usage help. This lists all current command line options with a\n"
" short description.\n"
" --hostpubmd5 <md5>\n"
@@ -1491,12 +1485,13 @@ void hugehelp(void)
" response since curl will simply transparently downgrade - if al-\n"
" lowed.\n"
"\n"
-" Since curl 7.66.0, HTTP/0.9 is disabled by default.\n"
+" A future curl version will deny continuing if the response isn't\n"
+" at least HTTP/1.0 unless this option is used.\n"
"\n"
" -0, --http1.0\n"
, stdout);
fputs(
-" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
+" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
" internally preferred HTTP version.\n"
"\n"
" This option overrides --http1.1 and --http2.\n"
@@ -1504,16 +1499,16 @@ void hugehelp(void)
" --http1.1\n"
" (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
-" This option overrides -0, --http1.0 and --http2. Added in\n"
+" This option overrides -0, --http1.0 and --http2. Added in\n"
" 7.33.0.\n"
"\n"
" --http2-prior-knowledge\n"
-" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
, stdout);
fputs(
-" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
-" that the server supports HTTP/2 straight away. HTTPS requests\n"
-" will still do HTTP/2 the standard way with negotiated protocol\n"
+" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
+" that the server supports HTTP/2 straight away. HTTPS requests\n"
+" will still do HTTP/2 the standard way with negotiated protocol\n"
" version in the TLS handshake.\n"
"\n"
" --http2-prior-knowledge requires that the underlying libcurl was\n"
@@ -1525,39 +1520,15 @@ void hugehelp(void)
" --http2\n"
" (HTTP) Tells curl to use HTTP version 2.\n"
"\n"
-" See also --http1.1 and --http3. --http2 requires that the under-\n"
-" lying libcurl was built to support HTTP/2. This option overrides\n"
-" --http1.1 and -0, --http1.0 and --http2-prior-knowledge. Added\n"
-" in 7.33.0.\n"
-"\n"
-" --http3\n"
-" (HTTP) WARNING: this option is experiemental. Do not use in pro-\n"
-" duction.\n"
-"\n"
-, stdout);
- fputs(
-" Tells curl to use HTTP version 3 directly to the host and port\n"
-" number used in the URL. A normal HTTP/3 transaction will be done\n"
-" to a host and then get redirected via Alt-SVc, but this option\n"
-" allows a user to circumvent that when you know that the target\n"
-" speaks HTTP/3 on the given host and port.\n"
-"\n"
-" This option will make curl fail if a QUIC connection cannot be\n"
-, stdout);
- fputs(
-" established, it cannot fall back to a lower HTTP version on its\n"
-" own.\n"
-"\n"
-" See also --http1.1 and --http2. --http3 requires that the under-\n"
-" lying libcurl was built to support HTTP/3. This option overrides\n"
-" --http1.1 and -0, --http1.0 and --http2 and --http2-prior-knowl-\n"
-" edge. Added in 7.66.0.\n"
+" See also --no-alpn. --http2 requires that the underlying libcurl\n"
+" was built to support HTTP/2. This option overrides --http1.1 and\n"
+" -0, --http1.0 and --http2-prior-knowledge. Added in 7.33.0.\n"
"\n"
" --ignore-content-length\n"
" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
+" particularly useful for servers running Apache 1.x, which will\n"
, stdout);
fputs(
-" particularly useful for servers running Apache 1.x, which will\n"
" report incorrect Content-Length for files larger than 2 giga-\n"
" bytes.\n"
"\n"
@@ -1567,10 +1538,10 @@ void hugehelp(void)
" -i, --include\n"
" Include the HTTP response headers in the output. The HTTP re-\n"
" sponse headers can include things like server name, cookies,\n"
-, stdout);
- fputs(
" date of the document, HTTP version and more...\n"
"\n"
+, stdout);
+ fputs(
" To view the request headers, consider the -v, --verbose option.\n"
"\n"
" See also -v, --verbose.\n"
@@ -1580,9 +1551,9 @@ void hugehelp(void)
" be secure. This option allows curl to proceed and operate even\n"
" for server connections otherwise considered insecure.\n"
"\n"
+" The server connection is verified by making sure the server's\n"
, stdout);
fputs(
-" The server connection is verified by making sure the server's\n"
" certificate contains the right name and verifies successfully\n"
" using the cert store.\n"
"\n"
@@ -1593,24 +1564,24 @@ void hugehelp(void)
" --interface <name>\n"
"\n"
" Perform an operation using a specified interface. You can enter\n"
-, stdout);
- fputs(
" interface name, IP address or host name. An example could look\n"
" like:\n"
"\n"
+, stdout);
+ fputs(
" curl --interface eth0:1 https://www.example.com/\n"
"\n"
" If this option is used several times, the last one will be used.\n"
" On Linux it can be used to specify a VRF, but the binary needs\n"
" to either have CAP_NET_RAW or to be run as root. More informa-\n"
" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
-, stdout);
- fputs(
" tion/networking/vrf.txt\n"
"\n"
" See also --dns-interface.\n"
"\n"
" -4, --ipv4\n"
+, stdout);
+ fputs(
" This option tells curl to resolve names to IPv4 addresses only,\n"
" and not for example try IPv6.\n"
"\n"
@@ -1621,11 +1592,11 @@ void hugehelp(void)
" This option tells curl to resolve names to IPv6 addresses only,\n"
" and not for example try IPv4.\n"
"\n"
-, stdout);
- fputs(
" See also --http1.1 and --http2. This option overrides -4,\n"
" --ipv4.\n"
"\n"
+, stdout);
+ fputs(
" -j, --junk-session-cookies\n"
" (HTTP) When curl is told to read cookies from a given file, this\n"
" option will make it discard all \"session cookies\". This will ba-\n"
@@ -1633,20 +1604,20 @@ void hugehelp(void)
" Typical browsers always discard session cookies when they're\n"
" closed down.\n"
"\n"
-, stdout);
- fputs(
" See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
" --keepalive-time <seconds>\n"
+, stdout);
+ fputs(
" This option sets the time a connection needs to remain idle be-\n"
" fore sending keepalive probes and the time between individual\n"
" keepalive probes. It is currently effective on operating systems\n"
" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
-, stdout);
- fputs(
" effect if --no-keepalive is used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
" If unspecified, the option defaults to 60 seconds.\n"
"\n"
@@ -1657,162 +1628,161 @@ void hugehelp(void)
" vided private key is. DER, PEM, and ENG are supported. If not\n"
" specified, PEM is assumed.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" --key <key>\n"
" (TLS SSH) Private key file name. Allows you to provide your pri-\n"
" vate key in this separate file. For SSH, if not specified, curl\n"
-" tries the following candidates in order: '~/.ssh/id_rsa',\n"
-" '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
+" tries the following candidates in order:\n"
"\n"
-" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
+" ify a private key located in a PKCS#11 device. A string begin-\n"
, stdout);
fputs(
-" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
-" ify a private key located in a PKCS#11 device. A string begin-\n"
-" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
+" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
" PKCS#11 URI is provided, then the --engine option will be set as\n"
-" \"pkcs11\" if none was provided and the --key-type option will be\n"
+" \"pkcs11\" if none was provided and the --key-type option will be\n"
" set as \"ENG\" if none was provided.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --krb <level>\n"
-" (FTP) Enable Kerberos authentication and use. The level must be\n"
+" (FTP) Enable Kerberos authentication and use. The level must be\n"
+, stdout);
+ fputs(
" entered and should be one of 'clear', 'safe', 'confidential', or\n"
-" 'private'. Should you use a level that is not one of these,\n"
+" 'private'. Should you use a level that is not one of these,\n"
" 'private' will instead be used.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-, stdout);
- fputs(
-" --krb requires that the underlying libcurl was built to support\n"
+" --krb requires that the underlying libcurl was built to support\n"
" Kerberos.\n"
"\n"
" --libcurl <file>\n"
-" Append this option to any ordinary curl command line, and you\n"
-" will get a libcurl-using C source code written to the file that\n"
+" Append this option to any ordinary curl command line, and you\n"
+, stdout);
+ fputs(
+" will get a libcurl-using C source code written to the file that\n"
" does the equivalent of what your command-line operation does!\n"
"\n"
-" If this option is used several times, the last given file name\n"
+" If this option is used several times, the last given file name\n"
" will be used.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.16.1.\n"
"\n"
" --limit-rate <speed>\n"
-" Specify the maximum transfer rate you want curl to use - for\n"
+" Specify the maximum transfer rate you want curl to use - for\n"
" both downloads and uploads. This feature is useful if you have a\n"
+, stdout);
+ fputs(
" limited pipe and you'd like your transfer not to use your entire\n"
" bandwidth. To make it slower than it otherwise would be.\n"
"\n"
-" The given speed is measured in bytes/second, unless a suffix is\n"
-, stdout);
- fputs(
-" appended. Appending 'k' or 'K' will count the number as kilo-\n"
-" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
+" The given speed is measured in bytes/second, unless a suffix is\n"
+" appended. Appending 'k' or 'K' will count the number as kilo-\n"
+" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
" gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
-" If you also use the -Y, --speed-limit option, that option will\n"
+, stdout);
+ fputs(
+" If you also use the -Y, --speed-limit option, that option will\n"
" take precedence and might cripple the rate-limiting slightly, to\n"
" help keeping the speed-limit logic working.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -l, --list-only\n"
-" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
-" forces a name-only view. This is especially useful if the user\n"
-" wants to machine-parse the contents of an FTP directory since\n"
-" the normal directory view doesn't use a standard look or format.\n"
-" When used like this, the option causes a NLST command to be sent\n"
+" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
+" forces a name-only view. This is especially useful if the user\n"
, stdout);
fputs(
+" wants to machine-parse the contents of an FTP directory since\n"
+" the normal directory view doesn't use a standard look or format.\n"
+" When used like this, the option causes a NLST command to be sent\n"
" to the server instead of LIST.\n"
"\n"
-" Note: Some FTP servers list only files in their response to\n"
+" Note: Some FTP servers list only files in their response to\n"
" NLST; they do not include sub-directories and symbolic links.\n"
"\n"
-" (POP3) When retrieving a specific email from POP3, this switch\n"
-" forces a LIST command to be performed instead of RETR. This is\n"
-" particularly useful if the user wants to see if a specific mes-\n"
, stdout);
fputs(
+" (POP3) When retrieving a specific email from POP3, this switch\n"
+" forces a LIST command to be performed instead of RETR. This is\n"
+" particularly useful if the user wants to see if a specific mes-\n"
" sage id exists on the server and what size it is.\n"
"\n"
-" Note: When combined with -X, --request, this option can be used\n"
+" Note: When combined with -X, --request, this option can be used\n"
" to send an UIDL command instead, so the user may use the email's\n"
-" unique identifier rather than it's message id to make the re-\n"
+, stdout);
+ fputs(
+" unique identifier rather than it's message id to make the re-\n"
" quest.\n"
"\n"
" Added in 7.21.5.\n"
"\n"
" --local-port <num/range>\n"
-" Set a preferred single number or range (FROM-TO) of local port\n"
+" Set a preferred single number or range (FROM-TO) of local port\n"
+" numbers to use for the connection(s). Note that port numbers by\n"
+" nature are a scarce resource that will be busy at times so set-\n"
+" ting this range to something too narrow might cause unnecessary\n"
, stdout);
fputs(
-" numbers to use for the connection(s). Note that port numbers by\n"
-" nature are a scarce resource that will be busy at times so set-\n"
-" ting this range to something too narrow might cause unnecessary\n"
" connection setup failures.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --location-trusted\n"
-" (HTTP) Like -L, --location, but will allow sending the name +\n"
+" (HTTP) Like -L, --location, but will allow sending the name +\n"
" password to all hosts that the site may redirect to. This may or\n"
-, stdout);
- fputs(
" may not introduce a security breach if the site redirects you to\n"
-" a site to which you'll send your authentication info (which is\n"
+" a site to which you'll send your authentication info (which is\n"
" plaintext in the case of HTTP Basic authentication).\n"
"\n"
+, stdout);
+ fputs(
" See also -u, --user.\n"
"\n"
" -L, --location\n"
-" (HTTP) If the server reports that the requested page has moved\n"
+" (HTTP) If the server reports that the requested page has moved\n"
" to a different location (indicated with a Location: header and a\n"
-, stdout);
- fputs(
-" 3XX response code), this option will make curl redo the request\n"
-" on the new place. If used together with -i, --include or -I,\n"
+" 3XX response code), this option will make curl redo the request\n"
+" on the new place. If used together with -i, --include or -I,\n"
" --head, headers from all requested pages will be shown. When au-\n"
-" thentication is used, curl only sends its credentials to the\n"
-" initial host. If a redirect takes curl to a different host, it\n"
-" won't be able to intercept the user+password. See also --loca-\n"
, stdout);
fputs(
-" tion-trusted on how to change this. You can limit the amount of\n"
+" thentication is used, curl only sends its credentials to the\n"
+" initial host. If a redirect takes curl to a different host, it\n"
+" won't be able to intercept the user+password. See also --loca-\n"
+" tion-trusted on how to change this. You can limit the amount of\n"
" redirects to follow by using the --max-redirs option.\n"
"\n"
-" When curl follows a redirect and the request is not a plain GET\n"
+" When curl follows a redirect and the request is not a plain GET\n"
+, stdout);
+ fputs(
" (for example POST or PUT), it will do the following request with\n"
" a GET if the HTTP response was 301, 302, or 303. If the response\n"
" code was any other 3xx code, curl will re-send the following re-\n"
-, stdout);
- fputs(
" quest using the same unmodified method.\n"
"\n"
-" You can tell curl to not change the non-GET request method to\n"
-" GET after a 30x response by using the dedicated options for\n"
+" You can tell curl to not change the non-GET request method to\n"
+" GET after a 30x response by using the dedicated options for\n"
+, stdout);
+ fputs(
" that: --post301, --post302 and --post303.\n"
"\n"
" --login-options <options>\n"
-" (IMAP POP3 SMTP) Specify the login options to use during server\n"
+" (IMAP POP3 SMTP) Specify the login options to use during server\n"
" authentication.\n"
"\n"
-" You can use the login options to specify protocol specific op-\n"
+" You can use the login options to specify protocol specific op-\n"
+" tions that may be used during authentication. At present only\n"
+" IMAP, POP3 and SMTP support login options. For more information\n"
, stdout);
fputs(
-" tions that may be used during authentication. At present only\n"
-" IMAP, POP3 and SMTP support login options. For more information\n"
-" about the login options please see RFC 2384, RFC 5092 and IETF\n"
+" about the login options please see RFC 2384, RFC 5092 and IETF\n"
" draft draft-earhart-url-smtp-00.txt\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -1820,36 +1790,36 @@ void hugehelp(void)
" Added in 7.34.0.\n"
"\n"
" --mail-auth <address>\n"
-, stdout);
- fputs(
-" (SMTP) Specify a single address. This will be used to specify\n"
-" the authentication address (identity) of a submitted message\n"
+" (SMTP) Specify a single address. This will be used to specify\n"
+" the authentication address (identity) of a submitted message\n"
" that is being relayed to another server.\n"
"\n"
+, stdout);
+ fputs(
" See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
" --mail-from <address>\n"
-" (SMTP) Specify a single address that the given mail should get\n"
+" (SMTP) Specify a single address that the given mail should get\n"
" sent from.\n"
"\n"
" See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
"\n"
-, stdout);
- fputs(
" --mail-rcpt <address>\n"
" (SMTP) Specify a single address, user name or mailing list name.\n"
" Repeat this option several times to send to multiple recipients.\n"
-" When performing a mail transfer, the recipient should specify a\n"
-" valid email address to send the mail to.\n"
-"\n"
-" When performing an address verification (VRFY command), the re-\n"
-" cipient should be specified as the user name or user name and\n"
, stdout);
fputs(
+" When performing a mail transfer, the recipient should specify a\n"
+" valid email address to send the mail to.\n"
+"\n"
+" When performing an address verification (VRFY command), the re-\n"
+" cipient should be specified as the user name or user name and\n"
" domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n"
"\n"
" When performing a mailing list expand (EXPN command), the recip-\n"
-" ient should be specified using the mailing list name, such as\n"
+, stdout);
+ fputs(
+" ient should be specified using the mailing list name, such as\n"
" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n"
"\n"
" Added in 7.20.0.\n"
@@ -1858,43 +1828,43 @@ void hugehelp(void)
" Manual. Display the huge help text.\n"
"\n"
" --max-filesize <bytes>\n"
-, stdout);
- fputs(
-" Specify the maximum size (in bytes) of a file to download. If\n"
-" the file requested is larger than this value, the transfer will\n"
+" Specify the maximum size (in bytes) of a file to download. If\n"
+" the file requested is larger than this value, the transfer will\n"
" not start and curl will return with exit code 63.\n"
"\n"
-" A size modifier may be used. For example, Appending 'k' or 'K'\n"
-" will count the number as kilobytes, 'm' or 'M' makes it\n"
-" megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
, stdout);
fputs(
+" A size modifier may be used. For example, Appending 'k' or 'K'\n"
+" will count the number as kilobytes, 'm' or 'M' makes it\n"
+" megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
" 3m and 1G. (Added in 7.58.0)\n"
"\n"
-" NOTE: The file size is not always known prior to download, and\n"
+" NOTE: The file size is not always known prior to download, and\n"
" for such files this option has no effect even if the file trans-\n"
-" fer ends up being larger than this given limit. This concerns\n"
+, stdout);
+ fputs(
+" fer ends up being larger than this given limit. This concerns\n"
" both FTP and HTTP transfers.\n"
"\n"
" See also --limit-rate.\n"
"\n"
" --max-redirs <num>\n"
-" (HTTP) Set maximum number of redirection-followings allowed.\n"
-, stdout);
- fputs(
-" When -L, --location is used, is used to prevent curl from fol-\n"
+" (HTTP) Set maximum number of redirection-followings allowed.\n"
+" When -L, --location is used, is used to prevent curl from fol-\n"
" lowing redirections too much. By default, the limit is set to 50\n"
" redirections. Set this option to -1 to make it unlimited.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -m, --max-time <seconds>\n"
-" Maximum time in seconds that you allow the whole operation to\n"
+" Maximum time in seconds that you allow the whole operation to\n"
+" take. This is useful for preventing your batch jobs from hang-\n"
+" ing for hours due to slow networks or links going down. Since\n"
+" 7.32.0, this option accepts decimal values, but the actual time-\n"
, stdout);
fputs(
-" take. This is useful for preventing your batch jobs from hang-\n"
-" ing for hours due to slow networks or links going down. Since\n"
-" 7.32.0, this option accepts decimal values, but the actual time-\n"
" out will decrease in accuracy as the specified timeout increases\n"
" in decimal precision.\n"
"\n"
@@ -1903,116 +1873,116 @@ void hugehelp(void)
" See also --connect-timeout.\n"
"\n"
" --metalink\n"
+" This option can tell curl to parse and process a given URI as\n"
+" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
+" and make use of the mirrors listed within for failover if there\n"
, stdout);
fputs(
-" This option can tell curl to parse and process a given URI as\n"
-" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
-" and make use of the mirrors listed within for failover if there\n"
-" are errors (such as the file or server not being available). It\n"
-" will also verify the hash of the file after the download com-\n"
-" pletes. The Metalink file itself is downloaded and processed in\n"
-, stdout);
- fputs(
+" are errors (such as the file or server not being available). It\n"
+" will also verify the hash of the file after the download com-\n"
+" pletes. The Metalink file itself is downloaded and processed in\n"
" memory and not stored in the local file system.\n"
"\n"
" Example to use a remote Metalink file:\n"
"\n"
" curl --metalink http://www.example.com/example.metalink\n"
"\n"
+, stdout);
+ fputs(
" To use a Metalink file in the local file system, use FILE proto-\n"
" col (file://):\n"
"\n"
" curl --metalink file://example.metalink\n"
"\n"
-" Please note that if FILE protocol is disabled, there is no way\n"
+" Please note that if FILE protocol is disabled, there is no way\n"
+" to use a local Metalink file at the time of this writing. Also\n"
+" note that if --metalink and -i, --include are used together,\n"
+" --include will be ignored. This is because including headers in\n"
, stdout);
fputs(
-" to use a local Metalink file at the time of this writing. Also\n"
-" note that if --metalink and -i, --include are used together,\n"
-" --include will be ignored. This is because including headers in\n"
-" the response will break Metalink parser and if the headers are\n"
+" the response will break Metalink parser and if the headers are\n"
" included in the file described in Metalink file, hash check will\n"
" fail.\n"
"\n"
-" --metalink requires that the underlying libcurl was built to\n"
-, stdout);
- fputs(
+" --metalink requires that the underlying libcurl was built to\n"
" support metalink. Added in 7.27.0.\n"
"\n"
" --negotiate\n"
" (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
"\n"
-" This option requires a library built with GSS-API or SSPI sup-\n"
-" port. Use -V, --version to see if your curl supports GSS-\n"
-" API/SSPI or SPNEGO.\n"
-"\n"
-" When using this option, you must also provide a fake -u, --user\n"
-" option to activate the authentication code properly. Sending a\n"
+" This option requires a library built with GSS-API or SSPI sup-\n"
, stdout);
fputs(
-" '-u :' is enough as the user name and password from the -u,\n"
+" port. Use -V, --version to see if your curl supports GSS-\n"
+" API/SSPI or SPNEGO.\n"
+"\n"
+" When using this option, you must also provide a fake -u, --user\n"
+" option to activate the authentication code properly. Sending a\n"
+" '-u :' is enough as the user name and password from the -u,\n"
" --user option aren't actually used.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
+, stdout);
+ fputs(
" used.\n"
"\n"
" See also --basic and --ntlm and --anyauth and --proxy-negotiate.\n"
"\n"
" --netrc-file <filename>\n"
-" This option is similar to -n, --netrc, except that you provide\n"
-" the path (absolute or relative) to the netrc file that curl\n"
-, stdout);
- fputs(
+" This option is similar to -n, --netrc, except that you provide\n"
+" the path (absolute or relative) to the netrc file that curl\n"
" should use. You can only specify one netrc file per invocation.\n"
-" If several --netrc-file options are provided, the last one will\n"
+" If several --netrc-file options are provided, the last one will\n"
" be used.\n"
"\n"
+, stdout);
+ fputs(
" It will abide by --netrc-optional if specified.\n"
"\n"
" This option overrides -n, --netrc. Added in 7.21.5.\n"
"\n"
" --netrc-optional\n"
-" Very similar to -n, --netrc, but this option makes the .netrc\n"
+" Very similar to -n, --netrc, but this option makes the .netrc\n"
" usage optional and not mandatory as the -n, --netrc option does.\n"
"\n"
-, stdout);
- fputs(
" See also --netrc-file. This option overrides -n, --netrc.\n"
"\n"
" -n, --netrc\n"
-" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
-" user's home directory for login name and password. This is typi-\n"
-" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
-" user authentication. See netrc(5) ftp(1) for details on the file\n"
-" format. Curl will not complain if that file doesn't have the\n"
+" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
, stdout);
fputs(
+" user's home directory for login name and password. This is typi-\n"
+" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
+" user authentication. See netrc(5) ftp(1) for details on the file\n"
+" format. Curl will not complain if that file doesn't have the\n"
" right permissions (it should not be either world- or group-read-\n"
-" able). The environment variable \"HOME\" is used to find the home\n"
+" able). The environment variable \"HOME\" is used to find the home\n"
" directory.\n"
"\n"
-" A quick and very simple example of how to setup a .netrc to al-\n"
-" low curl to FTP to the machine host.domain.com with user name\n"
+, stdout);
+ fputs(
+" A quick and very simple example of how to setup a .netrc to al-\n"
+" low curl to FTP to the machine host.domain.com with user name\n"
" 'myself' and password 'secret' should look similar to:\n"
"\n"
" machine host.domain.com login myself password secret\n"
"\n"
" -:, --next\n"
+" Tells curl to use a separate operation for the following URL and\n"
+" associated options. This allows you to send several URL re-\n"
, stdout);
fputs(
-" Tells curl to use a separate operation for the following URL and\n"
-" associated options. This allows you to send several URL re-\n"
-" quests, each with their own specific options, for example, such\n"
+" quests, each with their own specific options, for example, such\n"
" as different user names or custom requests for each.\n"
"\n"
-" -:, --next will reset all local options and only global ones\n"
-" will have their values survive over to the operation following\n"
-, stdout);
- fputs(
-" the -:, --next instruction. Global options include -v, --ver-\n"
+" -:, --next will reset all local options and only global ones\n"
+" will have their values survive over to the operation following\n"
+" the -:, --next instruction. Global options include -v, --ver-\n"
" bose, --trace, --trace-ascii and --fail-early.\n"
"\n"
-" For example, you can do both a GET and a POST in a single com-\n"
+, stdout);
+ fputs(
+" For example, you can do both a GET and a POST in a single com-\n"
" mand line:\n"
"\n"
" curl www1.example.com --next -d postthis www2.example.com\n"
@@ -2020,89 +1990,77 @@ void hugehelp(void)
" Added in 7.36.0.\n"
"\n"
" --no-alpn\n"
-" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by de-\n"
+" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by de-\n"
+" fault if libcurl was built with an SSL library that supports\n"
+" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
, stdout);
fputs(
-" fault if libcurl was built with an SSL library that supports\n"
-" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
" ate HTTP/2 support with the server during https sessions.\n"
"\n"
-" See also --no-npn and --http2. --no-alpn requires that the un-\n"
+" See also --no-npn and --http2. --no-alpn requires that the un-\n"
" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" -N, --no-buffer\n"
" Disables the buffering of the output stream. In normal work sit-\n"
+" uations, curl will use a standard buffered output stream that\n"
+" will have the effect that it will output the data in chunks, not\n"
, stdout);
fputs(
-" uations, curl will use a standard buffered output stream that\n"
-" will have the effect that it will output the data in chunks, not\n"
-" necessarily exactly when the data arrives. Using this option\n"
+" necessarily exactly when the data arrives. Using this option\n"
" will disable that buffering.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --buffer to enforce the buffering.\n"
"\n"
" --no-keepalive\n"
-, stdout);
- fputs(
-" Disables the use of keepalive messages on the TCP connection.\n"
+" Disables the use of keepalive messages on the TCP connection.\n"
" curl otherwise enables them by default.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
+, stdout);
+ fputs(
" thus use --keepalive to enforce keepalive.\n"
"\n"
" --no-npn\n"
" (HTTPS) Disable the NPN TLS extension. NPN is enabled by default\n"
-" if libcurl was built with an SSL library that supports NPN. NPN\n"
-, stdout);
- fputs(
-" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
+" if libcurl was built with an SSL library that supports NPN. NPN\n"
+" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
" support with the server during https sessions.\n"
"\n"
-" See also --no-alpn and --http2. --no-npn requires that the un-\n"
-" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
-"\n"
-" --no-progress-meter\n"
-" Option to switch off the progress meter output without muting or\n"
-" otherwise affecting warning and informational messages like -s,\n"
+" See also --no-alpn and --http2. --no-npn requires that the un-\n"
, stdout);
fputs(
-" --silent does.\n"
-"\n"
-" Note that this is the negated option name documented. You can\n"
-" thus use --progress-meter to enable the progress meter again.\n"
-"\n"
-" See also -v, --verbose and -s, --silent. Added in 7.67.0.\n"
+" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" --no-sessionid\n"
" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
" all transfers are done using the cache. Note that while nothing\n"
-, stdout);
- fputs(
" should ever get hurt by attempting to reuse SSL session-IDs,\n"
" there seem to be broken SSL implementations in the wild that may\n"
" require you to disable this in order for you to succeed.\n"
"\n"
+, stdout);
+ fputs(
" Note that this is the negated option name documented. You can\n"
" thus use --sessionid to enforce session-ID caching.\n"
"\n"
" Added in 7.16.0.\n"
"\n"
" --noproxy <no-proxy-list>\n"
-, stdout);
- fputs(
" Comma-separated list of hosts which do not use a proxy, if one\n"
" is specified. The only wildcard is a single * character, which\n"
" matches all hosts, and effectively disables the proxy. Each name\n"
+, stdout);
+ fputs(
" in this list is matched as either a domain which contains the\n"
" hostname, or the hostname itself. For example, local.com would\n"
" match local.com, local.com:80, and www.local.com, but not\n"
-, stdout);
- fputs(
" www.notlocal.com.\n"
"\n"
" Since 7.53.0, This option overrides the environment variables\n"
" that disable the proxy. If there's an environment variable dis-\n"
+, stdout);
+ fputs(
" abling a proxy, you can set noproxy list to \"\" to override it.\n"
"\n"
" Added in 7.19.4.\n"
@@ -2110,22 +2068,22 @@ void hugehelp(void)
" --ntlm-wb\n"
" (HTTP) Enables NTLM much in the style --ntlm does, but hand over\n"
" the authentication to the separate binary ntlmauth application\n"
-, stdout);
- fputs(
" that is executed when needed.\n"
"\n"
" See also --ntlm and --proxy-ntlm.\n"
"\n"
" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
+, stdout);
+ fputs(
" method was designed by Microsoft and is used by IIS web servers.\n"
" It is a proprietary protocol, reverse-engineered by clever peo-\n"
" ple and implemented in curl based on their efforts. This kind of\n"
" behavior should not be endorsed, you should encourage everyone\n"
-, stdout);
- fputs(
" who uses NTLM to switch to a public and documented authentica-\n"
" tion method instead, such as Digest.\n"
"\n"
+, stdout);
+ fputs(
" If you want to enable NTLM for your proxy authentication, then\n"
" use --proxy-ntlm.\n"
"\n"
@@ -2133,30 +2091,28 @@ void hugehelp(void)
" used.\n"
"\n"
" See also --proxy-ntlm. --ntlm requires that the underlying\n"
-, stdout);
- fputs(
" libcurl was built to support TLS. This option overrides --basic\n"
" and --negotiate and --digest and --anyauth.\n"
"\n"
" --oauth2-bearer <token>\n"
+, stdout);
+ fputs(
" (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
" authentication. The Bearer Token is used in conjunction with the\n"
" user name which can be specified as part of the --url or -u,\n"
" --user options.\n"
"\n"
-, stdout);
- fputs(
" The Bearer Token and user name are formatted according to RFC\n"
" 6750.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" -o, --output <file>\n"
+, stdout);
+ fputs(
" Write output to <file> instead of stdout. If you are using {} or\n"
" [] to fetch multiple documents, you can use '#' followed by a\n"
" number in the <file> specifier. That variable will be replaced\n"
-, stdout);
- fputs(
" with the current string for the URL being fetched. Like in:\n"
"\n"
" curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
@@ -2165,148 +2121,135 @@ void hugehelp(void)
"\n"
" curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
"\n"
+, stdout);
+ fputs(
" You may use this option as many times as the number of URLs you\n"
" have. For example, if you specify two URLs on the same command\n"
" line, you can use it like this:\n"
"\n"
-, stdout);
- fputs(
" curl -o aa example.com -o bb example.net\n"
"\n"
" and the order of the -o options and the URLs doesn't matter,\n"
" just that the first -o is for the first URL and so on, so the\n"
" above command line can also be written as\n"
"\n"
+, stdout);
+ fputs(
" curl example.com example.net -o aa -o bb\n"
"\n"
" See also the --create-dirs option to create the local directo-\n"
" ries dynamically. Specifying the output as '-' (a single dash)\n"
-, stdout);
- fputs(
" will force the output to be done to stdout.\n"
"\n"
" See also -O, --remote-name and --remote-name-all and -J, --re-\n"
" mote-header-name.\n"
"\n"
-" --parallel-max\n"
-" When asked to do parallel transfers, using -Z, --parallel, this\n"
-" option controls the maximum amount of transfers to do simultane-\n"
-" ously.\n"
-"\n"
-" The default is 50.\n"
-"\n"
-" See also -Z, --parallel. Added in 7.66.0.\n"
-"\n"
-" -Z, --parallel\n"
-, stdout);
- fputs(
-" Makes curl perform its transfers in parallel as compared to the\n"
-" regular serial manner.\n"
-"\n"
-" Added in 7.66.0.\n"
-"\n"
" --pass <phrase>\n"
" (SSH TLS) Passphrase for the private key\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --path-as-is\n"
-" Tell curl to not handle sequences of /../ or /./ in the given\n"
-" URL path. Normally curl will squash or merge them according to\n"
-, stdout);
- fputs(
+" Tell curl to not handle sequences of /../ or /./ in the given\n"
+" URL path. Normally curl will squash or merge them according to\n"
" standards but with this option set you tell it not to do that.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
" --pinnedpubkey <hashes>\n"
-" (TLS) Tells curl to use the specified public key file (or\n"
-" hashes) to verify the peer. This can be a path to a file which\n"
+" (TLS) Tells curl to use the specified public key file (or\n"
+, stdout);
+ fputs(
+" hashes) to verify the peer. This can be a path to a file which\n"
" contains a single public key in PEM or DER format, or any number\n"
" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
" rated by ';'\n"
"\n"
+" When negotiating a TLS or SSL connection, the server sends a\n"
+" certificate indicating its identity. A public key is extracted\n"
, stdout);
fputs(
-" When negotiating a TLS or SSL connection, the server sends a\n"
-" certificate indicating its identity. A public key is extracted\n"
-" from this certificate and if it does not exactly match the pub-\n"
-" lic key provided to this option, curl will abort the connection\n"
+" from this certificate and if it does not exactly match the pub-\n"
+" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
" PEM/DER support:\n"
" 7.39.0: OpenSSL, GnuTLS and GSKit\n"
-" 7.43.0: NSS and wolfSSL\n"
+" 7.43.0: NSS and wolfSSL/CyaSSL\n"
+" 7.47.0: mbedtls\n"
+" 7.49.0: PolarSSL sha256 support:\n"
+" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.\n"
, stdout);
fputs(
-" 7.47.0: mbedtls sha256 support:\n"
-" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
-" 7.47.0: mbedtls Other SSL backends not supported.\n"
+" 7.47.0: mbedtls\n"
+" 7.49.0: PolarSSL Other SSL backends not supported.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --post301\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
" requests into GET requests when following a 301 redirection. The\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
, stdout);
fputs(
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post303 and -L, --location. Added in\n"
+" See also --post302 and --post303 and -L, --location. Added in\n"
" 7.17.1.\n"
"\n"
" --post302\n"
+" (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
, stdout);
fputs(
-" (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
" requests into GET requests when following a 302 redirection. The\n"
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
+" See also --post301 and --post303 and -L, --location. Added in\n"
, stdout);
fputs(
-" See also --post301 and --post303 and -L, --location. Added in\n"
" 7.19.1.\n"
"\n"
" --post303\n"
" (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
-" requests into GET requests when following 303 redirections. A\n"
+" requests into GET requests when following 303 redirections. A\n"
" server may require a POST to remain a POST after a 303 redirect-\n"
" ion. This option is meaningful only when using -L, --location.\n"
"\n"
-, stdout);
- fputs(
-" See also --post302 and --post301 and -L, --location. Added in\n"
+" See also --post302 and --post301 and -L, --location. Added in\n"
" 7.26.0.\n"
"\n"
" --preproxy [protocol://]host[:port]\n"
-" Use the specified SOCKS proxy before connecting to an HTTP or\n"
-" HTTPS -x, --proxy. In such a case curl first connects to the\n"
-" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
+, stdout);
+ fputs(
+" Use the specified SOCKS proxy before connecting to an HTTP or\n"
+" HTTPS -x, --proxy. In such a case curl first connects to the\n"
+" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
" HTTPS proxy. Hence pre proxy.\n"
"\n"
+" The pre proxy string should be specified with a protocol:// pre-\n"
+" fix to specify alternative proxy protocols. Use socks4://,\n"
, stdout);
fputs(
-" The pre proxy string should be specified with a protocol:// pre-\n"
-" fix to specify alternative proxy protocols. Use socks4://,\n"
-" socks4a://, socks5:// or socks5h:// to request the specific\n"
-" SOCKS version to be used. No protocol specified will make curl\n"
+" socks4a://, socks5:// or socks5h:// to request the specific\n"
+" SOCKS version to be used. No protocol specified will make curl\n"
" default to SOCKS4.\n"
"\n"
-" If the port number is not specified in the proxy string, it is\n"
+" If the port number is not specified in the proxy string, it is\n"
" assumed to be 1080.\n"
"\n"
+" User and password that might be provided in the proxy string are\n"
+" URL decoded by curl. This allows you to pass in special charac-\n"
, stdout);
fputs(
-" User and password that might be provided in the proxy string are\n"
-" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2315,75 +2258,73 @@ void hugehelp(void)
"\n"
" -#, --progress-bar\n"
" Make curl display transfer progress as a simple progress bar in-\n"
-, stdout);
- fputs(
" stead of the standard, more informational, meter.\n"
"\n"
-" This progress bar draws a single line of '#' characters across\n"
+" This progress bar draws a single line of '#' characters across\n"
+, stdout);
+ fputs(
" the screen and shows a percentage if the transfer size is known.\n"
-" For transfers without a known size, there will be space ship\n"
-" (-=o=-) that moves back and forth but only while data is being\n"
+" For transfers without a known size, there will be space ship\n"
+" (-=o=-) that moves back and forth but only while data is being\n"
" transferred, with a set of flying hash sign symbols on top.\n"
"\n"
" --proto-default <protocol>\n"
-, stdout);
- fputs(
" Tells curl to use protocol for any URL missing a scheme name.\n"
"\n"
" Example:\n"
"\n"
+, stdout);
+ fputs(
" curl --proto-default https ftp.mozilla.org\n"
"\n"
-" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
+" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
" PORTED_PROTOCOL (1).\n"
"\n"
" This option does not change the default proxy protocol (http).\n"
"\n"
-" Without this option curl would make a guess based on the host,\n"
+" Without this option curl would make a guess based on the host,\n"
" see --url for details.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.45.0.\n"
"\n"
" --proto-redir <protocols>\n"
-" Tells curl to limit what protocols it may use on redirect. Pro-\n"
-" tocols denied by --proto are not overridden by this option. See\n"
+, stdout);
+ fputs(
+" Tells curl to limit what protocols it may use on redirect. Pro-\n"
+" tocols denied by --proto are not overridden by this option. See\n"
" --proto for how protocols are represented.\n"
"\n"
" Example, allow only HTTP and HTTPS on redirect:\n"
"\n"
" curl --proto-redir -all,http,https http://example.com\n"
"\n"
-" By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect\n"
+" By default curl will allow all protocols on redirect except sev-\n"
, stdout);
fputs(
-" (7.65.2). Older versions of curl allowed all protocols on redi-\n"
-" rect except several disabled for security reasons: Since 7.19.4\n"
-" FILE and SCP are disabled, and since 7.40.0 SMB and SMBS are\n"
-" also disabled. Specifying all or +all enables all protocols on\n"
-" redirect, including those disabled for security.\n"
+" eral disabled for security reasons: Since 7.19.4 FILE and SCP\n"
+" are disabled, and since 7.40.0 SMB and SMBS are also disabled.\n"
+" Specifying all or +all enables all protocols on redirect, in-\n"
+" cluding those disabled for security.\n"
"\n"
" Added in 7.20.2.\n"
"\n"
" --proto <protocols>\n"
+" Tells curl to limit what protocols it may use in the transfer.\n"
, stdout);
fputs(
-" Tells curl to limit what protocols it may use in the transfer.\n"
" Protocols are evaluated left to right, are comma separated, and\n"
-" are each a protocol name or 'all', optionally prefixed by zero\n"
-" or more modifiers. Available modifiers are:\n"
+" are each a protocol name or\n"
"\n"
" + Permit this protocol in addition to protocols already permit-\n"
" ted (this is the default if no modifier is used).\n"
"\n"
-, stdout);
- fputs(
-" - Deny this protocol, removing it from the list of protocols\n"
+" - Deny this protocol, removing it from the list of protocols\n"
" already permitted.\n"
"\n"
-" = Permit only this protocol (ignoring the list already permit-\n"
-" ted), though subject to later modification by subsequent en-\n"
+" = Permit only this protocol (ignoring the list already permit-\n"
+, stdout);
+ fputs(
+" ted), though subject to later modification by subsequent en-\n"
" tries in the comma separated list.\n"
"\n"
" For example:\n"
@@ -2391,39 +2332,39 @@ void hugehelp(void)
" --proto -ftps uses the default protocols, but disables ftps\n"
"\n"
" --proto -all,https,+http\n"
-, stdout);
- fputs(
" only enables http and https\n"
"\n"
" --proto =http,https\n"
" also only enables http and https\n"
"\n"
+, stdout);
+ fputs(
" Unknown protocols produce a warning. This allows scripts to safely rely\n"
" on being able to disable potentially dangerous protocols, without rely-\n"
-" ing upon support for that protocol being built into curl to avoid an\n"
+" ing upon support for that protocol being built into curl to avoid an\n"
" error.\n"
"\n"
" This option can be used multiple times, in which case the effect is the\n"
-, stdout);
- fputs(
" same as concatenating the protocols into one instance of the option.\n"
"\n"
" See also --proto-redir and --proto-default. Added in 7.20.2.\n"
"\n"
" --proxy-anyauth\n"
-" Tells curl to pick a suitable authentication method when commu-\n"
-" nicating with the given HTTP proxy. This might cause an extra\n"
+, stdout);
+ fputs(
+" Tells curl to pick a suitable authentication method when commu-\n"
+" nicating with the given HTTP proxy. This might cause an extra\n"
" request/response round-trip.\n"
"\n"
" See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
" in 7.13.2.\n"
"\n"
" --proxy-basic\n"
+" Tells curl to use HTTP Basic authentication when communicating\n"
+" with the given proxy. Use --basic for enabling HTTP Basic with a\n"
, stdout);
fputs(
-" Tells curl to use HTTP Basic authentication when communicating\n"
-" with the given proxy. Use --basic for enabling HTTP Basic with a\n"
-" remote host. Basic is the default authentication method curl\n"
+" remote host. Basic is the default authentication method curl\n"
" uses with proxies.\n"
"\n"
" See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
@@ -2431,15 +2372,15 @@ void hugehelp(void)
" --proxy-cacert <file>\n"
" Same as --cacert but used in HTTPS proxy context.\n"
"\n"
-, stdout);
- fputs(
-" See also --proxy-capath and --cacert and --capath and -x,\n"
+" See also --proxy-capath and --cacert and --capath and -x,\n"
" --proxy. Added in 7.52.0.\n"
"\n"
" --proxy-capath <dir>\n"
" Same as --capath but used in HTTPS proxy context.\n"
"\n"
-" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
+, stdout);
+ fputs(
+" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
" 7.52.0.\n"
"\n"
" --proxy-cert-type <type>\n"
@@ -2448,8 +2389,6 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-cert <cert[:passwd]>\n"
-, stdout);
- fputs(
" Same as -E, --cert but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
@@ -2459,49 +2398,49 @@ void hugehelp(void)
"\n"
" Added in 7.52.0.\n"
"\n"
+, stdout);
+ fputs(
" --proxy-crlfile <file>\n"
" Same as --crlfile but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" --proxy-digest\n"
-" Tells curl to use HTTP Digest authentication when communicating\n"
-, stdout);
- fputs(
+" Tells curl to use HTTP Digest authentication when communicating\n"
" with the given proxy. Use --digest for enabling HTTP Digest with\n"
" a remote host.\n"
"\n"
" See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
"\n"
" --proxy-header <header/@file>\n"
-" (HTTP) Extra header to include in the request when sending HTTP\n"
-" to a proxy. You may specify any number of extra headers. This is\n"
-" the equivalent option to -H, --header but is for proxy communi-\n"
, stdout);
fputs(
-" cation only like in CONNECT requests when you want a separate\n"
-" header sent to the proxy to what is sent to the actual remote\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
+" to a proxy. You may specify any number of extra headers. This is\n"
+" the equivalent option to -H, --header but is for proxy communi-\n"
+" cation only like in CONNECT requests when you want a separate\n"
+" header sent to the proxy to what is sent to the actual remote\n"
" host.\n"
"\n"
-" curl will make sure that each header you add/replace is sent\n"
+" curl will make sure that each header you add/replace is sent\n"
+, stdout);
+ fputs(
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
-, stdout);
- fputs(
-" Headers specified with this option will not be included in re-\n"
+" Headers specified with this option will not be included in re-\n"
" quests that curl knows will not be sent to a proxy.\n"
"\n"
-" Starting in 7.55.0, this option can take an argument in @file-\n"
-" name style, which then adds a header for each line in the input\n"
+" Starting in 7.55.0, this option can take an argument in @file-\n"
+, stdout);
+ fputs(
+" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
-" This option can be used multiple times to add/replace/remove\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.37.0.\n"
" --proxy-insecure\n"
" Same as -k, --insecure but used in HTTPS proxy context.\n"
@@ -2509,6 +2448,8 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-key-type <type>\n"
+, stdout);
+ fputs(
" Same as --key-type but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
@@ -2517,49 +2458,49 @@ void hugehelp(void)
" Same as --key but used in HTTPS proxy context.\n"
"\n"
" --proxy-negotiate\n"
-" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
-, stdout);
- fputs(
+" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
" communicating with the given proxy. Use --negotiate for enabling\n"
" HTTP Negotiate (SPNEGO) with a remote host.\n"
"\n"
+, stdout);
+ fputs(
" See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
"\n"
" --proxy-ntlm\n"
-" Tells curl to use HTTP NTLM authentication when communicating\n"
+" Tells curl to use HTTP NTLM authentication when communicating\n"
" with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
" host.\n"
"\n"
" See also --proxy-negotiate and --proxy-anyauth.\n"
"\n"
-, stdout);
- fputs(
" --proxy-pass <phrase>\n"
" Same as --pass but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" --proxy-pinnedpubkey <hashes>\n"
-" (TLS) Tells curl to use the specified public key file (or\n"
-" hashes) to verify the proxy. This can be a path to a file which\n"
-" contains a single public key in PEM or DER format, or any number\n"
-" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
, stdout);
fputs(
+" (TLS) Tells curl to use the specified public key file (or\n"
+" hashes) to verify the proxy. This can be a path to a file which\n"
+" contains a single public key in PEM or DER format, or any number\n"
+" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
" rated by ';'\n"
"\n"
-" When negotiating a TLS or SSL connection, the server sends a\n"
-" certificate indicating its identity. A public key is extracted\n"
-" from this certificate and if it does not exactly match the pub-\n"
-" lic key provided to this option, curl will abort the connection\n"
+" When negotiating a TLS or SSL connection, the server sends a\n"
+, stdout);
+ fputs(
+" certificate indicating its identity. A public key is extracted\n"
+" from this certificate and if it does not exactly match the pub-\n"
+" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
+" --proxy-service-name <name>\n"
+" This option allows you to change the service name for proxy ne-\n"
, stdout);
fputs(
-" --proxy-service-name <name>\n"
-" This option allows you to change the service name for proxy ne-\n"
" gotiation.\n"
"\n"
" Added in 7.43.0.\n"
@@ -2570,22 +2511,15 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-tls13-ciphers <ciphersuite list>\n"
-" (TLS) Specifies which cipher suites to use in the connection to\n"
+" (TLS) Specifies which cipher suites to use in the connection to\n"
+" your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
+" suites must specify valid ciphers. Read up on TLS 1.3 cipher\n"
, stdout);
fputs(
-" your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
-" suites must specify valid ciphers. Read up on TLS 1.3 cipher\n"
" suite details on this URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
-" This option is currently used only when curl is built to use\n"
-" OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
-" you can try setting TLS 1.3 cipher suites by using the --proxy-\n"
-, stdout);
- fputs(
-" ciphers option.\n"
-"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --proxy-tlsauthtype <type>\n"
@@ -2599,10 +2533,10 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-tlsuser <name>\n"
-" Same as --tlsuser but used in HTTPS proxy context.\n"
-"\n"
, stdout);
fputs(
+" Same as --tlsuser but used in HTTPS proxy context.\n"
+"\n"
" Added in 7.52.0.\n"
"\n"
" --proxy-tlsv1\n"
@@ -2615,18 +2549,18 @@ void hugehelp(void)
" tion.\n"
"\n"
" If you use a Windows SSPI-enabled curl binary and do either Ne-\n"
-" gotiate or NTLM authentication then you can tell curl to select\n"
, stdout);
fputs(
+" gotiate or NTLM authentication then you can tell curl to select\n"
" the user name and password from your environment by specifying a\n"
" single colon with this option: \"-U :\".\n"
"\n"
" On systems where it works, curl will hide the given option argu-\n"
" ment from process listings. This is not enough to protect cre-\n"
" dentials from possibly getting seen by other users on the same\n"
-" system as they will still be visible for a brief moment before\n"
, stdout);
fputs(
+" system as they will still be visible for a brief moment before\n"
" cleared. Such sensitive data should be retrieved from a file in-\n"
" stead or similar and never used in clear text in a command line.\n"
" If this option is used several times, the last one will be used.\n"
@@ -2635,9 +2569,9 @@ void hugehelp(void)
" Use the specified proxy.\n"
"\n"
" The proxy string can be specified with a protocol:// prefix. No\n"
-" protocol specified or http:// will be treated as HTTP proxy. Use\n"
, stdout);
fputs(
+" protocol specified or http:// will be treated as HTTP proxy. Use\n"
" socks4://, socks4a://, socks5:// or socks5h:// to request a spe-\n"
" cific SOCKS version to be used. (The protocol support was added\n"
" in curl 7.21.7)\n"
@@ -2646,9 +2580,9 @@ void hugehelp(void)
" 7.52.0 for OpenSSL, GnuTLS and NSS.\n"
"\n"
" Unrecognized and unsupported proxy protocols cause an error\n"
-" since 7.52.0. Prior versions may ignore the protocol and use\n"
, stdout);
fputs(
+" since 7.52.0. Prior versions may ignore the protocol and use\n"
" http:// instead.\n"
"\n"
" If the port number is not specified in the proxy string, it is\n"
@@ -2658,20 +2592,20 @@ void hugehelp(void)
" the proxy to use. If there's an environment variable setting a\n"
" proxy, you can set proxy to \"\" to override it.\n"
"\n"
-" All operations that are performed over an HTTP proxy will trans-\n"
, stdout);
fputs(
+" All operations that are performed over an HTTP proxy will trans-\n"
" parently be converted to HTTP. It means that certain protocol\n"
" specific operations might not be available. This is not the case\n"
" if you can tunnel through the proxy, as one with the -p, --prox-\n"
" ytunnel option.\n"
"\n"
" User and password that might be provided in the proxy string are\n"
+, stdout);
+ fputs(
" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
-, stdout);
- fputs(
" The proxy host can be specified the exact same way as the proxy\n"
" environment variables, including the protocol prefix (http://)\n"
" and the embedded user + password.\n"
@@ -2679,21 +2613,21 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" --proxy1.0 <host[:port]>\n"
+, stdout);
+ fputs(
" Use the specified HTTP 1.0 proxy. If the port number is not\n"
" specified, it is assumed at port 1080.\n"
"\n"
-, stdout);
- fputs(
" The only difference between this and the HTTP proxy option -x,\n"
" --proxy, is that attempts to use CONNECT through the proxy will\n"
" specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
"\n"
" -p, --proxytunnel\n"
" When an HTTP proxy is used -x, --proxy, this option will make\n"
-" curl tunnel through the proxy. The tunnel approach is made with\n"
-" the HTTP proxy CONNECT request and requires that the proxy al-\n"
, stdout);
fputs(
+" curl tunnel through the proxy. The tunnel approach is made with\n"
+" the HTTP proxy CONNECT request and requires that the proxy al-\n"
" lows direct connect to the remote port number curl wants to tun-\n"
" nel through to.\n"
"\n"
@@ -2703,99 +2637,98 @@ void hugehelp(void)
" See also -x, --proxy.\n"
"\n"
" --pubkey <key>\n"
+, stdout);
+ fputs(
" (SFTP SCP) Public key file name. Allows you to provide your pub-\n"
" lic key in this separate file.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
" (As of 7.39.0, curl attempts to automatically extract the public\n"
" key from the private key file, so passing this option is gener-\n"
" ally not required. Note that this public key extraction requires\n"
+, stdout);
+ fputs(
" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n"
" that is itself linked against OpenSSL.)\n"
"\n"
" -Q, --quote\n"
-, stdout);
- fputs(
" (FTP SFTP) Send an arbitrary command to the remote FTP or SFTP\n"
" server. Quote commands are sent BEFORE the transfer takes place\n"
" (just after the initial PWD command in an FTP transfer, to be\n"
" exact). To make commands take place after a successful transfer,\n"
-" prefix them with a dash '-'. To make commands be sent after\n"
-" curl has changed the working directory, just before the transfer\n"
, stdout);
fputs(
+" prefix them with a dash '-'. To make commands be sent after\n"
+" curl has changed the working directory, just before the transfer\n"
" command(s), prefix the command with a '+' (this is only sup-\n"
" ported for FTP). You may specify any number of commands.\n"
"\n"
" If the server returns failure for one of the commands, the en-\n"
" tire operation will be aborted. You must send syntactically cor-\n"
-" rect FTP commands as RFC 959 defines to FTP servers, or one of\n"
-" the commands listed below to SFTP servers.\n"
-"\n"
, stdout);
fputs(
-" Prefix the command with an asterisk (*) to make curl continue\n"
-" even if the command fails as by default curl will stop at first\n"
-" failure.\n"
+" rect FTP commands as RFC 959 defines to FTP servers, or one of\n"
+" the commands listed below to SFTP servers.\n"
"\n"
-" This option can be used multiple times.\n"
+" This option can be used multiple times. When speaking to an FTP\n"
+" server, prefix the command with an asterisk (*) to make curl\n"
+" continue even if the command fails as by default curl will stop\n"
+" at first failure.\n"
"\n"
-" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
-" quote commands itself before sending them to the server. File\n"
-" names may be quoted shell-style to embed spaces or special char-\n"
+" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
, stdout);
fputs(
-" acters. Following is the list of all supported SFTP quote com-\n"
+" quote commands itself before sending them to the server. File\n"
+" names may be quoted shell-style to embed spaces or special char-\n"
+" acters. Following is the list of all supported SFTP quote com-\n"
" mands:\n"
"\n"
" chgrp group file\n"
-" The chgrp command sets the group ID of the file named by\n"
-" the file operand to the group ID specified by the group\n"
+" The chgrp command sets the group ID of the file named by\n"
+" the file operand to the group ID specified by the group\n"
+, stdout);
+ fputs(
" operand. The group operand is a decimal integer group ID.\n"
"\n"
" chmod mode file\n"
-" The chmod command modifies the file mode bits of the\n"
-, stdout);
- fputs(
+" The chmod command modifies the file mode bits of the\n"
" specified file. The mode operand is an octal integer mode\n"
" number.\n"
"\n"
" chown user file\n"
" The chown command sets the owner of the file named by the\n"
-" file operand to the user ID specified by the user oper-\n"
+" file operand to the user ID specified by the user oper-\n"
+, stdout);
+ fputs(
" and. The user operand is a decimal integer user ID.\n"
"\n"
" ln source_file target_file\n"
" The ln and symlink commands create a symbolic link at the\n"
-, stdout);
- fputs(
-" target_file location pointing to the source_file loca-\n"
+" target_file location pointing to the source_file loca-\n"
" tion.\n"
"\n"
" mkdir directory_name\n"
-" The mkdir command creates the directory named by the di-\n"
+" The mkdir command creates the directory named by the di-\n"
" rectory_name operand.\n"
"\n"
+, stdout);
+ fputs(
" pwd The pwd command returns the absolute pathname of the cur-\n"
" rent working directory.\n"
"\n"
" rename source target\n"
-, stdout);
- fputs(
" The rename command renames the file or directory named by\n"
-" the source operand to the destination path named by the\n"
+" the source operand to the destination path named by the\n"
" target operand.\n"
"\n"
" rm file\n"
" The rm command removes the file specified by the file op-\n"
" erand.\n"
"\n"
-" rmdir directory\n"
-" The rmdir command removes the directory entry specified\n"
, stdout);
fputs(
+" rmdir directory\n"
+" The rmdir command removes the directory entry specified\n"
" by the directory operand, provided it is empty.\n"
"\n"
" symlink source_file target_file\n"
@@ -2803,14 +2736,14 @@ void hugehelp(void)
"\n"
" --random-file <file>\n"
" Specify the path name to file containing what will be considered\n"
-" as random data. The data may be used to seed the random engine\n"
+" as random data. The data may be used to seed the random engine\n"
+, stdout);
+ fputs(
" for SSL connections. See also the --egd-file option.\n"
"\n"
" -r, --range <range>\n"
-, stdout);
- fputs(
" (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
-" ment) from an HTTP/1.1, FTP or SFTP server or a local FILE.\n"
+" ment) from an HTTP/1.1, FTP or SFTP server or a local FILE.\n"
" Ranges can be specified in a number of ways.\n"
"\n"
" 0-499 specifies the first 500 bytes\n"
@@ -2819,165 +2752,165 @@ void hugehelp(void)
"\n"
" -500 specifies the last 500 bytes\n"
"\n"
-" 9500- specifies the bytes from offset 9500 and forward\n"
-"\n"
, stdout);
fputs(
+" 9500- specifies the bytes from offset 9500 and forward\n"
+"\n"
" 0-0,-1 specifies the first and last byte only(*)(HTTP)\n"
"\n"
" 100-199,500-599\n"
" specifies two separate 100-byte ranges(*) (HTTP)\n"
"\n"
-" (*) = NOTE that this will cause the server to reply with a mul-\n"
+" (*) = NOTE that this will cause the server to reply with a mul-\n"
" tipart response!\n"
"\n"
-" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
-" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
+" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
, stdout);
fputs(
+" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
" ter is given in the range, the server's response will be unspec-\n"
" ified, depending on the server's configuration.\n"
"\n"
-" You should also be aware that many HTTP/1.1 servers do not have\n"
-" this feature enabled, so that when you attempt to get a range,\n"
+" You should also be aware that many HTTP/1.1 servers do not have\n"
+" this feature enabled, so that when you attempt to get a range,\n"
" you'll instead get the whole document.\n"
"\n"
-" FTP and SFTP range downloads only support the simple 'start-\n"
, stdout);
fputs(
-" stop' syntax (optionally with one of the numbers omitted). FTP\n"
+" FTP and SFTP range downloads only support the simple 'start-\n"
+" stop' syntax (optionally with one of the numbers omitted). FTP\n"
" use depends on the extended FTP command SIZE.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --raw (HTTP) When used, it disables all internal HTTP decoding of con-\n"
-" tent or transfer encodings and instead makes them passed on un-\n"
+" tent or transfer encodings and instead makes them passed on un-\n"
" altered, raw.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.16.2.\n"
"\n"
" -e, --referer <URL>\n"
-, stdout);
- fputs(
" (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
" This can also be set with the -H, --header flag of course. When\n"
-" used with -L, --location you can append \";auto\" to the -e,\n"
-" --referer URL to make curl automatically set the previous URL\n"
-" when it follows a Location: header. The \";auto\" string can be\n"
-" used alone, even if you don't set an initial -e, --referer.\n"
-"\n"
+" used with -L, --location you can append \";auto\" to the -e,\n"
+" --referer URL to make curl automatically set the previous URL\n"
+" when it follows a Location: header. The \";auto\" string can be\n"
, stdout);
fputs(
+" used alone, even if you don't set an initial -e, --referer.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -A, --user-agent and -H, --header.\n"
"\n"
" -J, --remote-header-name\n"
" (HTTP) This option tells the -O, --remote-name option to use the\n"
-" server-specified Content-Disposition filename instead of ex-\n"
+" server-specified Content-Disposition filename instead of ex-\n"
" tracting a filename from the URL.\n"
"\n"
-" If the server specifies a file name and a file with that name\n"
, stdout);
fputs(
-" already exists in the current working directory it will not be\n"
+" If the server specifies a file name and a file with that name\n"
+" already exists in the current working directory it will not be\n"
" overwritten and an error will occur. If the server doesn't spec-\n"
" ify a file name then this option has no effect.\n"
"\n"
-" There's no attempt to decode %-sequences (yet) in the provided\n"
+" There's no attempt to decode %-sequences (yet) in the provided\n"
" file name, so this option may provide you with rather unexpected\n"
" file names.\n"
"\n"
-" WARNING: Exercise judicious use of this option, especially on\n"
, stdout);
fputs(
-" Windows. A rogue server could send you the name of a DLL or\n"
-" other file that could possibly be loaded automatically by Win-\n"
+" WARNING: Exercise judicious use of this option, especially on\n"
+" Windows. A rogue server could send you the name of a DLL or\n"
+" other file that could possibly be loaded automatically by Win-\n"
" dows or some third party software.\n"
"\n"
" --remote-name-all\n"
-" This option changes the default action for all given URLs to be\n"
+" This option changes the default action for all given URLs to be\n"
" dealt with as if -O, --remote-name were used for each one. So if\n"
-" you want to disable that for a specific URL after --remote-name-\n"
, stdout);
fputs(
+" you want to disable that for a specific URL after --remote-name-\n"
" all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
" Added in 7.19.0.\n"
"\n"
" -O, --remote-name\n"
-" Write output to a local file named like the remote file we get.\n"
-" (Only the file part of the remote file is used, the path is cut\n"
+" Write output to a local file named like the remote file we get.\n"
+" (Only the file part of the remote file is used, the path is cut\n"
" off.)\n"
"\n"
-" The file will be saved in the current working directory. If you\n"
-" want the file saved in a different directory, make sure you\n"
+" The file will be saved in the current working directory. If you\n"
, stdout);
fputs(
-" change the current working directory before invoking curl with\n"
+" want the file saved in a different directory, make sure you\n"
+" change the current working directory before invoking curl with\n"
" this option.\n"
"\n"
-" The remote file name to use for saving is extracted from the\n"
-" given URL, nothing else, and if it already exists it will be\n"
-" overwritten. If you want the server to be able to choose the\n"
-" file name refer to -J, --remote-header-name which can be used in\n"
+" The remote file name to use for saving is extracted from the\n"
+" given URL, nothing else, and if it already exists it will be\n"
+" overwritten. If you want the server to be able to choose the\n"
, stdout);
fputs(
-" addition to this option. If the server chooses a file name and\n"
+" file name refer to -J, --remote-header-name which can be used in\n"
+" addition to this option. If the server chooses a file name and\n"
" that name already exists it will not be overwritten.\n"
"\n"
" There is no URL decoding done on the file name. If it has %20 or\n"
-" other URL encoded parts of the name, they will end up as-is as\n"
+" other URL encoded parts of the name, they will end up as-is as\n"
" file name.\n"
"\n"
-" You may use this option as many times as the number of URLs you\n"
+" You may use this option as many times as the number of URLs you\n"
+, stdout);
+ fputs(
" have.\n"
"\n"
" -R, --remote-time\n"
-, stdout);
- fputs(
-" When used, this will make curl attempt to figure out the time-\n"
-" stamp of the remote file, and if that is available make the lo-\n"
+" When used, this will make curl attempt to figure out the time-\n"
+" stamp of the remote file, and if that is available make the lo-\n"
" cal file get that same timestamp.\n"
"\n"
" --request-target\n"
-" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
-" of using the path as provided in the URL. Particularly useful\n"
-" when wanting to issue HTTP requests without leading slash or\n"
+" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
+" of using the path as provided in the URL. Particularly useful\n"
, stdout);
fputs(
-" other data that doesn't follow the regular URL pattern, like\n"
+" when wanting to issue HTTP requests without leading slash or\n"
+" other data that doesn't follow the regular URL pattern, like\n"
" \"OPTIONS *\".\n"
"\n"
" Added in 7.55.0.\n"
"\n"
" -X, --request <command>\n"
" (HTTP) Specifies a custom request method to use when communicat-\n"
-" ing with the HTTP server. The specified request method will be\n"
-" used instead of the method otherwise used (which defaults to\n"
-" GET). Read the HTTP 1.1 specification for details and explana-\n"
+" ing with the HTTP server. The specified request method will be\n"
+" used instead of the method otherwise used (which defaults to\n"
, stdout);
fputs(
-" tions. Common additional HTTP requests include PUT and DELETE,\n"
+" GET). Read the HTTP 1.1 specification for details and explana-\n"
+" tions. Common additional HTTP requests include PUT and DELETE,\n"
" but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
" and more.\n"
"\n"
-" Normally you don't need this option. All sorts of GET, HEAD,\n"
+" Normally you don't need this option. All sorts of GET, HEAD,\n"
" POST and PUT requests are rather invoked by using dedicated com-\n"
" mand line options.\n"
"\n"
-" This option only changes the actual word used in the HTTP re-\n"
, stdout);
fputs(
+" This option only changes the actual word used in the HTTP re-\n"
" quest, it does not alter the way curl behaves. So for example if\n"
-" you want to make a proper HEAD request, using -X HEAD will not\n"
+" you want to make a proper HEAD request, using -X HEAD will not\n"
" suffice. You need to use the -I, --head option.\n"
"\n"
-" The method string you set with -X, --request will be used for\n"
-" all requests, which if you for example use -L, --location may\n"
-" cause unintended side-effects when curl doesn't change request\n"
+" The method string you set with -X, --request will be used for\n"
+" all requests, which if you for example use -L, --location may\n"
, stdout);
fputs(
+" cause unintended side-effects when curl doesn't change request\n"
" method according to the HTTP 30x response codes - and similar.\n"
"\n"
" (FTP) Specifies a custom FTP command to use instead of LIST when\n"
@@ -2986,43 +2919,43 @@ void hugehelp(void)
" (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
" RETR. (Added in 7.26.0)\n"
"\n"
-" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
-" (Added in 7.30.0)\n"
-"\n"
+" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
, stdout);
fputs(
+" (Added in 7.30.0)\n"
+"\n"
" (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
" VRFY. (Added in 7.34.0)\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --resolve <host:port:address[,address]...>\n"
-" Provide a custom address for a specific host and port pair. Us-\n"
-" ing this, you can make the curl requests(s) use a specified ad-\n"
-" dress and prevent the otherwise normally resolved address to be\n"
+" Provide a custom address for a specific host and port pair. Us-\n"
+" ing this, you can make the curl requests(s) use a specified ad-\n"
, stdout);
fputs(
-" used. Consider it a sort of /etc/hosts alternative provided on\n"
-" the command line. The port number should be the number used for\n"
-" the specific protocol the host will be used for. It means you\n"
+" dress and prevent the otherwise normally resolved address to be\n"
+" used. Consider it a sort of /etc/hosts alternative provided on\n"
+" the command line. The port number should be the number used for\n"
+" the specific protocol the host will be used for. It means you\n"
" need several entries if you want to provide address for the same\n"
" host but different ports.\n"
"\n"
-" By specifying '*' as host you can tell curl to resolve any host\n"
, stdout);
fputs(
+" By specifying '*' as host you can tell curl to resolve any host\n"
" and specific port pair to the specified address. Wildcard is re-\n"
-" solved last so any --resolve with a specific host and port will\n"
+" solved last so any --resolve with a specific host and port will\n"
" be used first.\n"
"\n"
" The provided address set by this option will be used even if -4,\n"
" --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
+, stdout);
+ fputs(
" Support for providing the IP address within [brackets] was added\n"
" in 7.57.0.\n"
"\n"
-, stdout);
- fputs(
-" Support for providing multiple IP addresses per entry was added\n"
+" Support for providing multiple IP addresses per entry was added\n"
" in 7.59.0.\n"
"\n"
" Support for resolving with wildcard was added in 7.64.0.\n"
@@ -3033,35 +2966,35 @@ void hugehelp(void)
" Added in 7.21.3.\n"
"\n"
" --retry-connrefused\n"
-" In addition to the other conditions, consider ECONNREFUSED as a\n"
-" transient error too for --retry. This option is used together\n"
, stdout);
fputs(
+" In addition to the other conditions, consider ECONNREFUSED as a\n"
+" transient error too for --retry. This option is used together\n"
" with --retry.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" --retry-delay <seconds>\n"
-" Make curl sleep this amount of time before each retry when a\n"
-" transfer has failed with a transient error (it changes the de-\n"
-" fault backoff time algorithm between retries). This option is\n"
-" only interesting if --retry is also used. Setting this delay to\n"
-" zero will make curl use the default backoff time.\n"
-"\n"
+" Make curl sleep this amount of time before each retry when a\n"
+" transfer has failed with a transient error (it changes the de-\n"
+" fault backoff time algorithm between retries). This option is\n"
, stdout);
fputs(
+" only interesting if --retry is also used. Setting this delay to\n"
+" zero will make curl use the default backoff time.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.12.3.\n"
"\n"
" --retry-max-time <seconds>\n"
-" The retry timer is reset before the first transfer attempt. Re-\n"
-" tries will be done as usual (see --retry) as long as the timer\n"
-" hasn't reached this given limit. Notice that if the timer hasn't\n"
-" reached the limit, the request will be made and while perform-\n"
+" The retry timer is reset before the first transfer attempt. Re-\n"
+" tries will be done as usual (see --retry) as long as the timer\n"
, stdout);
fputs(
-" ing, it may take longer than this given time period. To limit a\n"
+" hasn't reached this given limit. Notice that if the timer hasn't\n"
+" reached the limit, the request will be made and while perform-\n"
+" ing, it may take longer than this given time period. To limit a\n"
" single request's maximum time, use -m, --max-time. Set this op-\n"
" tion to zero to not timeout retries.\n"
"\n"
@@ -3069,48 +3002,29 @@ void hugehelp(void)
"\n"
" Added in 7.12.3.\n"
"\n"
-" --retry <num>\n"
-" If a transient error is returned when curl tries to perform a\n"
, stdout);
fputs(
-" transfer, it will retry this number of times before giving up.\n"
-" Setting the number to 0 makes curl do no retries (which is the\n"
-" default). Transient error means either: a timeout, an FTP 4xx\n"
+" --retry <num>\n"
+" If a transient error is returned when curl tries to perform a\n"
+" transfer, it will retry this number of times before giving up.\n"
+" Setting the number to 0 makes curl do no retries (which is the\n"
+" default). Transient error means either: a timeout, an FTP 4xx\n"
" response code or an HTTP 408 or 5xx response code.\n"
"\n"
-" When curl is about to retry a transfer, it will first wait one\n"
-" second and then for all forthcoming retries it will double the\n"
+" When curl is about to retry a transfer, it will first wait one\n"
, stdout);
fputs(
-" waiting time until it reaches 10 minutes which then will be the\n"
-" delay between the rest of the retries. By using --retry-delay\n"
-" you disable this exponential backoff algorithm. See also\n"
+" second and then for all forthcoming retries it will double the\n"
+" waiting time until it reaches 10 minutes which then will be the\n"
+" delay between the rest of the retries. By using --retry-delay\n"
+" you disable this exponential backoff algorithm. See also\n"
" --retry-max-time to limit the total time allowed for retries.\n"
"\n"
-" Since curl 7.66.0, curl will comply with the Retry-After: re-\n"
-" sponse header if one was present to know when to issue the next\n"
-" retry.\n"
-"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
-" Added in 7.12.3.\n"
-"\n"
-" --sasl-authzid\n"
-" Use this authorisation identity (authzid), during SASL PLAIN au-\n"
-" thentication, in addition to the authentication identity (auth-\n"
-" cid) as specified by -u, --user.\n"
-"\n"
-" If the option isn't specified, the server will derive the au-\n"
-" thzid from the authcid, but if specified, and depending on the\n"
, stdout);
fputs(
-" server implementation, it may be used to access another user's\n"
-" inbox, that the user has been granted access to, or a shared\n"
-" mailbox for example.\n"
-"\n"
-" Added in 7.66.0.\n"
+" Added in 7.12.3.\n"
"\n"
" --sasl-ir\n"
" Enable initial response in SASL authentication.\n"
@@ -3120,43 +3034,41 @@ void hugehelp(void)
" --service-name <name>\n"
" This option allows you to change the service name for SPNEGO.\n"
"\n"
-, stdout);
- fputs(
-" Examples: --negotiate --service-name sockd would use\n"
+" Examples: --negotiate --service-name sockd would use\n"
" sockd/server-name.\n"
"\n"
" Added in 7.43.0.\n"
" -S, --show-error\n"
" When used with -s, --silent, it makes curl show an error message\n"
-" if it fails.\n"
-" -s, --silent\n"
-" Silent or quiet mode. Don't show progress meter or error mes-\n"
-" sages. Makes Curl mute. It will still output the data you ask\n"
, stdout);
fputs(
+" if it fails.\n"
+" -s, --silent\n"
+" Silent or quiet mode. Don't show progress meter or error mes-\n"
+" sages. Makes Curl mute. It will still output the data you ask\n"
" for, potentially even to the terminal/stdout unless you redirect\n"
" it.\n"
"\n"
-" Use -S, --show-error in addition to this option to disable\n"
+" Use -S, --show-error in addition to this option to disable\n"
" progress meter but still show error messages.\n"
"\n"
" See also -v, --verbose and --stderr.\n"
"\n"
+, stdout);
+ fputs(
" --socks4 <host[:port]>\n"
" Use the specified SOCKS4 proxy. If the port number is not speci-\n"
" fied, it is assumed at port 1080.\n"
"\n"
-, stdout);
- fputs(
-" This option overrides any previous use of -x, --proxy, as they\n"
+" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
-" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
, stdout);
fputs(
+" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
+" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
@@ -3165,23 +3077,23 @@ void hugehelp(void)
" Added in 7.15.2.\n"
"\n"
" --socks4a <host[:port]>\n"
+, stdout);
+ fputs(
" Use the specified SOCKS4a proxy. If the port number is not spec-\n"
" ified, it is assumed at port 1080.\n"
"\n"
-" This option overrides any previous use of -x, --proxy, as they\n"
-, stdout);
- fputs(
+" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
" Since 7.21.7, this option is superfluous since you can specify a\n"
-" socks4a proxy with -x, --proxy using a socks4a:// protocol pre-\n"
+" socks4a proxy with -x, --proxy using a socks4a:// protocol pre-\n"
" fix.\n"
"\n"
-" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
-" such a case curl first connects to the SOCKS proxy and then con-\n"
, stdout);
fputs(
+" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
+" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3189,55 +3101,57 @@ void hugehelp(void)
" Added in 7.18.0.\n"
"\n"
" --socks5-basic\n"
+, stdout);
+ fputs(
" Tells curl to use username/password authentication when connect-\n"
-" ing to a SOCKS5 proxy. The username/password authentication is\n"
-" enabled by default. Use --socks5-gssapi to force GSS-API au-\n"
+" ing to a SOCKS5 proxy. The username/password authentication is\n"
+" enabled by default. Use --socks5-gssapi to force GSS-API au-\n"
" thentication to SOCKS5 proxies.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.55.0.\n"
"\n"
" --socks5-gssapi-nec\n"
-" As part of the GSS-API negotiation a protection mode is negoti-\n"
-" ated. RFC 1961 says in section 4.3/4.4 it should be protected,\n"
-" but the NEC reference implementation does not. The option\n"
-" --socks5-gssapi-nec allows the unprotected exchange of the pro-\n"
+" As part of the GSS-API negotiation a protection mode is negoti-\n"
+, stdout);
+ fputs(
+" ated. RFC 1961 says in section 4.3/4.4 it should be protected,\n"
+" but the NEC reference implementation does not. The option\n"
+" --socks5-gssapi-nec allows the unprotected exchange of the pro-\n"
" tection mode negotiation.\n"
"\n"
" Added in 7.19.4.\n"
"\n"
" --socks5-gssapi-service <name>\n"
-, stdout);
- fputs(
" The default service name for a socks server is rcmd/server-fqdn.\n"
" This option allows you to change it.\n"
"\n"
-" Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n"
-" would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
-" service sockd/real-name would use sockd/real-name for cases\n"
+, stdout);
+ fputs(
+" Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n"
+" would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
+" service sockd/real-name would use sockd/real-name for cases\n"
" where the proxy-name does not match the principal name.\n"
"\n"
" Added in 7.19.4.\n"
"\n"
" --socks5-gssapi\n"
+" Tells curl to use GSS-API authentication when connecting to a\n"
, stdout);
fputs(
-" Tells curl to use GSS-API authentication when connecting to a\n"
-" SOCKS5 proxy. The GSS-API authentication is enabled by default\n"
-" (if curl is compiled with GSS-API support). Use --socks5-basic\n"
+" SOCKS5 proxy. The GSS-API authentication is enabled by default\n"
+" (if curl is compiled with GSS-API support). Use --socks5-basic\n"
" to force username/password authentication to SOCKS5 proxies.\n"
"\n"
" Added in 7.55.0.\n"
"\n"
" --socks5-hostname <host[:port]>\n"
-" Use the specified SOCKS5 proxy (and let the proxy resolve the\n"
-, stdout);
- fputs(
-" host name). If the port number is not specified, it is assumed\n"
+" Use the specified SOCKS5 proxy (and let the proxy resolve the\n"
+" host name). If the port number is not specified, it is assumed\n"
" at port 1080.\n"
"\n"
-" This option overrides any previous use of -x, --proxy, as they\n"
+, stdout);
+ fputs(
+" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
" Since 7.21.7, this option is superfluous since you can specify a\n"
@@ -3245,9 +3159,9 @@ void hugehelp(void)
" col prefix.\n"
"\n"
" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
+" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
, stdout);
fputs(
-" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
@@ -3256,35 +3170,35 @@ void hugehelp(void)
" Added in 7.18.0.\n"
"\n"
" --socks5 <host[:port]>\n"
-" Use the specified SOCKS5 proxy - but resolve the host name lo-\n"
-, stdout);
- fputs(
-" cally. If the port number is not specified, it is assumed at\n"
+" Use the specified SOCKS5 proxy - but resolve the host name lo-\n"
+" cally. If the port number is not specified, it is assumed at\n"
" port 1080.\n"
"\n"
-" This option overrides any previous use of -x, --proxy, as they\n"
+, stdout);
+ fputs(
+" This option overrides any previous use of -x, --proxy, as they\n"
" are mutually exclusive.\n"
"\n"
" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n"
" Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
+" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
, stdout);
fputs(
-" the same time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
" such a case curl first connects to the SOCKS proxy and then con-\n"
" nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-" This option (as well as --socks4) does not work with IPV6, FTPS\n"
+" This option (as well as --socks4) does not work with IPV6, FTPS\n"
" or LDAP.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
" -Y, --speed-limit <speed>\n"
+" If a download is slower than this given speed (in bytes per sec-\n"
, stdout);
fputs(
-" If a download is slower than this given speed (in bytes per sec-\n"
-" ond) for speed-time seconds it gets aborted. speed-time is set\n"
+" ond) for speed-time seconds it gets aborted. speed-time is set\n"
" with -y, --speed-time and is 30 if not set.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3292,23 +3206,23 @@ void hugehelp(void)
" -y, --speed-time <seconds>\n"
" If a download is slower than speed-limit bytes per second during\n"
" a speed-time period, the download gets aborted. If speed-time is\n"
+" used, the default speed-limit will be 1 unless set with -Y,\n"
, stdout);
fputs(
-" used, the default speed-limit will be 1 unless set with -Y,\n"
" --speed-limit.\n"
"\n"
-" This option controls transfers and thus will not affect slow\n"
-" connects etc. If this is a concern for you, try the --connect-\n"
+" This option controls transfers and thus will not affect slow\n"
+" connects etc. If this is a concern for you, try the --connect-\n"
" timeout option.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --ssl-allow-beast\n"
" This option tells curl to not work around a security flaw in the\n"
+" SSL3 and TLS1.0 protocols known as BEAST. If this option isn't\n"
, stdout);
fputs(
-" SSL3 and TLS1.0 protocols known as BEAST. If this option isn't\n"
-" used, the SSL layer may use workarounds known to cause interop-\n"
+" used, the SSL layer may use workarounds known to cause interop-\n"
" erability problems with some older SSL implementations. WARNING:\n"
" this option loosens the SSL security, and by using this flag you\n"
" ask for exactly that.\n"
@@ -3317,9 +3231,9 @@ void hugehelp(void)
"\n"
" --ssl-no-revoke\n"
" (Schannel) This option tells curl to disable certificate revoca-\n"
+" tion checks. WARNING: this option loosens the SSL security, and\n"
, stdout);
fputs(
-" tion checks. WARNING: this option loosens the SSL security, and\n"
" by using this flag you ask for exactly that.\n"
"\n"
" Added in 7.44.0.\n"
@@ -3332,45 +3246,45 @@ void hugehelp(void)
"\n"
" Added in 7.20.0.\n"
"\n"
+" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection. Re-\n"
, stdout);
fputs(
-" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection. Re-\n"
-" verts to a non-secure connection if the server doesn't support\n"
-" SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n"
+" verts to a non-secure connection if the server doesn't support\n"
+" SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n"
" ent levels of encryption required.\n"
"\n"
-" This option was formerly known as --ftp-ssl (Added in 7.11.0).\n"
-" That option name can still be used but will be removed in a fu-\n"
+" This option was formerly known as --ftp-ssl (Added in 7.11.0).\n"
+" That option name can still be used but will be removed in a fu-\n"
" ture version.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.20.0.\n"
"\n"
" -2, --sslv2\n"
-" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
-" remote SSL server. Sometimes curl is built without SSLv2 sup-\n"
-" port. SSLv2 is widely considered insecure (see RFC 6176).\n"
-"\n"
-" See also --http1.1 and --http2. -2, --sslv2 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
, stdout);
fputs(
+" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
+" remote SSL server. Sometimes curl is built without SSLv2 sup-\n"
+" port. SSLv2 is widely considered insecure (see RFC 6176).\n"
+"\n"
+" See also --http1.1 and --http2. -2, --sslv2 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" -3, --sslv3\n"
-" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
-" remote SSL server. Sometimes curl is built without SSLv3 sup-\n"
-" port. SSLv3 is widely considered insecure (see RFC 7568).\n"
-"\n"
-" See also --http1.1 and --http2. -3, --sslv3 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
, stdout);
fputs(
+" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
+" remote SSL server. Sometimes curl is built without SSLv3 sup-\n"
+" port. SSLv3 is widely considered insecure (see RFC 7568).\n"
+"\n"
+" See also --http1.1 and --http2. -3, --sslv3 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" --stderr\n"
-" Redirect all writes to stderr to the specified file instead. If\n"
+, stdout);
+ fputs(
+" Redirect all writes to stderr to the specified file instead. If\n"
" the file name is a plain '-', it is instead written to stdout.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3378,24 +3292,24 @@ void hugehelp(void)
" See also -v, --verbose and -s, --silent.\n"
"\n"
" --styled-output\n"
-" Enables the automatic use of bold font styles when writing HTTP\n"
-, stdout);
- fputs(
-" headers to the terminal. Use --no-styled-output to switch them\n"
+" Enables the automatic use of bold font styles when writing HTTP\n"
+" headers to the terminal. Use --no-styled-output to switch them\n"
" off.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.61.0.\n"
"\n"
" --suppress-connect-headers\n"
-" When -p, --proxytunnel is used and a CONNECT request is made\n"
-" don't output proxy CONNECT response headers. This option is\n"
-" meant to be used with -D, --dump-header or -i, --include which\n"
-" are used to show protocol headers in the output. It has no ef-\n"
-, stdout);
- fputs(
-" fect on debug options such as -v, --verbose or --trace, or any\n"
+" When -p, --proxytunnel is used and a CONNECT request is made\n"
+" don't output proxy CONNECT response headers. This option is\n"
+" meant to be used with -D, --dump-header or -i, --include which\n"
+" are used to show protocol headers in the output. It has no ef-\n"
+" fect on debug options such as -v, --verbose or --trace, or any\n"
" statistics.\n"
"\n"
+, stdout);
+ fputs(
" See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
" nel.\n"
"\n"
@@ -3405,12 +3319,12 @@ void hugehelp(void)
" Added in 7.49.0.\n"
"\n"
" --tcp-nodelay\n"
-" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
+" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
" page for details about this option.\n"
"\n"
+" Since 7.50.2, curl sets this option by default and you need to\n"
, stdout);
fputs(
-" Since 7.50.2, curl sets this option by default and you need to\n"
" explicitly switch it off if you don't want it on.\n"
"\n"
" Added in 7.11.2.\n"
@@ -3425,9 +3339,9 @@ void hugehelp(void)
" NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
" --tftp-blksize <value>\n"
+" (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
, stdout);
fputs(
-" (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
" size that curl will try to use when transferring data to or from\n"
" a TFTP server. By default 512 bytes will be used.\n"
"\n"
@@ -3438,46 +3352,46 @@ void hugehelp(void)
" --tftp-no-options\n"
" (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"
+" This option improves interop with some legacy servers that do\n"
, stdout);
fputs(
-" This option improves interop with some legacy servers that do\n"
-" not acknowledge or properly implement TFTP options. When this\n"
+" not acknowledge or properly implement TFTP options. When this\n"
" option is used --tftp-blksize is ignored.\n"
"\n"
" Added in 7.48.0.\n"
"\n"
" -z, --time-cond <time>\n"
-" (HTTP FTP) Request a file that has been modified later than the\n"
-" given time and date, or one that has been modified before that\n"
+" (HTTP FTP) Request a file that has been modified later than the\n"
+" given time and date, or one that has been modified before that\n"
+" time. The <date expression> can be all sorts of date strings or\n"
, stdout);
fputs(
-" time. The <date expression> can be all sorts of date strings or\n"
" if it doesn't match any internal ones, it is taken as a filename\n"
-" and tries to get the modification date (mtime) from <file> in-\n"
+" and tries to get the modification date (mtime) from <file> in-\n"
" stead. See the curl_getdate(3) man pages for date expression de-\n"
" tails.\n"
"\n"
" Start the date expression with a dash (-) to make it request for\n"
-" a document that is older than the given date/time, default is a\n"
-, stdout);
- fputs(
+" a document that is older than the given date/time, default is a\n"
" document that is newer than the specified date/time.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --tls-max <VERSION>\n"
" (SSL) VERSION defines maximum supported TLS version. The minimum\n"
-" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
+" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
" tlsv1.3.\n"
"\n"
" default\n"
" Use up to recommended TLS version.\n"
"\n"
" 1.0 Use up to TLSv1.0.\n"
-, stdout);
- fputs(
" 1.1 Use up to TLSv1.1.\n"
" 1.2 Use up to TLSv1.2.\n"
+, stdout);
+ fputs(
" 1.3 Use up to TLSv1.3.\n"
"\n"
" See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
@@ -3485,31 +3399,24 @@ void hugehelp(void)
" 7.54.0.\n"
"\n"
" --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
-" (TLS) Specifies which cipher suites to use in the connection if\n"
+" (TLS) Specifies which cipher suites to use in the connection if\n"
+" it negotiates TLS 1.3. The list of ciphers suites must specify\n"
, stdout);
fputs(
-" it negotiates TLS 1.3. The list of ciphers suites must specify\n"
-" valid ciphers. Read up on TLS 1.3 cipher suite details on this\n"
+" valid ciphers. Read up on TLS 1.3 cipher suite details on this\n"
" URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
-" This option is currently used only when curl is built to use\n"
-" OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
-" you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
-" option.\n"
-"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --tlsauthtype <type>\n"
" Set TLS authentication type. Currently, the only supported op-\n"
" tion is \"SRP\", for TLS-SRP (RFC 5054). If --tlsuser and\n"
-" --tlspassword are specified but --tlsauthtype is not, then this\n"
-" option defaults to \"SRP\". This option works only if the under-\n"
, stdout);
fputs(
+" --tlspassword are specified but --tlsauthtype is not, then this\n"
+" option defaults to \"SRP\". This option works only if the under-\n"
" lying libcurl is built with TLS-SRP support, which requires\n"
" OpenSSL or GnuTLS with TLS-SRP support.\n"
"\n"
@@ -3518,12 +3425,12 @@ void hugehelp(void)
" --tlspassword\n"
" Set password for use with the TLS authentication method speci-\n"
" fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
+, stdout);
+ fputs(
"\n"
" Added in 7.21.4.\n"
" --tlsuser <name>\n"
" Set username for use with the TLS authentication method speci-\n"
-, stdout);
- fputs(
" fied with --tlsauthtype. Requires that --tlspassword also is\n"
" set.\n"
"\n"
@@ -3533,25 +3440,13 @@ void hugehelp(void)
" (TLS) Forces curl to use TLS version 1.0 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.0, but behavior was inconsistent depending on the\n"
-, stdout);
- fputs(
-" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
-" sion.\n"
-"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.1\n"
-" (TLS) Forces curl to use TLS version 1.1 or later when connect-\n"
-" ing to a remote TLS server.\n"
-"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.1, but behavior was inconsistent depending on the\n"
, stdout);
fputs(
-" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
-" sion.\n"
+" (TLS) Forces curl to use TLS version 1.1 or later when connect-\n"
+" ing to a remote TLS server.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
@@ -3559,76 +3454,69 @@ void hugehelp(void)
" (TLS) Forces curl to use TLS version 1.2 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.2, but behavior was inconsistent depending on the\n"
-, stdout);
- fputs(
-" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
-" sion.\n"
-"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.3\n"
-" (TLS) Forces curl to use TLS version 1.3 or later when connect-\n"
+" (TLS) Forces curl to use TLS version 1.3 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
-" At the time of this writing, they are BoringSSL, NSS, and Secure\n"
, stdout);
fputs(
+" Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
+" At the time of this writing, they are BoringSSL, NSS, and Secure\n"
" Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -1, --tlsv1\n"
-" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
-" ing with a remote TLS server. That means TLS version 1.0 or\n"
+" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
+" ing with a remote TLS server. That means TLS version 1.0 or\n"
" higher\n"
"\n"
-" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
, stdout);
fputs(
+" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
" --tr-encoding\n"
" (HTTP) Request a compressed Transfer-Encoding response using one\n"
-" of the algorithms curl supports, and uncompress the data while\n"
+" of the algorithms curl supports, and uncompress the data while\n"
" receiving it.\n"
"\n"
" Added in 7.21.6.\n"
"\n"
" --trace-ascii <file>\n"
-" Enables a full trace dump of all incoming and outgoing data, in-\n"
-" cluding descriptive information, to the given output file. Use\n"
, stdout);
fputs(
+" Enables a full trace dump of all incoming and outgoing data, in-\n"
+" cluding descriptive information, to the given output file. Use\n"
" \"-\" as filename to have the output sent to stdout.\n"
"\n"
" This is very similar to --trace, but leaves out the hex part and\n"
-" only shows the ASCII part of the dump. It makes smaller output\n"
+" only shows the ASCII part of the dump. It makes smaller output\n"
" that might be easier to read for untrained humans.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" This option overrides --trace and -v, --verbose.\n"
"\n"
" --trace-time\n"
-, stdout);
- fputs(
-" Prepends a time stamp to each trace or verbose line that curl\n"
+" Prepends a time stamp to each trace or verbose line that curl\n"
" displays.\n"
"\n"
" Added in 7.14.0.\n"
"\n"
" --trace <file>\n"
" Enables a full trace dump of all incoming and outgoing data, in-\n"
-" cluding descriptive information, to the given output file. Use\n"
-" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
-" filename to have the output sent to stderr.\n"
-"\n"
+" cluding descriptive information, to the given output file. Use\n"
, stdout);
fputs(
+" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
+" filename to have the output sent to stderr.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" This option overrides -v, --verbose and --trace-ascii.\n"
@@ -3640,190 +3528,190 @@ void hugehelp(void)
" Added in 7.40.0.\n"
"\n"
" -T, --upload-file <file>\n"
-" This transfers the specified local file to the remote URL. If\n"
, stdout);
fputs(
+" This transfers the specified local file to the remote URL. If\n"
" there is no file part in the specified URL, curl will append the\n"
" local file name. NOTE that you must use a trailing / on the last\n"
-" directory to really prove to Curl that there is no file name or\n"
+" directory to really prove to Curl that there is no file name or\n"
" curl will think that your last directory name is the remote file\n"
" name to use. That will most likely cause the upload operation to\n"
+, stdout);
+ fputs(
" fail. If this is used on an HTTP(S) server, the PUT command will\n"
" be used.\n"
"\n"
-, stdout);
- fputs(
-" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
-" given file. Alternately, the file name \".\" (a single period)\n"
-" may be specified instead of \"-\" to use stdin in non-blocking\n"
-" mode to allow reading server output while stdin is being up-\n"
+" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
+" given file. Alternately, the file name \".\" (a single period)\n"
+" may be specified instead of \"-\" to use stdin in non-blocking\n"
+" mode to allow reading server output while stdin is being up-\n"
" loaded.\n"
"\n"
-" You can specify one -T, --upload-file for each URL on the com-\n"
-" mand line. Each -T, --upload-file + URL pair specifies what to\n"
, stdout);
fputs(
-" upload and to where. curl also supports \"globbing\" of the -T,\n"
-" --upload-file argument, meaning that you can upload multiple\n"
-" files to a single URL by using the same URL globbing style sup-\n"
+" You can specify one -T, --upload-file for each URL on the com-\n"
+" mand line. Each -T, --upload-file + URL pair specifies what to\n"
+" upload and to where. curl also supports \"globbing\" of the -T,\n"
+" --upload-file argument, meaning that you can upload multiple\n"
+" files to a single URL by using the same URL globbing style sup-\n"
" ported in the URL, like this:\n"
"\n"
+, stdout);
+ fputs(
" curl --upload-file \"{file1,file2}\" http://www.example.com\n"
"\n"
" or even\n"
"\n"
" curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
-, stdout);
- fputs(
-" When uploading to an SMTP server: the uploaded data is assumed\n"
+" When uploading to an SMTP server: the uploaded data is assumed\n"
" to be RFC 5322 formatted. It has to feature the necessary set of\n"
-" headers and mail body formatted correctly by the user as curl\n"
+" headers and mail body formatted correctly by the user as curl\n"
" will not transcode nor encode it further in any way.\n"
"\n"
" --url <url>\n"
-" Specify a URL to fetch. This option is mostly handy when you\n"
+, stdout);
+ fputs(
+" Specify a URL to fetch. This option is mostly handy when you\n"
" want to specify URL(s) in a config file.\n"
"\n"
+" If the given URL is missing a scheme name (such as \"http://\" or\n"
+" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
+" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
+" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
, stdout);
fputs(
-" If the given URL is missing a scheme name (such as \"http://\" or\n"
-" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
-" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
-" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
" will be used. Since 7.45.0 guessing can be disabled by setting a\n"
" default protocol, see --proto-default for details.\n"
"\n"
-, stdout);
- fputs(
-" This option may be used any number of times. To control where\n"
-" this URL is written, use the -o, --output or the -O, --remote-\n"
+" This option may be used any number of times. To control where\n"
+" this URL is written, use the -o, --output or the -O, --remote-\n"
" name options.\n"
"\n"
" -B, --use-ascii\n"
-" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
-" forced by using a URL that ends with \";type=A\". This option\n"
+" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
+, stdout);
+ fputs(
+" forced by using a URL that ends with \";type=A\". This option\n"
" causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
" -A, --user-agent <name>\n"
-, stdout);
- fputs(
" (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
-" To encode blanks in the string, surround the string with single\n"
-" quote marks. This header can also be set with the -H, --header\n"
+" To encode blanks in the string, surround the string with single\n"
+" quote marks. This header can also be set with the -H, --header\n"
" or the --proxy-header options.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -u, --user <user:password>\n"
" Specify the user name and password to use for server authentica-\n"
-, stdout);
- fputs(
" tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
-" If you simply specify the user name, curl will prompt for a\n"
+" If you simply specify the user name, curl will prompt for a\n"
" password.\n"
"\n"
-" The user name and passwords are split up on the first colon,\n"
-" which makes it impossible to use a colon in the user name with\n"
+" The user name and passwords are split up on the first colon,\n"
+, stdout);
+ fputs(
+" which makes it impossible to use a colon in the user name with\n"
" this option. The password can, still.\n"
"\n"
" On systems where it works, curl will hide the given option argu-\n"
+" ment from process listings. This is not enough to protect cre-\n"
+" dentials from possibly getting seen by other users on the same\n"
+" system as they will still be visible for a brief moment before\n"
, stdout);
fputs(
-" ment from process listings. This is not enough to protect cre-\n"
-" dentials from possibly getting seen by other users on the same\n"
-" system as they will still be visible for a brief moment before\n"
" cleared. Such sensitive data should be retrieved from a file in-\n"
" stead or similar and never used in clear text in a command line.\n"
-" When using Kerberos V5 with a Windows based server you should\n"
-, stdout);
- fputs(
-" include the Windows domain name in the user name, in order for\n"
-" the server to successfully obtain a Kerberos Ticket. If you\n"
+" When using Kerberos V5 with a Windows based server you should\n"
+" include the Windows domain name in the user name, in order for\n"
+" the server to successfully obtain a Kerberos Ticket. If you\n"
" don't then the initial authentication handshake may fail.\n"
"\n"
-" When using NTLM, the user name can be specified simply as the\n"
-" user name, without the domain, if there is a single domain and\n"
-" forest in your setup for example.\n"
-"\n"
, stdout);
fputs(
-" To specify the domain name use either Down-Level Logon Name or\n"
+" When using NTLM, the user name can be specified simply as the\n"
+" user name, without the domain, if there is a single domain and\n"
+" forest in your setup for example.\n"
+"\n"
+" To specify the domain name use either Down-Level Logon Name or\n"
" UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
" user@example.com respectively.\n"
"\n"
-" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
-" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
-" tell curl to select the user name and password from your envi-\n"
+" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
, stdout);
fputs(
+" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
+" tell curl to select the user name and password from your envi-\n"
" ronment by specifying a single colon with this option: \"-u :\".\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" -v, --verbose\n"
-" Makes curl verbose during the operation. Useful for debugging\n"
-" and seeing what's going on \"under the hood\". A line starting\n"
-" with '>' means \"header data\" sent by curl, '<' means \"header\n"
-" data\" received by curl that is hidden in normal cases, and a\n"
+" Makes curl verbose during the operation. Useful for debugging\n"
+" and seeing what's going on \"under the hood\". A line starting\n"
, stdout);
fputs(
+" with '>' means \"header data\" sent by curl, '<' means \"header\n"
+" data\" received by curl that is hidden in normal cases, and a\n"
" line starting with '*' means additional info provided by curl.\n"
"\n"
" If you only want HTTP headers in the output, -i, --include might\n"
" be the option you're looking for.\n"
"\n"
-" If you think this option still doesn't give you enough details,\n"
+" If you think this option still doesn't give you enough details,\n"
+, stdout);
+ fputs(
" consider using --trace or --trace-ascii instead.\n"
"\n"
" Use -s, --silent to make curl really quiet.\n"
"\n"
-" See also -i, --include. This option overrides --trace and\n"
-, stdout);
- fputs(
+" See also -i, --include. This option overrides --trace and\n"
" --trace-ascii.\n"
"\n"
" -V, --version\n"
" Displays information about curl and the libcurl version it uses.\n"
-" The first line includes the full version of curl, libcurl and\n"
+" The first line includes the full version of curl, libcurl and\n"
" other 3rd party libraries linked with the executable.\n"
"\n"
-" The second line (starts with \"Protocols:\") shows all protocols\n"
+, stdout);
+ fputs(
+" The second line (starts with \"Protocols:\") shows all protocols\n"
" that libcurl reports to support.\n"
"\n"
" The third line (starts with \"Features:\") shows specific features\n"
-, stdout);
- fputs(
" libcurl reports to offer. Available features include:\n"
"\n"
" IPv6 You can use IPv6 with this.\n"
"\n"
" krb4 Krb4 for FTP is supported.\n"
"\n"
-" SSL SSL versions of various protocols are supported, such as\n"
+" SSL SSL versions of various protocols are supported, such as\n"
+, stdout);
+ fputs(
" HTTPS, FTPS, POP3S and so on.\n"
"\n"
-" libz Automatic decompression of compressed files over HTTP is\n"
+" libz Automatic decompression of compressed files over HTTP is\n"
" supported.\n"
"\n"
" NTLM NTLM authentication is supported.\n"
"\n"
-, stdout);
- fputs(
-" Debug This curl uses a libcurl built with Debug. This enables\n"
-" more error-tracking and memory debugging etc. For curl-\n"
+" Debug This curl uses a libcurl built with Debug. This enables\n"
+" more error-tracking and memory debugging etc. For curl-\n"
" developers only!\n"
"\n"
" AsynchDNS\n"
-" This curl uses asynchronous name resolves. Asynchronous\n"
-" name resolves can be done using either the c-ares or the\n"
+, stdout);
+ fputs(
+" This curl uses asynchronous name resolves. Asynchronous\n"
+" name resolves can be done using either the c-ares or the\n"
" threaded resolver backends.\n"
"\n"
" SPNEGO SPNEGO authentication is supported.\n"
"\n"
-, stdout);
- fputs(
" Largefile\n"
" This curl supports transfers of large files, files larger\n"
" than 2GB.\n"
@@ -3831,16 +3719,16 @@ void hugehelp(void)
" IDN This curl supports IDN - international domain names.\n"
"\n"
" GSS-API\n"
+, stdout);
+ fputs(
" GSS-API is supported.\n"
"\n"
" SSPI SSPI is supported.\n"
"\n"
" TLS-SRP\n"
-" SRP (Secure Remote Password) authentication is supported\n"
+" SRP (Secure Remote Password) authentication is supported\n"
" for TLS.\n"
"\n"
-, stdout);
- fputs(
" HTTP2 HTTP/2 support has been built-in.\n"
"\n"
" UnixSockets\n"
@@ -3850,120 +3738,120 @@ void hugehelp(void)
" This curl is built to support HTTPS proxy.\n"
"\n"
" Metalink\n"
-" This curl supports Metalink (both version 3 and 4 (RFC\n"
-" 5854)), which describes mirrors and hashes. curl will\n"
-" use mirrors for failover if there are errors (such as the\n"
, stdout);
fputs(
+" This curl supports Metalink (both version 3 and 4 (RFC\n"
+" 5854)), which describes mirrors and hashes. curl will\n"
+" use mirrors for failover if there are errors (such as the\n"
" file or server not being available).\n"
"\n"
-" PSL PSL is short for Public Suffix List and means that this\n"
-" curl has been built with knowledge about \"public suf-\n"
+" PSL PSL is short for Public Suffix List and means that this\n"
+" curl has been built with knowledge about \"public suf-\n"
" fixes\".\n"
"\n"
+, stdout);
+ fputs(
" MultiSSL\n"
" This curl supports multiple TLS backends.\n"
"\n"
" -w, --write-out <format>\n"
" Make curl display information on stdout after a completed trans-\n"
+" fer. The format is a string that may contain plain text mixed\n"
+" with any number of variables. The format can be specified as a\n"
+" literal \"string\", or you can have curl read the format from a\n"
, stdout);
fputs(
-" fer. The format is a string that may contain plain text mixed\n"
-" with any number of variables. The format can be specified as a\n"
-" literal \"string\", or you can have curl read the format from a\n"
-" file with \"@filename\" and to tell curl to read the format from\n"
+" file with \"@filename\" and to tell curl to read the format from\n"
" stdin you write \"@-\".\n"
"\n"
-" The variables present in the output format will be substituted\n"
+" The variables present in the output format will be substituted\n"
+" by the value or text that curl thinks fit, as described below.\n"
+" All variables are specified as %{variable_name} and to output a\n"
+" normal % you just write them as %%. You can output a newline by\n"
, stdout);
fputs(
-" by the value or text that curl thinks fit, as described below.\n"
-" All variables are specified as %{variable_name} and to output a\n"
-" normal % you just write them as %%. You can output a newline by\n"
" using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
-" The output will be written to standard output, but this can be\n"
+" The output will be written to standard output, but this can be\n"
" switched to standard error by using %{stderr}.\n"
"\n"
-, stdout);
- fputs(
" NOTE: The %-symbol is a special symbol in the win32-environment,\n"
-" where all occurrences of % must be doubled when using this op-\n"
+" where all occurrences of % must be doubled when using this op-\n"
" tion.\n"
"\n"
" The variables available are:\n"
"\n"
-" content_type The Content-Type of the requested document, if\n"
+, stdout);
+ fputs(
+" content_type The Content-Type of the requested document, if\n"
" there was any.\n"
"\n"
" filename_effective\n"
-" The ultimate filename that curl writes out to.\n"
+" The ultimate filename that curl writes out to.\n"
+" This is only meaningful if curl is told to write\n"
+" to a file with the -O, --remote-name or -o,\n"
+" --output option. It's most useful in combination\n"
, stdout);
fputs(
-" This is only meaningful if curl is told to write\n"
-" to a file with the -O, --remote-name or -o,\n"
-" --output option. It's most useful in combination\n"
-" with the -J, --remote-header-name option. (Added\n"
+" with the -J, --remote-header-name option. (Added\n"
" in 7.26.0)\n"
"\n"
" ftp_entry_path The initial path curl ended up in when logging on\n"
-, stdout);
- fputs(
" to the remote FTP server. (Added in 7.15.4)\n"
"\n"
" http_code The numerical response code that was found in the\n"
-" last retrieved HTTP(S) or FTP(s) transfer. In\n"
-" 7.18.2 the alias response_code was added to show\n"
+" last retrieved HTTP(S) or FTP(s) transfer. In\n"
+, stdout);
+ fputs(
+" 7.18.2 the alias response_code was added to show\n"
" the same info.\n"
"\n"
" http_connect The numerical code that was found in the last re-\n"
-, stdout);
- fputs(
-" sponse (from a proxy) to a curl CONNECT request.\n"
+" sponse (from a proxy) to a curl CONNECT request.\n"
" (Added in 7.12.4)\n"
"\n"
" http_version The http version that was effectively used.\n"
" (Added in 7.50.0)\n"
"\n"
-" local_ip The IP address of the local end of the most re-\n"
-" cently done connection - can be either IPv4 or\n"
-" IPv6 (Added in 7.29.0)\n"
-"\n"
, stdout);
fputs(
-" local_port The local port number of the most recently done\n"
+" local_ip The IP address of the local end of the most re-\n"
+" cently done connection - can be either IPv4 or\n"
+" IPv6 (Added in 7.29.0)\n"
+"\n"
+" local_port The local port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-" num_connects Number of new connects made in the recent trans-\n"
+" num_connects Number of new connects made in the recent trans-\n"
" fer. (Added in 7.12.3)\n"
"\n"
+, stdout);
+ fputs(
" num_redirects Number of redirects that were followed in the re-\n"
" quest. (Added in 7.12.3)\n"
"\n"
" proxy_ssl_verify_result\n"
-, stdout);
- fputs(
" The result of the HTTPS proxy's SSL peer certifi-\n"
" cate verification that was requested. 0 means the\n"
" verification was successful. (Added in 7.52.0)\n"
"\n"
" redirect_url When an HTTP request was made without -L, --loca-\n"
-" tion to follow redirects (or when --max-redir is\n"
-" met), this variable will show the actual URL a\n"
, stdout);
fputs(
+" tion to follow redirects (or when --max-redir is\n"
+" met), this variable will show the actual URL a\n"
" redirect would have gone to. (Added in 7.18.2)\n"
"\n"
-" remote_ip The remote IP address of the most recently done\n"
+" remote_ip The remote IP address of the most recently done\n"
" connection - can be either IPv4 or IPv6 (Added in\n"
" 7.29.0)\n"
"\n"
-" remote_port The remote port number of the most recently done\n"
-" connection (Added in 7.29.0)\n"
-"\n"
-" scheme The URL scheme (sometimes called protocol) that\n"
, stdout);
fputs(
+" remote_port The remote port number of the most recently done\n"
+" connection (Added in 7.29.0)\n"
+"\n"
+" scheme The URL scheme (sometimes called protocol) that\n"
" was effectively used (Added in 7.52.0)\n"
"\n"
" size_download The total amount of bytes that were downloaded.\n"
@@ -3971,102 +3859,102 @@ void hugehelp(void)
" size_header The total amount of bytes of the downloaded head-\n"
" ers.\n"
"\n"
-" size_request The total amount of bytes that were sent in the\n"
+, stdout);
+ fputs(
+" size_request The total amount of bytes that were sent in the\n"
" HTTP request.\n"
"\n"
" size_upload The total amount of bytes that were uploaded.\n"
"\n"
-, stdout);
- fputs(
" speed_download The average download speed that curl measured for\n"
" the complete download. Bytes per second.\n"
"\n"
-" speed_upload The average upload speed that curl measured for\n"
+" speed_upload The average upload speed that curl measured for\n"
" the complete upload. Bytes per second.\n"
"\n"
-" ssl_verify_result\n"
-" The result of the SSL peer certificate verifica-\n"
-" tion that was requested. 0 means the verification\n"
, stdout);
fputs(
+" ssl_verify_result\n"
+" The result of the SSL peer certificate verifica-\n"
+" tion that was requested. 0 means the verification\n"
" was successful. (Added in 7.19.0)\n"
"\n"
-" stderr From this point on, the -w, --write-out output\n"
-" will be written to standard error. (Added in\n"
+" stderr From this point on, the -w, --write-out output\n"
+" will be written to standard error. (Added in\n"
" 7.63.0)\n"
"\n"
-" stdout From this point on, the -w, --write-out output\n"
-" will be written to standard output. This is the\n"
-" default, but can be used to switch back after\n"
, stdout);
fputs(
+" stdout From this point on, the -w, --write-out output\n"
+" will be written to standard output. This is the\n"
+" default, but can be used to switch back after\n"
" switching to stderr. (Added in 7.63.0)\n"
"\n"
" time_appconnect\n"
-" The time, in seconds, it took from the start un-\n"
-" til the SSL/SSH/etc connect/handshake to the re-\n"
+" The time, in seconds, it took from the start un-\n"
+" til the SSL/SSH/etc connect/handshake to the re-\n"
+, stdout);
+ fputs(
" mote host was completed. (Added in 7.19.0)\n"
"\n"
-" time_connect The time, in seconds, it took from the start un-\n"
+" time_connect The time, in seconds, it took from the start un-\n"
" til the TCP connect to the remote host (or proxy)\n"
-, stdout);
- fputs(
" was completed.\n"
"\n"
" time_namelookup\n"
-" The time, in seconds, it took from the start un-\n"
+" The time, in seconds, it took from the start un-\n"
" til the name resolving was completed.\n"
"\n"
" time_pretransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the file transfer was just about to begin.\n"
-" This includes all pre-transfer commands and nego-\n"
, stdout);
fputs(
+" The time, in seconds, it took from the start un-\n"
+" til the file transfer was just about to begin.\n"
+" This includes all pre-transfer commands and nego-\n"
" tiations that are specific to the particular pro-\n"
" tocol(s) involved.\n"
"\n"
" time_redirect The time, in seconds, it took for all redirection\n"
-" steps including name lookup, connect, pretransfer\n"
-" and transfer before the final transaction was\n"
-" started. time_redirect shows the complete execu-\n"
, stdout);
fputs(
-" tion time for multiple redirections. (Added in\n"
+" steps including name lookup, connect, pretransfer\n"
+" and transfer before the final transaction was\n"
+" started. time_redirect shows the complete execu-\n"
+" tion time for multiple redirections. (Added in\n"
" 7.12.3)\n"
"\n"
" time_starttransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the first byte was just about to be trans-\n"
-" ferred. This includes time_pretransfer and also\n"
-" the time the server needed to calculate the re-\n"
+" The time, in seconds, it took from the start un-\n"
, stdout);
fputs(
+" til the first byte was just about to be trans-\n"
+" ferred. This includes time_pretransfer and also\n"
+" the time the server needed to calculate the re-\n"
" sult.\n"
"\n"
-" time_total The total time, in seconds, that the full opera-\n"
+" time_total The total time, in seconds, that the full opera-\n"
" tion lasted.\n"
"\n"
" url_effective The URL that was fetched last. This is most mean-\n"
-" ingful if you've told curl to follow location:\n"
+, stdout);
+ fputs(
+" ingful if you've told curl to follow location:\n"
" headers.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --xattr\n"
+" When saving output to a file, this option tells curl to store\n"
+" certain file metadata in extended file attributes. Currently,\n"
+" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
, stdout);
fputs(
-" When saving output to a file, this option tells curl to store\n"
-" certain file metadata in extended file attributes. Currently,\n"
-" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
-" the content type is stored in the mime_type attribute. If the\n"
-" file system does not support extended attributes, a warning is\n"
+" the content type is stored in the mime_type attribute. If the\n"
+" file system does not support extended attributes, a warning is\n"
" issued.\n"
"\n"
"FILES\n"
" ~/.curlrc\n"
-, stdout);
- fputs(
" Default config file, see -K, --config for details.\n"
"\n"
"ENVIRONMENT\n"
@@ -4074,68 +3962,70 @@ void hugehelp(void)
" The lower case version has precedence. http_proxy is an exception as it\n"
" is only available in lower case.\n"
"\n"
-" Using an environment variable to set the proxy has the same effect as\n"
+, stdout);
+ fputs(
+" Using an environment variable to set the proxy has the same effect as\n"
" using the -x, --proxy option.\n"
"\n"
" http_proxy [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTP.\n"
-, stdout);
- fputs(
" HTTPS_PROXY [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTPS.\n"
"\n"
" [url-protocol]_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use for [url-protocol], where the pro-\n"
-" tocol is a protocol that curl supports and as specified in a\n"
+" Sets the proxy server to use for [url-protocol], where the pro-\n"
+, stdout);
+ fputs(
+" tocol is a protocol that curl supports and as specified in a\n"
" URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
" ALL_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use if no protocol-specific proxy is\n"
-, stdout);
- fputs(
+" Sets the proxy server to use if no protocol-specific proxy is\n"
" set.\n"
"\n"
" NO_PROXY <comma-separated list of hosts/domains>\n"
-" list of host names that shouldn't go through any proxy. If set\n"
+" list of host names that shouldn't go through any proxy. If set\n"
" to an asterisk '*' only, it matches all hosts. Each name in this\n"
+, stdout);
+ fputs(
" list is matched as either a domain name which contains the host-\n"
" name, or the hostname itself.\n"
"\n"
-" This environment variable disables use of the proxy even when\n"
+" This environment variable disables use of the proxy even when\n"
+" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
+" rect.example.com curl -x http://proxy.example.com http://di-\n"
+" rect.example.com accesses the target URL directly, and\n"
, stdout);
fputs(
-" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
-" rect.example.com curl -x http://proxy.example.com http://di-\n"
-" rect.example.com accesses the target URL directly, and\n"
-" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
+" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
" http://somewhere.example.com accesses the target URL through the\n"
" proxy.\n"
"\n"
-" The list of host names can also be include numerical IP ad-\n"
-, stdout);
- fputs(
-" dresses, and IPv6 versions should then be given without enclos-\n"
+" The list of host names can also be include numerical IP ad-\n"
+" dresses, and IPv6 versions should then be given without enclos-\n"
" ing brackets.\n"
"\n"
"PROXY PROTOCOL PREFIXES\n"
-" Since curl version 7.21.7, the proxy string may be specified with a\n"
+" Since curl version 7.21.7, the proxy string may be specified with a\n"
+, stdout);
+ fputs(
" protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
-" If no protocol is specified in the proxy string or if the string\n"
-" doesn't match a supported one, the proxy will be treated as an HTTP\n"
+" If no protocol is specified in the proxy string or if the string\n"
+" doesn't match a supported one, the proxy will be treated as an HTTP\n"
" proxy.\n"
"\n"
-, stdout);
- fputs(
" The supported proxy protocol prefixes are as follows:\n"
"\n"
" http://\n"
-" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
+" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
" fix is used.\n"
"\n"
" https://\n"
" Makes it treated as an HTTPS proxy.\n"
"\n"
+, stdout);
+ fputs(
" socks4://\n"
" Makes it the equivalent of --socks4\n"
"\n"
@@ -4146,15 +4036,15 @@ void hugehelp(void)
" Makes it the equivalent of --socks5\n"
"\n"
" socks5h://\n"
-, stdout);
- fputs(
" Makes it the equivalent of --socks5-hostname\n"
"\n"
"EXIT CODES\n"
-" There are a bunch of different error codes and their corresponding er-\n"
+" There are a bunch of different error codes and their corresponding er-\n"
" ror messages that may appear during bad conditions. At the time of this\n"
" writing, the exit codes are:\n"
"\n"
+, stdout);
+ fputs(
" 1 Unsupported protocol. This build of curl has no support for this\n"
" protocol.\n"
"\n"
@@ -4162,77 +4052,77 @@ void hugehelp(void)
"\n"
" 3 URL malformed. The syntax was not correct.\n"
"\n"
-, stdout);
- fputs(
-" 4 A feature or option that was needed to perform the desired re-\n"
-" quest was not enabled or was explicitly disabled at build-time.\n"
+" 4 A feature or option that was needed to perform the desired re-\n"
+" quest was not enabled or was explicitly disabled at build-time.\n"
" To make curl able to do this, you probably need another build of\n"
" libcurl!\n"
"\n"
-" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
+, stdout);
+ fputs(
+" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
" solved.\n"
"\n"
" 6 Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
" 7 Failed to connect to host.\n"
"\n"
-, stdout);
- fputs(
" 8 Weird server reply. The server sent data curl couldn't parse.\n"
"\n"
-" 9 FTP access denied. The server denied login or denied access to\n"
-" the particular resource or directory you wanted to reach. Most\n"
-" often you tried to change to a directory that doesn't exist on\n"
-" the server.\n"
-"\n"
-" 10 FTP accept failed. While waiting for the server to connect back\n"
-" when an active FTP session is used, an error code was sent over\n"
+" 9 FTP access denied. The server denied login or denied access to\n"
+" the particular resource or directory you wanted to reach. Most\n"
, stdout);
fputs(
+" often you tried to change to a directory that doesn't exist on\n"
+" the server.\n"
+"\n"
+" 10 FTP accept failed. While waiting for the server to connect back\n"
+" when an active FTP session is used, an error code was sent over\n"
" the control connection or similar.\n"
"\n"
-" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
+" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
" PASS request.\n"
"\n"
-" 12 During an active FTP session while waiting for the server to\n"
+, stdout);
+ fputs(
+" 12 During an active FTP session while waiting for the server to\n"
" connect back to curl, the timeout expired.\n"
"\n"
-" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
+" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
" PASV request.\n"
"\n"
-" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
-, stdout);
- fputs(
+" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
" server sent.\n"
"\n"
-" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
+" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
" 227-line.\n"
"\n"
+, stdout);
+ fputs(
" 16 HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
" This is somewhat generic and can be one out of several problems,\n"
" see the error message for details.\n"
"\n"
-" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
+" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
" nary.\n"
"\n"
-, stdout);
- fputs(
" 18 Partial file. Only a part of the file was transferred.\n"
"\n"
-" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
+" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
" lar) command failed.\n"
"\n"
+, stdout);
+ fputs(
" 21 FTP quote error. A quote command returned error from the server.\n"
-" 22 HTTP page not retrieved. The requested url was not found or re-\n"
-" turned another error with the HTTP error code being 400 or\n"
+" 22 HTTP page not retrieved. The requested url was not found or re-\n"
+" turned another error with the HTTP error code being 400 or\n"
" above. This return code only appears if -f, --fail is used.\n"
"\n"
-, stdout);
- fputs(
-" 23 Write error. Curl couldn't write data to a local filesystem or\n"
+" 23 Write error. Curl couldn't write data to a local filesystem or\n"
" similar.\n"
"\n"
-" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
+" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
+, stdout);
+ fputs(
" used for FTP uploading.\n"
"\n"
" 26 Read error. Various reading problems.\n"
@@ -4242,26 +4132,26 @@ void hugehelp(void)
" 28 Operation timeout. The specified time-out period was reached ac-\n"
" cording to the conditions.\n"
"\n"
-, stdout);
- fputs(
-" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
-" support the PORT command, try doing a transfer using PASV in-\n"
+" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
+" support the PORT command, try doing a transfer using PASV in-\n"
" stead!\n"
"\n"
-" 31 FTP couldn't use REST. The REST command failed. This command is\n"
+, stdout);
+ fputs(
+" 31 FTP couldn't use REST. The REST command failed. This command is\n"
" used for resumed FTP transfers.\n"
"\n"
" 33 HTTP range error. The range \"command\" didn't work.\n"
"\n"
" 34 HTTP post error. Internal post-request generation error.\n"
"\n"
-, stdout);
- fputs(
" 35 SSL connect error. The SSL handshaking failed.\n"
"\n"
-" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
+" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
" load.\n"
"\n"
+, stdout);
+ fputs(
" 37 FILE couldn't read file. Failed to open the file. Permissions?\n"
"\n"
" 38 LDAP cannot bind. LDAP bind operation failed.\n"
@@ -4271,29 +4161,29 @@ void hugehelp(void)
" 41 Function not found. A required LDAP function was not found.\n"
"\n"
" 42 Aborted by callback. An application told curl to abort the oper-\n"
-, stdout);
- fputs(
" ation.\n"
"\n"
" 43 Internal error. A function was called with a bad parameter.\n"
"\n"
-" 45 Interface error. A specified outgoing interface could not be\n"
+, stdout);
+ fputs(
+" 45 Interface error. A specified outgoing interface could not be\n"
" used.\n"
"\n"
" 47 Too many redirects. When following redirects, curl hit the maxi-\n"
" mum amount.\n"
"\n"
-" 48 Unknown option specified to libcurl. This indicates that you\n"
-" passed a weird option to curl that was passed on to libcurl and\n"
-, stdout);
- fputs(
+" 48 Unknown option specified to libcurl. This indicates that you\n"
+" passed a weird option to curl that was passed on to libcurl and\n"
" rejected. Read up in the manual!\n"
"\n"
" 49 Malformed telnet option.\n"
"\n"
+, stdout);
+ fputs(
" 51 The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
-" 52 The server didn't reply anything, which here is considered an\n"
+" 52 The server didn't reply anything, which here is considered an\n"
" error.\n"
"\n"
" 53 SSL crypto engine not found.\n"
@@ -4304,13 +4194,13 @@ void hugehelp(void)
"\n"
" 56 Failure in receiving network data.\n"
"\n"
-, stdout);
- fputs(
" 58 Problem with the local certificate.\n"
"\n"
" 59 Couldn't use specified SSL cipher.\n"
"\n"
-" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
+, stdout);
+ fputs(
+" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
" cates.\n"
"\n"
" 61 Unrecognized transfer encoding.\n"
@@ -4325,11 +4215,11 @@ void hugehelp(void)
"\n"
" 66 Failed to initialise SSL Engine.\n"
"\n"
-, stdout);
- fputs(
-" 67 The user name, password, or similar was not accepted and curl\n"
+" 67 The user name, password, or similar was not accepted and curl\n"
" failed to log in.\n"
"\n"
+, stdout);
+ fputs(
" 68 File not found on TFTP server.\n"
"\n"
" 69 Permission problem on TFTP server.\n"
@@ -4346,31 +4236,31 @@ void hugehelp(void)
"\n"
" 75 Character conversion failed.\n"
"\n"
-, stdout);
- fputs(
" 76 Character conversion functions required.\n"
"\n"
" 77 Problem with reading the SSL CA cert (path? access rights?).\n"
"\n"
+, stdout);
+ fputs(
" 78 The resource referenced in the URL does not exist.\n"
"\n"
" 79 An unspecified error occurred during the SSH session.\n"
"\n"
" 80 Failed to shut down the SSL connection.\n"
"\n"
-" 82 Could not load CRL file, missing or wrong format (added in\n"
+" 82 Could not load CRL file, missing or wrong format (added in\n"
" 7.19.0).\n"
"\n"
" 83 Issuer check failed (added in 7.19.0).\n"
"\n"
-, stdout);
- fputs(
" 84 The FTP PRET command failed\n"
"\n"
" 85 RTSP: mismatch of CSeq numbers\n"
"\n"
" 86 RTSP: mismatch of Session Identifiers\n"
"\n"
+, stdout);
+ fputs(
" 87 unable to parse FTP file list\n"
"\n"
" 88 FTP chunk callback reported error\n"
@@ -4383,13 +4273,13 @@ void hugehelp(void)
"\n"
" 92 Stream error in HTTP/2 framing layer.\n"
"\n"
-, stdout);
- fputs(
" XX More error codes will appear here in future releases. The exist-\n"
" ing ones are meant to never change.\n"
"\n"
"AUTHORS / CONTRIBUTORS\n"
-" Daniel Stenberg is the main author, but the whole list of contributors\n"
+, stdout);
+ fputs(
+" Daniel Stenberg is the main author, but the whole list of contributors\n"
" is found in the separate THANKS file.\n"
"\n"
"WWW\n"
@@ -4415,3984 +4305,3898 @@ void hugehelp(void) {}
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
/* This mumbo-jumbo is the huge help text compressed with gzip.
- Thanks to this operation, the size of this data shrank from 170223
- to 47691 bytes. You can disable the use of compressed help
+ Thanks to this operation, the size of this data shrank from 165911
+ to 46657 bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
- 0x6b, 0x77, 0xdc, 0xc6, 0xb1, 0x2e, 0xfc, 0xdd, 0xbf, 0x02, 0x9b, 0x59,
- 0x39, 0x24, 0x4f, 0x66, 0x86, 0x37, 0x5d, 0x2c, 0x45, 0xce, 0xb6, 0x22,
- 0x51, 0x36, 0xb7, 0x29, 0x91, 0x47, 0x43, 0xd9, 0xce, 0x89, 0xbd, 0xb4,
- 0x30, 0x33, 0x18, 0x12, 0xd1, 0x0c, 0x30, 0x01, 0x30, 0xbc, 0x64, 0x9f,
- 0x9c, 0xdf, 0xfe, 0x76, 0x3d, 0x55, 0xd5, 0xdd, 0x40, 0x37, 0x86, 0xb4,
- 0x63, 0xfb, 0xdc, 0xde, 0xec, 0xb5, 0x2d, 0x89, 0x04, 0x1a, 0x7d, 0xa9,
- 0xae, 0x7b, 0x3d, 0x95, 0x24, 0xf7, 0xfd, 0xef, 0x23, 0xfe, 0xff, 0xa3,
- 0xf9, 0x9f, 0xf9, 0xf3, 0xb3, 0x24, 0x39, 0xaf, 0xca, 0xbf, 0x65, 0xd3,
- 0x26, 0xfe, 0xec, 0xc7, 0x8f, 0xff, 0x23, 0xe1, 0xff, 0x33, 0xef, 0xfc,
- 0x60, 0xfe, 0xfc, 0x6c, 0xe3, 0xd8, 0x7b, 0x89, 0x7b, 0xe1, 0x7f, 0x7c,
- 0xdc, 0x4d, 0xee, 0x7b, 0xe1, 0x7f, 0x24, 0x3b, 0x78, 0xe1, 0xa3, 0x7c,
- 0xe1, 0x05, 0xfd, 0xfd, 0xe3, 0xc7, 0xcd, 0x1f, 0xf9, 0x81, 0x66, 0x45,
- 0xff, 0xd9, 0xa3, 0xf7, 0x7e, 0xf8, 0x48, 0x7f, 0x35, 0x3f, 0xf9, 0xec,
- 0xb3, 0x77, 0x2f, 0xdf, 0x1e, 0xeb, 0xab, 0xd3, 0x75, 0xb5, 0x48, 0x86,
- 0x49, 0x53, 0xa5, 0x45, 0x3d, 0xcf, 0xaa, 0x24, 0x4d, 0x3e, 0xbc, 0x3f,
- 0xfd, 0xec, 0xb3, 0xf1, 0x5f, 0xde, 0x9d, 0x9d, 0x8f, 0x4f, 0xc6, 0xad,
- 0xc7, 0xfe, 0x5a, 0xae, 0x9a, 0xbc, 0x2c, 0x6a, 0x33, 0x7d, 0xf3, 0x50,
- 0xfd, 0xe3, 0x67, 0x9f, 0xbd, 0x3e, 0x1e, 0xbf, 0x7a, 0x7f, 0x72, 0x7e,
- 0x71, 0x72, 0xf6, 0xae, 0xf5, 0x64, 0x92, 0xd7, 0x89, 0x19, 0xaa, 0x29,
- 0xcb, 0x85, 0xf9, 0x8f, 0x1b, 0x7d, 0x96, 0x36, 0x69, 0x32, 0xaf, 0xca,
- 0x65, 0x52, 0x56, 0xf4, 0x8b, 0x34, 0xa9, 0xb3, 0xea, 0x3a, 0xab, 0x06,
- 0xc9, 0xba, 0xce, 0x8b, 0xcb, 0xa4, 0x2c, 0xb2, 0xa4, 0x9c, 0x27, 0xcd,
- 0x55, 0xa6, 0xc3, 0xd5, 0xeb, 0xd5, 0xaa, 0xac, 0x9a, 0x6c, 0x96, 0xac,
- 0xaa, 0xb2, 0x29, 0xa7, 0xe5, 0xa2, 0x4e, 0x76, 0x5e, 0x9f, 0xbc, 0xba,
- 0x18, 0x24, 0x6f, 0x4e, 0x4e, 0x8f, 0xcd, 0x7f, 0x2f, 0xce, 0xf1, 0x9f,
- 0xf1, 0x20, 0xf9, 0xea, 0xec, 0xfc, 0xeb, 0xe3, 0xf7, 0x83, 0xe4, 0xeb,
- 0x0b, 0xfa, 0x19, 0xfd, 0xd7, 0xfc, 0x30, 0x39, 0x79, 0xfb, 0xf2, 0x7c,
- 0xa0, 0xc3, 0xd1, 0x3f, 0xe8, 0x87, 0xa7, 0xaf, 0xcd, 0x0f, 0xf9, 0x0f,
- 0xfa, 0xe7, 0xf9, 0xd9, 0xf9, 0x91, 0xfc, 0x41, 0xff, 0x7c, 0x7f, 0xf1,
- 0xd6, 0xfc, 0xf6, 0xfd, 0xc5, 0xd8, 0xfc, 0x77, 0xfc, 0x8a, 0xfe, 0x83,
- 0xaf, 0x8c, 0xdf, 0xfe, 0x19, 0xff, 0x19, 0xdb, 0xe1, 0xc6, 0x6f, 0xf9,
- 0xe7, 0xf8, 0xd2, 0xc5, 0xf1, 0xe9, 0xbb, 0xe3, 0x8b, 0x24, 0x2d, 0x66,
- 0xc9, 0x85, 0x79, 0x7e, 0x77, 0x94, 0x5c, 0x5c, 0x65, 0xc9, 0xb4, 0x5c,
- 0x2e, 0xe9, 0x47, 0x66, 0x47, 0x66, 0x59, 0x9d, 0x5f, 0x16, 0x66, 0x29,
- 0x66, 0xe5, 0x37, 0x65, 0xf5, 0x29, 0x49, 0x6e, 0xf2, 0xe6, 0xaa, 0x5c,
- 0x37, 0x3a, 0xdc, 0xda, 0xec, 0x46, 0x92, 0x17, 0x4d, 0x56, 0xa5, 0x53,
- 0xda, 0xe9, 0xd1, 0x67, 0xad, 0x5d, 0x2d, 0xe7, 0x66, 0x0f, 0x6b, 0xb3,
- 0x69, 0x93, 0x75, 0xbd, 0x28, 0xd3, 0x19, 0x6d, 0x95, 0x79, 0x65, 0xbe,
- 0x36, 0x9b, 0x5c, 0xe5, 0xd3, 0x4f, 0x75, 0xb2, 0xc8, 0x3f, 0x65, 0xb4,
- 0x51, 0xb7, 0x77, 0xba, 0x71, 0x03, 0x1e, 0x34, 0x5d, 0x9b, 0x3d, 0x2d,
- 0x86, 0x3a, 0x5c, 0x93, 0x4f, 0x53, 0xfa, 0x00, 0x76, 0x2e, 0x59, 0xaf,
- 0x68, 0x34, 0xde, 0xb1, 0x64, 0x55, 0xd6, 0xe6, 0xa5, 0xf1, 0xf8, 0xd4,
- 0xcc, 0xbc, 0x28, 0x32, 0xcc, 0xa3, 0x1e, 0x98, 0x7f, 0x94, 0x9f, 0xf2,
- 0xcc, 0xfc, 0x65, 0x9e, 0x2f, 0xb2, 0x84, 0x4f, 0xd4, 0x0e, 0x47, 0x47,
- 0x9b, 0x54, 0x59, 0xbd, 0x5e, 0x66, 0x66, 0xf7, 0xde, 0x66, 0x4d, 0xba,
- 0xc8, 0x8b, 0x4f, 0xe6, 0xaf, 0xb4, 0xf0, 0x65, 0x59, 0x65, 0xa3, 0xe4,
- 0x65, 0x9d, 0xdc, 0x95, 0x6b, 0xb3, 0xe0, 0xc5, 0xc2, 0x9c, 0x79, 0x96,
- 0x4c, 0xb2, 0x45, 0x79, 0x33, 0xa0, 0x93, 0x4e, 0x8a, 0xf5, 0x72, 0x62,
- 0x06, 0x28, 0xe7, 0x6e, 0xb8, 0xb4, 0x59, 0x9b, 0xe1, 0xf8, 0xe9, 0x65,
- 0x6a, 0xd6, 0x64, 0xde, 0xad, 0x92, 0xab, 0xcc, 0xac, 0xb9, 0x5e, 0xe5,
- 0xc5, 0xbf, 0xb5, 0xf7, 0xc5, 0x6c, 0xed, 0xaa, 0xbc, 0xc9, 0x2a, 0xb3,
- 0xb3, 0x93, 0xbb, 0xc4, 0x6c, 0xc2, 0x84, 0x89, 0x70, 0x6e, 0x88, 0x2c,
- 0x49, 0xcd, 0x10, 0x96, 0x00, 0x87, 0x55, 0xb6, 0x48, 0x89, 0x98, 0xec,
- 0x37, 0x46, 0xe6, 0x10, 0x33, 0x4b, 0x6d, 0xf2, 0xea, 0xce, 0xd1, 0x2e,
- 0x5e, 0x9e, 0x99, 0x95, 0xe4, 0x8b, 0xda, 0x1c, 0x03, 0x5d, 0x0a, 0x79,
- 0x86, 0x0e, 0x95, 0xe8, 0xdf, 0xd0, 0xe6, 0x5d, 0xd1, 0xa4, 0xb7, 0xf8,
- 0xbc, 0xd0, 0xe6, 0x70, 0x96, 0xad, 0xb2, 0x62, 0x96, 0x15, 0xcd, 0x28,
- 0xf9, 0x4b, 0xb9, 0xde, 0x36, 0xdf, 0x9e, 0xe7, 0x66, 0x0f, 0x52, 0x19,
- 0xca, 0x7c, 0xd9, 0x10, 0xc1, 0xb4, 0xca, 0x57, 0xde, 0x51, 0x94, 0x85,
- 0x39, 0xf3, 0xe4, 0xfd, 0x9b, 0x57, 0xc9, 0xd1, 0xb3, 0xcf, 0x9f, 0xb8,
- 0x33, 0x37, 0x03, 0x24, 0xd3, 0xb4, 0x30, 0x2b, 0xce, 0xa6, 0xf9, 0xfc,
- 0x2e, 0x59, 0xae, 0x17, 0x4d, 0xbe, 0x32, 0xbb, 0x4f, 0x97, 0x8f, 0x2e,
- 0xd0, 0x2a, 0xad, 0x9a, 0x9a, 0x88, 0x00, 0x3f, 0xc0, 0xda, 0x6f, 0xaa,
- 0xbc, 0xa1, 0x8b, 0x84, 0xdf, 0x99, 0x19, 0x66, 0x4d, 0xad, 0xc3, 0x11,
- 0xad, 0x99, 0xef, 0x4c, 0x0c, 0x6d, 0x99, 0xad, 0x4d, 0x6b, 0xf3, 0xd1,
- 0xe7, 0x9f, 0x39, 0x0e, 0x72, 0xd5, 0x34, 0xab, 0xe7, 0x7b, 0x7b, 0x75,
- 0xde, 0x64, 0xa3, 0xff, 0x34, 0xf7, 0x70, 0xd0, 0xdc, 0x94, 0x83, 0xe6,
- 0xaa, 0xca, 0xb2, 0x7f, 0x8e, 0x0c, 0x0d, 0xdb, 0x27, 0xcd, 0x77, 0xef,
- 0x64, 0x62, 0x97, 0x59, 0x63, 0xbe, 0xf0, 0xf7, 0x75, 0x56, 0xd0, 0x88,
- 0x66, 0x1e, 0xe9, 0x62, 0x75, 0x95, 0x9a, 0xe3, 0xcc, 0x0c, 0x35, 0xd2,
- 0xcd, 0x36, 0x04, 0x43, 0xb3, 0xe2, 0xbb, 0xfd, 0xd7, 0x1f, 0xc3, 0x8f,
- 0xce, 0xf1, 0x4d, 0xf3, 0xdf, 0x51, 0x76, 0x9b, 0x2e, 0xcd, 0xda, 0xe8,
- 0x53, 0x7b, 0x44, 0x62, 0x7f, 0x3d, 0x18, 0x1e, 0xec, 0xef, 0xff, 0x38,
- 0x6a, 0x6e, 0x9b, 0x87, 0x3d, 0xbf, 0xbf, 0xef, 0xde, 0xa0, 0x47, 0x77,
- 0x68, 0xbd, 0xc9, 0xc2, 0x90, 0x0c, 0x7d, 0xfc, 0x1f, 0x59, 0x55, 0xd6,
- 0xbb, 0x0f, 0x1b, 0x29, 0x1d, 0xfe, 0xa3, 0xfd, 0xdd, 0x77, 0x59, 0x0d,
- 0x9a, 0x71, 0x6b, 0x4d, 0xd2, 0xca, 0xd0, 0x6d, 0xd9, 0x38, 0xf6, 0x34,
- 0x30, 0x97, 0xb2, 0xb1, 0x3b, 0x63, 0xee, 0x9c, 0x79, 0xda, 0x30, 0xb6,
- 0x74, 0x41, 0x3c, 0xad, 0x4e, 0x8a, 0xec, 0xd6, 0xde, 0x72, 0x73, 0xfb,
- 0xb3, 0x74, 0x7a, 0x95, 0x94, 0x86, 0xf8, 0xab, 0xc8, 0x11, 0xf8, 0x13,
- 0x4a, 0xab, 0xe9, 0x55, 0x7e, 0x6d, 0x76, 0xe3, 0xd9, 0xb3, 0x27, 0x43,
- 0xf3, 0x9f, 0x67, 0x3f, 0xee, 0x5d, 0x97, 0x0b, 0xb3, 0x39, 0x8f, 0x7e,
- 0xdc, 0xa3, 0x23, 0xfe, 0xcf, 0x74, 0x30, 0x19, 0x4c, 0xff, 0x39, 0xba,
- 0x6a, 0x96, 0x8b, 0x5e, 0xc2, 0x49, 0x0b, 0xf3, 0xff, 0xcb, 0x72, 0x5d,
- 0x34, 0x96, 0x58, 0x0c, 0xcd, 0x35, 0x1e, 0x73, 0x32, 0xd7, 0xd5, 0xdc,
- 0x51, 0x22, 0x6d, 0xa2, 0x21, 0xba, 0x75, 0xe6, 0x82, 0xba, 0xeb, 0xd8,
- 0x4c, 0xaf, 0x68, 0xfd, 0x86, 0x7a, 0x52, 0xd9, 0x84, 0x26, 0x4f, 0xe9,
- 0x66, 0x1a, 0x06, 0x41, 0x0c, 0x0b, 0x63, 0xf1, 0xd7, 0x72, 0xf3, 0x60,
- 0x59, 0xcd, 0xb2, 0x6a, 0xd4, 0x9d, 0x86, 0xbd, 0xb2, 0xde, 0x37, 0x13,
- 0x95, 0x28, 0xf4, 0x03, 0x4c, 0x6c, 0x99, 0xdf, 0x9a, 0x11, 0xc0, 0x30,
- 0x0b, 0x4c, 0x9c, 0x47, 0x4b, 0x68, 0xc6, 0xf8, 0x8c, 0xbe, 0xef, 0xae,
- 0xac, 0x99, 0x7a, 0x6b, 0xe9, 0xf8, 0xa8, 0x5b, 0x7c, 0x62, 0x0e, 0x6f,
- 0x65, 0xde, 0x5a, 0x13, 0x5f, 0xc5, 0xb5, 0xa6, 0x61, 0x0c, 0x43, 0xb8,
- 0x34, 0xe7, 0x62, 0xce, 0x82, 0xa8, 0x98, 0x8e, 0xea, 0x2e, 0x79, 0x67,
- 0x08, 0x86, 0x99, 0x91, 0x47, 0xec, 0x8b, 0xac, 0x69, 0xee, 0x3d, 0x26,
- 0x47, 0xb1, 0xcf, 0x0f, 0x02, 0xa2, 0xed, 0x7b, 0xde, 0xd0, 0xd9, 0xf3,
- 0xc3, 0xf6, 0xc3, 0xdf, 0x19, 0x26, 0xed, 0xae, 0x8b, 0xf9, 0xfa, 0x7f,
- 0xfe, 0xd3, 0xa3, 0xba, 0x1b, 0xfa, 0x6d, 0x5e, 0x5c, 0x97, 0x9f, 0xcc,
- 0x16, 0x41, 0x8a, 0xa6, 0xed, 0xdd, 0x24, 0x3e, 0xb4, 0x5c, 0x35, 0x56,
- 0x3c, 0x11, 0x39, 0x9a, 0x1f, 0x4d, 0xd2, 0xc9, 0xe2, 0x2e, 0xb9, 0x4a,
- 0xaf, 0x33, 0x5a, 0xef, 0xca, 0xd0, 0x29, 0xed, 0x80, 0x11, 0x1b, 0x0b,
- 0xf0, 0x31, 0x61, 0x0c, 0xb3, 0x72, 0x3d, 0x31, 0xcc, 0xe5, 0xef, 0xeb,
- 0xb2, 0xe1, 0x8d, 0x49, 0xaf, 0xcb, 0x7c, 0xd6, 0x92, 0xc5, 0x57, 0x19,
- 0x31, 0x34, 0xfa, 0x30, 0x84, 0x94, 0x61, 0xa8, 0x34, 0x53, 0x5c, 0xb4,
- 0xbc, 0x21, 0x71, 0x67, 0x58, 0x61, 0xba, 0xa8, 0xcb, 0x24, 0xb9, 0x2c,
- 0xe9, 0x96, 0x80, 0x01, 0x83, 0xcc, 0xcd, 0xa1, 0x5c, 0xa5, 0x24, 0xd5,
- 0x8c, 0x00, 0xb3, 0xf7, 0xa0, 0xca, 0xc0, 0x8b, 0x71, 0x52, 0xe9, 0x62,
- 0xc0, 0xd2, 0x8b, 0xde, 0x91, 0xad, 0x4a, 0xb6, 0xff, 0xcb, 0xf6, 0x20,
- 0xd9, 0xfe, 0xf7, 0x6d, 0xd0, 0xc3, 0xf6, 0x7f, 0xdd, 0x76, 0xe7, 0x6c,
- 0x94, 0xb1, 0xeb, 0x7c, 0x96, 0x31, 0x49, 0x9c, 0x9c, 0x5f, 0x3f, 0x49,
- 0xfe, 0x41, 0xba, 0x83, 0xe1, 0xb5, 0xd9, 0xad, 0x12, 0xa4, 0xae, 0xcd,
- 0xbc, 0x9d, 0x18, 0xa6, 0x9b, 0xae, 0x48, 0x89, 0xc8, 0xaa, 0xa9, 0xa1,
- 0xde, 0xf4, 0xd2, 0xd0, 0xab, 0x91, 0xc5, 0x3a, 0x1c, 0x8d, 0x4f, 0xaf,
- 0xf0, 0xb2, 0x0c, 0x83, 0x4c, 0x8a, 0x74, 0x69, 0x6e, 0xc4, 0x29, 0xcd,
- 0x28, 0x2f, 0xc2, 0xc3, 0xfc, 0xeb, 0x3c, 0xfb, 0x7c, 0xff, 0xf9, 0xf3,
- 0xa3, 0xdf, 0x1f, 0x3e, 0xce, 0x9a, 0xab, 0xfd, 0x1f, 0xf7, 0xec, 0x23,
- 0x27, 0x73, 0x6c, 0xbb, 0x92, 0x9f, 0x4e, 0xc2, 0x48, 0x79, 0x2b, 0x25,
- 0xcc, 0xfb, 0xe6, 0xef, 0xd9, 0x3c, 0xbf, 0x1d, 0xa8, 0xbe, 0xc4, 0x77,
- 0x2e, 0x35, 0xa4, 0x66, 0xce, 0x8f, 0x58, 0x84, 0x0e, 0x77, 0xb9, 0xce,
- 0x6a, 0xb3, 0x93, 0x37, 0x57, 0x69, 0x93, 0xd8, 0x01, 0xf8, 0x64, 0x97,
- 0xf9, 0xe5, 0x55, 0x93, 0xdc, 0xa4, 0x24, 0x6c, 0x4e, 0x1a, 0x1e, 0x82,
- 0xa4, 0xbc, 0x11, 0x31, 0xf3, 0xd4, 0xc8, 0x0a, 0x3a, 0x43, 0x88, 0xf4,
- 0x89, 0xd3, 0x30, 0x1a, 0x43, 0xe6, 0x7c, 0x20, 0x4e, 0x9d, 0x9a, 0xa4,
- 0x35, 0x5d, 0xda, 0xc2, 0x30, 0x87, 0xc6, 0xe8, 0x08, 0x6b, 0xfa, 0xd7,
- 0x95, 0xd1, 0x02, 0xb0, 0x07, 0x32, 0x51, 0x08, 0xca, 0x37, 0x74, 0x9c,
- 0x74, 0x36, 0x56, 0x78, 0x99, 0x43, 0x1a, 0xc8, 0x31, 0xdb, 0x37, 0x6a,
- 0x73, 0xe1, 0x0c, 0x67, 0xb2, 0x94, 0xb1, 0x45, 0x4c, 0x76, 0x8b, 0xd7,
- 0x89, 0x39, 0xa6, 0x35, 0x29, 0x0a, 0xac, 0x0e, 0x98, 0xc9, 0x7b, 0x8b,
- 0x35, 0x9b, 0x96, 0x7e, 0x22, 0x95, 0xa4, 0xa3, 0xf8, 0xe0, 0xb5, 0x59,
- 0x69, 0x88, 0xcc, 0xcc, 0xd6, 0x30, 0x63, 0x5a, 0x19, 0xb1, 0x58, 0xec,
- 0x0a, 0x88, 0xdc, 0x8c, 0x49, 0x3f, 0xcc, 0x1b, 0x92, 0x31, 0xd0, 0x61,
- 0xcd, 0x7c, 0xcd, 0xa6, 0x40, 0x11, 0x35, 0x8c, 0xda, 0x5b, 0x3f, 0xc4,
- 0xa3, 0x79, 0x36, 0xb9, 0x36, 0x5a, 0x8a, 0x51, 0x48, 0x33, 0xfb, 0x16,
- 0xe4, 0xf9, 0x94, 0x74, 0xa3, 0x85, 0xb9, 0x2f, 0xd3, 0xb2, 0xaa, 0x48,
- 0xdf, 0xa7, 0x13, 0x9c, 0x30, 0x13, 0x5d, 0x66, 0x46, 0x8d, 0xf0, 0xb7,
- 0x33, 0x27, 0x81, 0x66, 0xf8, 0x8b, 0xd1, 0x4b, 0xc0, 0x41, 0x8c, 0xfe,
- 0x00, 0x9e, 0x8f, 0x85, 0x63, 0x76, 0x34, 0xf6, 0x74, 0x9a, 0xad, 0x9a,
- 0x3a, 0xb6, 0x26, 0x3d, 0x70, 0x33, 0x9d, 0x2a, 0xa3, 0x9d, 0xf7, 0x95,
- 0x2e, 0xec, 0xab, 0x15, 0xfa, 0xd0, 0xbb, 0x54, 0x8f, 0x31, 0x7a, 0x58,
- 0x6d, 0x77, 0xad, 0x01, 0x6d, 0x18, 0x36, 0x86, 0x3d, 0x5f, 0xd2, 0x44,
- 0xe9, 0xe1, 0x9a, 0x6f, 0x2a, 0x58, 0x33, 0x1d, 0x24, 0x6b, 0xda, 0xfc,
- 0x5d, 0x12, 0x5d, 0x66, 0x3f, 0xed, 0xe0, 0xe6, 0xab, 0xf6, 0x4c, 0xe9,
- 0xf3, 0xa4, 0xe2, 0x1b, 0x49, 0x3e, 0xab, 0xaf, 0x8c, 0xf2, 0x55, 0xcb,
- 0xcd, 0xce, 0x97, 0x86, 0x66, 0xae, 0xe9, 0x7c, 0x57, 0x59, 0x36, 0x1b,
- 0x25, 0x67, 0x73, 0xe2, 0xaa, 0x95, 0x99, 0x74, 0x83, 0x5f, 0x93, 0x54,
- 0x31, 0xfb, 0x36, 0x83, 0x12, 0x6f, 0xaf, 0x16, 0x4f, 0xc5, 0x93, 0x0e,
- 0xe0, 0xe4, 0xa9, 0xf9, 0x89, 0x99, 0xed, 0xa2, 0x2d, 0x82, 0x70, 0x0f,
- 0x0d, 0xf7, 0xa6, 0xe9, 0x4d, 0xb2, 0x04, 0x94, 0x38, 0xc9, 0x9a, 0x9b,
- 0x2c, 0xb3, 0xc3, 0xd5, 0x99, 0x11, 0x7b, 0x74, 0x68, 0xac, 0xf9, 0x81,
- 0x19, 0xd2, 0xd6, 0x9e, 0xbf, 0x3f, 0xfb, 0xea, 0xfd, 0xf1, 0x78, 0x9c,
- 0xbc, 0x3d, 0xbe, 0x38, 0x7e, 0xdf, 0xda, 0xe9, 0xa2, 0xac, 0x96, 0x38,
- 0xd1, 0x59, 0x5e, 0xaf, 0x16, 0xe9, 0x1d, 0x1d, 0xb5, 0x59, 0xc9, 0x65,
- 0x45, 0x37, 0x6b, 0x99, 0x91, 0x54, 0x98, 0xad, 0xc1, 0xc9, 0x8c, 0x38,
- 0x32, 0xc7, 0x27, 0x1a, 0x2f, 0x31, 0x13, 0xa8, 0xc9, 0xc5, 0xa5, 0xdb,
- 0x69, 0xc3, 0x71, 0x44, 0x92, 0x92, 0x28, 0xb5, 0xe7, 0x41, 0xaa, 0x27,
- 0x8c, 0x9b, 0x81, 0xfb, 0x19, 0x6f, 0x13, 0x8b, 0x36, 0x43, 0xb3, 0xf9,
- 0x12, 0xcc, 0xce, 0xfc, 0xe9, 0xb4, 0xcd, 0x6c, 0x6e, 0x54, 0x6d, 0x23,
- 0x5d, 0xd9, 0x52, 0xe8, 0xce, 0x49, 0x67, 0x6b, 0xf5, 0x63, 0x43, 0x86,
- 0xc4, 0x9a, 0x69, 0x40, 0x9e, 0x0a, 0x7f, 0xc1, 0x32, 0x31, 0xa3, 0x93,
- 0x10, 0xef, 0x93, 0xc7, 0x56, 0x34, 0x85, 0xcc, 0x9c, 0xec, 0x8c, 0x87,
- 0xaf, 0xd7, 0x73, 0x5c, 0xe4, 0x64, 0xc7, 0x68, 0xe6, 0x6f, 0x8d, 0xb5,
- 0x64, 0x2c, 0x96, 0x41, 0x72, 0xbe, 0x8b, 0xf7, 0x0e, 0xf6, 0x0f, 0x1f,
- 0x31, 0x23, 0x18, 0xe9, 0x70, 0x6f, 0x3c, 0x46, 0x7c, 0xf0, 0x89, 0x8e,
- 0x97, 0x1f, 0xa2, 0xc1, 0x47, 0xc9, 0xc1, 0x5b, 0xfe, 0xc9, 0xa3, 0xcf,
- 0x1f, 0x3f, 0x7d, 0x22, 0x3f, 0x6c, 0x13, 0xb8, 0x9d, 0x3f, 0xa8, 0x03,
- 0x96, 0x1f, 0x99, 0x82, 0x66, 0x26, 0x66, 0x75, 0xcb, 0xbc, 0x30, 0xd7,
- 0xc4, 0x5c, 0x2b, 0xe1, 0x55, 0x44, 0xcf, 0x66, 0xf2, 0x73, 0xe6, 0x6c,
- 0x72, 0xae, 0x6d, 0x93, 0xd2, 0xbc, 0x6c, 0x48, 0xd6, 0xf0, 0x72, 0x7b,
- 0x48, 0xac, 0x26, 0x34, 0x34, 0x91, 0x74, 0x42, 0x0c, 0x96, 0xec, 0x2a,
- 0xa3, 0x00, 0x67, 0xd1, 0xaf, 0x59, 0xa9, 0x68, 0xde, 0x30, 0x73, 0x33,
- 0x32, 0x91, 0xc4, 0x5c, 0xb8, 0xef, 0x86, 0x15, 0x80, 0x43, 0xde, 0xe4,
- 0x35, 0x58, 0xc3, 0x4d, 0xb9, 0x5e, 0x18, 0x2b, 0x86, 0x1e, 0x58, 0xaf,
- 0xf0, 0x82, 0xf9, 0xd4, 0xca, 0xf1, 0x00, 0xa3, 0xb1, 0x10, 0xed, 0x74,
- 0x47, 0x31, 0x53, 0x33, 0xff, 0x5c, 0x19, 0x52, 0xe2, 0xe9, 0x8c, 0xba,
- 0x12, 0x02, 0xbc, 0x2f, 0xa0, 0x44, 0xba, 0xf3, 0x60, 0xda, 0xe7, 0x67,
- 0xe3, 0x0b, 0xd2, 0x00, 0xce, 0x3f, 0x5c, 0x98, 0x81, 0x8c, 0x0a, 0x50,
- 0x37, 0x86, 0x28, 0xe9, 0xc5, 0x22, 0x83, 0x09, 0xa9, 0xc3, 0x19, 0xda,
- 0xcb, 0xc1, 0xa8, 0xa0, 0xd6, 0xe8, 0x27, 0x79, 0x8e, 0x6c, 0x63, 0xd3,
- 0x15, 0x54, 0x0b, 0x9b, 0x65, 0xb8, 0x7d, 0x27, 0xd9, 0xf9, 0xd3, 0xae,
- 0xa1, 0xd9, 0x61, 0x69, 0x77, 0x67, 0x38, 0x94, 0x57, 0xcd, 0xb7, 0xeb,
- 0x7c, 0x99, 0x2f, 0xd2, 0xca, 0x9b, 0x3a, 0x73, 0x54, 0xba, 0x9f, 0x96,
- 0xaf, 0x4c, 0x0d, 0xd5, 0x60, 0xda, 0xce, 0x94, 0xa4, 0x3d, 0x04, 0x57,
- 0x72, 0x47, 0x35, 0x23, 0x85, 0x00, 0x1a, 0xf3, 0x2a, 0xb7, 0x5b, 0x47,
- 0x67, 0x46, 0xec, 0xaa, 0xb5, 0x51, 0xdd, 0x73, 0x0b, 0x36, 0x8e, 0x24,
- 0x12, 0x3c, 0x15, 0x76, 0xeb, 0x92, 0xad, 0x49, 0x5a, 0x6d, 0x25, 0x96,
- 0x17, 0xf3, 0xdd, 0xa4, 0x1b, 0x52, 0x65, 0x97, 0x6b, 0xb3, 0x82, 0x84,
- 0x77, 0x97, 0x56, 0xfa, 0x3b, 0x6f, 0xa5, 0x3a, 0xc0, 0x70, 0x42, 0x8f,
- 0xe4, 0x35, 0x9b, 0x99, 0x73, 0x63, 0xb7, 0xd0, 0xa5, 0x51, 0xfd, 0x15,
- 0x1a, 0x8d, 0x50, 0x4c, 0x84, 0x60, 0x3c, 0xbd, 0xd6, 0x5c, 0x95, 0x26,
- 0x33, 0x8c, 0x06, 0xec, 0x9f, 0x9e, 0x1c, 0x9a, 0x23, 0x1b, 0x0e, 0x6b,
- 0xb3, 0xff, 0xa4, 0x7b, 0xaf, 0xc4, 0xa6, 0x3f, 0x83, 0xc3, 0xc4, 0xfa,
- 0x56, 0xce, 0x44, 0x07, 0x86, 0xd8, 0xe4, 0x77, 0xc1, 0x42, 0x8d, 0xa2,
- 0x7a, 0x63, 0x3e, 0x9c, 0x9a, 0x23, 0x33, 0x17, 0xee, 0x2d, 0x6d, 0x14,
- 0xfb, 0x46, 0x12, 0xab, 0x36, 0x83, 0x32, 0x72, 0xba, 0xf7, 0xa9, 0xd3,
- 0x65, 0x66, 0xb3, 0x9c, 0x7e, 0x6b, 0xee, 0x97, 0x91, 0x70, 0xeb, 0x0c,
- 0xb6, 0x87, 0x6c, 0xea, 0xd2, 0x6d, 0x26, 0xcc, 0xd8, 0xfa, 0xaa, 0x24,
- 0x33, 0x71, 0x8b, 0x79, 0xf1, 0x90, 0xbe, 0xb5, 0x05, 0x79, 0xbe, 0x4c,
- 0xf4, 0x5b, 0xf2, 0x29, 0xb3, 0x8e, 0x99, 0xaf, 0x9b, 0x0d, 0x8c, 0xa0,
- 0xb9, 0xf3, 0x8c, 0x04, 0xf0, 0x6a, 0x9e, 0x7b, 0x65, 0x15, 0x1e, 0x23,
- 0x52, 0x57, 0xa4, 0x4c, 0x09, 0x0f, 0x87, 0x30, 0xc4, 0x95, 0xad, 0x79,
- 0x6a, 0x03, 0xb3, 0xb7, 0xf4, 0xe4, 0xe5, 0x95, 0x3e, 0xea, 0x09, 0xd6,
- 0xd4, 0x2c, 0x8e, 0x84, 0x03, 0xd9, 0xd3, 0x33, 0xe5, 0xfb, 0x65, 0xc5,
- 0xcc, 0x6c, 0x51, 0x1a, 0x5a, 0xde, 0x62, 0x95, 0x55, 0xa6, 0x4d, 0xb3,
- 0xa6, 0x59, 0xd2, 0x8e, 0xb3, 0x9f, 0xa9, 0xb4, 0x67, 0x63, 0x27, 0x2d,
- 0xfb, 0x55, 0xdf, 0x3b, 0x35, 0xb7, 0x51, 0x63, 0xec, 0x91, 0x11, 0x9d,
- 0x35, 0xd1, 0xb1, 0xee, 0x3c, 0xc8, 0xdb, 0x88, 0xba, 0xed, 0x86, 0xef,
- 0x23, 0x6c, 0xac, 0xce, 0xce, 0xd7, 0x20, 0x1f, 0x11, 0x64, 0x76, 0x65,
- 0x66, 0x45, 0xb3, 0x3c, 0x05, 0x9d, 0xf0, 0xd1, 0x40, 0x19, 0x71, 0x16,
- 0x61, 0x44, 0x0f, 0xbe, 0xeb, 0x1a, 0x74, 0x8b, 0x85, 0x2f, 0x92, 0x74,
- 0x4e, 0xc3, 0x33, 0xb3, 0xf6, 0x53, 0xac, 0x63, 0x78, 0x9d, 0xd0, 0xf5,
- 0x33, 0x66, 0x03, 0xdd, 0xc5, 0xe1, 0xd9, 0xe9, 0xb5, 0x77, 0x8d, 0xc8,
- 0x72, 0x2f, 0x48, 0x4f, 0x19, 0xc0, 0x3b, 0x32, 0x29, 0x4b, 0x63, 0x26,
- 0xbb, 0xa5, 0x91, 0x3c, 0xc8, 0x0a, 0xa2, 0x76, 0x39, 0x51, 0xc3, 0x12,
- 0x56, 0x96, 0xdf, 0xde, 0x19, 0x73, 0x29, 0xbd, 0x4c, 0x73, 0x4b, 0x6f,
- 0x72, 0x33, 0x66, 0x89, 0x3e, 0x5c, 0x94, 0xf2, 0x3c, 0x1d, 0x15, 0xa9,
- 0x40, 0xc2, 0xb7, 0xd6, 0x35, 0x5f, 0x1f, 0xb3, 0x2a, 0xc3, 0x79, 0xc0,
- 0x3b, 0x64, 0x5c, 0x52, 0x1b, 0x75, 0xb8, 0x09, 0x14, 0x65, 0xd2, 0x39,
- 0xc1, 0x7c, 0xa1, 0x41, 0x9a, 0x11, 0xb7, 0x46, 0xc9, 0xd7, 0xe5, 0x4d,
- 0x06, 0x5f, 0x21, 0xf4, 0xfb, 0x9c, 0xbc, 0x5d, 0x46, 0x15, 0xbc, 0xc9,
- 0x92, 0xa5, 0x51, 0x3d, 0xcd, 0x6e, 0x42, 0xfb, 0xc0, 0xcf, 0x3c, 0xf3,
- 0xd0, 0x50, 0xf8, 0x0d, 0xef, 0x92, 0x5d, 0x85, 0x3d, 0xca, 0x39, 0x5f,
- 0x89, 0x64, 0x07, 0xea, 0xcd, 0x94, 0x76, 0x6b, 0xd5, 0xb8, 0x55, 0xd8,
- 0x0d, 0xb9, 0x49, 0x6b, 0xef, 0x72, 0x65, 0x30, 0x4d, 0x9f, 0x8e, 0x0e,
- 0x9e, 0x8d, 0xf6, 0x47, 0xc6, 0x10, 0xc9, 0xae, 0xf3, 0x72, 0x5d, 0x9b,
- 0x4f, 0xd3, 0x34, 0xdc, 0x3b, 0x19, 0xdd, 0xca, 0xa6, 0xbc, 0xbc, 0x5c,
- 0xb0, 0xce, 0xb3, 0x57, 0xce, 0xe7, 0xac, 0xfb, 0x18, 0x4d, 0xcf, 0xea,
- 0xcf, 0x6c, 0x01, 0xd1, 0xce, 0xc8, 0x75, 0x63, 0x96, 0x1a, 0x9a, 0xc8,
- 0x23, 0xe7, 0xbc, 0x18, 0x0e, 0xd3, 0x49, 0xdd, 0x90, 0x31, 0x35, 0x5c,
- 0x17, 0xf9, 0xed, 0xb0, 0x2e, 0xa7, 0x9f, 0xcc, 0xa1, 0xbc, 0x58, 0xa5,
- 0xcd, 0xd5, 0x9f, 0x3a, 0x2e, 0xe1, 0x1d, 0x92, 0x25, 0xbb, 0x49, 0xf2,
- 0x8a, 0xd5, 0x4a, 0xda, 0x89, 0x8a, 0xef, 0x9b, 0x39, 0x4d, 0x19, 0x25,
- 0xf9, 0x60, 0x46, 0x31, 0xb4, 0xbc, 0x34, 0x87, 0x9a, 0xf0, 0x60, 0x03,
- 0x65, 0xa5, 0x9d, 0xe1, 0xe0, 0x70, 0x24, 0x31, 0x02, 0xbf, 0x9d, 0xb9,
- 0x3a, 0x65, 0xf5, 0xc9, 0x28, 0xda, 0xef, 0x8c, 0xc9, 0xf8, 0x9c, 0xfe,
- 0x6d, 0x58, 0x58, 0x83, 0x2d, 0x17, 0xc9, 0x6a, 0x66, 0xc4, 0xcc, 0x98,
- 0x2c, 0xf2, 0x74, 0x32, 0xec, 0x0c, 0x27, 0xdf, 0x97, 0x8f, 0x26, 0x6a,
- 0x6b, 0x28, 0x29, 0x25, 0xdb, 0x5f, 0x1a, 0xfb, 0xef, 0x8a, 0x8f, 0x1d,
- 0x03, 0xf2, 0x1a, 0x0d, 0x85, 0x5e, 0x1a, 0x0b, 0xa2, 0x68, 0xba, 0xc3,
- 0x5d, 0x41, 0x54, 0x93, 0x94, 0x61, 0x63, 0x17, 0x44, 0x22, 0x1e, 0x20,
- 0x6b, 0x7f, 0x8e, 0x3e, 0xeb, 0xbc, 0xf6, 0xd2, 0x9d, 0xe9, 0xe3, 0x23,
- 0x73, 0xa6, 0xfe, 0x46, 0x2f, 0x9a, 0x61, 0x7d, 0x3d, 0x4d, 0x5e, 0x40,
- 0xfb, 0x26, 0x32, 0x8d, 0x6e, 0xf0, 0x78, 0x37, 0xf9, 0xee, 0xe5, 0xfb,
- 0x77, 0x27, 0xef, 0xbe, 0x7a, 0xce, 0x1f, 0x15, 0x4a, 0x33, 0x7f, 0xcb,
- 0x6e, 0x57, 0xe4, 0x07, 0xa3, 0xd9, 0x1a, 0x51, 0x96, 0x24, 0xaf, 0x4b,
- 0xd8, 0x23, 0x60, 0x98, 0x24, 0xb0, 0x3a, 0xc3, 0x19, 0xd1, 0x32, 0x5b,
- 0x77, 0x7c, 0xbf, 0x96, 0x61, 0xbb, 0x81, 0xf9, 0x7a, 0xf2, 0x26, 0xeb,
- 0x1c, 0x0d, 0x7f, 0x64, 0xf7, 0x31, 0xf4, 0xa5, 0x11, 0x49, 0x4b, 0x98,
- 0xf9, 0x3a, 0xf3, 0xee, 0x97, 0x4a, 0x63, 0xec, 0xb2, 0x9d, 0x6f, 0xc6,
- 0xbb, 0x35, 0xd7, 0x86, 0x76, 0x49, 0x07, 0x9b, 0x1a, 0x76, 0x94, 0x89,
- 0xe2, 0x00, 0x56, 0x07, 0xb3, 0x41, 0x58, 0xd9, 0x28, 0x79, 0x39, 0xef,
- 0x1e, 0x25, 0xe9, 0x2e, 0xa4, 0xd5, 0xab, 0x14, 0x9c, 0x39, 0x45, 0x98,
- 0xbd, 0xbc, 0x3c, 0xa2, 0x0e, 0x53, 0x9b, 0xf3, 0x99, 0xa9, 0xa4, 0xa7,
- 0xcf, 0x74, 0x86, 0x83, 0xe9, 0x09, 0x36, 0x43, 0x4a, 0x61, 0x4e, 0x07,
- 0x4a, 0xa6, 0x9f, 0x61, 0xd4, 0xcb, 0x72, 0x06, 0x3b, 0x22, 0xd8, 0x9f,
- 0xb1, 0x75, 0xf8, 0x6c, 0x6d, 0xb9, 0x55, 0x27, 0x3b, 0xe4, 0xfa, 0x33,
- 0x54, 0x50, 0x5c, 0x36, 0x57, 0xbb, 0xce, 0xad, 0x41, 0x6a, 0x8a, 0x59,
- 0xf0, 0x9e, 0x99, 0x08, 0xd6, 0x5d, 0x74, 0x49, 0x1d, 0x6e, 0x67, 0x68,
- 0x9e, 0x7f, 0x5b, 0xd7, 0x0d, 0xac, 0x21, 0x11, 0xff, 0xbc, 0x12, 0x33,
- 0xb3, 0x65, 0xb6, 0x2c, 0xab, 0xbb, 0x60, 0x22, 0x27, 0x50, 0x3e, 0xc8,
- 0xf0, 0x94, 0xd3, 0x22, 0x3a, 0x80, 0x7c, 0x54, 0x97, 0x20, 0x19, 0x01,
- 0xe4, 0x53, 0xb7, 0x76, 0x20, 0x94, 0x26, 0xc3, 0x80, 0x8c, 0xfd, 0xed,
- 0x1c, 0xb6, 0x6a, 0x40, 0xc1, 0xd1, 0xc3, 0xb6, 0xbd, 0x58, 0x53, 0x13,
- 0x71, 0xe1, 0xd0, 0xff, 0x2f, 0x52, 0xe2, 0x3a, 0x45, 0xd6, 0x3a, 0x21,
- 0x48, 0x0f, 0x5e, 0xda, 0x26, 0x72, 0x7f, 0xf2, 0x68, 0x74, 0xd0, 0x22,
- 0xf7, 0xe2, 0x8e, 0x02, 0x05, 0x71, 0x1e, 0x72, 0x61, 0x14, 0xc7, 0x9a,
- 0xe7, 0x6c, 0x76, 0x71, 0x9e, 0x5f, 0xae, 0xab, 0x8c, 0x35, 0x38, 0xc4,
- 0x16, 0x34, 0xa4, 0x40, 0x4a, 0xd1, 0x55, 0x09, 0x4f, 0xbc, 0x11, 0xa6,
- 0xd9, 0x62, 0x3e, 0xe8, 0x0c, 0x07, 0xf3, 0x05, 0xd4, 0x4f, 0xd3, 0x07,
- 0xd3, 0x34, 0x66, 0x0a, 0x06, 0x2b, 0x32, 0x51, 0x62, 0x97, 0x86, 0xa1,
- 0x24, 0xe4, 0x8a, 0x4e, 0xa6, 0x8b, 0x34, 0x5f, 0x82, 0x4c, 0xc5, 0xd5,
- 0x3a, 0x8a, 0x5d, 0x0b, 0x32, 0x30, 0xe8, 0xed, 0x09, 0x99, 0xbe, 0x55,
- 0x4d, 0x92, 0x19, 0xa7, 0xaa, 0x9a, 0x33, 0x1b, 0x96, 0x57, 0xd9, 0xf4,
- 0x93, 0x32, 0x2f, 0x55, 0x39, 0xbb, 0x74, 0x4c, 0x31, 0x06, 0xd8, 0xd7,
- 0xe6, 0xa9, 0x75, 0x4d, 0xd7, 0xa4, 0xae, 0x73, 0x72, 0x9f, 0x91, 0x39,
- 0xb8, 0x9e, 0xc2, 0x4a, 0xc4, 0x85, 0x31, 0xd4, 0xad, 0x1c, 0x30, 0x31,
- 0x2c, 0xb5, 0x98, 0x0d, 0x9b, 0x2a, 0x5f, 0xf5, 0xcd, 0x8e, 0x4f, 0xa5,
- 0xad, 0xa0, 0xd6, 0x62, 0xb1, 0xc3, 0x18, 0x66, 0xf3, 0x78, 0x9a, 0x74,
- 0x76, 0xb3, 0x4b, 0x94, 0xd8, 0xdb, 0x01, 0xf9, 0x83, 0x72, 0xa3, 0x2f,
- 0xb0, 0xb1, 0x04, 0x77, 0xa7, 0x31, 0x8d, 0x44, 0x70, 0x19, 0x2b, 0x2e,
- 0x9f, 0x42, 0x09, 0xca, 0x2f, 0x33, 0x8a, 0xe5, 0x18, 0x59, 0xd6, 0x2c,
- 0x8c, 0x6a, 0x14, 0xd2, 0xb8, 0xf9, 0x4d, 0x76, 0x59, 0x36, 0xa4, 0x8d,
- 0x04, 0x64, 0xf2, 0x01, 0x7c, 0xde, 0xd2, 0x84, 0xaa, 0xfd, 0xbe, 0x4e,
- 0x96, 0xb3, 0x3e, 0x6e, 0x3e, 0xcd, 0x6a, 0xbf, 0x78, 0x1c, 0xea, 0xc6,
- 0xdc, 0xac, 0xee, 0xa9, 0x9b, 0xd1, 0xa6, 0x19, 0x6c, 0x2f, 0x28, 0x8e,
- 0xaa, 0xb7, 0xaa, 0xc2, 0x4f, 0x2c, 0x81, 0x74, 0xe4, 0xe6, 0x26, 0x9f,
- 0x66, 0xea, 0x8e, 0x13, 0x1f, 0xf5, 0x22, 0x0f, 0x59, 0xfd, 0x92, 0xee,
- 0xa4, 0x79, 0x89, 0x75, 0x72, 0xf2, 0x9e, 0xdc, 0xe4, 0xa4, 0xb3, 0x0b,
- 0xd3, 0x83, 0x4a, 0x26, 0xe2, 0x20, 0xad, 0x72, 0xb8, 0x8a, 0xcc, 0x70,
- 0x32, 0x4f, 0xcf, 0xa2, 0xf7, 0xef, 0x18, 0xcf, 0x1b, 0xef, 0x8b, 0x19,
- 0xe3, 0xcc, 0x17, 0x5c, 0xae, 0x79, 0x9a, 0x2f, 0x22, 0xfb, 0x04, 0x46,
- 0x76, 0x99, 0xc1, 0xab, 0xc6, 0x67, 0xb0, 0xa6, 0x4d, 0xa7, 0xb8, 0x5b,
- 0xc8, 0xa4, 0xb2, 0x8c, 0xed, 0x09, 0x18, 0x1f, 0xb7, 0x77, 0x76, 0x7b,
- 0xa1, 0xb4, 0xf1, 0xd9, 0xc9, 0xdf, 0xf9, 0xf8, 0xbc, 0xeb, 0x99, 0xd2,
- 0xa8, 0xe9, 0x8a, 0x02, 0x4c, 0xdd, 0x1b, 0x4a, 0xa6, 0x17, 0xc5, 0x28,
- 0x77, 0xd5, 0x83, 0x9c, 0x89, 0xff, 0xdc, 0xc6, 0xf6, 0xc0, 0x90, 0x88,
- 0xa7, 0xc9, 0x15, 0xe6, 0x71, 0x84, 0x03, 0x77, 0x79, 0xb9, 0x91, 0xaf,
- 0x46, 0x1c, 0x83, 0x87, 0xb6, 0x28, 0xb6, 0x34, 0xec, 0xcb, 0x46, 0x98,
- 0xc8, 0xe3, 0x2b, 0xbc, 0x0e, 0x86, 0x16, 0xee, 0x6c, 0x8c, 0x97, 0x93,
- 0xe9, 0x47, 0x7a, 0x32, 0x4b, 0x99, 0x41, 0xc2, 0x7a, 0x1d, 0x33, 0xab,
- 0x29, 0xfb, 0x80, 0x45, 0x87, 0x60, 0x51, 0x83, 0xa9, 0xce, 0x17, 0xe9,
- 0x25, 0xdc, 0x6b, 0x97, 0xdd, 0x1b, 0x5a, 0x94, 0x12, 0xe8, 0xab, 0x4b,
- 0xc3, 0xde, 0x69, 0xd5, 0xe2, 0xda, 0xaa, 0x93, 0x1d, 0x43, 0x64, 0x8b,
- 0x35, 0xc4, 0xfd, 0x99, 0x59, 0xde, 0x78, 0xfc, 0xf5, 0xae, 0xcf, 0xde,
- 0xb0, 0xbb, 0x0f, 0x61, 0x6e, 0xc4, 0x9d, 0x60, 0x84, 0xff, 0x99, 0xcf,
- 0xa3, 0xcd, 0xe0, 0xac, 0x75, 0xe7, 0x6b, 0x72, 0x4a, 0x97, 0xb4, 0x0a,
- 0x72, 0x85, 0x8e, 0xec, 0xd5, 0xa7, 0x27, 0xd5, 0x23, 0xcb, 0x84, 0xdd,
- 0x52, 0x10, 0xd6, 0xf5, 0x1a, 0xce, 0x29, 0xc8, 0xe3, 0xee, 0x70, 0x86,
- 0xd9, 0x1b, 0x56, 0xb4, 0x2e, 0xe8, 0x4f, 0xab, 0x43, 0xe7, 0xb0, 0xe6,
- 0xe8, 0x2c, 0x2a, 0x72, 0x81, 0x93, 0x1d, 0x6c, 0x75, 0x50, 0xc3, 0x53,
- 0x74, 0x6c, 0xda, 0xcb, 0xee, 0x25, 0x34, 0x1a, 0x1a, 0xd8, 0x8d, 0x11,
- 0xa1, 0x46, 0x30, 0xd3, 0x85, 0xeb, 0xe1, 0xde, 0x3b, 0xf5, 0xda, 0xf0,
- 0x17, 0x32, 0x1d, 0x84, 0x79, 0x10, 0x3d, 0x76, 0x67, 0xc7, 0xec, 0xc5,
- 0x48, 0x1a, 0x8f, 0x8f, 0xec, 0xfe, 0xd2, 0x17, 0x04, 0x87, 0xe6, 0x9f,
- 0xa2, 0x11, 0xbf, 0x99, 0x31, 0xc8, 0xa0, 0x92, 0x05, 0xda, 0xd8, 0xc5,
- 0xe9, 0x38, 0x76, 0x98, 0xed, 0xf8, 0x14, 0xbd, 0x4f, 0xcc, 0x96, 0xdc,
- 0x88, 0xec, 0x56, 0x2d, 0xc9, 0x28, 0xf0, 0x62, 0x54, 0xbe, 0xbf, 0x6f,
- 0x95, 0x51, 0x30, 0x8b, 0xed, 0x65, 0x0e, 0x7e, 0x13, 0x03, 0x23, 0x61,
- 0x4d, 0xda, 0x89, 0x75, 0xa1, 0xbe, 0x7a, 0xe9, 0x8f, 0x0b, 0x9f, 0x69,
- 0xf7, 0x22, 0x78, 0xbf, 0xdf, 0xa9, 0x77, 0x2d, 0x0f, 0x33, 0xa3, 0x9c,
- 0x1f, 0xbf, 0x85, 0xfd, 0x9a, 0x1a, 0xba, 0x79, 0xa7, 0xee, 0x4a, 0x8d,
- 0x6d, 0x4f, 0xd6, 0xf9, 0xa2, 0x15, 0x13, 0x70, 0x26, 0x37, 0x02, 0xcb,
- 0x4c, 0x5a, 0x98, 0x1a, 0x47, 0xb7, 0x72, 0xb8, 0x87, 0xbb, 0x84, 0xd6,
- 0xdc, 0xad, 0xc4, 0xb3, 0xbd, 0xae, 0x5b, 0x0e, 0x24, 0x95, 0xcb, 0x8b,
- 0x06, 0x5a, 0x36, 0xd9, 0xb5, 0xde, 0x98, 0xc1, 0x09, 0x61, 0x5a, 0x24,
- 0x06, 0x2e, 0x8b, 0xfc, 0x1f, 0xa2, 0x83, 0x66, 0xc5, 0x75, 0x5e, 0x95,
- 0x05, 0x69, 0xb9, 0xc6, 0xf4, 0xad, 0x72, 0xb0, 0x65, 0x52, 0xbf, 0x0c,
- 0xe3, 0xd8, 0x7e, 0xf5, 0xe1, 0xfd, 0xe9, 0xc7, 0x57, 0x2f, 0x3f, 0xfe,
- 0xf9, 0xc3, 0xbb, 0xd7, 0xa7, 0xc7, 0xdb, 0x9d, 0xe1, 0xc8, 0xe7, 0x97,
- 0x8b, 0xa3, 0xbe, 0x26, 0xcb, 0x03, 0x97, 0xc4, 0x4c, 0x91, 0x47, 0xbe,
- 0xcc, 0xaf, 0x0d, 0x43, 0x83, 0x21, 0x01, 0x1f, 0x3d, 0xfe, 0x06, 0xaf,
- 0x96, 0x6c, 0x78, 0x67, 0xb8, 0xc9, 0x9a, 0xf4, 0xb4, 0x51, 0x4b, 0x5b,
- 0xd6, 0xab, 0x22, 0x56, 0xbb, 0x4e, 0x30, 0xa2, 0x61, 0x93, 0x16, 0x55,
- 0xcc, 0xc8, 0x7c, 0xf1, 0x8c, 0x44, 0xcf, 0x5d, 0xbf, 0x6e, 0x8c, 0x95,
- 0xa4, 0x01, 0x02, 0xa3, 0xb5, 0x95, 0x9f, 0x34, 0xcb, 0xc0, 0x98, 0x58,
- 0x2f, 0x23, 0xc7, 0x5d, 0x3b, 0x4d, 0x74, 0x96, 0x6c, 0xd3, 0x48, 0x86,
- 0x7e, 0x87, 0x32, 0xc9, 0x69, 0xd5, 0x18, 0xfb, 0x26, 0xcb, 0x71, 0x31,
- 0x34, 0x8a, 0x4a, 0x3a, 0x2b, 0x9c, 0x73, 0x81, 0x86, 0x6d, 0x74, 0x4d,
- 0xda, 0x03, 0x68, 0xf7, 0xd9, 0x6d, 0x86, 0x9b, 0x27, 0x6f, 0xbd, 0x5a,
- 0x57, 0xb8, 0xcd, 0xdf, 0x19, 0x6d, 0x84, 0xb8, 0xdf, 0x6b, 0x78, 0xf7,
- 0xcc, 0x0b, 0xfa, 0x90, 0x11, 0x33, 0x5d, 0x91, 0x57, 0x2e, 0x28, 0xae,
- 0x9a, 0xc2, 0x93, 0x02, 0xbf, 0xd7, 0xf9, 0xcb, 0x8b, 0xaf, 0xa3, 0xca,
- 0xac, 0x4b, 0xe9, 0x11, 0x52, 0x84, 0x62, 0x5e, 0x37, 0x72, 0x41, 0xde,
- 0x8d, 0xc7, 0x09, 0x12, 0x46, 0x16, 0xf9, 0xa4, 0x4a, 0xe9, 0x9b, 0xf4,
- 0x63, 0xfa, 0xa9, 0x21, 0xeb, 0xce, 0x70, 0xe7, 0xdf, 0xbc, 0x1a, 0xff,
- 0xee, 0xe0, 0x80, 0xb4, 0xf8, 0xb5, 0xd9, 0x97, 0x1d, 0xf3, 0x4a, 0x51,
- 0x9b, 0x9b, 0xb9, 0x1c, 0xd5, 0xe5, 0x2e, 0xc4, 0x76, 0x2d, 0xea, 0x40,
- 0x7a, 0x6d, 0xa4, 0x2d, 0xe8, 0x48, 0x89, 0xda, 0x1c, 0x67, 0xb0, 0x27,
- 0x60, 0x74, 0x92, 0x4d, 0x63, 0xf8, 0x85, 0x91, 0xd7, 0x8b, 0x50, 0x21,
- 0xdf, 0xc9, 0xcf, 0xc6, 0x92, 0x8b, 0x92, 0x4e, 0xcd, 0x5f, 0xc9, 0x51,
- 0xb0, 0x4b, 0x2b, 0x6b, 0xdf, 0x30, 0x5d, 0xd5, 0x98, 0xb5, 0xd1, 0x0b,
- 0x32, 0x5f, 0x90, 0x42, 0x13, 0x72, 0x85, 0xa2, 0x7b, 0xb9, 0x5c, 0x9a,
- 0x12, 0xc8, 0x61, 0x92, 0x4e, 0x3f, 0xdd, 0xa4, 0xd5, 0x8c, 0xed, 0x21,
- 0x43, 0x31, 0x93, 0x7c, 0x91, 0x37, 0x77, 0x6c, 0xd7, 0x76, 0x6d, 0x6a,
- 0x8e, 0x8f, 0xd2, 0x06, 0x9a, 0x7b, 0x74, 0x69, 0x4c, 0x7e, 0xd2, 0x3e,
- 0x49, 0xc5, 0xcf, 0x1b, 0xdf, 0xa4, 0x85, 0x8a, 0xd4, 0x58, 0x15, 0xc7,
- 0x7e, 0x3b, 0x10, 0x8f, 0x0d, 0xdf, 0x23, 0x4c, 0xd3, 0xd1, 0xae, 0xb2,
- 0x41, 0x9f, 0x49, 0x29, 0xf9, 0x24, 0xf5, 0x9d, 0x91, 0xf2, 0xcb, 0x24,
- 0xa2, 0x22, 0x22, 0x7b, 0x28, 0xf9, 0x26, 0xbb, 0x33, 0xf6, 0x73, 0x5e,
- 0x38, 0x4e, 0xc9, 0xf6, 0x7d, 0x46, 0xd6, 0x1d, 0xeb, 0xa2, 0xb9, 0x3a,
- 0xd3, 0x33, 0x89, 0x87, 0xb0, 0x24, 0x09, 0x1d, 0x08, 0xfc, 0xbe, 0xea,
- 0xe1, 0x34, 0xc4, 0x76, 0xdd, 0x62, 0xc9, 0xf8, 0x52, 0x78, 0x88, 0x63,
- 0xf3, 0xf3, 0xa2, 0xc8, 0x16, 0x72, 0x7c, 0x17, 0x9b, 0x0e, 0xc0, 0x3e,
- 0x6b, 0xa6, 0xfc, 0x1d, 0xdf, 0xe8, 0xce, 0x70, 0x4f, 0x39, 0xb8, 0x9f,
- 0x36, 0x2a, 0x93, 0x34, 0x6b, 0xc8, 0x58, 0x45, 0xfb, 0xf6, 0x57, 0xa3,
- 0xde, 0xcf, 0x04, 0xb7, 0xa9, 0x72, 0x87, 0xde, 0x3e, 0x73, 0x76, 0x8a,
- 0xe2, 0x90, 0xe9, 0x8c, 0xe5, 0x88, 0xff, 0x68, 0x35, 0x2b, 0x04, 0x30,
- 0x3a, 0xc3, 0xf9, 0x5a, 0xb6, 0xca, 0x30, 0x59, 0xc7, 0xb6, 0xd1, 0x53,
- 0xcb, 0x0a, 0xfe, 0xa2, 0xaa, 0x34, 0x67, 0xdd, 0x3a, 0xcf, 0x1d, 0x56,
- 0x36, 0xba, 0xd7, 0x44, 0xb8, 0xb9, 0xb7, 0x31, 0xbb, 0xb1, 0x8b, 0x1e,
- 0x68, 0x26, 0xa1, 0xc9, 0xda, 0x6b, 0x71, 0xb6, 0x25, 0x34, 0xb8, 0xf4,
- 0x0b, 0xc3, 0xc6, 0xfe, 0x75, 0x01, 0xcd, 0xcc, 0x10, 0xcc, 0x2f, 0x94,
- 0x59, 0x42, 0x8b, 0x2d, 0x41, 0xfd, 0x56, 0x25, 0x32, 0x4d, 0xc2, 0xba,
- 0x60, 0x57, 0x9c, 0x30, 0xc0, 0x8a, 0x23, 0xfb, 0x92, 0x43, 0x33, 0x80,
- 0xdc, 0x81, 0xe2, 0x72, 0x7c, 0xbe, 0x95, 0xec, 0x64, 0xa3, 0x4b, 0x33,
- 0xde, 0x16, 0x8d, 0x73, 0xf0, 0x9c, 0xfe, 0x7b, 0x88, 0xff, 0x1e, 0x6d,
- 0x69, 0x6a, 0x9f, 0xbf, 0xf5, 0x24, 0xcd, 0xbb, 0xb2, 0x88, 0xe3, 0x71,
- 0x4e, 0xb8, 0x0f, 0xd8, 0xc7, 0xdc, 0xc7, 0x78, 0x58, 0x67, 0x3d, 0xe5,
- 0x5d, 0x0e, 0xd5, 0x2d, 0xdd, 0x86, 0x25, 0xfb, 0x23, 0xae, 0x33, 0x76,
- 0x88, 0x98, 0x95, 0x4d, 0x8d, 0x7a, 0x08, 0x37, 0xa2, 0xde, 0xaa, 0xe9,
- 0xc7, 0x2a, 0xbb, 0x4a, 0xeb, 0xab, 0x64, 0xdd, 0x30, 0x11, 0x1a, 0xba,
- 0xed, 0x0e, 0xb7, 0x5a, 0xe4, 0xce, 0xd3, 0x26, 0x9f, 0x1e, 0xa9, 0xdd,
- 0xe7, 0x4e, 0x91, 0x23, 0x20, 0x8b, 0xf2, 0x46, 0x9f, 0x19, 0x4a, 0xae,
- 0x5d, 0x4c, 0x2d, 0x30, 0xa7, 0x09, 0xbf, 0x09, 0x3d, 0xe6, 0x47, 0xb2,
- 0x97, 0xa4, 0x4d, 0x52, 0x22, 0xa0, 0x61, 0x71, 0x73, 0xb3, 0x63, 0x64,
- 0xd1, 0x2d, 0x70, 0x6e, 0x64, 0xbb, 0x62, 0xde, 0x81, 0x69, 0x2a, 0x7a,
- 0x5e, 0x3e, 0x17, 0xef, 0xad, 0xfc, 0x1b, 0xf2, 0x54, 0xb4, 0xaf, 0x9a,
- 0xa3, 0xdd, 0x5d, 0xd5, 0xeb, 0x7e, 0xd2, 0x56, 0x06, 0x69, 0x35, 0x1d,
- 0x59, 0x2c, 0x07, 0x4c, 0x94, 0xae, 0xf3, 0x4b, 0xd8, 0x1a, 0x31, 0x07,
- 0x06, 0x3b, 0xa5, 0xfe, 0xa5, 0x4b, 0x62, 0x66, 0x3c, 0x24, 0x7f, 0xe9,
- 0xba, 0x7e, 0xc0, 0x1d, 0xf1, 0x98, 0x2e, 0xbf, 0x63, 0xfd, 0xc5, 0x1c,
- 0xd5, 0xf7, 0x37, 0xa0, 0x4b, 0x85, 0x77, 0x1e, 0x61, 0xbc, 0xf2, 0x6e,
- 0xd6, 0x98, 0x07, 0x7a, 0x2f, 0x2e, 0x92, 0x9d, 0xf4, 0x53, 0x3a, 0x4a,
- 0xce, 0x5e, 0x8d, 0xcf, 0xe9, 0x13, 0x86, 0x3a, 0x8a, 0x4b, 0x33, 0x8b,
- 0xd3, 0x71, 0x67, 0xb8, 0xec, 0xb6, 0xc9, 0x8a, 0x3a, 0xe6, 0xa0, 0x0c,
- 0xb7, 0x59, 0xa3, 0x08, 0x9a, 0x5e, 0x23, 0x93, 0x35, 0x96, 0x3e, 0xe2,
- 0xe2, 0x14, 0xe6, 0xa5, 0x1c, 0x8c, 0x84, 0xaf, 0x5a, 0xf0, 0xa1, 0x95,
- 0xb9, 0xf9, 0xb3, 0x5d, 0xeb, 0xaa, 0x19, 0x28, 0x2d, 0xd8, 0x70, 0x61,
- 0xbd, 0xbe, 0x24, 0x1b, 0xa4, 0x56, 0xbb, 0xd1, 0x7e, 0xc1, 0xec, 0x46,
- 0xa8, 0x2a, 0xc8, 0xb2, 0xad, 0x27, 0xd1, 0x58, 0x4d, 0x94, 0x49, 0x05,
- 0x15, 0xa9, 0x28, 0xdd, 0xa8, 0x94, 0x4d, 0x81, 0xac, 0xd1, 0x1c, 0x01,
- 0xb6, 0x69, 0x66, 0x54, 0xd0, 0x59, 0x44, 0x09, 0xe0, 0x43, 0x51, 0xc3,
- 0x69, 0x2e, 0x99, 0xa2, 0x11, 0xff, 0x0f, 0x06, 0x9a, 0xb2, 0x8a, 0x46,
- 0x54, 0x8f, 0x40, 0x45, 0x4e, 0x7e, 0x52, 0x52, 0x98, 0xd9, 0x54, 0xa7,
- 0xf1, 0xec, 0xfd, 0xff, 0xaa, 0x58, 0x9b, 0x8d, 0x8f, 0x48, 0x63, 0x52,
- 0xaa, 0x48, 0xcc, 0xd0, 0x06, 0x6e, 0x72, 0xec, 0x3d, 0x3a, 0x68, 0xfb,
- 0xb1, 0x41, 0x6c, 0xc6, 0x00, 0xc8, 0x92, 0x17, 0xf4, 0xdf, 0x7b, 0xb9,
- 0x32, 0x52, 0x57, 0xf0, 0xbc, 0xc4, 0x3b, 0x99, 0x77, 0x8a, 0x2f, 0x26,
- 0x69, 0x33, 0xe8, 0x40, 0x7a, 0x81, 0xdc, 0x46, 0xc4, 0xf7, 0x06, 0xc9,
- 0x6b, 0x4a, 0xc8, 0x3e, 0x7e, 0xf7, 0x15, 0x68, 0xe0, 0xfc, 0xe0, 0x10,
- 0xd1, 0x25, 0x6b, 0x3d, 0xcc, 0xf0, 0x91, 0x9a, 0x1d, 0x09, 0x1c, 0x1d,
- 0x0e, 0x15, 0x5f, 0xc8, 0x84, 0x01, 0xd8, 0x28, 0x85, 0x05, 0x91, 0x3d,
- 0x34, 0xfb, 0xf5, 0xe4, 0x57, 0x60, 0x88, 0x1e, 0x0f, 0x64, 0x07, 0xc5,
- 0x31, 0xf3, 0x29, 0xbb, 0x73, 0x7f, 0xc3, 0xae, 0x7a, 0x5b, 0xed, 0x1e,
- 0x7e, 0xe1, 0x6d, 0xd2, 0x5f, 0x9f, 0x53, 0x86, 0x92, 0xd1, 0x52, 0x67,
- 0x3f, 0xfe, 0x3c, 0x89, 0x18, 0xdf, 0xf9, 0x88, 0xb3, 0x05, 0x7e, 0x2e,
- 0xcd, 0x05, 0xe2, 0xd0, 0x3f, 0xb3, 0x78, 0x49, 0x87, 0xa7, 0x4c, 0x79,
- 0x22, 0xf8, 0xb4, 0xb0, 0x2a, 0xc9, 0x90, 0x13, 0xc0, 0x90, 0x10, 0xd6,
- 0xdd, 0xfb, 0x69, 0xb9, 0x08, 0x64, 0x5d, 0xcb, 0x70, 0x85, 0x3e, 0x7f,
- 0x28, 0xf2, 0x0d, 0xc6, 0x1c, 0x33, 0x1b, 0xd1, 0xa2, 0xbb, 0xd7, 0xc1,
- 0xea, 0xd4, 0x50, 0xbf, 0x9c, 0x64, 0xa4, 0x37, 0xf9, 0x45, 0x84, 0xb9,
- 0x31, 0x35, 0xd6, 0x94, 0x46, 0x89, 0xd3, 0x78, 0x63, 0xea, 0xbf, 0x39,
- 0x5b, 0xdd, 0x5b, 0x73, 0xe8, 0xe4, 0x67, 0xb2, 0xbb, 0x36, 0xf0, 0x3d,
- 0x4d, 0x86, 0xc9, 0x55, 0xb9, 0xea, 0xe7, 0x92, 0x4c, 0x1a, 0xc6, 0x30,
- 0x38, 0xe3, 0x40, 0xbc, 0x51, 0x92, 0x59, 0xd5, 0xf2, 0xe5, 0x33, 0xf9,
- 0x91, 0x25, 0xba, 0xe5, 0x6d, 0xc9, 0x56, 0xec, 0x28, 0x1a, 0x0e, 0x7e,
- 0xca, 0x15, 0xca, 0xaf, 0x69, 0xeb, 0x94, 0x76, 0x9c, 0x63, 0xb3, 0xad,
- 0xfa, 0x96, 0x05, 0xfd, 0x59, 0x90, 0x4f, 0xec, 0xdf, 0x22, 0x04, 0x19,
- 0xa5, 0x45, 0xf2, 0x8d, 0x4b, 0xec, 0x03, 0x0a, 0x0c, 0x25, 0x41, 0x4a,
- 0x16, 0xfa, 0xe2, 0xee, 0x41, 0x06, 0x9d, 0x2a, 0x20, 0x6a, 0xb7, 0x79,
- 0xc6, 0x5c, 0x60, 0xed, 0x74, 0x09, 0xc4, 0xb0, 0xf1, 0x86, 0x52, 0x4a,
- 0x98, 0x76, 0xc9, 0xf7, 0x9a, 0x4f, 0x3f, 0x21, 0xf2, 0x22, 0x12, 0xca,
- 0x5f, 0x9f, 0xe6, 0xed, 0x71, 0xc6, 0x69, 0xe4, 0x08, 0x60, 0x4b, 0x92,
- 0x53, 0x98, 0x68, 0x92, 0xa4, 0x73, 0x5e, 0xb0, 0xce, 0xd6, 0xeb, 0x65,
- 0x30, 0x73, 0xfd, 0xf8, 0xfa, 0xe4, 0x7d, 0xb2, 0x43, 0x1a, 0x78, 0xd7,
- 0xc8, 0x55, 0xf1, 0xbe, 0x97, 0x35, 0xd3, 0xbd, 0xd5, 0xa7, 0x7c, 0xcf,
- 0x18, 0x9b, 0xb3, 0xc9, 0xae, 0x35, 0xa2, 0xf0, 0x39, 0xa2, 0x42, 0x6b,
- 0x98, 0xaa, 0x65, 0x0a, 0xd3, 0x34, 0x70, 0x3d, 0x3a, 0x53, 0x95, 0x2b,
- 0x5c, 0xac, 0x8d, 0xca, 0xdb, 0xc4, 0x04, 0x8d, 0x10, 0x0d, 0x67, 0x47,
- 0x20, 0xb0, 0x93, 0xb1, 0x5f, 0xda, 0xd8, 0xd8, 0xdd, 0xbb, 0xca, 0xd9,
- 0x8f, 0xe2, 0xc8, 0x61, 0x07, 0x8e, 0xa6, 0xec, 0x89, 0xb8, 0x70, 0xda,
- 0xef, 0x80, 0x92, 0x2d, 0x69, 0x53, 0x56, 0x24, 0x92, 0x66, 0xe4, 0x06,
- 0xec, 0x0e, 0x07, 0x4d, 0x6e, 0x6b, 0xb4, 0xb7, 0x95, 0xd8, 0xf4, 0x52,
- 0xb3, 0xcb, 0x9c, 0x3f, 0x6d, 0x03, 0x5f, 0x86, 0xc4, 0xe6, 0xeb, 0xda,
- 0xfa, 0x31, 0x53, 0x7b, 0x5e, 0xa3, 0x18, 0x43, 0xf5, 0x8e, 0xd3, 0xea,
- 0x5c, 0x46, 0x37, 0xc6, 0xcd, 0xf2, 0xad, 0x75, 0x99, 0x14, 0x8e, 0x6a,
- 0xeb, 0x87, 0xad, 0xc4, 0x4b, 0x4f, 0x6c, 0x65, 0x29, 0xe6, 0x2e, 0x81,
- 0xc8, 0x13, 0x02, 0x46, 0x22, 0xdb, 0x3b, 0x3c, 0xcb, 0x16, 0xf9, 0x32,
- 0x87, 0xed, 0xe5, 0x4f, 0x61, 0x18, 0x0b, 0x10, 0xba, 0x29, 0xfd, 0x10,
- 0x4e, 0x49, 0x53, 0x7e, 0x53, 0xfa, 0xb5, 0x99, 0x12, 0x3c, 0x62, 0x9c,
- 0x91, 0x19, 0xb7, 0x9a, 0xdb, 0x13, 0xb2, 0x49, 0xc3, 0x1b, 0x22, 0xc7,
- 0xf6, 0x2e, 0xf5, 0xa9, 0xf2, 0xce, 0x25, 0xa2, 0x97, 0x9e, 0x99, 0x5a,
- 0xb2, 0xfa, 0x34, 0xad, 0x0f, 0x0e, 0xba, 0x82, 0xae, 0x76, 0x14, 0x25,
- 0xf6, 0x7b, 0x6a, 0x09, 0xf3, 0xc3, 0xfb, 0x93, 0x64, 0x87, 0x8a, 0x44,
- 0x9e, 0x3e, 0x3e, 0x38, 0xdc, 0xf5, 0x33, 0x4b, 0x94, 0x01, 0x84, 0x72,
- 0xf3, 0x8e, 0x43, 0xb2, 0xde, 0x05, 0x5c, 0x94, 0xd3, 0x54, 0x34, 0x0e,
- 0x37, 0xf4, 0x2c, 0xbb, 0xce, 0xa7, 0x54, 0xa3, 0x43, 0x01, 0x79, 0xe2,
- 0xc1, 0x93, 0xcc, 0x4c, 0x32, 0xd8, 0x71, 0x97, 0xd1, 0xcb, 0xb3, 0x37,
- 0x26, 0x92, 0xd5, 0x94, 0x29, 0x6f, 0xda, 0xd0, 0x40, 0x23, 0x7b, 0xe7,
- 0xcf, 0x5a, 0xa2, 0x04, 0x69, 0x8f, 0x27, 0x88, 0xd6, 0xc5, 0x15, 0x34,
- 0xd0, 0x31, 0x06, 0x2e, 0xf0, 0x33, 0x1c, 0xca, 0x66, 0x09, 0xeb, 0xb5,
- 0xb1, 0x63, 0xca, 0x40, 0xe9, 0x1e, 0xa0, 0xcc, 0x69, 0x8b, 0x04, 0x49,
- 0x01, 0xe1, 0x9e, 0xba, 0x41, 0xed, 0xee, 0xfb, 0x9a, 0x50, 0x7b, 0xd4,
- 0xd0, 0x53, 0x0e, 0xc2, 0x31, 0x9a, 0x4b, 0x7c, 0xc8, 0xdf, 0xc8, 0xc9,
- 0xd4, 0x66, 0x9f, 0x72, 0x3c, 0x74, 0xf6, 0xe2, 0x35, 0x9c, 0xb0, 0xa2,
- 0xa0, 0xfc, 0x36, 0xd5, 0xc7, 0x03, 0x39, 0x6e, 0x5e, 0xdf, 0x53, 0x21,
- 0x04, 0x29, 0xa4, 0xfe, 0x46, 0xf6, 0xfc, 0x18, 0xe6, 0x09, 0x4f, 0xcf,
- 0x27, 0x71, 0xf4, 0x40, 0x29, 0xb6, 0x29, 0x1c, 0xa1, 0xaf, 0x58, 0x05,
- 0xbf, 0x39, 0xa2, 0x69, 0x39, 0xeb, 0x98, 0xec, 0xb4, 0x09, 0x9e, 0xc0,
- 0x03, 0xf7, 0xe3, 0x50, 0x25, 0x38, 0x5e, 0xdc, 0x93, 0x4d, 0x94, 0xca,
- 0xee, 0xf5, 0x9f, 0xc4, 0x03, 0x63, 0x1e, 0x35, 0xb0, 0xc0, 0x9f, 0xc5,
- 0x01, 0xef, 0xf1, 0x39, 0xbd, 0x0a, 0x24, 0x76, 0x6d, 0x95, 0x21, 0xa7,
- 0xab, 0x51, 0xb2, 0x78, 0x82, 0x8d, 0x0b, 0x2d, 0x1a, 0x4a, 0x1b, 0x44,
- 0x4a, 0x00, 0xe5, 0x7c, 0x75, 0xee, 0x26, 0x3b, 0x76, 0xcc, 0x75, 0xd9,
- 0x39, 0xe5, 0x20, 0x65, 0x72, 0xfe, 0xe6, 0x7b, 0xe5, 0x96, 0x31, 0x03,
- 0x1e, 0x8e, 0xa8, 0x3f, 0xda, 0xec, 0x30, 0x63, 0x51, 0x50, 0xa6, 0x5a,
- 0x2e, 0x59, 0x9f, 0xec, 0x26, 0x42, 0x38, 0x7c, 0xd7, 0x25, 0x33, 0xd2,
- 0x56, 0x6f, 0xbd, 0xc0, 0xef, 0xba, 0xb1, 0xa6, 0x92, 0x2d, 0x99, 0x3f,
- 0xfd, 0xc0, 0xbf, 0x66, 0x1e, 0x6b, 0xfe, 0xd5, 0x5c, 0xad, 0x97, 0x13,
- 0x73, 0x9e, 0x45, 0xf3, 0xa7, 0xad, 0x84, 0x83, 0xad, 0x73, 0xd9, 0xcf,
- 0x0d, 0x66, 0x67, 0xae, 0xf5, 0x3a, 0xea, 0x5b, 0x6c, 0xed, 0x1a, 0xcf,
- 0x4e, 0x6b, 0x07, 0x5c, 0x7e, 0x9e, 0x39, 0x3c, 0xf6, 0x65, 0x07, 0xaa,
- 0xde, 0x07, 0x43, 0x9e, 0x3f, 0xbc, 0xfd, 0xcb, 0x0f, 0xcf, 0x8e, 0x1e,
- 0xa5, 0x4f, 0xd3, 0xe9, 0x93, 0xf9, 0xe7, 0xe9, 0xe3, 0xd9, 0xe3, 0xa7,
- 0xcf, 0x0e, 0x3f, 0x7f, 0x9c, 0x3e, 0x7d, 0x34, 0x4f, 0x9f, 0x1c, 0x64,
- 0x07, 0xcf, 0xe6, 0x87, 0x47, 0xb3, 0xd9, 0x3c, 0xfb, 0x7c, 0xf6, 0x34,
- 0xdd, 0x1a, 0xc1, 0xfc, 0xd2, 0xa9, 0x87, 0xac, 0x56, 0x03, 0x6f, 0x69,
- 0x32, 0xfe, 0xfa, 0xe5, 0xf0, 0x20, 0xb9, 0xca, 0x6e, 0xf5, 0x82, 0xb1,
- 0x47, 0xd3, 0x66, 0xdd, 0x65, 0x92, 0x57, 0xdd, 0xbf, 0x58, 0x2d, 0x14,
- 0xa4, 0xac, 0x69, 0xf2, 0x95, 0x40, 0x03, 0xe6, 0x5d, 0xd4, 0x6d, 0xe5,
- 0xbc, 0x3a, 0xeb, 0x3f, 0x7c, 0xae, 0x3e, 0x7b, 0x5a, 0x57, 0xf7, 0xf2,
- 0x9f, 0x9a, 0x77, 0x16, 0x6f, 0xd3, 0xa9, 0x51, 0x92, 0xcc, 0x9e, 0xc8,
- 0x83, 0x63, 0x63, 0xda, 0x1a, 0x36, 0x3d, 0x48, 0xe4, 0x2f, 0xe4, 0x25,
- 0xf6, 0xc6, 0xf8, 0xaa, 0x2a, 0xd7, 0xab, 0xf3, 0x72, 0x91, 0x4f, 0xef,
- 0x36, 0x0d, 0xe7, 0x3f, 0xd6, 0xfa, 0xc5, 0x31, 0xb3, 0xf0, 0xbc, 0xce,
- 0x7e, 0x43, 0xd3, 0xca, 0x63, 0xc7, 0x0f, 0xb0, 0xad, 0x86, 0xd3, 0x7c,
- 0x75, 0x45, 0x71, 0xde, 0x17, 0xc8, 0xf2, 0xa3, 0xd0, 0x0c, 0xff, 0x20,
- 0x6e, 0x53, 0x8d, 0xe5, 0x46, 0xd6, 0x72, 0x9e, 0xfa, 0xb6, 0x68, 0x5c,
- 0xb9, 0x96, 0xc0, 0xa9, 0x9b, 0x4a, 0x32, 0x4b, 0xf3, 0xc0, 0x8f, 0xe7,
- 0x3e, 0xc4, 0xb7, 0x5d, 0xb5, 0x6d, 0x76, 0x5e, 0xc8, 0xaf, 0x46, 0xc9,
- 0x7b, 0xc4, 0xc9, 0xd7, 0x2b, 0x36, 0x2f, 0xe0, 0xcf, 0xe7, 0xdf, 0x75,
- 0x2f, 0x1a, 0x4d, 0x5e, 0x28, 0x86, 0x0b, 0xf1, 0xcc, 0x8e, 0x7e, 0x78,
- 0x7f, 0xfa, 0xbc, 0xbb, 0x4f, 0x28, 0x36, 0xaa, 0x9f, 0xef, 0xed, 0x21,
- 0xe4, 0x73, 0x95, 0xde, 0xde, 0x8e, 0xea, 0x6c, 0x6f, 0x56, 0x4e, 0xeb,
- 0xbd, 0xba, 0x5e, 0xe8, 0x6e, 0xb4, 0x6b, 0xff, 0x7e, 0x05, 0x6f, 0x6e,
- 0xb9, 0x04, 0xdb, 0xca, 0x66, 0xc3, 0xba, 0x0e, 0x72, 0x83, 0xc6, 0xaf,
- 0x34, 0xf3, 0xe0, 0x58, 0x72, 0xd2, 0x20, 0xe7, 0x86, 0x66, 0x77, 0xc7,
- 0xe3, 0xaf, 0x13, 0x7d, 0x19, 0xdb, 0x6b, 0x43, 0xe2, 0x36, 0x2f, 0x67,
- 0x10, 0x51, 0xc3, 0x52, 0x61, 0xd8, 0x7f, 0xf4, 0x1d, 0x3a, 0xa4, 0x4e,
- 0x97, 0xfc, 0x87, 0xd4, 0xae, 0xe4, 0xcd, 0xc6, 0x44, 0xbe, 0x27, 0x1d,
- 0x07, 0x88, 0x5d, 0x44, 0x3c, 0xfe, 0xaf, 0x4e, 0xb0, 0x34, 0x71, 0x4f,
- 0x3a, 0x8f, 0x50, 0xb7, 0x38, 0xdd, 0x50, 0xef, 0x65, 0x59, 0x19, 0xe1,
- 0xb1, 0xac, 0x63, 0x5e, 0x50, 0xbd, 0xe5, 0x35, 0xab, 0x7d, 0x35, 0xe7,
- 0x22, 0x9a, 0x61, 0x0a, 0x6f, 0x70, 0x73, 0x8c, 0xc8, 0x61, 0x1c, 0xf9,
- 0x87, 0x15, 0x8d, 0x6f, 0xe9, 0xe1, 0xf5, 0x79, 0xd1, 0xd6, 0x85, 0x0b,
- 0x7e, 0x40, 0x1c, 0x9b, 0xc9, 0x4a, 0x61, 0x59, 0x60, 0x21, 0x20, 0xf7,
- 0x1f, 0x62, 0x82, 0x74, 0x88, 0xaa, 0x2a, 0x3d, 0xa5, 0x76, 0xf8, 0x0d,
- 0x8c, 0x4b, 0x23, 0x1d, 0xf3, 0x4b, 0x0d, 0xaf, 0xf7, 0xe4, 0xd8, 0x91,
- 0xe8, 0x6a, 0x90, 0xbb, 0x2c, 0xe5, 0xe0, 0x24, 0x14, 0x28, 0x85, 0x0d,
- 0xa9, 0x25, 0x92, 0x9d, 0xc9, 0xe9, 0x40, 0xad, 0x2a, 0xf8, 0xe0, 0x26,
- 0x50, 0xcd, 0x8f, 0x7b, 0x9c, 0xd2, 0xa8, 0xf4, 0x5e, 0x62, 0x78, 0x71,
- 0x5f, 0x78, 0x89, 0x6d, 0xa4, 0x95, 0xc1, 0xcd, 0x60, 0x9e, 0xe9, 0x5a,
- 0x7b, 0xc8, 0xb9, 0xb5, 0x3a, 0x5f, 0xac, 0xc4, 0xb5, 0xbb, 0x1e, 0x4d,
- 0xbd, 0xd7, 0xbd, 0xcd, 0x51, 0x54, 0x9d, 0x22, 0xaf, 0x3f, 0x26, 0xda,
- 0x4b, 0x2f, 0x48, 0x4b, 0x03, 0x86, 0x32, 0xaf, 0xb1, 0x69, 0x93, 0x5a,
- 0xa9, 0x04, 0x85, 0xc0, 0x70, 0x20, 0x23, 0xf6, 0x28, 0xe3, 0x9c, 0x4a,
- 0xe9, 0x17, 0xa5, 0x53, 0xb0, 0x0c, 0xe1, 0x19, 0x5e, 0x88, 0x6a, 0xc4,
- 0x51, 0xc0, 0xb7, 0xb9, 0x26, 0x89, 0x93, 0x08, 0xb9, 0xb6, 0x8e, 0xb3,
- 0xbd, 0xf8, 0x67, 0x10, 0x5f, 0x13, 0x8d, 0x91, 0x3b, 0x7e, 0x46, 0xe7,
- 0x17, 0x73, 0x0d, 0x49, 0x56, 0x3e, 0x17, 0x3a, 0xe6, 0x28, 0xe1, 0x95,
- 0xa2, 0x4f, 0x2e, 0x32, 0x50, 0xcf, 0x76, 0x5d, 0x4a, 0xca, 0x26, 0x4d,
- 0x94, 0xe6, 0xc9, 0x73, 0xec, 0x92, 0xba, 0x2d, 0xe8, 0x6c, 0x19, 0x23,
- 0x69, 0xed, 0x72, 0xf5, 0xeb, 0x30, 0x5a, 0xe9, 0x36, 0x33, 0x66, 0xbd,
- 0x06, 0x75, 0x0f, 0x98, 0x48, 0x95, 0xe9, 0x17, 0x8a, 0xb2, 0x3b, 0x29,
- 0x9d, 0x47, 0x2c, 0x1f, 0x55, 0x73, 0xfb, 0xbd, 0x09, 0x68, 0x8e, 0xbf,
- 0x3d, 0xe5, 0x9e, 0xec, 0xcd, 0x2c, 0x71, 0x8f, 0x24, 0xce, 0xce, 0x74,
- 0xc7, 0x08, 0x7f, 0x03, 0x2a, 0x36, 0x6a, 0x9e, 0xfa, 0x73, 0x9a, 0xd3,
- 0x17, 0xbb, 0x31, 0x3f, 0xb1, 0x1b, 0x49, 0x29, 0x8a, 0xee, 0xe9, 0xa2,
- 0xac, 0x35, 0xfe, 0x42, 0xca, 0x05, 0xd7, 0xdd, 0x1a, 0x6e, 0xf0, 0x9d,
- 0xfc, 0x80, 0x8f, 0xa6, 0x33, 0x1c, 0x3f, 0x35, 0x90, 0x29, 0xce, 0x9d,
- 0xb2, 0x21, 0xb6, 0xaa, 0x2b, 0x16, 0x26, 0x6d, 0xc3, 0x5a, 0x93, 0xcf,
- 0x93, 0x1f, 0x7e, 0x18, 0x24, 0xc6, 0x48, 0xee, 0x0c, 0xf7, 0x43, 0x63,
- 0x7e, 0x6a, 0x68, 0xf1, 0x07, 0x2e, 0x58, 0xfa, 0xe1, 0x9a, 0x8c, 0x40,
- 0x72, 0x30, 0xd7, 0x0b, 0x8a, 0x1e, 0xb1, 0x9a, 0xdd, 0xf6, 0xca, 0x71,
- 0x3d, 0xf4, 0x86, 0xd4, 0x2c, 0x67, 0xb7, 0x73, 0x2a, 0xa6, 0x39, 0xb0,
- 0xf5, 0xb2, 0x10, 0xeb, 0x84, 0x89, 0x13, 0xf7, 0x1e, 0x72, 0x60, 0xfb,
- 0x77, 0xdb, 0x8e, 0x90, 0x62, 0x7b, 0x57, 0x65, 0x2c, 0xe9, 0x21, 0xaa,
- 0x72, 0x4f, 0x4c, 0x69, 0xf5, 0x30, 0xcc, 0xcd, 0x84, 0xc3, 0xa5, 0xc4,
- 0x4c, 0xcf, 0xc8, 0xb9, 0xce, 0x65, 0x60, 0x5d, 0x31, 0xee, 0x4c, 0x49,
- 0xaa, 0x8d, 0x5b, 0x5d, 0xdd, 0xd5, 0x94, 0xc9, 0x21, 0xb3, 0x09, 0x6e,
- 0x4f, 0x6f, 0x82, 0xb1, 0xec, 0x3d, 0x15, 0xf5, 0x10, 0x1f, 0x20, 0xe6,
- 0xd7, 0x62, 0x9d, 0x66, 0x46, 0xdb, 0xc3, 0x6d, 0x1b, 0x0b, 0x93, 0x7c,
- 0x99, 0x20, 0x97, 0xde, 0x26, 0x67, 0xbb, 0xe4, 0xc3, 0xe0, 0x93, 0x5e,
- 0x52, 0x5c, 0xe9, 0xa7, 0x3b, 0xba, 0xe2, 0x76, 0xaa, 0x4e, 0xd5, 0x28,
- 0xbe, 0x7c, 0x5f, 0xf8, 0x4f, 0xc4, 0xe1, 0x84, 0xb4, 0x48, 0x98, 0x1e,
- 0x3a, 0x00, 0xbc, 0x21, 0x2e, 0x3c, 0x34, 0x1c, 0x02, 0x67, 0x64, 0xc5,
- 0xd8, 0x20, 0x44, 0x12, 0xc8, 0x3c, 0xb8, 0xa3, 0x4a, 0xb0, 0xd5, 0x22,
- 0xe0, 0xb7, 0x92, 0x0a, 0xa8, 0xc5, 0xd6, 0x74, 0xc1, 0x09, 0x90, 0xe2,
- 0xa6, 0x10, 0x40, 0x81, 0x71, 0x09, 0xaf, 0xcc, 0x14, 0x39, 0x0c, 0x92,
- 0x2e, 0x23, 0x35, 0x65, 0x11, 0x2b, 0x90, 0x64, 0x60, 0xa0, 0x03, 0xd1,
- 0x7c, 0xbe, 0x48, 0xb6, 0xfa, 0x35, 0xa1, 0xad, 0xee, 0x1b, 0xc8, 0x80,
- 0x74, 0x2e, 0x4e, 0xa9, 0x97, 0xc7, 0x44, 0x76, 0x24, 0x93, 0x6e, 0xf8,
- 0x77, 0x4e, 0x68, 0xe3, 0x92, 0x2e, 0x91, 0xaf, 0xbb, 0x9c, 0x20, 0x5c,
- 0x47, 0x22, 0xfb, 0x2e, 0xcb, 0xca, 0xa3, 0x0f, 0x97, 0xa7, 0x94, 0xc3,
- 0x7d, 0x0d, 0xe9, 0xc5, 0xd2, 0xce, 0x7b, 0x3a, 0x08, 0xc5, 0xeb, 0xdb,
- 0x54, 0x71, 0x42, 0xdf, 0x13, 0x97, 0xb4, 0x8a, 0x0e, 0x7b, 0xa3, 0x57,
- 0x0b, 0xe0, 0x74, 0x68, 0xad, 0x0b, 0x54, 0xa2, 0x60, 0x77, 0x0e, 0x76,
- 0x6d, 0x75, 0x24, 0xc0, 0x36, 0x38, 0x33, 0x5b, 0xf4, 0x84, 0xad, 0xab,
- 0x92, 0x73, 0x89, 0xb6, 0x9e, 0x53, 0xe1, 0x9e, 0xdc, 0x46, 0xac, 0x51,
- 0x61, 0x10, 0x3a, 0xc3, 0x21, 0x53, 0xeb, 0xeb, 0xb3, 0xb7, 0xc7, 0xed,
- 0x0c, 0x5c, 0xfc, 0x24, 0xe6, 0x7c, 0x35, 0xec, 0xea, 0x8d, 0xe1, 0x30,
- 0x4c, 0x03, 0x69, 0xa0, 0xcd, 0x31, 0x6d, 0x99, 0x69, 0x5d, 0x66, 0xcd,
- 0xea, 0x66, 0x9d, 0xcf, 0x76, 0x76, 0x89, 0x46, 0xa8, 0xdc, 0x64, 0x88,
- 0x1a, 0x27, 0x36, 0x0d, 0xeb, 0x64, 0x87, 0x15, 0xf4, 0x2a, 0x6b, 0xd6,
- 0x55, 0xc1, 0x0e, 0x73, 0x9a, 0x7b, 0xd7, 0xc8, 0x32, 0xd2, 0x99, 0x45,
- 0x9d, 0xef, 0x1c, 0x10, 0xcc, 0x1c, 0x4e, 0x61, 0xe2, 0x01, 0x8d, 0xb9,
- 0x7b, 0x66, 0xf3, 0x3e, 0x70, 0xf0, 0x58, 0x4b, 0x20, 0xbf, 0xfc, 0x9d,
- 0x48, 0x5e, 0x9e, 0x9f, 0xbf, 0x7e, 0x79, 0xf1, 0xd2, 0xae, 0x0d, 0x02,
- 0x1a, 0xcc, 0x05, 0x1a, 0xb2, 0xe1, 0x43, 0xa4, 0x35, 0xd1, 0x93, 0xdb,
- 0xbf, 0xff, 0x30, 0x3e, 0x7e, 0xdf, 0x3d, 0xd8, 0xf3, 0xf7, 0x67, 0x04,
- 0x48, 0xf4, 0xfb, 0x1f, 0x5e, 0xae, 0x56, 0x0b, 0x0d, 0x0a, 0xbe, 0x4e,
- 0x9b, 0x74, 0x3b, 0xb8, 0xd5, 0x87, 0xbb, 0x34, 0xbf, 0x1b, 0x3b, 0xbf,
- 0xb9, 0x08, 0x39, 0x98, 0xfa, 0xc9, 0x88, 0x0e, 0xb4, 0x9a, 0x6a, 0xfa,
- 0xad, 0xdd, 0x0d, 0x6c, 0x00, 0xb2, 0x67, 0xfb, 0x17, 0x52, 0x3a, 0x4e,
- 0xa6, 0x89, 0x64, 0xba, 0x59, 0x0b, 0x63, 0x64, 0x67, 0xd3, 0x75, 0xa3,
- 0x24, 0x0f, 0xfa, 0xa2, 0x2a, 0xee, 0xee, 0xbe, 0x04, 0xc7, 0xe3, 0xc2,
- 0x28, 0xcc, 0x05, 0x00, 0x22, 0x60, 0x08, 0x0d, 0x29, 0xd2, 0x3a, 0x5b,
- 0xe6, 0x62, 0x11, 0x9a, 0x9a, 0x65, 0x1c, 0x56, 0x01, 0xa8, 0x00, 0x4f,
- 0x29, 0xd8, 0x90, 0xdf, 0x99, 0xdb, 0x38, 0x4c, 0x8e, 0xa5, 0xda, 0x0d,
- 0x0b, 0x37, 0x3f, 0x08, 0x1e, 0x6a, 0xac, 0xf9, 0x20, 0xec, 0x3e, 0xce,
- 0x2b, 0x3c, 0xa0, 0x8d, 0xad, 0xae, 0x08, 0xe0, 0xd2, 0x56, 0xf3, 0x10,
- 0x4d, 0x9b, 0x36, 0x1d, 0xd6, 0xd3, 0x56, 0x24, 0xe9, 0x69, 0x98, 0x5e,
- 0x12, 0x79, 0x99, 0x47, 0x8d, 0x76, 0x6d, 0x8c, 0x26, 0xfa, 0xd7, 0xde,
- 0xc1, 0x68, 0x7f, 0x2b, 0x9c, 0x3c, 0x5d, 0x16, 0x80, 0xa4, 0xd8, 0xa8,
- 0x1a, 0x71, 0xc3, 0xa6, 0x2c, 0xef, 0x9d, 0x1f, 0xb3, 0x30, 0xa3, 0x9f,
- 0xae, 0xcc, 0xf8, 0xd1, 0xa9, 0x0c, 0xcf, 0x82, 0x2c, 0x10, 0xca, 0xdc,
- 0xad, 0x94, 0x29, 0x1a, 0x9e, 0x58, 0x94, 0x37, 0xb4, 0x12, 0x43, 0x6a,
- 0x8b, 0x45, 0x0b, 0xcd, 0x66, 0x2b, 0xbe, 0xcd, 0x05, 0x80, 0xa3, 0xb2,
- 0xee, 0x6e, 0x47, 0x23, 0xd7, 0xaa, 0x7c, 0xfa, 0x1a, 0x9e, 0x4d, 0x79,
- 0x85, 0x15, 0x69, 0x29, 0xc1, 0x07, 0x13, 0x30, 0x5c, 0x2e, 0xe0, 0x7b,
- 0x0b, 0x3f, 0x33, 0x63, 0xa8, 0xe9, 0x21, 0x43, 0x1a, 0x84, 0xb4, 0xd2,
- 0x17, 0x5c, 0xab, 0x1e, 0xd8, 0xf2, 0x6f, 0xd3, 0xdb, 0x7c, 0xb9, 0x5e,
- 0xe2, 0x63, 0x44, 0xdb, 0xf2, 0x98, 0xc4, 0x13, 0xe0, 0x55, 0xe4, 0xf4,
- 0x14, 0x10, 0xf9, 0x76, 0x9d, 0x78, 0x16, 0x7d, 0x4c, 0xc8, 0x18, 0x91,
- 0x3c, 0x72, 0xcb, 0x83, 0xb2, 0x80, 0x80, 0x43, 0xdd, 0xf1, 0x06, 0x18,
- 0xfd, 0x20, 0xa5, 0x9c, 0x83, 0xba, 0xb4, 0x09, 0x3b, 0x11, 0x76, 0xce,
- 0x60, 0x09, 0xa2, 0xc3, 0x79, 0xf9, 0xaa, 0x59, 0x95, 0x97, 0x33, 0x7b,
- 0x6f, 0x48, 0x7f, 0xcc, 0x8b, 0xb5, 0xd9, 0x67, 0xf6, 0x25, 0x73, 0x10,
- 0x82, 0x7e, 0x15, 0x78, 0x08, 0x91, 0x55, 0x3f, 0x46, 0xb1, 0x84, 0xa6,
- 0xa0, 0x3e, 0x1d, 0x1d, 0x1d, 0x8e, 0xf6, 0x07, 0x2d, 0x83, 0x5e, 0x30,
- 0x25, 0xcc, 0xed, 0x9a, 0xe6, 0x4b, 0x5b, 0x6f, 0x3a, 0xfa, 0xcd, 0x1c,
- 0x37, 0xc8, 0x08, 0x5f, 0xa6, 0xb7, 0x38, 0xbe, 0xe8, 0xb1, 0x96, 0xc9,
- 0x8b, 0xaf, 0xcf, 0xc6, 0x17, 0x07, 0xcf, 0xcf, 0xcf, 0xde, 0x9b, 0xff,
- 0xd2, 0xdf, 0x0f, 0xf1, 0xf7, 0xc3, 0xc0, 0xaa, 0x7c, 0x23, 0x19, 0xb4,
- 0x5a, 0xac, 0x03, 0x0d, 0x05, 0x1a, 0x0d, 0xef, 0x66, 0xe2, 0x0d, 0x44,
- 0x7a, 0x39, 0xd8, 0xe0, 0xd4, 0x56, 0x34, 0x76, 0x8f, 0xd8, 0xfb, 0x94,
- 0x26, 0xd9, 0x8d, 0x92, 0x30, 0x91, 0x2f, 0x6f, 0x54, 0x9b, 0x92, 0x5a,
- 0x78, 0xad, 0xb2, 0xef, 0xfa, 0xba, 0xb9, 0x8e, 0x59, 0xea, 0x73, 0x14,
- 0xaf, 0x0e, 0xb9, 0x61, 0xed, 0x5f, 0x4d, 0x17, 0x46, 0xbb, 0xcf, 0x28,
- 0x97, 0x64, 0x96, 0x71, 0x80, 0x85, 0x7e, 0x12, 0x33, 0x4c, 0xcc, 0xf5,
- 0x93, 0x92, 0x85, 0x20, 0xc1, 0x10, 0x14, 0xa9, 0x51, 0x1d, 0x33, 0x1b,
- 0x33, 0xc7, 0xdc, 0x68, 0xe2, 0xbc, 0x1d, 0x45, 0x16, 0x54, 0x08, 0x30,
- 0x8e, 0x9c, 0xef, 0xc4, 0x42, 0x91, 0x3e, 0xca, 0xed, 0xdf, 0x9d, 0x5d,
- 0x24, 0xe9, 0x7c, 0xae, 0xd8, 0x00, 0x54, 0x96, 0x40, 0x1a, 0xeb, 0xde,
- 0x8a, 0x25, 0x59, 0xda, 0xc4, 0x52, 0x37, 0x44, 0x1f, 0xb9, 0x38, 0x1d,
- 0xef, 0x91, 0x0b, 0x8b, 0x93, 0xe0, 0xc6, 0xef, 0x4e, 0x06, 0x2d, 0x5f,
- 0xb5, 0x9f, 0xfa, 0xb2, 0x4b, 0x92, 0x32, 0xae, 0x50, 0xa4, 0x9e, 0x2c,
- 0x74, 0x88, 0x33, 0x94, 0x54, 0x87, 0x23, 0xdd, 0x92, 0x6a, 0xb0, 0x2d,
- 0x1c, 0xed, 0x56, 0xa2, 0x51, 0x53, 0xd8, 0xc5, 0xcb, 0x55, 0x73, 0x17,
- 0xd6, 0x8b, 0xc2, 0xb7, 0x41, 0x38, 0x2c, 0xa4, 0x74, 0x6c, 0x91, 0x59,
- 0x42, 0xcb, 0xc2, 0x92, 0xb6, 0x46, 0x3c, 0xec, 0xe1, 0x16, 0x46, 0xc5,
- 0xa0, 0xe6, 0xef, 0x34, 0x26, 0x88, 0x76, 0x92, 0xc5, 0xd2, 0xfb, 0xf9,
- 0x43, 0xde, 0xe0, 0x89, 0x1d, 0xde, 0x4c, 0xcc, 0xd6, 0xa9, 0x29, 0x75,
- 0x10, 0x83, 0x29, 0xab, 0xfc, 0x92, 0xf2, 0x04, 0xba, 0xa5, 0x63, 0x6e,
- 0x22, 0x81, 0x67, 0x8a, 0x94, 0xb1, 0xba, 0xd9, 0xf2, 0x5c, 0x09, 0x4d,
- 0x90, 0xa0, 0x8f, 0xb4, 0xd1, 0x4a, 0x4d, 0x1a, 0x9d, 0x0e, 0xf1, 0x9f,
- 0x26, 0xa2, 0xc7, 0xb3, 0xb2, 0x67, 0x56, 0x47, 0x72, 0xc7, 0x05, 0x81,
- 0xb4, 0xf4, 0x47, 0xef, 0x12, 0x90, 0x70, 0x4e, 0x1a, 0x65, 0xe0, 0x1c,
- 0x36, 0xea, 0x0e, 0xc7, 0x88, 0x6d, 0x86, 0x23, 0x68, 0xd5, 0xc7, 0xd6,
- 0xc1, 0xe1, 0xd3, 0xd1, 0xbe, 0xf9, 0x3f, 0x73, 0x28, 0xa2, 0x1f, 0x01,
- 0x2e, 0xca, 0xc1, 0x02, 0xd9, 0x27, 0xb3, 0xdb, 0x2e, 0x49, 0xb2, 0x00,
- 0x2a, 0xab, 0xcb, 0xad, 0x8d, 0x35, 0xac, 0x2d, 0x91, 0x42, 0x07, 0x69,
- 0xc5, 0x49, 0x3a, 0x93, 0x9f, 0xe8, 0x1d, 0xaf, 0xd6, 0x8b, 0x48, 0x5a,
- 0x9f, 0xe7, 0x46, 0x26, 0xed, 0x6c, 0x71, 0x2d, 0x4e, 0xe4, 0xaf, 0x89,
- 0x37, 0x71, 0x1d, 0xdf, 0xa8, 0x95, 0x14, 0xf5, 0xac, 0xe5, 0x13, 0x7c,
- 0x25, 0x26, 0x1b, 0x38, 0xf3, 0xd0, 0x5c, 0x86, 0x17, 0xe5, 0x7c, 0x5e,
- 0x67, 0x4d, 0x57, 0x00, 0xbd, 0x92, 0x47, 0xf6, 0xde, 0x03, 0xe0, 0x10,
- 0x9c, 0x4a, 0x2b, 0x6e, 0x92, 0x36, 0x2c, 0x4f, 0x22, 0x59, 0x68, 0xcc,
- 0xb6, 0x78, 0xb8, 0x51, 0xa4, 0xc8, 0xc0, 0xff, 0xbd, 0x66, 0x88, 0x70,
- 0x55, 0xbc, 0x82, 0xbd, 0xa0, 0xdc, 0x8a, 0x71, 0x5c, 0x44, 0xd2, 0x75,
- 0x51, 0xd9, 0xf4, 0x4a, 0x7c, 0xca, 0x57, 0x2b, 0x32, 0x6f, 0x18, 0xe1,
- 0x0c, 0x64, 0x6b, 0x03, 0x68, 0x88, 0xe3, 0x82, 0x94, 0x35, 0x5b, 0xd0,
- 0x28, 0xc9, 0x53, 0x91, 0xf9, 0x93, 0x6c, 0x1e, 0x06, 0x81, 0x38, 0xa9,
- 0xd1, 0x87, 0xb5, 0x91, 0x1a, 0xdd, 0x19, 0x41, 0xd8, 0x14, 0xa9, 0xb2,
- 0x98, 0xb9, 0x07, 0xf8, 0x20, 0xc5, 0x7f, 0x83, 0xc8, 0xfd, 0x77, 0xc5,
- 0x59, 0xd6, 0x0f, 0x37, 0x3e, 0xf9, 0xef, 0xc7, 0x0e, 0x84, 0xc8, 0xa2,
- 0xfc, 0x70, 0xb9, 0x4b, 0xac, 0x78, 0xc8, 0xdc, 0xc2, 0xe1, 0x2b, 0x73,
- 0x5e, 0x5b, 0x98, 0x8a, 0x4b, 0x35, 0x29, 0x3b, 0xe5, 0x18, 0xb0, 0x7b,
- 0x48, 0x93, 0x80, 0x36, 0xb4, 0x47, 0x75, 0xff, 0x81, 0x68, 0x60, 0x8c,
- 0x4a, 0xf6, 0x2f, 0xca, 0x1a, 0x71, 0x3b, 0x1a, 0xa9, 0x9a, 0xf3, 0x6b,
- 0x4e, 0x44, 0x59, 0xdc, 0xcb, 0x0b, 0x52, 0x19, 0x59, 0x81, 0x09, 0x4a,
- 0x32, 0xb4, 0x0e, 0x96, 0xd1, 0x4e, 0xd6, 0xcd, 0x6f, 0x18, 0x3b, 0xa9,
- 0x88, 0x7e, 0x01, 0x63, 0xe7, 0x11, 0xf5, 0x94, 0x89, 0x9a, 0xb0, 0x3a,
- 0x87, 0x7f, 0x33, 0x56, 0xf6, 0x0b, 0x75, 0x53, 0xf4, 0x01, 0x03, 0xa8,
- 0x53, 0x83, 0x8a, 0x28, 0x60, 0x84, 0x81, 0x36, 0x2c, 0x3e, 0x8d, 0x6e,
- 0x35, 0xc3, 0xea, 0xa4, 0xd0, 0x65, 0x00, 0x04, 0xda, 0xbd, 0xf3, 0x73,
- 0x80, 0xde, 0x78, 0xe5, 0xdf, 0xb6, 0x76, 0x72, 0x44, 0x51, 0xaa, 0x05,
- 0x8f, 0x50, 0x73, 0x62, 0xa5, 0x8c, 0xa1, 0x46, 0x43, 0x1e, 0xc8, 0xdc,
- 0xbc, 0x18, 0x72, 0x71, 0xb5, 0x3e, 0x8b, 0x60, 0x1a, 0xa1, 0xb6, 0x09,
- 0x39, 0xf2, 0x11, 0xb1, 0x19, 0xde, 0x48, 0x62, 0x05, 0xd4, 0x5a, 0x7c,
- 0x36, 0xe6, 0x46, 0x67, 0x5f, 0x24, 0x1c, 0x88, 0xfc, 0x71, 0x72, 0x90,
- 0x7d, 0x32, 0xba, 0x73, 0x31, 0xa0, 0x9f, 0xa2, 0x10, 0xd5, 0x5e, 0x32,
- 0xf6, 0x6d, 0x34, 0x19, 0x07, 0x2d, 0xb2, 0x88, 0x2e, 0xeb, 0x3d, 0x2b,
- 0x8f, 0x7a, 0x6e, 0x94, 0x77, 0x59, 0x23, 0xa9, 0x23, 0x3c, 0x79, 0xad,
- 0xcd, 0x42, 0x7d, 0xd7, 0xc9, 0xbc, 0x33, 0x1c, 0xe0, 0xe2, 0xb2, 0xa6,
- 0x5d, 0xad, 0x2f, 0x31, 0x5c, 0xc6, 0xc8, 0x22, 0x5f, 0xe8, 0xc0, 0x5c,
- 0x83, 0x2d, 0xf5, 0xcb, 0xf2, 0x0a, 0xe2, 0xa9, 0x0b, 0x3a, 0x1d, 0x72,
- 0x13, 0x35, 0xb3, 0x18, 0x4d, 0xb2, 0xee, 0xab, 0x17, 0x52, 0xa0, 0x03,
- 0xfd, 0x74, 0x08, 0x02, 0x41, 0x43, 0xf4, 0xde, 0x7d, 0x4d, 0x13, 0x57,
- 0x22, 0x55, 0x85, 0x5e, 0x55, 0x29, 0xa5, 0xd0, 0x54, 0x33, 0xf5, 0x8c,
- 0xe8, 0x44, 0x0d, 0x17, 0x16, 0xbb, 0xe8, 0x26, 0x05, 0xa5, 0xd9, 0xf1,
- 0x63, 0xb5, 0x0f, 0x5e, 0xfe, 0xe3, 0x70, 0xe2, 0xc8, 0xd9, 0xc1, 0xe7,
- 0x44, 0xd3, 0x94, 0xe4, 0x21, 0xa2, 0x79, 0x23, 0x58, 0xb6, 0x1b, 0xaf,
- 0xb8, 0x14, 0x88, 0x34, 0x76, 0x53, 0x78, 0x0b, 0x6f, 0xae, 0xca, 0x45,
- 0x16, 0x0b, 0x91, 0x78, 0x25, 0xbf, 0x00, 0x77, 0xa1, 0xb4, 0x5e, 0x78,
- 0x9b, 0xaf, 0x91, 0x31, 0xdc, 0x0a, 0x9d, 0x18, 0xfd, 0x2e, 0x4b, 0xa9,
- 0xe0, 0xc8, 0x26, 0xcd, 0x5f, 0x0f, 0x82, 0x34, 0x76, 0x73, 0xcf, 0x27,
- 0x65, 0x6d, 0xe9, 0x85, 0x0a, 0x6b, 0x49, 0x82, 0xdc, 0xa4, 0x15, 0x18,
- 0xb3, 0xa0, 0x64, 0x29, 0x80, 0xa8, 0x9f, 0x33, 0x48, 0xaa, 0x60, 0xb7,
- 0xde, 0x21, 0xa7, 0x62, 0x74, 0x43, 0x26, 0x46, 0x01, 0x20, 0x37, 0x2d,
- 0x68, 0x87, 0x86, 0x14, 0xfc, 0xab, 0x2b, 0x40, 0xe1, 0x4a, 0xc5, 0xba,
- 0xb9, 0x87, 0x57, 0x24, 0xd3, 0xf3, 0x66, 0x9d, 0x36, 0x0f, 0x4b, 0xd8,
- 0xee, 0xe3, 0x4d, 0xcc, 0x9c, 0xfc, 0x7c, 0xd4, 0x3e, 0xcc, 0x86, 0x9e,
- 0x28, 0xa2, 0x7f, 0x90, 0x2f, 0xe8, 0xae, 0xfd, 0x8f, 0x7b, 0x18, 0xd3,
- 0x39, 0x10, 0xfd, 0xae, 0xda, 0x90, 0x50, 0xa8, 0xc9, 0x15, 0x79, 0xa2,
- 0x95, 0x6f, 0x3c, 0xa6, 0x8a, 0xfb, 0x93, 0x48, 0xa0, 0x1f, 0xd1, 0x31,
- 0x33, 0x9d, 0xc5, 0x9d, 0x1b, 0xd0, 0x2b, 0x99, 0xd5, 0x0c, 0x6f, 0x0f,
- 0x2e, 0xcf, 0x7e, 0x21, 0xc8, 0x5a, 0xda, 0x1a, 0x1b, 0x15, 0x9c, 0xbf,
- 0xf9, 0x7c, 0x4b, 0xd1, 0x47, 0x2d, 0x9c, 0x92, 0x70, 0x11, 0x29, 0xda,
- 0xd2, 0xfa, 0x0f, 0xf5, 0xd5, 0xd3, 0xf5, 0xef, 0x0e, 0x47, 0x50, 0xdc,
- 0x07, 0x5f, 0x7c, 0xfb, 0xf2, 0xf4, 0xc3, 0xf1, 0xc1, 0x1f, 0x13, 0xfa,
- 0xd7, 0x21, 0xff, 0xeb, 0x70, 0x2b, 0x76, 0x5c, 0x86, 0x51, 0x6d, 0x7f,
- 0xb1, 0x9d, 0xd4, 0x77, 0xcb, 0x49, 0xb9, 0xb0, 0x07, 0x26, 0x5b, 0xa1,
- 0x81, 0xb4, 0x81, 0x48, 0x71, 0x5b, 0xba, 0x2d, 0xae, 0xf2, 0x2e, 0xcb,
- 0xae, 0x25, 0xe9, 0x50, 0xd9, 0x0d, 0x22, 0x78, 0x7e, 0x2d, 0x71, 0x83,
- 0x4a, 0x6b, 0xe5, 0x61, 0x12, 0xcb, 0xeb, 0x4b, 0x04, 0x85, 0x50, 0xd2,
- 0x8b, 0x5d, 0x47, 0x38, 0x07, 0x8b, 0x17, 0x07, 0xe9, 0xec, 0x33, 0x8c,
- 0x30, 0xdb, 0xcc, 0x70, 0x27, 0x5c, 0x29, 0x8b, 0x3b, 0xcd, 0xaf, 0x8b,
- 0x81, 0x40, 0x68, 0x1c, 0x77, 0x82, 0x3f, 0xb0, 0x5d, 0x65, 0x96, 0xf5,
- 0x62, 0xd5, 0xf4, 0x6e, 0x77, 0xb8, 0x89, 0xe8, 0x2e, 0x1e, 0x34, 0xd7,
- 0x29, 0xa1, 0x81, 0x0d, 0x35, 0x3d, 0xc3, 0xb9, 0x3a, 0xc8, 0x18, 0x9d,
- 0x91, 0x66, 0xad, 0xfe, 0x8c, 0xc4, 0x03, 0x7f, 0xb6, 0x30, 0x92, 0x82,
- 0xc3, 0x98, 0xb4, 0x42, 0x82, 0xec, 0x6b, 0x0e, 0xa1, 0x57, 0x18, 0x08,
- 0xc6, 0x6c, 0x0e, 0xd2, 0x4d, 0x96, 0x41, 0x76, 0x56, 0x61, 0x34, 0xc9,
- 0x1d, 0xc3, 0xde, 0x77, 0x7d, 0x4c, 0x10, 0x3d, 0x3e, 0x71, 0x4b, 0x34,
- 0x36, 0xa2, 0xda, 0x13, 0x2b, 0xb8, 0xb8, 0x6a, 0x09, 0x1a, 0x55, 0xf9,
- 0xb4, 0xc0, 0x99, 0xe3, 0xb3, 0x22, 0x39, 0x78, 0x18, 0x26, 0x53, 0xca,
- 0xde, 0x5c, 0xa4, 0x01, 0x12, 0x0d, 0xee, 0x9a, 0xc2, 0x61, 0x50, 0xa0,
- 0xdf, 0x12, 0xbe, 0xf9, 0xfe, 0xdd, 0x22, 0xdb, 0x55, 0xc3, 0x40, 0x85,
- 0xdd, 0xde, 0xdb, 0xf2, 0x1f, 0x66, 0xde, 0xa9, 0x7c, 0x24, 0x26, 0x33,
- 0x45, 0x04, 0xf6, 0xce, 0xdc, 0xf1, 0x17, 0x2e, 0x13, 0xf7, 0xb9, 0x46,
- 0xcb, 0x36, 0x46, 0x10, 0x98, 0xf4, 0x32, 0xa4, 0x6a, 0x07, 0xa4, 0x23,
- 0xda, 0x45, 0x20, 0xa1, 0x3d, 0xbc, 0x19, 0x43, 0xca, 0xa5, 0x64, 0xe8,
- 0x58, 0x12, 0x13, 0xb1, 0xd3, 0x65, 0xe1, 0x5d, 0x9d, 0xaa, 0x47, 0x10,
- 0x1d, 0xdf, 0x66, 0xd5, 0x94, 0xa0, 0x26, 0xa6, 0x46, 0x2f, 0x05, 0x3f,
- 0x9d, 0x8b, 0x7b, 0x8a, 0x72, 0xa9, 0x24, 0x2b, 0xbe, 0x8d, 0x0b, 0x03,
- 0xf1, 0xab, 0x74, 0xd6, 0x4b, 0x62, 0xc8, 0x7d, 0x98, 0x1a, 0xc2, 0x18,
- 0x59, 0x08, 0x3c, 0x15, 0x90, 0x6d, 0xf6, 0xa1, 0x45, 0x66, 0x08, 0x27,
- 0x04, 0x19, 0x7b, 0xd8, 0x61, 0x7d, 0xd1, 0x3b, 0x4d, 0x21, 0x17, 0xcc,
- 0x85, 0x01, 0xcd, 0x5c, 0x74, 0x88, 0xa0, 0x02, 0x80, 0x0b, 0xd5, 0x9f,
- 0x9e, 0x68, 0x4f, 0x07, 0xf8, 0x1d, 0x88, 0x96, 0x14, 0x77, 0x8a, 0x26,
- 0xb5, 0x03, 0xb1, 0xc9, 0xca, 0xa1, 0x62, 0x0e, 0x42, 0xf3, 0x0a, 0x8b,
- 0x91, 0x17, 0xe5, 0x0d, 0xc5, 0x60, 0xda, 0x08, 0xa0, 0x0a, 0xf6, 0xc3,
- 0x39, 0x75, 0xcc, 0x97, 0x87, 0xa4, 0x2b, 0xf1, 0x67, 0x47, 0x1a, 0xad,
- 0x8d, 0x52, 0x80, 0x96, 0xd3, 0x76, 0x2b, 0x91, 0x52, 0x97, 0x41, 0xd1,
- 0xb0, 0x33, 0x99, 0xf5, 0x0b, 0x07, 0xc0, 0x15, 0x13, 0x6c, 0x58, 0xf1,
- 0xa4, 0x6c, 0xae, 0xbc, 0x3c, 0x54, 0x02, 0xf5, 0x23, 0x3f, 0xcf, 0x7c,
- 0xdd, 0xc0, 0x08, 0x50, 0x33, 0xb0, 0x91, 0x54, 0x63, 0x71, 0x16, 0x05,
- 0x59, 0x0f, 0x9f, 0x08, 0xfc, 0x8d, 0x96, 0x68, 0x01, 0x6c, 0x29, 0x81,
- 0xb6, 0x40, 0xa6, 0x38, 0xd1, 0xa5, 0x31, 0x80, 0x81, 0x2f, 0x68, 0xbe,
- 0x49, 0x89, 0x4a, 0x75, 0x4d, 0x58, 0x72, 0x48, 0x49, 0x35, 0x1b, 0x1b,
- 0x40, 0x4e, 0x00, 0x24, 0xa9, 0xf0, 0x8f, 0x74, 0x87, 0xe1, 0x6f, 0x1c,
- 0x70, 0x13, 0xe3, 0x62, 0x90, 0xd5, 0x3e, 0x91, 0xa3, 0xa9, 0x71, 0x7f,
- 0x89, 0x1e, 0x22, 0x4e, 0x11, 0xab, 0xbf, 0xf6, 0x5c, 0xd8, 0x7f, 0xd9,
- 0xa8, 0x09, 0x8c, 0xbc, 0xaa, 0x66, 0x00, 0x5d, 0x40, 0x10, 0xdb, 0xc4,
- 0x78, 0x6c, 0x77, 0xc8, 0xb8, 0x52, 0x17, 0x7f, 0x8b, 0xc5, 0x79, 0xd7,
- 0xab, 0x19, 0xd4, 0x3e, 0x7d, 0x07, 0x8a, 0x92, 0x07, 0x84, 0x59, 0x97,
- 0x72, 0x1b, 0x31, 0x3c, 0x31, 0x19, 0xc7, 0x65, 0x62, 0x20, 0x39, 0xdd,
- 0xfb, 0xef, 0x07, 0x58, 0x5a, 0x48, 0x6d, 0xec, 0xc3, 0x59, 0xfa, 0xbc,
- 0xc1, 0xbc, 0x08, 0xe1, 0x3b, 0x34, 0xb4, 0x5f, 0xc7, 0x02, 0x95, 0x2a,
- 0xc0, 0x0d, 0x87, 0xff, 0xdb, 0xba, 0x98, 0x76, 0x64, 0x54, 0x39, 0xf0,
- 0xf0, 0x38, 0x25, 0x2a, 0x6b, 0x25, 0x44, 0x97, 0xe8, 0xf1, 0x21, 0x81,
- 0xbf, 0xa1, 0x8a, 0x50, 0xaa, 0xde, 0x20, 0xf1, 0xb6, 0xf0, 0x4a, 0x68,
- 0xaf, 0x72, 0x73, 0x42, 0xd5, 0xf4, 0x0a, 0x48, 0x02, 0xf0, 0x23, 0x65,
- 0xea, 0x1c, 0x0d, 0x14, 0x61, 0xf1, 0xfc, 0x63, 0x58, 0xd1, 0xc5, 0x72,
- 0x62, 0x47, 0x84, 0x16, 0x52, 0x16, 0xca, 0xa4, 0xfb, 0xe6, 0x19, 0x66,
- 0x76, 0x5d, 0xd1, 0x9e, 0x67, 0x8b, 0xda, 0x09, 0x48, 0xfb, 0x8e, 0x93,
- 0x94, 0x30, 0xc2, 0x0b, 0xf8, 0x64, 0x59, 0x14, 0xe7, 0xd1, 0x1b, 0x8e,
- 0x99, 0x18, 0x35, 0x47, 0x26, 0x43, 0x76, 0x25, 0xd1, 0xc9, 0x9d, 0x62,
- 0xcc, 0xc8, 0x08, 0x5d, 0x98, 0x99, 0x40, 0xf2, 0x94, 0x76, 0xdf, 0x04,
- 0xc0, 0x46, 0xb7, 0x2a, 0x57, 0xbc, 0x75, 0x26, 0x15, 0x72, 0x64, 0x50,
- 0xf9, 0x34, 0xfa, 0x80, 0x50, 0xfc, 0x6b, 0x38, 0x9c, 0x37, 0x41, 0xba,
- 0x96, 0x77, 0xd6, 0x6d, 0x12, 0x58, 0xcc, 0x05, 0xa3, 0xe7, 0xad, 0xa2,
- 0xf1, 0x5d, 0x53, 0x0d, 0x4f, 0x72, 0xfa, 0x86, 0xbd, 0x78, 0xaf, 0xde,
- 0xd3, 0xdf, 0x72, 0x8b, 0x50, 0x84, 0x3a, 0x5c, 0x34, 0xf6, 0xe0, 0x04,
- 0xd9, 0xb7, 0xdf, 0x76, 0xcb, 0x30, 0x77, 0xce, 0xc6, 0x7b, 0x47, 0xcf,
- 0xf6, 0x77, 0x23, 0x39, 0xcb, 0xe6, 0x1b, 0x3e, 0x4e, 0xe1, 0xa3, 0xfd,
- 0xd1, 0xfe, 0x6e, 0x67, 0x36, 0xb4, 0xdd, 0x1b, 0x00, 0x54, 0x14, 0x5d,
- 0xdd, 0x0a, 0x0d, 0x24, 0x23, 0xbb, 0x62, 0x2d, 0xc9, 0x9b, 0xf6, 0x8b,
- 0x49, 0xdf, 0x67, 0xd7, 0x86, 0xd4, 0xa2, 0xf9, 0x6b, 0xa7, 0x79, 0x2d,
- 0x86, 0x0d, 0x49, 0x32, 0x95, 0x2d, 0x54, 0xad, 0xdd, 0xce, 0x09, 0xc6,
- 0x23, 0x24, 0x2c, 0x39, 0xd7, 0x21, 0x12, 0x6d, 0xa9, 0xcd, 0xa4, 0x2a,
- 0x24, 0xe6, 0x21, 0xa6, 0xff, 0xab, 0x3b, 0x5b, 0x5e, 0xb6, 0xd0, 0x1e,
- 0x9f, 0xfa, 0x67, 0x4a, 0x9a, 0xfe, 0x30, 0xad, 0xa7, 0x79, 0xce, 0xf6,
- 0x4c, 0x8f, 0x19, 0xa3, 0x19, 0x8f, 0xc0, 0x90, 0x43, 0x25, 0x75, 0x9e,
- 0x72, 0xa8, 0xd6, 0x01, 0x95, 0x06, 0xc3, 0x92, 0xb2, 0x6a, 0x48, 0x6c,
- 0xd3, 0xb8, 0x62, 0xc3, 0x53, 0xb3, 0x16, 0xc1, 0x56, 0xb6, 0xfa, 0x65,
- 0xdd, 0x55, 0xa3, 0xcc, 0x5d, 0x60, 0xb8, 0xb2, 0x55, 0x15, 0xd6, 0xf7,
- 0x51, 0x6e, 0x26, 0x32, 0x9e, 0xd3, 0xa6, 0x2e, 0x69, 0x9f, 0x62, 0x9b,
- 0x0a, 0x0f, 0x05, 0xd0, 0x69, 0xad, 0x01, 0x65, 0xef, 0xbe, 0xe4, 0x03,
- 0x7d, 0x39, 0x70, 0xe9, 0x3a, 0x2d, 0x03, 0x28, 0x8d, 0x28, 0x82, 0x0c,
- 0xae, 0x9f, 0x20, 0x3c, 0xce, 0x95, 0x54, 0xb4, 0x10, 0x69, 0x31, 0x01,
- 0xb7, 0x07, 0xe7, 0x88, 0x48, 0x83, 0x09, 0x82, 0x21, 0xb2, 0xbb, 0x15,
- 0x01, 0x97, 0x1a, 0x98, 0xf5, 0x01, 0xba, 0x13, 0x14, 0x54, 0x64, 0x37,
- 0xc4, 0x8d, 0x6b, 0x51, 0x25, 0xaa, 0x2a, 0x27, 0xbf, 0x91, 0x4d, 0x2e,
- 0x60, 0x75, 0x8c, 0xb2, 0x30, 0x49, 0x38, 0xcf, 0x22, 0xb5, 0xdd, 0x53,
- 0xdc, 0xce, 0xda, 0xe6, 0x6c, 0x17, 0x80, 0x9f, 0x24, 0x7c, 0xb9, 0x60,
- 0x6f, 0xd0, 0x1f, 0x00, 0x93, 0x53, 0xd0, 0xd9, 0xa6, 0x9d, 0xfe, 0x41,
- 0x5a, 0x3b, 0xe7, 0x37, 0x33, 0xbc, 0x59, 0xd9, 0x32, 0x30, 0xeb, 0xfe,
- 0x70, 0xc9, 0xde, 0xed, 0xf0, 0xe6, 0xe6, 0x66, 0x48, 0x17, 0x8e, 0x72,
- 0x72, 0xa4, 0xcc, 0x62, 0xd4, 0x02, 0x8f, 0x86, 0x5d, 0xc9, 0x26, 0x27,
- 0x31, 0x91, 0x30, 0xbe, 0xe1, 0xa5, 0x48, 0x55, 0x93, 0xbc, 0x41, 0x3d,
- 0x9f, 0x10, 0x17, 0x5e, 0x93, 0xba, 0x3a, 0x99, 0x0e, 0x34, 0x1c, 0x75,
- 0x44, 0x45, 0x6e, 0x9f, 0x5b, 0x0b, 0xc1, 0x4f, 0x4d, 0x9b, 0x8c, 0xea,
- 0xd7, 0xcd, 0x27, 0x96, 0xcf, 0x93, 0xe1, 0xd7, 0xc9, 0xd6, 0x2b, 0x59,
- 0xed, 0x85, 0x79, 0xe2, 0x79, 0x7b, 0x2d, 0xfc, 0x70, 0x18, 0xcc, 0x31,
- 0xef, 0x6e, 0x3d, 0x0c, 0x3e, 0xb1, 0xf7, 0x22, 0xa3, 0xbb, 0x8a, 0xcb,
- 0x9a, 0x69, 0x22, 0xce, 0x3a, 0x4a, 0x7b, 0x61, 0xb7, 0x16, 0x63, 0x9e,
- 0x61, 0xe9, 0x69, 0x2d, 0x9d, 0x78, 0x26, 0x7c, 0xc3, 0x37, 0x5c, 0xc7,
- 0x2a, 0xbd, 0xb9, 0xff, 0x8e, 0x7b, 0x37, 0x51, 0xa8, 0x77, 0x01, 0x57,
- 0x97, 0x87, 0x47, 0x4c, 0xfe, 0x1d, 0x9b, 0x84, 0x19, 0x99, 0xa9, 0xf4,
- 0xc1, 0x70, 0xc5, 0x54, 0x6c, 0x98, 0x8a, 0x5e, 0xfa, 0xe5, 0x86, 0x3a,
- 0x34, 0xe7, 0x14, 0x76, 0xab, 0x68, 0x45, 0x3e, 0x3a, 0xb0, 0xa6, 0x58,
- 0x96, 0xa5, 0xaa, 0x07, 0x30, 0x1a, 0xb7, 0xba, 0x81, 0xbd, 0x9c, 0x42,
- 0xcb, 0xec, 0xd8, 0xf3, 0x96, 0x29, 0x08, 0xb8, 0xb1, 0xf4, 0x4e, 0x8e,
- 0x73, 0xd0, 0x55, 0x55, 0x80, 0x32, 0x71, 0x59, 0x65, 0x15, 0x11, 0x3a,
- 0xb2, 0xe0, 0x87, 0x9a, 0xc2, 0x1c, 0x13, 0xd6, 0x86, 0xa1, 0xbc, 0xfa,
- 0xea, 0x04, 0xd9, 0xdc, 0x86, 0x91, 0x16, 0x02, 0xe2, 0xc0, 0xf3, 0xe7,
- 0x96, 0x47, 0xd6, 0xa8, 0xbd, 0x24, 0x56, 0xc2, 0x25, 0x91, 0x69, 0x12,
- 0x03, 0x40, 0x55, 0x9b, 0x23, 0x51, 0xe3, 0x42, 0x92, 0x56, 0xc5, 0x46,
- 0x90, 0xcb, 0x6b, 0xc3, 0xbb, 0xa9, 0x2b, 0x11, 0x88, 0xee, 0x17, 0xbe,
- 0xae, 0x60, 0x23, 0x69, 0x2d, 0x11, 0x5c, 0x28, 0x6b, 0x41, 0xfa, 0xb8,
- 0xa3, 0x57, 0x6e, 0x21, 0x95, 0x85, 0x79, 0x6f, 0xf2, 0xf9, 0x78, 0x87,
- 0x37, 0x9c, 0x49, 0xc7, 0x93, 0x62, 0xb7, 0x2e, 0xf3, 0x3d, 0x06, 0x5c,
- 0x8b, 0x45, 0xbe, 0xb4, 0x98, 0xe7, 0xd6, 0x26, 0x46, 0x1a, 0x66, 0xfc,
- 0x1f, 0x24, 0xa1, 0x20, 0x77, 0x0d, 0xcf, 0x23, 0xcd, 0x43, 0xeb, 0x25,
- 0xfd, 0xd1, 0x14, 0xca, 0x4f, 0x12, 0x62, 0xe3, 0xc3, 0x91, 0xfd, 0xf7,
- 0x05, 0x69, 0x4b, 0x5f, 0x8a, 0xa3, 0x8a, 0xf2, 0xe0, 0x6b, 0xcf, 0x1a,
- 0x91, 0x62, 0x59, 0xcc, 0x5d, 0x6b, 0x84, 0x68, 0x1b, 0xe2, 0xc3, 0x71,
- 0x84, 0xd3, 0xdb, 0x3d, 0xa6, 0x38, 0x82, 0x9d, 0xaf, 0xb9, 0x8d, 0xd8,
- 0xbf, 0x75, 0x37, 0xef, 0x8b, 0xfb, 0x77, 0xef, 0xa7, 0x6e, 0xdf, 0xe6,
- 0xdd, 0xe3, 0xf6, 0x0d, 0x9a, 0x2c, 0xfb, 0x85, 0xe7, 0xa0, 0x43, 0xb2,
- 0x07, 0x5b, 0x5f, 0xd6, 0x51, 0xd7, 0xe6, 0x32, 0x9e, 0x91, 0xf9, 0xc5,
- 0x2f, 0x75, 0xea, 0x20, 0x46, 0x58, 0xf4, 0x34, 0xf9, 0xf8, 0x70, 0x1c,
- 0x56, 0xc4, 0xd9, 0xfb, 0xd8, 0x8b, 0xa2, 0x87, 0x63, 0x04, 0xc1, 0x2f,
- 0x9e, 0x36, 0x4c, 0xcc, 0x13, 0xa4, 0x79, 0x0e, 0xe3, 0xc3, 0x69, 0x21,
- 0xa0, 0x28, 0xe2, 0xc1, 0xfa, 0xbe, 0x54, 0xc1, 0xff, 0xf0, 0xc5, 0x21,
- 0xad, 0xc8, 0xb5, 0x0c, 0xf4, 0x33, 0x42, 0x38, 0x04, 0xb3, 0x13, 0xfa,
- 0x0d, 0xf5, 0xfa, 0x08, 0x0c, 0x24, 0xb7, 0x90, 0x52, 0x95, 0x60, 0x77,
- 0xd0, 0xde, 0x30, 0x82, 0xba, 0x83, 0x30, 0xd0, 0x53, 0xce, 0x7b, 0xcf,
- 0x58, 0xcf, 0x8e, 0xda, 0x32, 0x44, 0xcf, 0xee, 0xff, 0xa6, 0xf5, 0x81,
- 0x9e, 0x1d, 0x19, 0x50, 0x84, 0xa1, 0x66, 0x0c, 0x6f, 0x24, 0xdd, 0x27,
- 0xa8, 0x56, 0x20, 0x11, 0xdf, 0x33, 0x3b, 0xa0, 0x0f, 0x90, 0x52, 0x44,
- 0xf1, 0xd6, 0x85, 0xc0, 0x85, 0x32, 0xcc, 0xfb, 0x17, 0x4e, 0x99, 0x19,
- 0xd2, 0x22, 0x87, 0x42, 0xb2, 0x23, 0x10, 0xe1, 0x06, 0x4a, 0xb5, 0x94,
- 0x19, 0x27, 0xca, 0x80, 0xfc, 0xfa, 0x45, 0xa3, 0xe2, 0xab, 0x8a, 0x6c,
- 0x6f, 0x49, 0xca, 0x83, 0xcf, 0x5b, 0x92, 0xd2, 0xbd, 0xb3, 0x49, 0x46,
- 0x8e, 0x33, 0x4e, 0x48, 0xf3, 0x1d, 0x98, 0x78, 0x89, 0xab, 0xac, 0xa9,
- 0x91, 0x47, 0x98, 0xda, 0x44, 0xaf, 0x06, 0x45, 0xc7, 0x9c, 0x5b, 0xe4,
- 0xd5, 0x4e, 0x22, 0xc1, 0x9c, 0xa2, 0x66, 0x62, 0x1d, 0x25, 0x93, 0xaa,
- 0xbc, 0xa9, 0xa1, 0x8e, 0xaa, 0x81, 0x9a, 0x72, 0x0a, 0xec, 0x55, 0x50,
- 0x12, 0x6d, 0xb6, 0x77, 0x61, 0x71, 0x60, 0xbf, 0xbe, 0x78, 0x7b, 0xca,
- 0x8d, 0x1d, 0xb8, 0x3a, 0x97, 0x8a, 0x90, 0x64, 0xce, 0xeb, 0xc9, 0xd2,
- 0x58, 0xd2, 0x46, 0x3b, 0x69, 0x98, 0x95, 0x29, 0x77, 0x0c, 0x4a, 0x88,
- 0x11, 0xd2, 0x93, 0x80, 0xf0, 0x2a, 0x16, 0x9f, 0x11, 0x45, 0xd2, 0xc3,
- 0xa1, 0xf2, 0x34, 0xe0, 0x9f, 0xae, 0xeb, 0x1a, 0x3b, 0x19, 0x19, 0x31,
- 0xd0, 0xa3, 0xde, 0xd0, 0x51, 0xd0, 0x23, 0xc1, 0xed, 0xf3, 0xd4, 0x34,
- 0xf4, 0x1f, 0x03, 0xa4, 0xb4, 0xf5, 0xd0, 0x90, 0xd6, 0x65, 0x9b, 0x8f,
- 0x00, 0x35, 0x2b, 0x6d, 0x6b, 0x5a, 0x41, 0x59, 0xad, 0xd5, 0xbc, 0x5c,
- 0x1b, 0x11, 0x5f, 0xf9, 0x22, 0x3d, 0x84, 0xf4, 0x21, 0x09, 0x24, 0xad,
- 0x2b, 0x72, 0xe6, 0xb1, 0x56, 0x3d, 0x88, 0xe4, 0xdc, 0x8b, 0x42, 0xa2,
- 0xde, 0x7c, 0x1b, 0xda, 0x6c, 0x99, 0x7a, 0xda, 0x2f, 0x81, 0xc6, 0xf6,
- 0x6e, 0x70, 0x44, 0x49, 0x64, 0x84, 0x2a, 0x14, 0x53, 0xe0, 0x34, 0x0d,
- 0xb1, 0x99, 0xd1, 0xd1, 0x0e, 0x2c, 0x85, 0x73, 0x3c, 0x50, 0xef, 0xa2,
- 0x0a, 0xb6, 0x6b, 0x26, 0x52, 0xbb, 0xfe, 0x11, 0x6a, 0x2f, 0x03, 0xa8,
- 0x0b, 0xd0, 0x5c, 0x68, 0x20, 0x51, 0xb6, 0xfd, 0x5d, 0xa1, 0xff, 0x51,
- 0xfc, 0x5f, 0x03, 0x2f, 0xbc, 0x96, 0x93, 0x07, 0xca, 0x8f, 0x17, 0xba,
- 0xc8, 0xfa, 0x32, 0xab, 0x2e, 0xb9, 0x0c, 0x81, 0x21, 0x61, 0xa3, 0x28,
- 0x16, 0x69, 0xe2, 0xa1, 0xb4, 0x25, 0xc9, 0x7f, 0x19, 0xb2, 0x44, 0x85,
- 0xab, 0x6a, 0x4d, 0xf5, 0x2f, 0xe2, 0x4f, 0xdf, 0x1e, 0xce, 0x98, 0xad,
- 0xcc, 0xd2, 0xc2, 0xec, 0x84, 0xb9, 0xb1, 0x61, 0x7e, 0xcc, 0x62, 0xf1,
- 0xc5, 0xa2, 0x5c, 0xd7, 0x77, 0xdb, 0x89, 0xf4, 0xf2, 0x91, 0xf6, 0x17,
- 0x8d, 0xe4, 0xf2, 0xd0, 0x59, 0x9a, 0xf3, 0x5d, 0x17, 0x9f, 0x54, 0x28,
- 0x52, 0xa5, 0x42, 0xcd, 0x8e, 0xda, 0xce, 0x70, 0xdb, 0xde, 0xc7, 0xfe,
- 0x8b, 0x3f, 0x76, 0x74, 0x97, 0xe1, 0xfe, 0x67, 0xc3, 0xf9, 0x61, 0x96,
- 0xb3, 0x0b, 0xc9, 0xc4, 0xcc, 0xe6, 0xa4, 0x15, 0xa9, 0xb3, 0x03, 0x92,
- 0xf0, 0x60, 0x18, 0x5e, 0x0d, 0x39, 0xb8, 0xd4, 0x0d, 0xf0, 0x9b, 0x9e,
- 0xe2, 0x13, 0x27, 0x79, 0x38, 0xa0, 0xe4, 0x90, 0xf3, 0x18, 0xc2, 0xc4,
- 0xf6, 0xbe, 0xf1, 0x4b, 0xe0, 0x46, 0xc9, 0xb9, 0xd9, 0xaf, 0x00, 0x6a,
- 0x82, 0x22, 0xd9, 0x76, 0xb8, 0xb4, 0x05, 0x7a, 0x3a, 0x2f, 0xcb, 0x49,
- 0x5a, 0x6d, 0xcb, 0xde, 0x03, 0x55, 0xdd, 0x0c, 0x38, 0x63, 0xe7, 0x0b,
- 0x9d, 0xf5, 0x70, 0x36, 0x88, 0xde, 0x68, 0xd2, 0x19, 0xf0, 0xee, 0x48,
- 0x8b, 0x3a, 0xf4, 0xe7, 0x14, 0x20, 0x2f, 0x17, 0x33, 0xbb, 0x15, 0xfe,
- 0x57, 0x23, 0x87, 0x86, 0xda, 0x04, 0xe7, 0x0a, 0x50, 0x4f, 0x00, 0xca,
- 0x5b, 0xd4, 0x59, 0x60, 0x9d, 0xfa, 0x84, 0xe2, 0x4e, 0xb0, 0x21, 0x94,
- 0x38, 0x11, 0x87, 0x6d, 0x91, 0x20, 0x89, 0x35, 0xc1, 0x3d, 0xe6, 0x40,
- 0x33, 0x8a, 0xf1, 0x18, 0xc7, 0x53, 0x42, 0x87, 0xbb, 0xcf, 0xbe, 0x24,
- 0x5b, 0x75, 0x43, 0xa6, 0x9b, 0xcf, 0x35, 0x3c, 0x39, 0xe6, 0x8c, 0xb9,
- 0xae, 0x70, 0xdb, 0xe0, 0xda, 0x75, 0xb8, 0xb8, 0x60, 0xaf, 0xc2, 0x5f,
- 0xd9, 0x09, 0x32, 0x3c, 0xd1, 0x2c, 0x3a, 0xfe, 0xe7, 0x05, 0x10, 0x9b,
- 0xe1, 0x9c, 0x1c, 0x46, 0x48, 0xb3, 0x65, 0x5d, 0x66, 0x8b, 0xec, 0x92,
- 0x57, 0xfb, 0xe2, 0xf4, 0xf8, 0xdb, 0xe3, 0xd3, 0x40, 0x6c, 0x7e, 0x35,
- 0x1e, 0xef, 0x7d, 0xca, 0xaa, 0x09, 0x9a, 0xb2, 0x52, 0xe0, 0x22, 0xc1,
- 0x73, 0x36, 0xc1, 0xcb, 0x93, 0x25, 0x37, 0x0e, 0xb2, 0x45, 0x12, 0xbd,
- 0x03, 0x9f, 0x0d, 0x65, 0xf0, 0xf2, 0x27, 0x05, 0xe6, 0x1d, 0x25, 0x47,
- 0x92, 0x4b, 0x08, 0xd9, 0x38, 0xad, 0xb2, 0x19, 0xf7, 0x2c, 0x0d, 0xb3,
- 0x08, 0x81, 0xec, 0x41, 0x7d, 0x39, 0xe8, 0x50, 0x39, 0x93, 0x1c, 0x01,
- 0x2c, 0xbb, 0x88, 0xe0, 0x8d, 0x15, 0xaa, 0xe7, 0x93, 0xd7, 0xf2, 0x4d,
- 0xa9, 0x47, 0xa5, 0x5d, 0x62, 0x60, 0x37, 0xb6, 0x52, 0xce, 0xbe, 0x19,
- 0xbe, 0x1c, 0x0f, 0x5f, 0x1f, 0x9f, 0x1e, 0x7f, 0xf5, 0xf2, 0xe2, 0xd8,
- 0xe2, 0x99, 0xd7, 0x59, 0x8f, 0x0a, 0x26, 0xfa, 0xd7, 0x37, 0xb2, 0x2d,
- 0x58, 0x3f, 0x61, 0xe1, 0x37, 0x39, 0x37, 0x64, 0x51, 0xc8, 0x7f, 0xee,
- 0xac, 0x4d, 0x56, 0x51, 0xc3, 0x79, 0x82, 0xf1, 0xe1, 0xcc, 0xbd, 0x58,
- 0x2c, 0x65, 0xaa, 0xc1, 0x0a, 0xd2, 0xc5, 0x0d, 0x35, 0x66, 0xfb, 0x50,
- 0x50, 0x2a, 0x7d, 0x6e, 0x4b, 0x49, 0x79, 0xf5, 0xbe, 0x47, 0xc8, 0xed,
- 0x6c, 0xeb, 0x80, 0x81, 0x4c, 0xdf, 0xe3, 0x2f, 0xd0, 0x32, 0x70, 0xc4,
- 0x8f, 0x5f, 0xe3, 0xc9, 0x0e, 0xc6, 0xb8, 0x83, 0x46, 0x27, 0x06, 0x23,
- 0xbf, 0x8a, 0x00, 0x96, 0x10, 0x01, 0xd5, 0xd3, 0xab, 0x6c, 0x29, 0xaa,
- 0x2c, 0xa5, 0x26, 0x20, 0x08, 0xce, 0x35, 0x95, 0x82, 0x17, 0xc4, 0x29,
- 0x64, 0x93, 0x8c, 0x21, 0x17, 0x80, 0x91, 0x46, 0x74, 0x1d, 0x4b, 0xf5,
- 0xbd, 0xa1, 0x8e, 0x03, 0x14, 0x6b, 0xa1, 0xb4, 0x1d, 0x14, 0x18, 0x8f,
- 0x90, 0x60, 0xe8, 0xe5, 0x0d, 0x84, 0x79, 0x02, 0xdc, 0x3d, 0xb0, 0x7b,
- 0x67, 0x2d, 0x80, 0xb9, 0x45, 0x5b, 0x2f, 0xe1, 0x3a, 0xc3, 0x8f, 0xb8,
- 0x79, 0x89, 0xe8, 0xdc, 0x34, 0xc9, 0x9f, 0xe9, 0xa8, 0x96, 0xf2, 0x04,
- 0x29, 0x37, 0x24, 0x37, 0x16, 0xcc, 0xe0, 0x78, 0xd6, 0x76, 0x94, 0x69,
- 0x48, 0x37, 0x56, 0x6f, 0xba, 0xcc, 0x1e, 0x18, 0x5a, 0x7d, 0x26, 0xa7,
- 0x83, 0x1f, 0x49, 0x23, 0x02, 0x9b, 0xe2, 0x11, 0x75, 0xe5, 0x3b, 0x8e,
- 0xd1, 0xee, 0x55, 0x40, 0x18, 0xf1, 0xfa, 0xd7, 0xb0, 0xa3, 0x84, 0x2d,
- 0xb5, 0x1b, 0x66, 0xab, 0x00, 0xb0, 0x7b, 0xe7, 0x8d, 0xe2, 0xef, 0x5b,
- 0xdd, 0xd2, 0xef, 0xb5, 0xe6, 0xb5, 0x46, 0x3a, 0x3e, 0x7f, 0xcf, 0xdd,
- 0xd5, 0x4f, 0xe9, 0x2f, 0x12, 0x79, 0xab, 0x63, 0xf8, 0x77, 0xd2, 0xfd,
- 0x83, 0x92, 0x51, 0x32, 0x84, 0x6e, 0x6c, 0x30, 0x5d, 0x93, 0x11, 0x39,
- 0xff, 0x54, 0x80, 0xd6, 0xe5, 0x3a, 0x60, 0x8b, 0x83, 0xe4, 0x7f, 0xdb,
- 0xa0, 0x93, 0x66, 0x42, 0x53, 0x10, 0x84, 0x22, 0x4c, 0x82, 0x73, 0x68,
- 0x35, 0x40, 0x72, 0x46, 0xbf, 0x24, 0x7d, 0x93, 0xe5, 0x5a, 0xd3, 0xc7,
- 0x79, 0xb9, 0x05, 0x82, 0xa8, 0x44, 0x34, 0x2c, 0xbd, 0x99, 0x54, 0x68,
- 0xe7, 0x9a, 0x9a, 0xa9, 0x8c, 0x3a, 0x4b, 0x45, 0x43, 0x2e, 0x82, 0xdd,
- 0x0c, 0xe3, 0x21, 0x68, 0x45, 0x26, 0x8e, 0x38, 0xc9, 0x4a, 0xc7, 0x82,
- 0x35, 0xd7, 0x7e, 0x20, 0x39, 0x06, 0x64, 0x41, 0xa0, 0xed, 0x10, 0xd7,
- 0x0b, 0x20, 0xf9, 0x20, 0xd0, 0xf0, 0xa5, 0x26, 0x41, 0x33, 0xd1, 0xb2,
- 0x3b, 0x09, 0x9b, 0xb3, 0x42, 0x38, 0x97, 0xf0, 0x64, 0x0a, 0x40, 0x59,
- 0x98, 0x36, 0x13, 0xd6, 0x60, 0x90, 0xd5, 0x77, 0x95, 0x16, 0x91, 0x3b,
- 0x67, 0x36, 0xde, 0xf6, 0x44, 0xc3, 0x2a, 0xe5, 0xd8, 0x22, 0x4a, 0x3c,
- 0xd1, 0x46, 0x17, 0xd6, 0xca, 0x18, 0x7a, 0x86, 0x81, 0xe5, 0x14, 0xd7,
- 0x90, 0xa9, 0xf0, 0xce, 0xa0, 0x31, 0x90, 0xd0, 0x5b, 0x19, 0xa3, 0x2a,
- 0x61, 0x2e, 0x2e, 0xda, 0xd2, 0x22, 0xc1, 0xfe, 0xa2, 0x6f, 0xeb, 0x99,
- 0x47, 0x85, 0x8d, 0x87, 0xaa, 0x4b, 0x3d, 0x86, 0xdb, 0x25, 0x38, 0x38,
- 0x3e, 0x08, 0xfb, 0xa2, 0x9b, 0x81, 0x92, 0x71, 0xd1, 0x85, 0xf9, 0x36,
- 0xa6, 0x4b, 0x6e, 0x20, 0x1b, 0x91, 0x25, 0xe2, 0x09, 0xbe, 0xff, 0x1a,
- 0x93, 0xa3, 0xef, 0xe0, 0x05, 0xdc, 0x7b, 0x82, 0x1e, 0xba, 0xd4, 0x1e,
- 0x4f, 0x4c, 0xca, 0x93, 0xcc, 0x7c, 0x2f, 0xa7, 0x1e, 0x78, 0x7e, 0x18,
- 0x20, 0x4c, 0x73, 0xae, 0x0d, 0x01, 0xa2, 0x2a, 0xa0, 0x64, 0x07, 0x10,
- 0xbd, 0x4b, 0xb9, 0x14, 0x59, 0xe2, 0x37, 0x90, 0x04, 0x41, 0xc0, 0x62,
- 0x38, 0x1f, 0x48, 0x3c, 0x13, 0xe9, 0x8d, 0x65, 0x15, 0x96, 0xc0, 0x4e,
- 0x2d, 0xd6, 0x92, 0x3e, 0x99, 0xd6, 0xd7, 0xf1, 0x1b, 0x5e, 0x5f, 0x47,
- 0x6f, 0xf8, 0x03, 0xee, 0xb9, 0xb3, 0xb7, 0x8e, 0xcf, 0xc7, 0xdf, 0x26,
- 0x3d, 0xa0, 0x11, 0xdc, 0xc9, 0x85, 0xaf, 0xb8, 0x5b, 0x1d, 0x11, 0xbd,
- 0x7f, 0xcd, 0xfb, 0xef, 0x79, 0x34, 0x3e, 0x10, 0xdc, 0x73, 0xf3, 0x7d,
- 0xb9, 0xdc, 0xe7, 0x2f, 0xc7, 0xdf, 0x7a, 0xd7, 0xda, 0x23, 0x81, 0x58,
- 0x31, 0xa6, 0xcd, 0x6c, 0xa7, 0x20, 0x31, 0x93, 0x0e, 0x0d, 0x16, 0xa5,
- 0xf7, 0xfa, 0xfa, 0x21, 0xf4, 0x6e, 0x66, 0x12, 0xd0, 0x7b, 0xb0, 0xc7,
- 0x9b, 0xe8, 0xdd, 0x3f, 0xa8, 0x76, 0xd2, 0xac, 0x47, 0xed, 0x05, 0x77,
- 0xd1, 0xa6, 0x02, 0x8f, 0x3e, 0x32, 0xa7, 0x40, 0xa2, 0x90, 0x76, 0x98,
- 0x4a, 0x88, 0x79, 0xfe, 0x34, 0x42, 0x37, 0x2f, 0x04, 0x84, 0xae, 0xe7,
- 0x19, 0xa7, 0xf4, 0x3e, 0x42, 0xd7, 0x94, 0xe2, 0x8c, 0x89, 0xdc, 0xa7,
- 0xf1, 0x90, 0xbe, 0x3d, 0xaa, 0xf5, 0xcb, 0xc0, 0xc3, 0x1d, 0xd2, 0x4c,
- 0x33, 0x07, 0x65, 0xe0, 0x80, 0x1c, 0x22, 0xe0, 0x22, 0x0a, 0xca, 0xc0,
- 0x05, 0xb1, 0xa1, 0x3b, 0xdf, 0x96, 0xe6, 0xb7, 0xaa, 0x1f, 0x2a, 0xd5,
- 0xb0, 0xb9, 0xb1, 0x1a, 0x09, 0x6d, 0xb8, 0x07, 0x7c, 0x40, 0x81, 0x79,
- 0x70, 0x23, 0x5b, 0xe8, 0x41, 0x59, 0xb4, 0x3a, 0xbd, 0xce, 0x28, 0xcf,
- 0x03, 0x30, 0x64, 0xdd, 0x7b, 0x4a, 0x6a, 0x1e, 0xb4, 0x01, 0x52, 0x54,
- 0x86, 0x79, 0x31, 0x0c, 0xd3, 0xa0, 0xfd, 0xd0, 0x56, 0xd3, 0xc2, 0xa6,
- 0xa5, 0x12, 0x45, 0x28, 0xbc, 0x12, 0xe4, 0x20, 0x65, 0x14, 0x96, 0xa6,
- 0xc4, 0x04, 0xd8, 0x2b, 0x19, 0x29, 0xa8, 0x8d, 0x22, 0xac, 0xb5, 0xdb,
- 0xbd, 0x34, 0x65, 0xcb, 0x19, 0xf7, 0xa4, 0x83, 0x62, 0x3c, 0x2b, 0xea,
- 0xa1, 0xeb, 0xd0, 0xfe, 0xc2, 0xfe, 0x35, 0xb0, 0x2f, 0x5e, 0xbf, 0x1b,
- 0x53, 0xe4, 0x2a, 0x43, 0xad, 0x81, 0x9a, 0xc1, 0x75, 0xc6, 0xf5, 0x21,
- 0x97, 0xe0, 0x1c, 0xe6, 0x11, 0x5b, 0xf0, 0x67, 0x9b, 0x22, 0xbe, 0x88,
- 0x3a, 0x84, 0xf0, 0x89, 0xa0, 0x50, 0x2f, 0xe5, 0x82, 0x1b, 0x63, 0xdb,
- 0x21, 0x2e, 0x4e, 0x2b, 0x70, 0x73, 0xd3, 0x8a, 0x76, 0x78, 0x9e, 0x22,
- 0x18, 0x47, 0x5a, 0x96, 0x47, 0xd3, 0xd8, 0xd5, 0xf6, 0xcc, 0x2b, 0x46,
- 0x64, 0x17, 0x0c, 0x32, 0xdb, 0xe1, 0xaa, 0xe8, 0x74, 0xa5, 0xef, 0x2e,
- 0x56, 0x30, 0x93, 0x24, 0x67, 0x6c, 0x77, 0xa3, 0xf1, 0x48, 0x1b, 0xb8,
- 0xba, 0x7e, 0x34, 0xa4, 0x87, 0x25, 0xfd, 0xd0, 0xfe, 0xf4, 0x09, 0x7e,
- 0x3a, 0x0a, 0x36, 0x3a, 0x28, 0xa1, 0x91, 0x0e, 0xaa, 0x16, 0x1d, 0x97,
- 0xb2, 0x1b, 0x8b, 0x19, 0x75, 0xde, 0xc0, 0xd9, 0x6b, 0x23, 0x05, 0x42,
- 0x4b, 0x64, 0xcc, 0x43, 0xd7, 0xbc, 0x2d, 0x09, 0x70, 0x5a, 0x8c, 0x6e,
- 0x53, 0xb7, 0x0e, 0xfd, 0xe8, 0x28, 0x72, 0xe8, 0x76, 0xce, 0x2f, 0x64,
- 0x99, 0xf1, 0x23, 0x6f, 0x49, 0x97, 0x49, 0xce, 0xfd, 0xad, 0x5e, 0xe4,
- 0xab, 0xa1, 0xbe, 0xc5, 0xc2, 0x63, 0x99, 0x7e, 0x12, 0x91, 0xfe, 0x48,
- 0xe8, 0x60, 0x18, 0xc0, 0xac, 0x70, 0xbb, 0x65, 0x74, 0xa5, 0x76, 0xeb,
- 0x6c, 0x11, 0x8d, 0xe8, 0x5b, 0x8d, 0x05, 0x6d, 0x25, 0xa2, 0xe0, 0xef,
- 0xc4, 0x6a, 0xbe, 0x34, 0x3b, 0xdb, 0xf7, 0xf1, 0x68, 0x7d, 0x07, 0x66,
- 0x62, 0xdf, 0xbd, 0xe7, 0xfc, 0x1c, 0x91, 0x6d, 0x3e, 0x3f, 0xdd, 0xb3,
- 0xff, 0x3d, 0xce, 0xef, 0xc9, 0xaf, 0x72, 0x7e, 0x4f, 0xfe, 0xb7, 0x39,
- 0xbf, 0x27, 0xff, 0xf2, 0xf9, 0x3d, 0x0a, 0xce, 0xef, 0xc9, 0xff, 0x2e,
- 0xe7, 0xa7, 0xfd, 0xd5, 0xf4, 0xf4, 0xb2, 0xe0, 0xfc, 0xc6, 0x92, 0x36,
- 0xa2, 0xc0, 0x7c, 0xb4, 0xd3, 0xfa, 0x16, 0x07, 0x69, 0x24, 0xd1, 0x91,
- 0xbd, 0xe0, 0x9a, 0x6b, 0xcb, 0xd0, 0x90, 0x3d, 0x0d, 0x4b, 0x46, 0x5a,
- 0x56, 0xa1, 0x83, 0x9e, 0x9c, 0x27, 0x76, 0x02, 0xde, 0x31, 0x38, 0xa0,
- 0x2d, 0x28, 0x68, 0x51, 0x17, 0x75, 0x4d, 0x7e, 0x4b, 0xb3, 0x7e, 0x2e,
- 0xaf, 0xac, 0x5d, 0x51, 0x70, 0x0c, 0x49, 0xcb, 0x6c, 0xdc, 0xf3, 0x17,
- 0xb4, 0x5d, 0x43, 0x7e, 0xfc, 0x4f, 0xd1, 0x62, 0x37, 0x74, 0x6c, 0x76,
- 0x53, 0x8a, 0x85, 0x25, 0xbc, 0xad, 0x73, 0xe7, 0x66, 0xa3, 0x59, 0xde,
- 0xa1, 0xc5, 0xce, 0xac, 0xab, 0xea, 0xd8, 0x13, 0xbc, 0xff, 0xc8, 0xca,
- 0x2b, 0xe0, 0xf8, 0xbc, 0xf8, 0xf0, 0x3e, 0xf4, 0xbd, 0x99, 0xa5, 0x86,
- 0xd0, 0x88, 0xe6, 0xb8, 0x86, 0x64, 0xdb, 0x0f, 0x81, 0x12, 0x6f, 0x6e,
- 0xe3, 0xd9, 0xd7, 0xbb, 0x9e, 0x13, 0x08, 0x41, 0x8b, 0x32, 0xd6, 0xef,
- 0x8e, 0xcb, 0x6e, 0x6d, 0x69, 0x79, 0x3d, 0xe8, 0xf4, 0xb8, 0xb4, 0x69,
- 0xef, 0x4e, 0x49, 0x81, 0x77, 0x44, 0x0a, 0x76, 0xab, 0xa0, 0xbf, 0x25,
- 0x29, 0x83, 0x79, 0x2d, 0xa8, 0x71, 0x04, 0xa3, 0xa1, 0x72, 0x10, 0x33,
- 0xfb, 0x2d, 0x33, 0xfe, 0x9e, 0x1c, 0xb6, 0x76, 0xf5, 0x35, 0x74, 0xc5,
- 0xf5, 0x72, 0x25, 0xa5, 0xc5, 0xf7, 0x94, 0x56, 0x26, 0xdc, 0x8d, 0x11,
- 0x65, 0x93, 0xec, 0xde, 0x97, 0x2a, 0x23, 0xb5, 0xcc, 0x6d, 0x69, 0x85,
- 0x98, 0xef, 0xbd, 0xc0, 0x68, 0x51, 0x2c, 0xaa, 0x8b, 0x6e, 0x82, 0x14,
- 0x57, 0xc4, 0x28, 0xbe, 0x3a, 0x71, 0x49, 0x4f, 0x6b, 0x96, 0x42, 0x07,
- 0x80, 0x00, 0xf0, 0x57, 0x63, 0xe0, 0xdc, 0x88, 0x12, 0x52, 0x81, 0x15,
- 0xcd, 0x99, 0xd1, 0x05, 0xcd, 0xab, 0x66, 0x98, 0x91, 0x54, 0x59, 0xd5,
- 0x5e, 0x9c, 0xda, 0x16, 0x86, 0x00, 0xdc, 0x29, 0x56, 0x1d, 0x80, 0x60,
- 0x0f, 0xd4, 0x5b, 0xc9, 0xea, 0x13, 0xe8, 0x0e, 0x8b, 0xcd, 0x54, 0x5c,
- 0x6b, 0xed, 0x4d, 0xab, 0x45, 0xc9, 0x70, 0x12, 0x86, 0x03, 0x5a, 0x25,
- 0x80, 0xff, 0x06, 0xda, 0xe8, 0x29, 0xcb, 0x60, 0xd5, 0xcc, 0x73, 0x4c,
- 0x44, 0x6e, 0x92, 0x5f, 0xf5, 0x11, 0x75, 0x05, 0x90, 0xa1, 0xa3, 0x0b,
- 0x94, 0x7e, 0x15, 0xdc, 0x04, 0xa4, 0xed, 0x92, 0xea, 0x18, 0x49, 0x9c,
- 0xfd, 0x1b, 0x24, 0x14, 0x0a, 0xc0, 0x40, 0xf4, 0x18, 0x5b, 0x29, 0xe0,
- 0x9c, 0x5b, 0x7c, 0x95, 0xf9, 0x55, 0xd3, 0x16, 0x82, 0x92, 0xa3, 0x14,
- 0x9c, 0xbc, 0x68, 0x76, 0x51, 0x32, 0x61, 0x83, 0x86, 0x43, 0x40, 0x45,
- 0x90, 0xa9, 0x6f, 0x09, 0x8a, 0xd3, 0x5a, 0xa0, 0x67, 0xb9, 0xe5, 0x32,
- 0x40, 0x6f, 0x7e, 0xbb, 0x2a, 0x65, 0x2f, 0x33, 0xdc, 0x67, 0x51, 0xd9,
- 0x25, 0x87, 0xff, 0x37, 0x65, 0x21, 0x77, 0x00, 0xd7, 0xb8, 0x99, 0xb8,
- 0x85, 0x5c, 0x83, 0x47, 0xb0, 0x68, 0xaa, 0x72, 0x75, 0x97, 0x7c, 0x95,
- 0xd2, 0xb2, 0xa0, 0xd6, 0xa7, 0xd9, 0x32, 0x28, 0x4d, 0xe3, 0xf6, 0xe2,
- 0xa2, 0x66, 0x73, 0xab, 0x71, 0x5d, 0x21, 0xec, 0x02, 0xde, 0x16, 0x43,
- 0xac, 0x66, 0xbf, 0xc8, 0x99, 0x2c, 0x65, 0x23, 0x9c, 0x7a, 0x3d, 0x1e,
- 0x9f, 0x86, 0xb6, 0x9c, 0x36, 0x36, 0xda, 0x88, 0x49, 0x80, 0xd1, 0x86,
- 0xdd, 0xe8, 0x88, 0x0c, 0xfe, 0x22, 0xca, 0x39, 0x64, 0xdd, 0xd9, 0x42,
- 0x31, 0x3b, 0x14, 0x47, 0x7e, 0x5a, 0xdd, 0xad, 0xc8, 0xf8, 0x92, 0x22,
- 0x5c, 0xbe, 0xe6, 0x34, 0x3f, 0x06, 0x81, 0xdd, 0x58, 0xf6, 0xfc, 0xa1,
- 0xf6, 0xb0, 0xd4, 0x21, 0x4b, 0x29, 0x7e, 0x4f, 0xa0, 0xc8, 0x04, 0x6e,
- 0x25, 0xb2, 0x95, 0xa4, 0xce, 0x0c, 0x68, 0x2e, 0xbd, 0x3d, 0xce, 0xa4,
- 0x73, 0x59, 0xa7, 0x3b, 0x06, 0x9b, 0x33, 0x64, 0x69, 0x11, 0x22, 0x22,
- 0xc2, 0x29, 0xbb, 0x2a, 0xdf, 0xe5, 0x0d, 0xa9, 0xda, 0xeb, 0xde, 0x0c,
- 0xdb, 0x3c, 0x21, 0x25, 0x84, 0x87, 0x22, 0x80, 0x92, 0xe1, 0x2c, 0x8f,
- 0x83, 0xfd, 0xfd, 0x7b, 0x31, 0x82, 0xc4, 0x5a, 0xdd, 0x08, 0x15, 0x44,
- 0xec, 0x90, 0x03, 0x1c, 0xb6, 0xa6, 0x3d, 0xcd, 0xa5, 0x60, 0xa9, 0x8b,
- 0xaa, 0x66, 0x3e, 0x69, 0x21, 0x7b, 0xdc, 0x15, 0x64, 0xb6, 0xca, 0x50,
- 0x5a, 0x00, 0x0c, 0x32, 0x77, 0xfb, 0x18, 0x73, 0xac, 0x9f, 0xb7, 0xde,
- 0x89, 0xb6, 0x94, 0xa6, 0x09, 0xd1, 0x4b, 0xa2, 0x7f, 0x8e, 0x92, 0x3f,
- 0xdf, 0x39, 0xbb, 0x1d, 0x0c, 0x91, 0xfd, 0xc1, 0x98, 0x15, 0xfb, 0xf9,
- 0x79, 0xfe, 0xa3, 0x4d, 0xac, 0x3f, 0x8e, 0x03, 0xf4, 0x6f, 0xcc, 0x58,
- 0x30, 0xac, 0xe1, 0x76, 0xab, 0x1a, 0xa3, 0x02, 0x4e, 0x24, 0xee, 0xb0,
- 0xb2, 0xab, 0x35, 0xfa, 0x47, 0xb7, 0xc9, 0x92, 0xd7, 0x2f, 0x89, 0xb9,
- 0xe0, 0x46, 0x3c, 0xe7, 0x36, 0xaa, 0x53, 0x3b, 0x0b, 0xf5, 0x69, 0x5b,
- 0x4d, 0xa1, 0xd2, 0xea, 0x21, 0x0a, 0xa8, 0xbb, 0xa8, 0x11, 0x54, 0x73,
- 0x4d, 0xbc, 0x0b, 0xbe, 0x86, 0xb2, 0xf0, 0x3c, 0x30, 0x84, 0x26, 0xc6,
- 0x99, 0x3f, 0x5a, 0x6b, 0xd5, 0x01, 0xb1, 0xf5, 0x19, 0xab, 0x22, 0xef,
- 0xeb, 0x4d, 0x9f, 0x95, 0x1e, 0x76, 0x95, 0x2d, 0xaf, 0xeb, 0xb8, 0x72,
- 0xd8, 0x97, 0x13, 0xc2, 0x62, 0x70, 0x06, 0xb1, 0x73, 0x13, 0x72, 0xa1,
- 0x38, 0xb2, 0x23, 0xa0, 0x09, 0xb2, 0xea, 0x68, 0x34, 0x96, 0x41, 0x22,
- 0x9d, 0xc8, 0x29, 0x61, 0x9c, 0x4f, 0x39, 0xaa, 0xde, 0x3a, 0x58, 0x35,
- 0xee, 0x33, 0xc6, 0x2b, 0xa9, 0x1d, 0x1c, 0x1c, 0x31, 0x6d, 0xee, 0x99,
- 0x66, 0x46, 0xad, 0x6d, 0x6a, 0x58, 0xe8, 0x11, 0xf5, 0x2a, 0xb4, 0xcd,
- 0x93, 0x84, 0x50, 0x53, 0xaf, 0xe1, 0xbd, 0xe6, 0xe1, 0x2d, 0x02, 0x1b,
- 0xdf, 0x49, 0xae, 0x5c, 0x27, 0x3f, 0x99, 0x54, 0xe0, 0x06, 0x6c, 0x83,
- 0xa2, 0xe3, 0x04, 0xde, 0x98, 0xe0, 0x70, 0x50, 0x02, 0xbf, 0xae, 0xbc,
- 0x18, 0xf9, 0xd6, 0x55, 0x6e, 0x4e, 0xb5, 0xd8, 0x02, 0x30, 0xe4, 0x7a,
- 0xc2, 0x98, 0xa3, 0x8d, 0x7e, 0x34, 0x58, 0xec, 0x7a, 0xe1, 0x39, 0x66,
- 0xe3, 0x6d, 0xc6, 0x5b, 0x09, 0xdf, 0x83, 0xa4, 0x75, 0x21, 0x54, 0x9f,
- 0xe4, 0xb0, 0xbd, 0x2b, 0xbe, 0xe7, 0x73, 0x8b, 0x7a, 0x73, 0x5d, 0x21,
- 0x1e, 0xdd, 0x7c, 0x74, 0xe6, 0x1a, 0xf8, 0x6d, 0x71, 0x9c, 0xa3, 0x39,
- 0x5d, 0x92, 0x13, 0x87, 0x75, 0x55, 0xda, 0xe5, 0x68, 0xd3, 0x12, 0x3a,
- 0x08, 0x81, 0x6c, 0x89, 0x60, 0x0a, 0x4b, 0x6a, 0x5f, 0x7a, 0x87, 0xaa,
- 0x23, 0xfb, 0x69, 0x50, 0x77, 0x00, 0x00, 0x47, 0x60, 0x88, 0x25, 0x34,
- 0x7f, 0xa1, 0x63, 0xda, 0xc2, 0x69, 0x95, 0xaf, 0x1a, 0xce, 0x47, 0x90,
- 0xe4, 0xea, 0x8d, 0xc0, 0x39, 0xe6, 0x6f, 0x97, 0x8b, 0x72, 0x92, 0xf2,
- 0x1d, 0xb1, 0xb9, 0x4d, 0xea, 0xf1, 0x6c, 0x01, 0x16, 0x13, 0x7b, 0x23,
- 0xf2, 0x8c, 0x34, 0x5c, 0x30, 0x4b, 0x1e, 0x3e, 0x47, 0x77, 0x78, 0x0a,
- 0x84, 0x6e, 0xfa, 0xa0, 0xfd, 0x04, 0xc3, 0xff, 0x0d, 0xe7, 0x03, 0xb9,
- 0xbd, 0x5a, 0x95, 0x8d, 0xd4, 0xb0, 0xda, 0xbb, 0x53, 0x81, 0xce, 0x05,
- 0x18, 0x85, 0xd9, 0x3a, 0x6b, 0x67, 0x8a, 0x6d, 0x4b, 0x98, 0x58, 0x5a,
- 0xda, 0x21, 0x5b, 0xc9, 0x76, 0x2a, 0x90, 0x70, 0x6c, 0x34, 0x0b, 0x8a,
- 0x00, 0x82, 0x25, 0x6b, 0x69, 0x60, 0x8c, 0x8f, 0x1b, 0x54, 0x68, 0x14,
- 0x24, 0x95, 0xdc, 0xe4, 0x34, 0xfb, 0xd6, 0xdb, 0x2b, 0x06, 0x56, 0x08,
- 0x29, 0x7e, 0xce, 0x0a, 0x21, 0xfc, 0x97, 0x7c, 0x26, 0x1b, 0x76, 0xc6,
- 0x47, 0x19, 0x6f, 0x9b, 0x08, 0xf6, 0xd3, 0x71, 0xf1, 0x04, 0xb6, 0x56,
- 0x93, 0xd1, 0x40, 0xfe, 0xfd, 0x1d, 0x43, 0x2c, 0x52, 0xfd, 0x96, 0x22,
- 0xf1, 0x00, 0xd8, 0x98, 0xda, 0xce, 0x8f, 0x79, 0x41, 0xbc, 0x32, 0x8f,
- 0x6e, 0x0a, 0xe5, 0xb8, 0x2d, 0xee, 0x38, 0x8b, 0x06, 0x67, 0x0e, 0x7d,
- 0x57, 0x62, 0x06, 0x4a, 0x50, 0x59, 0x33, 0xf5, 0x7e, 0x39, 0xcb, 0xd2,
- 0x45, 0xac, 0x5b, 0x06, 0x4d, 0x98, 0x1c, 0xdd, 0xcc, 0xda, 0x08, 0x26,
- 0xa5, 0x90, 0x90, 0x89, 0xe4, 0x58, 0x73, 0x96, 0xa1, 0x18, 0x07, 0x76,
- 0x86, 0xb8, 0x55, 0x11, 0xed, 0x9a, 0xfa, 0xf7, 0xe0, 0x01, 0xd4, 0x0e,
- 0x4f, 0x05, 0x91, 0x00, 0x01, 0x4f, 0x57, 0x82, 0x43, 0x98, 0x6e, 0x94,
- 0x90, 0xa8, 0x0f, 0x80, 0x02, 0x90, 0x0f, 0xdf, 0x1d, 0x4e, 0x1c, 0xa9,
- 0x5c, 0x17, 0x0a, 0x21, 0xa3, 0x65, 0x1b, 0x34, 0x31, 0xce, 0x81, 0x21,
- 0x26, 0xb9, 0x2b, 0xf7, 0x10, 0x79, 0x16, 0xc2, 0x39, 0x56, 0xe1, 0x49,
- 0x5f, 0x67, 0x9a, 0x19, 0x05, 0x53, 0x86, 0x0f, 0xa0, 0xb1, 0xc5, 0xb2,
- 0x34, 0x9a, 0xf0, 0x19, 0x66, 0x32, 0x87, 0x87, 0x3d, 0xa6, 0x97, 0xf4,
- 0x49, 0x17, 0x1a, 0xc3, 0x65, 0xaf, 0xd3, 0x79, 0xa6, 0xc0, 0xa9, 0xc2,
- 0xbe, 0xcb, 0xa9, 0xd9, 0x42, 0x04, 0x69, 0x01, 0x4a, 0x44, 0xda, 0x51,
- 0x60, 0x41, 0x33, 0xd7, 0x24, 0x2e, 0x69, 0x45, 0x2e, 0x5d, 0x04, 0x61,
- 0xb7, 0xf5, 0x22, 0x5f, 0xa9, 0x7f, 0x7a, 0x90, 0x64, 0x92, 0x55, 0xb4,
- 0xb8, 0x93, 0x53, 0x59, 0x0f, 0x23, 0xa6, 0x97, 0x6d, 0xe6, 0x2e, 0xf0,
- 0xb7, 0x0b, 0x52, 0xfc, 0x77, 0x3a, 0xa3, 0x3f, 0xda, 0x3f, 0xc0, 0x64,
- 0x1f, 0xed, 0x3f, 0xdd, 0x6d, 0x4b, 0xe5, 0x45, 0x9d, 0x0d, 0x91, 0xb4,
- 0x16, 0xd7, 0x4e, 0xb9, 0x55, 0x9d, 0xf3, 0xab, 0x43, 0x13, 0xa5, 0x97,
- 0x24, 0xd3, 0x6d, 0xb6, 0xae, 0xd4, 0x94, 0xa3, 0x26, 0x86, 0x64, 0x98,
- 0xd6, 0x57, 0x84, 0xba, 0x18, 0x48, 0x79, 0xf7, 0x0e, 0x8c, 0x36, 0xc4,
- 0x6e, 0x78, 0x9f, 0x52, 0xbc, 0x2a, 0x0d, 0xd2, 0x78, 0x1f, 0xf0, 0x1c,
- 0x59, 0xa5, 0x1c, 0x60, 0x88, 0xb5, 0x33, 0x55, 0x24, 0x07, 0x4e, 0x12,
- 0x93, 0xf0, 0x5d, 0xbb, 0xdd, 0xb0, 0xe5, 0x3b, 0x6f, 0xf2, 0x22, 0xaf,
- 0xaf, 0xd0, 0xa6, 0xb8, 0xae, 0xd3, 0xcb, 0x2c, 0x2c, 0x70, 0x37, 0x0c,
- 0xc9, 0x98, 0x4c, 0xdc, 0x46, 0xaf, 0x02, 0x32, 0x3d, 0xa5, 0x86, 0xf1,
- 0xbe, 0x4b, 0xc1, 0x8a, 0xf4, 0xd8, 0x03, 0x32, 0x9a, 0x5b, 0x66, 0x8c,
- 0x5e, 0xf2, 0xda, 0x6b, 0x00, 0xd9, 0xd7, 0xff, 0x91, 0xba, 0x91, 0x01,
- 0x22, 0x8b, 0x7b, 0x03, 0x71, 0x73, 0xa0, 0x58, 0xd7, 0x17, 0xa3, 0x6a,
- 0x9b, 0xc3, 0x3d, 0x1b, 0x1b, 0x16, 0xe4, 0x7a, 0x15, 0x23, 0x05, 0xd0,
- 0xfc, 0xec, 0x7b, 0xa3, 0x8b, 0x8e, 0x9e, 0xd9, 0x1f, 0xef, 0x3e, 0xac,
- 0x61, 0xe4, 0x61, 0x47, 0x37, 0xa3, 0x5c, 0x5c, 0x89, 0x44, 0xc0, 0x54,
- 0xf9, 0x82, 0xff, 0x11, 0xf7, 0x75, 0xa0, 0xae, 0xd5, 0x58, 0x91, 0x6f,
- 0x5f, 0x02, 0x52, 0xca, 0x21, 0x3c, 0x7b, 0x69, 0xbb, 0xad, 0x1a, 0x3d,
- 0x74, 0xcf, 0x24, 0x55, 0x35, 0x0a, 0xf0, 0x67, 0x31, 0x79, 0x39, 0x83,
- 0xd0, 0x45, 0xdd, 0x54, 0x97, 0x33, 0x82, 0xb7, 0x21, 0xc3, 0x94, 0xa0,
- 0x77, 0x92, 0xd3, 0x8c, 0x9b, 0xe5, 0x24, 0xdb, 0x5f, 0x6e, 0x47, 0xaa,
- 0xf9, 0xb6, 0x5f, 0x78, 0x08, 0xe3, 0xb5, 0x6b, 0xc4, 0xb5, 0xfd, 0x47,
- 0x4a, 0x4a, 0x26, 0x30, 0x15, 0xfe, 0xa6, 0x9c, 0x01, 0xe7, 0xd7, 0xc6,
- 0xc3, 0xfa, 0x9a, 0xd2, 0x27, 0xf8, 0x80, 0xed, 0xe4, 0x21, 0x6e, 0x7c,
- 0x4d, 0xd8, 0xeb, 0x9d, 0x75, 0xab, 0x3e, 0xb7, 0x1d, 0x54, 0xfb, 0x51,
- 0xea, 0x3e, 0xa3, 0xf5, 0x48, 0x77, 0x70, 0xd7, 0xc6, 0x94, 0xe7, 0xc4,
- 0x93, 0x81, 0xaf, 0x72, 0x3a, 0xcd, 0x49, 0x73, 0xc1, 0xd5, 0x37, 0xbf,
- 0xbc, 0xbc, 0x8c, 0xa6, 0x38, 0x99, 0x2d, 0xa0, 0x83, 0xa7, 0x35, 0xcf,
- 0xb3, 0xb4, 0x81, 0xbe, 0x41, 0x72, 0xbe, 0x3f, 0x79, 0xda, 0xe9, 0xee,
- 0x91, 0x67, 0xbc, 0x55, 0xbc, 0xf0, 0xeb, 0x53, 0xe2, 0x54, 0x00, 0x22,
- 0x60, 0x1a, 0x20, 0x44, 0x4f, 0xfc, 0xcc, 0x7a, 0xbb, 0xe6, 0xa9, 0x21,
- 0x8a, 0x3b, 0x09, 0x2d, 0x2f, 0x50, 0x4f, 0xc0, 0x1c, 0x24, 0x5b, 0x06,
- 0x3c, 0x6c, 0xa1, 0xa9, 0xb9, 0x9c, 0xc1, 0x4e, 0xbd, 0x44, 0x38, 0xd9,
- 0x99, 0xf6, 0x99, 0xe5, 0x81, 0x4b, 0x7a, 0x4f, 0xb4, 0xa1, 0x86, 0xcb,
- 0x65, 0xef, 0x7a, 0x45, 0xfc, 0xcc, 0x76, 0x51, 0x55, 0xd4, 0x06, 0x44,
- 0x72, 0xbe, 0x30, 0x0c, 0xcf, 0x57, 0x99, 0xf8, 0xc5, 0x8c, 0x5d, 0x1f,
- 0x25, 0x4c, 0x08, 0xc3, 0x8d, 0xf6, 0x70, 0x49, 0xb8, 0xa2, 0x60, 0x4a,
- 0x30, 0x36, 0x60, 0x32, 0x65, 0x42, 0x4d, 0xda, 0x0e, 0x8f, 0x3e, 0xff,
- 0x7c, 0x14, 0xc5, 0x39, 0xe5, 0xf2, 0x6c, 0x43, 0x84, 0xb4, 0x53, 0x0e,
- 0x13, 0x73, 0x60, 0xd1, 0x8d, 0xe9, 0xfb, 0x44, 0x61, 0x28, 0x1f, 0x2b,
- 0x97, 0x04, 0x5d, 0x44, 0xcc, 0x71, 0xbd, 0x08, 0xcd, 0x7b, 0x84, 0x1e,
- 0x97, 0xa4, 0x56, 0x08, 0x17, 0x83, 0x7a, 0x45, 0x5c, 0x63, 0x99, 0xf7,
- 0xa8, 0x74, 0x99, 0xa4, 0xe7, 0x71, 0x2a, 0xa7, 0x40, 0x03, 0x4a, 0x3e,
- 0x29, 0xa7, 0xfd, 0x1a, 0xad, 0x01, 0x39, 0xee, 0x9c, 0xf5, 0xc1, 0xdb,
- 0xb1, 0xdd, 0x53, 0x0e, 0xba, 0x9d, 0x68, 0xf4, 0x73, 0x92, 0x59, 0x7c,
- 0x05, 0xee, 0xbc, 0xd5, 0x41, 0xc0, 0xe1, 0x92, 0xf1, 0x82, 0x6a, 0xc2,
- 0xa8, 0xd3, 0x85, 0xf9, 0x40, 0x67, 0x38, 0x54, 0x48, 0x5f, 0x66, 0x4d,
- 0x58, 0xc7, 0xe4, 0x65, 0xf7, 0x6e, 0x18, 0x3c, 0x66, 0x13, 0x49, 0x19,
- 0x56, 0xf2, 0x62, 0x24, 0x91, 0x84, 0x59, 0x3e, 0xd7, 0x4b, 0x6a, 0xbb,
- 0x43, 0x7c, 0x89, 0xd3, 0x78, 0x21, 0x5b, 0x2f, 0x65, 0x89, 0x5f, 0x46,
- 0x31, 0xce, 0x24, 0xc5, 0x18, 0x80, 0x5b, 0x4d, 0x63, 0xd4, 0x6a, 0xc7,
- 0xbb, 0x91, 0x45, 0xce, 0xbd, 0x08, 0xb8, 0x76, 0x87, 0x37, 0x98, 0xf3,
- 0x36, 0x17, 0x31, 0x90, 0x8d, 0x17, 0x76, 0x50, 0x69, 0x75, 0x42, 0x89,
- 0xfc, 0x34, 0x95, 0xd8, 0x4e, 0x28, 0x4e, 0x39, 0xf1, 0x07, 0xf3, 0x74,
- 0x60, 0xf5, 0xd0, 0xbb, 0xde, 0x3e, 0x85, 0x67, 0xef, 0x47, 0xd6, 0x04,
- 0x51, 0x83, 0xb7, 0xd8, 0x25, 0x80, 0xfb, 0xd1, 0x19, 0x59, 0xa9, 0xd1,
- 0x84, 0xe3, 0xdd, 0xb9, 0x69, 0xa9, 0xae, 0x92, 0x1b, 0x94, 0x75, 0x59,
- 0x66, 0x3c, 0x4b, 0xc0, 0x6a, 0xe8, 0xae, 0x92, 0xaf, 0xb2, 0xa9, 0xd6,
- 0x53, 0x52, 0x2c, 0x61, 0x94, 0xe3, 0x53, 0xb1, 0x6e, 0x5c, 0xea, 0x5e,
- 0xb5, 0x2b, 0x46, 0xcf, 0x3c, 0x9c, 0x17, 0x76, 0x59, 0x00, 0x01, 0xd9,
- 0xc2, 0x13, 0xbc, 0x48, 0xce, 0x50, 0x1d, 0x46, 0xfb, 0xb8, 0x66, 0x70,
- 0xb7, 0xd4, 0xf9, 0x3f, 0x58, 0x29, 0x93, 0xd4, 0x5e, 0x85, 0x47, 0x83,
- 0x83, 0x23, 0x23, 0xc0, 0xfe, 0xe4, 0x35, 0x75, 0x19, 0x65, 0x51, 0x4e,
- 0xf4, 0x16, 0xf0, 0x69, 0x3f, 0xb1, 0x9d, 0x25, 0x12, 0xa9, 0x71, 0x55,
- 0x76, 0xb9, 0x26, 0x29, 0x87, 0x7d, 0xda, 0x51, 0x38, 0x54, 0x7d, 0x62,
- 0x95, 0xaf, 0xd0, 0xc9, 0xc4, 0xd8, 0x73, 0x41, 0xae, 0xbc, 0x79, 0x8b,
- 0xfb, 0x87, 0xae, 0x0b, 0xb3, 0x5d, 0xcd, 0x9a, 0x62, 0x90, 0x82, 0x07,
- 0x63, 0xf8, 0xd7, 0xdf, 0xe0, 0xfa, 0x2b, 0x65, 0xe9, 0xdc, 0x7b, 0x63,
- 0x66, 0x4d, 0xef, 0x6c, 0x1e, 0xd8, 0x2e, 0x19, 0x32, 0x5f, 0x00, 0x64,
- 0x46, 0xa9, 0x24, 0x8d, 0x32, 0x00, 0x6e, 0x34, 0x47, 0x8e, 0x98, 0x3f,
- 0x52, 0x9c, 0x72, 0x9a, 0x39, 0x18, 0x57, 0x6c, 0x0a, 0xaa, 0xaa, 0x83,
- 0x5b, 0x0d, 0x44, 0x44, 0xd5, 0x9d, 0x7c, 0x9c, 0x4c, 0x69, 0x76, 0x32,
- 0x60, 0xe4, 0x57, 0x2e, 0x6f, 0x12, 0xd0, 0x9f, 0xb4, 0xe6, 0xf2, 0x89,
- 0x3a, 0x6c, 0xc0, 0x0a, 0x21, 0xc0, 0x5a, 0xf5, 0xdf, 0xac, 0xc1, 0x4b,
- 0x9c, 0x2f, 0x02, 0x9f, 0x04, 0xdc, 0xd8, 0xe7, 0x9c, 0xa7, 0x81, 0x76,
- 0x76, 0xc2, 0xd0, 0x6c, 0x5c, 0x42, 0xca, 0xa3, 0x58, 0x45, 0xdc, 0x36,
- 0xac, 0x93, 0xf6, 0x7e, 0x5b, 0x2e, 0x6e, 0x0c, 0xb3, 0xc7, 0xd9, 0xf9,
- 0x60, 0xd5, 0x7c, 0x4d, 0x2c, 0xd2, 0xa5, 0xe5, 0x21, 0xa4, 0x52, 0x55,
- 0xa9, 0xe1, 0x98, 0x7f, 0x5b, 0x5d, 0xf6, 0x80, 0x2a, 0x72, 0xcf, 0x1c,
- 0x63, 0x2b, 0x84, 0x4d, 0xba, 0x40, 0x87, 0xc3, 0x37, 0x89, 0xcc, 0xe7,
- 0x8b, 0x2f, 0x5b, 0xc3, 0x69, 0xe3, 0x0a, 0x1f, 0x97, 0x5d, 0x30, 0x3e,
- 0xa6, 0x97, 0xf9, 0x3d, 0x9b, 0xc0, 0x4d, 0x0d, 0x6c, 0x3a, 0x71, 0x7d,
- 0x55, 0x66, 0x72, 0x76, 0x05, 0x4c, 0x60, 0xdb, 0x83, 0xc9, 0xac, 0xab,
- 0x8e, 0x76, 0xd4, 0x50, 0x8d, 0xb7, 0x7f, 0xda, 0x90, 0xeb, 0xff, 0x51,
- 0x5e, 0x15, 0xf4, 0x0f, 0xfa, 0x02, 0x7d, 0xe0, 0x8b, 0x83, 0x83, 0xe8,
- 0xcc, 0x7b, 0xe7, 0xcb, 0x13, 0xd6, 0x19, 0x93, 0x30, 0x92, 0x14, 0x51,
- 0x8f, 0xb7, 0xb5, 0x4c, 0xff, 0x11, 0xaa, 0xe6, 0x42, 0x37, 0x1b, 0xee,
- 0x10, 0xf0, 0xc8, 0xbc, 0x57, 0x39, 0xfd, 0x2e, 0xca, 0x12, 0x73, 0x2b,
- 0x1f, 0x16, 0x21, 0xb8, 0x85, 0xd1, 0xd5, 0xe8, 0x48, 0xfa, 0x17, 0xbf,
- 0x45, 0xb1, 0xa0, 0xbb, 0x2f, 0x5e, 0x5c, 0xad, 0x2f, 0x33, 0xf0, 0xcd,
- 0xe6, 0xb6, 0xd9, 0x7a, 0xd0, 0xca, 0xc9, 0x4b, 0xc1, 0x6e, 0x0a, 0x4e,
- 0xb1, 0x6e, 0xbc, 0x64, 0x23, 0xd4, 0x2c, 0xb4, 0x54, 0x08, 0x4e, 0xc5,
- 0x24, 0x4b, 0x49, 0x43, 0x5d, 0xdd, 0xba, 0x22, 0x56, 0x46, 0x07, 0xbc,
- 0x69, 0x82, 0x7b, 0xe1, 0x2a, 0xed, 0x37, 0xac, 0xe0, 0x26, 0x9b, 0x7c,
- 0xf1, 0x25, 0xf9, 0xb6, 0x6e, 0xd1, 0x3f, 0x80, 0xb5, 0x5a, 0xda, 0xba,
- 0x3d, 0xb4, 0x13, 0x48, 0xbc, 0x45, 0x74, 0x07, 0x29, 0xab, 0xfe, 0x61,
- 0xbd, 0x3a, 0x27, 0x6f, 0xc8, 0x79, 0x59, 0x6e, 0x1c, 0x51, 0x7d, 0x37,
- 0xd8, 0x13, 0x2f, 0x99, 0x91, 0x53, 0xfc, 0x5c, 0x0d, 0x27, 0x13, 0x04,
- 0xe4, 0x4c, 0x4b, 0x5c, 0xc6, 0x6a, 0xea, 0xc9, 0x43, 0x26, 0xfd, 0xcc,
- 0x55, 0xe2, 0x7c, 0x31, 0x40, 0x99, 0x4f, 0xbc, 0x63, 0x8c, 0x5b, 0x03,
- 0x5f, 0x47, 0x40, 0x20, 0xd1, 0x5f, 0xff, 0x68, 0x5f, 0xa7, 0xff, 0x98,
- 0xdb, 0x0c, 0x44, 0xee, 0x0d, 0xab, 0xa1, 0x50, 0xa0, 0xbe, 0xb3, 0x87,
- 0xf0, 0x93, 0x6d, 0x04, 0xb5, 0x3d, 0x60, 0x45, 0xfb, 0x8f, 0xdb, 0x70,
- 0xe3, 0x6a, 0x90, 0x1a, 0xed, 0x99, 0xc0, 0xe3, 0x66, 0x65, 0xa0, 0xd6,
- 0x52, 0x36, 0x26, 0xf7, 0x6f, 0xc2, 0xec, 0x7b, 0x26, 0x4e, 0x33, 0xd7,
- 0xa9, 0xff, 0xb0, 0x65, 0x27, 0xff, 0xc3, 0x96, 0x9b, 0xfe, 0x0f, 0x5b,
- 0x6e, 0x01, 0x3f, 0x6c, 0x11, 0x0c, 0x25, 0x2d, 0x22, 0x34, 0x88, 0x7f,
- 0xea, 0xa1, 0x6f, 0xf3, 0x57, 0xdd, 0x47, 0xbd, 0x6f, 0x7a, 0x9f, 0xdc,
- 0xda, 0xde, 0xb4, 0x69, 0x7e, 0x6c, 0x08, 0x75, 0x31, 0xdd, 0x3d, 0x34,
- 0xec, 0xba, 0xb5, 0x4d, 0x6e, 0x5b, 0xc8, 0x38, 0x0b, 0x3a, 0x78, 0x7b,
- 0x0f, 0xd0, 0x8e, 0xbb, 0xe6, 0x54, 0x5e, 0xd3, 0x05, 0x8b, 0x62, 0xa9,
- 0xe7, 0xa0, 0xbd, 0x9f, 0x03, 0x79, 0x64, 0x5f, 0x0f, 0xe4, 0xcf, 0x7f,
- 0x33, 0x5f, 0x80, 0xfe, 0x8f, 0x31, 0xe4, 0x56, 0x03, 0xc0, 0x46, 0xf2,
- 0xf2, 0x90, 0x30, 0x5d, 0x70, 0xd4, 0x92, 0xc5, 0xdf, 0x9c, 0x2b, 0x8d,
- 0x98, 0x24, 0x82, 0x5c, 0xfa, 0x65, 0x8e, 0x56, 0x65, 0x66, 0x55, 0x0b,
- 0xb6, 0x50, 0xf7, 0x48, 0x2a, 0x20, 0xf7, 0x15, 0x1d, 0xc4, 0x6a, 0x98,
- 0xe8, 0x62, 0xbc, 0x4a, 0x1f, 0x36, 0xde, 0x87, 0x7e, 0x92, 0x26, 0x45,
- 0x7c, 0x51, 0x56, 0xf5, 0x17, 0x5b, 0x15, 0x75, 0x7e, 0x4d, 0x2e, 0x2b,
- 0xa3, 0xc1, 0xfe, 0x91, 0x48, 0x6b, 0x6d, 0x0e, 0xcb, 0xdd, 0xd3, 0xdb,
- 0xe1, 0xf2, 0xce, 0xcc, 0x7b, 0xfb, 0x27, 0x51, 0x86, 0xc7, 0xd2, 0x66,
- 0x88, 0xd2, 0x1b, 0xe6, 0xb8, 0x4c, 0xba, 0x79, 0x0a, 0x7c, 0x75, 0xbd,
- 0x4b, 0x29, 0xbf, 0xff, 0x22, 0x06, 0x73, 0x17, 0x2c, 0xc4, 0xe3, 0xbc,
- 0x30, 0xd5, 0xbe, 0x38, 0xfb, 0xe6, 0x8f, 0x3a, 0xc0, 0x0f, 0x5b, 0xdf,
- 0x0f, 0xf9, 0xa7, 0xa8, 0x17, 0x7e, 0x9e, 0x9c, 0x7d, 0x43, 0xd4, 0xfd,
- 0xd3, 0x18, 0xd8, 0xa6, 0x0f, 0x7c, 0xc9, 0x7f, 0x01, 0x65, 0x6f, 0x1a,
- 0xf6, 0xc2, 0xe5, 0x49, 0x7c, 0x41, 0x0d, 0x8c, 0x51, 0x67, 0x04, 0x2b,
- 0x7c, 0xb5, 0xa2, 0xca, 0x21, 0xad, 0x8f, 0x6d, 0xb8, 0x3e, 0x16, 0x51,
- 0xa3, 0x74, 0x52, 0x72, 0x8a, 0x74, 0x13, 0x62, 0x63, 0x03, 0x9b, 0x17,
- 0x67, 0x2b, 0xbe, 0xab, 0x15, 0x1c, 0x17, 0x50, 0x87, 0xdb, 0x69, 0x06,
- 0xed, 0x5a, 0xc6, 0x41, 0x72, 0x1c, 0x69, 0x82, 0xe0, 0xc0, 0x8d, 0xf8,
- 0x6f, 0xd0, 0xcb, 0x6c, 0x6f, 0x6e, 0x6a, 0xa8, 0x96, 0x56, 0x99, 0x76,
- 0xc8, 0x91, 0x9e, 0x7e, 0x08, 0x30, 0x19, 0x82, 0x89, 0x84, 0x02, 0x24,
- 0x3a, 0x29, 0x89, 0xe8, 0xf3, 0x72, 0x21, 0x5d, 0xdc, 0x6b, 0x43, 0xf5,
- 0x7c, 0xc0, 0xb6, 0x8d, 0x9e, 0xd1, 0x38, 0x68, 0x2b, 0x24, 0x52, 0x21,
- 0x9f, 0x8d, 0xa8, 0x1c, 0x12, 0x4d, 0x64, 0x6f, 0x9c, 0x34, 0x6d, 0x03,
- 0x60, 0x18, 0x13, 0xfe, 0x1f, 0xc9, 0xe8, 0x9f, 0x64, 0x70, 0x3e, 0xd9,
- 0xaa, 0xcc, 0xa1, 0x38, 0x87, 0x23, 0x1e, 0x9c, 0xc4, 0xde, 0x1b, 0xbd,
- 0x38, 0x9c, 0x06, 0xa1, 0xa5, 0x9a, 0x94, 0x27, 0xf6, 0x35, 0xa9, 0x84,
- 0x92, 0xc8, 0xae, 0x9d, 0x6d, 0x48, 0xbc, 0xc4, 0x17, 0x8b, 0x3b, 0xac,
- 0x6a, 0x44, 0x78, 0xdb, 0x92, 0xdf, 0x89, 0x2f, 0x59, 0x1f, 0x4b, 0x45,
- 0xdf, 0x92, 0xc3, 0x1a, 0x05, 0x2f, 0x7c, 0x2f, 0x49, 0x41, 0xc3, 0x83,
- 0xe7, 0x5e, 0x97, 0x22, 0xfe, 0x59, 0x7c, 0x78, 0x1f, 0x04, 0x46, 0x03,
- 0xc4, 0xb5, 0x6c, 0xff, 0x86, 0xf1, 0x0f, 0xed, 0xf8, 0x9f, 0x45, 0x70,
- 0x57, 0x18, 0x19, 0x25, 0xfe, 0xd9, 0x0b, 0x97, 0x04, 0xa8, 0x5e, 0x54,
- 0xeb, 0xc9, 0x68, 0xf9, 0x10, 0x14, 0xf2, 0x99, 0x31, 0x59, 0x38, 0xdc,
- 0x10, 0x36, 0x79, 0x60, 0xb8, 0x4a, 0x98, 0x81, 0x58, 0x87, 0xd9, 0xc6,
- 0xae, 0x89, 0xc8, 0xa2, 0x5e, 0x08, 0xab, 0x5c, 0x12, 0x04, 0xeb, 0xec,
- 0xb9, 0xeb, 0x79, 0xc9, 0x20, 0x12, 0xb9, 0x9f, 0x5f, 0xef, 0xea, 0x68,
- 0x83, 0xb2, 0xc6, 0x16, 0xc0, 0x71, 0xf0, 0x29, 0xc3, 0x8a, 0x19, 0x7a,
- 0xc9, 0x6b, 0xc8, 0xb8, 0xbd, 0xb3, 0x2d, 0x4e, 0x15, 0xfa, 0x10, 0xb5,
- 0x8a, 0x44, 0x22, 0x14, 0x8a, 0xb1, 0x53, 0x60, 0x66, 0x88, 0x2f, 0x67,
- 0x18, 0xd1, 0x3a, 0x9e, 0x83, 0xb5, 0xdb, 0x3b, 0xc1, 0x40, 0x41, 0xc0,
- 0x09, 0x52, 0xbb, 0x99, 0x41, 0xbd, 0x5a, 0xe0, 0x40, 0xa1, 0x91, 0xec,
- 0x6d, 0xb1, 0x0c, 0xc6, 0xb6, 0xa9, 0xcb, 0x56, 0x4c, 0x93, 0xed, 0x2f,
- 0x76, 0xb7, 0xed, 0xd2, 0xfa, 0xcd, 0xa2, 0xa0, 0xe3, 0xa3, 0x06, 0x21,
- 0x6d, 0x1f, 0x58, 0x78, 0x96, 0x96, 0x94, 0xfb, 0x90, 0x0d, 0x71, 0xa0,
- 0x51, 0x04, 0xbd, 0xba, 0x11, 0x6f, 0x27, 0x12, 0xcb, 0x71, 0x3b, 0x19,
- 0xeb, 0x85, 0x49, 0x3c, 0x5d, 0x34, 0x94, 0xaa, 0x8f, 0x62, 0x0a, 0x46,
- 0xfb, 0xab, 0x9f, 0x7b, 0xfa, 0x78, 0xe4, 0x7a, 0x52, 0x20, 0x07, 0x4d,
- 0x14, 0xc4, 0x25, 0xe2, 0x79, 0x34, 0x36, 0xa9, 0xde, 0xdb, 0x5f, 0xec,
- 0xb0, 0xc0, 0x72, 0xfe, 0x34, 0xef, 0xdb, 0xdb, 0xc9, 0x0f, 0xf1, 0xba,
- 0xd6, 0x84, 0xdf, 0xf5, 0x2c, 0x04, 0x21, 0xdb, 0xfb, 0xde, 0x48, 0x5e,
- 0x4c, 0xca, 0xd9, 0xdd, 0x9f, 0x10, 0x76, 0x92, 0x57, 0x5e, 0xec, 0xe1,
- 0x47, 0x1d, 0x95, 0xb9, 0x6f, 0x20, 0x8c, 0x62, 0x8e, 0x0a, 0x7f, 0x7e,
- 0x49, 0x8f, 0xab, 0xc5, 0xb0, 0x9d, 0x8c, 0x46, 0x86, 0x09, 0xd5, 0x4b,
- 0xb4, 0xe3, 0xda, 0x20, 0x58, 0x18, 0xef, 0x0e, 0x22, 0x96, 0x94, 0x14,
- 0x81, 0x2c, 0x81, 0x67, 0x47, 0xad, 0x6c, 0x76, 0x42, 0xf2, 0xaf, 0xaa,
- 0x2f, 0x46, 0xc9, 0x4b, 0x9b, 0x25, 0x93, 0x45, 0x30, 0xb2, 0xe9, 0x1a,
- 0xb3, 0xec, 0xf0, 0x4a, 0xc2, 0x3f, 0x9f, 0xe4, 0xe2, 0x66, 0x9f, 0x95,
- 0x2d, 0xdc, 0x4d, 0xc6, 0x74, 0x30, 0xc2, 0x3d, 0x8e, 0x94, 0x36, 0x2d,
- 0x2b, 0x8e, 0x11, 0xb1, 0x3b, 0xdd, 0xda, 0x2f, 0x32, 0xb5, 0xe1, 0xb1,
- 0x00, 0x73, 0x29, 0x1b, 0x1d, 0x24, 0x4f, 0xed, 0x97, 0x22, 0x58, 0xf5,
- 0x6c, 0xf1, 0xd7, 0xc9, 0xe7, 0x43, 0x7a, 0xca, 0xeb, 0x16, 0x2b, 0x74,
- 0xdf, 0xce, 0xe0, 0x18, 0x88, 0x52, 0x38, 0x44, 0x62, 0x52, 0xa4, 0x20,
- 0x07, 0x92, 0x60, 0x92, 0xd6, 0xd9, 0x93, 0x47, 0xaa, 0x5e, 0xf2, 0x2e,
- 0xd5, 0xea, 0xbf, 0x6d, 0x39, 0x61, 0x59, 0x0e, 0x79, 0x0b, 0xea, 0x5e,
- 0x04, 0x14, 0x16, 0x93, 0x72, 0x46, 0xcd, 0xbf, 0x38, 0x07, 0x97, 0xa4,
- 0xa9, 0x51, 0x24, 0x2f, 0x1b, 0x54, 0x14, 0x3d, 0x7d, 0xe2, 0x4d, 0xfa,
- 0x1e, 0x77, 0x45, 0x87, 0x93, 0xca, 0x0a, 0xbb, 0x2b, 0x52, 0x7b, 0xdd,
- 0x7c, 0x37, 0xb8, 0x97, 0xe4, 0xeb, 0x60, 0xe0, 0x31, 0x59, 0xa3, 0x75,
- 0x30, 0xde, 0x77, 0x8d, 0xfc, 0x4b, 0xf0, 0x47, 0x25, 0x9c, 0xee, 0xa7,
- 0x37, 0x12, 0xb5, 0x67, 0x22, 0xe9, 0xfb, 0x3c, 0x09, 0x26, 0xec, 0xfb,
- 0xe9, 0x9a, 0x82, 0x08, 0xf3, 0x75, 0x05, 0xe9, 0x23, 0x8f, 0xb1, 0x92,
- 0xa0, 0x75, 0x4a, 0xa2, 0xa7, 0xbf, 0x7d, 0xf9, 0xee, 0xc3, 0xcb, 0xd3,
- 0x87, 0x77, 0x05, 0x6a, 0x35, 0x9a, 0xbb, 0x27, 0x07, 0xd6, 0x07, 0x33,
- 0xe8, 0x40, 0xfd, 0xc4, 0xa1, 0x0c, 0x82, 0xa8, 0x03, 0x41, 0x1b, 0x74,
- 0xb3, 0xf5, 0xa8, 0x68, 0x8c, 0xe8, 0x8a, 0x92, 0x44, 0xe2, 0x10, 0x40,
- 0x9c, 0xe7, 0x2b, 0x21, 0x72, 0x2f, 0x73, 0x33, 0xad, 0xa5, 0x27, 0xe3,
- 0x96, 0xbe, 0x4f, 0xaf, 0x6f, 0x49, 0xf2, 0xb8, 0xad, 0x13, 0x8f, 0x51,
- 0xb9, 0xad, 0x6d, 0xb7, 0xa9, 0x57, 0xda, 0xd4, 0x5a, 0x04, 0x5a, 0xcb,
- 0xfb, 0x56, 0xce, 0xe7, 0x2e, 0x7b, 0xb6, 0x1b, 0xe1, 0x7b, 0xf5, 0xaa,
- 0xbf, 0xe4, 0xf6, 0xd7, 0x44, 0x4b, 0xed, 0x64, 0xa4, 0x63, 0x1b, 0x1d,
- 0x77, 0x1f, 0x36, 0x25, 0x57, 0xa3, 0xbf, 0x90, 0xb9, 0xc5, 0x77, 0xd5,
- 0x4c, 0xd0, 0x47, 0x0e, 0x50, 0x15, 0x17, 0xed, 0x66, 0xc7, 0xc7, 0xef,
- 0xb1, 0x59, 0xe7, 0x2f, 0xc7, 0x63, 0x2b, 0x0b, 0x6b, 0x49, 0x4b, 0x18,
- 0x04, 0xc6, 0x18, 0xd4, 0x48, 0xbf, 0xed, 0xc9, 0x28, 0xb1, 0x9d, 0x62,
- 0x25, 0x9d, 0x13, 0xb1, 0x1f, 0x63, 0xf3, 0x5d, 0xac, 0x97, 0xe6, 0xc2,
- 0x18, 0x8d, 0x77, 0xb6, 0x5d, 0x4b, 0x28, 0xb6, 0x4b, 0x78, 0xc4, 0xb9,
- 0x44, 0x93, 0xc2, 0x59, 0x13, 0xed, 0xd1, 0xd9, 0x8f, 0x35, 0x86, 0x44,
- 0x5c, 0x9e, 0x83, 0xd7, 0x3e, 0xc4, 0xed, 0x20, 0xee, 0x4c, 0xdf, 0x1a,
- 0x9f, 0x5c, 0x1c, 0x9b, 0xed, 0xfb, 0x70, 0xf1, 0xf5, 0x96, 0xa4, 0x2e,
- 0x74, 0x51, 0x30, 0xe0, 0xb4, 0xa7, 0x16, 0xaf, 0xd7, 0xb6, 0x5a, 0xb6,
- 0x62, 0x47, 0x8a, 0xb1, 0x16, 0x62, 0x1a, 0xb8, 0xfb, 0xe8, 0x68, 0xc3,
- 0x29, 0x3d, 0x1e, 0x3d, 0xee, 0x9e, 0x52, 0x3f, 0x5c, 0x35, 0x03, 0x18,
- 0x07, 0xe4, 0x2e, 0xa8, 0xc8, 0x94, 0x3d, 0xb5, 0xe7, 0x9a, 0xa7, 0x20,
- 0xc8, 0x06, 0x74, 0x9d, 0x94, 0x4b, 0xe1, 0x03, 0xf4, 0x3c, 0x85, 0x12,
- 0xf4, 0xe2, 0xe2, 0xc0, 0x6e, 0xb6, 0x70, 0x43, 0xe2, 0xed, 0xe5, 0x70,
- 0xa8, 0x39, 0xb1, 0xb4, 0x9a, 0xd9, 0xb2, 0xd0, 0x50, 0x3f, 0xd4, 0x5c,
- 0x3f, 0x6a, 0xc9, 0x64, 0x48, 0x40, 0x5b, 0xb2, 0xb4, 0xaa, 0x75, 0xc3,
- 0xde, 0x0a, 0x2e, 0x9f, 0x2f, 0x0e, 0xa6, 0x0d, 0x2f, 0x3a, 0xba, 0xb4,
- 0x58, 0x54, 0xe8, 0x8d, 0xd9, 0x8f, 0x71, 0xfc, 0x67, 0xda, 0x57, 0xc9,
- 0x17, 0x79, 0xc1, 0x7f, 0xc6, 0xe9, 0x1d, 0x22, 0xb7, 0x2a, 0x17, 0xec,
- 0x40, 0x94, 0x37, 0x38, 0x89, 0x93, 0x8b, 0x5d, 0xa4, 0x0e, 0xa3, 0x42,
- 0xc2, 0xa1, 0x84, 0x68, 0xd0, 0xd4, 0x3c, 0x6c, 0xbb, 0xb5, 0x33, 0xde,
- 0xb5, 0x9e, 0xd6, 0x0b, 0x44, 0x14, 0x31, 0x5a, 0xa4, 0x8a, 0xc9, 0x43,
- 0x56, 0x14, 0xf5, 0x32, 0x86, 0xee, 0xe3, 0xdd, 0xde, 0xd0, 0x62, 0x02,
- 0xa3, 0x9e, 0xde, 0xcc, 0x7a, 0xb0, 0xea, 0xe0, 0xd6, 0x42, 0x12, 0x19,
- 0x6c, 0x40, 0xae, 0x99, 0x7a, 0xf5, 0xdd, 0x6b, 0xaf, 0xd9, 0x8e, 0xe6,
- 0xa9, 0x31, 0xbd, 0x88, 0x42, 0xda, 0x87, 0x06, 0x97, 0xb9, 0x64, 0xcb,
- 0x11, 0x82, 0xaa, 0xb3, 0x2c, 0x5b, 0x59, 0x68, 0xf3, 0x1c, 0x35, 0x36,
- 0x79, 0x8d, 0x20, 0xaa, 0xc0, 0xca, 0xa3, 0x9d, 0x5c, 0xcf, 0xec, 0x84,
- 0x75, 0x68, 0x8b, 0x48, 0xd8, 0x3b, 0xd4, 0x3c, 0x8c, 0xc2, 0xb8, 0x07,
- 0x4f, 0x8f, 0x3e, 0x37, 0xb2, 0xf9, 0x0e, 0x58, 0xe3, 0x6e, 0xcb, 0x18,
- 0x0b, 0xb8, 0x1f, 0xe7, 0x4f, 0x8c, 0x1a, 0x4d, 0xef, 0x15, 0x38, 0x85,
- 0xa4, 0x26, 0x33, 0x02, 0x0e, 0x2a, 0x29, 0x6e, 0x0e, 0xb1, 0x68, 0xcc,
- 0x26, 0xca, 0x86, 0x49, 0xd2, 0x1d, 0xf6, 0x89, 0x13, 0xc4, 0x46, 0x1e,
- 0x01, 0x53, 0x83, 0x12, 0xea, 0xa4, 0x66, 0x58, 0xca, 0xfb, 0xe3, 0x8b,
- 0xf7, 0xe6, 0x8f, 0xf1, 0xc5, 0xd9, 0xfb, 0x1e, 0x64, 0xc6, 0x86, 0x61,
- 0x3a, 0x68, 0xd3, 0x34, 0x5d, 0x05, 0xdb, 0xdc, 0x46, 0x6d, 0x43, 0x26,
- 0x34, 0xb3, 0x9d, 0x3a, 0x0a, 0xf4, 0xe5, 0xe1, 0x7d, 0xd5, 0xa3, 0xd6,
- 0x42, 0xe7, 0x46, 0x3e, 0x6c, 0x5c, 0x18, 0x9f, 0xf9, 0x66, 0x0a, 0xc1,
- 0x82, 0x89, 0x18, 0x69, 0xc5, 0x96, 0xd1, 0x63, 0xb6, 0xc6, 0x68, 0x23,
- 0xe7, 0xbf, 0x83, 0xb1, 0xd7, 0xf6, 0xd4, 0x3d, 0x68, 0x86, 0x9c, 0x9a,
- 0xcb, 0xcd, 0x59, 0x5c, 0xb7, 0x76, 0xc3, 0x69, 0x15, 0x0a, 0x60, 0x2b,
- 0xd9, 0x81, 0x03, 0x59, 0xf4, 0x92, 0x7b, 0xe8, 0xd7, 0xe8, 0x42, 0xbb,
- 0x6e, 0xc1, 0x75, 0xb9, 0xcc, 0xd8, 0xc3, 0xcf, 0xc9, 0xb9, 0xca, 0x9c,
- 0x58, 0xb6, 0x30, 0x2e, 0x6d, 0x12, 0xc3, 0xc3, 0xb0, 0x10, 0x62, 0x74,
- 0xca, 0xdb, 0x16, 0x51, 0xa0, 0x14, 0xea, 0xe0, 0x73, 0xc9, 0x8c, 0xa5,
- 0xda, 0x00, 0x9b, 0x6d, 0x5b, 0x67, 0xe5, 0x61, 0x8b, 0xb5, 0x99, 0xf7,
- 0x41, 0x97, 0xc9, 0x10, 0x28, 0x43, 0x9c, 0xb3, 0xa0, 0x8f, 0x9e, 0x16,
- 0xd7, 0x23, 0xd1, 0x4a, 0x73, 0x6c, 0xa0, 0x4b, 0xf8, 0xfd, 0x43, 0xcf,
- 0xe5, 0xa9, 0x68, 0x58, 0x0d, 0xd5, 0x8b, 0x04, 0xe6, 0x61, 0x69, 0x5b,
- 0x8e, 0x9c, 0x43, 0x34, 0xeb, 0x2e, 0xd3, 0x6d, 0xe9, 0x73, 0x21, 0x9b,
- 0x55, 0xa5, 0x2d, 0x71, 0x1d, 0x99, 0x02, 0x34, 0x8a, 0xde, 0xb6, 0x5f,
- 0x7d, 0x28, 0xd1, 0x5d, 0x0d, 0x06, 0xe9, 0x56, 0xce, 0xc9, 0x80, 0x1e,
- 0xd9, 0x51, 0x04, 0x9d, 0xe4, 0x43, 0x21, 0xc8, 0x31, 0x85, 0xb1, 0x2d,
- 0x90, 0xff, 0x30, 0xb3, 0x9b, 0x46, 0x80, 0x4a, 0x94, 0xb6, 0xc5, 0x42,
- 0x6b, 0x56, 0xb2, 0x42, 0x0f, 0x4c, 0xe7, 0x10, 0x22, 0x0c, 0x3e, 0x64,
- 0x64, 0x13, 0xa8, 0xa4, 0x91, 0xf1, 0x9c, 0x5d, 0x32, 0x6d, 0xba, 0x2b,
- 0x05, 0xca, 0x43, 0xb0, 0xd0, 0x73, 0xff, 0xd0, 0x98, 0xa5, 0xc1, 0xfa,
- 0x71, 0xbc, 0xa0, 0x61, 0xb0, 0x05, 0x46, 0x54, 0x50, 0xaf, 0x80, 0xc0,
- 0x5a, 0x14, 0xd1, 0xd2, 0x2c, 0x86, 0xb4, 0x58, 0x17, 0x0b, 0xca, 0x11,
- 0x6f, 0x43, 0x45, 0xa8, 0x1a, 0x38, 0xda, 0x50, 0xc5, 0xea, 0x23, 0x4b,
- 0xb4, 0x48, 0xb2, 0x5d, 0xaf, 0xdf, 0x5e, 0x5d, 0x6f, 0xe5, 0x2f, 0x08,
- 0xf4, 0x3d, 0x1d, 0x99, 0x22, 0x52, 0x2a, 0x6d, 0xe5, 0x45, 0x4e, 0x48,
- 0x42, 0x65, 0xb5, 0x47, 0x55, 0x2a, 0x84, 0xd9, 0x67, 0xac, 0xca, 0x72,
- 0x81, 0xd6, 0x3e, 0xaa, 0xba, 0xc5, 0x1a, 0x32, 0x43, 0x05, 0x63, 0x0c,
- 0x1e, 0x33, 0x78, 0xbb, 0x72, 0xdf, 0x6b, 0x56, 0x47, 0xd2, 0xd4, 0x83,
- 0x8d, 0x18, 0xc5, 0xda, 0xc1, 0x71, 0x46, 0x08, 0x32, 0x1e, 0xdb, 0xea,
- 0x98, 0xb6, 0x26, 0xd5, 0xe6, 0x22, 0x38, 0x57, 0xa8, 0x7c, 0xc8, 0xbf,
- 0xef, 0xa9, 0xe5, 0xd3, 0xc6, 0x2e, 0x00, 0x87, 0x32, 0xbb, 0x32, 0xe0,
- 0xec, 0x90, 0xf6, 0xcd, 0x84, 0xe5, 0xd0, 0xfe, 0x5a, 0x9d, 0x35, 0xeb,
- 0x55, 0x28, 0xe7, 0x5d, 0xf5, 0xa9, 0x1d, 0x51, 0x83, 0xa2, 0xde, 0x14,
- 0x09, 0x55, 0xc1, 0x6d, 0xbf, 0x8f, 0xce, 0xdf, 0xbd, 0x8d, 0xd0, 0x04,
- 0x02, 0xe9, 0xde, 0x87, 0x04, 0xa0, 0xe2, 0x85, 0x1a, 0x04, 0x27, 0x5b,
- 0x46, 0xbf, 0xd8, 0xdf, 0x62, 0xa0, 0x05, 0x29, 0xdb, 0xe2, 0x28, 0xbb,
- 0x7d, 0xdb, 0xec, 0x8b, 0x37, 0xdf, 0xf0, 0xce, 0x68, 0x3d, 0x8a, 0x94,
- 0x2c, 0xd2, 0xe9, 0xec, 0x50, 0x2f, 0x7a, 0xdc, 0xdf, 0xdd, 0xcf, 0x7a,
- 0x97, 0xbe, 0x61, 0x56, 0x5b, 0x07, 0xcf, 0x0e, 0x47, 0x07, 0x4f, 0x3e,
- 0x1f, 0x1d, 0xa0, 0x93, 0xad, 0x37, 0x37, 0xd7, 0x71, 0xd5, 0x1b, 0x28,
- 0xd2, 0xcf, 0x37, 0xe9, 0x47, 0xf4, 0xe5, 0x2f, 0x2c, 0xef, 0x46, 0xf4,
- 0xdc, 0x88, 0xbb, 0xea, 0x04, 0xdf, 0x58, 0x1a, 0x9d, 0x26, 0x2f, 0x82,
- 0x38, 0xc8, 0xd0, 0x65, 0x15, 0x31, 0x2d, 0xae, 0x72, 0x22, 0x23, 0x45,
- 0xd9, 0xf4, 0xf6, 0x49, 0x1b, 0x02, 0xda, 0x06, 0x27, 0xb8, 0x9d, 0xf1,
- 0x19, 0x29, 0x4b, 0x9f, 0x8a, 0x1a, 0xe9, 0xb8, 0xba, 0xfd, 0x7e, 0xc0,
- 0x36, 0x7f, 0xb2, 0xd5, 0x47, 0x10, 0x2e, 0xf6, 0xd2, 0x75, 0x61, 0xba,
- 0x00, 0xf1, 0xd4, 0x45, 0x09, 0x12, 0xd0, 0x17, 0x7e, 0x50, 0x35, 0x6e,
- 0x1b, 0x10, 0xf7, 0x85, 0x0c, 0xc0, 0x8f, 0x5c, 0x25, 0x8e, 0x5f, 0x49,
- 0x8c, 0x91, 0x6d, 0x9d, 0x68, 0x07, 0xce, 0xc9, 0xc2, 0x2c, 0x31, 0x93,
- 0xd6, 0xe1, 0xe8, 0x9d, 0x3f, 0xfc, 0xc1, 0x71, 0x24, 0x6e, 0xab, 0x8e,
- 0x5e, 0x1e, 0x8f, 0x01, 0xd5, 0xca, 0xb1, 0x6a, 0xee, 0x0a, 0xb0, 0xf5,
- 0xfc, 0xaf, 0x70, 0x0e, 0xff, 0x38, 0xfc, 0xab, 0xf9, 0xe7, 0x8f, 0x5b,
- 0x7a, 0xa9, 0x19, 0x96, 0xcb, 0x15, 0x8c, 0x38, 0xf8, 0x43, 0x1c, 0xd0,
- 0x20, 0x69, 0xb7, 0xa5, 0x85, 0x66, 0x70, 0xf1, 0xea, 0x9c, 0x2f, 0x63,
- 0xc5, 0x61, 0x6f, 0x50, 0x33, 0xf1, 0x21, 0xa8, 0xf5, 0xc4, 0xc2, 0xd1,
- 0x51, 0x83, 0xe9, 0xc4, 0xee, 0xa5, 0xf7, 0xca, 0xc0, 0x25, 0x35, 0xdc,
- 0x30, 0x07, 0x48, 0x8d, 0x7e, 0x7b, 0x49, 0xfe, 0x15, 0x2e, 0x49, 0x37,
- 0x7c, 0x57, 0x15, 0x69, 0xe9, 0x18, 0x4c, 0xc0, 0x5e, 0x86, 0x0d, 0xd8,
- 0xeb, 0x70, 0x63, 0xa6, 0x34, 0x48, 0x04, 0xfe, 0x96, 0x6b, 0x23, 0x1a,
- 0xc1, 0x52, 0x34, 0xdb, 0x60, 0x36, 0x4a, 0xb9, 0x6d, 0x95, 0xd7, 0x9f,
- 0x68, 0x7d, 0x52, 0xe6, 0xe3, 0xe5, 0x0a, 0xd1, 0x7c, 0x3e, 0xb3, 0x5a,
- 0xdf, 0x9d, 0x42, 0xd6, 0xd8, 0xc2, 0x3d, 0x6f, 0x67, 0x9d, 0x74, 0xd0,
- 0x63, 0x57, 0x20, 0xca, 0x28, 0xec, 0x96, 0x3c, 0x56, 0x65, 0x0f, 0x40,
- 0x83, 0x93, 0x54, 0x98, 0x73, 0xa3, 0xe7, 0x5a, 0xd2, 0xf0, 0xa0, 0x99,
- 0xa8, 0xa4, 0x9d, 0x88, 0x85, 0xa4, 0xdf, 0x6e, 0x57, 0x6a, 0x51, 0x87,
- 0x1a, 0x72, 0x14, 0x33, 0x3c, 0x94, 0xc5, 0x37, 0x43, 0xcf, 0x2c, 0x2a,
- 0x9f, 0xa8, 0xcc, 0x34, 0x66, 0x03, 0xad, 0xcd, 0xe7, 0x9b, 0x41, 0x41,
- 0x5e, 0xd5, 0xe9, 0x3e, 0x8b, 0xda, 0x0a, 0xb8, 0x68, 0x4e, 0x19, 0x5d,
- 0xb0, 0x4f, 0x9d, 0x36, 0x1f, 0xbb, 0x4e, 0x7f, 0x1a, 0x6e, 0xad, 0x1d,
- 0xd5, 0x6e, 0x0a, 0xb4, 0x47, 0x4e, 0x42, 0x83, 0x06, 0xd3, 0x5f, 0xc6,
- 0x20, 0x7a, 0x3d, 0xa1, 0x7a, 0xb8, 0x1f, 0xba, 0x52, 0xa8, 0xe9, 0x33,
- 0x36, 0x79, 0x98, 0xaf, 0xee, 0xdf, 0x40, 0x85, 0xf9, 0xa2, 0x23, 0x6d,
- 0x71, 0x16, 0x2b, 0x61, 0xea, 0xf5, 0xe5, 0x25, 0x30, 0x31, 0xc2, 0xcc,
- 0x3c, 0x54, 0x2c, 0x4a, 0xe1, 0x80, 0xf4, 0x33, 0x30, 0x8c, 0x1c, 0x33,
- 0xd7, 0xdd, 0x70, 0x65, 0x91, 0xc2, 0x70, 0x6a, 0xd7, 0x99, 0xa4, 0xb7,
- 0x74, 0x96, 0x7a, 0xd9, 0xc9, 0xf5, 0x76, 0x9a, 0x4c, 0x95, 0x0d, 0x75,
- 0xa2, 0x5d, 0x3e, 0x48, 0xa9, 0x41, 0x41, 0x06, 0x2c, 0x73, 0x44, 0xf8,
- 0x1a, 0xfa, 0x79, 0xdf, 0x46, 0x77, 0x23, 0x79, 0xd8, 0xa8, 0x3f, 0x0e,
- 0xc3, 0xf1, 0xe4, 0x73, 0x01, 0xf1, 0x63, 0x14, 0xb6, 0xca, 0xa2, 0x5a,
- 0xb1, 0x5e, 0x29, 0xfc, 0xa8, 0x2b, 0x35, 0xe7, 0xd8, 0x8e, 0x4d, 0x7e,
- 0x01, 0xc7, 0x0a, 0x7d, 0x6d, 0xe9, 0xd1, 0xe8, 0x30, 0x38, 0xd8, 0x7a,
- 0x31, 0x9c, 0x4e, 0xa7, 0x43, 0xe8, 0x01, 0x2f, 0x58, 0x39, 0xd9, 0x13,
- 0xe5, 0xa0, 0xc7, 0x67, 0x30, 0xce, 0x64, 0xbf, 0x5f, 0xbd, 0x7a, 0x25,
- 0x7a, 0xcc, 0xc5, 0x55, 0x47, 0xa3, 0xb0, 0x80, 0x53, 0xa2, 0x51, 0xc5,
- 0xda, 0x1c, 0xd6, 0x57, 0xeb, 0x66, 0x86, 0x6e, 0xc8, 0xc4, 0x32, 0x94,
- 0xf5, 0xda, 0x1a, 0xd9, 0x0e, 0x2a, 0x28, 0x35, 0xa5, 0x1f, 0xb8, 0xcc,
- 0x44, 0x33, 0x76, 0x70, 0x34, 0x2b, 0x6e, 0x80, 0x82, 0x17, 0x65, 0xec,
- 0x6e, 0x8b, 0x55, 0x9e, 0xaa, 0x0f, 0xdd, 0xa5, 0x13, 0xac, 0x63, 0x99,
- 0x6c, 0x3a, 0x0a, 0x3e, 0x9b, 0xe6, 0x92, 0x01, 0x96, 0xca, 0xb7, 0xba,
- 0x63, 0xdf, 0x73, 0x1e, 0xb2, 0xd5, 0xed, 0x23, 0x79, 0xd2, 0x7b, 0x24,
- 0xd1, 0xcd, 0x27, 0xab, 0x8a, 0xb6, 0x7d, 0xe7, 0x15, 0x10, 0x45, 0x5f,
- 0xc9, 0x85, 0x78, 0x75, 0x45, 0xf9, 0x5b, 0x0b, 0x3a, 0x1c, 0x33, 0xe5,
- 0x9a, 0x99, 0x80, 0xc8, 0x8f, 0xf1, 0xf8, 0x74, 0xef, 0xe2, 0x74, 0x1c,
- 0x64, 0xbc, 0xdf, 0x91, 0xcb, 0x98, 0x9b, 0x68, 0xb7, 0x5c, 0x9e, 0xbc,
- 0x45, 0x00, 0x87, 0x2e, 0xe7, 0x6d, 0x0a, 0xe7, 0xaf, 0x44, 0xf1, 0x4e,
- 0xd6, 0x85, 0x16, 0xc3, 0x58, 0xd9, 0x5d, 0x64, 0x05, 0x8a, 0xc8, 0x49,
- 0x84, 0xe3, 0x06, 0x20, 0x21, 0xb6, 0x4e, 0xde, 0xbd, 0xbc, 0xa0, 0xf2,
- 0x96, 0x46, 0x52, 0x3c, 0xc8, 0x05, 0x14, 0x7a, 0xc6, 0x6f, 0x2c, 0x2e,
- 0x01, 0xa2, 0x36, 0xe9, 0xd4, 0x35, 0x43, 0x51, 0x65, 0x9d, 0x8f, 0xaf,
- 0x56, 0xc2, 0xdb, 0xb4, 0xfd, 0x66, 0x4b, 0x45, 0x3a, 0x74, 0x69, 0xbe,
- 0x7b, 0x1a, 0x07, 0xd1, 0xd3, 0xe0, 0x0d, 0x88, 0x5f, 0x87, 0xf7, 0xc2,
- 0xca, 0x75, 0xa3, 0xa5, 0x8a, 0x5f, 0xa7, 0xbf, 0x28, 0x2f, 0x73, 0xf2,
- 0x04, 0xe2, 0xbc, 0xfc, 0xc0, 0x5b, 0xe0, 0x26, 0xe5, 0xdd, 0xa9, 0xb9,
- 0x14, 0xa7, 0x0d, 0x60, 0xcb, 0x57, 0x84, 0xe4, 0x84, 0xdd, 0x53, 0xdb,
- 0x87, 0x49, 0x4b, 0x20, 0xc3, 0x0a, 0x43, 0x60, 0xe7, 0xe5, 0x53, 0x63,
- 0x22, 0x4c, 0x29, 0xfb, 0x03, 0xe5, 0x80, 0x75, 0x3b, 0xc5, 0x36, 0x6f,
- 0xc1, 0xf2, 0xa9, 0x87, 0xb4, 0x0e, 0x63, 0x15, 0xd0, 0x14, 0x64, 0x85,
- 0x1b, 0xfd, 0xf0, 0x4f, 0x5a, 0xc2, 0xe3, 0x2b, 0xb2, 0xc8, 0x2e, 0x03,
- 0xa1, 0x6b, 0x51, 0x28, 0x22, 0xc8, 0x7f, 0x50, 0x51, 0x51, 0xde, 0x2f,
- 0xbd, 0x8d, 0x7d, 0x48, 0xf7, 0x4d, 0xe8, 0xdd, 0x83, 0x6e, 0x3b, 0x33,
- 0x46, 0x25, 0x6c, 0x83, 0x55, 0xb7, 0xa0, 0x81, 0x34, 0xd1, 0xb7, 0x33,
- 0xdc, 0x57, 0xc7, 0xae, 0x7d, 0x42, 0x07, 0x3f, 0xa8, 0xd5, 0x5a, 0x81,
- 0xe3, 0x90, 0x14, 0x83, 0xba, 0xa1, 0x2e, 0xac, 0x37, 0x3d, 0x46, 0x0e,
- 0x2b, 0xb1, 0x17, 0x0e, 0x8d, 0x9d, 0xef, 0x07, 0x6b, 0x81, 0x99, 0xcd,
- 0x52, 0x25, 0xe8, 0x19, 0x0d, 0xd0, 0xff, 0xfb, 0xb6, 0xeb, 0x0e, 0x34,
- 0x8a, 0xf8, 0x21, 0x54, 0x3a, 0x84, 0x00, 0xc2, 0x2e, 0xf4, 0x34, 0x70,
- 0x13, 0x76, 0xdf, 0x0d, 0xdb, 0x7b, 0xf0, 0xf2, 0x36, 0xcf, 0xe7, 0xeb,
- 0xe3, 0x97, 0xaf, 0x2d, 0x8c, 0xc0, 0x6f, 0x81, 0x2c, 0xec, 0xbc, 0x9a,
- 0x93, 0x8c, 0xbb, 0x40, 0xac, 0xd5, 0x51, 0x82, 0xd3, 0x51, 0x42, 0x05,
- 0xad, 0x18, 0x75, 0xad, 0xce, 0xf8, 0x86, 0xf4, 0x36, 0x43, 0xe8, 0xf5,
- 0x8c, 0xf8, 0xd9, 0x07, 0xe2, 0xb1, 0x26, 0x4d, 0x99, 0x6b, 0xab, 0x3c,
- 0x42, 0xbe, 0x04, 0x21, 0x2f, 0xca, 0x49, 0x39, 0x9f, 0x6f, 0x90, 0xee,
- 0x0c, 0x0f, 0x89, 0x1a, 0x28, 0x26, 0x98, 0x2d, 0xda, 0x46, 0x7a, 0x6f,
- 0x42, 0xb3, 0x37, 0x47, 0x6a, 0xae, 0xda, 0x96, 0x14, 0x26, 0x40, 0x25,
- 0x0f, 0xee, 0x46, 0xbb, 0x30, 0x5d, 0x6d, 0x06, 0x35, 0xf1, 0x50, 0x98,
- 0xcf, 0xee, 0x18, 0x4d, 0x13, 0xb2, 0xc0, 0xfe, 0x75, 0xf2, 0x9f, 0xff,
- 0xfc, 0xeb, 0x8f, 0x91, 0xee, 0x06, 0xe4, 0xf0, 0xbb, 0xe2, 0xca, 0x42,
- 0xf3, 0xf4, 0x52, 0x50, 0x5b, 0x2c, 0x4e, 0x3c, 0x27, 0x9a, 0x70, 0x3c,
- 0xa3, 0xa9, 0xb3, 0xc5, 0x7c, 0xe4, 0xe5, 0x54, 0x86, 0x62, 0x91, 0x4c,
- 0x28, 0xfd, 0x20, 0xba, 0xd5, 0x51, 0x29, 0x38, 0x97, 0xef, 0x12, 0x72,
- 0x37, 0x5a, 0x04, 0xb9, 0x94, 0x69, 0x8b, 0xec, 0xcb, 0x27, 0x11, 0xe0,
- 0xc7, 0xb8, 0x36, 0x3e, 0xdd, 0x60, 0xfa, 0x87, 0xf7, 0x27, 0xd6, 0xd5,
- 0xe9, 0x73, 0xe5, 0x2b, 0x43, 0xa9, 0x77, 0xc3, 0xec, 0x2e, 0x9b, 0x18,
- 0x2e, 0x51, 0x2b, 0xf0, 0xc3, 0x70, 0x59, 0x27, 0x2f, 0x96, 0x86, 0xc6,
- 0xf3, 0x1e, 0xc8, 0x8e, 0xaf, 0xe9, 0xb5, 0x44, 0x5f, 0xb3, 0xf8, 0xa5,
- 0x97, 0x65, 0x65, 0x76, 0x68, 0x29, 0xd5, 0xb8, 0x52, 0x92, 0xdc, 0x76,
- 0x66, 0x24, 0x28, 0x30, 0x09, 0xdc, 0x01, 0xd7, 0x8f, 0x44, 0xe3, 0x06,
- 0x18, 0x9b, 0x07, 0x14, 0x06, 0x65, 0x7d, 0x6d, 0x94, 0x47, 0x33, 0x7b,
- 0x63, 0x64, 0x93, 0xb5, 0x5e, 0x0f, 0x84, 0xa4, 0x2a, 0xc5, 0x91, 0x8b,
- 0xc2, 0x08, 0xd8, 0x32, 0x44, 0xb6, 0xb0, 0x0c, 0xd3, 0xf1, 0x57, 0x64,
- 0xbb, 0x98, 0xfa, 0xe8, 0x6f, 0xd2, 0xbb, 0x38, 0xdc, 0x57, 0x5d, 0x00,
- 0xbb, 0x41, 0x13, 0x97, 0xbd, 0x4a, 0x05, 0x1b, 0xb9, 0xf6, 0x17, 0xf6,
- 0x3d, 0xb1, 0xd6, 0x54, 0x0e, 0x2e, 0xe5, 0x32, 0x9d, 0xd9, 0x42, 0x7a,
- 0x1f, 0x3a, 0x10, 0x65, 0x88, 0x29, 0xd5, 0x45, 0x66, 0x8b, 0x91, 0x74,
- 0xd5, 0x46, 0x5a, 0x95, 0x1b, 0x13, 0x0c, 0xb7, 0x8b, 0xeb, 0x52, 0x53,
- 0x8a, 0x00, 0x57, 0xc3, 0x8a, 0x43, 0x1f, 0x65, 0xe5, 0xe2, 0x79, 0x88,
- 0xc6, 0x7a, 0x2f, 0x04, 0x2f, 0xe7, 0x12, 0x66, 0xbf, 0xd8, 0x0f, 0x00,
- 0x4b, 0x46, 0xef, 0x30, 0x86, 0x21, 0xa1, 0xb7, 0x91, 0x5e, 0x41, 0x3c,
- 0x84, 0x0f, 0xfc, 0x58, 0x0e, 0xbc, 0x33, 0x1c, 0xc5, 0x5a, 0x9e, 0x3c,
- 0x7e, 0xfc, 0x98, 0x63, 0x2d, 0x5b, 0x27, 0xf8, 0xf0, 0xfb, 0xe3, 0x57,
- 0x67, 0x6f, 0xdf, 0x1e, 0xbf, 0x7b, 0x7d, 0xfc, 0x5a, 0x33, 0x3e, 0xbc,
- 0x95, 0x38, 0xea, 0x08, 0x57, 0x44, 0x59, 0x82, 0x66, 0x9f, 0x0f, 0x1e,
- 0xef, 0x0f, 0x0f, 0x1f, 0xef, 0x27, 0x86, 0x16, 0x53, 0x5b, 0xa7, 0x96,
- 0x2e, 0x52, 0xb2, 0x6f, 0xaf, 0xd6, 0x46, 0x55, 0x23, 0x68, 0xcf, 0x86,
- 0x30, 0x37, 0xe0, 0x7a, 0x25, 0x6f, 0x4f, 0xd6, 0x90, 0x1d, 0x1d, 0xc9,
- 0x0c, 0x18, 0x6d, 0x59, 0x90, 0x36, 0x17, 0xb0, 0x14, 0xdd, 0x07, 0x04,
- 0x7a, 0xb8, 0x4f, 0x1f, 0x1a, 0x25, 0x6f, 0x8c, 0xf6, 0x31, 0x2f, 0x6f,
- 0x99, 0x16, 0x5f, 0x5d, 0x19, 0xa5, 0x34, 0x0b, 0x43, 0x95, 0xed, 0xf7,
- 0xe9, 0xf5, 0x23, 0x7e, 0xfd, 0x37, 0x8c, 0xd1, 0x3f, 0x7e, 0xd6, 0x36,
- 0x2c, 0xcd, 0x45, 0x06, 0x2a, 0xbc, 0x96, 0x24, 0xf6, 0xe0, 0xfb, 0x8f,
- 0xd9, 0x1c, 0xff, 0xfa, 0xe5, 0x39, 0x3d, 0x6d, 0xcc, 0xf2, 0xb3, 0xef,
- 0xff, 0xe2, 0xca, 0x3c, 0xaf, 0x0f, 0x34, 0x9b, 0x51, 0x2a, 0x59, 0xd1,
- 0x88, 0xaf, 0x08, 0x83, 0xde, 0x4e, 0x99, 0xb5, 0x06, 0xa1, 0x0a, 0x19,
- 0xac, 0x90, 0x32, 0x50, 0xcd, 0xd6, 0x71, 0x8f, 0x2c, 0x39, 0xb4, 0xaa,
- 0x96, 0x2b, 0x1e, 0xab, 0xeb, 0x37, 0xac, 0x9c, 0xa6, 0x71, 0x9b, 0x73,
- 0xdf, 0x87, 0xbc, 0x98, 0x71, 0x63, 0xda, 0x96, 0x63, 0xb6, 0xa9, 0xd6,
- 0x59, 0xcc, 0x6b, 0xba, 0x11, 0x63, 0x87, 0x94, 0xda, 0x2a, 0x5f, 0xa6,
- 0x55, 0xce, 0xed, 0xe7, 0x89, 0xc0, 0x6f, 0xb8, 0x57, 0x26, 0xa7, 0x4a,
- 0x21, 0xf6, 0xe5, 0xc0, 0x64, 0xcb, 0x20, 0xed, 0xd4, 0xf6, 0x72, 0x20,
- 0x22, 0x66, 0x58, 0x23, 0x89, 0x51, 0xf2, 0x66, 0x6d, 0x84, 0xa1, 0x6b,
- 0xdb, 0xff, 0x56, 0xa1, 0xe8, 0x03, 0x9d, 0x4b, 0xde, 0x9c, 0x9c, 0x1e,
- 0xef, 0x26, 0x6f, 0xb2, 0x46, 0x4a, 0x9c, 0x34, 0xc3, 0x98, 0x44, 0xfe,
- 0xbf, 0x41, 0xc1, 0xb2, 0xa0, 0x84, 0x52, 0x23, 0x1c, 0xcd, 0x05, 0x13,
- 0x1f, 0x1c, 0x94, 0x0d, 0xad, 0x97, 0xe2, 0xc3, 0xc1, 0x12, 0x29, 0x1e,
- 0xa7, 0xb9, 0x65, 0x1a, 0xdf, 0x94, 0x93, 0x8f, 0xe4, 0xdd, 0x2a, 0xce,
- 0xc3, 0xc8, 0x43, 0x3c, 0x2b, 0xfd, 0x14, 0x02, 0x9a, 0xb4, 0xe4, 0x3c,
- 0x6b, 0xbc, 0x38, 0xaf, 0x57, 0x0b, 0xe2, 0x06, 0x51, 0x94, 0x97, 0x45,
- 0xe6, 0x2a, 0xfb, 0x40, 0xf9, 0xdc, 0x29, 0x5e, 0x8c, 0x1e, 0x30, 0x54,
- 0x5a, 0xaf, 0xb7, 0x71, 0x5f, 0xeb, 0xc6, 0x51, 0xda, 0x09, 0xff, 0xb9,
- 0xf7, 0x65, 0x14, 0x7c, 0x4c, 0x1b, 0x59, 0xa0, 0x67, 0xae, 0xbc, 0x01,
- 0x8a, 0xe2, 0x1e, 0xea, 0x22, 0xe4, 0x55, 0xed, 0x6c, 0x51, 0x42, 0x44,
- 0x7d, 0x85, 0xef, 0x4e, 0xcd, 0xdd, 0xbf, 0x48, 0x9f, 0x26, 0xd5, 0x1f,
- 0xa8, 0x04, 0xdc, 0x49, 0x17, 0xee, 0xd2, 0x6b, 0xb3, 0x8c, 0x93, 0x58,
- 0x4b, 0x34, 0xe6, 0xca, 0xd2, 0x92, 0x97, 0xb5, 0x29, 0xca, 0xd6, 0x4f,
- 0x35, 0x5d, 0x5f, 0xe7, 0x4b, 0x8f, 0x5d, 0x09, 0x78, 0x35, 0x7c, 0x29,
- 0x5c, 0x45, 0x56, 0x47, 0x5d, 0xfe, 0x52, 0xde, 0x26, 0xa1, 0x3d, 0xb4,
- 0x54, 0x65, 0xa7, 0x0c, 0xeb, 0xd0, 0x6b, 0x52, 0xe8, 0xb8, 0xb2, 0x0b,
- 0x7d, 0x08, 0x2a, 0xc6, 0xcb, 0x8c, 0x68, 0x4b, 0xf2, 0x75, 0x9f, 0x05,
- 0x75, 0x75, 0x76, 0xff, 0x33, 0x6d, 0x4b, 0x34, 0x54, 0x17, 0xcd, 0xde,
- 0x41, 0xa7, 0xa4, 0xbe, 0x1f, 0x54, 0xf5, 0x3e, 0xfd, 0x94, 0xa3, 0x10,
- 0x71, 0x0d, 0x75, 0x2e, 0x2d, 0xb4, 0xde, 0x8a, 0xa7, 0x69, 0x71, 0xde,
- 0x0d, 0xb9, 0x8d, 0x50, 0xce, 0x10, 0xd7, 0x3e, 0x19, 0xb2, 0x8c, 0x9c,
- 0x06, 0x84, 0xc2, 0xaa, 0xf3, 0x59, 0xa0, 0xa2, 0xc1, 0xde, 0x16, 0x55,
- 0xd4, 0xa8, 0x1e, 0x12, 0xba, 0x62, 0x04, 0x17, 0x3a, 0x43, 0xc3, 0x65,
- 0xb8, 0xfc, 0x6e, 0x04, 0x62, 0x6c, 0xbb, 0xca, 0x18, 0x9a, 0x7e, 0x64,
- 0x2c, 0xd1, 0x25, 0x95, 0x04, 0x28, 0x7e, 0x33, 0x2d, 0x59, 0xb6, 0xc7,
- 0xf0, 0xb6, 0xcb, 0xfc, 0x3a, 0x96, 0x65, 0x41, 0xf9, 0x11, 0x32, 0x31,
- 0x64, 0x69, 0xb8, 0x76, 0xb1, 0x9a, 0x76, 0x6c, 0x43, 0xda, 0xec, 0x97,
- 0x26, 0x1c, 0x40, 0xd9, 0xd9, 0xe0, 0x06, 0x2f, 0x48, 0x63, 0x25, 0x40,
- 0xaf, 0x82, 0x1b, 0xf4, 0x7e, 0x6d, 0x34, 0x9f, 0xe7, 0x5b, 0x16, 0x51,
- 0x1d, 0x7e, 0x55, 0x70, 0xc7, 0x16, 0xe5, 0x48, 0xcb, 0xe8, 0x61, 0xb4,
- 0xef, 0x98, 0x68, 0xee, 0x8d, 0x32, 0x2e, 0x5b, 0x70, 0x13, 0xa6, 0x35,
- 0xdb, 0x02, 0x18, 0xae, 0x18, 0x0d, 0x11, 0xe3, 0x69, 0x4a, 0xdf, 0x0f,
- 0x5f, 0xe1, 0xe3, 0xc3, 0xaf, 0x31, 0xdc, 0x1f, 0xb7, 0xac, 0xc3, 0xb7,
- 0xfb, 0xab, 0xe7, 0x61, 0xa3, 0x60, 0xe7, 0x37, 0x64, 0xc3, 0x63, 0xad,
- 0x55, 0x19, 0x48, 0x24, 0x91, 0x09, 0x72, 0x0f, 0x2e, 0x73, 0x45, 0xf6,
- 0xf4, 0xc0, 0x11, 0x4d, 0xa9, 0xc3, 0x2e, 0x9b, 0x36, 0xe5, 0xc0, 0x48,
- 0x91, 0x15, 0xc0, 0x74, 0x66, 0xc3, 0x72, 0x3e, 0x44, 0x86, 0xb4, 0x61,
- 0xfe, 0x9f, 0x28, 0x19, 0xc9, 0xbb, 0x75, 0x00, 0x08, 0x01, 0xf6, 0xf6,
- 0x6c, 0x16, 0x53, 0xcd, 0xb9, 0x90, 0x91, 0xb4, 0x0e, 0x21, 0x7c, 0x2d,
- 0xb4, 0xe0, 0x83, 0x7c, 0x2e, 0x5e, 0x79, 0xbc, 0x6e, 0xbb, 0x50, 0x11,
- 0x32, 0x97, 0x14, 0x44, 0x04, 0xfe, 0x34, 0x94, 0x47, 0x0c, 0x58, 0x7b,
- 0xc7, 0xaa, 0x61, 0xc3, 0x2d, 0xd9, 0x95, 0x0b, 0xff, 0xf3, 0x7a, 0x05,
- 0x95, 0x95, 0x10, 0x3b, 0x03, 0xef, 0x8b, 0x16, 0x89, 0x00, 0x8b, 0xd3,
- 0x08, 0xff, 0xc7, 0xa3, 0xfd, 0x41, 0x10, 0xa8, 0x6f, 0x60, 0xec, 0x17,
- 0x2e, 0x4b, 0xc8, 0x3c, 0x0c, 0x1e, 0x39, 0x8c, 0x55, 0xd7, 0xd6, 0xcd,
- 0x1d, 0xf1, 0x6b, 0x5b, 0x4c, 0x8b, 0xd4, 0x62, 0x57, 0xf7, 0xe0, 0x72,
- 0x7a, 0xb0, 0x85, 0xc2, 0x36, 0xb9, 0x8a, 0x36, 0x06, 0x71, 0x2a, 0x19,
- 0x5b, 0x5f, 0x0e, 0xbb, 0x6d, 0x32, 0x6d, 0xb7, 0x33, 0xbf, 0x7a, 0xc3,
- 0xeb, 0x5b, 0xd6, 0xeb, 0x69, 0x02, 0x9a, 0xe8, 0x4b, 0x6d, 0x7d, 0x33,
- 0x34, 0x9b, 0x2a, 0x1d, 0x5d, 0x87, 0x19, 0xfd, 0x90, 0x01, 0x3b, 0x14,
- 0x38, 0xb4, 0xee, 0xdf, 0x33, 0x06, 0xd9, 0x7d, 0x4a, 0x3b, 0x66, 0x5b,
- 0x0b, 0x68, 0x0f, 0x1d, 0x27, 0x1f, 0x40, 0xb6, 0xde, 0x5d, 0xea, 0xee,
- 0x19, 0x71, 0x15, 0xe2, 0x04, 0x85, 0xe6, 0x7c, 0xa3, 0x21, 0xfb, 0xed,
- 0x5d, 0x6f, 0x6a, 0x71, 0x4f, 0xce, 0x2f, 0xae, 0xcd, 0x1b, 0x52, 0xec,
- 0x87, 0xef, 0xcc, 0x31, 0x3c, 0x4f, 0xfe, 0xa3, 0xcc, 0xb8, 0x66, 0xf5,
- 0x9e, 0x92, 0xd5, 0xef, 0x5e, 0xbe, 0x7f, 0x77, 0xf2, 0xee, 0xab, 0xe7,
- 0x96, 0xc7, 0x11, 0xbf, 0xeb, 0xf6, 0xb4, 0xb0, 0xbc, 0x1b, 0xbf, 0x65,
- 0xe4, 0x56, 0xf2, 0xfe, 0xf4, 0x61, 0x6c, 0x53, 0x2c, 0x13, 0xec, 0x99,
- 0x9d, 0x97, 0x55, 0xc6, 0x71, 0x11, 0xb6, 0x45, 0xb5, 0x72, 0x42, 0xca,
- 0x35, 0x21, 0x2a, 0xd1, 0xb8, 0x2d, 0x02, 0xd8, 0x30, 0x3c, 0xa5, 0x33,
- 0x59, 0x94, 0xad, 0x1e, 0x51, 0x44, 0x94, 0x0b, 0x1c, 0x7f, 0xe9, 0x53,
- 0x00, 0x5b, 0xcc, 0xda, 0x51, 0x9d, 0x9d, 0x3e, 0x91, 0xe0, 0x2d, 0x63,
- 0x64, 0xab, 0xe7, 0xd5, 0xf6, 0xc7, 0x91, 0x26, 0x17, 0x35, 0x8e, 0xac,
- 0xce, 0xe1, 0x6c, 0xb0, 0x5b, 0xa2, 0x39, 0x5e, 0x11, 0x3f, 0x88, 0xc0,
- 0x4b, 0xa7, 0x6b, 0xbe, 0x2f, 0x8c, 0x4e, 0x26, 0x3f, 0x75, 0x75, 0x19,
- 0x76, 0x07, 0x1e, 0x9c, 0xe6, 0xec, 0xf2, 0x9c, 0x59, 0x9f, 0x67, 0x03,
- 0xd1, 0x63, 0x59, 0xe6, 0x4f, 0x12, 0x25, 0x51, 0x1c, 0x92, 0x45, 0xe6,
- 0xaa, 0x92, 0xac, 0xae, 0x73, 0xc5, 0xba, 0xce, 0x62, 0x15, 0x80, 0xed,
- 0x51, 0x9a, 0x79, 0x42, 0xbf, 0x51, 0xa7, 0x0e, 0x05, 0xaf, 0x20, 0x81,
- 0xd5, 0x2c, 0x69, 0x81, 0xdb, 0xd9, 0xd6, 0x90, 0xcc, 0xd4, 0x43, 0x79,
- 0x4a, 0x78, 0x4f, 0x19, 0xe3, 0x8d, 0xf9, 0x15, 0x30, 0xe6, 0xeb, 0x66,
- 0x8f, 0x57, 0xeb, 0xc9, 0x72, 0xf6, 0x38, 0x79, 0x61, 0xfe, 0x13, 0x28,
- 0x59, 0xc8, 0x19, 0x1d, 0xbf, 0x32, 0x8a, 0x16, 0x25, 0xb8, 0x90, 0xbc,
- 0x60, 0xc8, 0x1b, 0xaf, 0x8b, 0xc4, 0xd1, 0xa1, 0x99, 0xe9, 0x6d, 0xaa,
- 0xd0, 0x96, 0x46, 0x23, 0xbc, 0xcc, 0x1b, 0xce, 0xd3, 0xeb, 0xc1, 0x0d,
- 0xf2, 0x52, 0x1b, 0x70, 0xe6, 0x07, 0x87, 0x9f, 0x27, 0x54, 0x7c, 0xf0,
- 0xf6, 0xf5, 0xe3, 0x64, 0x7a, 0x95, 0x4d, 0x3f, 0xd5, 0xeb, 0xa5, 0xb2,
- 0x63, 0xda, 0x53, 0x63, 0x1e, 0xd0, 0x3c, 0x03, 0xc4, 0x07, 0x33, 0xf1,
- 0x45, 0x3e, 0xa5, 0xd2, 0xbf, 0x41, 0x2b, 0x3a, 0x35, 0xd7, 0xe8, 0x94,
- 0x67, 0x87, 0x5a, 0xb1, 0x81, 0x74, 0x01, 0xce, 0xa9, 0x89, 0x04, 0x2f,
- 0xcc, 0x1e, 0x98, 0x8f, 0xd7, 0xdc, 0xcd, 0x7a, 0xa3, 0xcb, 0xf6, 0x69,
- 0xdb, 0xeb, 0x4d, 0x17, 0x7b, 0x7f, 0xf4, 0xac, 0xa7, 0x3f, 0x47, 0xab,
- 0x35, 0x07, 0xd5, 0x2a, 0xd9, 0x6a, 0x3b, 0xd8, 0x03, 0xa4, 0xe5, 0xd3,
- 0x24, 0x09, 0x10, 0x4a, 0xc3, 0x78, 0xc1, 0xc7, 0xe9, 0xc9, 0x3d, 0x7a,
- 0x42, 0x7a, 0xcb, 0x21, 0x8b, 0x2d, 0x03, 0x26, 0x05, 0x93, 0x16, 0xd2,
- 0x84, 0x6c, 0x14, 0xd0, 0x22, 0x9c, 0x21, 0x04, 0x1b, 0x2a, 0x6d, 0xb6,
- 0xfe, 0x5b, 0x5d, 0x36, 0x8e, 0xc5, 0x48, 0x09, 0xad, 0x87, 0xe6, 0xa0,
- 0xb5, 0x84, 0xc0, 0x6b, 0x23, 0x9b, 0x22, 0x20, 0x32, 0xfb, 0x5d, 0x8e,
- 0x4b, 0xbb, 0xe3, 0xa8, 0x19, 0x8d, 0x10, 0xce, 0x73, 0xea, 0x12, 0xcb,
- 0x16, 0x75, 0x79, 0x53, 0x5c, 0x56, 0xe4, 0x1f, 0x41, 0x51, 0x58, 0x1a,
- 0x8b, 0x65, 0xc4, 0x10, 0x4c, 0xdd, 0xd8, 0xc6, 0xe2, 0x7a, 0x42, 0x9c,
- 0xde, 0xee, 0x0a, 0xe5, 0xdb, 0x73, 0x10, 0x9b, 0x2b, 0x96, 0xd9, 0x66,
- 0xf7, 0x8e, 0x68, 0x7f, 0x20, 0xc7, 0x74, 0x30, 0xda, 0x7f, 0xc8, 0x31,
- 0x11, 0x11, 0xb5, 0x4e, 0xc7, 0xbc, 0xe7, 0x6b, 0xc9, 0x9a, 0x44, 0x6e,
- 0x88, 0xbd, 0x27, 0xfb, 0xce, 0x2c, 0x54, 0xfc, 0x57, 0xd9, 0xac, 0x35,
- 0xd4, 0x46, 0x9e, 0xe3, 0x37, 0x6f, 0xe3, 0xe9, 0x1e, 0x48, 0x18, 0x86,
- 0xfe, 0x75, 0xd8, 0x25, 0x3a, 0xf3, 0xeb, 0x9f, 0xb9, 0x9a, 0x83, 0x9f,
- 0x50, 0xaa, 0xb1, 0x3f, 0x70, 0xdf, 0xdb, 0xb7, 0x2d, 0x11, 0x78, 0x42,
- 0xee, 0x5e, 0x74, 0x86, 0x0b, 0x21, 0xef, 0xf1, 0x02, 0x95, 0xbb, 0x94,
- 0xd5, 0x90, 0x54, 0x76, 0x73, 0x58, 0x81, 0x0a, 0x15, 0x9d, 0xbe, 0x39,
- 0xde, 0x9a, 0x14, 0x5b, 0xd2, 0x69, 0x41, 0x9c, 0x88, 0x19, 0x31, 0xaa,
- 0x99, 0x35, 0xe9, 0xa3, 0x69, 0xfb, 0x20, 0x90, 0x43, 0x4f, 0x45, 0xc7,
- 0x0f, 0x68, 0x53, 0x93, 0x0f, 0x2b, 0xd0, 0x20, 0xc5, 0xb8, 0x1b, 0x07,
- 0xfc, 0x8f, 0xd9, 0x25, 0x7d, 0xb3, 0x73, 0xd8, 0x5f, 0x1a, 0x93, 0x47,
- 0xb1, 0x66, 0xad, 0xdf, 0xa9, 0xa9, 0x0a, 0x96, 0x54, 0x7e, 0x69, 0x11,
- 0xc7, 0x80, 0xf8, 0x6e, 0x92, 0x31, 0x58, 0x5f, 0xbd, 0x58, 0x46, 0xd5,
- 0x94, 0x51, 0x5a, 0xd9, 0xf4, 0x04, 0x8f, 0xce, 0xea, 0xbe, 0xf6, 0xec,
- 0x73, 0xf0, 0xf4, 0x11, 0xff, 0x4a, 0xee, 0xba, 0x84, 0x77, 0x80, 0xfd,
- 0x82, 0x00, 0x50, 0xf4, 0x38, 0x1e, 0xdc, 0x02, 0x21, 0xc0, 0xef, 0xea,
- 0x34, 0xb1, 0xe0, 0xb5, 0x8c, 0x1e, 0x46, 0xdc, 0xfb, 0x83, 0xe8, 0xec,
- 0x88, 0xda, 0x7c, 0xe2, 0x6f, 0x81, 0xe1, 0x3d, 0x8b, 0x10, 0xd7, 0xcf,
- 0xba, 0x0b, 0x87, 0x9b, 0xc2, 0xa0, 0xe1, 0x1d, 0x3c, 0x1a, 0xe9, 0xd7,
- 0xfa, 0xf6, 0x2a, 0x60, 0x67, 0xbd, 0xed, 0x23, 0x1e, 0xb6, 0x5b, 0x3d,
- 0x7b, 0x63, 0xf7, 0xae, 0xb3, 0x5b, 0x7d, 0x47, 0xab, 0x57, 0x35, 0xe0,
- 0x57, 0x3d, 0x57, 0xf5, 0x28, 0xbe, 0x9b, 0x56, 0x43, 0xed, 0xf8, 0x3c,
- 0xc9, 0x65, 0x56, 0xe5, 0x30, 0x89, 0xd3, 0xc5, 0x28, 0x79, 0xed, 0x72,
- 0x5a, 0x00, 0xbc, 0x17, 0x18, 0xab, 0xb3, 0x75, 0x4f, 0xe6, 0xc7, 0xe6,
- 0xd3, 0x3a, 0x92, 0xa4, 0x1e, 0x97, 0xb8, 0x00, 0x99, 0x2e, 0x45, 0x59,
- 0x65, 0x00, 0x88, 0x29, 0x9e, 0x1b, 0x0d, 0x5f, 0x4a, 0x98, 0x8e, 0x52,
- 0xb3, 0x24, 0x00, 0x83, 0xad, 0x3f, 0xf2, 0x63, 0xe6, 0x56, 0xbd, 0xa6,
- 0x12, 0x82, 0x98, 0xa7, 0x08, 0x5f, 0xd4, 0xf4, 0x76, 0x48, 0x44, 0x55,
- 0x28, 0xcd, 0x47, 0xae, 0xf3, 0x34, 0x79, 0xb9, 0x68, 0x86, 0xe3, 0x6f,
- 0xa7, 0x1c, 0x61, 0x6b, 0x85, 0xa7, 0x82, 0x26, 0xaf, 0xf0, 0xaa, 0xa0,
- 0x3f, 0x57, 0x2d, 0x49, 0xab, 0x79, 0x35, 0x5d, 0x2f, 0x81, 0x81, 0x0a,
- 0xb2, 0xb2, 0x7d, 0x22, 0xe8, 0x20, 0x1d, 0xa5, 0x71, 0xba, 0x7d, 0x08,
- 0x7e, 0x98, 0x7e, 0xaa, 0x75, 0x49, 0x52, 0xa4, 0xc3, 0x75, 0x18, 0x76,
- 0xce, 0xed, 0xf6, 0x6a, 0x11, 0x11, 0xd4, 0xb1, 0xec, 0x18, 0xa6, 0x97,
- 0x50, 0x60, 0xfe, 0xdb, 0x87, 0x93, 0x57, 0x2d, 0xef, 0x3e, 0xc7, 0x51,
- 0x92, 0x8d, 0xd1, 0x0a, 0x86, 0x95, 0x95, 0x27, 0xe7, 0xa4, 0xc3, 0x6a,
- 0x36, 0xae, 0x26, 0xce, 0xb5, 0x8e, 0xb7, 0x2c, 0x22, 0x22, 0xd5, 0xe8,
- 0x0b, 0x3f, 0xed, 0x8e, 0x1e, 0xea, 0x1d, 0x3d, 0xfa, 0xa5, 0xef, 0xe8,
- 0xd1, 0x2f, 0x73, 0x47, 0x95, 0x83, 0x78, 0x7f, 0xf7, 0xaf, 0x6b, 0x60,
- 0x96, 0xe2, 0xfa, 0xfa, 0x0e, 0xe7, 0x76, 0xce, 0xc0, 0x90, 0xc1, 0x23,
- 0x86, 0xe2, 0xb7, 0x18, 0x72, 0x81, 0x6c, 0xac, 0x36, 0x2c, 0x11, 0xc7,
- 0xa9, 0x82, 0x3f, 0x0e, 0x92, 0x13, 0x06, 0x36, 0x47, 0x76, 0x92, 0xbc,
- 0x7e, 0xca, 0xf5, 0xb5, 0xe2, 0xf7, 0x56, 0x9f, 0x7f, 0xa4, 0x02, 0x3f,
- 0x9f, 0x12, 0xbc, 0x9a, 0xf3, 0xb8, 0x93, 0xc5, 0xac, 0x3a, 0x63, 0xb5,
- 0x46, 0x48, 0x21, 0x79, 0xb9, 0xa2, 0x12, 0x59, 0xa3, 0x71, 0xdc, 0xba,
- 0xfe, 0xc8, 0x44, 0x62, 0x61, 0x2e, 0x12, 0x6d, 0x32, 0x79, 0x70, 0x25,
- 0xf3, 0xbe, 0x3b, 0x1d, 0x8c, 0xce, 0xf0, 0x87, 0x0b, 0x22, 0xfe, 0x8a,
- 0x0d, 0xc7, 0x43, 0x43, 0xe0, 0x97, 0x41, 0x5b, 0x85, 0xc9, 0x5d, 0x13,
- 0x29, 0x03, 0xa3, 0x55, 0xd3, 0x2e, 0xec, 0xd4, 0x92, 0x65, 0xfa, 0xc8,
- 0xec, 0xe3, 0xee, 0x80, 0x1a, 0xd0, 0xaf, 0xb0, 0x03, 0x54, 0xa7, 0x63,
- 0x8d, 0x2b, 0x2a, 0x53, 0xcb, 0x2f, 0xc9, 0x63, 0x55, 0xf2, 0x35, 0x0e,
- 0x2c, 0x1a, 0xf2, 0x6e, 0x4b, 0x9a, 0xa3, 0xe6, 0x10, 0x0a, 0xdc, 0x6c,
- 0xbb, 0x44, 0x35, 0x1f, 0xa0, 0xf3, 0x1c, 0x7c, 0xd3, 0xdd, 0xe0, 0x91,
- 0x78, 0xac, 0xd9, 0xfe, 0x55, 0x9d, 0x46, 0x61, 0xfd, 0xc5, 0xe2, 0x15,
- 0xc6, 0x25, 0x2d, 0x3a, 0x10, 0xd8, 0xc3, 0x93, 0x91, 0x5e, 0x3f, 0xed,
- 0x17, 0xa7, 0xf0, 0x6c, 0xf2, 0x17, 0xc4, 0x01, 0xc5, 0x66, 0xbe, 0x85,
- 0x88, 0x26, 0x2f, 0x11, 0xf9, 0xf3, 0xb9, 0xd3, 0xca, 0x20, 0x84, 0xd5,
- 0xb3, 0xbe, 0x67, 0x07, 0x14, 0xdd, 0xba, 0xb1, 0x0a, 0xee, 0x3c, 0x1a,
- 0x8d, 0x22, 0x70, 0x16, 0xd7, 0x79, 0x76, 0xd3, 0x72, 0xc5, 0xcb, 0xcc,
- 0x06, 0xb6, 0x41, 0x0a, 0x7b, 0x80, 0xae, 0x69, 0x87, 0xcc, 0x90, 0x13,
- 0x42, 0xd2, 0xec, 0x29, 0x27, 0x71, 0x57, 0xde, 0x7f, 0xda, 0xdb, 0xe6,
- 0x4f, 0xbc, 0xcd, 0x75, 0xac, 0x1e, 0x94, 0x81, 0x91, 0x5d, 0x3f, 0x87,
- 0x01, 0x79, 0x44, 0xaa, 0xbb, 0x04, 0x8d, 0x3b, 0x1c, 0x4f, 0xc3, 0xf5,
- 0xe7, 0xfa, 0x83, 0xbc, 0x66, 0x5c, 0x62, 0xc6, 0x15, 0x0a, 0xa3, 0xc5,
- 0xfc, 0x99, 0x36, 0x3f, 0x10, 0x7e, 0xae, 0xd2, 0xcb, 0x88, 0xbd, 0x29,
- 0x39, 0xa2, 0x20, 0x9c, 0xb4, 0x19, 0x01, 0x5c, 0x31, 0x91, 0xd4, 0x23,
- 0x39, 0x11, 0xaf, 0x73, 0x89, 0x97, 0x29, 0xe3, 0xda, 0xc9, 0x24, 0xba,
- 0xc0, 0x78, 0xbc, 0x57, 0xcf, 0xd5, 0xe7, 0xd3, 0xfe, 0x4a, 0x8c, 0x75,
- 0x24, 0xad, 0xd9, 0xc4, 0x17, 0xeb, 0xf0, 0x96, 0xbb, 0x36, 0xa2, 0xab,
- 0x4f, 0x75, 0x98, 0x5a, 0xce, 0xab, 0xcd, 0xe0, 0x7d, 0x58, 0x99, 0x0c,
- 0x5e, 0xfb, 0x40, 0xd9, 0x01, 0xd4, 0x80, 0x6b, 0x1e, 0x44, 0x03, 0x73,
- 0x83, 0x9f, 0xe8, 0x11, 0xb3, 0x5e, 0xc1, 0xa8, 0x17, 0xd4, 0x82, 0x6a,
- 0x4d, 0x89, 0x27, 0xb8, 0xfb, 0x52, 0xbd, 0x2e, 0x05, 0xeb, 0x5d, 0x30,
- 0x13, 0x0b, 0x09, 0x47, 0xbb, 0x3f, 0xba, 0x4a, 0x6f, 0x6f, 0x47, 0x75,
- 0xb6, 0x67, 0xa8, 0xb6, 0xde, 0xab, 0xeb, 0x05, 0x7d, 0xb4, 0x06, 0xfa,
- 0xda, 0xc6, 0xee, 0x96, 0xb7, 0x77, 0x96, 0x80, 0x84, 0x39, 0x4f, 0x53,
- 0x7a, 0xb5, 0xc5, 0x6c, 0x5d, 0x7b, 0x4b, 0x6e, 0x10, 0xd3, 0x4d, 0x19,
- 0x66, 0xe0, 0x69, 0x40, 0xa8, 0xfb, 0xd5, 0xb6, 0xcc, 0x1a, 0x5c, 0x72,
- 0x96, 0x1d, 0xc7, 0xe1, 0xe9, 0x13, 0xd4, 0x74, 0xd5, 0x57, 0xda, 0x21,
- 0x77, 0xd5, 0x0b, 0x8d, 0x9a, 0x4d, 0xb1, 0x05, 0x10, 0x46, 0x3e, 0x38,
- 0x58, 0x1d, 0xee, 0xf8, 0x44, 0x96, 0x74, 0xf9, 0x29, 0x02, 0xf9, 0xd4,
- 0xe7, 0xb6, 0xf4, 0x96, 0x46, 0xa5, 0x22, 0xcf, 0x1d, 0xc0, 0xe0, 0xcd,
- 0xcd, 0xcd, 0x68, 0x93, 0xdf, 0xf2, 0x5f, 0x8e, 0x81, 0xb7, 0x87, 0x3b,
- 0x33, 0x54, 0x7b, 0x9a, 0x17, 0xeb, 0xdb, 0xc4, 0xc3, 0x78, 0xb1, 0xcd,
- 0x80, 0x34, 0x30, 0x97, 0x7c, 0xfb, 0xfe, 0x8d, 0x6d, 0x84, 0xad, 0xe8,
- 0x1a, 0xe4, 0xf9, 0xad, 0x43, 0xad, 0x2d, 0xcb, 0x19, 0x77, 0x87, 0x40,
- 0xa3, 0x5f, 0xbd, 0x3c, 0xff, 0xf8, 0xee, 0xf8, 0xe2, 0xe3, 0xfb, 0x97,
- 0xdf, 0xd1, 0x16, 0xb2, 0x57, 0xc6, 0xc8, 0x2b, 0x8a, 0x07, 0x54, 0x65,
- 0x49, 0x4d, 0xed, 0xde, 0xa2, 0x6c, 0x30, 0x2f, 0x00, 0xaf, 0x12, 0x6d,
- 0xb3, 0x6e, 0x31, 0xa3, 0x64, 0x9e, 0x66, 0x2e, 0xcf, 0x93, 0xd6, 0x7e,
- 0x7d, 0xca, 0xaa, 0x22, 0x5b, 0x8c, 0xca, 0xea, 0x92, 0xa8, 0x70, 0xef,
- 0xb5, 0xf0, 0xcf, 0xe8, 0x70, 0x7b, 0x92, 0xd5, 0x40, 0x10, 0x64, 0xd7,
- 0xd5, 0x9c, 0x10, 0x4b, 0x1e, 0xda, 0xa3, 0xd0, 0x23, 0xcd, 0x47, 0x60,
- 0x80, 0xab, 0xeb, 0x47, 0x1b, 0xd4, 0xbb, 0x76, 0xa7, 0x58, 0xe9, 0xf1,
- 0x06, 0x0a, 0x82, 0xef, 0xc7, 0xcf, 0x55, 0xe1, 0xea, 0xcc, 0xc5, 0xdd,
- 0x20, 0x02, 0x80, 0x00, 0x75, 0xae, 0xb4, 0x50, 0x12, 0x28, 0x70, 0xa3,
- 0x24, 0x9b, 0x8d, 0x2d, 0xee, 0xad, 0x56, 0xd4, 0xf5, 0x21, 0xf4, 0xf9,
- 0x1e, 0x86, 0x4f, 0x42, 0xcb, 0x90, 0x9a, 0x2e, 0x7a, 0x6b, 0x7e, 0x22,
- 0x6b, 0x7e, 0xf2, 0x2f, 0xad, 0xf9, 0xc9, 0xbf, 0xb0, 0xe6, 0x47, 0xbf,
- 0xf0, 0x9a, 0x1f, 0x45, 0xd7, 0xec, 0x7d, 0x65, 0xf8, 0x37, 0x5a, 0xf3,
- 0xdf, 0xd6, 0xc5, 0xa7, 0xa1, 0x99, 0x2f, 0x49, 0x61, 0xe9, 0xb1, 0x56,
- 0xf7, 0x98, 0x6c, 0x7e, 0xa3, 0x1d, 0xf8, 0xf6, 0x1d, 0xc0, 0xb0, 0xd7,
- 0x33, 0x2e, 0x15, 0x53, 0x81, 0x43, 0xfc, 0x4d, 0xd8, 0xd4, 0x22, 0x30,
- 0x10, 0x72, 0xaa, 0xf7, 0xad, 0xa7, 0xe4, 0xa7, 0x20, 0xcd, 0x7e, 0x4b,
- 0x66, 0xa3, 0xc3, 0x6e, 0x69, 0xdf, 0x15, 0xdc, 0xf4, 0x34, 0xc4, 0x39,
- 0x9a, 0xc2, 0x4d, 0x86, 0x3b, 0x69, 0x63, 0xe0, 0xae, 0x2f, 0x3b, 0x8c,
- 0x0e, 0xc6, 0x80, 0xd2, 0x81, 0x39, 0x2e, 0x48, 0x31, 0x9f, 0x90, 0x67,
- 0x5c, 0xdc, 0xad, 0x68, 0x40, 0x23, 0x9b, 0x2b, 0x23, 0x83, 0x39, 0x11,
- 0x05, 0xcd, 0xc4, 0x13, 0x3b, 0xc9, 0xa4, 0x33, 0x41, 0x89, 0x76, 0x5c,
- 0x65, 0x77, 0xdb, 0x81, 0xc2, 0x30, 0x5d, 0x94, 0xc4, 0x6f, 0x66, 0x9b,
- 0x8d, 0x8f, 0x89, 0x6b, 0x70, 0xc7, 0xf2, 0xa2, 0xd3, 0xf1, 0xce, 0x97,
- 0x1b, 0x9f, 0xb2, 0x6c, 0x95, 0x2e, 0x00, 0xad, 0x41, 0xb9, 0x0f, 0x7d,
- 0x8d, 0xb2, 0x5a, 0xc9, 0x91, 0x5a, 0x38, 0x80, 0x37, 0x5a, 0x99, 0x67,
- 0xe0, 0x73, 0x7c, 0x90, 0x54, 0x29, 0x93, 0xe4, 0x33, 0xd4, 0xba, 0xc6,
- 0xfb, 0xa6, 0xb8, 0xa6, 0x0c, 0x76, 0x12, 0xd4, 0x7a, 0xa3, 0x9c, 0x08,
- 0x06, 0x8c, 0xfd, 0x84, 0xe2, 0xc8, 0x51, 0x6a, 0xce, 0x75, 0x4e, 0x29,
- 0x79, 0x5d, 0xec, 0x61, 0xfb, 0x3e, 0xbf, 0x0e, 0x54, 0xa9, 0x56, 0xe7,
- 0x04, 0x3e, 0x40, 0x7a, 0xa2, 0xb4, 0xf2, 0x8f, 0xd4, 0x0d, 0xf4, 0x11,
- 0x0d, 0x48, 0x4a, 0x01, 0x94, 0x59, 0xff, 0xbd, 0x78, 0x75, 0xfe, 0xf1,
- 0x9b, 0xe3, 0xe3, 0xf3, 0x93, 0xd7, 0xa7, 0xc7, 0x72, 0x61, 0xec, 0x8f,
- 0xde, 0x5d, 0x7c, 0x7b, 0xaa, 0x7d, 0xe2, 0x94, 0x16, 0x03, 0x82, 0x17,
- 0xd8, 0x7f, 0x66, 0xca, 0x03, 0xb4, 0xc3, 0x32, 0x86, 0xf4, 0xcb, 0x93,
- 0xef, 0x8d, 0xd6, 0x7a, 0x3e, 0xfc, 0xf0, 0x7d, 0xd0, 0x8b, 0xc4, 0xab,
- 0x31, 0x09, 0x9b, 0x09, 0xb8, 0x92, 0x13, 0xf4, 0x74, 0x77, 0x6b, 0xef,
- 0x4b, 0xb9, 0xfb, 0x85, 0xc5, 0x20, 0x35, 0x38, 0x2f, 0xac, 0xc2, 0xc0,
- 0x2f, 0x6a, 0xbf, 0x1f, 0x2f, 0xad, 0xed, 0xc9, 0xbe, 0xb6, 0x51, 0xdb,
- 0x18, 0xb4, 0xf8, 0xbc, 0x6d, 0x33, 0x7e, 0xca, 0xee, 0x80, 0xe1, 0x98,
- 0xbc, 0xa0, 0xff, 0xc6, 0xdb, 0xdc, 0x9d, 0x57, 0xf9, 0x35, 0xe9, 0x7f,
- 0xe6, 0x59, 0x0e, 0xe9, 0xd2, 0xa3, 0x23, 0xdb, 0xf4, 0x4f, 0xc2, 0xca,
- 0x34, 0x08, 0x32, 0x4f, 0x30, 0x68, 0x12, 0xf3, 0xf6, 0x00, 0x19, 0x87,
- 0x7e, 0xc3, 0xe3, 0x61, 0x40, 0xb3, 0x3d, 0xa3, 0xe4, 0xf5, 0xf1, 0xfb,
- 0x41, 0x72, 0x7e, 0xfc, 0x96, 0x0b, 0x55, 0x8e, 0xdf, 0x7d, 0xc5, 0x7d,
- 0x10, 0xb5, 0xbd, 0x1d, 0x32, 0x21, 0xc2, 0x64, 0x4d, 0x6f, 0x4f, 0xcc,
- 0xbb, 0xc8, 0x4c, 0xad, 0x6b, 0x23, 0x5d, 0x7f, 0x45, 0x00, 0x1d, 0x5e,
- 0xdb, 0x0b, 0xf3, 0x9f, 0xd8, 0x56, 0x19, 0x3b, 0xe2, 0xeb, 0xc8, 0x76,
- 0x89, 0x62, 0x66, 0x73, 0x67, 0xc4, 0x28, 0xa0, 0xdd, 0xe0, 0x1d, 0x33,
- 0x1b, 0x12, 0x66, 0x71, 0xe8, 0x06, 0xc1, 0xec, 0x03, 0x84, 0x10, 0x37,
- 0xcf, 0x95, 0x18, 0x3c, 0x59, 0xb1, 0xe6, 0x73, 0x03, 0xa2, 0x4b, 0x00,
- 0x92, 0xbb, 0xcd, 0x88, 0x55, 0x47, 0x57, 0x39, 0x37, 0x22, 0xee, 0x20,
- 0xd3, 0x99, 0xed, 0xce, 0x67, 0x8c, 0xc0, 0x40, 0x01, 0xe4, 0xb2, 0xa2,
- 0x04, 0x0e, 0x82, 0x3e, 0xf8, 0x9f, 0x7b, 0xa3, 0xba, 0xbe, 0xda, 0xcb,
- 0x67, 0x1f, 0xab, 0x3a, 0xdd, 0xee, 0xca, 0x22, 0xef, 0xd7, 0x33, 0xfa,
- 0x75, 0xb2, 0x3d, 0xb2, 0x8f, 0xca, 0xdf, 0xe9, 0xe7, 0x51, 0x2c, 0x00,
- 0x15, 0x41, 0xec, 0x5a, 0xd1, 0x7c, 0x4e, 0x6d, 0x9f, 0xb8, 0xc8, 0x27,
- 0x95, 0x51, 0xe0, 0x5c, 0xf7, 0x0f, 0xe9, 0x86, 0xb8, 0xfa, 0x34, 0xad,
- 0x0f, 0x0e, 0x42, 0x34, 0x7a, 0x5b, 0xe2, 0x38, 0xd0, 0xbc, 0xdc, 0xf3,
- 0x6f, 0x5e, 0x8d, 0x7f, 0x77, 0x70, 0x80, 0x34, 0xe8, 0x1d, 0x4a, 0x57,
- 0x7d, 0xfa, 0xf8, 0xe0, 0x70, 0x37, 0xa6, 0x3e, 0x06, 0x79, 0x3d, 0xd4,
- 0xc1, 0x32, 0x75, 0xf4, 0x49, 0xbb, 0x8f, 0x30, 0xb7, 0x14, 0x3d, 0xd8,
- 0xa1, 0x67, 0x19, 0x25, 0x09, 0xa2, 0xb2, 0x93, 0xc3, 0x99, 0xc8, 0x9d,
- 0x0c, 0x52, 0x2f, 0x2c, 0x0e, 0xd2, 0x16, 0xcf, 0xfe, 0xf9, 0x96, 0xa5,
- 0x2a, 0x3f, 0x87, 0x1c, 0xf9, 0x27, 0xde, 0xac, 0x47, 0xbc, 0x4f, 0xdd,
- 0xf0, 0x9a, 0xbf, 0x2e, 0x24, 0x3a, 0x3a, 0xa0, 0x29, 0x16, 0x5f, 0xae,
- 0x75, 0x64, 0x27, 0x41, 0x80, 0xf2, 0x03, 0x02, 0x5f, 0xbd, 0xcc, 0x69,
- 0x8b, 0xe9, 0x87, 0x08, 0x3e, 0x75, 0x83, 0xda, 0xdd, 0xf7, 0x18, 0x84,
- 0x3f, 0x68, 0xe8, 0xec, 0xe3, 0x6f, 0x24, 0x5b, 0xe6, 0xee, 0xc6, 0x87,
- 0xfc, 0x55, 0xef, 0x64, 0x35, 0x49, 0x5e, 0x2c, 0xcc, 0x8b, 0x8b, 0x9e,
- 0xd2, 0xbb, 0x63, 0x6e, 0xb7, 0xf5, 0x4d, 0x56, 0x4d, 0xb2, 0xaa, 0xac,
- 0x3b, 0x55, 0x42, 0x58, 0xad, 0xd4, 0xfd, 0x52, 0x4d, 0x80, 0x19, 0x47,
- 0xd3, 0xa5, 0x82, 0xc6, 0x9a, 0x0d, 0xac, 0x6f, 0xc1, 0x78, 0x6f, 0xe3,
- 0xf2, 0x6c, 0xa3, 0x56, 0x89, 0x2e, 0x00, 0xf5, 0x97, 0xa2, 0x3f, 0x0d,
- 0x37, 0x9e, 0xa3, 0x19, 0x4c, 0x9e, 0x2e, 0xb6, 0xa9, 0xeb, 0x4f, 0xf7,
- 0x1a, 0x09, 0xa5, 0x6d, 0x8f, 0xa8, 0x00, 0x8d, 0x8d, 0x35, 0x64, 0x41,
- 0xa1, 0xdc, 0x3a, 0x4d, 0x64, 0x2e, 0x9a, 0xdf, 0x4d, 0xd7, 0xdc, 0xa5,
- 0x01, 0xd6, 0x41, 0x27, 0x24, 0x3b, 0x5c, 0x1b, 0x3a, 0xa9, 0x2f, 0xc3,
- 0xf8, 0x17, 0x16, 0x53, 0x7c, 0x0c, 0x3f, 0xb9, 0x79, 0xb6, 0xed, 0x97,
- 0xdd, 0x19, 0x4e, 0xcf, 0xca, 0x3f, 0x67, 0x7d, 0x3f, 0xda, 0x8a, 0xf6,
- 0x25, 0x57, 0x87, 0x77, 0xb0, 0x46, 0xd0, 0x95, 0x80, 0x4a, 0x9a, 0x66,
- 0x6c, 0x18, 0x4a, 0xf5, 0xab, 0x4b, 0x9c, 0x60, 0x4e, 0x13, 0x06, 0xc7,
- 0xb1, 0x54, 0xf4, 0x0f, 0xd1, 0x69, 0x0f, 0xd9, 0x78, 0x7f, 0x95, 0x88,
- 0x37, 0x02, 0x75, 0x51, 0x37, 0x15, 0xa1, 0xa5, 0x16, 0x0e, 0x73, 0x79,
- 0x91, 0xf5, 0x82, 0x68, 0x29, 0xa2, 0xaa, 0x39, 0xa4, 0x85, 0xf4, 0x36,
- 0xd4, 0x6c, 0xc4, 0x4a, 0xe7, 0x34, 0x94, 0x64, 0x0e, 0x75, 0x18, 0xd0,
- 0x7b, 0xff, 0x76, 0x2f, 0xa4, 0xca, 0x7d, 0x67, 0xe7, 0x54, 0xfa, 0x18,
- 0x4c, 0xc2, 0x83, 0xb1, 0xe2, 0x3a, 0x65, 0x7e, 0xa8, 0x18, 0x18, 0x42,
- 0x26, 0xbd, 0x30, 0xfc, 0x34, 0x0b, 0xc0, 0xb2, 0xc6, 0x2d, 0x7c, 0x05,
- 0x69, 0xf9, 0xaa, 0x25, 0x74, 0x78, 0xcf, 0xb6, 0xbe, 0xb6, 0x4d, 0xca,
- 0x98, 0xf6, 0x87, 0x50, 0x59, 0xbb, 0xee, 0x36, 0x6a, 0x57, 0xe2, 0xca,
- 0xb4, 0x71, 0x6b, 0x01, 0x46, 0xaf, 0x20, 0x47, 0x9a, 0x25, 0xcd, 0xdb,
- 0x41, 0xbe, 0x68, 0xc9, 0xbf, 0x85, 0x71, 0x91, 0x06, 0x3e, 0x10, 0x14,
- 0x3c, 0x70, 0x07, 0x10, 0x21, 0x82, 0xed, 0x19, 0x7b, 0x46, 0x71, 0x24,
- 0x76, 0xaa, 0x74, 0xf1, 0x24, 0x0c, 0xc5, 0x5d, 0x13, 0xcc, 0x8d, 0x0e,
- 0x4c, 0x85, 0x89, 0x19, 0xe2, 0x26, 0x9f, 0x35, 0x57, 0xe8, 0xc9, 0xa3,
- 0x96, 0x51, 0x2d, 0xb8, 0x00, 0xe4, 0xa4, 0xce, 0xc3, 0xaa, 0xb7, 0x49,
- 0x8f, 0x03, 0x8f, 0x0f, 0x0c, 0x9b, 0x9a, 0x30, 0x40, 0x16, 0x39, 0xea,
- 0x70, 0x0e, 0x70, 0x6a, 0xef, 0xb1, 0xaa, 0x67, 0xa1, 0x61, 0x52, 0x73,
- 0x8b, 0xe6, 0xd4, 0x6e, 0x27, 0x30, 0xd7, 0xb4, 0x3c, 0x6d, 0xa4, 0x37,
- 0x84, 0x68, 0x78, 0xfb, 0x13, 0x83, 0xe2, 0x7f, 0xb3, 0xad, 0x5d, 0x65,
- 0xd7, 0x45, 0xe3, 0x57, 0xd0, 0x10, 0x2f, 0x4f, 0x3e, 0xe5, 0x61, 0xa7,
- 0x06, 0x7c, 0x7d, 0x60, 0x78, 0xcd, 0x92, 0x47, 0x78, 0xbb, 0xad, 0x8e,
- 0x52, 0x02, 0x4c, 0xb8, 0x4c, 0xe5, 0xf7, 0x0c, 0x96, 0xb2, 0x7d, 0xc9,
- 0x0f, 0x7d, 0xe5, 0x1e, 0xea, 0x0c, 0x47, 0x5e, 0x7b, 0xf6, 0xd2, 0x6b,
- 0x32, 0x5d, 0xfd, 0x9c, 0x0a, 0x34, 0xbe, 0x19, 0x24, 0x47, 0x4b, 0x1c,
- 0xca, 0xc1, 0x57, 0x31, 0xc6, 0xc5, 0x3d, 0x82, 0xeb, 0xd2, 0x96, 0xcb,
- 0x0f, 0xff, 0x42, 0x26, 0x17, 0x36, 0x8c, 0xe9, 0xd2, 0x56, 0x82, 0x71,
- 0x3d, 0x8a, 0xf2, 0x83, 0x48, 0xd0, 0x01, 0xb9, 0x94, 0x2b, 0x32, 0x12,
- 0x66, 0x99, 0xa2, 0x84, 0x2f, 0xe1, 0xdd, 0xa4, 0x6c, 0xa9, 0x95, 0xc0,
- 0x61, 0x10, 0xb9, 0x0e, 0x2d, 0x04, 0x69, 0xbd, 0xa0, 0x07, 0xd0, 0x26,
- 0xab, 0x0c, 0x32, 0xab, 0x17, 0x2b, 0x18, 0x48, 0xb6, 0x93, 0x9d, 0x37,
- 0x29, 0xaa, 0x6a, 0x9d, 0x26, 0xe2, 0xe3, 0xf9, 0x15, 0x45, 0xe2, 0x02,
- 0x29, 0x7a, 0x79, 0xdd, 0x0c, 0x23, 0x78, 0xaf, 0x88, 0x01, 0x9d, 0x9f,
- 0x9d, 0x1f, 0xed, 0xfa, 0xa0, 0x98, 0x02, 0x8e, 0xc0, 0x3d, 0x1f, 0x11,
- 0x25, 0xb2, 0xc0, 0x09, 0x03, 0x65, 0x37, 0x5c, 0xa6, 0x17, 0xda, 0x96,
- 0x53, 0x41, 0x8c, 0x23, 0xe6, 0x82, 0x2f, 0xc2, 0xe5, 0xef, 0x0a, 0x45,
- 0xbc, 0x6e, 0x88, 0xee, 0x62, 0x2a, 0x3c, 0xe2, 0x67, 0x21, 0xac, 0x4c,
- 0xcd, 0x09, 0xe5, 0x40, 0x64, 0x19, 0xa2, 0xf8, 0xaf, 0xdd, 0x4f, 0x84,
- 0x0a, 0x17, 0x82, 0x59, 0x26, 0x9c, 0x78, 0x14, 0x49, 0xe9, 0x92, 0x20,
- 0xaf, 0x7b, 0x12, 0x01, 0x09, 0x2d, 0x86, 0x04, 0xba, 0x90, 0xcb, 0xb5,
- 0x20, 0x6f, 0x29, 0x51, 0x2d, 0x63, 0x2a, 0x8f, 0x7a, 0xfb, 0xc0, 0xdb,
- 0xbe, 0x16, 0x2d, 0x8b, 0x4c, 0xba, 0x96, 0xa5, 0xc9, 0xbb, 0xd3, 0xf1,
- 0x85, 0x1f, 0x44, 0x82, 0x1e, 0x16, 0xa4, 0x32, 0xb7, 0x81, 0xdd, 0xbc,
- 0xd4, 0xa2, 0xd3, 0x93, 0xf1, 0xc5, 0x28, 0xd6, 0xb1, 0xc1, 0x68, 0xe7,
- 0x63, 0x2a, 0xb7, 0x69, 0x01, 0x65, 0x24, 0xdc, 0x1d, 0x9c, 0x13, 0x8d,
- 0x39, 0x3a, 0xc6, 0xd1, 0xa2, 0xbc, 0xf2, 0x41, 0x21, 0xba, 0xc3, 0x99,
- 0x29, 0xfe, 0x91, 0xd3, 0x94, 0x25, 0xc5, 0x59, 0xa3, 0x44, 0xf5, 0x7a,
- 0x32, 0xf4, 0x90, 0x14, 0x59, 0xdf, 0x41, 0x8b, 0x2e, 0x43, 0xbd, 0x46,
- 0x42, 0x7d, 0x0a, 0x6d, 0xcc, 0x1d, 0x26, 0x28, 0xec, 0x8f, 0x20, 0x60,
- 0xb6, 0x5c, 0xdd, 0xd3, 0x24, 0x03, 0xe2, 0x2e, 0x9c, 0x4c, 0xf4, 0xec,
- 0x83, 0x89, 0x8a, 0xb6, 0xa2, 0xb3, 0x93, 0xd2, 0xd5, 0xb1, 0x5d, 0xb3,
- 0x40, 0x61, 0xbb, 0x9f, 0x12, 0xa7, 0xf4, 0x48, 0xd0, 0x11, 0x5d, 0x9d,
- 0x65, 0xec, 0x72, 0xb2, 0xd3, 0xee, 0x05, 0x01, 0xce, 0x67, 0x8c, 0x83,
- 0x59, 0xb7, 0x81, 0x30, 0x19, 0xf4, 0x80, 0x98, 0x0e, 0x37, 0x00, 0x22,
- 0xd5, 0xad, 0xef, 0x24, 0xd9, 0x27, 0xd7, 0xca, 0x4f, 0x1d, 0x7e, 0xcf,
- 0x19, 0xcf, 0x08, 0x94, 0x0d, 0xfa, 0x10, 0xda, 0x42, 0x32, 0xd2, 0x66,
- 0x4c, 0x1f, 0x4e, 0x5e, 0x9f, 0xda, 0xdd, 0x92, 0xdd, 0x41, 0x0a, 0xad,
- 0x5d, 0x2b, 0x95, 0xb5, 0x28, 0xdb, 0xc4, 0x99, 0x04, 0x41, 0x9f, 0x75,
- 0x91, 0xff, 0x1d, 0xa9, 0x56, 0xd0, 0x5d, 0xe7, 0x39, 0xe0, 0xbc, 0x52,
- 0xb8, 0xce, 0x55, 0x92, 0x6d, 0xd7, 0xb6, 0x93, 0x5d, 0x3e, 0xb3, 0xe5,
- 0x1f, 0x1c, 0xe3, 0x8b, 0xe6, 0x1f, 0x6f, 0x44, 0x4e, 0x39, 0x68, 0xc3,
- 0x9b, 0x02, 0xe5, 0x58, 0xc0, 0xc8, 0x8c, 0x40, 0xda, 0x43, 0xf9, 0x62,
- 0xa0, 0x5c, 0x40, 0x37, 0x73, 0xd9, 0x75, 0x6d, 0x90, 0x9d, 0xb2, 0x92,
- 0xa2, 0xc7, 0x9d, 0x37, 0xef, 0xcf, 0xde, 0x0e, 0x2f, 0xce, 0xd0, 0xea,
- 0x1e, 0xe6, 0xdc, 0x62, 0x43, 0x8a, 0x48, 0x6d, 0xfb, 0xa4, 0x3a, 0x94,
- 0x12, 0xf1, 0xb5, 0xed, 0xd4, 0xbb, 0x52, 0xe8, 0xc3, 0x22, 0x05, 0xd3,
- 0xd3, 0xb7, 0x82, 0xf6, 0x25, 0x05, 0x6b, 0x22, 0x29, 0x5a, 0xa4, 0x92,
- 0xdf, 0x71, 0xea, 0xc5, 0xb1, 0x38, 0xa5, 0x43, 0x38, 0xf7, 0x64, 0x5d,
- 0xdf, 0x25, 0x52, 0x5b, 0x4a, 0x98, 0x85, 0xb0, 0xa5, 0xc2, 0xe8, 0x80,
- 0xed, 0xbd, 0x6d, 0x91, 0x8a, 0xa8, 0xea, 0x8e, 0xcb, 0xba, 0x9a, 0xd2,
- 0x5c, 0xdf, 0xb4, 0xaa, 0xca, 0x1b, 0x15, 0x5c, 0x52, 0xfb, 0x6d, 0xa6,
- 0x4e, 0x87, 0x54, 0xdd, 0xf5, 0xa2, 0xbb, 0x08, 0x60, 0x99, 0x76, 0x0e,
- 0xdf, 0xa8, 0xfe, 0x3d, 0x6e, 0x63, 0x6e, 0x68, 0x06, 0xf8, 0xb0, 0xa9,
- 0xd6, 0x54, 0x52, 0x1a, 0x77, 0x3b, 0x9f, 0x12, 0x9b, 0x6c, 0xa7, 0x8c,
- 0x0f, 0x04, 0x51, 0x91, 0x00, 0x78, 0xd0, 0xeb, 0xcd, 0xfa, 0x25, 0xe1,
- 0x9f, 0xe0, 0x98, 0xe2, 0x1f, 0x82, 0x1b, 0x2c, 0x50, 0xcb, 0xa4, 0xd1,
- 0x53, 0x1b, 0x57, 0xa4, 0x8d, 0xbb, 0x5c, 0xbc, 0xbc, 0xe1, 0xfe, 0x9b,
- 0x9a, 0x84, 0x03, 0x30, 0x35, 0x30, 0x03, 0xfa, 0x69, 0xa0, 0x4b, 0x2a,
- 0x4a, 0x52, 0x4e, 0x08, 0x15, 0xb3, 0xf5, 0x14, 0xc7, 0x44, 0x11, 0x3f,
- 0x6a, 0xef, 0x39, 0x61, 0xdc, 0x56, 0x05, 0x79, 0xa0, 0xa1, 0x5d, 0xba,
- 0x3c, 0x3b, 0x70, 0xba, 0x5a, 0x56, 0xc2, 0x8f, 0xb9, 0x9e, 0x65, 0xa4,
- 0x4c, 0x52, 0xee, 0x6b, 0xc6, 0x8a, 0x65, 0xd5, 0xb5, 0x39, 0x29, 0xaa,
- 0xa4, 0x3d, 0x93, 0x43, 0x76, 0x45, 0xa0, 0xf9, 0x80, 0x0b, 0x97, 0xa0,
- 0x3f, 0x21, 0x5b, 0x12, 0x01, 0x23, 0xe8, 0xfe, 0xe7, 0xb4, 0x36, 0x7c,
- 0xa9, 0x3d, 0xde, 0xee, 0x06, 0xf7, 0xf4, 0x5a, 0x0b, 0x2b, 0xbc, 0xd3,
- 0x6b, 0x1d, 0x48, 0xfc, 0xe4, 0x4e, 0x5a, 0x18, 0x17, 0x9c, 0x9a, 0xe1,
- 0xed, 0xb8, 0xb0, 0x28, 0x00, 0x2f, 0x22, 0x57, 0x3d, 0x45, 0xb7, 0xeb,
- 0xeb, 0x18, 0x73, 0x4a, 0x6d, 0x3f, 0xc7, 0x26, 0xd1, 0x8f, 0x26, 0x3b,
- 0x5a, 0xf9, 0x69, 0x2b, 0x91, 0x4e, 0xe5, 0x57, 0xcf, 0x6d, 0x69, 0x2a,
- 0xf1, 0xb4, 0xce, 0x70, 0x47, 0xdf, 0x7f, 0xdf, 0xee, 0xbf, 0xbc, 0xdb,
- 0x07, 0x86, 0x21, 0x35, 0x29, 0x33, 0xe6, 0x7d, 0x3a, 0xe1, 0xa0, 0xae,
- 0x4e, 0xc9, 0x8e, 0x42, 0x0c, 0xc8, 0xe2, 0x67, 0x07, 0x8c, 0x78, 0x8a,
- 0x8c, 0x09, 0x78, 0xa5, 0xc5, 0x56, 0xad, 0x14, 0x0e, 0xc0, 0x64, 0x9c,
- 0x44, 0x72, 0x16, 0xc1, 0x70, 0x35, 0xf7, 0x82, 0x63, 0x2a, 0xc8, 0x49,
- 0xf7, 0xb7, 0xab, 0x76, 0xce, 0x99, 0x2b, 0x8a, 0x2d, 0x08, 0x50, 0xf3,
- 0xe6, 0x26, 0xd1, 0x16, 0x38, 0xd3, 0x96, 0x5e, 0x42, 0xde, 0x73, 0x5b,
- 0x09, 0x4a, 0x8b, 0x9d, 0x56, 0x99, 0x78, 0x1b, 0xb4, 0x09, 0x50, 0x10,
- 0x45, 0x26, 0xd0, 0x1e, 0xbe, 0x3c, 0x70, 0xaa, 0xa6, 0xde, 0x7d, 0x71,
- 0x78, 0x8b, 0x9d, 0x13, 0x93, 0x32, 0x8c, 0x50, 0x7b, 0xbf, 0x29, 0x01,
- 0xb1, 0x89, 0xde, 0x4b, 0x80, 0x8d, 0x2b, 0xd9, 0xb1, 0x25, 0xed, 0x83,
- 0x59, 0xde, 0xfc, 0x41, 0x6f, 0xee, 0xc8, 0x0f, 0x5e, 0x12, 0x15, 0xc4,
- 0x42, 0xa0, 0xca, 0x4c, 0xe8, 0x5c, 0x08, 0xdb, 0x97, 0x72, 0xe1, 0xb4,
- 0x25, 0x19, 0x79, 0x8a, 0x35, 0x46, 0xce, 0xea, 0x34, 0x90, 0x28, 0x96,
- 0x30, 0x5e, 0x42, 0xa0, 0x69, 0x77, 0x65, 0x29, 0x87, 0x07, 0x4e, 0x4f,
- 0x87, 0x4b, 0xc7, 0xce, 0x2d, 0x63, 0x94, 0x0e, 0xf1, 0x58, 0xdd, 0x97,
- 0x6e, 0x22, 0xc8, 0xe3, 0xc8, 0x81, 0xe3, 0xf6, 0x29, 0xfe, 0x9e, 0xa9,
- 0x9b, 0xcc, 0xa2, 0x9e, 0x48, 0xa1, 0x99, 0xf4, 0xe1, 0xf8, 0xea, 0xf8,
- 0xa2, 0x7b, 0xb5, 0xfc, 0xc8, 0x21, 0x30, 0x46, 0xcc, 0xbf, 0xcf, 0x3f,
- 0x5c, 0xec, 0xa2, 0x39, 0x99, 0x02, 0x06, 0x37, 0xad, 0xa6, 0x33, 0xb6,
- 0x7e, 0x35, 0x2c, 0xc5, 0x61, 0x54, 0x0f, 0xe1, 0x53, 0x92, 0x0c, 0x24,
- 0x37, 0x83, 0x7c, 0x2c, 0x47, 0xfb, 0x07, 0xc6, 0x8e, 0xda, 0x3f, 0x44,
- 0xc3, 0xe9, 0xa3, 0xfd, 0x23, 0x0b, 0x84, 0xa0, 0x4f, 0x85, 0x6d, 0x2a,
- 0xf8, 0x45, 0xb8, 0x4c, 0x40, 0xf7, 0x47, 0xb7, 0xb7, 0xf8, 0x71, 0xbb,
- 0xbc, 0x62, 0x68, 0x4b, 0x12, 0xfd, 0x69, 0x46, 0xe5, 0xbe, 0xb7, 0xdf,
- 0x88, 0xec, 0xad, 0x0b, 0x2e, 0x00, 0x46, 0x43, 0x6f, 0xc2, 0x0d, 0x19,
- 0xf5, 0x77, 0xb7, 0xf2, 0x5a, 0xf5, 0x09, 0x3a, 0x9a, 0xdf, 0x9e, 0xce,
- 0x10, 0x8b, 0x8f, 0x38, 0x23, 0x28, 0x24, 0x01, 0x6b, 0xa6, 0x67, 0x04,
- 0xaf, 0xc9, 0xec, 0xc1, 0xad, 0xdb, 0x21, 0xdb, 0x32, 0x55, 0x18, 0x80,
- 0x11, 0x74, 0xc2, 0x8e, 0x6c, 0x31, 0x4d, 0xc4, 0x09, 0x41, 0xfc, 0xef,
- 0x39, 0xa5, 0x89, 0x98, 0x3b, 0x81, 0xfd, 0xd5, 0xbf, 0x6a, 0x1e, 0x1f,
- 0xff, 0xeb, 0xa8, 0x2d, 0x29, 0xc9, 0x3d, 0xac, 0x83, 0xbe, 0x90, 0xbf,
- 0x04, 0xbe, 0x4a, 0xf4, 0x19, 0x86, 0x6e, 0x8c, 0x0e, 0x31, 0xbb, 0x2d,
- 0xff, 0x09, 0xc6, 0xb0, 0x13, 0x13, 0x2d, 0x45, 0x3a, 0xb8, 0x33, 0x8b,
- 0xee, 0xd2, 0x46, 0x4b, 0x3e, 0x8c, 0xfa, 0x1a, 0x00, 0xaa, 0x26, 0x18,
- 0x8c, 0xaf, 0x09, 0x16, 0x16, 0x31, 0xc0, 0x53, 0x89, 0xcb, 0x55, 0xec,
- 0xee, 0xd6, 0x0a, 0xfe, 0x40, 0xc2, 0xd5, 0x3a, 0xdb, 0x65, 0x8e, 0x9d,
- 0xe9, 0x24, 0x2f, 0x1b, 0xf4, 0x83, 0x86, 0x1f, 0x2c, 0x34, 0x51, 0x69,
- 0x2b, 0x06, 0xbc, 0x15, 0xe8, 0xb3, 0x4e, 0x0d, 0x73, 0x34, 0x05, 0xb3,
- 0x35, 0x53, 0x0e, 0x84, 0x2c, 0xfd, 0x44, 0x8d, 0x58, 0x86, 0xed, 0x44,
- 0x93, 0xf7, 0x92, 0xce, 0x42, 0xcd, 0x3d, 0x24, 0xd1, 0x4a, 0x6a, 0xbf,
- 0x74, 0x83, 0x7e, 0x34, 0xc0, 0xdf, 0x1e, 0xef, 0x3f, 0xe3, 0x13, 0x3d,
- 0x39, 0xbe, 0x78, 0xd3, 0x75, 0xe6, 0x55, 0x86, 0xa0, 0xf8, 0xbf, 0xc3,
- 0x2c, 0xad, 0xae, 0x8c, 0x71, 0x41, 0x50, 0x49, 0x43, 0xea, 0xbf, 0x31,
- 0xdc, 0xdf, 0x8f, 0xe5, 0x6d, 0xfc, 0x8a, 0xf0, 0x10, 0x47, 0x8f, 0xda,
- 0x21, 0x3d, 0x52, 0xe9, 0x87, 0xb4, 0xdd, 0xfd, 0x48, 0xbe, 0x6d, 0xf2,
- 0x4a, 0x55, 0x77, 0x96, 0xc7, 0x5b, 0x01, 0xfb, 0x2c, 0xb1, 0x90, 0xd0,
- 0x49, 0x17, 0x08, 0xd3, 0x33, 0xb1, 0xbb, 0xea, 0x8d, 0xcd, 0x4e, 0x32,
- 0x62, 0x1e, 0x32, 0xa9, 0xb9, 0xdb, 0x4d, 0xb8, 0x8f, 0x24, 0xb7, 0x7b,
- 0x6b, 0xc0, 0x00, 0x60, 0x41, 0x44, 0x0b, 0xe7, 0x6b, 0xa9, 0x1d, 0xac,
- 0x32, 0x82, 0x5c, 0x63, 0xb5, 0x4f, 0xda, 0x66, 0xdd, 0x0f, 0x1b, 0x87,
- 0x2d, 0xa8, 0xa6, 0x2b, 0x29, 0x22, 0xe5, 0x7f, 0x93, 0x28, 0x6e, 0xe5,
- 0xcf, 0x1e, 0x3e, 0x8e, 0x6c, 0x1c, 0x04, 0xf6, 0xcf, 0xdc, 0x38, 0xa7,
- 0x1c, 0xb1, 0xff, 0x0e, 0x06, 0xaf, 0x2d, 0x75, 0x8b, 0x64, 0x6a, 0x6b,
- 0x5b, 0xe7, 0x9f, 0xbc, 0x16, 0xda, 0xed, 0xd1, 0x26, 0xf0, 0x49, 0xf7,
- 0xd6, 0xcf, 0x5c, 0xcb, 0xc0, 0x75, 0x3e, 0x21, 0xe9, 0xb1, 0x94, 0xc6,
- 0x6e, 0xf0, 0x33, 0x20, 0xa0, 0xd9, 0x05, 0x86, 0xc9, 0x56, 0x19, 0x16,
- 0xef, 0xe7, 0x2d, 0x78, 0xc4, 0x6d, 0x6d, 0x54, 0xb2, 0x15, 0xb5, 0x20,
- 0xd2, 0x08, 0xd1, 0x7c, 0x45, 0x88, 0x1f, 0x75, 0xd4, 0xcf, 0x22, 0x66,
- 0x3e, 0xfb, 0x11, 0xb0, 0x99, 0xea, 0x92, 0x1d, 0x88, 0x18, 0x93, 0xd7,
- 0x75, 0x8f, 0x95, 0x67, 0x05, 0x4a, 0xe3, 0x75, 0xba, 0x20, 0x73, 0x1d,
- 0x63, 0xd8, 0xc3, 0x2a, 0x5d, 0x65, 0x3d, 0x0f, 0x5e, 0xf6, 0x88, 0x7f,
- 0x7f, 0x1e, 0x85, 0x7d, 0x9f, 0x13, 0x1e, 0x55, 0x99, 0xfd, 0xf6, 0xfd,
- 0x9b, 0xbf, 0xa8, 0xdd, 0xbd, 0x3b, 0xe8, 0xb1, 0x84, 0x3b, 0xd3, 0x9d,
- 0x64, 0x5e, 0x22, 0xa0, 0x40, 0x40, 0xb4, 0x76, 0x9d, 0xff, 0xe5, 0xb2,
- 0x2c, 0x83, 0xa0, 0x02, 0x92, 0x3e, 0x76, 0x28, 0xcc, 0x66, 0x9e, 0x1b,
- 0x8b, 0x49, 0x77, 0x34, 0x7a, 0x0c, 0x7f, 0xc8, 0x9b, 0x57, 0x8f, 0x8f,
- 0x0e, 0x0f, 0x8c, 0xd5, 0xba, 0xd3, 0xe1, 0x16, 0xbb, 0x9f, 0x3d, 0x68,
- 0xb7, 0xed, 0x79, 0x67, 0xb7, 0x2b, 0xa2, 0xbd, 0x9d, 0xe3, 0xef, 0xcf,
- 0xdf, 0x05, 0x6b, 0x34, 0x6b, 0x0a, 0x02, 0xa9, 0x7d, 0x6b, 0x74, 0xba,
- 0x40, 0x6b, 0x7c, 0xcd, 0x3f, 0x46, 0xc3, 0xea, 0x48, 0xa8, 0xf2, 0x4d,
- 0x95, 0x93, 0x8e, 0xbb, 0x45, 0x5b, 0xb2, 0x75, 0x5a, 0x16, 0x33, 0x23,
- 0xfa, 0xcf, 0x08, 0xa2, 0x2f, 0xdb, 0x32, 0xba, 0xfa, 0xbd, 0xab, 0xeb,
- 0xbf, 0x26, 0x6f, 0x07, 0xb8, 0x2a, 0x45, 0x98, 0xe1, 0xf2, 0x16, 0x3f,
- 0x04, 0x22, 0x32, 0x81, 0x9b, 0x70, 0x8d, 0xc9, 0xfa, 0x32, 0x63, 0xf7,
- 0x2e, 0x99, 0x66, 0xed, 0xdb, 0x76, 0x8b, 0x86, 0x44, 0xf0, 0xf8, 0xbc,
- 0x80, 0x43, 0xbb, 0x2f, 0x16, 0xc2, 0xdc, 0x52, 0xa3, 0x21, 0xec, 0x23,
- 0xda, 0x51, 0xb7, 0xfe, 0xae, 0xd7, 0xd1, 0x1d, 0xe0, 0x9d, 0x1c, 0xeb,
- 0x20, 0xbd, 0x2d, 0xc2, 0x73, 0xf1, 0x98, 0xb3, 0x2b, 0xf2, 0x76, 0x4a,
- 0x3c, 0x6e, 0x22, 0xc0, 0x20, 0x06, 0x6d, 0xec, 0xc2, 0x98, 0x0f, 0x1c,
- 0x19, 0x04, 0xe8, 0xb8, 0x97, 0x16, 0x6d, 0x9c, 0x57, 0x02, 0x33, 0x60,
- 0xeb, 0x27, 0xbb, 0x45, 0x13, 0x55, 0xa3, 0x22, 0x3e, 0x39, 0x0a, 0xe5,
- 0x91, 0x2c, 0x45, 0xe0, 0x5d, 0xc4, 0xcd, 0x64, 0xa1, 0xa8, 0xdf, 0x38,
- 0xb5, 0x77, 0x10, 0x8d, 0x43, 0xc4, 0x42, 0x52, 0x1c, 0x95, 0x10, 0xeb,
- 0xac, 0x13, 0x97, 0xf0, 0xe3, 0x10, 0xb8, 0x29, 0x14, 0x89, 0x90, 0x28,
- 0x43, 0x68, 0xa8, 0x78, 0x91, 0x89, 0xfe, 0xd0, 0xc4, 0x86, 0x60, 0x44,
- 0xd7, 0x04, 0xb5, 0xa1, 0x89, 0x16, 0xf1, 0x3d, 0xfe, 0x3c, 0x42, 0x7c,
- 0xef, 0xce, 0x2e, 0x8e, 0x9f, 0x0b, 0xc4, 0x97, 0x62, 0xe1, 0xa8, 0x99,
- 0xc0, 0x89, 0x69, 0xdc, 0xc8, 0x9d, 0x6b, 0x0e, 0x49, 0xc8, 0xea, 0xa9,
- 0x0f, 0x62, 0x57, 0x1e, 0x39, 0xe2, 0x74, 0x4d, 0xd8, 0xcb, 0xdb, 0xf4,
- 0x22, 0xe4, 0xa2, 0xd4, 0x5f, 0x2c, 0x03, 0xa6, 0x27, 0x3a, 0xff, 0x10,
- 0x19, 0x05, 0xf0, 0x19, 0x40, 0xa4, 0x60, 0x79, 0x1b, 0x90, 0x10, 0x8b,
- 0x32, 0x36, 0xb8, 0x6c, 0xc2, 0xe2, 0x94, 0xfa, 0xa9, 0x86, 0x4d, 0x40,
- 0x11, 0xa1, 0x7b, 0x23, 0x8d, 0xe4, 0x61, 0x8f, 0x58, 0x98, 0xcd, 0x4d,
- 0x22, 0xce, 0x05, 0x12, 0xbb, 0x97, 0x4a, 0x8c, 0x33, 0xf2, 0x02, 0xfe,
- 0xa9, 0x17, 0xe6, 0xaa, 0xf1, 0xee, 0x93, 0xd2, 0x89, 0xb9, 0x47, 0x6a,
- 0xa5, 0x91, 0x55, 0x69, 0xcd, 0x14, 0xc1, 0xb0, 0x09, 0xc3, 0xd7, 0x60,
- 0x81, 0x6d, 0xb7, 0x88, 0x6a, 0x69, 0x03, 0xab, 0xae, 0x21, 0x71, 0x27,
- 0x43, 0x59, 0x16, 0x1b, 0xe0, 0xd0, 0x16, 0x7a, 0x90, 0x58, 0x7d, 0x8c,
- 0x01, 0x51, 0xaa, 0x49, 0xf4, 0x4d, 0x8d, 0xe0, 0xf6, 0x2b, 0x10, 0xa0,
- 0xf3, 0xc1, 0x9a, 0xcd, 0x19, 0xe8, 0xc1, 0x7c, 0xe4, 0xf1, 0x7e, 0x8f,
- 0x2d, 0xcb, 0x2a, 0xef, 0x38, 0x6b, 0x0b, 0x5a, 0xf3, 0xc6, 0xf0, 0xc0,
- 0x3a, 0x61, 0x73, 0x14, 0xb7, 0x0b, 0x9a, 0xdb, 0xaf, 0x17, 0x62, 0x5a,
- 0x0e, 0xe4, 0x8c, 0x36, 0xe6, 0x31, 0xbe, 0xd5, 0xb0, 0x2f, 0x3d, 0x94,
- 0x17, 0x9a, 0xa2, 0xc6, 0x9a, 0x12, 0x47, 0xf1, 0x14, 0xb4, 0xd6, 0xdc,
- 0xcc, 0x92, 0xa2, 0xe7, 0x2e, 0xf8, 0x1d, 0x1a, 0x73, 0xe4, 0xa4, 0x18,
- 0x25, 0x89, 0x8f, 0x40, 0xa6, 0x25, 0x47, 0x72, 0x30, 0xb4, 0xeb, 0xf0,
- 0xb7, 0x4d, 0xa8, 0x7e, 0x3f, 0xf9, 0x5b, 0x39, 0x11, 0x27, 0x0c, 0x59,
- 0x8e, 0x31, 0x24, 0x9f, 0x39, 0xf2, 0xe7, 0xd7, 0x86, 0xca, 0x66, 0x6b,
- 0xf6, 0xab, 0xd2, 0x84, 0x24, 0x13, 0x9b, 0x5b, 0x3f, 0x53, 0xc0, 0x23,
- 0xb9, 0x04, 0x8e, 0x26, 0xa7, 0x82, 0x6a, 0x21, 0x7a, 0x58, 0xed, 0x7c,
- 0xd8, 0x45, 0x6b, 0x49, 0xa7, 0xe4, 0x0d, 0x31, 0x83, 0x0b, 0x38, 0x02,
- 0x03, 0xee, 0xb9, 0x84, 0xf5, 0x74, 0xda, 0xac, 0x65, 0xe3, 0xbb, 0xb3,
- 0x2b, 0xd5, 0x4b, 0x6a, 0xde, 0x05, 0x0c, 0x3c, 0xb2, 0x90, 0xa6, 0x86,
- 0xf2, 0xd2, 0xe9, 0x9d, 0xea, 0x0b, 0x4e, 0xb8, 0x0a, 0xa0, 0xa3, 0x03,
- 0x8d, 0x0f, 0x6b, 0x3c, 0x75, 0x12, 0x14, 0xed, 0xcc, 0xeb, 0x9e, 0x6e,
- 0x2d, 0xbf, 0xa8, 0x9d, 0xe2, 0xf7, 0xdc, 0x62, 0xa7, 0xb3, 0x02, 0x4f,
- 0xb6, 0xae, 0x7a, 0xd6, 0xa4, 0xb4, 0xcb, 0x1b, 0x8b, 0xd1, 0x9d, 0x4b,
- 0xc0, 0x56, 0xd6, 0x20, 0x32, 0x88, 0x7a, 0x46, 0xaa, 0xb1, 0x41, 0x1c,
- 0x5c, 0x1b, 0x4e, 0x9d, 0x84, 0x7a, 0xc4, 0x5b, 0xf9, 0x0a, 0xf3, 0xc3,
- 0x1d, 0x30, 0x2b, 0x57, 0x51, 0x4a, 0xc3, 0x3c, 0xe2, 0x8c, 0xb1, 0xe4,
- 0xf1, 0xe7, 0x8f, 0x1f, 0xed, 0x6a, 0xf3, 0x62, 0xcd, 0x42, 0xdc, 0x8d,
- 0x75, 0x00, 0xc4, 0x8d, 0x93, 0x9e, 0x0a, 0xd0, 0x6b, 0x72, 0xea, 0x91,
- 0xc9, 0x68, 0x1d, 0xe2, 0xd8, 0xcc, 0xb9, 0x69, 0x16, 0xb9, 0xd8, 0xd1,
- 0x7e, 0x8e, 0x99, 0x72, 0x90, 0x3f, 0x40, 0x1f, 0xcb, 0xf8, 0xe5, 0x1d,
- 0x70, 0xf8, 0xb4, 0x76, 0xcc, 0xdb, 0x55, 0x06, 0x31, 0xb4, 0x3f, 0x94,
- 0x34, 0x4d, 0x7d, 0xdb, 0x45, 0xf9, 0x7a, 0xb4, 0xac, 0x9c, 0xd3, 0xcf,
- 0xa1, 0xa9, 0x8a, 0xea, 0x71, 0x45, 0x1d, 0xd9, 0x4b, 0x4f, 0x2e, 0xb0,
- 0x6f, 0x84, 0x6b, 0xbb, 0x58, 0xf0, 0xc4, 0x80, 0xaa, 0x81, 0x33, 0x51,
- 0x73, 0x86, 0x54, 0x7b, 0x1f, 0x19, 0xfa, 0x14, 0xe0, 0x0b, 0xf2, 0xbe,
- 0x24, 0x48, 0xc9, 0x99, 0x30, 0xe2, 0x6e, 0x20, 0x90, 0x97, 0xda, 0x1d,
- 0x8a, 0x55, 0x8f, 0xb2, 0x72, 0xa5, 0xb9, 0x1c, 0xa4, 0x61, 0x71, 0x89,
- 0x7c, 0xe1, 0x3e, 0xe0, 0x1d, 0x75, 0x83, 0xa4, 0x8a, 0x11, 0xd2, 0x9a,
- 0x59, 0x6f, 0x7d, 0x8b, 0x52, 0x9b, 0x42, 0xf1, 0x74, 0xcb, 0x5a, 0xf4,
- 0xef, 0x96, 0x2a, 0xc3, 0x8a, 0x36, 0xfe, 0x6a, 0x67, 0x23, 0x7a, 0x66,
- 0x0f, 0x4b, 0x8a, 0x71, 0xf3, 0xe0, 0x4b, 0x09, 0x9b, 0xc3, 0x2e, 0x92,
- 0x1d, 0x4c, 0x78, 0x6f, 0x6f, 0xf7, 0xfe, 0x49, 0xcb, 0x93, 0xf7, 0x4d,
- 0xf2, 0x9c, 0x1d, 0x1b, 0x5e, 0x3b, 0x89, 0xb9, 0x37, 0x07, 0xfa, 0xa6,
- 0x07, 0x97, 0x31, 0x60, 0x8a, 0x84, 0x83, 0xb9, 0x20, 0xcc, 0xd3, 0xf4,
- 0x2e, 0x74, 0xe2, 0x6b, 0x56, 0x1a, 0x2f, 0xb0, 0xbd, 0x76, 0xad, 0x47,
- 0x06, 0x9c, 0x9f, 0xb0, 0x10, 0x4a, 0x8d, 0x02, 0xbe, 0xda, 0x4b, 0x43,
- 0x84, 0xa1, 0xbe, 0xe9, 0xa6, 0xe5, 0x2d, 0x0e, 0x26, 0x6e, 0x3e, 0x48,
- 0x3c, 0x37, 0x3b, 0xdf, 0x42, 0xf5, 0x41, 0xb0, 0x3b, 0x3e, 0x52, 0x1b,
- 0xa1, 0x4f, 0xdb, 0x0c, 0x4b, 0xee, 0xa4, 0x3e, 0x0a, 0x10, 0x91, 0xf9,
- 0x49, 0xd7, 0xcd, 0x3b, 0xd2, 0x4b, 0xc1, 0x77, 0x91, 0xca, 0x80, 0x86,
- 0xa3, 0x7e, 0x72, 0x6b, 0x66, 0x3c, 0x62, 0xee, 0xd8, 0x2e, 0x0d, 0xf9,
- 0x74, 0x30, 0x9a, 0x6e, 0xc0, 0x78, 0x31, 0x37, 0x4b, 0xdf, 0xd8, 0x31,
- 0x06, 0xe3, 0x99, 0xf0, 0x4f, 0x5b, 0x9b, 0x39, 0xe0, 0x3b, 0x0a, 0x18,
- 0x9c, 0x98, 0xae, 0x8e, 0xae, 0x89, 0x21, 0x92, 0x83, 0xdd, 0xc3, 0x8d,
- 0x29, 0x78, 0x36, 0x07, 0x0f, 0x7e, 0x5e, 0xc9, 0xc2, 0x0b, 0xe5, 0xac,
- 0xfa, 0xda, 0x74, 0xd0, 0xb6, 0xaf, 0xe1, 0x69, 0xdb, 0xd7, 0x60, 0x41,
- 0x29, 0xe2, 0x1a, 0x1a, 0x27, 0x5f, 0xd6, 0xc9, 0x3b, 0x7d, 0x2c, 0xd9,
- 0x19, 0x9f, 0xbf, 0x3b, 0xfe, 0xea, 0x6c, 0xf7, 0x3e, 0x1f, 0x65, 0x9b,
- 0xff, 0xdb, 0x75, 0xa5, 0x9a, 0x25, 0x2c, 0xd3, 0x87, 0x75, 0xf2, 0xd5,
- 0x78, 0x3c, 0x7c, 0x79, 0x7e, 0x82, 0x2e, 0x97, 0x63, 0xf3, 0x67, 0x0f,
- 0x16, 0xfb, 0x08, 0xad, 0x00, 0x86, 0xdf, 0x4a, 0xed, 0x68, 0xad, 0x49,
- 0x82, 0xf0, 0x00, 0xd2, 0x61, 0x0a, 0x7a, 0x22, 0xef, 0x91, 0x85, 0xf6,
- 0xc0, 0xf0, 0x5d, 0x93, 0xe7, 0xfc, 0x64, 0x0f, 0x9f, 0xa2, 0x4f, 0x62,
- 0x41, 0x3d, 0xee, 0x83, 0x75, 0xd8, 0xe0, 0x92, 0x34, 0x1f, 0xa4, 0x98,
- 0x82, 0x41, 0x6b, 0x32, 0xb8, 0xb1, 0xfc, 0x48, 0x9c, 0xb8, 0x80, 0x5d,
- 0xbc, 0xf4, 0x86, 0x5c, 0x61, 0x54, 0x5b, 0xa1, 0xa0, 0xa9, 0x1d, 0xd7,
- 0x1b, 0x4c, 0x34, 0x86, 0xc6, 0x5b, 0x10, 0xfc, 0xc8, 0x58, 0xa3, 0xab,
- 0x5d, 0xa7, 0xc8, 0xf6, 0x70, 0x9d, 0x24, 0xcf, 0xb7, 0xa5, 0x71, 0x7c,
- 0x51, 0xae, 0x2f, 0xaf, 0xd8, 0xc0, 0x6a, 0xfb, 0x21, 0xc0, 0xcb, 0x35,
- 0xfa, 0x6a, 0x7b, 0x37, 0x98, 0x49, 0x06, 0x24, 0x88, 0x77, 0x54, 0xef,
- 0xa9, 0x32, 0x0a, 0x0e, 0xb1, 0x7a, 0xc3, 0x49, 0x17, 0xb3, 0xdf, 0x04,
- 0x03, 0x7d, 0x83, 0x06, 0x32, 0xe1, 0xc0, 0x29, 0xdc, 0x68, 0x45, 0xb3,
- 0x58, 0xca, 0x5f, 0xd3, 0xe2, 0x0e, 0xee, 0x52, 0xf1, 0xdf, 0xa3, 0xfe,
- 0xd3, 0xd2, 0x74, 0x9b, 0xd0, 0x9b, 0x6a, 0x0a, 0x43, 0x9f, 0x53, 0x50,
- 0xb9, 0xf0, 0x73, 0x13, 0xcd, 0xa2, 0xa7, 0xfd, 0xd2, 0x88, 0x69, 0x98,
- 0x76, 0xc3, 0x62, 0xa0, 0xa3, 0x0c, 0x8c, 0x39, 0x2c, 0x61, 0x32, 0x51,
- 0x84, 0x85, 0x08, 0x22, 0xac, 0x08, 0x2d, 0x20, 0x77, 0xd2, 0x49, 0x5d,
- 0x2e, 0xd6, 0x0d, 0x74, 0x01, 0x72, 0x8a, 0x52, 0x71, 0xcd, 0x2e, 0x48,
- 0x57, 0xc2, 0x97, 0x66, 0xd4, 0xc4, 0x4b, 0x40, 0x4d, 0x62, 0x75, 0x00,
- 0xae, 0x3d, 0xe9, 0xc8, 0x85, 0x00, 0x38, 0x8a, 0x28, 0xfe, 0x09, 0xda,
- 0x59, 0x1e, 0x0b, 0x43, 0xad, 0x90, 0x96, 0x74, 0xad, 0x60, 0x6f, 0xe1,
- 0xf9, 0xe9, 0x59, 0xb5, 0x76, 0x47, 0xbd, 0xeb, 0xc4, 0xba, 0x5b, 0x89,
- 0xea, 0x4e, 0x6b, 0x8c, 0x71, 0xb6, 0xde, 0x4c, 0x65, 0xcd, 0x16, 0x98,
- 0xd0, 0x2d, 0x99, 0xdc, 0xd9, 0x8f, 0xf1, 0x77, 0x52, 0xe4, 0xf2, 0x58,
- 0x45, 0xf8, 0xa1, 0xd0, 0x4a, 0xee, 0x30, 0x46, 0x9b, 0x92, 0x51, 0xda,
- 0x5f, 0xea, 0x0c, 0xfd, 0x6d, 0xc6, 0x79, 0x67, 0x7c, 0xc4, 0x38, 0x8d,
- 0xd6, 0x21, 0xb3, 0x96, 0xdf, 0x6d, 0x6a, 0x47, 0x1b, 0x31, 0xc2, 0x13,
- 0x01, 0x01, 0x53, 0x28, 0xdd, 0xae, 0x4a, 0xd5, 0x23, 0xf2, 0xb7, 0xa5,
- 0xdc, 0x4e, 0x93, 0x5f, 0xf6, 0xbe, 0x61, 0x4b, 0x81, 0xca, 0xcd, 0x1d,
- 0x6f, 0xdd, 0xe9, 0x8c, 0x1e, 0xb0, 0x21, 0x6e, 0xfd, 0xee, 0x87, 0x81,
- 0x65, 0x67, 0xe3, 0xc5, 0x35, 0x20, 0x29, 0xed, 0xa2, 0x0c, 0xe7, 0xff,
- 0x28, 0x7f, 0xa1, 0x3b, 0xf0, 0x5d, 0x5e, 0x18, 0xcd, 0xb0, 0xde, 0x55,
- 0xe2, 0xcc, 0x8b, 0x18, 0x8c, 0x02, 0xf1, 0x8e, 0xed, 0xda, 0x58, 0x62,
- 0x86, 0xe3, 0xb8, 0x44, 0x3d, 0x52, 0x9c, 0x39, 0x60, 0x13, 0xb0, 0x22,
- 0xaf, 0xb1, 0xe9, 0xdd, 0x2a, 0xa8, 0x9f, 0x99, 0x5a, 0xa6, 0x83, 0x31,
- 0x00, 0x5e, 0x6c, 0xcc, 0x82, 0x22, 0xbf, 0x1d, 0xd9, 0xe0, 0xbe, 0x45,
- 0x5f, 0xf3, 0x83, 0x9b, 0x86, 0x11, 0x46, 0x7a, 0xda, 0x83, 0xb3, 0x75,
- 0x43, 0x58, 0xb4, 0xbb, 0x58, 0xe7, 0xce, 0xe3, 0xdd, 0x64, 0xde, 0xac,
- 0x76, 0x0e, 0x76, 0x19, 0xc3, 0x5e, 0x7a, 0xa9, 0x97, 0x4e, 0xdc, 0x87,
- 0x5e, 0x1c, 0xca, 0x2d, 0x4c, 0x5e, 0xd9, 0xcf, 0x22, 0xb8, 0x49, 0x70,
- 0x6e, 0xa8, 0xe2, 0x9b, 0xcb, 0x0d, 0xe6, 0x0d, 0xb3, 0x0d, 0x98, 0x91,
- 0xc6, 0x1c, 0xd9, 0x3b, 0xae, 0xc5, 0x5f, 0x11, 0xb2, 0x2b, 0x2a, 0x1b,
- 0x8d, 0x05, 0xe1, 0xba, 0xe0, 0x4a, 0x2f, 0x30, 0x29, 0x7d, 0x36, 0x3b,
- 0xb7, 0x98, 0x0d, 0x89, 0x87, 0x5c, 0x56, 0xa5, 0x11, 0x91, 0x55, 0x04,
- 0xff, 0x52, 0x6c, 0x8a, 0x0b, 0x54, 0xdf, 0x5c, 0xe7, 0x55, 0x59, 0x00,
- 0x62, 0xf4, 0x3a, 0xad, 0x72, 0x84, 0xf9, 0xb7, 0xbe, 0x3e, 0x7b, 0x7b,
- 0xbc, 0xe5, 0x3b, 0x45, 0xe6, 0xb9, 0xf8, 0xd1, 0x71, 0x7e, 0x5d, 0x2f,
- 0xb5, 0x9e, 0x66, 0xcc, 0x69, 0x68, 0x44, 0xfa, 0x94, 0xd5, 0x3e, 0x00,
- 0x31, 0x00, 0x2a, 0x2e, 0xb3, 0x11, 0x72, 0xa3, 0x4a, 0x4a, 0x12, 0x80,
- 0xf4, 0x55, 0x54, 0x0a, 0x43, 0x12, 0x50, 0xac, 0xfb, 0x8d, 0x9a, 0x86,
- 0xe8, 0x80, 0x53, 0xfa, 0x9d, 0xfd, 0x12, 0xaf, 0xfb, 0x1f, 0xa9, 0xf9,
- 0xda, 0x16, 0xc5, 0xb9, 0xd8, 0xbb, 0xe2, 0x71, 0x79, 0x47, 0x96, 0xcd,
- 0x76, 0x5b, 0x00, 0x6e, 0xd7, 0x64, 0x8c, 0x37, 0xdb, 0xba, 0xbd, 0x48,
- 0x17, 0x75, 0x3c, 0x3e, 0xec, 0xb8, 0xdc, 0xf3, 0x75, 0xa6, 0x6a, 0xfe,
- 0x84, 0x1b, 0x9d, 0x07, 0x77, 0xb7, 0xef, 0x39, 0xdf, 0xbe, 0xdb, 0xe6,
- 0x5e, 0x7c, 0xa4, 0xd4, 0x15, 0x88, 0xb5, 0x9b, 0x35, 0xb7, 0xa3, 0xf4,
- 0xd4, 0x63, 0x22, 0xf4, 0x2a, 0x9a, 0xcf, 0x97, 0x53, 0x86, 0x15, 0xb3,
- 0x71, 0xd5, 0x0e, 0xe0, 0xb3, 0x6a, 0x49, 0x85, 0xd7, 0xb6, 0x15, 0xa3,
- 0xf5, 0x02, 0x8e, 0x1a, 0xc1, 0x8d, 0x34, 0x2a, 0xc5, 0x5d, 0xcc, 0x2b,
- 0xc2, 0xf0, 0x71, 0x51, 0x64, 0xf9, 0xd2, 0xc0, 0xaf, 0xa6, 0xee, 0x83,
- 0x20, 0x76, 0xc9, 0x28, 0x56, 0x2f, 0x61, 0x0c, 0x5e, 0x46, 0x71, 0xb5,
- 0xf8, 0x6f, 0x8a, 0x64, 0x1b, 0xea, 0xc7, 0x76, 0x27, 0xd5, 0xb1, 0x8d,
- 0x8a, 0x25, 0xf3, 0x37, 0x36, 0x67, 0x6c, 0xc4, 0x9f, 0x51, 0x3a, 0xa0,
- 0x70, 0x50, 0xfb, 0x91, 0x14, 0x59, 0x36, 0x59, 0x1c, 0xb4, 0xcd, 0xde,
- 0x47, 0xb3, 0x34, 0x69, 0xa4, 0x50, 0xaf, 0xab, 0x6b, 0x54, 0xbd, 0x4a,
- 0xff, 0x2d, 0x4e, 0x0d, 0x76, 0xe7, 0x21, 0xe7, 0x10, 0x91, 0xf2, 0xde,
- 0x0c, 0x29, 0x6d, 0xb3, 0x12, 0x64, 0xac, 0xe4, 0x2b, 0x9e, 0x85, 0x9d,
- 0xa0, 0xb5, 0x74, 0x08, 0x00, 0x85, 0xb5, 0xd8, 0x20, 0x49, 0xbf, 0xac,
- 0x81, 0x9b, 0xdb, 0x54, 0xe9, 0xd4, 0xfd, 0x65, 0x98, 0xd6, 0xd3, 0x3c,
- 0xd7, 0x7e, 0x4e, 0x14, 0x1f, 0xcc, 0x28, 0x1d, 0x36, 0x8a, 0x8f, 0xe3,
- 0xce, 0xc3, 0x76, 0x52, 0x99, 0x95, 0xec, 0xde, 0xe5, 0x9c, 0x93, 0x94,
- 0x5b, 0xfd, 0x51, 0x06, 0x0b, 0x4a, 0xe3, 0x24, 0x78, 0x18, 0x6b, 0x71,
- 0xa5, 0x95, 0x36, 0x3d, 0xa6, 0xad, 0xb1, 0xbe, 0x0f, 0x7c, 0xf3, 0x5b,
- 0x37, 0x61, 0x48, 0x28, 0x55, 0x75, 0xc3, 0xa6, 0xe4, 0xcd, 0xcd, 0xa1,
- 0xff, 0xcc, 0xa6, 0x68, 0x78, 0x07, 0x14, 0xa9, 0x28, 0x87, 0xe9, 0x62,
- 0x15, 0x4d, 0x71, 0x1b, 0xef, 0xb6, 0x1a, 0x5e, 0xbe, 0x3c, 0x3d, 0x7f,
- 0x07, 0xbc, 0x3c, 0x42, 0x4e, 0x2f, 0x6a, 0xce, 0x52, 0xa0, 0x9f, 0x51,
- 0x02, 0x7b, 0xc1, 0xb0, 0x92, 0x48, 0x1a, 0x99, 0x85, 0xe5, 0xd5, 0x68,
- 0x0e, 0x01, 0xf3, 0x21, 0x66, 0x5f, 0x71, 0x7a, 0x5b, 0x91, 0x78, 0x05,
- 0x8e, 0xcc, 0xe0, 0xd5, 0xbe, 0xe8, 0x2e, 0xc7, 0x7c, 0xd5, 0x7d, 0x5b,
- 0xbb, 0x2c, 0xd8, 0x42, 0xa4, 0xf6, 0xbb, 0x16, 0x30, 0xb0, 0x4c, 0x04,
- 0x1e, 0x30, 0xe0, 0xe7, 0x4d, 0x66, 0xb1, 0x09, 0xc5, 0xae, 0xb3, 0x58,
- 0xa8, 0xda, 0xc1, 0x8a, 0x93, 0x34, 0x00, 0x5c, 0xa1, 0xf5, 0xf1, 0xf5,
- 0x66, 0x44, 0x03, 0xb3, 0xb1, 0xc5, 0xaa, 0xe8, 0xe2, 0x6d, 0xc9, 0x76,
- 0x47, 0x8d, 0xd0, 0x00, 0xfc, 0x6d, 0x63, 0x5d, 0x98, 0x4e, 0x95, 0x1a,
- 0x67, 0x6d, 0x38, 0xe0, 0x77, 0x03, 0xfe, 0xea, 0x64, 0x4d, 0x1c, 0xa2,
- 0xf3, 0x05, 0x39, 0x5e, 0x56, 0x9a, 0xf8, 0x09, 0xfa, 0x9e, 0xb8, 0xbf,
- 0x18, 0x49, 0x89, 0x6a, 0x38, 0xb3, 0x74, 0x69, 0xd4, 0x82, 0x42, 0x0b,
- 0x05, 0xc8, 0xf3, 0x4b, 0xf9, 0x9c, 0xdd, 0x09, 0xaf, 0x53, 0xe1, 0x58,
- 0x0a, 0x67, 0x0f, 0x2e, 0xd0, 0xa9, 0x1f, 0xe0, 0xcf, 0x10, 0x27, 0xf5,
- 0x87, 0x8f, 0xd5, 0x84, 0xe1, 0x75, 0x8b, 0x7b, 0x20, 0x71, 0x1b, 0x6d,
- 0xfd, 0xc9, 0xc0, 0xe1, 0x3c, 0x84, 0xed, 0xfe, 0x4d, 0x9d, 0xab, 0xae,
- 0xd6, 0xc5, 0x27, 0x33, 0x85, 0xb0, 0x1c, 0x5a, 0x93, 0x7d, 0xa9, 0xf9,
- 0x05, 0xb7, 0xcc, 0xa5, 0xbf, 0x70, 0xff, 0x65, 0x3b, 0x02, 0x61, 0x96,
- 0x5f, 0x93, 0x23, 0x4f, 0x40, 0xbc, 0x3d, 0xe5, 0x34, 0x36, 0xbb, 0x99,
- 0xbd, 0x1f, 0x66, 0x56, 0x76, 0x03, 0xa3, 0xe9, 0xec, 0x7a, 0xd2, 0xae,
- 0xd9, 0xbc, 0xa1, 0x46, 0x4f, 0xa4, 0x48, 0x14, 0x5b, 0x01, 0xa4, 0x50,
- 0x91, 0xa4, 0xa9, 0x5e, 0x01, 0x3b, 0x5c, 0x83, 0xec, 0xc9, 0x64, 0xc3,
- 0x37, 0x81, 0xdd, 0xe2, 0x75, 0x9f, 0x8a, 0xcc, 0xa4, 0x5d, 0x9b, 0xdf,
- 0x47, 0x07, 0xac, 0xa4, 0xc0, 0x91, 0x65, 0x88, 0xc0, 0x95, 0xf2, 0x4b,
- 0x26, 0x8a, 0xd5, 0xd9, 0xa8, 0x2f, 0xac, 0xdf, 0x98, 0x32, 0xc2, 0xb7,
- 0x5c, 0x29, 0x57, 0x56, 0x58, 0x22, 0x5b, 0x46, 0x81, 0x67, 0x7f, 0xf5,
- 0x5d, 0x72, 0x0b, 0xf1, 0x36, 0xca, 0xfe, 0xb0, 0xb3, 0x49, 0xc5, 0x83,
- 0xb8, 0xe1, 0xbb, 0x90, 0x19, 0xbe, 0x6b, 0xf3, 0x42, 0xb7, 0xd2, 0xa0,
- 0x8e, 0x3a, 0x72, 0xa3, 0xef, 0xe5, 0x81, 0x34, 0x3c, 0x25, 0xd8, 0x9f,
- 0xbf, 0x0b, 0xab, 0xbc, 0xc5, 0xfd, 0x37, 0x41, 0x7d, 0xf6, 0x7d, 0x5c,
- 0xd0, 0x9a, 0xee, 0xf2, 0xb3, 0x1e, 0xd7, 0xd6, 0xcf, 0x67, 0x81, 0x6a,
- 0x51, 0x09, 0xab, 0x0b, 0x39, 0x60, 0x11, 0x30, 0x40, 0xa1, 0xbb, 0x5f,
- 0x87, 0x05, 0xd2, 0x27, 0x8d, 0x95, 0x7d, 0x49, 0x59, 0x29, 0xe4, 0x06,
- 0x0c, 0xd8, 0xe0, 0x99, 0xf5, 0x1b, 0x71, 0xad, 0x8d, 0xed, 0xb2, 0xa6,
- 0x6f, 0x25, 0x78, 0x4b, 0xd9, 0x8d, 0xe2, 0xe4, 0x2e, 0xd7, 0x88, 0xa6,
- 0x05, 0x29, 0x90, 0x8e, 0xf2, 0x53, 0x46, 0xf9, 0xa0, 0x3a, 0xf7, 0xb4,
- 0x2a, 0x38, 0x3f, 0x66, 0xe6, 0xe7, 0xe1, 0x19, 0x66, 0x6a, 0xaf, 0x16,
- 0x43, 0xce, 0x0d, 0xeb, 0xd0, 0x6f, 0x54, 0xe7, 0xa8, 0x87, 0x8d, 0x9a,
- 0xb0, 0xae, 0xa3, 0x9a, 0xd6, 0x0b, 0x6d, 0xb8, 0x37, 0xfe, 0xb5, 0x11,
- 0xef, 0x46, 0xff, 0xa5, 0x69, 0x6f, 0x19, 0xdf, 0x1c, 0x4b, 0xfe, 0x9d,
- 0x9d, 0x01, 0x4c, 0xc1, 0x03, 0xb1, 0xe8, 0x98, 0x20, 0xea, 0x81, 0x5d,
- 0x58, 0x1b, 0xb4, 0xf1, 0x69, 0x70, 0x76, 0x42, 0x6c, 0xf9, 0x2c, 0x8a,
- 0xbe, 0xa1, 0x97, 0x52, 0x1a, 0xfa, 0x4a, 0xac, 0x89, 0xae, 0x91, 0xc2,
- 0xfe, 0x9c, 0xbc, 0x36, 0x0b, 0x25, 0x2b, 0x83, 0xda, 0xbb, 0xff, 0x19,
- 0x0a, 0x4a, 0xec, 0x5a, 0xa2, 0x3b, 0x80, 0x8d, 0xc7, 0xc3, 0x37, 0x43,
- 0xd8, 0xa6, 0x3e, 0x26, 0x1b, 0x81, 0x34, 0x8e, 0x3c, 0x3e, 0xc5, 0xb9,
- 0x12, 0xd2, 0x3d, 0x28, 0xee, 0x4a, 0x22, 0x53, 0x00, 0x75, 0xd2, 0x57,
- 0x6b, 0x43, 0xa9, 0xa4, 0xa6, 0x70, 0xb7, 0x2f, 0xce, 0xab, 0x2d, 0xc9,
- 0x3c, 0x00, 0xbb, 0xa5, 0x09, 0x7b, 0x33, 0x0e, 0xa8, 0x80, 0x03, 0x10,
- 0x75, 0x66, 0x58, 0x28, 0xd7, 0x78, 0x4d, 0xaa, 0xf2, 0x53, 0xc6, 0xfc,
- 0x02, 0x46, 0x21, 0x50, 0xb3, 0x58, 0x07, 0x16, 0x3f, 0xba, 0x91, 0x50,
- 0xdc, 0xd0, 0x83, 0x72, 0x4d, 0x82, 0x80, 0x39, 0x77, 0x17, 0x15, 0xb8,
- 0x0d, 0x27, 0xc7, 0x72, 0xbc, 0x0e, 0xa0, 0x0b, 0xed, 0xc1, 0xc1, 0x57,
- 0x6d, 0x4a, 0x20, 0x7d, 0xbf, 0x21, 0xcf, 0xb6, 0xa7, 0xee, 0xf3, 0xec,
- 0xc8, 0x91, 0x3e, 0xbc, 0x69, 0xa8, 0xa1, 0x25, 0x38, 0x2f, 0x93, 0x17,
- 0xcc, 0x10, 0x6e, 0xef, 0x50, 0x02, 0xda, 0xf5, 0x50, 0xa2, 0xf9, 0xed,
- 0x50, 0xad, 0xc5, 0x99, 0xad, 0x1d, 0x9c, 0x4b, 0x4d, 0x0d, 0xd7, 0xa4,
- 0xcc, 0x1c, 0x74, 0xaf, 0xb4, 0xbf, 0x00, 0xd4, 0x48, 0x08, 0x86, 0x4b,
- 0x2e, 0x4e, 0xeb, 0x7a, 0xe3, 0xf2, 0x65, 0x98, 0x4f, 0x74, 0x3a, 0xc0,
- 0x5b, 0xca, 0x6b, 0x67, 0x1f, 0xfc, 0x57, 0xca, 0xe0, 0x36, 0xc6, 0x48,
- 0x43, 0x29, 0x7c, 0xfc, 0xa5, 0xc0, 0x5c, 0xe0, 0x46, 0x90, 0xb6, 0xc6,
- 0x87, 0x0b, 0xf4, 0x2d, 0x9e, 0x10, 0x41, 0xc7, 0xfb, 0x5a, 0x1d, 0x77,
- 0xe6, 0x48, 0x8e, 0xc9, 0xd2, 0x8c, 0x18, 0xf1, 0x8a, 0x9e, 0x82, 0x35,
- 0xe6, 0x82, 0xea, 0xcf, 0xd9, 0x76, 0xe2, 0x11, 0x49, 0x35, 0x8d, 0x4e,
- 0x71, 0x49, 0x2d, 0xcc, 0x61, 0xc4, 0xd3, 0x42, 0x33, 0x92, 0x64, 0x35,
- 0x6d, 0x56, 0xab, 0x3f, 0xb2, 0x3d, 0x20, 0x5b, 0xb9, 0x4e, 0xb0, 0x2e,
- 0x61, 0xd6, 0xdc, 0x44, 0xda, 0x38, 0x62, 0x36, 0x89, 0x7b, 0x68, 0xe0,
- 0xfd, 0xfd, 0xf9, 0xe7, 0xfb, 0x03, 0x31, 0x47, 0x29, 0x40, 0xe9, 0x3f,
- 0x03, 0x40, 0xe1, 0x88, 0x06, 0x48, 0xcf, 0x99, 0x9f, 0xda, 0x47, 0x7b,
- 0xd0, 0xf3, 0x29, 0x55, 0xe9, 0x88, 0xf2, 0x14, 0xda, 0xce, 0x6a, 0xe7,
- 0x09, 0x6c, 0x7a, 0x3c, 0x3f, 0x75, 0x2c, 0x53, 0x77, 0xe6, 0x29, 0x0d,
- 0x72, 0x18, 0x27, 0x12, 0xe1, 0xde, 0x46, 0xaf, 0xc8, 0xa8, 0x0f, 0x89,
- 0x5e, 0x8b, 0xf8, 0x9d, 0x38, 0xf9, 0x50, 0xc8, 0xcd, 0xf6, 0xf0, 0x44,
- 0x07, 0x33, 0x26, 0x6d, 0x9c, 0xa3, 0xb9, 0x30, 0x5b, 0x68, 0x40, 0xa4,
- 0x53, 0x36, 0x7b, 0xbf, 0xf1, 0x9e, 0x3c, 0x1b, 0x3d, 0x6a, 0xdd, 0x93,
- 0x66, 0xb1, 0x1c, 0xde, 0x4c, 0xee, 0x09, 0x57, 0x5d, 0x9c, 0xbe, 0x45,
- 0xba, 0x8e, 0xb2, 0x1b, 0x74, 0xd1, 0xd1, 0xc8, 0x01, 0xc9, 0x2a, 0x76,
- 0xef, 0x12, 0xba, 0x3a, 0x26, 0x12, 0xb1, 0xe9, 0x3b, 0x91, 0x19, 0x5b,
- 0xed, 0x2b, 0x8e, 0x1a, 0x01, 0x2b, 0x4c, 0x68, 0x44, 0x44, 0x20, 0xa8,
- 0x5a, 0x7f, 0x91, 0x47, 0x8b, 0xb2, 0x34, 0x2b, 0x3a, 0xbb, 0xcd, 0xa6,
- 0x6b, 0xa4, 0x16, 0x90, 0x62, 0x4f, 0xf8, 0x5f, 0x9b, 0x63, 0x1e, 0x5e,
- 0x9c, 0x43, 0x22, 0x1b, 0xe6, 0x07, 0xdd, 0xcd, 0x70, 0xad, 0xd4, 0x64,
- 0xf1, 0xbc, 0xfa, 0xc0, 0xe3, 0xc9, 0xe0, 0x04, 0xf8, 0x5d, 0xfb, 0x57,
- 0x41, 0x78, 0x1f, 0xb5, 0x18, 0xa4, 0xcc, 0x18, 0x7a, 0xca, 0x2f, 0x0b,
- 0x56, 0x17, 0xdf, 0xe6, 0xd3, 0xaa, 0xac, 0xcb, 0x39, 0x67, 0x19, 0x7a,
- 0xa6, 0xed, 0xc9, 0xc9, 0x38, 0xb9, 0xc9, 0x26, 0x5a, 0xce, 0x3c, 0x0a,
- 0xfd, 0xff, 0xcc, 0x45, 0x28, 0xaa, 0x55, 0xe5, 0x59, 0x43, 0xbb, 0xa6,
- 0x71, 0x6c, 0xc2, 0xf7, 0x42, 0x53, 0x41, 0x41, 0xbf, 0x81, 0xed, 0x45,
- 0x7d, 0x59, 0x17, 0x10, 0x4d, 0xab, 0xac, 0x8c, 0xe4, 0x32, 0xf0, 0x04,
- 0x54, 0xac, 0x30, 0x9d, 0x40, 0xff, 0x9a, 0xa4, 0xd2, 0xf1, 0x8e, 0xbd,
- 0x3a, 0x86, 0xed, 0x90, 0x76, 0x29, 0xde, 0xb0, 0x4f, 0xe4, 0xe6, 0x0c,
- 0xea, 0x8c, 0x26, 0x19, 0xf5, 0x88, 0x25, 0x76, 0xe0, 0xb7, 0x2d, 0x43,
- 0x87, 0xd6, 0x59, 0x59, 0x21, 0x7f, 0xcc, 0xeb, 0x46, 0x45, 0x6d, 0x5b,
- 0xd7, 0x15, 0xb9, 0xf9, 0x01, 0x3d, 0x1b, 0xf2, 0xd3, 0x9b, 0xab, 0x92,
- 0x7b, 0xf7, 0x61, 0x9b, 0x9d, 0xce, 0x86, 0xa2, 0x2c, 0xe9, 0x77, 0x02,
- 0xae, 0xe0, 0xe4, 0x8d, 0x7f, 0x50, 0x51, 0x98, 0x4a, 0x39, 0x0f, 0x57,
- 0x0e, 0x2c, 0xf9, 0x25, 0xaf, 0xf3, 0xcb, 0x9e, 0xd6, 0xc4, 0xec, 0xf2,
- 0x03, 0x34, 0x87, 0x53, 0x8c, 0x30, 0x23, 0x11, 0x9a, 0x15, 0xdf, 0xd2,
- 0xa0, 0xe1, 0x36, 0xfd, 0x2b, 0x74, 0x9e, 0xf7, 0x50, 0xdf, 0x6f, 0x1c,
- 0x06, 0xb4, 0xbe, 0x0b, 0x6f, 0x2e, 0xf6, 0x0a, 0x38, 0x8d, 0xdd, 0x53,
- 0xd9, 0x5d, 0xe4, 0x3c, 0x00, 0x0f, 0xb9, 0x4f, 0x5f, 0x8f, 0x07, 0x59,
- 0x34, 0x0a, 0x19, 0xc9, 0x25, 0xf2, 0x02, 0xe9, 0xf2, 0xef, 0x19, 0x8e,
- 0xa7, 0x1d, 0xa5, 0xf4, 0xaf, 0x6e, 0x49, 0x3f, 0x38, 0x1c, 0x4e, 0xb2,
- 0x94, 0xba, 0x63, 0xbd, 0x68, 0x48, 0x61, 0xda, 0x54, 0x55, 0x14, 0x29,
- 0x2b, 0xfa, 0x33, 0xbf, 0x7b, 0x01, 0x5d, 0x8b, 0x8e, 0xf6, 0xec, 0xe5,
- 0x87, 0x8b, 0xaf, 0x93, 0xc3, 0xd1, 0xfe, 0x83, 0xaa, 0x8a, 0xc0, 0x10,
- 0x5a, 0x63, 0xe8, 0xe1, 0xa1, 0xc9, 0x76, 0xf1, 0xb7, 0x75, 0xd1, 0x6e,
- 0xbe, 0x13, 0x8b, 0xab, 0x88, 0xfe, 0xa4, 0xe2, 0x97, 0xd2, 0xbc, 0xba,
- 0x99, 0xf1, 0x7e, 0x7b, 0xb6, 0xe1, 0x10, 0xe6, 0x77, 0x75, 0x5f, 0x08,
- 0xba, 0x8e, 0x42, 0xab, 0xb4, 0x26, 0x2b, 0xc0, 0x4f, 0x1a, 0xe8, 0x46,
- 0x23, 0x2c, 0xb2, 0x5c, 0xf8, 0x4e, 0xd9, 0xc6, 0xca, 0xd0, 0x63, 0xdf,
- 0xbf, 0x79, 0xd5, 0x19, 0xee, 0xc9, 0xd3, 0xc7, 0xfb, 0xbf, 0x62, 0x82,
- 0x65, 0x49, 0x16, 0x84, 0x98, 0x64, 0x51, 0xc4, 0xa3, 0xef, 0x2a, 0x2a,
- 0x39, 0x56, 0x1f, 0x51, 0x29, 0x0f, 0xf9, 0x90, 0x08, 0x75, 0x33, 0xa3,
- 0x4c, 0x3b, 0x8b, 0x98, 0x52, 0xa9, 0xb6, 0xff, 0x9f, 0xff, 0x0c, 0xcd,
- 0xba, 0xbf, 0xfe, 0x88, 0x50, 0x0e, 0xda, 0x91, 0xda, 0x0a, 0x0d, 0x65,
- 0x32, 0xb5, 0x13, 0xc7, 0x74, 0x9d, 0xb7, 0x7f, 0xb7, 0x9d, 0xd8, 0xa6,
- 0x61, 0x62, 0x98, 0xc7, 0x7b, 0x2e, 0x68, 0xb8, 0x4f, 0x67, 0xa7, 0xc7,
- 0x0a, 0x48, 0xf9, 0xd4, 0xd3, 0x08, 0x74, 0x17, 0xa4, 0x95, 0xd6, 0xac,
- 0xaf, 0xe9, 0x9f, 0x76, 0xbf, 0x12, 0xe8, 0x35, 0x0d, 0x71, 0x50, 0x28,
- 0x82, 0xf3, 0xe2, 0xb0, 0x02, 0xd2, 0x45, 0x51, 0x7a, 0x9e, 0x17, 0x3d,
- 0x7e, 0x67, 0x49, 0xfe, 0xfa, 0x4f, 0x73, 0x02, 0x83, 0xe6, 0xa6, 0xfc,
- 0x67, 0xdb, 0x07, 0x6d, 0x34, 0x0c, 0x9a, 0xef, 0xc7, 0xdf, 0x1d, 0x50,
- 0x35, 0xd7, 0x56, 0x77, 0x88, 0x12, 0xcd, 0x24, 0xec, 0xa9, 0x5a, 0x05,
- 0x69, 0x13, 0xb0, 0xb2, 0x7e, 0x90, 0x0a, 0xc5, 0x07, 0xa4, 0x35, 0xfe,
- 0x73, 0x44, 0xff, 0xfd, 0xeb, 0xc1, 0xf0, 0xf1, 0x8f, 0xf6, 0xa3, 0xbf,
- 0x3b, 0xf8, 0xf8, 0xbb, 0xc3, 0xad, 0x58, 0xb1, 0x9e, 0x83, 0x6d, 0xf0,
- 0x92, 0x4b, 0x49, 0xa1, 0x2d, 0xee, 0xa4, 0xc2, 0x46, 0x82, 0xc3, 0xae,
- 0x4d, 0x29, 0x9a, 0x9e, 0x47, 0xb0, 0xad, 0xc8, 0xe7, 0x38, 0xea, 0x3a,
- 0xfa, 0xb5, 0x55, 0xa9, 0x32, 0x87, 0x9b, 0x92, 0xdf, 0x57, 0x70, 0x0b,
- 0xba, 0x21, 0x52, 0xfb, 0x11, 0xf0, 0x42, 0x82, 0xd1, 0xf2, 0xc9, 0x83,
- 0x90, 0x6e, 0x14, 0x1e, 0x25, 0xdc, 0x0d, 0x49, 0x69, 0x33, 0xf2, 0x2c,
- 0x4d, 0x3a, 0x9b, 0x3e, 0x99, 0xd8, 0x9f, 0x14, 0x59, 0x50, 0x44, 0xa7,
- 0xe5, 0xb6, 0x6c, 0xbd, 0x29, 0x3b, 0x28, 0x5d, 0xba, 0x01, 0xe3, 0x7f,
- 0x65, 0x89, 0xac, 0xdc, 0x06, 0x4e, 0x71, 0xa5, 0x83, 0xac, 0xb1, 0xbf,
- 0x51, 0x02, 0x8e, 0xef, 0x9f, 0x61, 0xa9, 0x62, 0x06, 0xcc, 0x6b, 0x17,
- 0x3a, 0xc3, 0xcf, 0x24, 0x6c, 0x46, 0xf0, 0x0c, 0xe8, 0x93, 0x19, 0x2b,
- 0xae, 0x4e, 0x27, 0xd4, 0x45, 0xb4, 0xd5, 0x94, 0xcd, 0x76, 0xd8, 0x9a,
- 0x38, 0xa4, 0xb0, 0xb4, 0xee, 0xd9, 0x10, 0x7f, 0x2b, 0xbc, 0x4d, 0x90,
- 0x8d, 0xc2, 0xe6, 0x6c, 0x6e, 0xa0, 0x38, 0xa4, 0xbc, 0xdf, 0x26, 0x1b,
- 0x7a, 0xf5, 0xcc, 0xa8, 0x9f, 0xc6, 0x4f, 0xb5, 0xf8, 0x71, 0xca, 0x0d,
- 0xda, 0x10, 0x92, 0x1d, 0x06, 0x71, 0x64, 0x92, 0x50, 0xb3, 0x3b, 0xc3,
- 0x0d, 0x19, 0x95, 0x77, 0x64, 0xeb, 0x56, 0xd4, 0x45, 0x20, 0xdc, 0xc6,
- 0x90, 0xda, 0xf6, 0x70, 0x3b, 0xd9, 0xb1, 0x86, 0xdd, 0x2c, 0xad, 0xaf,
- 0x76, 0x63, 0x1e, 0x64, 0xe7, 0xb4, 0x75, 0x8c, 0x4a, 0xba, 0xaa, 0x40,
- 0x64, 0x32, 0x87, 0xea, 0x57, 0x60, 0xcf, 0x18, 0x0e, 0x85, 0xd2, 0x3b,
- 0x87, 0x36, 0x07, 0xa0, 0xf5, 0x93, 0x21, 0x99, 0x8a, 0x0c, 0xab, 0xfc,
- 0x1f, 0x88, 0x88, 0x85, 0x01, 0x49, 0x3c, 0xcb, 0x19, 0x7a, 0x43, 0x2e,
- 0x5e, 0x73, 0x42, 0x54, 0xfb, 0xb0, 0x53, 0x2e, 0x7b, 0x34, 0x7d, 0x2b,
- 0xad, 0x3f, 0x71, 0x94, 0x7b, 0x56, 0xda, 0xa6, 0xed, 0xce, 0x8f, 0x32,
- 0x10, 0x8e, 0x3a, 0xfc, 0xef, 0x03, 0x6f, 0xb0, 0x4d, 0xc8, 0xc9, 0x64,
- 0x5f, 0x56, 0xe5, 0xa2, 0x6e, 0xc1, 0xa2, 0x49, 0x15, 0x3b, 0xd1, 0xb4,
- 0xf5, 0xd0, 0xf0, 0x27, 0xeb, 0x9c, 0x98, 0x71, 0x5a, 0x44, 0xd2, 0xc3,
- 0xeb, 0x48, 0xf4, 0x8e, 0x64, 0x9c, 0x76, 0x2b, 0x37, 0x64, 0x1c, 0x91,
- 0x50, 0x6e, 0x6f, 0x5b, 0x53, 0xde, 0xd4, 0x5a, 0xa4, 0xf5, 0x60, 0x34,
- 0x0f, 0x84, 0x49, 0x58, 0x4a, 0xc8, 0x00, 0x46, 0xe0, 0xd6, 0xe1, 0x35,
- 0xbb, 0x27, 0xc2, 0xa1, 0x34, 0x87, 0xb4, 0xca, 0x66, 0x71, 0x88, 0x82,
- 0x2a, 0xbb, 0x24, 0x98, 0x1e, 0xd2, 0x3e, 0x08, 0xa9, 0xc0, 0xdc, 0xa5,
- 0xe2, 0x9e, 0xb6, 0xdb, 0x1d, 0x27, 0x08, 0xc5, 0xd2, 0x93, 0x17, 0xab,
- 0xab, 0xca, 0x68, 0xf2, 0x61, 0xcd, 0xe3, 0xf8, 0xeb, 0x84, 0x31, 0x6d,
- 0xcd, 0x53, 0xfc, 0x8c, 0xbd, 0xe9, 0x1e, 0xec, 0xe7, 0xaf, 0x88, 0x55,
- 0x49, 0xc9, 0x5c, 0xc3, 0xb4, 0x1e, 0x06, 0xd4, 0x71, 0xe1, 0x67, 0xb6,
- 0x93, 0x05, 0x41, 0x86, 0x25, 0x25, 0x11, 0x53, 0x6c, 0xbb, 0x20, 0x30,
- 0x24, 0x43, 0x1c, 0x7b, 0xa3, 0xd1, 0x1e, 0x09, 0x9f, 0x3d, 0xf3, 0x87,
- 0x95, 0xac, 0x9c, 0xf3, 0xde, 0xed, 0x20, 0x49, 0xa1, 0x79, 0xfa, 0x18,
- 0x40, 0x6b, 0xa4, 0xdf, 0xb2, 0xd7, 0x93, 0xef, 0xef, 0x6b, 0x24, 0x82,
- 0x57, 0xc6, 0x36, 0xa8, 0xb8, 0xa2, 0x7e, 0xe9, 0x69, 0x3c, 0x61, 0x42,
- 0xa8, 0x84, 0xb7, 0x6a, 0xc1, 0x6e, 0xe9, 0xf4, 0x22, 0x25, 0x13, 0x1d,
- 0x9e, 0x34, 0x5a, 0x44, 0xde, 0x28, 0x62, 0x1e, 0xb0, 0x0c, 0xd2, 0x8d,
- 0xb6, 0xf9, 0xa3, 0xc3, 0xce, 0xf1, 0xe5, 0xe6, 0xc0, 0x67, 0xc6, 0xce,
- 0x01, 0xd0, 0x2e, 0x65, 0xc2, 0x86, 0xb5, 0x74, 0xec, 0x18, 0xed, 0xb4,
- 0x87, 0x83, 0x97, 0x11, 0xdb, 0xe1, 0x34, 0x47, 0xb5, 0x97, 0x18, 0x69,
- 0x98, 0xb3, 0x69, 0x76, 0x02, 0xc5, 0x87, 0x3f, 0xb2, 0xcb, 0x6a, 0x9e,
- 0xe4, 0xca, 0x83, 0x20, 0x32, 0xdb, 0xf8, 0x46, 0xa0, 0x97, 0x52, 0xce,
- 0xc5, 0x83, 0x29, 0x86, 0xd1, 0x62, 0x1e, 0x2c, 0xeb, 0x3f, 0xb2, 0xcc,
- 0xd1, 0x75, 0xa9, 0xa4, 0x35, 0x13, 0x56, 0xb1, 0xd9, 0xf7, 0xd7, 0xc7,
- 0xef, 0x45, 0xdb, 0x04, 0x3c, 0x83, 0x6b, 0x30, 0x1e, 0x80, 0x63, 0xc3,
- 0x28, 0x7d, 0xf2, 0x08, 0xa6, 0x23, 0xed, 0x5b, 0x7d, 0x95, 0x1e, 0x3e,
- 0x7e, 0x22, 0xd3, 0x56, 0xe4, 0x3a, 0xd8, 0xbc, 0xdb, 0xfc, 0xab, 0xbd,
- 0x3d, 0x4e, 0x5a, 0x21, 0x47, 0x43, 0xc0, 0xe3, 0xe1, 0xf3, 0xa3, 0x67,
- 0xff, 0xb8, 0x1d, 0x4d, 0x57, 0x55, 0x23, 0x84, 0x5d, 0x31, 0x14, 0x02,
- 0x42, 0x4a, 0xad, 0xdf, 0x20, 0x65, 0xa0, 0x1b, 0x2d, 0x6d, 0x46, 0x18,
- 0x81, 0x24, 0xd0, 0x00, 0xfd, 0xde, 0x21, 0x89, 0x80, 0xbd, 0x68, 0xbf,
- 0xc4, 0x44, 0xab, 0xc2, 0x09, 0x45, 0xd7, 0xdf, 0x9f, 0x9a, 0x9b, 0xab,
- 0x4f, 0x43, 0x40, 0x21, 0x49, 0x3d, 0xa5, 0xd3, 0xf0, 0x06, 0x96, 0x1c,
- 0xec, 0x9c, 0xc3, 0x07, 0x20, 0x3c, 0x8d, 0x7d, 0xb2, 0x77, 0x0d, 0x33,
- 0x35, 0x5f, 0x08, 0xb2, 0x85, 0x94, 0x2e, 0x2c, 0xe8, 0x2d, 0xf8, 0x91,
- 0x97, 0xa4, 0xeb, 0x6e, 0x8b, 0x11, 0xed, 0x55, 0xd3, 0xc1, 0x83, 0x0a,
- 0xbc, 0x00, 0xc0, 0x58, 0x57, 0x28, 0x23, 0x24, 0x69, 0x4e, 0xb3, 0x9c,
- 0x41, 0xd0, 0xcc, 0xd9, 0x52, 0xf4, 0x35, 0xb8, 0x07, 0x86, 0x14, 0xf6,
- 0x88, 0x0e, 0xc4, 0x70, 0x0c, 0x9a, 0x99, 0x50, 0xac, 0xe7, 0xd9, 0x68,
- 0xff, 0xb9, 0xc2, 0x23, 0x0f, 0x92, 0xaf, 0x8a, 0x35, 0x1d, 0x09, 0xad,
- 0xfa, 0xab, 0xf1, 0x37, 0x41, 0xa1, 0x23, 0xbd, 0xf1, 0xe8, 0x88, 0xde,
- 0x78, 0x37, 0xe6, 0xa7, 0x6e, 0xca, 0xc5, 0xdc, 0xbc, 0x19, 0x7b, 0xee,
- 0x29, 0x3d, 0x67, 0x28, 0x6e, 0xd6, 0x2c, 0x6a, 0x25, 0xaa, 0x0d, 0x33,
- 0x79, 0xf4, 0x28, 0x32, 0x93, 0xc1, 0x4f, 0xfe, 0xd0, 0x19, 0xbc, 0xae,
- 0x44, 0x50, 0xd4, 0x03, 0x0c, 0x94, 0x83, 0x12, 0x10, 0x0b, 0xf6, 0xfd,
- 0x6b, 0x32, 0x5f, 0x06, 0xed, 0x78, 0x48, 0x87, 0xc0, 0x0a, 0x98, 0x85,
- 0x0d, 0xb0, 0x20, 0x9e, 0x1e, 0x1e, 0x1d, 0xec, 0x3d, 0x19, 0x3d, 0x1a,
- 0x1d, 0xda, 0x94, 0x4c, 0x43, 0x07, 0xd7, 0xd4, 0xc1, 0x86, 0x32, 0x60,
- 0x22, 0xa1, 0x07, 0x24, 0x23, 0xe5, 0x85, 0x19, 0xc7, 0x83, 0x28, 0x91,
- 0x4e, 0x03, 0x2e, 0x19, 0x8b, 0x00, 0x49, 0x0e, 0xfc, 0xda, 0xbe, 0x51,
- 0xa4, 0x63, 0x2e, 0xe1, 0x9c, 0xd0, 0x24, 0xc4, 0xcd, 0xb4, 0xae, 0xb0,
- 0x03, 0x93, 0xfc, 0xef, 0xeb, 0xbc, 0x31, 0x2a, 0x00, 0x71, 0x14, 0x72,
- 0x9d, 0x69, 0xbf, 0x03, 0x2a, 0xa3, 0x2e, 0x35, 0x41, 0x81, 0xae, 0x44,
- 0x0c, 0xac, 0x81, 0x67, 0xcf, 0xc9, 0xef, 0x13, 0x17, 0x30, 0xe2, 0x12,
- 0xc2, 0x1c, 0xec, 0x8b, 0x9b, 0x0d, 0x19, 0x4b, 0xb2, 0x98, 0x9a, 0x3b,
- 0xfa, 0xb5, 0xb1, 0xf3, 0xae, 0xc9, 0x67, 0x1f, 0x74, 0x16, 0x66, 0x16,
- 0xc0, 0xc8, 0x5b, 0x1c, 0x72, 0x91, 0xb4, 0x20, 0xd7, 0x94, 0x40, 0x7e,
- 0xc0, 0x85, 0x46, 0x5a, 0xe4, 0xcd, 0x35, 0x8d, 0x01, 0x77, 0xd2, 0x7d,
- 0x68, 0xbb, 0xa6, 0x19, 0x02, 0x95, 0x02, 0x8c, 0x54, 0xed, 0xc7, 0xe1,
- 0x05, 0x06, 0x62, 0x84, 0xea, 0x65, 0xab, 0x36, 0x63, 0xce, 0xaf, 0x4d,
- 0xce, 0xd1, 0x28, 0x72, 0x0b, 0xff, 0xeb, 0x74, 0x90, 0xb4, 0xba, 0x5c,
- 0x8b, 0xcc, 0x8a, 0xb5, 0x38, 0xed, 0x36, 0x02, 0x96, 0x51, 0x7f, 0x36,
- 0x95, 0x1d, 0xfd, 0xf2, 0x54, 0x76, 0xf8, 0x50, 0x2a, 0xf3, 0xc8, 0x8c,
- 0x03, 0xef, 0x1b, 0x08, 0x8d, 0x3a, 0x07, 0xd3, 0x3a, 0x7a, 0xa8, 0xcc,
- 0x23, 0x32, 0x97, 0x2a, 0xd0, 0x22, 0xb1, 0x36, 0x8d, 0x39, 0x22, 0xeb,
- 0xa3, 0x32, 0x06, 0x96, 0x51, 0x3a, 0xbb, 0x87, 0xd0, 0xd8, 0xc7, 0xb9,
- 0x99, 0xca, 0x2e, 0xda, 0x7c, 0x65, 0x03, 0x8d, 0xf9, 0x04, 0xf1, 0x60,
- 0x2a, 0x73, 0xfe, 0x46, 0xe6, 0x3b, 0x49, 0x0f, 0xa1, 0xf9, 0x74, 0xd6,
- 0xdb, 0x48, 0xf7, 0xe0, 0x59, 0x8c, 0xca, 0x8e, 0x1e, 0x42, 0x65, 0xe6,
- 0x3c, 0x17, 0x24, 0x2b, 0x5b, 0x54, 0xf6, 0xe8, 0x27, 0x51, 0x19, 0x93,
- 0x19, 0xe8, 0xac, 0x97, 0xd0, 0x68, 0x49, 0xed, 0x42, 0xe5, 0x97, 0xff,
- 0x2a, 0xb7, 0x48, 0x5b, 0x83, 0x06, 0xe5, 0xbb, 0x3f, 0xed, 0x0c, 0x3b,
- 0x5b, 0xfd, 0x80, 0x13, 0x3b, 0x6c, 0x9f, 0xd8, 0xc1, 0x4f, 0x3b, 0xb1,
- 0xc3, 0xae, 0x65, 0x52, 0x65, 0xec, 0x33, 0xff, 0xab, 0xc6, 0x2e, 0x9e,
- 0xef, 0xed, 0xfd, 0x08, 0x1f, 0xd0, 0x73, 0x92, 0x7d, 0x3f, 0x06, 0x4d,
- 0xe0, 0xb3, 0x4e, 0x89, 0xef, 0xf8, 0xec, 0xd5, 0x37, 0x63, 0x71, 0xbc,
- 0x8b, 0xc2, 0xa1, 0x0a, 0x09, 0x94, 0x76, 0x06, 0xef, 0xe5, 0xfe, 0x81,
- 0x81, 0x9a, 0x2b, 0x6d, 0x88, 0x87, 0xb7, 0x03, 0xeb, 0x02, 0xa7, 0xc2,
- 0xd1, 0x22, 0xd1, 0xab, 0x02, 0x90, 0x41, 0x86, 0x3a, 0x83, 0xd3, 0x43,
- 0x86, 0xee, 0xc1, 0x92, 0xf3, 0xe7, 0x62, 0xdb, 0xa0, 0xda, 0x57, 0x76,
- 0x9a, 0xab, 0x0a, 0x05, 0x45, 0x78, 0x4c, 0x74, 0x6b, 0xaf, 0xbb, 0x61,
- 0xcf, 0xec, 0x64, 0x56, 0x5f, 0x03, 0x88, 0x79, 0x55, 0x69, 0x44, 0x31,
- 0x66, 0xe4, 0xda, 0xdf, 0xaa, 0x27, 0x30, 0x06, 0x38, 0x22, 0xc0, 0x82,
- 0xde, 0x7e, 0xd3, 0x7b, 0x41, 0xfa, 0x66, 0x7e, 0xeb, 0xc3, 0x1b, 0x11,
- 0x15, 0xa0, 0x7d, 0x77, 0xa3, 0x1d, 0x72, 0x6e, 0xb9, 0x9f, 0x09, 0xc6,
- 0xe0, 0xdc, 0xb9, 0x8c, 0x9b, 0xd0, 0xd4, 0x8f, 0xcc, 0x90, 0x5d, 0xbf,
- 0x12, 0xff, 0x22, 0xa5, 0xdf, 0xc8, 0x3f, 0x1e, 0xd3, 0x87, 0x11, 0x31,
- 0xe6, 0x7f, 0x5e, 0xe1, 0xdf, 0x9c, 0x1d, 0xc1, 0xe8, 0x65, 0xde, 0x39,
- 0x4f, 0xa3, 0x1b, 0xad, 0xac, 0x94, 0xdd, 0x27, 0x8c, 0xaa, 0xf1, 0xae,
- 0x74, 0xd5, 0x9c, 0xfe, 0x9a, 0x29, 0xd1, 0x03, 0x85, 0xc9, 0xb1, 0x12,
- 0x20, 0x8f, 0x11, 0x63, 0xe4, 0x47, 0xa3, 0x38, 0xbc, 0x7c, 0x96, 0xf8,
- 0x10, 0xa7, 0x8a, 0x59, 0xe1, 0x37, 0xae, 0x73, 0x21, 0x5f, 0x39, 0x82,
- 0x01, 0xa3, 0xdd, 0x86, 0xc9, 0xe5, 0xd4, 0x94, 0x45, 0x66, 0x7e, 0xb0,
- 0xff, 0x79, 0xe8, 0x92, 0xf8, 0xa0, 0xd5, 0x94, 0x0e, 0xe5, 0x13, 0x69,
- 0x1d, 0xa8, 0x6b, 0x98, 0xb8, 0x1a, 0xa2, 0xd8, 0x47, 0x23, 0x05, 0x97,
- 0xb0, 0x7d, 0x67, 0x19, 0x5b, 0x4b, 0x13, 0x36, 0x7b, 0xc3, 0x84, 0x76,
- 0x14, 0x90, 0xd7, 0x90, 0x6b, 0x02, 0x4f, 0x2d, 0xc9, 0x09, 0x01, 0x7f,
- 0x27, 0x27, 0x86, 0x86, 0xcc, 0xbe, 0x74, 0x18, 0x82, 0xbf, 0x7f, 0xb4,
- 0x4f, 0x67, 0xaa, 0x83, 0x50, 0x63, 0xa6, 0x85, 0x86, 0x3a, 0x7e, 0x7f,
- 0x94, 0x8e, 0x7e, 0x43, 0x0c, 0xb0, 0xc7, 0x6d, 0x2b, 0xfa, 0x77, 0x03,
- 0x3f, 0xbf, 0x69, 0x92, 0x56, 0x11, 0x9f, 0x8d, 0xc8, 0x6e, 0xc5, 0xb7,
- 0x51, 0x74, 0x18, 0x9b, 0xf8, 0x94, 0xb2, 0x01, 0x8b, 0x3a, 0x0c, 0xfb,
- 0x43, 0x33, 0x54, 0x12, 0x76, 0x3a, 0xb1, 0xf1, 0x06, 0xbf, 0x69, 0xf9,
- 0x80, 0x51, 0xd9, 0x5a, 0xc9, 0x60, 0x03, 0x4e, 0xa7, 0xea, 0x29, 0xf4,
- 0xb4, 0x5f, 0xc1, 0x67, 0x66, 0x55, 0x7a, 0xe3, 0xd9, 0xd0, 0xdc, 0x17,
- 0x61, 0x8e, 0xc8, 0x83, 0xcd, 0x21, 0x31, 0xbf, 0xa7, 0x88, 0x72, 0x4c,
- 0xfb, 0xa8, 0xa7, 0x55, 0x26, 0x11, 0x1e, 0x82, 0xd8, 0x44, 0xf4, 0x98,
- 0x90, 0x29, 0x8d, 0xe6, 0x71, 0x99, 0x69, 0xd5, 0xae, 0x5d, 0xb5, 0xc2,
- 0xb2, 0x00, 0x8b, 0x65, 0x14, 0x4b, 0x88, 0x77, 0xee, 0x2c, 0xd7, 0x47,
- 0xde, 0x28, 0xb1, 0x0c, 0xde, 0x42, 0xaf, 0x6b, 0x0d, 0xb5, 0x05, 0xf6,
- 0x5c, 0x51, 0x07, 0xc5, 0xfa, 0x2a, 0x5f, 0x75, 0x45, 0xf4, 0xf0, 0x8b,
- 0xf2, 0x8b, 0xe1, 0xae, 0x90, 0x78, 0x79, 0x9d, 0xd5, 0xdc, 0x0d, 0x99,
- 0xa6, 0x4a, 0xd1, 0xe6, 0x2b, 0xb8, 0x58, 0x44, 0x78, 0xa1, 0x54, 0x98,
- 0x12, 0x77, 0xa1, 0x8d, 0x21, 0xc0, 0x11, 0xb4, 0xf6, 0xe1, 0x89, 0x55,
- 0x14, 0x68, 0x16, 0x7e, 0x47, 0xee, 0x18, 0xb3, 0x57, 0x73, 0xce, 0x2d,
- 0x44, 0x39, 0x31, 0x45, 0xe1, 0x05, 0xc3, 0x9b, 0x7d, 0xfa, 0xe5, 0xaa,
- 0x2d, 0x9b, 0xa8, 0x32, 0x5d, 0x79, 0xc3, 0x0b, 0x65, 0x2b, 0x7f, 0xba,
- 0xb7, 0xee, 0xc4, 0x32, 0xa0, 0xb9, 0x38, 0x31, 0xe8, 0xf2, 0xa1, 0x0e,
- 0x89, 0xd1, 0xbf, 0xa7, 0x57, 0xd9, 0x52, 0x5a, 0x20, 0xf5, 0x54, 0xf1,
- 0xf7, 0x96, 0xbc, 0xb7, 0xe7, 0xc4, 0x89, 0x99, 0xf3, 0x66, 0x35, 0x5a,
- 0x96, 0xff, 0x30, 0x7b, 0x9c, 0x52, 0x4f, 0xc5, 0xe0, 0x4a, 0x50, 0xb9,
- 0x6d, 0xc1, 0x87, 0xc2, 0x00, 0x5a, 0x85, 0x35, 0x2c, 0x1d, 0x0b, 0x57,
- 0x94, 0x76, 0xc0, 0x2d, 0x24, 0xaf, 0xcc, 0x8c, 0x8f, 0x3f, 0x7e, 0x78,
- 0x37, 0xfe, 0x70, 0xde, 0x25, 0xec, 0xf3, 0xb3, 0xf7, 0x17, 0xc7, 0xaf,
- 0x3f, 0x9e, 0xbf, 0x3f, 0xbb, 0x38, 0x7b, 0x75, 0x76, 0x9a, 0xec, 0x1c,
- 0xec, 0x6e, 0xac, 0x2e, 0xb4, 0x2e, 0x08, 0x0f, 0xa7, 0x52, 0xe7, 0xcf,
- 0x3c, 0xcb, 0x4e, 0x61, 0x87, 0xd6, 0x13, 0x8e, 0xf6, 0x9d, 0xd0, 0x56,
- 0x0b, 0xf7, 0x1b, 0x7e, 0x08, 0x08, 0x37, 0x70, 0xf5, 0x34, 0xb9, 0x5c,
- 0xf3, 0x65, 0x94, 0x5c, 0x05, 0x2d, 0xbd, 0xaa, 0x9b, 0x40, 0x14, 0x65,
- 0x1a, 0x2f, 0xf5, 0x0a, 0xd3, 0x36, 0xba, 0xe3, 0x1e, 0x77, 0x75, 0x16,
- 0x3a, 0x03, 0x28, 0x60, 0x8e, 0x2a, 0xea, 0x38, 0x59, 0x58, 0xba, 0x60,
- 0x38, 0x1b, 0x60, 0xa0, 0xdb, 0x57, 0xd0, 0x20, 0x42, 0x42, 0x58, 0x65,
- 0x61, 0x55, 0xba, 0x51, 0x72, 0x1e, 0xf6, 0x09, 0x93, 0x37, 0x66, 0x59,
- 0x21, 0xcd, 0x6a, 0x65, 0x1e, 0x08, 0x60, 0xa2, 0x0b, 0x0e, 0xc7, 0xd3,
- 0xcd, 0x03, 0xf4, 0x5b, 0x6f, 0xaf, 0x50, 0xee, 0x9c, 0x05, 0x51, 0x61,
- 0x7e, 0x9b, 0x91, 0x5e, 0x6e, 0xbc, 0x39, 0xd1, 0x78, 0xa4, 0x94, 0x01,
- 0x87, 0x32, 0xc2, 0x61, 0x8f, 0x35, 0x38, 0xc6, 0x28, 0x35, 0xb8, 0x93,
- 0xd0, 0x5f, 0x14, 0xdf, 0x68, 0xec, 0xaf, 0xe5, 0x1e, 0x42, 0xe6, 0x4d,
- 0xa4, 0x68, 0xc5, 0x80, 0xce, 0x7e, 0xc0, 0x04, 0x2d, 0x51, 0xc1, 0x0d,
- 0xc5, 0x2d, 0x0e, 0x2c, 0xc8, 0xf7, 0x48, 0x61, 0x42, 0x5c, 0xbc, 0x88,
- 0x89, 0x0c, 0x2c, 0xee, 0xd2, 0x9b, 0xce, 0xb4, 0xba, 0xec, 0xe7, 0xe9,
- 0xe8, 0xc9, 0xe3, 0xd1, 0x21, 0x81, 0x86, 0x9c, 0x2d, 0x28, 0x8e, 0x26,
- 0x9a, 0x05, 0xfc, 0xcb, 0xf8, 0x80, 0x20, 0x24, 0x21, 0x05, 0xcf, 0xed,
- 0x95, 0x8c, 0x18, 0xb3, 0xa5, 0x12, 0x2d, 0x66, 0x56, 0x51, 0xa6, 0xb8,
- 0x12, 0xd2, 0xd2, 0x58, 0x60, 0xb5, 0x09, 0x95, 0xc6, 0x7c, 0xe7, 0xb9,
- 0xa4, 0xa1, 0x71, 0x5e, 0x56, 0x97, 0xd7, 0x12, 0x44, 0x05, 0x20, 0x3f,
- 0x5f, 0x9d, 0x73, 0x8a, 0xaa, 0x85, 0xa8, 0x00, 0x2b, 0xd7, 0x96, 0xdd,
- 0xfb, 0xa3, 0x7d, 0x4a, 0x67, 0xf8, 0xb3, 0x64, 0xc8, 0x99, 0xbf, 0x8d,
- 0x63, 0xd0, 0x0b, 0xac, 0xce, 0xeb, 0x18, 0xed, 0x70, 0x16, 0x2d, 0xcf,
- 0x4c, 0xef, 0x0f, 0xf4, 0xa7, 0xa6, 0xf0, 0x77, 0x97, 0xdc, 0x03, 0xc3,
- 0x34, 0xf0, 0x50, 0x24, 0xcc, 0x7d, 0xad, 0xb3, 0xf8, 0x8a, 0x47, 0x9b,
- 0x91, 0xe8, 0x0e, 0x83, 0x8b, 0x76, 0xef, 0x15, 0x7b, 0xe8, 0x0d, 0xb3,
- 0xa1, 0x01, 0x95, 0x0e, 0x5d, 0x99, 0x76, 0x6e, 0xdf, 0x62, 0xe0, 0x19,
- 0x2a, 0x5f, 0x83, 0x67, 0x78, 0x91, 0xcd, 0xa1, 0x1b, 0xa2, 0xa6, 0x74,
- 0x80, 0x5f, 0x22, 0xa4, 0x69, 0xb3, 0xd6, 0xf8, 0x24, 0x62, 0xe0, 0x35,
- 0xe9, 0xd4, 0xd7, 0xb5, 0x2d, 0x88, 0xe1, 0xb6, 0xd9, 0x54, 0xea, 0x7e,
- 0x25, 0x55, 0xcd, 0x8b, 0x3b, 0x80, 0xf6, 0xe7, 0xb7, 0x9a, 0x38, 0xf0,
- 0x8f, 0xac, 0x2a, 0xc3, 0xf0, 0x3a, 0x94, 0x07, 0x05, 0x93, 0x23, 0x53,
- 0x52, 0xd1, 0x6e, 0xdc, 0x0f, 0xe9, 0xab, 0xc1, 0x9d, 0xfb, 0x03, 0x5a,
- 0x2f, 0x33, 0x38, 0x34, 0xb7, 0x49, 0x13, 0xb4, 0x13, 0x00, 0x37, 0xe6,
- 0x1a, 0x14, 0xf5, 0x78, 0xc0, 0x82, 0x6a, 0x60, 0xef, 0xb8, 0x7c, 0x36,
- 0x30, 0x31, 0xa1, 0xfe, 0xcd, 0xc8, 0x9c, 0x71, 0xd9, 0xbf, 0x36, 0xbc,
- 0x46, 0x6d, 0xce, 0x1c, 0xe0, 0x9d, 0xe8, 0x73, 0x21, 0x4f, 0x1f, 0x26,
- 0xc9, 0xeb, 0xac, 0xb8, 0x6b, 0x4f, 0x68, 0x00, 0xcc, 0x1a, 0xb8, 0x87,
- 0xf3, 0xc6, 0xc1, 0x2a, 0xb8, 0x64, 0x5c, 0x37, 0xc5, 0x70, 0x4a, 0xed,
- 0x39, 0xc7, 0x38, 0xd7, 0x17, 0x76, 0x1b, 0x98, 0x6b, 0xb5, 0x37, 0x63,
- 0x07, 0xe8, 0x28, 0x1a, 0xd3, 0xc5, 0x27, 0x1f, 0xb2, 0x0d, 0xc0, 0x7c,
- 0x84, 0x55, 0x57, 0xaf, 0x27, 0x7f, 0x63, 0x90, 0xfd, 0x84, 0x3c, 0x0b,
- 0x95, 0xec, 0x82, 0xe4, 0x39, 0x9a, 0x53, 0x35, 0x0f, 0x70, 0xe0, 0x8a,
- 0x98, 0x43, 0x11, 0x1b, 0x0e, 0xc1, 0x66, 0x85, 0xb7, 0x6f, 0x53, 0x18,
- 0x66, 0x14, 0xad, 0x4b, 0xcc, 0x7a, 0x54, 0x06, 0xbd, 0x3f, 0xc3, 0x39,
- 0xf1, 0x54, 0xce, 0x9f, 0xeb, 0x08, 0x5f, 0xde, 0x4b, 0xce, 0xd9, 0xb4,
- 0x19, 0xc4, 0xf4, 0x78, 0xef, 0x58, 0xca, 0xa9, 0xeb, 0xc1, 0x1f, 0xe8,
- 0x8f, 0x70, 0x0d, 0x2d, 0x92, 0xa5, 0x5d, 0x56, 0x36, 0x42, 0x8f, 0x83,
- 0x31, 0xe1, 0xf5, 0xbe, 0x0f, 0x7c, 0xe1, 0xc4, 0xc0, 0xe6, 0xb1, 0xc1,
- 0xc5, 0x1e, 0xf2, 0x81, 0x0f, 0x85, 0x82, 0x09, 0x2a, 0x75, 0xaf, 0x6c,
- 0x77, 0x03, 0xa9, 0xd0, 0x68, 0xdb, 0x41, 0x84, 0x41, 0xb3, 0x92, 0xce,
- 0x27, 0xe9, 0x9c, 0x92, 0xab, 0xab, 0xcc, 0x81, 0x31, 0xd3, 0x51, 0x32,
- 0xd4, 0x94, 0xa0, 0xbb, 0x6b, 0xae, 0xef, 0xaa, 0x6c, 0x18, 0x67, 0x9e,
- 0xb2, 0xb1, 0x49, 0xd3, 0xa9, 0xc8, 0x41, 0xe8, 0x6d, 0xb2, 0xaa, 0xc8,
- 0x34, 0x9a, 0x3d, 0x7c, 0xf8, 0xd1, 0xd6, 0xab, 0xb2, 0x70, 0x45, 0x38,
- 0x12, 0x7c, 0xf5, 0xd8, 0x98, 0x7c, 0x91, 0x73, 0xea, 0xe0, 0x74, 0xb2,
- 0x90, 0xf4, 0xd7, 0x65, 0x4e, 0xc8, 0x52, 0x3a, 0x1c, 0xb4, 0x37, 0x47,
- 0x25, 0x17, 0xf1, 0x4e, 0x29, 0x2e, 0x95, 0x49, 0xec, 0x2b, 0x72, 0x63,
- 0x22, 0xd3, 0x0c, 0xee, 0x0e, 0xaf, 0xf2, 0x8e, 0x6f, 0xb7, 0x0e, 0x87,
- 0x7c, 0x17, 0x44, 0xab, 0x0b, 0x8a, 0x33, 0x15, 0x1c, 0xba, 0x12, 0xe3,
- 0x53, 0x19, 0x2e, 0x4d, 0x8f, 0xcc, 0x34, 0x4a, 0xb9, 0x4a, 0x49, 0x32,
- 0x69, 0x65, 0x61, 0x07, 0x4c, 0xbe, 0xdd, 0x5e, 0xde, 0xea, 0x02, 0x36,
- 0x2d, 0xd7, 0xa9, 0xb9, 0xa3, 0x7b, 0x64, 0xc4, 0xed, 0x9d, 0x26, 0x02,
- 0x6e, 0x56, 0xc1, 0x56, 0x28, 0xab, 0x37, 0xfb, 0x9c, 0x37, 0x38, 0xb1,
- 0x4e, 0x26, 0xb2, 0x26, 0xe8, 0x4a, 0xff, 0x99, 0xe5, 0x3a, 0x6c, 0x5e,
- 0x29, 0xc1, 0x3a, 0x9b, 0x77, 0xc5, 0xc0, 0x6a, 0xd0, 0x7e, 0xc4, 0x4b,
- 0xc3, 0xdd, 0x35, 0x60, 0xa3, 0x4b, 0xc7, 0x11, 0xb8, 0x9f, 0x10, 0xbf,
- 0x8b, 0xfb, 0x11, 0xf7, 0x2c, 0xaa, 0x92, 0x21, 0x98, 0x62, 0x36, 0x34,
- 0x4c, 0x60, 0xb5, 0xc1, 0x3f, 0x7f, 0x3b, 0xd0, 0x45, 0xb7, 0x32, 0x98,
- 0x7d, 0x18, 0x17, 0xfe, 0x09, 0x27, 0x4a, 0xca, 0xde, 0x85, 0x15, 0x00,
- 0x46, 0xd3, 0x38, 0x8a, 0xed, 0x64, 0x2c, 0x13, 0x33, 0xb4, 0x70, 0x7a,
- 0x7b, 0x6e, 0x68, 0x71, 0x25, 0x36, 0x50, 0x37, 0xac, 0x2f, 0x6d, 0x8d,
- 0xb7, 0x4f, 0x76, 0xee, 0x03, 0xd7, 0x36, 0x62, 0x4c, 0x94, 0xac, 0x17,
- 0x92, 0xfb, 0xee, 0x7d, 0x8b, 0x4d, 0xb9, 0x60, 0x1f, 0x81, 0x73, 0xc6,
- 0xfd, 0x1b, 0xf8, 0x39, 0x11, 0x4a, 0x96, 0xd5, 0x05, 0x93, 0x94, 0xb3,
- 0x8e, 0xf9, 0x82, 0xc0, 0x27, 0xf1, 0x21, 0x9a, 0x58, 0xbe, 0x11, 0x41,
- 0xa4, 0xe7, 0x30, 0x62, 0xe0, 0x39, 0xb3, 0x4e, 0x5a, 0xb1, 0xfe, 0x7c,
- 0x9a, 0x52, 0xe4, 0x36, 0x9e, 0xcc, 0x38, 0x96, 0xfb, 0x36, 0xd4, 0xa7,
- 0x88, 0x4f, 0x6b, 0x26, 0xa9, 0xe7, 0x1c, 0xe4, 0x26, 0x60, 0xb7, 0xcd,
- 0x43, 0x12, 0x7c, 0xa7, 0x29, 0xc2, 0xf5, 0xda, 0x73, 0x5d, 0x06, 0x76,
- 0xff, 0x74, 0xbf, 0x35, 0xab, 0x8b, 0x31, 0x69, 0x3a, 0xab, 0x7e, 0x2f,
- 0x4b, 0xfb, 0x2b, 0x2f, 0xcc, 0x8d, 0xde, 0xb4, 0x28, 0x3c, 0xf4, 0x73,
- 0x16, 0xe5, 0x18, 0x87, 0xdb, 0x42, 0x99, 0x73, 0xe7, 0x44, 0xf8, 0x23,
- 0x1b, 0x63, 0x55, 0x3d, 0x4b, 0x30, 0x63, 0x6e, 0x68, 0x03, 0xed, 0x2d,
- 0xc3, 0x3e, 0xf8, 0x53, 0x57, 0x72, 0xff, 0x36, 0x82, 0x34, 0xe8, 0xbf,
- 0x7f, 0x7d, 0x0e, 0x37, 0xe0, 0xec, 0xc7, 0xde, 0x79, 0x1c, 0x0f, 0x64,
- 0x2e, 0xbf, 0xc2, 0x34, 0xf2, 0xd5, 0x15, 0xe9, 0x96, 0x2f, 0x62, 0xa5,
- 0x53, 0xde, 0x46, 0xc8, 0x63, 0xbf, 0xfc, 0xf7, 0xab, 0x85, 0x03, 0x98,
- 0xda, 0xf0, 0x7d, 0x79, 0xec, 0x17, 0xff, 0x3e, 0xdf, 0xdd, 0xcd, 0xc2,
- 0xc5, 0x72, 0xc5, 0xd7, 0x92, 0xa0, 0xde, 0xe6, 0x38, 0x4e, 0xaa, 0xfc,
- 0x0c, 0xa6, 0x28, 0x39, 0xef, 0x21, 0x57, 0x94, 0x6f, 0x45, 0xbb, 0xa0,
- 0xf8, 0x6c, 0xf1, 0x17, 0xe1, 0x60, 0x60, 0xcd, 0xe1, 0xe6, 0x48, 0x5b,
- 0xa2, 0x17, 0xfc, 0xe7, 0xde, 0x97, 0xb1, 0x33, 0xb2, 0xa5, 0x34, 0x24,
- 0x06, 0xb5, 0x91, 0x11, 0x3a, 0xe3, 0x30, 0x6e, 0x87, 0xa8, 0xbc, 0xb6,
- 0xab, 0x0b, 0x6d, 0x96, 0x66, 0x8d, 0xd0, 0xab, 0xb1, 0xee, 0x49, 0xb2,
- 0x43, 0x9a, 0x06, 0xac, 0x71, 0x0a, 0x97, 0x33, 0x44, 0x8a, 0x47, 0xe6,
- 0x7d, 0xb0, 0xee, 0x6b, 0x84, 0x07, 0x51, 0xe1, 0xf7, 0xa0, 0x75, 0x08,
- 0xc2, 0x5f, 0x0f, 0xa4, 0x7b, 0x91, 0x19, 0x8e, 0xc8, 0x4a, 0x92, 0x60,
- 0x95, 0x9e, 0x70, 0x9c, 0x21, 0xcc, 0x12, 0xd7, 0x37, 0x90, 0x6e, 0xba,
- 0xe0, 0x74, 0xeb, 0xe4, 0xd5, 0xd9, 0xbb, 0x77, 0xc7, 0xaf, 0xba, 0xf1,
- 0x68, 0x57, 0x4f, 0x82, 0x66, 0x59, 0xa2, 0xea, 0x07, 0xbd, 0x33, 0xf1,
- 0x75, 0x6e, 0x8c, 0x60, 0x43, 0x46, 0x3c, 0x03, 0x74, 0xd6, 0x4a, 0x05,
- 0x25, 0x99, 0xcb, 0x52, 0x3c, 0xfc, 0x5c, 0xa6, 0x80, 0x48, 0xb5, 0x5e,
- 0x40, 0x0f, 0xce, 0x87, 0x02, 0x67, 0x1a, 0xf5, 0x55, 0x65, 0x0d, 0x14,
- 0xf6, 0xab, 0xce, 0x00, 0xd3, 0x35, 0x06, 0xe3, 0x9e, 0xa4, 0xa3, 0xb3,
- 0xff, 0x35, 0xd2, 0xc1, 0xd1, 0xd2, 0x32, 0x23, 0xee, 0x51, 0xd1, 0xcf,
- 0xb0, 0x9c, 0x73, 0x1b, 0xdf, 0x65, 0x5a, 0x7d, 0xa2, 0x78, 0xb6, 0x57,
- 0xfe, 0x83, 0x02, 0x50, 0x80, 0x7f, 0xcf, 0x66, 0x31, 0x4c, 0x08, 0x78,
- 0xdd, 0xfd, 0x6a, 0x07, 0x99, 0x90, 0xb4, 0xbe, 0x7c, 0xae, 0x75, 0x99,
- 0xf4, 0x7a, 0x91, 0xdd, 0xd0, 0x67, 0x18, 0x08, 0x87, 0x80, 0x1d, 0xc2,
- 0x5e, 0x1a, 0x8c, 0xdf, 0xce, 0x51, 0x85, 0x3b, 0xc1, 0x94, 0xa0, 0xb3,
- 0x5a, 0x72, 0xb7, 0x0a, 0x00, 0x62, 0x53, 0xfb, 0x37, 0xae, 0xe9, 0x09,
- 0xf6, 0xea, 0x6b, 0x05, 0xb5, 0xf4, 0x52, 0xea, 0x82, 0xdc, 0x3f, 0x8b,
- 0x5f, 0x35, 0xc9, 0x5a, 0x50, 0x97, 0x7d, 0xb8, 0x40, 0xbc, 0xdb, 0x38,
- 0x06, 0xb2, 0x56, 0xea, 0xd6, 0x00, 0x7a, 0xb4, 0x69, 0x4f, 0xe4, 0x6f,
- 0x4c, 0x20, 0xf5, 0x30, 0x9a, 0xc1, 0xc2, 0x1e, 0x77, 0xe1, 0x96, 0x81,
- 0x44, 0x06, 0x27, 0x29, 0x41, 0x10, 0x5e, 0xa2, 0x76, 0x81, 0x33, 0x25,
- 0x71, 0x59, 0x03, 0x35, 0x17, 0x95, 0x27, 0xa8, 0xec, 0x1b, 0x88, 0x59,
- 0xc0, 0x6d, 0xe4, 0x67, 0xd4, 0x60, 0x58, 0x37, 0x5f, 0x51, 0x85, 0x38,
- 0x08, 0x21, 0x17, 0x38, 0x2f, 0x56, 0xeb, 0x26, 0x08, 0x24, 0x12, 0xbc,
- 0x1a, 0x23, 0x6b, 0x7c, 0x39, 0x0c, 0x5b, 0x91, 0xa5, 0x33, 0xff, 0x4c,
- 0xc1, 0xc0, 0x61, 0xf9, 0xd7, 0xcd, 0x2c, 0x2f, 0x36, 0x7a, 0x96, 0x7d,
- 0x8b, 0xc6, 0x99, 0x34, 0x92, 0xf8, 0xcf, 0x91, 0x5f, 0x47, 0xac, 0x7b,
- 0x70, 0x2d, 0x74, 0x69, 0xc1, 0xbe, 0xa5, 0x2c, 0x62, 0x13, 0x8a, 0x0e,
- 0xaa, 0xd4, 0x3b, 0xdc, 0xcf, 0x58, 0x39, 0xe4, 0xd8, 0xca, 0xfa, 0x84,
- 0xd2, 0x27, 0xee, 0x8e, 0xc6, 0x0f, 0xfd, 0xf2, 0x92, 0xc9, 0x76, 0xa2,
- 0xbf, 0x47, 0x47, 0xb1, 0xcf, 0xfd, 0x1a, 0x33, 0x48, 0x5e, 0x98, 0xff,
- 0x6c, 0xfc, 0xf6, 0xc3, 0x3f, 0x1b, 0x60, 0x4d, 0x6e, 0x90, 0xba, 0x36,
- 0xc5, 0x15, 0xb2, 0xf0, 0x5e, 0x28, 0x55, 0xf0, 0xdc, 0x20, 0x2f, 0xd5,
- 0x93, 0xc8, 0x1b, 0x65, 0xb0, 0xab, 0x43, 0xf3, 0xc5, 0x70, 0x24, 0x60,
- 0x1f, 0x9b, 0x88, 0x84, 0xa0, 0x1e, 0x26, 0x92, 0xef, 0x15, 0xc1, 0xad,
- 0x32, 0xde, 0x6e, 0x9e, 0x95, 0xad, 0xe2, 0x7b, 0xf8, 0xc6, 0x85, 0xa5,
- 0xab, 0xff, 0x9a, 0xba, 0x82, 0xd2, 0xc1, 0x96, 0xb2, 0x82, 0x4f, 0xb4,
- 0x36, 0xe1, 0x21, 0x52, 0x29, 0xd8, 0x92, 0x6e, 0x2d, 0x60, 0x6b, 0xa3,
- 0xc2, 0x5d, 0xd8, 0x94, 0xf5, 0xee, 0xc8, 0x13, 0x4f, 0xfd, 0xe2, 0xd7,
- 0xe2, 0xe1, 0x29, 0xdb, 0xf1, 0x93, 0xe9, 0xcb, 0xda, 0xa6, 0xe1, 0x18,
- 0xaa, 0xbd, 0x37, 0x65, 0x9b, 0x92, 0x9b, 0xbc, 0x84, 0x6d, 0xcf, 0x2f,
- 0xd1, 0x97, 0xb1, 0xfd, 0x7f, 0x63, 0xca, 0x76, 0x2b, 0x67, 0x9b, 0xd4,
- 0x2b, 0x4a, 0x11, 0x8e, 0xa5, 0x6d, 0x7b, 0x70, 0x37, 0x9c, 0xb3, 0xbd,
- 0x29, 0x65, 0xdb, 0xcb, 0xd8, 0xde, 0x90, 0xb0, 0xcd, 0xe0, 0xc1, 0x9b,
- 0x52, 0xb6, 0x7f, 0x66, 0xce, 0x76, 0x4f, 0xca, 0xf6, 0x4f, 0xce, 0xd8,
- 0xfe, 0x85, 0x53, 0xb6, 0x7f, 0xc9, 0x6c, 0x64, 0xdc, 0x1e, 0x3a, 0x8f,
- 0x7c, 0x2a, 0xc5, 0x4d, 0x2f, 0xee, 0x85, 0x14, 0x6e, 0x27, 0xb0, 0x78,
- 0x71, 0x66, 0x19, 0x87, 0x55, 0x1a, 0xa7, 0xb8, 0x87, 0x75, 0x43, 0x42,
- 0x2a, 0x91, 0x0c, 0x38, 0x3f, 0x0e, 0x7c, 0x14, 0xbb, 0xe9, 0x75, 0xbd,
- 0x18, 0x62, 0x02, 0x54, 0x73, 0x1c, 0x58, 0x89, 0x8e, 0xcf, 0x74, 0x9e,
- 0xfb, 0xe5, 0x59, 0x4e, 0xb3, 0xa8, 0x0f, 0x8e, 0x9c, 0xad, 0x2e, 0x7f,
- 0x59, 0x53, 0x3d, 0x6c, 0xcc, 0x6e, 0x67, 0xee, 0x33, 0x16, 0x0e, 0xa3,
- 0x10, 0x27, 0xfc, 0x16, 0x7c, 0xa4, 0x99, 0x6d, 0xa9, 0x68, 0x23, 0x12,
- 0xb6, 0x43, 0x72, 0x58, 0x0c, 0x83, 0xf2, 0x77, 0x7f, 0x1d, 0x10, 0x21,
- 0x54, 0xf6, 0xa2, 0x4c, 0xbb, 0xc6, 0x15, 0x3c, 0x18, 0x1d, 0x71, 0x85,
- 0x34, 0x22, 0x2c, 0x14, 0x5e, 0xe5, 0x79, 0x06, 0x88, 0x54, 0x98, 0x00,
- 0xf0, 0xc0, 0xd5, 0xb4, 0xe3, 0x86, 0x65, 0xf2, 0xfc, 0x28, 0x79, 0x4f,
- 0xaa, 0xa3, 0x51, 0xd4, 0x11, 0xed, 0xc7, 0xed, 0x36, 0x63, 0x27, 0xf2,
- 0xfb, 0xd8, 0x70, 0x6d, 0x10, 0x5a, 0x43, 0x3f, 0x1f, 0xde, 0x9f, 0x86,
- 0xf1, 0x69, 0x44, 0x0f, 0x9e, 0xef, 0xed, 0x21, 0x41, 0xea, 0x2a, 0xbd,
- 0xbd, 0x1d, 0xd5, 0xd9, 0xde, 0xac, 0x9c, 0xd6, 0x7b, 0x74, 0x82, 0xfa,
- 0xf5, 0xab, 0x66, 0xb9, 0xf8, 0xec, 0x3e, 0x98, 0x6b, 0xad, 0xcb, 0x5d,
- 0xdc, 0x09, 0x5a, 0x97, 0xcb, 0xbe, 0xc4, 0xad, 0xcc, 0xbd, 0x3a, 0xf9,
- 0x75, 0xd0, 0x79, 0x54, 0xaa, 0x0a, 0xcc, 0xaa, 0xcc, 0xff, 0xa1, 0xe7,
- 0x0a, 0x45, 0x95, 0x22, 0x85, 0xcb, 0x7e, 0x5f, 0x5a, 0xaf, 0x86, 0x20,
- 0x3c, 0x20, 0x2e, 0x24, 0x6f, 0x08, 0x53, 0x36, 0x6b, 0xc0, 0xc4, 0xe4,
- 0x44, 0x3a, 0xc7, 0xde, 0xe9, 0x08, 0xcb, 0xe4, 0x15, 0xb6, 0x6d, 0x03,
- 0x9d, 0xf5, 0xf4, 0x88, 0xfd, 0xc5, 0x59, 0x82, 0xa1, 0x6e, 0x92, 0xf2,
- 0x0f, 0x51, 0x76, 0xfd, 0x47, 0x7f, 0x8d, 0x5b, 0x66, 0x13, 0xf2, 0x5e,
- 0x70, 0xb6, 0xdd, 0xc6, 0x99, 0xd8, 0x87, 0x7f, 0x8d, 0x99, 0xa0, 0x4e,
- 0x3f, 0xca, 0x1f, 0x5b, 0x73, 0xc0, 0x63, 0xbf, 0xc6, 0xf7, 0xaf, 0x0f,
- 0xfa, 0x3e, 0x8b, 0x26, 0xb0, 0x78, 0xe2, 0x17, 0xfc, 0xf0, 0x07, 0xeb,
- 0xac, 0x62, 0x4c, 0x83, 0x17, 0xf4, 0xdf, 0xe7, 0xba, 0xc3, 0x7d, 0xdd,
- 0xe5, 0x36, 0x20, 0xf7, 0x7b, 0x8d, 0xed, 0x25, 0xa3, 0x75, 0x33, 0x68,
- 0x48, 0x2f, 0x2a, 0x08, 0x43, 0x42, 0x09, 0xaa, 0x37, 0x9a, 0x2d, 0x0c,
- 0x15, 0x12, 0x90, 0x21, 0x54, 0x18, 0xd5, 0x86, 0x3e, 0x3e, 0x2b, 0x15,
- 0x65, 0xe9, 0x5d, 0x8f, 0x18, 0x42, 0x86, 0x40, 0x4c, 0x2b, 0x6f, 0xd4,
- 0x69, 0x84, 0x6b, 0xec, 0xd7, 0x46, 0x9a, 0x8b, 0xb5, 0x08, 0xd3, 0x5a,
- 0xee, 0xeb, 0x59, 0x00, 0x9e, 0xed, 0x43, 0x11, 0x4d, 0xac, 0x1f, 0x0d,
- 0x7c, 0xa5, 0xcb, 0x44, 0x15, 0xcf, 0x76, 0xe1, 0xc0, 0x2b, 0xec, 0x15,
- 0x7f, 0x9e, 0x6c, 0x0d, 0x3f, 0x24, 0xcf, 0xb7, 0x82, 0x2d, 0x3a, 0x2b,
- 0xa4, 0xe7, 0x0b, 0x9c, 0x5e, 0x15, 0x0a, 0xe1, 0xd1, 0x46, 0xca, 0x57,
- 0x4d, 0xae, 0x08, 0xb0, 0xc8, 0x99, 0x13, 0xb6, 0x5f, 0xc2, 0x65, 0x10,
- 0x84, 0x63, 0xe7, 0x05, 0x2b, 0x51, 0xda, 0xe1, 0x88, 0x44, 0x09, 0xb9,
- 0x6d, 0x1c, 0xfc, 0x39, 0xd4, 0x27, 0xee, 0xde, 0x20, 0x89, 0x0d, 0x14,
- 0xcd, 0x9c, 0x86, 0xee, 0x17, 0xdb, 0x1b, 0x1c, 0x23, 0xae, 0xca, 0xba,
- 0xce, 0x27, 0x86, 0x47, 0x5f, 0x0a, 0x7f, 0xac, 0x33, 0x4e, 0xa7, 0xe2,
- 0x26, 0xab, 0xb4, 0x97, 0xb5, 0x4b, 0x2e, 0xab, 0x43, 0x68, 0x2d, 0x5e,
- 0xa9, 0xed, 0x18, 0x21, 0xee, 0x25, 0x33, 0x3b, 0x66, 0x6d, 0xd7, 0x39,
- 0x0d, 0xcf, 0x04, 0x97, 0x26, 0x93, 0x2a, 0xcf, 0xe6, 0xc9, 0xb2, 0xe4,
- 0xad, 0x87, 0xe2, 0xd5, 0x65, 0xb2, 0x0b, 0x42, 0xe6, 0xa0, 0x2e, 0xe1,
- 0x94, 0x69, 0x5b, 0x13, 0xe8, 0x24, 0xf2, 0xaf, 0x91, 0xfd, 0xe8, 0x72,
- 0xbb, 0xab, 0x8c, 0x32, 0x07, 0xae, 0x33, 0x39, 0xd6, 0x54, 0x7b, 0xef,
- 0xf4, 0xe4, 0xa4, 0x56, 0x16, 0x9b, 0x1b, 0xd5, 0x0e, 0x80, 0x04, 0xb2,
- 0xf8, 0x24, 0xf4, 0x45, 0xf4, 0x72, 0xd4, 0xf4, 0x5d, 0x57, 0xba, 0x3f,
- 0xfa, 0xd5, 0x78, 0xbc, 0xe7, 0x85, 0xfe, 0xd9, 0x75, 0x00, 0xfd, 0x59,
- 0xf1, 0xed, 0xd4, 0x68, 0x31, 0x82, 0xee, 0xcb, 0x87, 0x9f, 0x13, 0x2a,
- 0xfe, 0xbb, 0xae, 0x96, 0x13, 0x49, 0x2d, 0xa7, 0x04, 0x3a, 0xce, 0x57,
- 0xb3, 0xab, 0x6b, 0x80, 0x2e, 0x00, 0x90, 0x16, 0x3f, 0x36, 0xfc, 0x21,
- 0x10, 0xf1, 0x2e, 0x5d, 0xbe, 0x95, 0x20, 0xef, 0xf2, 0xe3, 0xe9, 0xac,
- 0x5c, 0x76, 0x3c, 0x0a, 0x42, 0xd8, 0x45, 0x9e, 0xd2, 0x0c, 0x42, 0x99,
- 0x4c, 0x18, 0xe2, 0xfd, 0xb9, 0xf1, 0x46, 0xe7, 0xf3, 0x62, 0xf5, 0x0e,
- 0xf5, 0x93, 0x1c, 0xac, 0xf1, 0x28, 0x31, 0x6e, 0x28, 0xfa, 0x3f, 0x3c,
- 0x0d, 0xba, 0x38, 0x4a, 0xed, 0x84, 0x30, 0x4e, 0x9b, 0xbd, 0x70, 0x9d,
- 0xa7, 0x56, 0x87, 0x72, 0xdf, 0xe2, 0x1d, 0x75, 0x9f, 0xea, 0x8b, 0xc3,
- 0x31, 0xde, 0x4e, 0xa4, 0xb2, 0xf3, 0xdd, 0x78, 0x1c, 0xa6, 0xc8, 0x17,
- 0xc6, 0x38, 0x29, 0x2f, 0x8b, 0xfc, 0x1f, 0xd2, 0x5e, 0xab, 0x9b, 0xd9,
- 0xda, 0xaa, 0x51, 0x68, 0x07, 0xe4, 0x29, 0x51, 0x22, 0xe4, 0x6f, 0x82,
- 0x04, 0x47, 0x62, 0x07, 0x09, 0x61, 0x80, 0xb0, 0xb2, 0xc9, 0x80, 0x14,
- 0x67, 0xe0, 0x1e, 0x4a, 0xad, 0xa4, 0x07, 0x85, 0xcc, 0xf9, 0x2c, 0x54,
- 0x24, 0x69, 0x0f, 0x04, 0x7b, 0x26, 0xae, 0x22, 0x65, 0x3f, 0xa3, 0xa0,
- 0x80, 0x38, 0xe8, 0xcf, 0x2a, 0x29, 0x68, 0x2b, 0xa8, 0x1e, 0x00, 0x53,
- 0x76, 0xcb, 0x1c, 0x34, 0x8e, 0x70, 0x27, 0xa8, 0xb2, 0x59, 0x4c, 0xbc,
- 0xd8, 0x38, 0x04, 0xda, 0xa7, 0x3c, 0x04, 0xe4, 0x4e, 0x55, 0xcf, 0x40,
- 0xbc, 0x44, 0x10, 0xee, 0xec, 0xe8, 0x0f, 0x80, 0xb6, 0x23, 0x37, 0xbe,
- 0x82, 0xca, 0xcb, 0x94, 0xd1, 0x6a, 0x85, 0xe1, 0x17, 0x32, 0xc6, 0xa3,
- 0xa3, 0x69, 0xb9, 0x2b, 0xc9, 0x17, 0x36, 0xda, 0x04, 0x94, 0xd0, 0x18,
- 0xa0, 0xb8, 0x4f, 0xb4, 0x68, 0xaf, 0xe1, 0xbd, 0xa5, 0xb7, 0x47, 0x84,
- 0xbe, 0x46, 0x45, 0x55, 0x16, 0x17, 0x8b, 0x2c, 0x79, 0x54, 0xef, 0x29,
- 0x4d, 0x74, 0x49, 0xcb, 0x01, 0xfc, 0xdb, 0x29, 0x72, 0x96, 0x88, 0xf8,
- 0xf8, 0x6d, 0xe3, 0xba, 0xb6, 0x0c, 0x63, 0x04, 0xd2, 0x80, 0xb4, 0x04,
- 0x97, 0x06, 0x6a, 0xc0, 0xda, 0x18, 0x65, 0x04, 0xfc, 0xcb, 0xa5, 0x45,
- 0xf6, 0x4c, 0x06, 0xc4, 0x7d, 0x98, 0xe5, 0x8a, 0xa7, 0x6e, 0xb8, 0x52,
- 0x2e, 0xdb, 0x5d, 0xec, 0x9d, 0x0c, 0xd2, 0xa3, 0xcb, 0xff, 0x0a, 0x95,
- 0x28, 0x3f, 0xa7, 0x10, 0xe5, 0x57, 0xae, 0x44, 0xf1, 0x24, 0x05, 0x89,
- 0x9d, 0x50, 0x4e, 0x20, 0x2d, 0x8a, 0x5c, 0x32, 0x9c, 0x07, 0x75, 0x93,
- 0xda, 0xd6, 0x33, 0x78, 0xab, 0x33, 0x5c, 0xf4, 0x26, 0xb5, 0x73, 0x64,
- 0x3d, 0x0e, 0xa2, 0xfc, 0x91, 0x53, 0xe0, 0xa9, 0xe9, 0x5d, 0x0f, 0xcc,
- 0x4f, 0x46, 0x25, 0xe3, 0xb3, 0x4c, 0x20, 0xba, 0xfe, 0xe0, 0x3a, 0xbf,
- 0xfc, 0xda, 0x06, 0xd8, 0x81, 0xe1, 0xcd, 0x2f, 0x3c, 0x79, 0xfc, 0xa7,
- 0x88, 0x40, 0x0e, 0x9c, 0x96, 0x5c, 0xd7, 0x46, 0xaf, 0xb6, 0x61, 0x30,
- 0x23, 0x4c, 0x2f, 0x7e, 0x61, 0xd0, 0x68, 0x16, 0xf1, 0x4d, 0x65, 0x6f,
- 0x94, 0x16, 0x47, 0x2f, 0xf7, 0x30, 0x38, 0x01, 0x5a, 0x55, 0x83, 0xd8,
- 0xf0, 0xf3, 0x49, 0xd6, 0xdc, 0x90, 0x16, 0x87, 0xdd, 0xd0, 0x6d, 0xf4,
- 0x78, 0x80, 0xe5, 0x87, 0xbd, 0xf9, 0x2e, 0x03, 0xc1, 0x57, 0x26, 0x8e,
- 0xc2, 0x40, 0xbe, 0xd6, 0x33, 0xa2, 0x71, 0xdd, 0xe0, 0xfa, 0xc5, 0x5a,
- 0x39, 0xb9, 0x10, 0x35, 0x7f, 0x9f, 0xf6, 0xc5, 0xcb, 0xc5, 0x6d, 0x55,
- 0x0c, 0x69, 0xe6, 0x92, 0x3c, 0xe8, 0xfb, 0xf8, 0xed, 0x35, 0x96, 0x6b,
- 0x1b, 0xf3, 0x7e, 0xb6, 0xd9, 0x9c, 0x1e, 0xbe, 0xa7, 0x67, 0x49, 0x84,
- 0xd0, 0x2e, 0xde, 0x15, 0xc8, 0xc5, 0x42, 0xc3, 0xbd, 0x5c, 0x86, 0x5d,
- 0x39, 0xf2, 0xdb, 0x74, 0x65, 0x7e, 0x46, 0x21, 0x41, 0x60, 0xca, 0xce,
- 0xb2, 0x58, 0x5e, 0x42, 0x67, 0xf3, 0x3b, 0x71, 0x71, 0x9c, 0x4f, 0xd8,
- 0x26, 0xc1, 0x1a, 0x67, 0xb1, 0xf6, 0x36, 0xb5, 0x20, 0x37, 0xa9, 0x7b,
- 0x4a, 0x83, 0xe0, 0x12, 0x6c, 0xf1, 0x29, 0x4d, 0xd0, 0x09, 0x0b, 0x29,
- 0xdf, 0x0c, 0xa1, 0xc7, 0x5b, 0x6b, 0x2c, 0x47, 0x91, 0x26, 0x97, 0xa4,
- 0x5f, 0xa0, 0x1e, 0xab, 0x3b, 0x7f, 0xc9, 0xe1, 0xd3, 0x96, 0x87, 0x2d,
- 0x27, 0x0f, 0x64, 0x59, 0xe8, 0x32, 0x13, 0xf0, 0x27, 0x7d, 0x45, 0x20,
- 0x90, 0xe5, 0x03, 0xb6, 0x35, 0x6c, 0x5f, 0x64, 0x32, 0x96, 0xc3, 0xd1,
- 0xba, 0xb5, 0x12, 0x7b, 0x88, 0xc4, 0xe6, 0x76, 0xc6, 0x54, 0x17, 0x31,
- 0x7e, 0x75, 0xbe, 0x9b, 0x9c, 0x77, 0xc2, 0x0a, 0x28, 0x4a, 0x22, 0x61,
- 0xea, 0x33, 0x62, 0x69, 0xc5, 0xc7, 0x08, 0x97, 0xfd, 0x2e, 0x68, 0xc5,
- 0x15, 0xb6, 0x58, 0xae, 0x08, 0xfd, 0xfe, 0xe2, 0x8c, 0xa9, 0xb3, 0x96,
- 0x97, 0x28, 0xd2, 0x60, 0x50, 0x10, 0x31, 0x29, 0xfd, 0x5b, 0x6a, 0x4c,
- 0xe8, 0x92, 0x4a, 0xed, 0xb8, 0xf9, 0x95, 0x38, 0xe5, 0xd5, 0x99, 0xbe,
- 0x08, 0x52, 0x1d, 0x19, 0x14, 0x47, 0x33, 0xcf, 0x3d, 0xf8, 0x23, 0x69,
- 0x43, 0x59, 0xb3, 0x5c, 0xea, 0xb4, 0x89, 0xa0, 0x55, 0x5c, 0x66, 0x45,
- 0xd8, 0x75, 0x06, 0x1f, 0x25, 0x41, 0x2e, 0x44, 0x3d, 0x1b, 0x75, 0xd1,
- 0xb3, 0xbd, 0xb0, 0x81, 0x4c, 0x2e, 0x2f, 0x1d, 0x52, 0x7e, 0x0f, 0xc2,
- 0x26, 0x4c, 0xfe, 0x09, 0x0a, 0x00, 0x09, 0x87, 0x0b, 0x48, 0xec, 0x30,
- 0x0a, 0xa6, 0xe5, 0xea, 0x8e, 0xb6, 0xc3, 0x3c, 0x58, 0xd7, 0x57, 0x87,
- 0x86, 0x73, 0x1c, 0x8e, 0x3e, 0x87, 0x89, 0x62, 0x84, 0x75, 0x04, 0x8e,
- 0x97, 0x73, 0x47, 0xa4, 0x5d, 0x6d, 0x67, 0x34, 0xd1, 0xc2, 0x47, 0x4e,
- 0xf1, 0x1f, 0xfe, 0x37, 0xa2, 0xb4, 0xbf, 0xaf, 0xc3, 0xf8, 0xdd, 0x0e,
- 0x08, 0xea, 0x0d, 0x90, 0x34, 0xa9, 0x1d, 0x12, 0x32, 0x0d, 0x26, 0x79,
- 0x83, 0x96, 0x06, 0x6a, 0x43, 0xb6, 0x2f, 0xe6, 0x1b, 0x2e, 0x79, 0x4e,
- 0xf0, 0x5a, 0xb4, 0x26, 0xde, 0xa8, 0xe0, 0xff, 0x8d, 0xbe, 0xa5, 0x03,
- 0x70, 0x6d, 0x12, 0xb2, 0x21, 0xfe, 0x7c, 0xfc, 0xe6, 0xec, 0xfd, 0x71,
- 0xbb, 0x5e, 0xb1, 0x01, 0xe8, 0x16, 0x82, 0xfd, 0xdd, 0xd9, 0x01, 0xd5,
- 0xce, 0x35, 0xf5, 0xcd, 0x8b, 0x9c, 0x8c, 0xfe, 0xe4, 0xfc, 0xbb, 0xd7,
- 0x76, 0x72, 0x39, 0x98, 0x26, 0x26, 0xa5, 0x23, 0x0e, 0x74, 0x9f, 0xbb,
- 0xa2, 0x9d, 0x94, 0x00, 0x6a, 0x06, 0x26, 0xcd, 0xc5, 0xed, 0xf4, 0x90,
- 0x64, 0xc1, 0xa9, 0x31, 0x5a, 0xaa, 0x0f, 0x0c, 0xf5, 0xba, 0xa6, 0xd2,
- 0x7b, 0x3b, 0x6c, 0xa0, 0xf7, 0x42, 0xf4, 0x03, 0x6d, 0x4a, 0x6c, 0x51,
- 0x42, 0x8e, 0x23, 0x30, 0xb9, 0x51, 0x62, 0x3f, 0xe2, 0xbe, 0x42, 0x07,
- 0x2f, 0xd9, 0x40, 0xf8, 0x4a, 0x8c, 0x61, 0x53, 0xdf, 0x7b, 0x8e, 0x83,
- 0xb0, 0xbc, 0x23, 0x87, 0x0b, 0xd1, 0xac, 0xed, 0x3b, 0x36, 0x60, 0xa4,
- 0x3f, 0x09, 0xf7, 0xf8, 0xfb, 0x18, 0x89, 0x90, 0x9b, 0xcf, 0xee, 0xd4,
- 0xbb, 0x03, 0x6f, 0xa6, 0x76, 0xdb, 0x64, 0xc2, 0xdb, 0x7f, 0xd8, 0x4e,
- 0xa4, 0x20, 0x04, 0x0c, 0x8f, 0x61, 0x69, 0x7b, 0xfa, 0x8d, 0xba, 0xfe,
- 0x73, 0xbb, 0xf7, 0xe5, 0x6f, 0xe9, 0xa2, 0xfb, 0xeb, 0xb1, 0x25, 0x74,
- 0x27, 0x49, 0x3d, 0x68, 0x04, 0xbb, 0x66, 0xcc, 0x52, 0xb0, 0x0e, 0x11,
- 0xa7, 0x3a, 0xce, 0x40, 0x70, 0xbc, 0x43, 0xe7, 0x5e, 0xe5, 0xf7, 0xa4,
- 0x52, 0x86, 0x83, 0x88, 0x99, 0x36, 0x4e, 0xe0, 0x58, 0x04, 0x51, 0x77,
- 0x7d, 0x57, 0x34, 0x74, 0x51, 0x99, 0xa7, 0x4c, 0xcb, 0x2a, 0x5e, 0x00,
- 0x06, 0x62, 0x72, 0xb4, 0x5b, 0x03, 0x6b, 0xe2, 0xd9, 0xe3, 0x67, 0x24,
- 0xdc, 0x91, 0xa3, 0x24, 0x3d, 0xd9, 0x04, 0xe1, 0x19, 0xf1, 0x53, 0x9e,
- 0x73, 0x14, 0x39, 0x44, 0xc6, 0x91, 0x2e, 0xda, 0x93, 0x6c, 0xc1, 0x5d,
- 0xe0, 0xc6, 0xde, 0x10, 0x21, 0x98, 0x52, 0xdf, 0x89, 0x11, 0xe6, 0xa2,
- 0xa1, 0x9d, 0xbc, 0xfe, 0x94, 0xec, 0xfc, 0x57, 0x6e, 0x99, 0xe9, 0xaa,
- 0xe3, 0x39, 0xf8, 0x9b, 0x17, 0xeb, 0x80, 0xf2, 0xc9, 0x39, 0xa7, 0x85,
- 0xc2, 0x3a, 0xe0, 0x1c, 0x31, 0x95, 0xb4, 0xf6, 0x11, 0x4d, 0x3c, 0x50,
- 0xb5, 0xa6, 0x5c, 0x91, 0xd2, 0x06, 0xf8, 0x84, 0x48, 0xd7, 0x5e, 0x73,
- 0x58, 0x0f, 0x4e, 0xf2, 0x69, 0x97, 0x2d, 0x84, 0x12, 0x91, 0x76, 0x02,
- 0x98, 0xd8, 0xe2, 0x6e, 0x55, 0xe5, 0x6a, 0x94, 0x7c, 0x28, 0x90, 0x89,
- 0x27, 0x64, 0x27, 0x62, 0x22, 0x2f, 0xcc, 0x0e, 0x18, 0x9a, 0x26, 0x28,
- 0x8f, 0x08, 0x13, 0x02, 0x9f, 0xf3, 0xef, 0x9d, 0xb0, 0xc9, 0x4e, 0x88,
- 0x14, 0xf7, 0xd6, 0xa2, 0x98, 0x0b, 0xdf, 0x7a, 0x13, 0xf6, 0x37, 0xe4,
- 0xfe, 0x6c, 0x44, 0xea, 0x66, 0x39, 0x18, 0x9b, 0x42, 0xe0, 0xd9, 0x62,
- 0x31, 0x64, 0x10, 0x75, 0x82, 0x94, 0x26, 0xe5, 0x9e, 0x8b, 0xa4, 0x91,
- 0xc0, 0xe6, 0x97, 0xe0, 0x07, 0x92, 0x05, 0xb5, 0xde, 0x23, 0xd4, 0x00,
- 0x29, 0xd8, 0x88, 0xa4, 0xbd, 0x6b, 0x64, 0x8d, 0x0a, 0xf7, 0x9c, 0x3f,
- 0x04, 0xbb, 0xf3, 0x77, 0xe5, 0xa7, 0xb1, 0x8e, 0x64, 0x21, 0x2c, 0xe9,
- 0xf4, 0xea, 0xb2, 0x5a, 0x71, 0x57, 0xc4, 0x58, 0xcb, 0x46, 0x4f, 0xeb,
- 0xe6, 0x27, 0x95, 0x24, 0xea, 0xac, 0xe1, 0xa9, 0xf0, 0xab, 0x27, 0xaf,
- 0x5b, 0xdd, 0xd5, 0x69, 0x27, 0x50, 0xe7, 0x16, 0x1f, 0x4e, 0x60, 0x47,
- 0xc9, 0x57, 0x80, 0x1b, 0xe9, 0x24, 0x87, 0x1d, 0xcd, 0x99, 0x18, 0x93,
- 0x3b, 0xf7, 0x9b, 0xf8, 0x70, 0x32, 0x06, 0x6b, 0xaa, 0x3c, 0x82, 0x0e,
- 0x0b, 0x5a, 0x31, 0xa6, 0x68, 0x4e, 0x0d, 0xae, 0x88, 0x1a, 0x2e, 0xb3,
- 0xca, 0x7e, 0x24, 0x4c, 0x92, 0xbc, 0x5a, 0x96, 0x33, 0x2a, 0xea, 0xca,
- 0xee, 0xdd, 0x0b, 0x7a, 0x50, 0xf7, 0x42, 0x6a, 0xe1, 0x6a, 0x7f, 0x5d,
- 0x18, 0xc4, 0x50, 0x29, 0x51, 0x5e, 0x39, 0x8f, 0x35, 0x55, 0xe8, 0x9a,
- 0x41, 0x89, 0x76, 0x29, 0xcd, 0xf8, 0x65, 0x7f, 0x09, 0x45, 0x52, 0x4e,
- 0x1b, 0x6f, 0x05, 0xf4, 0x40, 0x7c, 0x38, 0x66, 0xac, 0x91, 0x95, 0x51,
- 0x81, 0x14, 0x2c, 0xca, 0xfb, 0x56, 0x46, 0x0f, 0x06, 0xa7, 0x6c, 0x7e,
- 0xe8, 0xb0, 0x67, 0xbd, 0x23, 0xe6, 0xc3, 0x89, 0x0f, 0xd7, 0x3e, 0x60,
- 0x3d, 0x61, 0xcc, 0x21, 0x76, 0xc0, 0x82, 0x61, 0x1d, 0x6a, 0x58, 0xce,
- 0x3e, 0xe6, 0xdd, 0xb1, 0x0f, 0xf6, 0x1e, 0xb0, 0x7c, 0x23, 0xd8, 0x85,
- 0x45, 0x61, 0xb4, 0xbb, 0x75, 0x35, 0xcd, 0x3e, 0x62, 0x6e, 0x4d, 0x5a,
- 0x5d, 0x66, 0xcd, 0xc7, 0xcd, 0x1b, 0xb2, 0x10, 0x34, 0x85, 0xbb, 0x25,
- 0xda, 0x8c, 0x5b, 0x5e, 0x21, 0xf8, 0xb2, 0xa9, 0xa0, 0x0b, 0x18, 0x05,
- 0x8f, 0x5b, 0xb9, 0x37, 0xfd, 0x1b, 0xe2, 0x7d, 0x8f, 0x31, 0x69, 0xd9,
- 0x30, 0x5b, 0x95, 0x79, 0x61, 0x1b, 0xc7, 0x80, 0xc7, 0x78, 0x73, 0x8c,
- 0x21, 0x2f, 0x6d, 0x0a, 0x57, 0x2d, 0x3f, 0x51, 0x89, 0x95, 0x55, 0x02,
- 0x3e, 0x46, 0x9a, 0x83, 0x78, 0x8b, 0xe3, 0xa7, 0xf5, 0xb4, 0x79, 0x49,
- 0x52, 0x42, 0x68, 0x9b, 0xd1, 0xfa, 0x07, 0x4d, 0x45, 0xc5, 0x3d, 0xb3,
- 0xf1, 0x3f, 0x68, 0x6f, 0x64, 0x77, 0x76, 0xab, 0x9b, 0x99, 0x05, 0xb2,
- 0xb9, 0x71, 0x17, 0x48, 0x45, 0x3b, 0x32, 0x9b, 0xb5, 0xe1, 0x33, 0x65,
- 0x30, 0xf1, 0x60, 0x73, 0x45, 0xc0, 0xee, 0xfd, 0x74, 0xd1, 0x84, 0xfa,
- 0x4f, 0xf0, 0xf1, 0x0a, 0x9d, 0xab, 0x65, 0x77, 0xe5, 0x30, 0xfa, 0xb7,
- 0x46, 0x9e, 0x76, 0x53, 0x64, 0xee, 0x6e, 0xe9, 0xbf, 0xac, 0x22, 0x7b,
- 0xb4, 0x81, 0xdd, 0xc9, 0x67, 0xbb, 0x0c, 0x6f, 0x96, 0x91, 0x5b, 0x96,
- 0x29, 0x01, 0x39, 0x5b, 0xf7, 0xdf, 0x2b, 0x9e, 0x79, 0xef, 0x1e, 0x57,
- 0xcb, 0x7b, 0xae, 0xb8, 0x79, 0xc0, 0xad, 0x8a, 0x91, 0x38, 0xec, 0xaa,
- 0x82, 0x5b, 0x29, 0x8d, 0xad, 0x7b, 0x76, 0xbe, 0x6f, 0x06, 0x2d, 0x1a,
- 0xec, 0x9f, 0x89, 0x3c, 0x19, 0x9d, 0x8e, 0xdb, 0x5c, 0x73, 0xba, 0xd5,
- 0x9d, 0x9b, 0x59, 0x7c, 0x38, 0x99, 0xae, 0x7b, 0x4b, 0xb6, 0x67, 0xe0,
- 0xf9, 0x2e, 0xb9, 0x93, 0x88, 0x31, 0x1b, 0x43, 0xda, 0xd0, 0xeb, 0xfd,
- 0x93, 0xd8, 0x03, 0xd9, 0xe7, 0x8b, 0xc2, 0xb7, 0xc8, 0xe9, 0x8b, 0x46,
- 0xf2, 0x6e, 0x28, 0x65, 0xf1, 0x22, 0xd6, 0xf6, 0xb8, 0xb9, 0x97, 0x30,
- 0xe2, 0xae, 0x48, 0xc8, 0x43, 0xa2, 0x2a, 0x1a, 0x51, 0x89, 0x92, 0x0a,
- 0xc0, 0xb8, 0x19, 0xb5, 0xf8, 0x08, 0xf3, 0xe6, 0x13, 0xfe, 0x66, 0xc2,
- 0x79, 0x5b, 0x0c, 0x84, 0x4c, 0xb1, 0x43, 0x51, 0x43, 0xb4, 0x57, 0x71,
- 0x9d, 0x89, 0x9d, 0x20, 0x8f, 0x73, 0xd7, 0x90, 0xb0, 0x41, 0x73, 0x27,
- 0x79, 0xae, 0x1e, 0x05, 0x70, 0xdb, 0xd9, 0xe5, 0xcc, 0x6f, 0x77, 0xee,
- 0x2d, 0xbf, 0x1a, 0xf0, 0x16, 0x5c, 0x9a, 0xc5, 0xe3, 0x8f, 0x68, 0x91,
- 0x48, 0xa2, 0x86, 0x24, 0x50, 0x0f, 0x76, 0x93, 0xf7, 0x12, 0xda, 0x24,
- 0xa5, 0xee, 0xae, 0xc1, 0x04, 0xcd, 0x00, 0x3b, 0xf9, 0xc8, 0x08, 0x43,
- 0x2e, 0x0a, 0x20, 0x05, 0x89, 0x10, 0xf9, 0x63, 0x81, 0xe2, 0x5d, 0x8d,
- 0x14, 0x2b, 0x04, 0xd8, 0xde, 0xc1, 0xe8, 0x60, 0x90, 0x58, 0xdb, 0xd3,
- 0xd3, 0x9d, 0x91, 0xbc, 0x28, 0x58, 0xe0, 0xf4, 0xe9, 0xae, 0x9f, 0xe1,
- 0x3d, 0x7d, 0xb8, 0x0e, 0xbd, 0xc2, 0x70, 0x2d, 0x3b, 0x83, 0xe5, 0x26,
- 0xbd, 0x0b, 0x15, 0xd3, 0xfd, 0xe1, 0xa3, 0x67, 0xcf, 0x5a, 0xf2, 0xbc,
- 0xf6, 0x70, 0xd4, 0x1f, 0xef, 0xef, 0x63, 0x6d, 0x41, 0x4d, 0xb4, 0xf9,
- 0xc5, 0xf0, 0x19, 0x5e, 0x6c, 0xbf, 0x56, 0x67, 0xe6, 0x08, 0x66, 0xfd,
- 0xef, 0x0d, 0xe9, 0x37, 0x91, 0xcf, 0xc1, 0x9f, 0xd2, 0xfb, 0xd6, 0x33,
- 0xfa, 0x5c, 0xe4, 0x2d, 0x3c, 0xcc, 0xdb, 0x58, 0xce, 0xe7, 0xe4, 0xc9,
- 0xa2, 0x27, 0x15, 0x99, 0xe7, 0x26, 0xad, 0x66, 0xe1, 0x72, 0xf7, 0x07,
- 0xc3, 0x83, 0xbe, 0xe5, 0x22, 0x9a, 0x8c, 0x04, 0x38, 0x3a, 0x4f, 0x32,
- 0x14, 0x8d, 0x01, 0xc2, 0x05, 0x42, 0xdd, 0x81, 0x0e, 0xcc, 0x8c, 0x0e,
- 0x9e, 0x3d, 0x1b, 0xd0, 0xcc, 0x1e, 0x3f, 0x7b, 0xd6, 0x5b, 0x10, 0xee,
- 0x7d, 0xe6, 0xa6, 0x74, 0xee, 0x27, 0x7a, 0xdd, 0x11, 0x4d, 0x4d, 0x76,
- 0x4e, 0xfc, 0x3b, 0xf4, 0x9b, 0x2f, 0x92, 0x77, 0x67, 0x17, 0xc7, 0x9e,
- 0x63, 0x06, 0xd7, 0x8b, 0x23, 0x86, 0x5e, 0x8a, 0x28, 0x42, 0xb0, 0x2b,
- 0xb4, 0xf2, 0x82, 0xe1, 0x4b, 0x36, 0x49, 0x68, 0x4c, 0xa2, 0x58, 0x45,
- 0x7d, 0x82, 0xff, 0x16, 0x66, 0x44, 0x90, 0x71, 0x3c, 0xcb, 0x2f, 0xf3,
- 0xc6, 0x87, 0x6d, 0xda, 0x31, 0xa7, 0xbd, 0x0b, 0x17, 0x07, 0x27, 0xba,
- 0x49, 0x34, 0x65, 0xbb, 0xa6, 0xf2, 0x0e, 0xce, 0x84, 0xdd, 0x26, 0x6b,
- 0x6a, 0x3b, 0x28, 0xb0, 0xc8, 0x16, 0xb3, 0x5a, 0x05, 0x21, 0x3f, 0x3e,
- 0xc4, 0x83, 0x72, 0x5b, 0x60, 0xae, 0x72, 0x8f, 0xf7, 0x14, 0xa0, 0x96,
- 0xfc, 0xe9, 0xfe, 0x78, 0x0a, 0xdc, 0x59, 0x48, 0xc4, 0xd0, 0xc2, 0x2c,
- 0x1a, 0xc7, 0x4f, 0x95, 0xdd, 0xae, 0x9d, 0xcb, 0xd3, 0x7a, 0xe7, 0x0a,
- 0x3a, 0x87, 0x00, 0x8f, 0x90, 0x9d, 0xf8, 0xb3, 0x6c, 0xa5, 0x29, 0xa5,
- 0x45, 0x7b, 0x1c, 0x43, 0xcb, 0xf3, 0xfc, 0x72, 0x5d, 0xc5, 0xd3, 0x2f,
- 0xff, 0xe2, 0xca, 0x84, 0xb4, 0x69, 0x40, 0x7a, 0x93, 0x6a, 0x79, 0x12,
- 0x1a, 0x3d, 0xe8, 0xbd, 0x56, 0x23, 0x58, 0xcb, 0x81, 0xd0, 0xd2, 0x21,
- 0xb0, 0xa4, 0xc9, 0x3b, 0x31, 0x37, 0x9a, 0x0c, 0x39, 0x09, 0xb4, 0x6d,
- 0xa7, 0x34, 0x2f, 0x48, 0x1b, 0x57, 0x96, 0x25, 0x2e, 0x44, 0x3a, 0x6f,
- 0x12, 0xa7, 0xa9, 0x6c, 0x41, 0x98, 0x53, 0xb7, 0xbd, 0x70, 0xbe, 0x7b,
- 0x7a, 0x12, 0xde, 0x96, 0xab, 0xd2, 0x6b, 0x13, 0x12, 0x82, 0x36, 0x08,
- 0x28, 0x0d, 0xb8, 0x0f, 0x1f, 0xd1, 0xcc, 0xa8, 0xd0, 0x8b, 0x32, 0xa5,
- 0x63, 0x54, 0xcf, 0x09, 0x47, 0xd3, 0x59, 0x3b, 0x60, 0xc4, 0x31, 0x3d,
- 0xdb, 0x20, 0xab, 0x83, 0x8e, 0x5a, 0x4e, 0x99, 0xb0, 0xbc, 0x1d, 0xa8,
- 0x08, 0x88, 0xd4, 0x73, 0x83, 0x30, 0x9f, 0x32, 0x1f, 0x61, 0x84, 0x8c,
- 0xdd, 0x51, 0x12, 0x9a, 0xbd, 0x44, 0xf0, 0x7c, 0x5a, 0xb6, 0xcf, 0x05,
- 0xfa, 0x9d, 0x92, 0x90, 0xa4, 0x09, 0xab, 0x38, 0x1e, 0x9f, 0xfc, 0xf7,
- 0xe3, 0x5f, 0x33, 0xea, 0x54, 0xa5, 0x37, 0xb6, 0x70, 0xf0, 0x3b, 0x06,
- 0xac, 0x94, 0x68, 0x90, 0x45, 0xaa, 0x48, 0x17, 0x62, 0xc4, 0x53, 0x4f,
- 0x4d, 0x48, 0x0f, 0xc4, 0x15, 0xa5, 0x9d, 0xb1, 0x21, 0xac, 0x90, 0xb6,
- 0xc9, 0x6b, 0x46, 0xf0, 0x0a, 0xea, 0x34, 0x44, 0x32, 0x3a, 0x4a, 0xbe,
- 0xd8, 0x09, 0xc8, 0x07, 0xb9, 0x84, 0x2b, 0x11, 0x96, 0x3d, 0x79, 0x7b,
- 0x19, 0x51, 0x2a, 0x0c, 0x17, 0x00, 0x12, 0x91, 0x26, 0x65, 0xe6, 0x7a,
- 0x4f, 0x4f, 0x42, 0xbf, 0xd2, 0x3e, 0xe3, 0xf6, 0x0d, 0x14, 0xa0, 0xaa,
- 0x92, 0x17, 0x1f, 0xde, 0x9f, 0xf6, 0x94, 0x4b, 0x8e, 0x71, 0x06, 0xb4,
- 0x59, 0x5b, 0xef, 0x33, 0xa0, 0x99, 0x55, 0xc9, 0x79, 0x7a, 0x99, 0x6d,
- 0xf9, 0x00, 0x72, 0xaa, 0x2a, 0x62, 0xf9, 0xe2, 0x7f, 0x88, 0xb9, 0x53,
- 0xfc, 0xb6, 0x1b, 0xc4, 0xc4, 0x5d, 0x58, 0xd8, 0xaf, 0x71, 0x9c, 0x2f,
- 0x52, 0xd9, 0xbb, 0x75, 0x45, 0x01, 0x7d, 0xec, 0x7c, 0xa4, 0x95, 0x14,
- 0xbf, 0xde, 0x46, 0xfd, 0x74, 0x19, 0xa6, 0x14, 0x09, 0x22, 0x3f, 0x59,
- 0xb2, 0xf5, 0x47, 0x72, 0xbf, 0x6f, 0x79, 0x48, 0x97, 0xc3, 0x2c, 0x0c,
- 0xb2, 0xe9, 0x56, 0x30, 0x46, 0xa1, 0x75, 0x45, 0xb1, 0x2b, 0xbf, 0xe5,
- 0xbe, 0xaf, 0xe5, 0x82, 0xad, 0xaa, 0x8c, 0xf0, 0x78, 0x91, 0xc1, 0x1b,
- 0xb4, 0x0a, 0xe3, 0xb4, 0x63, 0x86, 0x60, 0x25, 0xfb, 0xef, 0x54, 0xe6,
- 0xf7, 0x5c, 0x22, 0x2d, 0xac, 0x06, 0xd9, 0xa9, 0x49, 0x9c, 0x5a, 0x7b,
- 0x2c, 0xc5, 0x16, 0x9b, 0x2e, 0xa8, 0x21, 0x0e, 0x7b, 0xbf, 0x24, 0xf4,
- 0x3e, 0x2b, 0xa9, 0x89, 0x0a, 0xcd, 0x27, 0x2d, 0xac, 0x3f, 0xb9, 0x75,
- 0xb2, 0xbf, 0x3a, 0xd4, 0xa1, 0x0b, 0x00, 0xbd, 0x1c, 0x48, 0x97, 0xa7,
- 0xa1, 0xa1, 0x8e, 0x42, 0x2a, 0xe1, 0xbd, 0x63, 0xf5, 0x68, 0xef, 0x3f,
- 0xbc, 0xd6, 0x21, 0x5e, 0xf3, 0x8f, 0x1e, 0xc4, 0x5c, 0x6f, 0xba, 0x0d,
- 0xaa, 0x54, 0x40, 0x30, 0x41, 0xfb, 0x11, 0x57, 0x30, 0x2b, 0xd2, 0x32,
- 0xea, 0xce, 0x1f, 0x3a, 0xa5, 0xe9, 0x15, 0x57, 0x6e, 0x0e, 0x5f, 0xe7,
- 0x46, 0x86, 0xd4, 0x0c, 0x40, 0x04, 0x25, 0x97, 0x6b, 0x0f, 0xf5, 0x1a,
- 0xc2, 0x37, 0x92, 0x05, 0xe9, 0x0a, 0x1c, 0x25, 0x41, 0xe2, 0xb3, 0x7d,
- 0xc7, 0x86, 0x6c, 0x0c, 0x45, 0xdc, 0xeb, 0x2c, 0xf6, 0x14, 0x86, 0xd4,
- 0xf9, 0x2b, 0xb0, 0x6d, 0xda, 0xc3, 0x80, 0x6f, 0x87, 0x91, 0x08, 0x91,
- 0xdd, 0x51, 0x58, 0x20, 0x64, 0xcd, 0x38, 0xbc, 0x1e, 0xe9, 0xc1, 0x14,
- 0x98, 0x9a, 0xb6, 0x73, 0x39, 0x4b, 0xa5, 0x80, 0xc4, 0x28, 0x2f, 0xc5,
- 0x36, 0xc2, 0xe1, 0xd8, 0x09, 0x83, 0xf0, 0x71, 0x69, 0xea, 0xd4, 0x0c,
- 0x6c, 0xe3, 0xe6, 0xda, 0x97, 0x59, 0x9a, 0xf8, 0xc4, 0x05, 0xee, 0x5d,
- 0x6b, 0x55, 0x48, 0x1a, 0xf5, 0x09, 0x8f, 0x62, 0x03, 0x45, 0x29, 0x08,
- 0x2f, 0xb1, 0x10, 0x3a, 0xf2, 0x77, 0xcc, 0x13, 0x9e, 0x0c, 0xe4, 0x7c,
- 0x8d, 0xe4, 0xf7, 0x43, 0xd7, 0x79, 0x63, 0xe7, 0x2e, 0x33, 0xfa, 0xb5,
- 0x05, 0xd5, 0x52, 0x43, 0x2a, 0x52, 0xfd, 0x99, 0x70, 0x77, 0xd0, 0xba,
- 0x55, 0x98, 0x02, 0x13, 0xc4, 0x8b, 0x2c, 0xf2, 0x96, 0x1b, 0x2d, 0x00,
- 0x89, 0x96, 0x45, 0x76, 0x4b, 0x18, 0xe0, 0xfd, 0xc3, 0x85, 0x4a, 0xf6,
- 0x77, 0x2f, 0xdf, 0xbf, 0x3b, 0x79, 0xf7, 0xd5, 0xf3, 0xe4, 0xf8, 0x36,
- 0xab, 0xa6, 0xd4, 0x89, 0xf9, 0x6f, 0xeb, 0x59, 0x3e, 0x05, 0x9b, 0x90,
- 0x06, 0xc1, 0x7e, 0xc8, 0xdb, 0x58, 0x01, 0x99, 0xf8, 0x57, 0x49, 0xe0,
- 0x06, 0x85, 0x30, 0x92, 0xcb, 0x4b, 0xc0, 0x11, 0xc6, 0x8a, 0x2a, 0x2f,
- 0xd7, 0x1e, 0xf9, 0x4c, 0xb9, 0xa5, 0x21, 0x62, 0x01, 0x88, 0x91, 0x5e,
- 0xc9, 0x5e, 0x93, 0xd3, 0x35, 0x79, 0x7d, 0x7a, 0xda, 0xd3, 0x1f, 0x9a,
- 0xa7, 0xcf, 0xa5, 0xbe, 0x18, 0xc2, 0xe6, 0x9b, 0x52, 0x2c, 0xcf, 0x88,
- 0x7f, 0xe2, 0x35, 0x2d, 0x86, 0x07, 0x30, 0xb0, 0xef, 0xc2, 0x4c, 0x4e,
- 0xa4, 0x19, 0x23, 0x39, 0x10, 0x27, 0x9c, 0x57, 0x33, 0xd8, 0x42, 0x86,
- 0x43, 0x96, 0xf3, 0x86, 0xf4, 0xa3, 0x96, 0x24, 0x6d, 0xf7, 0x05, 0xda,
- 0x94, 0x14, 0xc6, 0x31, 0xa3, 0x36, 0x4e, 0x94, 0x84, 0x24, 0x91, 0xb3,
- 0x6a, 0x08, 0x92, 0x15, 0x43, 0x34, 0x93, 0x42, 0xaa, 0x59, 0x90, 0x50,
- 0x9b, 0xda, 0xce, 0xe6, 0x35, 0x71, 0xcb, 0x90, 0x5d, 0xdc, 0x64, 0x95,
- 0x98, 0x9e, 0xb6, 0x88, 0xd8, 0x30, 0xbb, 0x51, 0x32, 0x2e, 0xcd, 0xf3,
- 0x91, 0xaa, 0x05, 0xed, 0xb8, 0xe8, 0xba, 0xaa, 0xa6, 0x8d, 0xa4, 0xd0,
- 0xda, 0xbc, 0x2a, 0x34, 0xa3, 0x42, 0xcc, 0xad, 0xbd, 0xde, 0x48, 0xbf,
- 0x67, 0xa2, 0xff, 0x49, 0x66, 0x15, 0x8a, 0x3b, 0x0d, 0xed, 0x10, 0x91,
- 0x6c, 0x0d, 0x0d, 0x3b, 0xdd, 0x42, 0x23, 0x3d, 0xea, 0x42, 0xed, 0x8d,
- 0x74, 0x4f, 0x2f, 0x55, 0x3f, 0x4d, 0xbd, 0xbb, 0xe0, 0x7b, 0x5a, 0xd4,
- 0xa9, 0xd5, 0xe9, 0x39, 0x4e, 0xa5, 0x51, 0x98, 0x8d, 0x95, 0x32, 0x4f,
- 0xa2, 0xae, 0x36, 0x59, 0x13, 0x04, 0xc0, 0xcf, 0x6c, 0x0b, 0x48, 0x3c,
- 0xe6, 0x17, 0xca, 0xfb, 0xaf, 0x8b, 0xbc, 0x19, 0x38, 0xef, 0x02, 0x69,
- 0x05, 0x41, 0xb9, 0xb6, 0xb1, 0xf1, 0x46, 0xbb, 0xb1, 0xbc, 0x1a, 0xe1,
- 0x8b, 0x02, 0xe4, 0x9a, 0x5e, 0xbb, 0x7c, 0xaf, 0x5e, 0xce, 0x37, 0xd2,
- 0xfc, 0xf8, 0xae, 0x8c, 0x06, 0xe4, 0x81, 0xe7, 0x0f, 0xe7, 0xe1, 0xc0,
- 0x4c, 0xfc, 0x62, 0x16, 0x2f, 0x5a, 0xe9, 0x70, 0x09, 0xc2, 0xe1, 0xbc,
- 0x82, 0xaf, 0x7e, 0x26, 0x2c, 0x51, 0x9b, 0xbc, 0xb8, 0x2e, 0x3f, 0xb1,
- 0xbc, 0x47, 0xa0, 0x2b, 0x9a, 0xa2, 0x92, 0xf7, 0x96, 0xb5, 0xb0, 0x5f,
- 0x8a, 0x77, 0x55, 0xe6, 0xce, 0x22, 0xcb, 0xab, 0x24, 0x30, 0x8b, 0x91,
- 0x60, 0x8c, 0x2d, 0x01, 0xb4, 0xe2, 0xa9, 0x9b, 0xef, 0xaf, 0x77, 0x69,
- 0xa0, 0x0d, 0xc5, 0x93, 0x6c, 0x51, 0x67, 0x03, 0xaf, 0x1a, 0x50, 0x85,
- 0x8d, 0x4a, 0x1b, 0x24, 0x7f, 0xb2, 0x38, 0xd9, 0x24, 0x49, 0x46, 0xdd,
- 0x8e, 0xa5, 0x1d, 0x23, 0x16, 0xc1, 0x4d, 0x8e, 0x3a, 0x4d, 0xaf, 0xca,
- 0x32, 0x2a, 0xb6, 0x9d, 0x0c, 0x81, 0x4a, 0x03, 0x40, 0x8c, 0x1e, 0xfd,
- 0xc1, 0xc2, 0x87, 0xb9, 0x60, 0x5d, 0x90, 0xe0, 0x6b, 0xa1, 0x06, 0x45,
- 0x1b, 0xf4, 0x00, 0x4a, 0xdb, 0xd2, 0x8d, 0x27, 0x14, 0xc8, 0xe6, 0x58,
- 0xf2, 0x02, 0xff, 0xae, 0x23, 0x8f, 0x9b, 0x16, 0x7a, 0x82, 0xbf, 0x29,
- 0x51, 0x61, 0xc7, 0x09, 0x68, 0x2e, 0x2d, 0x11, 0x74, 0x03, 0xa3, 0xa9,
- 0x68, 0x07, 0x34, 0x30, 0xcf, 0xbc, 0x01, 0x03, 0xf9, 0xfd, 0xe1, 0x7e,
- 0x1f, 0x93, 0x67, 0x35, 0x56, 0xab, 0x5c, 0xe9, 0x3a, 0x5a, 0xe3, 0x9c,
- 0x05, 0xa1, 0x2b, 0x0c, 0x20, 0x01, 0xb2, 0x5e, 0x25, 0x68, 0x7d, 0x45,
- 0x4d, 0xf0, 0x7a, 0xf6, 0x7f, 0xf4, 0x5b, 0xf4, 0x3e, 0x74, 0xfc, 0xeb,
- 0xbd, 0x77, 0xc6, 0x34, 0x52, 0xb4, 0xbc, 0x96, 0x79, 0x89, 0xe7, 0x2a,
- 0xf1, 0x74, 0x76, 0xa7, 0x37, 0xc0, 0xb2, 0x07, 0xb3, 0xe3, 0x1c, 0x83,
- 0x3c, 0x64, 0xc9, 0xc6, 0xa6, 0x5d, 0xae, 0x22, 0x0c, 0xcb, 0x5e, 0x02,
- 0xcd, 0x52, 0x49, 0x1d, 0xda, 0x65, 0xfa, 0xc9, 0xf6, 0xee, 0x0b, 0xd1,
- 0x57, 0x84, 0x93, 0xb2, 0x31, 0x9e, 0x4a, 0xb6, 0x26, 0x76, 0x84, 0xbe,
- 0xd4, 0x16, 0x8c, 0xc8, 0x3a, 0x1b, 0x46, 0xbd, 0xfd, 0x8a, 0x59, 0x13,
- 0x82, 0x9f, 0xc1, 0x92, 0x72, 0x60, 0xf8, 0x5b, 0xfc, 0xfa, 0x56, 0xb2,
- 0x43, 0x5c, 0x75, 0x57, 0xb5, 0xd7, 0xb0, 0xfe, 0xd9, 0xd5, 0xd4, 0x81,
- 0xfd, 0xa6, 0x75, 0x90, 0x39, 0x0b, 0xed, 0x35, 0x31, 0x46, 0x5e, 0x65,
- 0x14, 0x00, 0x6a, 0xf9, 0x26, 0x95, 0x83, 0xf3, 0xf5, 0x22, 0x66, 0xe6,
- 0xe0, 0x66, 0xdb, 0x66, 0xac, 0x79, 0x5d, 0xaf, 0xb5, 0x97, 0x80, 0xc3,
- 0x99, 0x11, 0xd0, 0xc1, 0x85, 0x99, 0x11, 0x0a, 0x5a, 0x16, 0xdc, 0xe2,
- 0x2c, 0x4a, 0xb9, 0x70, 0x0d, 0x73, 0x03, 0x73, 0x51, 0x30, 0xd9, 0x8a,
- 0xe2, 0xb9, 0x69, 0x17, 0x3a, 0xdb, 0x46, 0x8d, 0xb6, 0x80, 0xba, 0xb3,
- 0xe7, 0x41, 0xd2, 0xe0, 0xd6, 0xd9, 0xf9, 0xc5, 0xc9, 0xd9, 0xbb, 0x71,
- 0xf2, 0x5f, 0xb7, 0x36, 0x96, 0x77, 0xb5, 0x81, 0x95, 0xbf, 0x1f, 0xb8,
- 0x33, 0x49, 0x5e, 0x88, 0x9f, 0xa1, 0xcf, 0x36, 0xf6, 0x34, 0xf8, 0xa9,
- 0x91, 0xde, 0x86, 0xbd, 0xea, 0x9b, 0x82, 0xed, 0x26, 0x87, 0xd5, 0x41,
- 0x32, 0x08, 0xb4, 0x65, 0x1f, 0xf6, 0xc1, 0xb7, 0xa1, 0x99, 0xd7, 0x3b,
- 0x93, 0xa5, 0x33, 0x7a, 0x0f, 0x07, 0x66, 0x2c, 0x92, 0x96, 0xfd, 0x82,
- 0xbd, 0x93, 0xb7, 0xb0, 0xcd, 0x37, 0xa4, 0x9b, 0xe2, 0xc1, 0x1d, 0xe6,
- 0x9a, 0xa2, 0x68, 0xd5, 0x61, 0x86, 0xe0, 0x57, 0xc7, 0x17, 0xbb, 0x52,
- 0xe8, 0x6a, 0xe7, 0x07, 0x4f, 0x97, 0xa8, 0x3d, 0xa9, 0xd5, 0xcc, 0xb4,
- 0xb4, 0x95, 0x81, 0xdc, 0x8c, 0xf6, 0xbc, 0x48, 0x8b, 0x68, 0x09, 0x1b,
- 0x69, 0xb4, 0xaf, 0xcc, 0x76, 0x10, 0x1f, 0x56, 0x8e, 0xac, 0xde, 0x13,
- 0xaf, 0x7f, 0x0e, 0xe3, 0x32, 0x9d, 0x7f, 0xb8, 0xc0, 0x80, 0xaf, 0x8f,
- 0x4f, 0x8f, 0x2f, 0x8e, 0xbb, 0x96, 0xfb, 0x84, 0xc1, 0x2c, 0x51, 0xea,
- 0xd2, 0x64, 0xd3, 0xab, 0xa2, 0x5c, 0x94, 0x97, 0xb9, 0x34, 0x7c, 0x4d,
- 0xbe, 0xcb, 0x26, 0xaf, 0x5f, 0x7e, 0x4b, 0xfa, 0x04, 0x79, 0x9c, 0xce,
- 0xdf, 0x9f, 0x9d, 0xbf, 0x39, 0x79, 0xf7, 0x7a, 0x90, 0xbc, 0x3a, 0x3b,
- 0xff, 0xcb, 0x20, 0x79, 0x7b, 0xf6, 0xed, 0x71, 0x24, 0xc5, 0x99, 0x10,
- 0x6e, 0x03, 0x8a, 0xb1, 0xad, 0xfa, 0x58, 0x9c, 0xb1, 0xe9, 0x8d, 0x36,
- 0xef, 0x1d, 0x31, 0x42, 0x35, 0x00, 0x75, 0x29, 0xfc, 0xd6, 0xec, 0xdd,
- 0x20, 0xf9, 0xfa, 0xf8, 0xe5, 0xeb, 0x41, 0x00, 0x60, 0x3e, 0xe6, 0x55,
- 0xd1, 0xea, 0xec, 0x92, 0x01, 0x7b, 0xcd, 0xd6, 0x07, 0x74, 0x04, 0x0e,
- 0x72, 0xf1, 0x95, 0x35, 0x04, 0x8b, 0x22, 0xfd, 0x59, 0x5f, 0xe6, 0x84,
- 0x20, 0xf1, 0xf7, 0xb6, 0x58, 0x6e, 0x95, 0x5d, 0x40, 0x5d, 0xf3, 0x15,
- 0x6d, 0x81, 0x6b, 0x42, 0x66, 0xbd, 0xd6, 0x61, 0xd9, 0xe3, 0xee, 0x41,
- 0x0c, 0x1a, 0xb4, 0x90, 0x02, 0xc0, 0x8e, 0xd8, 0xf5, 0x98, 0x4a, 0x47,
- 0x43, 0xf4, 0x2c, 0x32, 0x66, 0x12, 0x69, 0xd5, 0x73, 0x87, 0x12, 0x1b,
- 0xd7, 0xb0, 0x55, 0x45, 0x28, 0x15, 0x4c, 0x5d, 0x80, 0x9b, 0x68, 0xfb,
- 0x74, 0x8b, 0x6c, 0x53, 0xcf, 0xef, 0xf9, 0xc7, 0x2a, 0x63, 0x83, 0x4a,
- 0xeb, 0xb9, 0x21, 0xcc, 0x8c, 0x53, 0xa6, 0x70, 0x46, 0xce, 0x2d, 0x90,
- 0x0c, 0x4f, 0xd4, 0x29, 0xb1, 0x49, 0xc1, 0x92, 0xcb, 0x22, 0x8e, 0x19,
- 0x00, 0x45, 0xa9, 0xc3, 0xaa, 0xcd, 0x23, 0xf4, 0x12, 0xea, 0xbd, 0x9b,
- 0x07, 0x7c, 0x8d, 0xf4, 0x7d, 0x7b, 0xc6, 0x03, 0xdb, 0x4f, 0x5b, 0x9c,
- 0x38, 0xfe, 0xbe, 0x20, 0xfb, 0xb6, 0xed, 0xcf, 0x32, 0x12, 0x36, 0x10,
- 0x2e, 0xf4, 0x98, 0xe1, 0x24, 0x85, 0x38, 0x44, 0x29, 0xf0, 0x36, 0x64,
- 0x4b, 0xda, 0xcf, 0xf9, 0xb5, 0x4d, 0x76, 0x45, 0x35, 0xd5, 0x29, 0x04,
- 0x21, 0x2a, 0x2c, 0xd4, 0x6f, 0x31, 0xe9, 0x0e, 0xfe, 0x68, 0xff, 0xd6,
- 0xf9, 0xd8, 0x49, 0x97, 0xa8, 0x93, 0xa1, 0xe0, 0x7d, 0xa3, 0x78, 0x2f,
- 0xd8, 0xba, 0x9d, 0x37, 0x3d, 0x8c, 0xd1, 0xf7, 0xda, 0xda, 0x8a, 0x7e,
- 0x9b, 0x6d, 0x7e, 0x7a, 0x62, 0xae, 0x43, 0x04, 0x1a, 0x67, 0x56, 0xa2,
- 0x71, 0x34, 0xd2, 0x0c, 0x72, 0x15, 0x25, 0x34, 0x56, 0xf8, 0x61, 0x6a,
- 0xa4, 0x1e, 0xfd, 0x32, 0x3a, 0xac, 0xdf, 0xf3, 0xe9, 0xe0, 0xcc, 0xde,
- 0x1f, 0x5f, 0xbc, 0x1f, 0x25, 0x3b, 0x3e, 0xe6, 0xeb, 0x93, 0xd1, 0x7e,
- 0x18, 0xb4, 0xa1, 0x26, 0xee, 0xbb, 0x89, 0xf7, 0x59, 0xf7, 0x5d, 0xf4,
- 0x77, 0xdf, 0xfc, 0xdd, 0x30, 0x8f, 0xd8, 0x43, 0x7a, 0xda, 0x8f, 0x7d,
- 0xcf, 0x6f, 0x14, 0xdf, 0x5a, 0x25, 0xfd, 0x62, 0xc3, 0xd7, 0xbe, 0x3e,
- 0x3e, 0x3d, 0x0f, 0x57, 0xf9, 0xed, 0xfb, 0x37, 0x7f, 0x69, 0xaf, 0xf2,
- 0xe8, 0x51, 0xe4, 0xab, 0xbf, 0xa4, 0x43, 0x3d, 0xab, 0xcb, 0x85, 0xd1,
- 0x57, 0x50, 0xc5, 0x81, 0x22, 0x8e, 0xe7, 0x46, 0x00, 0x50, 0xae, 0xf9,
- 0x5f, 0x07, 0xf2, 0x97, 0x1f, 0x47, 0xa3, 0xd1, 0x9f, 0x42, 0x54, 0x74,
- 0xf8, 0x68, 0xdc, 0x7a, 0xe5, 0xe1, 0xae, 0x09, 0x8e, 0xaa, 0x19, 0x94,
- 0x09, 0x51, 0xe4, 0x62, 0x95, 0xe6, 0x15, 0x95, 0x3c, 0xc6, 0x04, 0x2e,
- 0xad, 0xc8, 0x15, 0x7a, 0x59, 0x6d, 0x4e, 0x00, 0xc1, 0xf8, 0xb2, 0xee,
- 0xd4, 0xbb, 0x52, 0x55, 0xed, 0xd5, 0x93, 0xa4, 0xb3, 0xc0, 0x11, 0xc2,
- 0xcd, 0x51, 0xf0, 0xd9, 0x8a, 0x1c, 0xb4, 0xac, 0x68, 0x3a, 0x41, 0x5b,
- 0xa8, 0xf0, 0x90, 0xe5, 0xcf, 0xec, 0xf4, 0x63, 0xde, 0x0b, 0xae, 0x93,
- 0x7c, 0x25, 0x11, 0x75, 0xd8, 0x5f, 0x90, 0x28, 0xe8, 0x33, 0x9b, 0x35,
- 0xd3, 0x3d, 0x5a, 0x64, 0x1d, 0xf4, 0x42, 0x62, 0x25, 0x2e, 0x74, 0x22,
- 0x09, 0xd6, 0x8a, 0x57, 0x42, 0xcb, 0xd9, 0x2d, 0x5e, 0x4d, 0x82, 0xab,
- 0xe2, 0xf5, 0x74, 0x75, 0x75, 0x8e, 0xc4, 0x7a, 0xb8, 0xe8, 0x76, 0xdb,
- 0xca, 0x11, 0xa0, 0xa7, 0x95, 0x75, 0xd3, 0x3a, 0x78, 0x7a, 0x9b, 0x6c,
- 0x40, 0x6a, 0xf4, 0xcd, 0x85, 0x6a, 0xa1, 0xda, 0x0f, 0xee, 0xac, 0x94,
- 0x44, 0x79, 0x14, 0x40, 0x1f, 0x9f, 0xb7, 0x7c, 0x2e, 0xea, 0xa1, 0xf3,
- 0xcf, 0x5c, 0x5b, 0x9f, 0x47, 0x30, 0x9c, 0x04, 0x49, 0x5c, 0x0d, 0x78,
- 0x5a, 0x68, 0x28, 0x0f, 0xff, 0xdc, 0xaa, 0x32, 0xdf, 0xfe, 0xaf, 0xdb,
- 0xa4, 0x0a, 0xe3, 0xed, 0x68, 0x6d, 0xbb, 0xd2, 0x2d, 0x19, 0x36, 0x78,
- 0x2c, 0xa2, 0x37, 0xb8, 0x5d, 0x51, 0xda, 0xb3, 0xe9, 0x52, 0x96, 0x7a,
- 0x64, 0x09, 0xa3, 0xe4, 0xbb, 0x7c, 0x31, 0x9b, 0xa6, 0x15, 0xd2, 0xc3,
- 0x42, 0xf1, 0x2a, 0x54, 0x82, 0xeb, 0x54, 0x97, 0xf8, 0xaa, 0xbb, 0x3b,
- 0xda, 0x4b, 0x26, 0x4e, 0xf3, 0xb1, 0xa2, 0x1f, 0x7b, 0x1e, 0x14, 0xfc,
- 0xee, 0x69, 0xda, 0x25, 0xf4, 0xa3, 0x7b, 0x4c, 0xd2, 0xae, 0xdd, 0xc2,
- 0xa3, 0x7d, 0xb4, 0x1a, 0x87, 0x18, 0x3e, 0x0a, 0x63, 0x29, 0xf9, 0xea,
- 0xfa, 0x11, 0xdc, 0x57, 0x4f, 0x06, 0xfc, 0xaf, 0x27, 0x0c, 0x0e, 0xd9,
- 0x58, 0xe1, 0x8e, 0x6d, 0x65, 0x33, 0x86, 0xb5, 0xfe, 0x93, 0x73, 0xad,
- 0x70, 0xed, 0xf2, 0xc4, 0xb1, 0x44, 0x21, 0x05, 0x1f, 0xc1, 0xcc, 0x52,
- 0x0d, 0x18, 0xf3, 0x8e, 0xce, 0x96, 0xb6, 0xc4, 0xf0, 0xaf, 0xbf, 0x4e,
- 0x2a, 0x82, 0x1d, 0x69, 0xea, 0x1f, 0x37, 0xd5, 0x13, 0x1b, 0x9d, 0xff,
- 0xe9, 0x28, 0xd2, 0x7e, 0xdb, 0x87, 0x3e, 0x77, 0x5f, 0xb2, 0xf9, 0xbe,
- 0xee, 0x73, 0x94, 0xe1, 0x8f, 0xb0, 0x1d, 0x65, 0xfd, 0x6c, 0xfe, 0xd0,
- 0xb3, 0x0d, 0x1f, 0x9a, 0x03, 0xd8, 0x88, 0xce, 0xd4, 0x1a, 0x00, 0x37,
- 0x4a, 0x15, 0x7e, 0x8d, 0x32, 0xf5, 0xd2, 0x7e, 0x34, 0xda, 0x7f, 0x78,
- 0x86, 0xb2, 0xb3, 0xbe, 0xc9, 0xb3, 0x37, 0x93, 0x9f, 0x80, 0x4c, 0x24,
- 0x45, 0xac, 0xec, 0xa3, 0xb9, 0x8d, 0x9d, 0x31, 0x08, 0x36, 0xa7, 0xc5,
- 0xcb, 0xcd, 0xfa, 0x51, 0x22, 0x54, 0x19, 0xe3, 0xb0, 0x0e, 0x76, 0xe0,
- 0xc4, 0xd3, 0xee, 0xf5, 0x26, 0xf0, 0x69, 0x53, 0xea, 0x08, 0x7e, 0x4c,
- 0xf8, 0x0b, 0xca, 0xe7, 0x8e, 0xa9, 0x8e, 0xe9, 0xfd, 0xf1, 0x9b, 0x0f,
- 0xe3, 0xe3, 0xd7, 0x80, 0xdb, 0x8c, 0xf5, 0x53, 0xca, 0xe9, 0x46, 0x73,
- 0x64, 0xa2, 0x29, 0x59, 0xa9, 0x94, 0x89, 0xb4, 0x1b, 0x0e, 0x72, 0x8f,
- 0x4c, 0x28, 0x64, 0x4d, 0x69, 0x0c, 0xe3, 0xb0, 0xee, 0x84, 0x55, 0x39,
- 0x79, 0xf7, 0x27, 0xe0, 0x8e, 0xf0, 0xaa, 0x67, 0x19, 0x35, 0xe7, 0x7a,
- 0xc1, 0x59, 0x30, 0x01, 0xa8, 0xda, 0x5b, 0x2f, 0x8b, 0xbd, 0x5e, 0x64,
- 0xd9, 0x4a, 0x83, 0xfe, 0x5e, 0x37, 0x79, 0x73, 0x3e, 0xea, 0x0f, 0x84,
- 0xf7, 0x19, 0xe3, 0xb2, 0xfa, 0x96, 0xf6, 0x74, 0x92, 0x82, 0xd3, 0x87,
- 0xf2, 0xd5, 0x1d, 0x60, 0x40, 0x77, 0x53, 0x76, 0xf2, 0xc6, 0xaa, 0xf5,
- 0x0a, 0x3f, 0x1e, 0x74, 0xd5, 0x63, 0x38, 0x72, 0x42, 0xe8, 0x31, 0x86,
- 0x11, 0x63, 0x55, 0x92, 0x96, 0x7a, 0x59, 0x56, 0x66, 0xd0, 0xa5, 0x2d,
- 0x56, 0x64, 0x44, 0x87, 0x7a, 0xb7, 0xdb, 0xca, 0xb1, 0x6b, 0xb6, 0x93,
- 0x2d, 0x81, 0x08, 0x78, 0xc6, 0xf5, 0xdb, 0xc4, 0x15, 0x78, 0x9b, 0xe0,
- 0x31, 0xa1, 0xe8, 0x20, 0x8b, 0xb4, 0xb1, 0x54, 0x5d, 0x63, 0x2f, 0x78,
- 0x07, 0x43, 0x73, 0x93, 0xba, 0x8e, 0x74, 0x9d, 0x39, 0xaa, 0xba, 0x6b,
- 0x34, 0x40, 0xa7, 0x4e, 0x33, 0xff, 0x2d, 0xbb, 0xb9, 0x1d, 0x1c, 0xc6,
- 0x6e, 0xc0, 0x32, 0xbd, 0x85, 0x8b, 0xaa, 0x97, 0x1c, 0xc4, 0x61, 0x4b,
- 0x1b, 0x42, 0xcf, 0x55, 0xcc, 0xf3, 0xc1, 0x61, 0x5d, 0xe9, 0x0b, 0x27,
- 0x26, 0xd9, 0xa3, 0x16, 0xff, 0x15, 0x19, 0xde, 0x61, 0xe8, 0x11, 0x50,
- 0x59, 0x32, 0x67, 0x78, 0x09, 0x53, 0x5a, 0x24, 0xd9, 0x6f, 0x3b, 0xdc,
- 0x58, 0x0a, 0x1f, 0xdb, 0xa5, 0x1f, 0x2f, 0x4a, 0x8a, 0x51, 0x2a, 0x31,
- 0xe0, 0xf3, 0x21, 0x64, 0x1f, 0x99, 0x09, 0x15, 0x51, 0x21, 0x32, 0xf0,
- 0x6c, 0xe2, 0x0d, 0x9a, 0xd9, 0xa0, 0x58, 0x8c, 0xf0, 0xcb, 0xd8, 0x05,
- 0x36, 0xb7, 0x3e, 0xb4, 0x4a, 0xde, 0x0c, 0x72, 0x58, 0x75, 0x9c, 0x8c,
- 0x07, 0x18, 0xb4, 0x61, 0x95, 0x65, 0xda, 0xa8, 0xcd, 0x84, 0x9f, 0x80,
- 0x7b, 0xa9, 0x69, 0x8d, 0x7c, 0x44, 0x55, 0x63, 0xb0, 0x01, 0x72, 0x35,
- 0xa2, 0xb6, 0x89, 0x56, 0x04, 0x43, 0x33, 0x2d, 0xfc, 0xc9, 0xe2, 0x04,
- 0xcc, 0x20, 0x79, 0x39, 0x43, 0x55, 0x14, 0x77, 0xe2, 0xe9, 0x81, 0x8f,
- 0x91, 0xd9, 0x6c, 0x93, 0xab, 0xf2, 0x36, 0x5f, 0xae, 0x97, 0x78, 0x7d,
- 0xc0, 0x06, 0xd8, 0x92, 0xa4, 0x96, 0x1e, 0x2a, 0xb2, 0x0b, 0x6d, 0xdb,
- 0xaf, 0x98, 0x33, 0x83, 0x58, 0x1b, 0x88, 0xb6, 0xe1, 0x94, 0x1f, 0x7a,
- 0x8b, 0x5b, 0x6c, 0xe0, 0xa0, 0xfe, 0x97, 0xd3, 0x67, 0xf2, 0xc2, 0x28,
- 0x74, 0x7f, 0x8a, 0x44, 0xa3, 0x53, 0x9f, 0xa7, 0x0a, 0xff, 0x00, 0x65,
- 0x52, 0xaa, 0x73, 0x36, 0xf3, 0x4c, 0x49, 0xa6, 0x38, 0xd2, 0xc4, 0xf8,
- 0x90, 0x7a, 0x39, 0xd4, 0xc0, 0x3a, 0xbe, 0x85, 0xdc, 0x69, 0xa1, 0xce,
- 0xf7, 0xcb, 0x42, 0x49, 0x88, 0x9e, 0xce, 0x4d, 0x3a, 0x8f, 0x04, 0x32,
- 0x5f, 0xe1, 0x19, 0x40, 0xb4, 0xf2, 0xbe, 0xf9, 0xfc, 0xbe, 0x24, 0xc5,
- 0x88, 0x7d, 0x4b, 0x1e, 0x73, 0xd9, 0x65, 0x75, 0x63, 0xb5, 0x7b, 0x85,
- 0xd8, 0x70, 0x20, 0xd8, 0x06, 0x31, 0xb2, 0x0e, 0xbb, 0x64, 0xb5, 0x94,
- 0xa1, 0x90, 0x9e, 0x13, 0x3b, 0xe5, 0xb3, 0x1b, 0x70, 0xb2, 0x26, 0x32,
- 0x34, 0x1f, 0xdd, 0xde, 0x06, 0x14, 0xee, 0x19, 0xc4, 0x8c, 0x37, 0xc9,
- 0xd6, 0xf2, 0xa3, 0x7d, 0x94, 0x39, 0x3e, 0xbe, 0xed, 0x18, 0xcd, 0xa3,
- 0x38, 0x38, 0x24, 0xcb, 0x07, 0x62, 0x91, 0x93, 0x92, 0xa3, 0x70, 0xbc,
- 0x69, 0x69, 0x64, 0x3b, 0x99, 0x3b, 0xdc, 0xa4, 0x39, 0x08, 0x22, 0x48,
- 0x6d, 0x40, 0x2e, 0xa6, 0x6d, 0xf6, 0xaa, 0x51, 0x52, 0x34, 0x2d, 0x34,
- 0x9a, 0x3f, 0x6d, 0xa5, 0xee, 0x93, 0xcd, 0x03, 0x98, 0x95, 0x6b, 0x40,
- 0x61, 0x84, 0xdb, 0x45, 0x5f, 0xe1, 0xdd, 0xa7, 0x2b, 0x65, 0xe4, 0x55,
- 0xbe, 0xa0, 0xd7, 0xf8, 0x62, 0xd7, 0xc9, 0x81, 0x39, 0x85, 0xbc, 0x58,
- 0x37, 0x16, 0xae, 0x0f, 0xdf, 0xb4, 0xb0, 0x33, 0x91, 0xdd, 0x5f, 0x20,
- 0xd1, 0x57, 0x2b, 0xe0, 0xe9, 0xf6, 0xd5, 0x5e, 0x74, 0x90, 0x6f, 0x09,
- 0x34, 0x72, 0xdb, 0xd3, 0xd9, 0x97, 0xb2, 0x31, 0x57, 0x91, 0x0d, 0xc3,
- 0x8a, 0x5c, 0xcd, 0x6e, 0xcd, 0x6e, 0x33, 0x8a, 0x92, 0x27, 0xd8, 0xac,
- 0x48, 0x1b, 0x79, 0x5d, 0x28, 0x22, 0x99, 0x3f, 0x2d, 0x26, 0x6e, 0x9b,
- 0x78, 0x81, 0xcf, 0x95, 0x8d, 0x5c, 0x49, 0xdb, 0x7c, 0x8d, 0xb5, 0xb6,
- 0xf8, 0xd5, 0xe6, 0xfe, 0x69, 0x82, 0x57, 0xf3, 0xe4, 0x89, 0xad, 0x05,
- 0xe6, 0x34, 0xce, 0x72, 0x69, 0x73, 0x36, 0x99, 0xb0, 0xdf, 0xe3, 0xcb,
- 0x2f, 0x29, 0x62, 0xfc, 0x3c, 0x89, 0x69, 0x64, 0x4c, 0x42, 0x0a, 0x4b,
- 0x6d, 0x78, 0x2f, 0x98, 0x01, 0x7c, 0xf6, 0x99, 0x02, 0x72, 0x13, 0x54,
- 0x37, 0x5f, 0x55, 0xc2, 0xb2, 0x87, 0xfb, 0x1d, 0x46, 0x5c, 0x76, 0x1b,
- 0x72, 0xe6, 0x98, 0xaa, 0xf3, 0x1b, 0xb2, 0xa3, 0x3a, 0x25, 0xf8, 0xc9,
- 0x75, 0x73, 0xf5, 0x8f, 0x7c, 0x16, 0x85, 0x52, 0xa2, 0xbb, 0x60, 0x7e,
- 0x6d, 0x0e, 0xad, 0x66, 0xef, 0x97, 0x62, 0x9b, 0x26, 0x3b, 0xf2, 0xda,
- 0xee, 0x20, 0x99, 0xad, 0xe1, 0x92, 0x1b, 0xbf, 0x1c, 0x9f, 0x26, 0xe7,
- 0xa7, 0x2f, 0x4f, 0xde, 0x99, 0x77, 0x86, 0xa1, 0x91, 0x6a, 0x11, 0xcb,
- 0x06, 0x49, 0xb7, 0xc7, 0x18, 0xfc, 0x9d, 0x6d, 0x54, 0xb3, 0xf6, 0x87,
- 0x42, 0x4c, 0xa3, 0x19, 0x84, 0x69, 0xab, 0xf6, 0x60, 0xb8, 0xd6, 0x8c,
- 0xa7, 0x3e, 0x54, 0x1d, 0xbb, 0xa5, 0x9a, 0x26, 0x23, 0x79, 0xa8, 0x5e,
- 0x98, 0x51, 0xee, 0xa2, 0x11, 0x5b, 0xd7, 0x0a, 0x5d, 0x11, 0x5b, 0x8d,
- 0x59, 0xb9, 0x03, 0x6d, 0xe5, 0xc9, 0x9b, 0x39, 0x71, 0xcf, 0x2c, 0x43,
- 0x16, 0xde, 0xd8, 0x40, 0x77, 0xeb, 0xe4, 0xb9, 0xc6, 0x9b, 0x7d, 0x23,
- 0x9f, 0x93, 0x72, 0x43, 0x65, 0x97, 0x44, 0xc6, 0x7a, 0x19, 0xf9, 0x29,
- 0xca, 0x86, 0x13, 0x6b, 0xa4, 0xa1, 0x6a, 0x69, 0xbb, 0x0e, 0x24, 0xf4,
- 0xa4, 0xbc, 0x1d, 0x28, 0x08, 0x0d, 0x96, 0x80, 0xea, 0x26, 0x97, 0xe3,
- 0x70, 0x69, 0xd8, 0x19, 0xa0, 0xa8, 0x78, 0xbc, 0xa6, 0x64, 0x94, 0x5e,
- 0x02, 0xdf, 0x0d, 0x0b, 0x06, 0x96, 0x46, 0xbf, 0x35, 0x03, 0xfa, 0x7e,
- 0xd1, 0x4d, 0x34, 0xf6, 0xa4, 0xd3, 0xcb, 0x1b, 0x34, 0x96, 0x77, 0x75,
- 0x9c, 0x63, 0xe4, 0xd8, 0xda, 0x1c, 0x39, 0xcb, 0x9d, 0xcd, 0x10, 0xa0,
- 0xa3, 0x36, 0x35, 0x6c, 0x04, 0x60, 0x3f, 0xe8, 0x7c, 0xef, 0x61, 0x28,
- 0xb1, 0x3f, 0x19, 0x24, 0x96, 0x51, 0xbb, 0xfb, 0x1a, 0x5f, 0xd6, 0xcf,
- 0xf1, 0x71, 0x87, 0x45, 0x1d, 0x4c, 0x85, 0x71, 0xbd, 0x50, 0xcb, 0xc4,
- 0x1d, 0x4a, 0xd9, 0xb1, 0x14, 0xc1, 0xfe, 0x9a, 0xed, 0x49, 0x6a, 0xdc,
- 0x7d, 0x19, 0x26, 0x0c, 0x3d, 0xab, 0x2b, 0x1f, 0x13, 0xf5, 0x53, 0x07,
- 0xdf, 0x61, 0x0c, 0xc6, 0xca, 0x26, 0xcb, 0x8a, 0x9d, 0x55, 0xe3, 0x69,
- 0x4a, 0x94, 0x6b, 0x84, 0xd2, 0xac, 0x1c, 0xa7, 0x31, 0x5c, 0xbe, 0x19,
- 0x35, 0x40, 0x08, 0xdb, 0x25, 0x70, 0x1a, 0xc2, 0x9c, 0x9b, 0xa4, 0xea,
- 0x0c, 0xbc, 0x31, 0x03, 0x3e, 0xcc, 0x3d, 0x34, 0xaa, 0xe4, 0xef, 0xeb,
- 0x3c, 0x6b, 0x50, 0x8c, 0x38, 0x4a, 0x5e, 0x73, 0xba, 0xa4, 0x74, 0x1a,
- 0xe5, 0x8e, 0xc6, 0x68, 0x7b, 0xcc, 0x10, 0x00, 0xfc, 0x7d, 0x9a, 0x40,
- 0xc0, 0x87, 0xcd, 0x84, 0x50, 0xe5, 0xfa, 0x16, 0xb3, 0x4e, 0x5e, 0xd1,
- 0xb4, 0x97, 0x46, 0x02, 0x02, 0x83, 0xc9, 0x43, 0xd7, 0xd3, 0x7c, 0x1a,
- 0xad, 0x70, 0x41, 0x12, 0x77, 0xfd, 0x29, 0xac, 0x61, 0x19, 0xb4, 0x3a,
- 0xb5, 0xc1, 0x97, 0x22, 0x7c, 0xa9, 0xa1, 0x36, 0x7f, 0x45, 0xba, 0xd8,
- 0xab, 0x9b, 0x19, 0x69, 0x05, 0xeb, 0x62, 0x41, 0xf3, 0xa4, 0x91, 0x7a,
- 0xfa, 0x86, 0x46, 0x70, 0xa8, 0x80, 0x83, 0x43, 0x27, 0xd4, 0x3a, 0x22,
- 0xc9, 0x6d, 0xe9, 0xcb, 0x80, 0xf0, 0xb2, 0x9b, 0x42, 0x50, 0x2c, 0x7f,
- 0xb7, 0x88, 0xe9, 0xf0, 0x7a, 0xb1, 0x97, 0xad, 0x73, 0xdb, 0x04, 0x11,
- 0x72, 0x4d, 0xe7, 0x65, 0x08, 0x6d, 0x52, 0xd6, 0x0a, 0x9e, 0x6e, 0x16,
- 0x69, 0x5e, 0x6f, 0xdd, 0x27, 0x40, 0xd0, 0xdd, 0x8b, 0xf2, 0xd3, 0xf6,
- 0xaa, 0x71, 0xbf, 0xf4, 0x7b, 0xe1, 0x7d, 0xf8, 0x8d, 0xb0, 0xc9, 0xfc,
- 0x4f, 0x06, 0xf8, 0x89, 0x23, 0x98, 0x91, 0x93, 0xc5, 0x26, 0x05, 0x4b,
- 0xb6, 0x5f, 0x0b, 0xed, 0x86, 0x73, 0x21, 0xee, 0x22, 0x2d, 0x3a, 0x0d,
- 0x31, 0xad, 0x05, 0x1b, 0x64, 0xba, 0x30, 0x4a, 0x50, 0xc4, 0x11, 0xa3,
- 0xbd, 0x59, 0x09, 0x06, 0x6f, 0xd0, 0x15, 0xd9, 0xf5, 0x9a, 0x34, 0xf3,
- 0xc5, 0x9a, 0xbe, 0xcc, 0x08, 0x72, 0x16, 0xc1, 0x4c, 0x21, 0x0d, 0xa2,
- 0xa8, 0x7f, 0x16, 0x27, 0x88, 0xee, 0xa8, 0x07, 0x80, 0xa8, 0x98, 0xbe,
- 0x16, 0x1b, 0xb0, 0x0b, 0xa2, 0x37, 0xea, 0x99, 0x1d, 0x79, 0x4b, 0x78,
- 0x98, 0x4c, 0x00, 0x56, 0x3d, 0xc7, 0x14, 0x15, 0x79, 0xe9, 0x74, 0x04,
- 0x21, 0x50, 0xba, 0xfe, 0xc4, 0x50, 0xdd, 0x6c, 0xca, 0x44, 0x6b, 0x66,
- 0xaa, 0x9f, 0x28, 0x82, 0x00, 0x0a, 0x2f, 0x7c, 0x14, 0x40, 0x72, 0x38,
- 0x17, 0x41, 0x3c, 0x10, 0x1d, 0x50, 0xd1, 0x58, 0x10, 0x3c, 0x87, 0xd5,
- 0x69, 0x29, 0x22, 0xab, 0xf5, 0xee, 0xb5, 0xa6, 0xa4, 0xca, 0x74, 0x24,
- 0x83, 0x9f, 0x5f, 0xda, 0x51, 0x90, 0x1e, 0xbc, 0xb6, 0xdb, 0x8a, 0x9b,
- 0x95, 0x2d, 0x18, 0xea, 0xdf, 0x54, 0xe7, 0x7a, 0xdc, 0x6e, 0xa8, 0x27,
- 0x90, 0x8e, 0x3f, 0xeb, 0x42, 0xa5, 0x0f, 0xbb, 0x51, 0x3d, 0xd5, 0x36,
- 0xff, 0x6f, 0xde, 0xa8, 0x34, 0x79, 0xd8, 0x9d, 0x4a, 0xbb, 0x97, 0x2a,
- 0x64, 0x4b, 0xb7, 0xbd, 0x33, 0xfe, 0x05, 0x6f, 0x19, 0x5f, 0xb3, 0x9f,
- 0x74, 0xcf, 0x94, 0x28, 0xfe, 0x5f, 0xbe, 0x65, 0x9f, 0x77, 0xb4, 0x40,
- 0xe0, 0xa3, 0x3e, 0xb0, 0x6f, 0x25, 0x69, 0xc7, 0xa4, 0x6b, 0xed, 0x59,
- 0x28, 0xc3, 0x78, 0xe3, 0x13, 0x86, 0xde, 0x8a, 0x85, 0x2e, 0x4b, 0x3d,
- 0xd9, 0xc7, 0x96, 0xe7, 0x29, 0xec, 0xc0, 0xc6, 0x81, 0x43, 0xe7, 0xad,
- 0x02, 0x44, 0x23, 0xc7, 0xdb, 0xb6, 0x3a, 0x4d, 0xa4, 0x89, 0x8a, 0x2c,
- 0xeb, 0xd2, 0x88, 0xf6, 0x55, 0x9e, 0x70, 0xa7, 0x76, 0x43, 0x80, 0x5f,
- 0x8d, 0xc7, 0xc3, 0x97, 0xe7, 0x27, 0xf7, 0xd8, 0x5d, 0xc0, 0x85, 0x71,
- 0x93, 0x8c, 0xd9, 0xcb, 0xfd, 0x69, 0x58, 0xed, 0x4f, 0x1b, 0x45, 0xb7,
- 0xbb, 0xad, 0x2f, 0xeb, 0x56, 0x92, 0xb1, 0x4e, 0xc9, 0x36, 0xdc, 0x20,
- 0x65, 0x5b, 0x31, 0x97, 0x91, 0x47, 0x41, 0xbe, 0x1a, 0xe2, 0x32, 0xfc,
- 0x44, 0x90, 0x93, 0x0d, 0x84, 0x1d, 0x80, 0xe3, 0x24, 0x07, 0xcf, 0x9e,
- 0x1c, 0x98, 0x6b, 0x71, 0xc7, 0xc0, 0x8f, 0xf2, 0xfe, 0xa3, 0xd1, 0xd1,
- 0xde, 0xa3, 0xd1, 0x23, 0xe2, 0x6a, 0x2e, 0x5a, 0x2a, 0xe3, 0x1b, 0x6e,
- 0x17, 0xc9, 0x4a, 0xa2, 0x69, 0xbd, 0x3b, 0x7e, 0x95, 0x70, 0xe2, 0x2a,
- 0x60, 0x00, 0x3b, 0x36, 0x57, 0xc2, 0xc9, 0x33, 0xc4, 0x48, 0x47, 0xea,
- 0x26, 0x66, 0x62, 0x0d, 0x9c, 0x14, 0xc1, 0x76, 0x24, 0x6a, 0x4b, 0x00,
- 0x98, 0xa2, 0xb0, 0x33, 0x21, 0x7e, 0xc7, 0x66, 0x85, 0xec, 0x8c, 0xf9,
- 0x4d, 0x58, 0x81, 0xe6, 0xed, 0x89, 0xb7, 0x63, 0xf7, 0xa4, 0x97, 0x3f,
- 0xea, 0x3f, 0x1f, 0x35, 0x5f, 0x7a, 0x0c, 0x20, 0xe7, 0xb9, 0x0f, 0xec,
- 0x1c, 0xe1, 0x87, 0xd6, 0x28, 0xad, 0x93, 0x6a, 0xba, 0xb4, 0x26, 0xc9,
- 0xfc, 0xef, 0xb3, 0x62, 0xf4, 0x53, 0xed, 0xa9, 0x88, 0x42, 0xdc, 0x36,
- 0x9b, 0x78, 0xee, 0xc2, 0xa8, 0xc5, 0x5c, 0xea, 0x5b, 0x11, 0x9b, 0x48,
- 0x5d, 0x0f, 0x19, 0x08, 0x80, 0xee, 0x32, 0x1b, 0x50, 0xde, 0x40, 0x76,
- 0xf4, 0x4d, 0x83, 0x47, 0x0c, 0x72, 0xf7, 0xad, 0xbd, 0x2a, 0x4b, 0x17,
- 0xf2, 0xa2, 0x98, 0x6e, 0x40, 0x0c, 0x0e, 0x7e, 0x39, 0x47, 0x7b, 0xb9,
- 0x3a, 0x00, 0x68, 0x63, 0x84, 0x73, 0x0b, 0x8f, 0xc8, 0x4f, 0xdb, 0x34,
- 0x2d, 0xaf, 0x91, 0x4b, 0x65, 0xc4, 0x49, 0xbe, 0x4a, 0x17, 0xc9, 0x03,
- 0x6a, 0x0b, 0xfa, 0x0f, 0xff, 0x5e, 0x7e, 0xe7, 0xd8, 0x45, 0xc8, 0xe5,
- 0x6c, 0x21, 0xbf, 0x26, 0x90, 0x76, 0xa5, 0xaa, 0x70, 0x90, 0x16, 0x9f,
- 0xeb, 0x19, 0x90, 0x92, 0xdd, 0x85, 0x9d, 0x39, 0x14, 0xa8, 0x6e, 0x02,
- 0x8d, 0xb1, 0x24, 0x15, 0x11, 0x91, 0x1c, 0x72, 0x2e, 0x96, 0xa6, 0x83,
- 0x4a, 0xd5, 0xeb, 0xee, 0x48, 0xcd, 0xa8, 0x4d, 0xcc, 0xdd, 0xb2, 0xc4,
- 0x7b, 0x59, 0xef, 0x2f, 0xc1, 0x0c, 0x49, 0x85, 0x63, 0x3f, 0xc3, 0x4f,
- 0xc5, 0x40, 0xf5, 0x85, 0x45, 0xb2, 0x83, 0x44, 0x10, 0x5b, 0xc5, 0x48,
- 0x3f, 0xd2, 0xd4, 0x82, 0xd0, 0x59, 0x64, 0xa3, 0xc6, 0xbb, 0xa3, 0x87,
- 0x80, 0x45, 0x0f, 0x04, 0x17, 0xda, 0x42, 0x41, 0x07, 0x7c, 0xf6, 0xff,
- 0x09, 0x35, 0xf0, 0x71, 0x62, 0xcf, 0xea, 0x21, 0xda, 0x20, 0x23, 0xab,
- 0x73, 0xbf, 0xf1, 0x00, 0xfa, 0xce, 0x99, 0x5c, 0xff, 0xbf, 0x36, 0xf8,
- 0x7f, 0x92, 0x36, 0xf8, 0x93, 0x6f, 0x69, 0xeb, 0x92, 0x0e, 0x25, 0xb3,
- 0xd9, 0xde, 0x4b, 0x77, 0x13, 0xe3, 0x05, 0x07, 0x8b, 0xbb, 0x07, 0x5e,
- 0xd0, 0xee, 0x0d, 0x4d, 0x42, 0x52, 0xf8, 0x7f, 0xe3, 0x8a, 0x3e, 0xe8,
- 0x66, 0xfe, 0xff, 0xbe, 0x8f, 0xff, 0xdd, 0xee, 0x61, 0xbf, 0x36, 0xb8,
- 0x63, 0x88, 0xec, 0x86, 0xb2, 0xf6, 0xb8, 0xd7, 0x19, 0xec, 0xec, 0x5d,
- 0xa7, 0xf9, 0x50, 0x3d, 0x1e, 0xef, 0xdd, 0xc9, 0xf9, 0xb7, 0x4f, 0x18,
- 0x81, 0x67, 0xdc, 0x4d, 0x66, 0xa9, 0x92, 0xd3, 0xd7, 0x2f, 0xcf, 0x7f,
- 0xc2, 0x6d, 0xff, 0x0b, 0xbc, 0xd0, 0xab, 0x2c, 0x9b, 0x0d, 0x39, 0x6e,
- 0xf8, 0x02, 0xff, 0x88, 0x04, 0xdc, 0x53, 0x8b, 0xb0, 0x01, 0xb2, 0xa5,
- 0x70, 0x62, 0x98, 0xc6, 0x80, 0x97, 0x8d, 0x9a, 0x52, 0x08, 0xe6, 0xcd,
- 0x0a, 0x2d, 0x01, 0x03, 0x1f, 0x4b, 0x59, 0xcc, 0x76, 0xb9, 0xd0, 0x0f,
- 0x5f, 0x06, 0xa9, 0x48, 0xf6, 0x09, 0xdd, 0xef, 0x4b, 0x42, 0xc5, 0xb3,
- 0xc0, 0xa1, 0xde, 0x33, 0x8a, 0x04, 0x1d, 0x4d, 0x86, 0xba, 0x73, 0x4b,
- 0xe1, 0x90, 0x27, 0xa3, 0xd7, 0x1d, 0xed, 0x93, 0xff, 0x1d, 0x5c, 0x24,
- 0x6b, 0x7e, 0x45, 0xb4, 0x8d, 0xee, 0xe7, 0xfb, 0xd2, 0x69, 0x36, 0x6e,
- 0xa5, 0x7f, 0x12, 0xad, 0x1d, 0xa4, 0x08, 0x39, 0x87, 0x0e, 0x83, 0x2e,
- 0xe5, 0xde, 0x37, 0x39, 0x81, 0x84, 0xe7, 0x6b, 0x3f, 0xd1, 0xde, 0xcd,
- 0x93, 0xb9, 0xff, 0x42, 0x60, 0x51, 0xdb, 0x9a, 0xb4, 0xcc, 0x1a, 0xd4,
- 0x49, 0x6b, 0x56, 0xae, 0x62, 0xe0, 0x40, 0xbd, 0xfb, 0xae, 0xb4, 0xe0,
- 0x2f, 0x61, 0x36, 0xa5, 0xf7, 0xee, 0xe6, 0x14, 0xc0, 0xb2, 0x68, 0x2a,
- 0x6a, 0x31, 0xa2, 0xd9, 0x03, 0x8a, 0x34, 0x6f, 0xf8, 0xa2, 0x5f, 0xfb,
- 0x9f, 0xa2, 0x52, 0x20, 0xc1, 0xae, 0x85, 0xed, 0x36, 0xf9, 0x7e, 0x27,
- 0x59, 0x33, 0x1d, 0xb9, 0xb3, 0x05, 0x84, 0xa1, 0xf9, 0xe5, 0xd4, 0x28,
- 0xb9, 0xda, 0x93, 0x7a, 0x90, 0x70, 0x82, 0x07, 0x99, 0x3c, 0x3d, 0xbe,
- 0x0a, 0xcd, 0x84, 0xf9, 0xf5, 0xdb, 0xb3, 0x6d, 0xee, 0x7f, 0x18, 0x42,
- 0x48, 0xa8, 0x79, 0x62, 0xd9, 0x42, 0x6a, 0xd8, 0x19, 0x90, 0x17, 0xd0,
- 0x24, 0x99, 0x02, 0xc1, 0xf3, 0x45, 0x7a, 0x23, 0x45, 0x30, 0x5d, 0x7e,
- 0x3f, 0x3e, 0x3d, 0xe2, 0x8c, 0xdf, 0x8b, 0xd3, 0xb1, 0x8f, 0x9f, 0x5f,
- 0x23, 0x18, 0x8f, 0x0a, 0xc8, 0x3f, 0x1f, 0xbf, 0x1c, 0x5f, 0x8c, 0x22,
- 0x6b, 0x0c, 0x13, 0xa6, 0x5c, 0x41, 0x34, 0x01, 0x9b, 0x2d, 0xd2, 0x3b,
- 0x42, 0xcf, 0x94, 0xba, 0x4a, 0x9a, 0x1b, 0x4f, 0x4d, 0xc7, 0x26, 0x33,
- 0x97, 0x3b, 0xc8, 0x20, 0xe5, 0x2e, 0x4c, 0x49, 0x32, 0x7b, 0x37, 0xc9,
- 0x17, 0xb4, 0x02, 0x33, 0x2d, 0x63, 0x0c, 0x2d, 0xa5, 0x68, 0x02, 0x55,
- 0xfa, 0xe5, 0x82, 0x12, 0x09, 0xe8, 0x3b, 0x6d, 0x4f, 0x04, 0x25, 0x24,
- 0x0b, 0x74, 0x41, 0x7f, 0x21, 0xb2, 0xd1, 0x3b, 0x4a, 0x6a, 0xff, 0x64,
- 0xe7, 0xaa, 0x7b, 0xc5, 0x51, 0x67, 0xaf, 0x61, 0x1f, 0x75, 0xa8, 0x27,
- 0x10, 0x97, 0x30, 0xdd, 0x3b, 0xad, 0x3f, 0x69, 0x64, 0x17, 0x6d, 0x45,
- 0x29, 0x68, 0xbc, 0x31, 0xe7, 0xb4, 0x6b, 0x09, 0x99, 0x83, 0x46, 0x4d,
- 0x3c, 0x55, 0x47, 0x05, 0xc5, 0x11, 0xe4, 0x00, 0x28, 0xb2, 0xc5, 0xee,
- 0x86, 0x13, 0xd7, 0xc4, 0x11, 0xbf, 0xed, 0x29, 0x8d, 0x16, 0xef, 0xb5,
- 0x96, 0x4c, 0xaf, 0x32, 0x23, 0x45, 0x46, 0x1e, 0xb2, 0xc3, 0x83, 0x37,
- 0xe4, 0xb3, 0x00, 0xfe, 0x2f, 0xb2, 0x3d, 0x3f, 0x79, 0x43, 0x1e, 0x3d,
- 0x0a, 0x37, 0xa4, 0xca, 0xfe, 0x3e, 0x8b, 0x61, 0xa1, 0xa3, 0x02, 0x05,
- 0xe5, 0x2f, 0x5c, 0x36, 0xf2, 0x9e, 0x01, 0xdd, 0x69, 0xaa, 0x7b, 0xd4,
- 0xd2, 0x48, 0xf3, 0xe8, 0x1d, 0x98, 0x1e, 0x19, 0xd8, 0x14, 0x80, 0x0c,
- 0xdb, 0xb1, 0x2b, 0xea, 0xa6, 0xd7, 0x7f, 0x33, 0x8f, 0xc3, 0x81, 0x48,
- 0x76, 0xb3, 0x7c, 0x64, 0x23, 0xcb, 0xa2, 0x54, 0x16, 0x34, 0xc6, 0xa1,
- 0x1a, 0x53, 0x7b, 0x77, 0x86, 0xc3, 0x79, 0xb3, 0xb2, 0x0b, 0xdb, 0x48,
- 0x1d, 0xfb, 0xc1, 0x66, 0xf4, 0x2c, 0xfd, 0xa2, 0xd2, 0x06, 0x41, 0x9b,
- 0x57, 0x1f, 0x66, 0x5b, 0x52, 0xd7, 0x1d, 0xed, 0xe4, 0x0e, 0xe0, 0x32,
- 0x69, 0xa3, 0xfe, 0xd0, 0x8d, 0x08, 0x99, 0x07, 0xb6, 0xa5, 0xd5, 0x59,
- 0x5a, 0xd7, 0x2b, 0x2c, 0x5c, 0x83, 0xa3, 0xb2, 0x03, 0x98, 0xa9, 0x14,
- 0x34, 0x04, 0xb7, 0xbd, 0xa0, 0xb2, 0xda, 0xeb, 0x6c, 0x81, 0x72, 0xc3,
- 0xac, 0x98, 0x56, 0x77, 0x2b, 0x1f, 0xbc, 0x7f, 0x76, 0x8f, 0x06, 0x7f,
- 0xcf, 0x09, 0xb4, 0x6a, 0x83, 0x0e, 0x0c, 0xaf, 0xdb, 0x0d, 0xf5, 0xaf,
- 0x54, 0x19, 0x3c, 0x1b, 0x27, 0x50, 0xbc, 0x1b, 0xbf, 0x54, 0x80, 0x0c,
- 0x19, 0x65, 0xdc, 0x8c, 0x9f, 0x29, 0x88, 0x85, 0xc9, 0x3c, 0x74, 0x20,
- 0xd3, 0xd6, 0xda, 0x4a, 0x80, 0x07, 0x9f, 0xfc, 0xe1, 0x80, 0xf7, 0xeb,
- 0xfa, 0x30, 0xe0, 0x09, 0xe3, 0xd3, 0x5d, 0x82, 0xa7, 0xae, 0x08, 0x2e,
- 0xa6, 0xe5, 0x96, 0xa2, 0x0b, 0xab, 0x0d, 0xca, 0x0e, 0xd9, 0x1b, 0xe5,
- 0xb7, 0x6b, 0x66, 0x25, 0x3b, 0x48, 0xa1, 0x42, 0x69, 0x38, 0xdf, 0x75,
- 0x2e, 0xd1, 0x1d, 0x1b, 0xbe, 0xca, 0x79, 0x8d, 0xed, 0x76, 0xaa, 0xb6,
- 0xea, 0x99, 0x9e, 0xbe, 0x3e, 0xec, 0x05, 0xa2, 0x1f, 0xc9, 0xef, 0x51,
- 0xc2, 0x3e, 0xcb, 0x80, 0xe5, 0xae, 0x58, 0x9a, 0x54, 0xc1, 0xc5, 0xd4,
- 0x86, 0xbc, 0x5e, 0xf2, 0x4e, 0x3f, 0x39, 0x78, 0xfa, 0x64, 0x37, 0x1a,
- 0x64, 0x67, 0x62, 0xa2, 0xd2, 0xc6, 0xa6, 0x59, 0x51, 0x81, 0xae, 0x90,
- 0x11, 0xfd, 0xf3, 0x70, 0xe4, 0xef, 0x51, 0xd8, 0xdd, 0xa4, 0x2b, 0x92,
- 0x8a, 0x19, 0x11, 0x04, 0x6d, 0x83, 0x76, 0x7b, 0x20, 0x42, 0xb1, 0x7d,
- 0x62, 0xf5, 0x8e, 0x83, 0x90, 0x43, 0x93, 0x30, 0x40, 0xa2, 0x87, 0x89,
- 0x38, 0x3c, 0xd2, 0x09, 0x1c, 0xf1, 0xcc, 0xbc, 0xf6, 0x9c, 0x3c, 0x53,
- 0xfc, 0x7d, 0xd4, 0xfe, 0x97, 0x1f, 0xcc, 0x74, 0x03, 0xfc, 0xbc, 0x53,
- 0x3e, 0xfa, 0xb5, 0x4f, 0xf9, 0xe8, 0x9e, 0x53, 0x3e, 0x7a, 0xe8, 0x29,
- 0x3f, 0x7d, 0xfc, 0xe4, 0xf3, 0x9f, 0x77, 0xca, 0xde, 0x26, 0xff, 0xaf,
- 0x39, 0x65, 0x8f, 0xcc, 0x7e, 0xde, 0x29, 0x4b, 0x52, 0x48, 0xb7, 0x20,
- 0x53, 0x92, 0x5f, 0xb8, 0x9c, 0x96, 0xb0, 0x34, 0x38, 0x23, 0x99, 0x1f,
- 0x0e, 0x0b, 0xad, 0xa4, 0xfb, 0x24, 0x77, 0xbd, 0x33, 0x6a, 0x58, 0xc4,
- 0xc8, 0x76, 0xc0, 0x1e, 0xd0, 0x6f, 0x57, 0x0b, 0x6a, 0x9e, 0xb6, 0x3d,
- 0xdc, 0xd6, 0xd0, 0xb5, 0x96, 0x4f, 0x2a, 0x2e, 0x16, 0x7f, 0xcd, 0x1c,
- 0xf6, 0x6f, 0x88, 0xaa, 0x16, 0xe6, 0xcc, 0x78, 0x59, 0x4f, 0xed, 0x4d,
- 0xbb, 0x5b, 0x18, 0x33, 0x81, 0x33, 0x90, 0xa2, 0xd9, 0x6f, 0xb5, 0xa6,
- 0x0e, 0x32, 0xb4, 0x93, 0x7a, 0x69, 0x26, 0x46, 0x27, 0x34, 0x22, 0xa0,
- 0xa0, 0x9c, 0x9e, 0xbb, 0x45, 0x26, 0x15, 0xc4, 0xb4, 0x66, 0xf8, 0xe4,
- 0xc9, 0x94, 0xef, 0xba, 0x84, 0xa5, 0x57, 0x90, 0x05, 0xd4, 0xd3, 0x9c,
- 0xa5, 0x91, 0x84, 0x0d, 0x8d, 0x82, 0xd6, 0x9a, 0x0e, 0x76, 0xce, 0x5c,
- 0x14, 0x8e, 0x3b, 0x2c, 0x23, 0x60, 0x3f, 0x9b, 0x12, 0xfc, 0xba, 0x09,
- 0x77, 0x3d, 0xbd, 0x89, 0x62, 0x09, 0x68, 0x41, 0x9b, 0x2a, 0x7b, 0x34,
- 0x0c, 0xb3, 0x66, 0x5b, 0x27, 0xd9, 0xf2, 0x04, 0xd8, 0xc7, 0x54, 0x9b,
- 0x10, 0x14, 0x22, 0xa3, 0x94, 0x5a, 0xd6, 0xa3, 0xbd, 0xa0, 0xbc, 0xd7,
- 0xdb, 0xb9, 0xba, 0xf5, 0x3d, 0x35, 0x33, 0x94, 0x77, 0xde, 0x78, 0x6d,
- 0x31, 0xc5, 0xfa, 0x7b, 0x4d, 0xd3, 0x9d, 0xad, 0x97, 0x2b, 0x85, 0x42,
- 0xa4, 0xf2, 0xa6, 0x1c, 0x69, 0x5c, 0x8a, 0x86, 0xc0, 0x39, 0xd7, 0x11,
- 0x37, 0x9a, 0xad, 0x76, 0xb2, 0x19, 0x6e, 0xec, 0xb3, 0xd2, 0xd3, 0x92,
- 0x7a, 0x7e, 0x5e, 0x01, 0x12, 0xd7, 0x2c, 0x06, 0x5b, 0x90, 0x7a, 0x40,
- 0xf7, 0xcc, 0x4c, 0x7b, 0x96, 0x4d, 0xd6, 0x97, 0x8a, 0x28, 0x60, 0xdb,
- 0xdb, 0xb5, 0x69, 0x12, 0x05, 0x58, 0x84, 0x30, 0x94, 0x0d, 0x38, 0x8d,
- 0x2e, 0x2d, 0xee, 0x42, 0x70, 0x95, 0x86, 0x5a, 0x3b, 0x4e, 0x37, 0x25,
- 0x87, 0x05, 0x4b, 0x07, 0xb1, 0xe7, 0x03, 0x6f, 0xe9, 0xf8, 0x49, 0xeb,
- 0x44, 0x23, 0xad, 0xb3, 0x7c, 0x52, 0x69, 0xa6, 0xab, 0xe1, 0x3c, 0x25,
- 0x68, 0xd2, 0xa0, 0xb0, 0x5c, 0x12, 0x42, 0xe5, 0x0e, 0x5c, 0xbc, 0x3a,
- 0x4f, 0xde, 0xa4, 0xd2, 0x6e, 0x28, 0xd9, 0x31, 0x1c, 0xf8, 0xe9, 0xa3,
- 0x83, 0xa3, 0xdd, 0x8d, 0x7a, 0x78, 0x1b, 0x6e, 0x0b, 0xdf, 0x2a, 0xca,
- 0x58, 0xc2, 0xfa, 0xc5, 0xda, 0x18, 0xcd, 0x02, 0xe3, 0x63, 0x3e, 0xf4,
- 0xf1, 0xdd, 0xd9, 0xeb, 0xe3, 0xd3, 0x97, 0x7f, 0xb1, 0x80, 0x11, 0xb4,
- 0x07, 0x5a, 0x79, 0xfc, 0xd1, 0x58, 0xaf, 0x77, 0x1f, 0xeb, 0xcc, 0x4c,
- 0xb9, 0xd9, 0x39, 0xda, 0x05, 0xb0, 0x43, 0xd0, 0x14, 0xf2, 0x32, 0x6b,
- 0xa1, 0x6d, 0x48, 0xf5, 0xc0, 0x06, 0xc0, 0xa8, 0xb1, 0xed, 0x29, 0xba,
- 0x3f, 0x32, 0xec, 0x59, 0xd2, 0x2e, 0xb9, 0x71, 0x82, 0x23, 0x52, 0xaf,
- 0x73, 0x4a, 0x2a, 0x98, 0x72, 0x02, 0x9d, 0x10, 0xb4, 0x1e, 0x5a, 0x2d,
- 0xf2, 0x69, 0x4e, 0xd6, 0x8a, 0xdc, 0x6a, 0xaa, 0x4a, 0x98, 0xcf, 0xdb,
- 0xb0, 0x94, 0x28, 0xde, 0x45, 0xb9, 0xc2, 0x46, 0x67, 0x5a, 0x9b, 0xf7,
- 0x37, 0x10, 0x16, 0xd9, 0xa2, 0xc8, 0x9a, 0xa1, 0x4c, 0xeb, 0x85, 0xf9,
- 0xf3, 0x8b, 0xeb, 0x74, 0x11, 0x94, 0x84, 0x53, 0x4f, 0x45, 0xa5, 0x4d,
- 0x9b, 0x3c, 0x49, 0x6f, 0x7a, 0x2d, 0x57, 0xc6, 0xb6, 0xf3, 0x88, 0x3e,
- 0x69, 0xae, 0x4a, 0xd0, 0x61, 0xe4, 0xe2, 0xe2, 0x2f, 0xe7, 0xc7, 0x5f,
- 0xbc, 0x20, 0x36, 0xf6, 0x27, 0xaa, 0x3d, 0xa9, 0x5b, 0x5c, 0x2d, 0xa1,
- 0x1e, 0xee, 0xc1, 0x1a, 0xbe, 0x7f, 0x7d, 0x32, 0x3e, 0x3f, 0x3d, 0x7b,
- 0xf5, 0xc5, 0x8b, 0xef, 0xc9, 0xa6, 0x34, 0xc2, 0xe3, 0xce, 0x7b, 0xd7,
- 0xfe, 0xcc, 0x36, 0x51, 0x08, 0x01, 0x45, 0x8e, 0xbf, 0xfb, 0x78, 0xfc,
- 0xee, 0xdb, 0x2f, 0x5e, 0x5c, 0xa7, 0xd5, 0x80, 0xd6, 0xc7, 0x6f, 0xf7,
- 0xb4, 0x2c, 0x6d, 0x91, 0x1a, 0x29, 0xe7, 0x93, 0xc5, 0xa7, 0x3a, 0xff,
- 0x47, 0x96, 0x98, 0xd7, 0x17, 0xeb, 0x10, 0xc6, 0xfc, 0x42, 0xda, 0x60,
- 0x19, 0xe9, 0x4d, 0xe6, 0xd0, 0x9f, 0x4f, 0xbf, 0x21, 0xa8, 0x5c, 0xeb,
- 0x28, 0x5d, 0x72, 0xdf, 0xa5, 0xe4, 0x4f, 0x8f, 0x0f, 0x0e, 0x77, 0x5d,
- 0xb7, 0x4f, 0x40, 0x6d, 0x9b, 0x19, 0x7f, 0x0a, 0xaa, 0xa6, 0xfe, 0xa1,
- 0x90, 0x81, 0xb6, 0x9c, 0xa1, 0x71, 0x16, 0x15, 0x57, 0x1f, 0x88, 0xd7,
- 0x09, 0xc9, 0xf9, 0x0c, 0xe2, 0x53, 0x12, 0x43, 0xa0, 0xac, 0xf5, 0xc0,
- 0xe3, 0x76, 0xf1, 0xc6, 0x03, 0xb9, 0xf9, 0xb3, 0x23, 0x3c, 0x33, 0x1d,
- 0xf1, 0xda, 0x6d, 0x94, 0x8f, 0xbf, 0x62, 0x2c, 0xa7, 0x6b, 0x52, 0x62,
- 0xb3, 0x8d, 0x40, 0x13, 0xfa, 0x89, 0xef, 0xb3, 0x17, 0xf3, 0x46, 0x05,
- 0x58, 0xc9, 0xb0, 0x8c, 0x58, 0xa5, 0x12, 0x9e, 0x62, 0x0a, 0x6c, 0x34,
- 0x88, 0xf3, 0x25, 0x15, 0x1e, 0x53, 0x99, 0x0e, 0x3b, 0x77, 0x3c, 0xd7,
- 0xcd, 0x22, 0xbb, 0x4c, 0xa7, 0x77, 0x89, 0x05, 0x98, 0x96, 0x7c, 0xfb,
- 0x59, 0xf7, 0x76, 0xb2, 0x8f, 0x6f, 0x4a, 0xb6, 0x9c, 0x91, 0xc0, 0x84,
- 0xfb, 0x41, 0x5c, 0x99, 0xb1, 0x54, 0xa8, 0x50, 0x53, 0xfd, 0x3e, 0xad,
- 0xd9, 0x8d, 0x58, 0x5e, 0xd2, 0xa6, 0x76, 0xa5, 0x73, 0x7b, 0x8b, 0x3b,
- 0xd4, 0x47, 0x64, 0x83, 0x5e, 0xc4, 0x1b, 0xf7, 0xf4, 0x51, 0xdb, 0x63,
- 0xfe, 0x0f, 0x5c, 0x72, 0x42, 0xe1, 0x82, 0x53, 0xf6, 0x05, 0xfd, 0xb5,
- 0x17, 0x87, 0x9f, 0xbd, 0x16, 0xdc, 0x6d, 0xda, 0x21, 0x57, 0xda, 0xd2,
- 0x02, 0x69, 0x6c, 0x43, 0xa5, 0xf2, 0x8d, 0xba, 0x80, 0x7b, 0x31, 0xee,
- 0xb4, 0xd2, 0x95, 0x3c, 0xc1, 0xe6, 0x71, 0xdb, 0xeb, 0xaa, 0x67, 0x48,
- 0x5b, 0x9c, 0x19, 0x86, 0x68, 0x50, 0x18, 0x48, 0xa9, 0x08, 0x2f, 0x68,
- 0x20, 0xe2, 0x88, 0xa4, 0x92, 0x98, 0x8d, 0xfa, 0x93, 0x06, 0x7d, 0x52,
- 0x1f, 0x06, 0x08, 0x0f, 0x31, 0x94, 0x0c, 0x29, 0xd1, 0x55, 0x34, 0xbb,
- 0x5d, 0xfd, 0x06, 0x9c, 0xa0, 0x41, 0x01, 0x35, 0x0b, 0x2b, 0x6d, 0x26,
- 0x59, 0xab, 0x56, 0x4a, 0x35, 0x90, 0x30, 0xd2, 0x1d, 0xf0, 0x6c, 0xac,
- 0x4d, 0xab, 0x56, 0xec, 0x29, 0x1c, 0x38, 0xaf, 0x4a, 0x92, 0x11, 0x30,
- 0x9f, 0x9d, 0x25, 0x2d, 0x63, 0x57, 0xca, 0x4a, 0xb8, 0x17, 0x44, 0xd2,
- 0xd7, 0xb0, 0xbd, 0x23, 0xa6, 0xcc, 0xa8, 0x34, 0x06, 0x89, 0x28, 0x23,
- 0xa1, 0x20, 0x93, 0x18, 0x96, 0xa1, 0xb3, 0x1d, 0x91, 0xea, 0xe3, 0x86,
- 0x93, 0xf8, 0xbb, 0x22, 0x8a, 0x40, 0xc5, 0x35, 0x71, 0xbe, 0x35, 0x82,
- 0xdf, 0x8d, 0x6e, 0x67, 0xb8, 0x6b, 0x21, 0x04, 0xf2, 0xc6, 0x2a, 0x6d,
- 0x11, 0xc8, 0x9d, 0xc4, 0x22, 0x9f, 0x5b, 0xe8, 0x36, 0xf6, 0x7d, 0x4a,
- 0xbc, 0x25, 0x13, 0x92, 0xa0, 0xaf, 0xed, 0x71, 0xed, 0xa7, 0xf2, 0xa0,
- 0x3c, 0x2c, 0x3d, 0x0f, 0xc6, 0x2a, 0xb2, 0x1b, 0x7f, 0x2c, 0x67, 0x76,
- 0xd8, 0xf1, 0x7e, 0x4d, 0x6f, 0xb7, 0xb1, 0x99, 0xa8, 0x5e, 0x2d, 0x79,
- 0xf1, 0xed, 0xf1, 0xfb, 0xf1, 0xc9, 0xd9, 0xbb, 0x3f, 0x45, 0xcd, 0x61,
- 0xf9, 0xa5, 0x6d, 0xf4, 0xa6, 0x95, 0xae, 0xae, 0x1b, 0x17, 0x79, 0xc1,
- 0xd4, 0xd7, 0xc2, 0xa0, 0x47, 0x79, 0x41, 0x8f, 0x04, 0x5d, 0xbe, 0xa6,
- 0xd9, 0xaa, 0xe1, 0x72, 0x3b, 0x35, 0xa5, 0x5d, 0x47, 0x51, 0x4a, 0x1c,
- 0x64, 0x23, 0x6e, 0x7f, 0xa0, 0x7f, 0x3b, 0xb0, 0x7f, 0x3b, 0x0c, 0xa9,
- 0x9d, 0x7f, 0x71, 0x14, 0x6c, 0x50, 0x3c, 0x61, 0xc7, 0x8b, 0x97, 0xaf,
- 0x57, 0x5c, 0x23, 0x49, 0x58, 0x26, 0x8c, 0x7c, 0xe4, 0x2f, 0x20, 0xe8,
- 0xdb, 0x40, 0x0d, 0x7f, 0xfd, 0x17, 0xcd, 0xc3, 0xd7, 0x07, 0x5e, 0x05,
- 0x8b, 0x7d, 0xee, 0x20, 0xf6, 0xdc, 0x41, 0xf8, 0xdc, 0x61, 0xec, 0xb9,
- 0xc3, 0xf0, 0xb9, 0xa3, 0xd8, 0x73, 0xde, 0x7a, 0x3d, 0xc7, 0x9f, 0x6c,
- 0xdc, 0x26, 0xcb, 0xb8, 0xf5, 0xaf, 0xa3, 0x91, 0x3b, 0xfe, 0xcf, 0xac,
- 0xb7, 0xa2, 0xdb, 0xaa, 0xf6, 0x27, 0x19, 0xf6, 0xca, 0xa7, 0x75, 0x38,
- 0xa3, 0x25, 0x76, 0x5c, 0xcc, 0xe6, 0x7b, 0x07, 0x47, 0xc3, 0x69, 0xbe,
- 0xba, 0x22, 0xb9, 0xf3, 0x42, 0x3b, 0xbb, 0xd1, 0xe6, 0xd3, 0x62, 0xe5,
- 0x17, 0x6b, 0xb2, 0xc8, 0x43, 0x3d, 0xe4, 0x74, 0xec, 0xc3, 0x15, 0x09,
- 0x42, 0x27, 0xde, 0x48, 0xf8, 0x15, 0x07, 0x56, 0xd4, 0xf5, 0x2f, 0x87,
- 0x30, 0x61, 0x79, 0x93, 0x58, 0xef, 0x0d, 0x39, 0x7a, 0x64, 0x0a, 0x4c,
- 0xbc, 0x3a, 0x2f, 0x9d, 0xa8, 0x0c, 0xcf, 0x1d, 0x13, 0x39, 0xf4, 0xde,
- 0x75, 0xed, 0xa2, 0xc5, 0x85, 0x3c, 0x2f, 0x10, 0x77, 0xd4, 0x99, 0xad,
- 0xe8, 0xac, 0x8d, 0x87, 0x72, 0xf0, 0x76, 0x28, 0x9e, 0x09, 0x45, 0xe5,
- 0x87, 0xf7, 0xa7, 0x81, 0x6a, 0x99, 0x90, 0x5f, 0xa6, 0x7e, 0xbe, 0xb7,
- 0x87, 0x0e, 0xe3, 0x57, 0xe9, 0xed, 0xed, 0xa8, 0xce, 0xf6, 0x0c, 0x3f,
- 0xa9, 0xf7, 0xe0, 0xf0, 0x95, 0x6f, 0x5f, 0x35, 0xcb, 0xc5, 0x66, 0x47,
- 0x6d, 0xce, 0x7e, 0x2d, 0x69, 0x08, 0xcf, 0xbc, 0x03, 0xc8, 0x0b, 0xad,
- 0x26, 0xbf, 0xf6, 0x88, 0xc3, 0x52, 0x2f, 0xe9, 0xa4, 0x8a, 0x3e, 0xce,
- 0x07, 0x24, 0xf9, 0x20, 0x31, 0x11, 0xce, 0x44, 0x1c, 0x02, 0x70, 0xc8,
- 0x9c, 0xf9, 0xe0, 0xb0, 0x73, 0xe8, 0x05, 0x2a, 0xa7, 0xcd, 0x82, 0x70,
- 0x86, 0x45, 0xc9, 0xa9, 0x80, 0x88, 0x0f, 0x67, 0x41, 0x6c, 0xd7, 0x6a,
- 0x3f, 0xf0, 0x81, 0x58, 0x21, 0x2f, 0x39, 0xaa, 0x66, 0xfc, 0xca, 0x4c,
- 0x93, 0x52, 0xf2, 0x48, 0x99, 0x37, 0x2a, 0x87, 0xf9, 0xef, 0x9f, 0xc2,
- 0xa2, 0x73, 0xac, 0xa0, 0x9b, 0xb8, 0x47, 0xda, 0x3f, 0x95, 0x7c, 0xf1,
- 0xd6, 0xf3, 0xd7, 0x5a, 0x0d, 0x32, 0x80, 0xba, 0x14, 0x87, 0x06, 0xc0,
- 0xb1, 0x6d, 0x8d, 0xdf, 0x9f, 0x6f, 0x0d, 0x38, 0x5f, 0x93, 0xbe, 0x30,
- 0x34, 0xff, 0x4e, 0x60, 0x65, 0x52, 0x7b, 0x9d, 0xc7, 0x8f, 0x76, 0x05,
- 0x27, 0x17, 0x73, 0xe4, 0xd2, 0xc9, 0x30, 0x7c, 0x84, 0x5f, 0xba, 0xe4,
- 0xc2, 0xaa, 0xd5, 0x08, 0xcb, 0xd8, 0x7f, 0xed, 0x05, 0x72, 0xd6, 0xcf,
- 0x80, 0xb3, 0x38, 0x36, 0xa8, 0x75, 0x3e, 0xec, 0x23, 0xcf, 0x73, 0xd4,
- 0x89, 0xd0, 0x94, 0xd5, 0x27, 0xe9, 0x07, 0x22, 0x51, 0x0e, 0x30, 0x97,
- 0xa0, 0xfb, 0x72, 0x8b, 0xd9, 0xb4, 0xbd, 0xa3, 0xde, 0x9a, 0x65, 0xc3,
- 0x1c, 0x06, 0x5e, 0x4f, 0x8b, 0x61, 0xa5, 0x55, 0xb3, 0x61, 0x5f, 0x15,
- 0x6b, 0x3a, 0x14, 0x0c, 0xa4, 0xe3, 0xc8, 0x30, 0xf7, 0x60, 0xd5, 0x3c,
- 0xea, 0x9c, 0xbe, 0x6e, 0x5e, 0xe4, 0xd8, 0x6d, 0x07, 0x7b, 0x3e, 0x24,
- 0xd8, 0x34, 0x8a, 0xc7, 0x19, 0x21, 0x09, 0xc5, 0x06, 0xec, 0xab, 0x26,
- 0x53, 0x6c, 0x19, 0xef, 0x44, 0x46, 0x1a, 0x7c, 0x13, 0x36, 0xed, 0xce,
- 0xda, 0xeb, 0x87, 0x71, 0xff, 0x82, 0xfc, 0xf5, 0xe0, 0xed, 0x68, 0xc2,
- 0x35, 0x2d, 0x49, 0x13, 0x52, 0x1f, 0xb4, 0x20, 0x5d, 0xd1, 0x86, 0x25,
- 0xc9, 0x51, 0x76, 0x16, 0xe5, 0x56, 0xe5, 0x2d, 0xcb, 0x51, 0x29, 0x2d,
- 0x2d, 0x20, 0xbd, 0x07, 0x2d, 0xb4, 0xb5, 0x52, 0x12, 0x91, 0x51, 0xc1,
- 0x22, 0x0e, 0x7f, 0xdf, 0xdf, 0xef, 0xa9, 0x04, 0x50, 0x01, 0x94, 0xd1,
- 0xb5, 0xd3, 0x8d, 0x7b, 0xab, 0x2a, 0xc4, 0xf5, 0x4f, 0xa3, 0x68, 0x1f,
- 0x93, 0x08, 0xaa, 0x11, 0xb9, 0x4c, 0xf5, 0x2b, 0xd2, 0x3d, 0x53, 0x5a,
- 0x62, 0x77, 0x82, 0x9b, 0xaa, 0x38, 0x4a, 0x3d, 0xf5, 0x22, 0x4c, 0xb9,
- 0xf8, 0x48, 0x77, 0xeb, 0xa3, 0xb0, 0xce, 0x7d, 0xae, 0xe8, 0x06, 0x6c,
- 0x66, 0x4e, 0xcd, 0x17, 0x52, 0xc0, 0xa0, 0x52, 0xa4, 0xa0, 0x46, 0xdb,
- 0x18, 0x57, 0xd9, 0x2d, 0x42, 0xa8, 0xcb, 0xe5, 0x69, 0x1c, 0x73, 0x0d,
- 0xa9, 0xe5, 0xb5, 0x7a, 0x63, 0x55, 0x5b, 0xec, 0x80, 0xaa, 0xa1, 0x6d,
- 0x88, 0x55, 0x0a, 0x65, 0xdb, 0x02, 0xdd, 0xff, 0xbe, 0x6a, 0xe8, 0x50,
- 0x55, 0x20, 0x0d, 0xe6, 0xe7, 0x1d, 0xd6, 0xc1, 0xff, 0x59, 0x87, 0x75,
- 0xf0, 0x7f, 0xc7, 0x61, 0x1d, 0xfe, 0xbc, 0xc3, 0x3a, 0xfc, 0x3f, 0xeb,
- 0xb0, 0x0e, 0xff, 0xef, 0x38, 0xac, 0xa3, 0x9f, 0x77, 0x58, 0x47, 0xbf,
- 0xfc, 0x61, 0xbd, 0xa3, 0xdf, 0x83, 0xe7, 0xab, 0xd6, 0x97, 0x8b, 0x9e,
- 0xe0, 0xb4, 0xa2, 0xc9, 0x1d, 0x9a, 0xcf, 0x4f, 0x68, 0x43, 0xc4, 0x60,
- 0x10, 0x65, 0xb2, 0xee, 0x5a, 0x4d, 0x2f, 0x1d, 0x36, 0xbb, 0x6d, 0x92,
- 0x22, 0x31, 0x28, 0xc1, 0xaa, 0x27, 0x95, 0xe7, 0xcf, 0x25, 0xb9, 0x50,
- 0x8c, 0x66, 0x30, 0x48, 0xde, 0x8d, 0xc7, 0x9c, 0x76, 0x34, 0x46, 0xe8,
- 0xb4, 0x7b, 0x58, 0xe4, 0x8c, 0x84, 0x8d, 0xb3, 0x43, 0x6a, 0xe3, 0x99,
- 0x99, 0xa1, 0xe3, 0x2e, 0xfc, 0xde, 0x32, 0x9d, 0xd2, 0x8f, 0xf7, 0x47,
- 0x07, 0x6e, 0x77, 0x76, 0x7f, 0x02, 0x10, 0x9c, 0x8b, 0x6b, 0xc6, 0x83,
- 0xd1, 0x11, 0xc8, 0x76, 0x20, 0xa0, 0xd7, 0x4d, 0xe7, 0x70, 0x6e, 0xdb,
- 0x51, 0xe9, 0x5e, 0x70, 0xf0, 0xd8, 0xa9, 0x70, 0xfa, 0x85, 0xa2, 0x6b,
- 0xd2, 0x2f, 0x9c, 0x85, 0x0e, 0x03, 0x38, 0xb0, 0xbe, 0xaf, 0xf2, 0x4b,
- 0xc2, 0xc2, 0xfb, 0x19, 0x91, 0x65, 0x2f, 0x90, 0xfb, 0xbf, 0x26, 0xb2,
- 0xfc, 0x20, 0xfb, 0xd8, 0xbf, 0x32, 0xd5, 0x50, 0x3b, 0xab, 0xc5, 0xf1,
- 0xdb, 0x9d, 0x67, 0x91, 0x4a, 0x81, 0x80, 0xec, 0x38, 0x63, 0xd2, 0xa1,
- 0x4c, 0x9b, 0x63, 0x79, 0xd7, 0x05, 0xf7, 0xd8, 0x8c, 0x09, 0xf1, 0x97,
- 0xa4, 0xd2, 0xce, 0xc2, 0x0d, 0x29, 0xb0, 0x05, 0xaf, 0xb2, 0x66, 0x7a,
- 0x5b, 0x17, 0xfa, 0x11, 0xc9, 0x0d, 0x25, 0x17, 0x39, 0x83, 0x9f, 0x05,
- 0xe9, 0x07, 0xd3, 0x8c, 0xa1, 0xb1, 0xf2, 0xfb, 0x34, 0xa5, 0x27, 0xed,
- 0xf5, 0xa6, 0xd3, 0x6c, 0x98, 0xd6, 0xd3, 0x3c, 0x8f, 0xb7, 0x76, 0xd5,
- 0x38, 0x70, 0x9a, 0xcc, 0xd7, 0xf0, 0xe0, 0x9b, 0xe7, 0x13, 0x8a, 0xb9,
- 0x69, 0xa3, 0x76, 0xe2, 0x88, 0x40, 0x8b, 0xa2, 0x09, 0x97, 0xeb, 0xe6,
- 0xb2, 0x54, 0x67, 0xfe, 0x20, 0xe2, 0x18, 0xa4, 0xa8, 0x1c, 0x23, 0x93,
- 0xd7, 0xd3, 0x2a, 0x5f, 0x01, 0x88, 0xd6, 0x6b, 0x0a, 0x37, 0xb0, 0x1d,
- 0xd3, 0xe1, 0x69, 0xd3, 0xd0, 0x29, 0xf7, 0x10, 0x27, 0x0e, 0xda, 0xc5,
- 0xeb, 0x1f, 0x6e, 0x91, 0x5b, 0xd3, 0x76, 0xd3, 0x32, 0x6f, 0x13, 0x7a,
- 0xb8, 0x17, 0xb5, 0x4c, 0x14, 0xf3, 0xa8, 0x27, 0x0c, 0xaf, 0x61, 0x0c,
- 0x43, 0x42, 0x77, 0x8a, 0x50, 0x8d, 0x86, 0x21, 0x1a, 0xa0, 0x9c, 0x70,
- 0x13, 0x02, 0x72, 0xb0, 0x6b, 0x37, 0x88, 0xab, 0xec, 0x96, 0x0b, 0x49,
- 0x43, 0x93, 0x8b, 0xb9, 0xd9, 0x95, 0x16, 0x59, 0xbe, 0x1c, 0xbf, 0x3a,
- 0x39, 0x69, 0x15, 0x9d, 0xd2, 0xd6, 0x21, 0x92, 0xca, 0x68, 0x26, 0x49,
- 0x4d, 0x20, 0xbf, 0x80, 0x13, 0x89, 0x45, 0xe1, 0xb9, 0x59, 0xa4, 0xb9,
- 0x7e, 0x88, 0xbc, 0x18, 0x46, 0x90, 0x6b, 0x2b, 0xcf, 0x94, 0x53, 0xbc,
- 0xd6, 0x85, 0x99, 0x66, 0x4e, 0xc8, 0x6b, 0x57, 0xeb, 0x65, 0x5a, 0xfc,
- 0xfa, 0xc8, 0x71, 0xbe, 0xa1, 0xe7, 0x4a, 0x39, 0x64, 0xb7, 0xf8, 0x5e,
- 0xf9, 0xb1, 0xde, 0x90, 0xd6, 0x22, 0x8d, 0x39, 0xce, 0x2b, 0x69, 0xdb,
- 0x08, 0x78, 0x39, 0xf8, 0xdb, 0xb9, 0xb9, 0x86, 0x59, 0x29, 0x70, 0x2e,
- 0x79, 0x70, 0xb3, 0x5c, 0x8d, 0x20, 0x03, 0xb6, 0xde, 0x06, 0x97, 0xba,
- 0x4e, 0x41, 0x0e, 0xa3, 0x6d, 0xac, 0x96, 0x3b, 0xe8, 0x8a, 0x4a, 0x7c,
- 0xe1, 0xb7, 0xbc, 0x01, 0xad, 0x2b, 0x70, 0xff, 0x1d, 0xe0, 0x2b, 0xf0,
- 0x4b, 0xdc, 0x00, 0x29, 0x24, 0xda, 0xfa, 0xfd, 0x56, 0x12, 0x6f, 0xdd,
- 0xf2, 0x80, 0x71, 0x5a, 0x00, 0x2c, 0xbf, 0x2d, 0xa5, 0x45, 0x10, 0x61,
- 0x3c, 0x26, 0xe6, 0x9f, 0xe9, 0xba, 0xc8, 0x6f, 0x51, 0xd1, 0x61, 0x54,
- 0x89, 0x17, 0xd4, 0xb9, 0xa4, 0xa7, 0x25, 0xc7, 0x2b, 0x56, 0x6c, 0x12,
- 0xad, 0x4f, 0xc1, 0x2a, 0x3e, 0x98, 0x97, 0x8d, 0xc2, 0xb8, 0xa4, 0xfc,
- 0x1e, 0x1e, 0x63, 0xe0, 0x63, 0xa3, 0x83, 0xad, 0x47, 0xf2, 0x83, 0x8a,
- 0xac, 0x21, 0xf7, 0xc7, 0xc6, 0xc8, 0x56, 0x3b, 0x5a, 0x78, 0x01, 0x44,
- 0xb0, 0x15, 0x15, 0x0d, 0x6c, 0xe8, 0xb0, 0x8d, 0xcd, 0x70, 0x49, 0xfa,
- 0xed, 0x00, 0x82, 0xd7, 0x86, 0x4b, 0x48, 0xc7, 0xb6, 0x7a, 0xe2, 0xbe,
- 0x2c, 0xb1, 0x54, 0x26, 0xdb, 0x3f, 0xc8, 0x35, 0xdf, 0xca, 0xbb, 0x91,
- 0x09, 0x34, 0x78, 0x72, 0xe1, 0x5b, 0xe9, 0x8e, 0x19, 0xca, 0xee, 0x4e,
- 0x1f, 0xb0, 0x91, 0xd7, 0x92, 0xb8, 0xd5, 0xa5, 0x0c, 0x28, 0x85, 0xf9,
- 0x82, 0xc8, 0x7f, 0x4f, 0xd3, 0x1b, 0x16, 0x61, 0xee, 0xbd, 0x6b, 0x7e,
- 0x25, 0xbc, 0x8e, 0x2a, 0xbd, 0x10, 0xe4, 0xa4, 0x7f, 0x03, 0x49, 0x49,
- 0x95, 0x88, 0xf6, 0x2a, 0xb8, 0x97, 0x5d, 0x57, 0x7d, 0xf1, 0xe2, 0xcf,
- 0x57, 0xd4, 0x0d, 0x5d, 0xe7, 0x55, 0x31, 0x21, 0xb6, 0xfb, 0xdd, 0x6b,
- 0x48, 0xdb, 0x6b, 0xe8, 0x13, 0xe4, 0x35, 0xf3, 0xf5, 0x58, 0xd7, 0x99,
- 0xe8, 0x52, 0x8c, 0x3c, 0x4b, 0xa5, 0x76, 0xd4, 0x40, 0x84, 0xf2, 0xf4,
- 0x6c, 0xf7, 0x65, 0x3e, 0x58, 0x6e, 0xdb, 0x2e, 0x35, 0xbd, 0x01, 0xb2,
- 0x6e, 0xbe, 0x18, 0xf9, 0x55, 0x13, 0xe2, 0xa6, 0xd5, 0x62, 0xad, 0x1d,
- 0xa3, 0xac, 0xb3, 0xe6, 0xc6, 0x97, 0x87, 0x9a, 0x7f, 0x28, 0x32, 0x7b,
- 0x3f, 0x6c, 0x77, 0x1c, 0xde, 0xa9, 0x9d, 0xc1, 0x46, 0xac, 0x63, 0x27,
- 0x55, 0x78, 0x53, 0x0a, 0x96, 0xed, 0xaa, 0xda, 0x69, 0xae, 0x78, 0x5e,
- 0xf8, 0xf4, 0x9e, 0x46, 0x83, 0xa3, 0x22, 0x97, 0x5f, 0x0a, 0xaa, 0x7c,
- 0xa6, 0xae, 0x4e, 0xef, 0x1b, 0x23, 0xc3, 0x65, 0xcc, 0x47, 0xf4, 0x2b,
- 0x52, 0x2c, 0xb3, 0x1b, 0x00, 0xb8, 0xdd, 0x71, 0x3f, 0x0c, 0xaf, 0xfe,
- 0xd8, 0x6f, 0x46, 0x43, 0x53, 0xed, 0x4c, 0x0d, 0x79, 0xd5, 0x48, 0x3c,
- 0x08, 0x6f, 0x22, 0x40, 0x0a, 0xd4, 0xc4, 0x83, 0xb0, 0x44, 0x0b, 0x21,
- 0xe9, 0x97, 0xce, 0xdc, 0x4c, 0x20, 0x64, 0x79, 0x38, 0xf8, 0x5c, 0x27,
- 0x99, 0x40, 0x8b, 0x06, 0x9e, 0x4a, 0x74, 0x38, 0x8c, 0x36, 0xb3, 0xe2,
- 0xee, 0xab, 0x5a, 0xa5, 0x47, 0x3c, 0x2d, 0xbc, 0xd0, 0xb6, 0x59, 0x20,
- 0xf5, 0x1f, 0x2a, 0x35, 0x64, 0xd1, 0xdf, 0x8f, 0x65, 0x94, 0x1c, 0xd3,
- 0xd3, 0xe1, 0x40, 0x7f, 0xc0, 0x08, 0x00, 0x89, 0x77, 0x8d, 0x40, 0xcd,
- 0x42, 0x80, 0xa1, 0xd7, 0xa5, 0x2b, 0xa1, 0x3c, 0xc6, 0xcb, 0xa5, 0xac,
- 0x3b, 0x94, 0xf8, 0x8f, 0xa4, 0xd3, 0x15, 0xa9, 0xed, 0xaa, 0x6b, 0x26,
- 0x5b, 0x97, 0x8b, 0x72, 0x32, 0x31, 0x8b, 0xdf, 0x52, 0x2d, 0xc5, 0x7c,
- 0x3b, 0xf0, 0x25, 0xfb, 0x33, 0x49, 0xab, 0x4b, 0x58, 0xd2, 0x03, 0x98,
- 0x11, 0xec, 0xa8, 0xa7, 0x59, 0xb8, 0x4e, 0xba, 0xfa, 0x79, 0x85, 0x42,
- 0x8f, 0xc8, 0x19, 0xce, 0x06, 0xb4, 0x04, 0x48, 0x6b, 0x6b, 0xf9, 0xfd,
- 0x51, 0xd0, 0x48, 0x3f, 0xd5, 0xe9, 0x71, 0xb6, 0x61, 0x5f, 0xba, 0xac,
- 0xeb, 0x3f, 0x03, 0xb6, 0x25, 0xad, 0x08, 0xf3, 0x3a, 0x8c, 0xaf, 0x60,
- 0x0b, 0xda, 0x0b, 0xda, 0xfa, 0x4f, 0xfa, 0xe3, 0x60, 0x40, 0xff, 0x3d,
- 0xfc, 0xe7, 0x16, 0x42, 0x30, 0xcf, 0xf7, 0xf6, 0x6e, 0x6e, 0x6e, 0x46,
- 0x0a, 0x28, 0x68, 0x8e, 0xec, 0xb3, 0xb0, 0xf2, 0x8f, 0x70, 0xd8, 0x7a,
- 0x3e, 0x70, 0x91, 0x6c, 0xe5, 0xcb, 0xcb, 0xbf, 0x1e, 0x0c, 0x0f, 0xf6,
- 0xf7, 0xf7, 0x7f, 0x1c, 0xad, 0x68, 0x7f, 0xe7, 0x18, 0xd6, 0xfc, 0xd7,
- 0x1f, 0x76, 0x8f, 0x67, 0xb2, 0x17, 0x85, 0x7c, 0xe5, 0xdf, 0xa9, 0x95,
- 0x5d, 0x70, 0xd3, 0x0e, 0x26, 0xe5, 0xe7, 0x1e, 0x8b, 0xe1, 0x38, 0x72,
- 0xba, 0xa9, 0x8e, 0x9e, 0x53, 0x07, 0x29, 0x84, 0xf0, 0xf8, 0xe8, 0xf0,
- 0x30, 0x61, 0x85, 0x83, 0xcb, 0xd3, 0x38, 0x95, 0x81, 0x90, 0x09, 0xa4,
- 0xc3, 0x38, 0xcb, 0x32, 0x82, 0x5e, 0x4c, 0x39, 0x58, 0x63, 0x28, 0xa3,
- 0x27, 0xa5, 0x93, 0x0d, 0xe3, 0xdc, 0x08, 0xf2, 0x72, 0x76, 0xe7, 0x46,
- 0x35, 0x24, 0x5e, 0x11, 0x63, 0xa5, 0x26, 0xa1, 0x77, 0x3e, 0xc4, 0x63,
- 0x2a, 0xd9, 0xd6, 0x41, 0x39, 0xa1, 0xb4, 0xbe, 0x83, 0x94, 0x03, 0x4c,
- 0x6e, 0x51, 0x4a, 0x9f, 0x6b, 0x44, 0xee, 0xe7, 0xeb, 0x4a, 0xba, 0x1c,
- 0x21, 0xd1, 0xe1, 0x26, 0xbd, 0x6b, 0x09, 0x7b, 0xb3, 0xe3, 0x2f, 0xcc,
- 0x7f, 0x02, 0xbf, 0xb6, 0x5c, 0x4d, 0x52, 0x2d, 0x6d, 0x9b, 0xe6, 0x79,
- 0xd6, 0x4c, 0xaf, 0xba, 0xe9, 0x96, 0xe0, 0xe0, 0x66, 0xb6, 0x57, 0x66,
- 0x41, 0x77, 0xb6, 0xa1, 0x7a, 0xac, 0x03, 0xa4, 0x57, 0x97, 0x6b, 0x86,
- 0xa4, 0x86, 0x1f, 0x28, 0x4d, 0xe0, 0x86, 0xf0, 0xcc, 0x14, 0x7b, 0xd0,
- 0x3d, 0x6d, 0xdf, 0x44, 0x7c, 0x2f, 0xaf, 0xb5, 0x6c, 0x78, 0x7a, 0x95,
- 0x2d, 0x85, 0x63, 0xee, 0x68, 0xce, 0xe4, 0x96, 0xd0, 0xe0, 0x56, 0xc4,
- 0x22, 0xdf, 0x9a, 0xeb, 0xaf, 0xcc, 0x4a, 0x76, 0xa5, 0xf0, 0xd6, 0x8a,
- 0x39, 0xe9, 0x85, 0x74, 0xb9, 0x26, 0xc3, 0x71, 0x92, 0x8a, 0x3c, 0xd1,
- 0x7a, 0xf0, 0x9e, 0xcc, 0x66, 0xc3, 0x16, 0xb3, 0x0a, 0x42, 0xac, 0x5e,
- 0x4f, 0x86, 0xa2, 0xf9, 0x60, 0x46, 0x48, 0x2e, 0xa1, 0xdb, 0xfa, 0xfa,
- 0xe4, 0xd5, 0x05, 0x97, 0xc0, 0x9a, 0xff, 0x52, 0xb5, 0x8c, 0xf9, 0x83,
- 0x2a, 0x5f, 0xc3, 0x46, 0x55, 0xe7, 0x47, 0x9c, 0x42, 0x04, 0x62, 0xb5,
- 0x11, 0xa5, 0xd4, 0xa5, 0xd9, 0xb5, 0x54, 0xbf, 0x81, 0xd7, 0xf6, 0x24,
- 0x92, 0x3b, 0xdc, 0xd2, 0x12, 0x6d, 0xe5, 0xf4, 0xa3, 0xc7, 0xa3, 0x7d,
- 0x5e, 0x22, 0xed, 0xa1, 0x64, 0xd0, 0x48, 0xa5, 0x16, 0xdc, 0x48, 0x1a,
- 0x61, 0x4c, 0xe3, 0x39, 0x03, 0x76, 0x2a, 0x83, 0x84, 0xf1, 0xcf, 0x19,
- 0x4a, 0x41, 0x7f, 0xeb, 0x65, 0x4b, 0xde, 0x53, 0x0e, 0xa3, 0xb2, 0x4b,
- 0x72, 0x84, 0xef, 0xba, 0xd8, 0xd5, 0x40, 0x16, 0xd7, 0x2a, 0x1d, 0x30,
- 0xe1, 0x58, 0xb9, 0x9c, 0xd0, 0x84, 0xe4, 0x8d, 0x0f, 0x5c, 0xe7, 0xa9,
- 0x92, 0xa4, 0x80, 0xc8, 0x2c, 0xa9, 0x3e, 0x42, 0xa7, 0x56, 0xd7, 0xea,
- 0x30, 0xa6, 0x9f, 0x04, 0x2d, 0xbd, 0x86, 0x7f, 0x16, 0xe4, 0x59, 0xd6,
- 0x93, 0x63, 0xa5, 0x5f, 0x38, 0xcb, 0x5d, 0x4d, 0x73, 0x65, 0xd3, 0x55,
- 0x55, 0xce, 0x11, 0x39, 0x0c, 0xf9, 0xe4, 0x9b, 0x6e, 0x57, 0xf6, 0x2c,
- 0xb0, 0x71, 0x80, 0x6f, 0xe2, 0x55, 0xf7, 0xa5, 0x58, 0x1e, 0x8b, 0x08,
- 0x36, 0xf4, 0x38, 0x32, 0xb4, 0xf5, 0x47, 0x0a, 0x09, 0x7d, 0xf1, 0xd2,
- 0x46, 0x10, 0xe3, 0x50, 0x46, 0x50, 0xa7, 0x6a, 0xe6, 0x6f, 0x6d, 0x63,
- 0x46, 0x78, 0x1a, 0xf1, 0xfd, 0xec, 0x96, 0x31, 0x3b, 0x71, 0x72, 0x37,
- 0x79, 0x71, 0x74, 0x98, 0xd4, 0x77, 0x46, 0x83, 0x58, 0xfa, 0x9b, 0xd0,
- 0x6d, 0x38, 0x1e, 0x0d, 0x85, 0xb5, 0x3a, 0xf5, 0x31, 0xeb, 0xfa, 0x40,
- 0xaf, 0xbc, 0xc4, 0x2b, 0xd2, 0xdd, 0x4b, 0xf3, 0xf5, 0x1e, 0xd0, 0xc5,
- 0xbe, 0x54, 0x26, 0x36, 0x59, 0xa4, 0xc5, 0x27, 0x9b, 0x55, 0xcd, 0x03,
- 0x0d, 0xa8, 0x39, 0x2c, 0x17, 0x92, 0xba, 0x1f, 0xca, 0xf6, 0xb0, 0x60,
- 0x0c, 0xba, 0xa8, 0x41, 0xb1, 0x5f, 0xa6, 0x15, 0x6a, 0x0c, 0xb1, 0x6d,
- 0x92, 0xfe, 0xec, 0x1f, 0x8a, 0x2d, 0x0f, 0x06, 0x11, 0x79, 0x3d, 0xd5,
- 0x43, 0x11, 0xc6, 0x31, 0x76, 0xc6, 0xfd, 0xd1, 0x1c, 0xf2, 0x9e, 0x8e,
- 0x70, 0xbf, 0x5c, 0x6c, 0xdd, 0x02, 0x21, 0x1b, 0xae, 0x6d, 0xfe, 0xfb,
- 0x5c, 0x03, 0x80, 0x7d, 0xfc, 0xbb, 0x11, 0xac, 0x32, 0xd7, 0xf1, 0xdc,
- 0x86, 0x0c, 0xfd, 0x16, 0xb6, 0xac, 0xe2, 0xb9, 0x50, 0x65, 0x2c, 0xc2,
- 0x3e, 0x4a, 0xce, 0x9c, 0x39, 0x59, 0x0c, 0x80, 0x89, 0xdb, 0x54, 0x53,
- 0x31, 0x26, 0xf1, 0x77, 0x49, 0xdd, 0x4c, 0x17, 0xd1, 0x96, 0xec, 0xd0,
- 0x72, 0xea, 0x1c, 0xd0, 0xdc, 0x56, 0x12, 0x78, 0x22, 0x8e, 0xbb, 0xa5,
- 0x3a, 0x7e, 0x6c, 0xb6, 0x96, 0xda, 0x8a, 0x02, 0xba, 0x2a, 0xc8, 0xcc,
- 0xe6, 0x45, 0x44, 0x1b, 0xec, 0xc4, 0xd7, 0x5b, 0x4b, 0x24, 0x7f, 0x61,
- 0x64, 0xe2, 0x7a, 0x65, 0x43, 0x0f, 0x89, 0x80, 0x34, 0x10, 0xfa, 0x4b,
- 0x59, 0x0c, 0x02, 0x7c, 0x27, 0xc4, 0xce, 0xc5, 0xe9, 0x44, 0x59, 0x81,
- 0x4b, 0xe9, 0xe1, 0x9d, 0x59, 0x57, 0x33, 0xbf, 0xa9, 0xe4, 0xe9, 0x3e,
- 0x7e, 0x4f, 0xab, 0x61, 0xee, 0x05, 0xa4, 0x87, 0x61, 0x68, 0x70, 0xc0,
- 0xb5, 0x7c, 0xc1, 0x92, 0xce, 0x0a, 0xbd, 0x91, 0x02, 0x37, 0x95, 0x73,
- 0x21, 0x75, 0xed, 0xef, 0xd5, 0x15, 0x35, 0x6d, 0xf2, 0xbc, 0x1f, 0x82,
- 0xd9, 0x65, 0xf4, 0xcd, 0x40, 0x5f, 0x46, 0x0b, 0x02, 0xce, 0x44, 0x34,
- 0x3b, 0x0c, 0x98, 0x68, 0xca, 0xe7, 0xa1, 0x84, 0x49, 0x97, 0x9e, 0x4c,
- 0x1a, 0x45, 0x56, 0xb0, 0x5d, 0x5f, 0x2a, 0xf8, 0x5a, 0x32, 0x0d, 0xb1,
- 0x13, 0x67, 0x0c, 0xad, 0x5b, 0xf3, 0x88, 0xb6, 0xc1, 0xf9, 0xa5, 0x48,
- 0x91, 0x9a, 0xd2, 0x3c, 0x0d, 0x43, 0x63, 0x54, 0x6b, 0xda, 0x9c, 0xda,
- 0xed, 0x7c, 0xa4, 0xa9, 0x14, 0xaf, 0x34, 0xd1, 0x36, 0x1a, 0x77, 0x3e,
- 0xe4, 0xaf, 0xb9, 0x0d, 0xd7, 0x39, 0xef, 0x3d, 0xc3, 0x99, 0x4d, 0xaa,
- 0x3c, 0x9b, 0x1b, 0xee, 0x85, 0x25, 0x71, 0x0a, 0x69, 0xe0, 0x35, 0xca,
- 0x08, 0xf7, 0x9a, 0xb2, 0xd3, 0xcd, 0x39, 0x52, 0x01, 0x71, 0x0e, 0xc7,
- 0x11, 0xf3, 0x44, 0x0b, 0x2e, 0xc7, 0x20, 0xf3, 0xd7, 0xda, 0xb8, 0x39,
- 0xd5, 0x92, 0xa6, 0x68, 0x7e, 0x26, 0xfa, 0xb0, 0x8b, 0xc7, 0x93, 0x08,
- 0xac, 0xa0, 0x5b, 0x6c, 0x1b, 0x39, 0xe2, 0x8b, 0xcc, 0x56, 0x45, 0xbb,
- 0xf1, 0xba, 0x81, 0xf5, 0x74, 0xd6, 0x85, 0xfd, 0xf4, 0x4d, 0x56, 0x19,
- 0xf1, 0x57, 0x9a, 0x75, 0x7f, 0xfb, 0x58, 0xa3, 0x10, 0xd2, 0x94, 0x5e,
- 0x94, 0x11, 0xb9, 0xa5, 0x68, 0x90, 0x88, 0xa9, 0x07, 0xe1, 0x0b, 0x2e,
- 0xde, 0xa0, 0xbd, 0xd5, 0x37, 0x7d, 0x85, 0xa4, 0x4b, 0xa1, 0x03, 0x80,
- 0x14, 0x1b, 0xea, 0x23, 0xf5, 0x32, 0xde, 0x7d, 0x4c, 0xbf, 0x09, 0xf5,
- 0xcf, 0x68, 0x58, 0x44, 0x2d, 0xe4, 0xce, 0x33, 0xf7, 0xb6, 0x9c, 0x34,
- 0x29, 0x37, 0xf0, 0xb6, 0x33, 0xbf, 0xc8, 0xc9, 0xe1, 0xa3, 0x79, 0x4e,
- 0xd1, 0xb2, 0x9e, 0xe6, 0x4a, 0x1a, 0x13, 0x28, 0x3e, 0x78, 0x27, 0x3d,
- 0x82, 0xb4, 0xc8, 0xfa, 0x8a, 0x14, 0x31, 0xd2, 0x0f, 0x60, 0xe4, 0xc7,
- 0xd5, 0x7b, 0x6c, 0xda, 0xbb, 0x8b, 0xd3, 0xb7, 0x83, 0xce, 0xb5, 0x13,
- 0x95, 0xc6, 0xb3, 0x88, 0x95, 0xe5, 0x08, 0x4d, 0x85, 0x98, 0x00, 0x55,
- 0x22, 0xfb, 0x61, 0x4b, 0x0c, 0x19, 0x93, 0x82, 0xb6, 0x6e, 0x20, 0xc9,
- 0x38, 0x95, 0x94, 0xae, 0xa9, 0xd9, 0xcf, 0xfb, 0x1a, 0x7a, 0xb2, 0x89,
- 0x08, 0x6b, 0x9c, 0x3d, 0x5c, 0x25, 0x46, 0x9e, 0x18, 0x66, 0xb3, 0x09,
- 0x60, 0xfd, 0xc2, 0x69, 0xc5, 0xee, 0xab, 0xbc, 0x14, 0x62, 0x2f, 0xdc,
- 0x30, 0x23, 0x79, 0x5d, 0xde, 0x14, 0xc3, 0x53, 0xaa, 0x3e, 0x4e, 0x4e,
- 0xcb, 0x4b, 0xba, 0x41, 0xef, 0x00, 0x1f, 0x15, 0x9c, 0xda, 0x87, 0xf3,
- 0x77, 0xc9, 0x0e, 0xc9, 0xdd, 0xe4, 0xdc, 0x62, 0xce, 0xd1, 0xa3, 0xbb,
- 0x62, 0x62, 0xd4, 0xac, 0x92, 0xc8, 0x6c, 0x06, 0xc9, 0xf1, 0xf7, 0x2f,
- 0xdf, 0x9e, 0x9f, 0x1e, 0xff, 0xc0, 0x09, 0x32, 0xc1, 0x72, 0xe8, 0xc7,
- 0x5f, 0x7a, 0x36, 0x17, 0x22, 0x34, 0x94, 0x34, 0x68, 0x66, 0x12, 0x05,
- 0x9c, 0x21, 0xea, 0x64, 0xb6, 0xa8, 0x24, 0x38, 0x1e, 0x9f, 0x9f, 0x0c,
- 0x15, 0x2d, 0x8e, 0x7b, 0x95, 0xe6, 0x05, 0x99, 0x47, 0x30, 0xb1, 0xb5,
- 0xcd, 0x09, 0x51, 0xd1, 0x30, 0x70, 0xca, 0xc8, 0x7d, 0x18, 0x24, 0xef,
- 0x34, 0x15, 0x71, 0x80, 0x43, 0xa7, 0x3b, 0xf8, 0x3a, 0xbf, 0x44, 0x44,
- 0xa9, 0x93, 0x43, 0x26, 0x06, 0x08, 0xd1, 0x41, 0x80, 0xc5, 0xe8, 0x75,
- 0x99, 0xab, 0xb3, 0x05, 0x3b, 0x2f, 0x7b, 0xe5, 0x23, 0xb3, 0x48, 0x9c,
- 0x22, 0xea, 0x44, 0x82, 0x50, 0x99, 0xd4, 0x8d, 0x4c, 0x5a, 0xed, 0xed,
- 0x2c, 0x85, 0xb0, 0x54, 0x10, 0x5d, 0xc2, 0xb2, 0xfd, 0xe7, 0xc9, 0xd6,
- 0x70, 0x9d, 0x3c, 0xdf, 0xfa, 0x15, 0x55, 0x04, 0xdf, 0xd3, 0x1b, 0x69,
- 0x96, 0xa5, 0x45, 0xbb, 0x36, 0x28, 0xa0, 0x5d, 0x1e, 0xb8, 0x8d, 0x82,
- 0x38, 0xdc, 0xe0, 0x33, 0x37, 0x37, 0x5d, 0x14, 0xfa, 0xc9, 0xfa, 0xf2,
- 0x32, 0x02, 0xe7, 0x42, 0x9d, 0xf8, 0x32, 0xb8, 0x7f, 0xc8, 0x9b, 0xb2,
- 0x5d, 0x27, 0xec, 0xc3, 0x37, 0xf3, 0xdf, 0x42, 0x5c, 0x92, 0x79, 0xc8,
- 0x55, 0x59, 0xce, 0x48, 0x55, 0x7d, 0x99, 0x70, 0x00, 0x82, 0xa2, 0x14,
- 0x55, 0x13, 0x0e, 0xc7, 0xda, 0xdb, 0xf6, 0x9f, 0xb6, 0x6d, 0x94, 0x75,
- 0x4b, 0xf4, 0x2a, 0xf0, 0xeb, 0x2d, 0x56, 0x62, 0x27, 0xdc, 0xf0, 0x76,
- 0x90, 0x6c, 0xbf, 0xd8, 0x96, 0xe7, 0xb6, 0xa2, 0x2a, 0x1a, 0xbf, 0xc3,
- 0x11, 0x3e, 0xd6, 0xaa, 0xa7, 0xd6, 0x05, 0x4a, 0xca, 0x5f, 0x3e, 0x9b,
- 0x65, 0x10, 0xdb, 0xd2, 0x33, 0x32, 0x61, 0x84, 0xc7, 0x81, 0xf8, 0x7e,
- 0xba, 0x2a, 0x07, 0xa6, 0xae, 0x33, 0xe7, 0xb9, 0x52, 0x2b, 0x43, 0x9e,
- 0x81, 0xd7, 0x59, 0x99, 0x42, 0x12, 0xae, 0xc7, 0x9f, 0x7c, 0xb5, 0xef,
- 0xa6, 0x70, 0x5a, 0x29, 0x19, 0xc7, 0xd0, 0x84, 0xa3, 0x05, 0x84, 0x83,
- 0x4e, 0x6d, 0x1e, 0xe2, 0x5a, 0xa1, 0xfb, 0xd2, 0xeb, 0x82, 0x61, 0x46,
- 0xde, 0xae, 0x08, 0xbb, 0xac, 0xfc, 0x84, 0x9e, 0xae, 0x65, 0xd5, 0xf7,
- 0x7d, 0xf5, 0xec, 0x3a, 0xc2, 0x63, 0x51, 0xab, 0x05, 0x12, 0xa4, 0x4d,
- 0xe0, 0x41, 0xd1, 0x05, 0xd4, 0xb6, 0x1b, 0x84, 0x68, 0x36, 0xdc, 0x59,
- 0x4e, 0x7a, 0x06, 0x0f, 0x6d, 0xe8, 0xa9, 0x1d, 0x2b, 0xd5, 0x2a, 0xe1,
- 0x98, 0x9b, 0xd5, 0x2f, 0xb7, 0x6d, 0x77, 0x2f, 0x14, 0x57, 0x36, 0x1a,
- 0x0c, 0x6c, 0xac, 0xd4, 0x6e, 0xd5, 0x6f, 0x8e, 0xfa, 0x21, 0xd4, 0xfc,
- 0xc0, 0x5b, 0x98, 0xfc, 0x19, 0x0d, 0x8b, 0x7c, 0x2b, 0xb7, 0xaa, 0x0e,
- 0xed, 0xac, 0xd7, 0x12, 0x38, 0xf3, 0xa3, 0x51, 0x52, 0x2a, 0xc8, 0x5e,
- 0xc3, 0x42, 0x5b, 0x74, 0x71, 0x7c, 0x5e, 0xd3, 0x06, 0x72, 0x78, 0xf7,
- 0xeb, 0x51, 0x44, 0x85, 0x65, 0x9d, 0x14, 0x24, 0x27, 0xab, 0x61, 0xf7,
- 0x3a, 0x42, 0x69, 0xfa, 0xbe, 0x66, 0xec, 0xa0, 0x27, 0x3b, 0x0f, 0x1d,
- 0x0b, 0xad, 0x42, 0x7e, 0x1c, 0x55, 0x33, 0x04, 0x2b, 0xee, 0x24, 0xb1,
- 0x86, 0xdb, 0x76, 0x17, 0x9f, 0x34, 0x83, 0x92, 0x06, 0xcf, 0x6e, 0xb3,
- 0xe9, 0xba, 0x69, 0x97, 0xc0, 0x79, 0x73, 0x52, 0x64, 0x27, 0x9e, 0xd6,
- 0x0e, 0xae, 0x82, 0x00, 0xde, 0x6c, 0x9d, 0x2b, 0x2c, 0xcf, 0xf3, 0xad,
- 0x5d, 0x89, 0xe3, 0xa6, 0xac, 0xc1, 0xf3, 0x8f, 0x63, 0xf1, 0x59, 0x9d,
- 0x73, 0x95, 0xb1, 0x3b, 0xd5, 0x25, 0x2b, 0x44, 0x3f, 0x6f, 0x88, 0xb4,
- 0x9a, 0xc5, 0xbe, 0xfd, 0x86, 0x7d, 0x6f, 0xde, 0xa7, 0x6d, 0xbb, 0x4e,
- 0x71, 0xcb, 0xd5, 0xc1, 0x55, 0x0e, 0xbe, 0x8c, 0xb6, 0xe5, 0xa3, 0xe4,
- 0xe5, 0xb5, 0xa1, 0x6e, 0xd8, 0xf1, 0xfa, 0xaa, 0xee, 0x7f, 0xe0, 0x0e,
- 0x3d, 0x39, 0xbf, 0x7e, 0x22, 0xde, 0x6c, 0x52, 0x39, 0x48, 0xe6, 0xe1,
- 0x47, 0x96, 0xe3, 0x07, 0xab, 0xf8, 0x54, 0x4d, 0x1e, 0x99, 0x3f, 0xbe,
- 0xa1, 0x3f, 0xe6, 0xec, 0x16, 0x10, 0x50, 0x3d, 0xf6, 0xc3, 0x86, 0xa4,
- 0x3d, 0x3e, 0xb5, 0x7f, 0xd8, 0x44, 0x2d, 0x73, 0xea, 0x54, 0xa9, 0x48,
- 0x10, 0x7c, 0x0e, 0x0c, 0x09, 0xa6, 0x8d, 0x8e, 0x33, 0xd0, 0xfa, 0xe1,
- 0x78, 0x7d, 0x07, 0x10, 0xe3, 0x06, 0x40, 0x64, 0x1b, 0xc0, 0xe7, 0x34,
- 0x66, 0x46, 0x5e, 0xc6, 0xea, 0x47, 0xcd, 0x56, 0xfd, 0x83, 0xe2, 0x70,
- 0xb6, 0x94, 0x7d, 0x96, 0x69, 0x6e, 0x85, 0x90, 0xa0, 0x97, 0xcf, 0xc1,
- 0xde, 0x69, 0xba, 0x66, 0xcc, 0xce, 0xc2, 0x84, 0x54, 0x0b, 0x94, 0xd7,
- 0xb7, 0x64, 0x08, 0x77, 0xf9, 0x23, 0xc4, 0x9c, 0xed, 0x7f, 0xef, 0x35,
- 0xea, 0xa7, 0xe5, 0xc2, 0xf3, 0x55, 0x80, 0xf3, 0x23, 0xb5, 0x87, 0xcd,
- 0x19, 0x31, 0x38, 0x1d, 0x3c, 0x2c, 0xb6, 0x0e, 0x2b, 0x26, 0x3d, 0xf3,
- 0x5c, 0xa2, 0x65, 0x24, 0x35, 0xdd, 0x00, 0x57, 0xf8, 0xa4, 0xd1, 0xea,
- 0x65, 0xb6, 0xa4, 0xc0, 0x97, 0x95, 0x8b, 0x82, 0xe1, 0x45, 0x8a, 0x15,
- 0x3e, 0x3e, 0x8c, 0x0f, 0x37, 0x23, 0xfd, 0x8d, 0x44, 0x2c, 0xa7, 0x6f,
- 0xfd, 0x5b, 0x10, 0xed, 0xac, 0xef, 0x8a, 0xe9, 0xd5, 0xeb, 0x77, 0xe3,
- 0xf8, 0xeb, 0xe1, 0xe2, 0xf0, 0xbc, 0xd1, 0x43, 0x88, 0x18, 0xa0, 0xc0,
- 0x08, 0x88, 0xa5, 0x51, 0xf2, 0x5e, 0x7a, 0xbf, 0x8b, 0x0f, 0xd7, 0x7a,
- 0xc1, 0x7a, 0x02, 0x49, 0xb1, 0x60, 0x26, 0x2e, 0x9a, 0x27, 0xc2, 0x2e,
- 0xc3, 0x94, 0xae, 0x02, 0x2d, 0x2f, 0x54, 0xa0, 0xed, 0x9d, 0xa6, 0x80,
- 0x91, 0xa1, 0x02, 0x19, 0xb2, 0xf2, 0x12, 0xd0, 0xba, 0x74, 0x8d, 0x86,
- 0x3b, 0xfa, 0xc7, 0x4f, 0x39, 0xe6, 0x53, 0x63, 0xd1, 0x66, 0x91, 0xe0,
- 0xa2, 0xbf, 0x43, 0xad, 0x84, 0x20, 0x2f, 0xf8, 0x6b, 0x68, 0x75, 0x41,
- 0xaf, 0x33, 0x99, 0x0e, 0x84, 0x5a, 0xf1, 0xa3, 0xaa, 0x6f, 0x49, 0x66,
- 0x53, 0x0e, 0xbf, 0xfa, 0x73, 0x28, 0x3d, 0x5f, 0xbf, 0xeb, 0xf9, 0x1c,
- 0xfd, 0x66, 0xa8, 0xd5, 0x84, 0xa2, 0x11, 0x78, 0x2a, 0x7d, 0xb8, 0x17,
- 0x82, 0x85, 0x1c, 0x9f, 0x80, 0x02, 0x25, 0xdf, 0xc3, 0x25, 0xcc, 0x13,
- 0xf2, 0xc7, 0xc6, 0x07, 0x25, 0xa7, 0x3f, 0xfe, 0x29, 0x4a, 0xf6, 0xdf,
- 0xe1, 0x04, 0xbf, 0xe4, 0x3d, 0x07, 0x71, 0xcf, 0x45, 0x13, 0xde, 0x8d,
- 0x1c, 0x91, 0xfb, 0x4c, 0x7c, 0x38, 0xe2, 0x6f, 0x31, 0x48, 0x2a, 0xe2,
- 0x0b, 0x87, 0xfc, 0xc7, 0xde, 0xa1, 0x4d, 0x4e, 0xb3, 0x05, 0xa1, 0xb8,
- 0xa4, 0x46, 0x80, 0x87, 0x0a, 0x42, 0x91, 0xdf, 0x8e, 0x91, 0x4f, 0xd0,
- 0x43, 0xcd, 0x48, 0x3c, 0xe0, 0x8c, 0x03, 0xbb, 0x07, 0x34, 0x51, 0xd5,
- 0xc4, 0xa2, 0x33, 0x19, 0xb3, 0xfb, 0xee, 0x3e, 0x62, 0xca, 0x23, 0xf9,
- 0x74, 0x9b, 0x70, 0x37, 0xdf, 0x1a, 0x25, 0x89, 0x84, 0xeb, 0xfd, 0xd7,
- 0xd8, 0xd2, 0x8d, 0x7d, 0x27, 0xd9, 0x99, 0x18, 0x89, 0xed, 0xe1, 0xe8,
- 0x10, 0xbf, 0x79, 0x84, 0x12, 0x96, 0xf8, 0x70, 0x8f, 0x3f, 0x7f, 0xfc,
- 0x68, 0x77, 0x77, 0x20, 0xae, 0x2a, 0xce, 0x8e, 0x99, 0x50, 0x31, 0x56,
- 0x4e, 0x7c, 0x8b, 0xe3, 0x4c, 0xb4, 0xc1, 0x57, 0xdc, 0x57, 0x89, 0xbf,
- 0x1b, 0x89, 0x80, 0x3b, 0x83, 0xcf, 0xbe, 0x4a, 0x87, 0x48, 0x26, 0x38,
- 0x38, 0xba, 0x35, 0x83, 0x53, 0xe5, 0x89, 0xb5, 0x0b, 0xba, 0xf4, 0x72,
- 0x05, 0x38, 0x52, 0x9c, 0x87, 0x91, 0xdc, 0x4a, 0x1c, 0x2f, 0x4e, 0x55,
- 0xd2, 0x86, 0x89, 0xa0, 0xe7, 0x2c, 0xf6, 0xe8, 0x0f, 0xa2, 0xe7, 0x2b,
- 0x6d, 0xe0, 0x7c, 0xbe, 0x9e, 0x2c, 0x8c, 0x04, 0x1a, 0xaf, 0xe7, 0x73,
- 0x73, 0xd6, 0xa7, 0xb9, 0xb4, 0xe2, 0x16, 0x5b, 0x41, 0x7b, 0xa2, 0xf5,
- 0xc9, 0x1c, 0x5e, 0x38, 0x51, 0x1a, 0x93, 0x5a, 0xab, 0x6e, 0xc6, 0x95,
- 0x70, 0xb3, 0xde, 0xb6, 0xb5, 0xe2, 0x6f, 0xd5, 0xeb, 0xf9, 0xb0, 0x6f,
- 0x61, 0xb7, 0x59, 0x1d, 0x9a, 0x71, 0x6f, 0x29, 0x6e, 0x6b, 0x04, 0xf6,
- 0x83, 0xf9, 0x93, 0xed, 0x79, 0xdd, 0x4e, 0xd9, 0xb5, 0x7a, 0xe7, 0x0d,
- 0xe9, 0x9d, 0xc0, 0xe0, 0xa1, 0x68, 0x46, 0xf2, 0x82, 0x35, 0xcc, 0x68,
- 0x17, 0x64, 0x6e, 0xd5, 0x29, 0x60, 0x08, 0xbe, 0x2e, 0x0a, 0xb5, 0x1e,
- 0x7e, 0xff, 0x94, 0x1a, 0x20, 0x4a, 0x12, 0xe6, 0x22, 0x43, 0x46, 0x37,
- 0xf1, 0xc7, 0x10, 0x95, 0xa4, 0x12, 0xfc, 0x77, 0xf1, 0x1a, 0x24, 0xe2,
- 0xfc, 0x10, 0x27, 0x3e, 0xd2, 0xeb, 0x52, 0x00, 0x2b, 0xc1, 0x09, 0xc4,
- 0x78, 0x3e, 0x1c, 0x4b, 0x30, 0xfb, 0x32, 0x8b, 0x19, 0x76, 0xed, 0x10,
- 0x8f, 0x82, 0x2d, 0xd4, 0xec, 0x07, 0x95, 0xaf, 0x84, 0xbe, 0x1b, 0x3a,
- 0xae, 0xd0, 0x12, 0x6b, 0x60, 0x13, 0x27, 0x5b, 0x3c, 0x9f, 0x2d, 0x81,
- 0x43, 0xd1, 0x3a, 0x39, 0x24, 0x60, 0xa9, 0xe1, 0xc0, 0xaa, 0xb7, 0x8c,
- 0xcf, 0xde, 0xbd, 0x48, 0x4c, 0x5d, 0x54, 0xc9, 0x2f, 0x35, 0x8f, 0x6b,
- 0x8b, 0x95, 0xf6, 0xb2, 0xdb, 0x99, 0x5e, 0x86, 0xb3, 0xbb, 0x12, 0x41,
- 0x5c, 0xe0, 0xcc, 0x08, 0x24, 0xa9, 0xd3, 0xa9, 0x99, 0x41, 0x87, 0x5b,
- 0x71, 0x7d, 0xda, 0xee, 0x41, 0x62, 0x9b, 0x4c, 0xb6, 0x0c, 0x3f, 0xfd,
- 0x8a, 0xda, 0xf9, 0x94, 0xde, 0xdd, 0xe4, 0xcd, 0x3a, 0x64, 0xba, 0x12,
- 0x29, 0x06, 0x3e, 0x05, 0x42, 0x13, 0x74, 0x12, 0x0e, 0x44, 0x02, 0x56,
- 0x1e, 0x25, 0xbb, 0x35, 0x00, 0x87, 0xb6, 0x4c, 0x82, 0x7a, 0x91, 0x18,
- 0x85, 0xe4, 0x26, 0xc8, 0x10, 0x27, 0x00, 0x53, 0x37, 0xbb, 0x76, 0x05,
- 0x9c, 0x19, 0xe0, 0xf7, 0xff, 0xa9, 0xbf, 0xfc, 0x48, 0x9b, 0xf5, 0x4f,
- 0xdd, 0x2c, 0x99, 0x76, 0x1a, 0xc0, 0x24, 0xc0, 0xbc, 0xfe, 0x3d, 0x36,
- 0xe5, 0x6f, 0x94, 0xd4, 0xc4, 0x3b, 0x43, 0x00, 0x45, 0x18, 0xee, 0xf7,
- 0x23, 0xab, 0x46, 0xeb, 0x10, 0x54, 0xf6, 0xcd, 0xce, 0x82, 0xc9, 0x5d,
- 0xe0, 0x92, 0x22, 0x1a, 0xfc, 0xa1, 0x18, 0x00, 0x6a, 0xd9, 0x58, 0x74,
- 0x84, 0xd2, 0xc2, 0x9d, 0x74, 0xf9, 0x18, 0x7f, 0xa8, 0x04, 0x73, 0xc8,
- 0xd8, 0x32, 0x66, 0xe2, 0x64, 0xe7, 0xf1, 0xcf, 0xe3, 0x86, 0x85, 0x4d,
- 0x97, 0xd5, 0x7d, 0x6e, 0x81, 0x50, 0x99, 0x91, 0xa8, 0x49, 0xbc, 0x9a,
- 0xe2, 0x13, 0xc5, 0x7f, 0x61, 0x52, 0xed, 0x9e, 0x3d, 0x30, 0x5a, 0x04,
- 0x82, 0x5a, 0x5f, 0xe5, 0xa6, 0x6d, 0x36, 0xa8, 0xf7, 0xfb, 0xff, 0xe4,
- 0x44, 0xc0, 0x7f, 0x86, 0xba, 0xef, 0xd9, 0xc5, 0xf1, 0x73, 0x4c, 0xe9,
- 0xf7, 0xc3, 0xfa, 0x6e, 0x39, 0x29, 0x17, 0x72, 0xeb, 0x68, 0xef, 0xcd,
- 0x06, 0xea, 0xcf, 0x98, 0x46, 0x10, 0xab, 0x1b, 0x7a, 0x00, 0x26, 0x83,
- 0x68, 0x6f, 0x0a, 0xd8, 0x61, 0x49, 0x39, 0xe5, 0x82, 0x56, 0xaa, 0x5d,
- 0x30, 0xb7, 0xef, 0xf7, 0x89, 0xa2, 0x92, 0x70, 0x6b, 0x5a, 0x69, 0x40,
- 0xec, 0x81, 0x66, 0xc6, 0x8b, 0x2c, 0xa3, 0xfb, 0xe7, 0x11, 0x8a, 0xb5,
- 0x9e, 0x62, 0xd0, 0x2f, 0xc4, 0x2c, 0xcc, 0x34, 0x3f, 0xa2, 0x6a, 0x92,
- 0x5f, 0x7d, 0xc5, 0x3f, 0x1a, 0x5e, 0xd0, 0x8f, 0x24, 0x87, 0x46, 0xa1,
- 0x06, 0x88, 0x3a, 0xb5, 0xf2, 0x64, 0x10, 0x29, 0x50, 0x4e, 0x62, 0xa9,
- 0x79, 0x94, 0xfa, 0x6e, 0x18, 0x4d, 0x30, 0x4f, 0xbd, 0xd7, 0x1f, 0x33,
- 0x20, 0xf2, 0xe6, 0xd7, 0xd9, 0xe6, 0xd1, 0x40, 0x17, 0xc4, 0x99, 0x97,
- 0xe8, 0xf8, 0x68, 0xd3, 0x3b, 0x7d, 0x64, 0x16, 0xc6, 0x45, 0xe3, 0x68,
- 0xea, 0xe8, 0xbe, 0xe1, 0x38, 0xaa, 0x02, 0x77, 0x8f, 0xa4, 0xfe, 0x90,
- 0x73, 0xcd, 0xeb, 0x90, 0xd1, 0x50, 0x39, 0x0e, 0xf2, 0x8d, 0x68, 0xdc,
- 0x7b, 0xd6, 0x0a, 0x80, 0x4c, 0x66, 0x5c, 0x7e, 0x93, 0xdb, 0x76, 0x7c,
- 0x5b, 0xb2, 0xfa, 0x28, 0x14, 0xbe, 0x79, 0x38, 0x17, 0x27, 0x97, 0xc8,
- 0xd4, 0x09, 0xba, 0x75, 0x97, 0x9c, 0x7d, 0x88, 0x79, 0xa2, 0x8e, 0x65,
- 0x49, 0x7e, 0xdb, 0x48, 0x9c, 0x39, 0x89, 0xb9, 0xf1, 0x10, 0x1d, 0xfd,
- 0x8f, 0x81, 0x9b, 0x0e, 0xfb, 0xb6, 0x86, 0x5e, 0x98, 0x7d, 0x24, 0x90,
- 0x97, 0x9b, 0x87, 0xe3, 0xfc, 0xfb, 0x27, 0xa3, 0xfd, 0xdd, 0xe0, 0x50,
- 0x9b, 0xd5, 0x47, 0x43, 0x1c, 0xd5, 0xdd, 0x47, 0xca, 0x52, 0xc5, 0x99,
- 0x69, 0x54, 0x01, 0x3f, 0xc0, 0xd6, 0x32, 0x7a, 0xc1, 0x7a, 0x45, 0xe3,
- 0x80, 0xc8, 0x17, 0x25, 0x9b, 0x6c, 0xf7, 0x2d, 0x43, 0x22, 0xd4, 0x92,
- 0xd0, 0xe8, 0x83, 0xe8, 0xec, 0xb4, 0x7b, 0xc0, 0x3d, 0x0a, 0x26, 0x46,
- 0x19, 0x28, 0x1f, 0x11, 0xba, 0xb6, 0xc4, 0x64, 0x24, 0x5f, 0x56, 0xe5,
- 0x53, 0xbf, 0x21, 0x2a, 0x1e, 0x00, 0x3d, 0x31, 0x32, 0x28, 0xc5, 0xb2,
- 0xa3, 0x20, 0xc8, 0x9d, 0xff, 0xc1, 0xff, 0xeb, 0x22, 0x56, 0x9a, 0xec,
- 0x08, 0x11, 0x68, 0xa6, 0x49, 0x79, 0x35, 0x5e, 0xfe, 0x41, 0x88, 0x52,
- 0xdf, 0xf9, 0x1f, 0x50, 0xd6, 0x0f, 0xa5, 0xd9, 0xed, 0x22, 0x4f, 0x6b,
- 0x3b, 0x43, 0x5e, 0x02, 0xae, 0x14, 0x16, 0x2c, 0x78, 0x67, 0xf7, 0xde,
- 0x43, 0xce, 0x40, 0x23, 0x05, 0x64, 0xd4, 0xb3, 0x33, 0x9c, 0x38, 0xdc,
- 0xdd, 0x99, 0xfe, 0x0d, 0xd1, 0x35, 0x0f, 0x37, 0x7f, 0x5b, 0x81, 0xe1,
- 0x76, 0x24, 0x8a, 0x07, 0xed, 0x7c, 0x97, 0xb3, 0xe5, 0x40, 0x0c, 0x0a,
- 0x22, 0x27, 0x2c, 0xe6, 0x9e, 0x5b, 0xbb, 0xd3, 0xee, 0xaf, 0xdc, 0x73,
- 0xce, 0xb6, 0x08, 0x88, 0x99, 0x06, 0xfd, 0xcc, 0xab, 0x0c, 0x62, 0xad,
- 0x94, 0xd6, 0x93, 0x58, 0xd6, 0xa3, 0xa0, 0x02, 0x3f, 0xe1, 0xf3, 0x8f,
- 0xf7, 0x23, 0xf4, 0x8f, 0xf4, 0xe1, 0x8f, 0xf9, 0xca, 0xe7, 0x59, 0x27,
- 0xe7, 0x68, 0x3b, 0x8a, 0xda, 0x17, 0x61, 0xa8, 0x9c, 0x65, 0x4c, 0x49,
- 0x17, 0xf2, 0x03, 0xdc, 0xec, 0x7b, 0x37, 0x73, 0xca, 0xf0, 0x07, 0x70,
- 0x08, 0x78, 0x48, 0x11, 0x43, 0x55, 0xd2, 0xd4, 0x3f, 0x40, 0x5e, 0xaf,
- 0x47, 0x91, 0x40, 0x54, 0x12, 0x71, 0x97, 0xf9, 0x4b, 0x3a, 0x7c, 0xd6,
- 0xbb, 0x24, 0x18, 0x58, 0x76, 0x49, 0x3c, 0xff, 0x56, 0xa7, 0x8d, 0xf6,
- 0x42, 0xbc, 0x99, 0xde, 0xb3, 0x24, 0xb7, 0x8c, 0x7b, 0x67, 0x62, 0xbe,
- 0xf4, 0xd1, 0x61, 0xb4, 0x27, 0xef, 0xec, 0x87, 0x8d, 0x62, 0xe2, 0xc0,
- 0xdb, 0x09, 0xbe, 0x50, 0x69, 0x94, 0x27, 0x92, 0xc4, 0x35, 0xea, 0x24,
- 0xa2, 0x60, 0x77, 0xe8, 0xeb, 0x28, 0x3a, 0x07, 0xed, 0x44, 0x5b, 0xfb,
- 0x73, 0x70, 0x3f, 0xe4, 0xeb, 0x42, 0xa2, 0x6f, 0x5e, 0x4a, 0xd7, 0x74,
- 0x3b, 0x9d, 0x7b, 0xe6, 0xc0, 0x57, 0xe0, 0xfe, 0x59, 0xe0, 0x16, 0x7d,
- 0xac, 0xeb, 0x05, 0x91, 0x7a, 0x3e, 0xbf, 0x33, 0x53, 0xaa, 0x7b, 0xc1,
- 0x63, 0x7c, 0x01, 0xca, 0xcf, 0xe9, 0x61, 0x79, 0x06, 0xf3, 0x76, 0x0d,
- 0x9f, 0xe6, 0x2a, 0xa3, 0xe4, 0x1b, 0x06, 0x07, 0xbf, 0x8f, 0x18, 0x49,
- 0x0c, 0xe3, 0xf3, 0x2e, 0xce, 0x27, 0x7c, 0xc2, 0xaa, 0x0b, 0xa3, 0x64,
- 0x5f, 0x6c, 0xc1, 0x7b, 0x59, 0x68, 0x6b, 0x24, 0x1a, 0xc4, 0x85, 0xb6,
- 0xdb, 0x1b, 0x42, 0x85, 0x88, 0xc1, 0x86, 0xe8, 0xee, 0x7f, 0x84, 0x45,
- 0xc9, 0xf1, 0x68, 0xc9, 0x3a, 0xb7, 0x38, 0x49, 0x34, 0x28, 0x88, 0x43,
- 0x23, 0xca, 0xc3, 0x53, 0x92, 0x85, 0x8b, 0x08, 0xf8, 0x79, 0x12, 0x03,
- 0xb3, 0x40, 0xb7, 0x2b, 0x49, 0xc3, 0xd6, 0xb3, 0xde, 0x29, 0xa5, 0xa6,
- 0x74, 0x48, 0xa5, 0xb0, 0x43, 0xfc, 0xa2, 0xd7, 0xc5, 0xea, 0xd2, 0x3d,
- 0x9a, 0x5d, 0x49, 0x3e, 0x53, 0x45, 0x4d, 0x72, 0x2a, 0x08, 0xba, 0x92,
- 0xbb, 0xa0, 0x4f, 0xa9, 0x2b, 0x8c, 0xe4, 0x79, 0xa6, 0x9b, 0x87, 0xd3,
- 0xd9, 0x48, 0xbb, 0x34, 0x98, 0x5a, 0x97, 0x00, 0xf6, 0x2a, 0x3b, 0xa4,
- 0x64, 0x84, 0x4a, 0x64, 0xe7, 0x48, 0x98, 0x5a, 0x96, 0x75, 0xe1, 0x97,
- 0x5c, 0x18, 0xce, 0xd5, 0x61, 0x5c, 0xff, 0xc2, 0xf5, 0xb6, 0x5c, 0x4a,
- 0x98, 0x14, 0x78, 0x54, 0x59, 0x75, 0xb8, 0xd0, 0x7d, 0x82, 0x31, 0xca,
- 0x18, 0x64, 0x0d, 0xca, 0xa3, 0xfc, 0x35, 0xfc, 0xc6, 0x2c, 0x4a, 0xd2,
- 0x5f, 0xfd, 0x2b, 0x47, 0x47, 0x28, 0x3f, 0xde, 0xa9, 0x1d, 0x8e, 0x32,
- 0xd5, 0xca, 0xcd, 0x12, 0x1b, 0x2f, 0xd8, 0x4d, 0x62, 0x48, 0x6b, 0x5d,
- 0x35, 0xce, 0x50, 0xb0, 0x2f, 0xb2, 0x10, 0x8e, 0xbe, 0xf7, 0x6e, 0x10,
- 0x54, 0xdd, 0x47, 0xdb, 0xcd, 0x83, 0x03, 0x37, 0x65, 0x43, 0x79, 0x1e,
- 0x4b, 0x23, 0xcf, 0xc1, 0x0c, 0x18, 0x74, 0xd0, 0x31, 0x2e, 0x7d, 0x3a,
- 0xe2, 0xa3, 0xc3, 0x68, 0x1a, 0x03, 0xde, 0x34, 0x9a, 0x56, 0x09, 0xda,
- 0xa1, 0x10, 0x4a, 0xbd, 0xe7, 0xa6, 0x11, 0x1a, 0x50, 0xf4, 0x8b, 0x16,
- 0xa1, 0xf6, 0x41, 0xf3, 0x87, 0xe1, 0x0e, 0x15, 0xf9, 0x5e, 0xbe, 0xe3,
- 0xb3, 0x88, 0xf8, 0xa7, 0x35, 0xff, 0xff, 0x61, 0x9f, 0xd6, 0x1c, 0xf6,
- 0x70, 0x2c, 0x6a, 0x64, 0xe2, 0xce, 0x81, 0xc6, 0x4a, 0x29, 0x91, 0xe0,
- 0xd2, 0x6b, 0xb5, 0xc2, 0xed, 0x6f, 0x9c, 0x41, 0x63, 0x78, 0x67, 0xbd,
- 0x26, 0x8c, 0xec, 0xf9, 0x7d, 0xb2, 0x5c, 0x2a, 0x31, 0xe0, 0x41, 0xb2,
- 0xe3, 0x11, 0xb8, 0x64, 0xbb, 0x07, 0x4c, 0xcf, 0xac, 0xec, 0x12, 0xfd,
- 0x59, 0xc9, 0x0f, 0xbb, 0x73, 0x72, 0x93, 0xfa, 0x89, 0xb3, 0xe2, 0xf1,
- 0x1e, 0x32, 0xa7, 0x9f, 0x2e, 0xd7, 0x3a, 0x82, 0xad, 0x2b, 0xca, 0x5a,
- 0xb2, 0xea, 0x21, 0xcc, 0xfe, 0x1e, 0x51, 0xd6, 0x92, 0x56, 0xf7, 0xdf,
- 0xd9, 0x3e, 0x51, 0x76, 0x10, 0x65, 0x21, 0x0c, 0xe9, 0xad, 0xff, 0x7b,
- 0x83, 0x94, 0x17, 0x08, 0x0b, 0xc3, 0xcc, 0x72, 0xa2, 0x6b, 0x14, 0x56,
- 0x92, 0x2d, 0xd7, 0x71, 0x44, 0x46, 0xeb, 0x6e, 0x93, 0x78, 0x06, 0xba,
- 0x3a, 0x54, 0x38, 0x8b, 0x4c, 0xfd, 0x22, 0xec, 0x18, 0x19, 0x59, 0x45,
- 0xf7, 0x01, 0x0c, 0xf9, 0xc9, 0x51, 0x7c, 0x0d, 0x40, 0x85, 0xff, 0x6d,
- 0xd6, 0x10, 0x3a, 0x85, 0x46, 0xce, 0xbe, 0xbf, 0x9f, 0x03, 0x48, 0x9e,
- 0xfc, 0x80, 0xfb, 0xd6, 0x72, 0xcd, 0xcf, 0x44, 0x11, 0xa5, 0x1d, 0x76,
- 0x37, 0x39, 0x82, 0xd9, 0x59, 0x7b, 0x8f, 0xc5, 0x83, 0xc7, 0x35, 0xb1,
- 0x9a, 0x0b, 0x4c, 0xdb, 0x96, 0x43, 0x74, 0xcb, 0x48, 0x2c, 0x7c, 0x4c,
- 0x57, 0x2b, 0x91, 0x36, 0xf7, 0x93, 0x3c, 0xc3, 0x36, 0x72, 0x8f, 0x5e,
- 0xea, 0x13, 0x05, 0x84, 0xcc, 0xa6, 0x2c, 0x3f, 0xb1, 0x4b, 0x95, 0x53,
- 0xb0, 0xa9, 0x16, 0x32, 0x09, 0x91, 0xa2, 0x03, 0x92, 0x5f, 0x24, 0x7a,
- 0x6f, 0xf6, 0xc6, 0xe3, 0xaf, 0xf7, 0xb2, 0x66, 0xaa, 0x62, 0x6f, 0xcf,
- 0xa5, 0xff, 0x59, 0xf3, 0xfb, 0x9e, 0xe1, 0x20, 0x78, 0xd1, 0xaf, 0x8f,
- 0x88, 0xdf, 0xfa, 0xb5, 0x1f, 0x40, 0xfb, 0xd8, 0x84, 0xb6, 0x2d, 0xfa,
- 0x0b, 0x2f, 0x53, 0x60, 0xa8, 0x75, 0x75, 0x1d, 0x97, 0x02, 0x26, 0x4d,
- 0x3a, 0x1d, 0x9b, 0xa9, 0xf7, 0xdf, 0x6c, 0xb7, 0xb8, 0xe8, 0x52, 0xc8,
- 0xb3, 0x42, 0x29, 0x3f, 0xeb, 0xd5, 0x6f, 0x7e, 0x9e, 0x28, 0x7b, 0x72,
- 0xe1, 0x64, 0x24, 0x48, 0xdd, 0x3f, 0xe1, 0x15, 0x39, 0x31, 0xd8, 0x4f,
- 0xf1, 0x00, 0xa6, 0xfb, 0xe0, 0x29, 0x3f, 0x78, 0xc6, 0x5c, 0xf9, 0x2b,
- 0x33, 0xc0, 0x84, 0xe1, 0x9c, 0x96, 0x10, 0x10, 0x98, 0xd5, 0x24, 0xbb,
- 0xcc, 0x8b, 0x07, 0x39, 0xf7, 0x34, 0x4b, 0x87, 0xd3, 0x5e, 0xb2, 0xa1,
- 0x1d, 0x57, 0x12, 0x80, 0x6b, 0xc9, 0x15, 0xbe, 0x2c, 0xef, 0x9d, 0x5d,
- 0x2a, 0x40, 0xdb, 0x24, 0x16, 0x3c, 0xdf, 0xfb, 0x54, 0xe9, 0x87, 0xf2,
- 0x78, 0xf2, 0xe9, 0x9a, 0xf2, 0x8f, 0x23, 0x1d, 0xa7, 0x03, 0x37, 0x96,
- 0x51, 0xf8, 0xb8, 0xd6, 0xea, 0x9a, 0xc2, 0xf2, 0x3d, 0x67, 0x61, 0xf5,
- 0xfa, 0xfb, 0xc8, 0x83, 0x12, 0xaf, 0x17, 0x0b, 0x6b, 0x07, 0xdc, 0x2b,
- 0x92, 0x8c, 0x38, 0x5b, 0xe9, 0xf6, 0x10, 0x5d, 0x48, 0x57, 0x4d, 0x22,
- 0xd3, 0x81, 0x5e, 0x8c, 0x41, 0xf2, 0x60, 0x52, 0xe0, 0xb2, 0x4c, 0xdd,
- 0x5b, 0xc5, 0x0d, 0xd6, 0x44, 0x7e, 0x40, 0x88, 0xd3, 0x2f, 0xd3, 0xa9,
- 0x9a, 0x76, 0xf7, 0xcd, 0x2e, 0xe5, 0x4e, 0x73, 0xed, 0x4d, 0x70, 0x48,
- 0x14, 0x56, 0xa1, 0xe0, 0xec, 0xa8, 0x87, 0xd9, 0x6e, 0xb9, 0xb6, 0x8c,
- 0x76, 0xd1, 0x3d, 0x6f, 0xbf, 0xea, 0xd1, 0xc3, 0x2d, 0x90, 0xa8, 0x41,
- 0x8e, 0xb9, 0x62, 0xe6, 0x0f, 0xbf, 0x3e, 0xbf, 0x06, 0x03, 0xd7, 0xca,
- 0x09, 0xd2, 0x4a, 0xdd, 0xf5, 0x11, 0x8c, 0x7c, 0x54, 0xd3, 0x3c, 0xd0,
- 0x15, 0x82, 0x0c, 0xfd, 0xf6, 0x35, 0xea, 0x32, 0x08, 0x4d, 0xca, 0x5c,
- 0xd4, 0xe5, 0xfd, 0x5a, 0xa0, 0x9c, 0x80, 0xd7, 0x28, 0x8a, 0xd0, 0xf5,
- 0x59, 0xc0, 0x1a, 0x5b, 0x88, 0xae, 0x0e, 0x87, 0x9f, 0x1e, 0xe0, 0x52,
- 0x34, 0x07, 0x18, 0xbf, 0x31, 0xac, 0x9b, 0xb7, 0x35, 0xf5, 0x70, 0x97,
- 0x2d, 0x50, 0x2c, 0x32, 0xf7, 0x38, 0xbf, 0xf6, 0x21, 0x44, 0x44, 0x0e,
- 0xcf, 0xc8, 0x5d, 0x45, 0xdf, 0x02, 0x35, 0xca, 0x9c, 0xc9, 0xe7, 0x9c,
- 0xa6, 0x19, 0xc7, 0x9f, 0xe8, 0x75, 0x57, 0xcc, 0x01, 0x23, 0x94, 0xf4,
- 0xc9, 0xe1, 0x7d, 0xae, 0x76, 0x8d, 0x4a, 0x50, 0x06, 0x29, 0x60, 0x03,
- 0x16, 0x33, 0x05, 0x05, 0xa3, 0xfa, 0x4f, 0xf6, 0x48, 0x58, 0xa0, 0xfd,
- 0xe7, 0x9b, 0x87, 0xd3, 0xfe, 0x1c, 0xbf, 0x22, 0xd2, 0xe8, 0x6d, 0x6a,
- 0xee, 0x40, 0xb4, 0xaa, 0xa2, 0x4e, 0xaf, 0x19, 0x61, 0x4c, 0x82, 0x7b,
- 0x70, 0x02, 0x13, 0xc7, 0x6f, 0x37, 0xb5, 0x6d, 0x77, 0xac, 0xab, 0x9b,
- 0x48, 0x09, 0x89, 0xd1, 0xea, 0x29, 0xba, 0x0d, 0x69, 0x61, 0x2c, 0xea,
- 0x14, 0xb5, 0x23, 0xe6, 0x07, 0xd9, 0x6d, 0xc3, 0xc1, 0x05, 0x09, 0xc4,
- 0xd0, 0x54, 0x72, 0xa3, 0xd5, 0x21, 0xcf, 0xc2, 0x81, 0x98, 0x46, 0xaa,
- 0x2a, 0xa4, 0x68, 0x11, 0x5f, 0xb3, 0xfe, 0xba, 0xdb, 0xd9, 0xe5, 0xa8,
- 0xac, 0x72, 0x92, 0x37, 0x48, 0x1a, 0xd5, 0xd1, 0x88, 0xf0, 0x07, 0xe0,
- 0x26, 0x64, 0x3d, 0xc6, 0x86, 0x93, 0xc0, 0x5a, 0xa2, 0x70, 0xa4, 0xed,
- 0x71, 0x97, 0x20, 0x56, 0xc4, 0xdc, 0xec, 0x98, 0x82, 0x82, 0x1a, 0x6a,
- 0xab, 0xbc, 0x12, 0x2d, 0xc2, 0xb1, 0xed, 0x5c, 0x35, 0xe9, 0xc5, 0x2e,
- 0xd9, 0xad, 0x95, 0xa2, 0xb0, 0x37, 0x69, 0x85, 0x62, 0xf6, 0xc0, 0x17,
- 0x95, 0xd7, 0xf5, 0x1a, 0x07, 0xf6, 0xe6, 0xe4, 0xf4, 0xd8, 0x66, 0xb5,
- 0xfd, 0xcf, 0xbd, 0x11, 0x6d, 0x78, 0x35, 0x0d, 0x72, 0xf8, 0xb8, 0x86,
- 0xd4, 0x2b, 0x08, 0x96, 0x22, 0xd3, 0x6f, 0x06, 0xdc, 0xf9, 0x12, 0x3f,
- 0x6e, 0x55, 0x98, 0x1e, 0xbf, 0xfb, 0xf6, 0xe4, 0xfd, 0xd9, 0xbb, 0xb7,
- 0xc7, 0xef, 0x2e, 0x3e, 0xf3, 0xd8, 0x5d, 0xac, 0xaf, 0x43, 0x1d, 0xa6,
- 0x17, 0xe4, 0x14, 0x0e, 0xba, 0x41, 0x09, 0x20, 0xf7, 0x57, 0x31, 0xeb,
- 0x94, 0x7f, 0x8d, 0xfc, 0xe1, 0xbc, 0x87, 0xd4, 0xb3, 0x4f, 0x89, 0x24,
- 0x2b, 0x72, 0xec, 0xcc, 0x28, 0xaa, 0x3a, 0xe2, 0x58, 0x80, 0xed, 0x1d,
- 0x4c, 0xad, 0x25, 0x6e, 0x09, 0xca, 0x1b, 0xa9, 0xc0, 0xd4, 0x27, 0xf6,
- 0x33, 0xbb, 0x25, 0x1c, 0x05, 0x74, 0xb1, 0xd2, 0xd6, 0x24, 0x1c, 0x71,
- 0x7f, 0xe0, 0x12, 0xd0, 0x78, 0x8f, 0x0a, 0xc5, 0xbe, 0x73, 0x6d, 0xe5,
- 0xaf, 0xd2, 0xda, 0xc5, 0x5e, 0xc4, 0x71, 0xe3, 0x03, 0xd5, 0x78, 0xb8,
- 0xc0, 0x5e, 0x9b, 0xe3, 0x2e, 0x16, 0xb0, 0xb7, 0x8a, 0xbf, 0xaa, 0xb7,
- 0xe8, 0xf9, 0xde, 0xde, 0x8f, 0xe8, 0xaf, 0xfd, 0x27, 0x69, 0xb0, 0x1d,
- 0x42, 0xa0, 0xd6, 0xde, 0x44, 0x84, 0xe3, 0x7a, 0xd5, 0x85, 0x44, 0xb7,
- 0x76, 0x3b, 0xe1, 0x06, 0xfe, 0x78, 0xfe, 0xfe, 0xec, 0xfb, 0xbf, 0xfc,
- 0xc2, 0x9f, 0xf0, 0x92, 0xcd, 0xfe, 0x4a, 0x39, 0x98, 0x3a, 0xf8, 0x8f,
- 0x3f, 0xeb, 0x6b, 0x1b, 0x3f, 0xd7, 0x1e, 0x7f, 0x20, 0xa1, 0x76, 0x79,
- 0x23, 0x08, 0x9c, 0xa3, 0x70, 0x9b, 0xfb, 0x5e, 0x69, 0x19, 0xb7, 0xf3,
- 0x70, 0xd8, 0x44, 0x20, 0x96, 0x6f, 0x75, 0x07, 0xcb, 0x23, 0x74, 0xc8,
- 0x02, 0x9a, 0x06, 0x15, 0xc5, 0x2e, 0x83, 0x77, 0x20, 0x65, 0xe5, 0x54,
- 0x37, 0x3e, 0x40, 0x3d, 0x32, 0x32, 0x52, 0xed, 0x7e, 0xbc, 0x3c, 0x3d,
- 0xfd, 0xf9, 0x9b, 0xa0, 0x1d, 0x98, 0xda, 0xdb, 0x80, 0x36, 0xc5, 0x76,
- 0x41, 0x43, 0xab, 0xa3, 0xea, 0x15, 0xd8, 0x84, 0x44, 0xfb, 0xee, 0x4c,
- 0x66, 0xf3, 0x02, 0xca, 0xf1, 0xb0, 0xce, 0x8c, 0x4a, 0x9b, 0x52, 0xc4,
- 0x5f, 0x81, 0xc5, 0x69, 0x62, 0xf5, 0x1e, 0x27, 0x4e, 0x06, 0x48, 0xe7,
- 0xfe, 0x43, 0x9c, 0x55, 0xc9, 0xfb, 0xc9, 0x45, 0x71, 0x28, 0x5b, 0x28,
- 0x2d, 0x2a, 0x11, 0x77, 0x4b, 0x97, 0x86, 0xdd, 0xf3, 0x58, 0x43, 0x66,
- 0xc6, 0x87, 0x20, 0x79, 0x5b, 0xe5, 0xf5, 0x27, 0x14, 0x75, 0xd0, 0x0d,
- 0x85, 0x86, 0xa4, 0x35, 0xfc, 0xa4, 0xf2, 0x62, 0x4e, 0x02, 0x32, 0xe2,
- 0xea, 0xe9, 0xf2, 0x3a, 0x36, 0x3b, 0x12, 0xba, 0x29, 0x8b, 0x62, 0x72,
- 0xa3, 0xb2, 0x13, 0x3a, 0x6d, 0x15, 0x77, 0x09, 0x3e, 0x3b, 0x67, 0x50,
- 0xd5, 0x16, 0x66, 0x20, 0x56, 0x96, 0x3e, 0xd0, 0x72, 0x63, 0x7a, 0x80,
- 0x3f, 0xdd, 0xd4, 0xd9, 0x62, 0xde, 0x53, 0x61, 0xef, 0x33, 0x0c, 0xc7,
- 0x31, 0xb4, 0xc8, 0xdf, 0xf6, 0x8c, 0x77, 0x04, 0x4e, 0x60, 0x1c, 0x88,
- 0x2c, 0x84, 0xfe, 0x3a, 0xa1, 0x44, 0x57, 0x12, 0x7d, 0x8b, 0x14, 0x03,
- 0x21, 0x09, 0x8d, 0xe3, 0x0b, 0x36, 0x22, 0x7d, 0x5c, 0xcf, 0xf6, 0x8b,
- 0x59, 0x58, 0x30, 0x65, 0x58, 0x92, 0x8f, 0xdf, 0xa1, 0x39, 0x79, 0xc3,
- 0xdb, 0x44, 0x81, 0x43, 0xf8, 0xa4, 0x5a, 0xcf, 0xc8, 0x6f, 0x1e, 0x32,
- 0x5c, 0x0a, 0xcf, 0x57, 0xa6, 0x74, 0x9b, 0x34, 0x94, 0xdb, 0xdb, 0x24,
- 0x12, 0xd9, 0x10, 0xc4, 0x22, 0x3a, 0xd9, 0x58, 0x9d, 0x84, 0x37, 0xf1,
- 0x70, 0xe4, 0x07, 0xcc, 0x34, 0x12, 0x1b, 0x36, 0x8f, 0x91, 0x13, 0x9e,
- 0x11, 0x64, 0xfc, 0xf1, 0xec, 0x44, 0x01, 0xc4, 0xc9, 0xb3, 0x64, 0x3d,
- 0x4e, 0xa1, 0xb4, 0xb2, 0x58, 0x10, 0x2e, 0x9e, 0xbe, 0x04, 0x82, 0x43,
- 0x31, 0x08, 0x2e, 0x84, 0xdc, 0x88, 0x56, 0x55, 0xbb, 0x96, 0x0e, 0xb9,
- 0x58, 0x3b, 0xa2, 0x2d, 0x41, 0x2d, 0x2f, 0xf2, 0xf8, 0x05, 0x44, 0x11,
- 0xa1, 0x12, 0x5b, 0x75, 0x20, 0xb5, 0xb2, 0xa8, 0xae, 0x9b, 0x68, 0x95,
- 0xb1, 0x6d, 0xc8, 0x68, 0x44, 0xe0, 0xa2, 0xac, 0x63, 0x70, 0x9a, 0x13,
- 0x4a, 0x9b, 0xcf, 0xd0, 0x8a, 0x87, 0xaf, 0xbc, 0xf9, 0xef, 0xc5, 0xd9,
- 0xab, 0xb3, 0x53, 0xf3, 0x97, 0xe3, 0x37, 0x27, 0xdf, 0x3b, 0xad, 0x40,
- 0x3a, 0x67, 0xd9, 0xda, 0x34, 0x8e, 0x9f, 0x03, 0x7a, 0xf1, 0xe9, 0xa0,
- 0xc5, 0x8e, 0x39, 0x09, 0x91, 0xf2, 0x0f, 0x5b, 0xc2, 0xbc, 0xdd, 0x5f,
- 0xd2, 0xe3, 0x73, 0x24, 0xa7, 0x29, 0x63, 0xd4, 0xc3, 0x1f, 0x49, 0x05,
- 0x7a, 0x89, 0xb4, 0x68, 0x1e, 0xd5, 0xd6, 0x52, 0xb8, 0x4d, 0x3e, 0x69,
- 0xb1, 0x38, 0x68, 0x56, 0xbe, 0xe6, 0xd0, 0x66, 0x8e, 0x3c, 0x29, 0x24,
- 0x61, 0xe4, 0x73, 0x2d, 0x9e, 0x6d, 0xfc, 0x1e, 0xe8, 0x5a, 0x53, 0x25,
- 0x5d, 0x67, 0x28, 0x83, 0xc7, 0x47, 0xb5, 0x2f, 0xb2, 0x81, 0xb7, 0x48,
- 0x55, 0x78, 0x9b, 0x2a, 0x03, 0x63, 0x44, 0x5e, 0x53, 0x0b, 0xe5, 0xa3,
- 0x43, 0x11, 0x44, 0x0a, 0x6e, 0xb8, 0xf6, 0x9a, 0x64, 0x03, 0x24, 0x95,
- 0x0f, 0xb9, 0x15, 0xa4, 0xc8, 0x7b, 0x10, 0x3f, 0x42, 0xad, 0xd1, 0x72,
- 0x41, 0x2e, 0x53, 0xa2, 0x3f, 0xdc, 0x24, 0x94, 0xa5, 0xd2, 0x57, 0x6d,
- 0x33, 0x17, 0x6c, 0x97, 0x06, 0xa5, 0x56, 0xa1, 0x69, 0x45, 0x67, 0x20,
- 0xca, 0x7e, 0x5b, 0xe3, 0xa8, 0x37, 0x7c, 0x3a, 0xdc, 0x80, 0x20, 0xeb,
- 0x9a, 0xb2, 0xbe, 0xeb, 0x47, 0x9b, 0xc6, 0x20, 0x8d, 0xf0, 0xef, 0xeb,
- 0xfc, 0x3a, 0x45, 0x6d, 0x99, 0xb9, 0x2a, 0xc3, 0x21, 0xbf, 0xd4, 0x19,
- 0x23, 0xfd, 0x59, 0x83, 0xa4, 0xed, 0x51, 0x1e, 0xff, 0x9c, 0x41, 0x1e,
- 0x77, 0xc6, 0xb8, 0xfa, 0x59, 0x83, 0x0c, 0x55, 0x40, 0x18, 0xc5, 0xf8,
- 0xfb, 0x93, 0x8b, 0xe4, 0xd5, 0xd9, 0x6b, 0x77, 0xc1, 0x2e, 0x24, 0x1f,
- 0x90, 0x48, 0x20, 0x99, 0xac, 0x0b, 0x43, 0x83, 0xd4, 0x2f, 0xc9, 0x36,
- 0xa0, 0xe0, 0x3c, 0x45, 0x4a, 0xc2, 0xd1, 0x6e, 0xf6, 0x59, 0x5e, 0x31,
- 0x1c, 0x11, 0x25, 0xd6, 0xc0, 0x7b, 0xe3, 0xd5, 0xe8, 0xd2, 0xc3, 0x4b,
- 0x02, 0x3a, 0xba, 0x54, 0xf9, 0x4b, 0x37, 0x92, 0xb0, 0xee, 0xd2, 0x4a,
- 0x4b, 0x4a, 0x27, 0x29, 0xe1, 0x19, 0x15, 0x5c, 0x1b, 0x49, 0x45, 0x29,
- 0x21, 0xf4, 0xb0, 0x0e, 0xe7, 0x23, 0x10, 0x1b, 0xdd, 0x39, 0x6f, 0x74,
- 0x26, 0x7e, 0x26, 0xe1, 0x81, 0xe6, 0xfa, 0xb7, 0x28, 0x5d, 0x1a, 0xd0,
- 0x41, 0xf8, 0x51, 0x52, 0x37, 0x12, 0x5d, 0xc0, 0x47, 0xa4, 0xed, 0xa2,
- 0x9a, 0x2f, 0xdc, 0x86, 0x3a, 0x90, 0xd8, 0x76, 0x08, 0xfb, 0x9d, 0x43,
- 0x09, 0x25, 0x18, 0x15, 0x9d, 0xbd, 0x06, 0x92, 0x57, 0x96, 0xff, 0xc3,
- 0x53, 0xd0, 0x8f, 0xac, 0x3e, 0x66, 0x56, 0xbe, 0x40, 0x67, 0xe7, 0x19,
- 0xdf, 0x88, 0xfa, 0xce, 0x08, 0xf5, 0x5b, 0x18, 0xe4, 0x64, 0x3d, 0x09,
- 0xa2, 0x93, 0x7b, 0xf3, 0x91, 0x68, 0x65, 0x16, 0x36, 0xaa, 0xac, 0xac,
- 0x3d, 0xaa, 0x96, 0xbc, 0xf3, 0x58, 0x68, 0x85, 0x34, 0x43, 0xd9, 0x66,
- 0x75, 0x8e, 0x70, 0x58, 0x78, 0xbd, 0x24, 0x66, 0xa9, 0x5f, 0xd5, 0x8a,
- 0x6b, 0x41, 0xe0, 0xf6, 0x3a, 0x09, 0x5a, 0xb4, 0x1f, 0xf3, 0x29, 0xec,
- 0xd7, 0x90, 0xbb, 0x28, 0x05, 0x75, 0xe9, 0xae, 0x02, 0x53, 0x6d, 0x8e,
- 0x59, 0x89, 0x0d, 0x1c, 0x20, 0x95, 0x97, 0x9a, 0xde, 0xa7, 0x04, 0xf6,
- 0x80, 0xde, 0x85, 0x69, 0xc1, 0x95, 0x86, 0x7a, 0x02, 0xf1, 0x9a, 0x3b,
- 0x57, 0xf3, 0xf4, 0x98, 0xff, 0x78, 0xa5, 0x3a, 0x9b, 0xd6, 0x0d, 0x25,
- 0x56, 0x5d, 0xbb, 0xb0, 0x70, 0x16, 0x62, 0xe2, 0x90, 0x78, 0x9b, 0x42,
- 0x0e, 0x71, 0x1d, 0x41, 0x64, 0x13, 0xea, 0x8e, 0x8f, 0xf3, 0x49, 0xe7,
- 0x2b, 0xfa, 0x11, 0x46, 0x74, 0x72, 0x5f, 0xf0, 0x7d, 0xf2, 0xba, 0x83,
- 0xf2, 0xac, 0x37, 0xda, 0xd3, 0x2e, 0x5d, 0x78, 0x9e, 0x7d, 0x8c, 0x68,
- 0x9f, 0xfc, 0x5c, 0x7c, 0x11, 0x19, 0x15, 0x2d, 0x8a, 0xe6, 0x5c, 0x65,
- 0xab, 0x85, 0xf0, 0x4c, 0xf9, 0x09, 0x42, 0xc7, 0xf0, 0x27, 0x60, 0x97,
- 0xa7, 0x3a, 0x4b, 0xa3, 0x0e, 0xfb, 0xa6, 0xe0, 0x33, 0xf9, 0xac, 0xe1,
- 0xbb, 0xac, 0x39, 0x10, 0xea, 0x46, 0x6e, 0xa9, 0x4d, 0x7a, 0xa1, 0xe3,
- 0x47, 0x94, 0xde, 0x68, 0x64, 0x53, 0x69, 0xff, 0xad, 0x6f, 0x84, 0x48,
- 0x77, 0x2c, 0xbe, 0x9c, 0x2f, 0x19, 0xeb, 0x5d, 0x57, 0x5c, 0xb6, 0xeb,
- 0xd0, 0x1d, 0x15, 0x6e, 0x9d, 0x17, 0x5c, 0x11, 0x22, 0xdf, 0x28, 0x79,
- 0x5b, 0x06, 0xe8, 0x93, 0xe5, 0xbc, 0x91, 0xca, 0x7b, 0xca, 0x4c, 0xe4,
- 0xdd, 0xb9, 0x4a, 0x8b, 0x4b, 0x46, 0x14, 0xf4, 0x06, 0x04, 0x89, 0x5b,
- 0x61, 0x68, 0xae, 0x3a, 0xd4, 0x97, 0x22, 0x32, 0xbb, 0x2e, 0x1e, 0xfa,
- 0xc1, 0xbe, 0xdd, 0x07, 0xe9, 0x94, 0x85, 0xf2, 0x14, 0xda, 0x88, 0xef,
- 0x00, 0x4b, 0x78, 0x93, 0x72, 0x2b, 0x5d, 0xed, 0x37, 0xef, 0x4c, 0x16,
- 0x3d, 0x28, 0x0a, 0xac, 0x85, 0x79, 0xd2, 0xc8, 0xdf, 0x49, 0xd9, 0xa9,
- 0xc6, 0x99, 0x9e, 0x5c, 0xde, 0x28, 0xd2, 0x6a, 0x00, 0x33, 0xdc, 0xb2,
- 0x47, 0x0e, 0xb3, 0x42, 0xbb, 0xa6, 0xca, 0x98, 0x1e, 0x8f, 0x0c, 0xc1,
- 0x56, 0x79, 0xd9, 0x1c, 0x0e, 0x34, 0xc4, 0x5b, 0xcf, 0x81, 0x5b, 0xcf,
- 0x0d, 0x28, 0xe5, 0xfc, 0xe5, 0x78, 0xac, 0x74, 0xf2, 0x2a, 0x24, 0x09,
- 0xf1, 0x59, 0x12, 0x9a, 0x85, 0x02, 0x3a, 0x85, 0xaa, 0xa2, 0x8c, 0xd1,
- 0x49, 0x32, 0x38, 0x60, 0x9e, 0xf6, 0x9a, 0x19, 0x73, 0x7c, 0xb9, 0x37,
- 0xad, 0x4d, 0x64, 0x0f, 0x76, 0x07, 0x05, 0xe4, 0xb3, 0x68, 0xba, 0x0a,
- 0xc7, 0x2b, 0x69, 0x9b, 0x51, 0x8e, 0xac, 0x3c, 0x9e, 0x74, 0x43, 0xc3,
- 0x77, 0xf2, 0x56, 0xcf, 0xc2, 0x83, 0xa3, 0xc8, 0xa2, 0xbf, 0xe5, 0x55,
- 0x0d, 0xfe, 0x95, 0x45, 0x7f, 0x1b, 0x59, 0xf4, 0x23, 0xfb, 0x2d, 0xfe,
- 0xd4, 0xe1, 0xe1, 0x53, 0xa9, 0xaa, 0x60, 0x1f, 0x1d, 0x15, 0xfd, 0x5b,
- 0x06, 0xc4, 0x5f, 0xe3, 0x15, 0x9b, 0x07, 0x87, 0x5c, 0x7f, 0x10, 0x7e,
- 0xcb, 0xbb, 0xbc, 0xde, 0xa7, 0x1e, 0xbb, 0x65, 0x19, 0xd5, 0x9b, 0xc6,
- 0x23, 0xad, 0x9e, 0xf9, 0x4c, 0xc0, 0x7e, 0xd4, 0x98, 0x23, 0x3d, 0xfc,
- 0x86, 0x32, 0xa8, 0x9a, 0x78, 0xea, 0xaf, 0x4e, 0xc3, 0xfb, 0xce, 0x13,
- 0xeb, 0x46, 0xd9, 0x3b, 0xd4, 0x10, 0xfa, 0x4b, 0xf0, 0xe2, 0x45, 0xb6,
- 0xe4, 0x7e, 0x0d, 0x19, 0x81, 0xf5, 0x38, 0x0f, 0x20, 0xd7, 0xdc, 0xcd,
- 0xab, 0x14, 0x68, 0xcb, 0x8b, 0xf4, 0x2e, 0x02, 0xb6, 0x25, 0x9e, 0x62,
- 0x36, 0x57, 0xcc, 0xfd, 0xbc, 0xcc, 0x0a, 0xb2, 0x14, 0xa0, 0x08, 0x88,
- 0xdb, 0x8c, 0xfc, 0xb0, 0x88, 0x9a, 0xcf, 0xad, 0xab, 0x56, 0xbe, 0x1a,
- 0xc0, 0x01, 0xd4, 0xd2, 0xc0, 0x90, 0xef, 0x8c, 0x68, 0x09, 0x71, 0x6c,
- 0xb8, 0x83, 0xa7, 0x76, 0xdf, 0xec, 0x49, 0x90, 0x67, 0x8b, 0x31, 0x42,
- 0xbc, 0xad, 0x53, 0x66, 0xa2, 0x01, 0x01, 0xe9, 0xa3, 0x83, 0x28, 0x5d,
- 0x1e, 0x5a, 0xcd, 0x95, 0xa7, 0x20, 0x1e, 0x30, 0x37, 0x3e, 0x27, 0x5e,
- 0x27, 0x80, 0xbb, 0xa3, 0xe4, 0x0c, 0x5e, 0xb8, 0x16, 0xc8, 0x38, 0x57,
- 0x02, 0xa5, 0xae, 0x68, 0xb4, 0x4d, 0xb8, 0xcf, 0xbc, 0x13, 0xd6, 0x59,
- 0x69, 0xf6, 0xcb, 0x9e, 0xb0, 0x59, 0x07, 0xc1, 0xa4, 0xbe, 0xe6, 0x2c,
- 0x79, 0x7f, 0x7c, 0xf1, 0x1e, 0x81, 0x5e, 0x62, 0x00, 0x01, 0x48, 0x6a,
- 0x5a, 0xed, 0x5a, 0x90, 0x20, 0xe1, 0x66, 0x4e, 0x0f, 0x71, 0x0c, 0x82,
- 0xf1, 0xcb, 0xec, 0x79, 0xf3, 0x3f, 0xf5, 0x3d, 0xae, 0x7e, 0xc9, 0xb4,
- 0xd6, 0xc4, 0x85, 0x74, 0xda, 0xc8, 0x6a, 0x87, 0x87, 0x2e, 0x0b, 0x09,
- 0xbd, 0x8d, 0x59, 0xca, 0x49, 0x26, 0xf9, 0x48, 0x92, 0x36, 0xb5, 0xfa,
- 0x42, 0x5b, 0x09, 0xd0, 0x43, 0x9c, 0x8c, 0x5d, 0x56, 0x31, 0xbd, 0x43,
- 0x3e, 0x6d, 0x15, 0x00, 0x99, 0x84, 0x5f, 0x98, 0xc0, 0xd5, 0xe0, 0x1e,
- 0x07, 0xe5, 0x1a, 0xc0, 0x47, 0xfb, 0xfb, 0x61, 0xde, 0x70, 0x3a, 0x31,
- 0x4c, 0x55, 0xb4, 0x39, 0xa9, 0xea, 0xc1, 0x2b, 0xec, 0x35, 0x85, 0x7a,
- 0x59, 0x93, 0xad, 0x31, 0x9c, 0x93, 0x1b, 0x93, 0x76, 0x2c, 0x34, 0x2a,
- 0x0e, 0x99, 0xc7, 0x7c, 0x87, 0x32, 0x23, 0xd9, 0xb3, 0x36, 0x67, 0xe1,
- 0x0a, 0x24, 0xed, 0x9d, 0x9b, 0x6a, 0x92, 0x31, 0x6a, 0x82, 0xc5, 0xfb,
- 0x1d, 0xcc, 0x2c, 0xe0, 0xdf, 0x87, 0x8f, 0x23, 0x14, 0x91, 0x8c, 0x2f,
- 0xce, 0xde, 0x2b, 0xf6, 0x7e, 0x28, 0x9f, 0x91, 0xf9, 0x40, 0x4f, 0x58,
- 0xa8, 0x95, 0x41, 0x08, 0xb9, 0x33, 0xb3, 0xf8, 0x00, 0x16, 0xc6, 0xd4,
- 0xfb, 0x2a, 0x73, 0x00, 0xb4, 0xd0, 0x93, 0xb5, 0x7d, 0x2b, 0x80, 0x00,
- 0x0a, 0xd9, 0xab, 0xf7, 0xd2, 0x7b, 0x89, 0xaf, 0xd9, 0x19, 0xdf, 0x5f,
- 0xae, 0x5f, 0x27, 0x3a, 0x92, 0x4a, 0x76, 0x42, 0xfc, 0x95, 0x74, 0x58,
- 0xdb, 0xe9, 0xb3, 0x4b, 0x8b, 0x7c, 0x89, 0xce, 0x1c, 0x24, 0x33, 0x73,
- 0x78, 0x59, 0xa4, 0xb5, 0x8c, 0xd1, 0x6d, 0x96, 0xf8, 0x04, 0x43, 0x16,
- 0x4b, 0x62, 0x53, 0xca, 0xbe, 0xb0, 0x69, 0x00, 0xeb, 0x5e, 0x56, 0x0a,
- 0xd2, 0x2a, 0x82, 0x53, 0x8d, 0x05, 0xa7, 0x67, 0x7b, 0x52, 0xff, 0xfc,
- 0xec, 0xfd, 0x45, 0x62, 0x85, 0x3e, 0xbe, 0x8c, 0x1f, 0x75, 0x2e, 0x10,
- 0xb5, 0x4c, 0x81, 0xcf, 0xce, 0x95, 0x6d, 0x04, 0x0e, 0x49, 0xb1, 0x09,
- 0x9a, 0xce, 0x10, 0x03, 0xb4, 0xd9, 0x9b, 0x95, 0x8c, 0xe5, 0xe3, 0xc2,
- 0x8f, 0x82, 0xd2, 0x05, 0x39, 0xd3, 0x87, 0x0c, 0xe6, 0x94, 0xdb, 0xa3,
- 0x83, 0x08, 0x65, 0x90, 0x15, 0xfd, 0xfe, 0x78, 0x7c, 0xc1, 0x3b, 0x46,
- 0x7f, 0x0b, 0xe6, 0xcd, 0x05, 0xa2, 0xf2, 0xc3, 0xc0, 0x50, 0xb1, 0x94,
- 0x41, 0x09, 0x68, 0xc6, 0xda, 0xc0, 0xf8, 0xb6, 0xc0, 0xdd, 0xdb, 0xb1,
- 0x23, 0x2f, 0xdb, 0x10, 0x5c, 0x53, 0xe8, 0x04, 0x17, 0x1c, 0x3f, 0xd8,
- 0x92, 0x8f, 0x6c, 0x19, 0xc5, 0x8c, 0x2f, 0x44, 0x0b, 0x7e, 0xfd, 0xe8,
- 0x91, 0xc7, 0x29, 0x48, 0x4e, 0xc9, 0x00, 0x27, 0xda, 0x26, 0x97, 0x7e,
- 0x38, 0x54, 0x52, 0x81, 0xb0, 0x60, 0xa2, 0xe0, 0xe7, 0xdc, 0x38, 0x8f,
- 0xa5, 0x44, 0xfd, 0xd4, 0xaa, 0x0a, 0xde, 0x54, 0xe8, 0xc7, 0x9a, 0xf1,
- 0x03, 0xb5, 0xad, 0x43, 0x72, 0x47, 0x4c, 0xe9, 0x7f, 0x36, 0x84, 0x6e,
- 0xb3, 0x16, 0x79, 0xe9, 0xbe, 0x5c, 0x30, 0xba, 0x56, 0x5e, 0xac, 0x33,
- 0xe8, 0x68, 0x69, 0xb5, 0xa0, 0x56, 0x0f, 0x86, 0x87, 0x54, 0x52, 0x40,
- 0x76, 0x53, 0xc4, 0x60, 0xa9, 0xbd, 0x6f, 0x88, 0xfc, 0x39, 0x39, 0x3d,
- 0x76, 0x27, 0xc5, 0x7d, 0x22, 0x70, 0x83, 0x9d, 0xae, 0x4f, 0xad, 0xed,
- 0xad, 0x98, 0x18, 0x25, 0xe7, 0xd4, 0xb3, 0x1c, 0x7a, 0x53, 0xfd, 0xef,
- 0x6e, 0x34, 0xbe, 0x24, 0xf0, 0xc0, 0x1b, 0xb1, 0x09, 0x33, 0x25, 0x2f,
- 0xcc, 0xc1, 0xe2, 0x27, 0xf4, 0x57, 0x0f, 0xd3, 0x3c, 0x58, 0xee, 0x33,
- 0xf7, 0x72, 0x6d, 0x96, 0x62, 0x0c, 0xf4, 0xee, 0x23, 0x8f, 0x84, 0xae,
- 0x8c, 0xf5, 0x8e, 0x21, 0x2c, 0x6f, 0xa6, 0xbb, 0x2c, 0xad, 0x62, 0x66,
- 0x3c, 0xc2, 0x5c, 0x9f, 0x69, 0xf1, 0x70, 0x6f, 0x28, 0x16, 0x06, 0x2f,
- 0x27, 0xb6, 0x81, 0x10, 0xa5, 0x09, 0x93, 0x22, 0x67, 0xc6, 0x2a, 0x88,
- 0xd3, 0x2e, 0x6c, 0xae, 0xbd, 0x0d, 0x03, 0x13, 0xaf, 0x9c, 0xe8, 0xb5,
- 0xa1, 0x95, 0x74, 0x37, 0xb7, 0xd3, 0x80, 0xfd, 0x11, 0x53, 0xa2, 0x25,
- 0x1b, 0x2b, 0xbf, 0x5a, 0xb3, 0x93, 0xfc, 0x64, 0x01, 0xbd, 0x23, 0xa7,
- 0x01, 0xc5, 0x03, 0x8c, 0x80, 0xf7, 0x95, 0xff, 0x47, 0x8f, 0xdd, 0x50,
- 0x73, 0xaa, 0xe9, 0xb4, 0x63, 0x39, 0xde, 0x63, 0xbb, 0x48, 0x30, 0x02,
- 0x03, 0x1e, 0x13, 0x8b, 0x91, 0x9b, 0x75, 0x4f, 0x22, 0xe8, 0x6f, 0xfe,
- 0x9e, 0x3c, 0x15, 0xd3, 0x97, 0x6c, 0xdf, 0xe2, 0xce, 0xe5, 0xde, 0x4b,
- 0xd3, 0x6e, 0xf6, 0x9b, 0x71, 0xa3, 0x1a, 0xf9, 0x8d, 0x80, 0x30, 0x5e,
- 0x89, 0x5f, 0x86, 0x5a, 0x51, 0x05, 0x88, 0x8b, 0xeb, 0xa5, 0xe4, 0xf0,
- 0x7a, 0x5f, 0xfa, 0x5c, 0x3c, 0x19, 0x54, 0x79, 0x6e, 0xf1, 0x1a, 0x3d,
- 0x2e, 0x5a, 0xaa, 0xc5, 0x6c, 0x61, 0x8c, 0x0c, 0xf1, 0x20, 0xb7, 0xd4,
- 0xd6, 0xba, 0x87, 0x18, 0x7b, 0x84, 0x5d, 0x06, 0x51, 0x2c, 0xea, 0xae,
- 0x3a, 0x15, 0x4a, 0x0f, 0xfa, 0x8a, 0x36, 0x5c, 0x9e, 0xe3, 0x5f, 0x29,
- 0x40, 0x4a, 0xe8, 0x12, 0xaf, 0xb2, 0xbf, 0x41, 0x91, 0x74, 0xfd, 0x5a,
- 0x35, 0xa6, 0x9c, 0x16, 0xeb, 0xd4, 0xb3, 0xe5, 0x1f, 0x3d, 0x13, 0x0f,
- 0x95, 0xb8, 0x41, 0x28, 0xac, 0x5e, 0x64, 0x4d, 0x10, 0x5e, 0x7c, 0x7c,
- 0x60, 0x7d, 0x95, 0x94, 0x31, 0x2b, 0x75, 0x20, 0x7e, 0xde, 0xac, 0x61,
- 0x6e, 0xe3, 0xf1, 0xd7, 0xc9, 0xdb, 0xd7, 0x8f, 0x29, 0x9d, 0xe7, 0x32,
- 0xab, 0x56, 0x15, 0xa5, 0x70, 0x2a, 0x0d, 0x9f, 0x7d, 0xe3, 0x0d, 0x76,
- 0xe8, 0x1c, 0x9f, 0x22, 0x62, 0x73, 0xb9, 0xbd, 0x64, 0x2b, 0x98, 0xf3,
- 0xa3, 0xba, 0xe7, 0x4b, 0x45, 0x46, 0x60, 0xef, 0x17, 0xa0, 0x17, 0x04,
- 0xac, 0x8a, 0x95, 0x96, 0xcf, 0xba, 0x49, 0xe1, 0x2d, 0x06, 0xf6, 0xf8,
- 0xc8, 0x31, 0xb0, 0xea, 0x6e, 0x45, 0x9d, 0x55, 0x8a, 0x4b, 0xb2, 0x0b,
- 0x22, 0x37, 0xea, 0x31, 0x33, 0xcd, 0x57, 0x7c, 0xef, 0x49, 0x89, 0x0d,
- 0x5f, 0x83, 0x7a, 0x0e, 0x7f, 0xa9, 0xf7, 0xde, 0x63, 0xdf, 0xab, 0x50,
- 0x4b, 0x6f, 0x34, 0x69, 0x89, 0x01, 0x1d, 0xc5, 0x7b, 0xf6, 0x89, 0x7d,
- 0x96, 0x1c, 0x47, 0x79, 0xe1, 0xb5, 0x30, 0xea, 0x79, 0x43, 0x94, 0x5f,
- 0x35, 0x10, 0x34, 0x92, 0xc3, 0x1a, 0x8f, 0xb7, 0xf7, 0xde, 0x2b, 0xcf,
- 0xda, 0x4e, 0x13, 0xf4, 0x0f, 0xb0, 0xa4, 0x89, 0x45, 0xa1, 0xb3, 0xac,
- 0xe7, 0x66, 0x61, 0x19, 0x7d, 0x4e, 0x69, 0xd0, 0xad, 0xf3, 0x54, 0x26,
- 0x98, 0xf9, 0x18, 0x22, 0x7a, 0xd7, 0x99, 0xf6, 0x5f, 0xbd, 0xec, 0x2b,
- 0x02, 0x02, 0xb5, 0x7b, 0x1f, 0x39, 0x90, 0x3b, 0x43, 0x7d, 0xa9, 0x2f,
- 0x8b, 0xfc, 0x1f, 0x0a, 0x5f, 0x40, 0x02, 0x5a, 0xdb, 0x4f, 0x79, 0x8f,
- 0x1f, 0x0a, 0xc3, 0xe0, 0xde, 0xc3, 0x60, 0x8a, 0x14, 0x3c, 0x75, 0x0f,
- 0x1c, 0x09, 0xd5, 0x72, 0xf7, 0x38, 0x68, 0xff, 0x94, 0x84, 0x8f, 0xd0,
- 0x7d, 0xd6, 0x4a, 0xab, 0x7f, 0xf2, 0x48, 0x74, 0x2e, 0x55, 0x8e, 0x49,
- 0xf2, 0xd2, 0x46, 0x2c, 0x00, 0xc9, 0xd8, 0x65, 0xd3, 0x4f, 0x44, 0xec,
- 0xc9, 0x51, 0x4a, 0xaf, 0xf5, 0xd4, 0x35, 0xf3, 0xa2, 0xbf, 0xde, 0xe4,
- 0x85, 0xa4, 0xba, 0x07, 0xaf, 0x3f, 0xe9, 0x71, 0x3f, 0xd6, 0x2c, 0x33,
- 0x8f, 0x41, 0x4b, 0xde, 0xf3, 0x4f, 0xed, 0x4d, 0xf0, 0xc0, 0x3d, 0x15,
- 0xc8, 0x70, 0xe0, 0x03, 0x96, 0xea, 0x45, 0x12, 0xff, 0x49, 0xa6, 0x9d,
- 0x0e, 0x22, 0xc8, 0xf2, 0x73, 0xfb, 0xf9, 0x45, 0x79, 0x99, 0xf8, 0x98,
- 0x2c, 0x4f, 0x98, 0xa4, 0xde, 0xa0, 0x5d, 0x85, 0xb3, 0x0e, 0x8a, 0xe4,
- 0xc2, 0x2b, 0x93, 0x75, 0x4f, 0x3f, 0x13, 0xda, 0x50, 0x79, 0x69, 0x8d,
- 0xd5, 0xbe, 0x37, 0x9e, 0xee, 0xfb, 0xca, 0xea, 0x8c, 0xa2, 0xb2, 0x5c,
- 0xc6, 0xdf, 0xfb, 0x02, 0x53, 0xc6, 0x89, 0x11, 0x23, 0x97, 0x86, 0xa8,
- 0xf1, 0x8c, 0x83, 0x32, 0x74, 0x8f, 0x1d, 0xb6, 0x98, 0xee, 0x85, 0xaf,
- 0x3e, 0x25, 0x27, 0xaf, 0xbd, 0x07, 0x8f, 0xdc, 0x02, 0xd3, 0x05, 0x69,
- 0x03, 0x77, 0xec, 0xa8, 0xaa, 0x93, 0x1d, 0x7a, 0xcb, 0xc3, 0x2c, 0x79,
- 0xca, 0x94, 0xf1, 0xae, 0x64, 0xd0, 0x2d, 0xec, 0x7f, 0xf0, 0x0c, 0x93,
- 0xc3, 0xab, 0x2b, 0x23, 0xd5, 0xa6, 0x0d, 0x72, 0x42, 0x0b, 0x8d, 0x70,
- 0x75, 0xcf, 0xfe, 0xe9, 0x93, 0x0d, 0xcf, 0x8a, 0xd0, 0xac, 0xad, 0xa8,
- 0xf7, 0xde, 0x7b, 0x1a, 0x5e, 0x73, 0x35, 0x07, 0xb4, 0x4a, 0x41, 0x6e,
- 0x5a, 0xb2, 0x43, 0xe5, 0xd1, 0xff, 0xae, 0x9e, 0xc1, 0x8a, 0xf0, 0x04,
- 0xeb, 0x7f, 0xf7, 0xe7, 0xfb, 0xb9, 0x5f, 0xc3, 0xc7, 0x3e, 0xc1, 0x2a,
- 0x43, 0x98, 0x60, 0xda, 0x6a, 0x17, 0xe1, 0x32, 0x84, 0xb0, 0x3b, 0xde,
- 0x08, 0x7c, 0xe6, 0x46, 0x8f, 0x58, 0x17, 0x8e, 0x73, 0xb0, 0x01, 0x28,
- 0x58, 0x04, 0x33, 0x1f, 0x77, 0x92, 0x78, 0xbe, 0x78, 0xa1, 0x3c, 0x1f,
- 0xea, 0x7e, 0xe7, 0x1a, 0xd4, 0x57, 0x6b, 0xb6, 0xb8, 0xed, 0x8a, 0x9c,
- 0x83, 0xcd, 0x7b, 0xed, 0xd0, 0x71, 0x2f, 0x11, 0xfb, 0x5c, 0x70, 0xf2,
- 0x8a, 0xa2, 0xc0, 0x6c, 0x96, 0xdb, 0x26, 0x02, 0x70, 0x8f, 0x57, 0x25,
- 0xfb, 0x0c, 0x09, 0x6c, 0x63, 0x27, 0x8d, 0xa7, 0x66, 0x4a, 0x12, 0xb9,
- 0xf7, 0x19, 0x51, 0x6d, 0x28, 0xc5, 0xc9, 0x9c, 0xd2, 0x55, 0x36, 0xfd,
- 0xa4, 0x57, 0xc6, 0x8e, 0x11, 0x79, 0xeb, 0x91, 0xdd, 0x5a, 0xa2, 0xbe,
- 0xf3, 0xf7, 0xc7, 0x5d, 0x23, 0xc0, 0x3d, 0xca, 0x54, 0xf3, 0xfe, 0x62,
- 0x7c, 0xfe, 0x9c, 0xe6, 0xcb, 0x61, 0x43, 0x73, 0x21, 0x5e, 0x8d, 0xb3,
- 0xbf, 0x4b, 0x99, 0x59, 0xed, 0x9e, 0x7e, 0xd2, 0xf3, 0xf4, 0x58, 0x9c,
- 0x7b, 0x27, 0x40, 0x6a, 0x36, 0xe7, 0xe0, 0xbf, 0xc4, 0x44, 0xb3, 0x2e,
- 0xd4, 0xbf, 0xcf, 0x2e, 0x30, 0x9a, 0x19, 0xb8, 0x21, 0x85, 0x96, 0xdd,
- 0xc3, 0x9f, 0x3b, 0x4f, 0xcd, 0xd5, 0xba, 0xf8, 0x64, 0xf5, 0x45, 0xc1,
- 0xd1, 0xd3, 0x03, 0x76, 0x2f, 0x3c, 0xd3, 0xab, 0xe1, 0xf9, 0x41, 0x6d,
- 0xde, 0xd3, 0x40, 0x3c, 0x14, 0xe2, 0x7a, 0x94, 0x78, 0xa7, 0xe1, 0xaf,
- 0x6b, 0x6f, 0x0f, 0x9e, 0xed, 0x5b, 0xf1, 0x2b, 0x88, 0x3c, 0x9f, 0xb2,
- 0x3b, 0x47, 0x75, 0x9a, 0x63, 0xb1, 0xca, 0x0b, 0x72, 0x41, 0xb8, 0x47,
- 0xdc, 0x00, 0x07, 0x2d, 0x21, 0xd0, 0x55, 0x37, 0xea, 0x26, 0x6d, 0xd6,
- 0x9e, 0x88, 0x79, 0xc6, 0xb4, 0x33, 0xa6, 0xa8, 0xe3, 0x52, 0xe8, 0x35,
- 0x2f, 0xd4, 0xdb, 0xd6, 0x71, 0xa1, 0xe9, 0x4b, 0xdf, 0x7f, 0xcf, 0x72,
- 0xc4, 0x82, 0xc5, 0x49, 0xe8, 0xca, 0x36, 0x7f, 0x32, 0x7c, 0x97, 0x01,
- 0x84, 0xe9, 0x0a, 0x23, 0xe0, 0x53, 0x65, 0xd4, 0x9e, 0x52, 0xd1, 0x6f,
- 0x70, 0x79, 0x62, 0xd1, 0xf3, 0xb2, 0x90, 0x98, 0x2d, 0x25, 0x6f, 0xc2,
- 0xf3, 0xc9, 0x60, 0xd3, 0xec, 0x0b, 0x33, 0x33, 0x78, 0xf9, 0xe1, 0xe2,
- 0xeb, 0xb3, 0xf7, 0xe3, 0x64, 0x8f, 0x4a, 0xdb, 0x2f, 0xde, 0x9f, 0xfc,
- 0xf9, 0xc3, 0x85, 0xf9, 0xa7, 0x8e, 0xf4, 0x3a, 0x2d, 0x72, 0x23, 0x9d,
- 0xcc, 0x72, 0xb2, 0xc2, 0x10, 0xcb, 0xa5, 0x36, 0x69, 0x62, 0xe8, 0x62,
- 0x23, 0x8f, 0xcb, 0x4a, 0x11, 0x4d, 0x28, 0x1f, 0xa5, 0x94, 0x13, 0x67,
- 0x54, 0xbf, 0x82, 0x33, 0xfc, 0x4a, 0x67, 0x39, 0xe7, 0x9d, 0xa2, 0x7c,
- 0x4d, 0xdb, 0x49, 0x2e, 0xbe, 0x7e, 0xf9, 0xee, 0x9b, 0xb1, 0x76, 0xf0,
- 0xf8, 0xee, 0xbb, 0xef, 0xba, 0xc1, 0x5d, 0xe8, 0xb1, 0x57, 0xe9, 0xed,
- 0xed, 0xa8, 0xce, 0x3e, 0xfb, 0x6c, 0x7c, 0x7c, 0x9c, 0xbc, 0x3c, 0x1d,
- 0x9f, 0x7d, 0xe6, 0x70, 0x1c, 0x76, 0x0e, 0x08, 0xc1, 0xea, 0x32, 0x6b,
- 0xcc, 0x5f, 0x3e, 0xfb, 0xec, 0xff, 0x03, 0x4d, 0xda, 0xc1, 0xce, 0xef,
- 0x98, 0x02, 0x00,
+ 0x6b, 0x77, 0xdc, 0xc6, 0x95, 0x36, 0xfa, 0xdd, 0xbf, 0x02, 0xc3, 0xac,
+ 0xbc, 0x24, 0x27, 0xdd, 0xcd, 0x8b, 0x6e, 0x16, 0x2d, 0x67, 0x2c, 0x4b,
+ 0x94, 0xcd, 0x31, 0x25, 0xf2, 0x65, 0x53, 0xb6, 0x73, 0x62, 0x2f, 0x2d,
+ 0x74, 0x37, 0x48, 0x22, 0xea, 0x06, 0x3a, 0x00, 0x9a, 0x97, 0xe4, 0xcd,
+ 0xf9, 0xed, 0xa7, 0x9e, 0x7d, 0xa9, 0x2a, 0xa0, 0x0a, 0x4d, 0xda, 0xb1,
+ 0x32, 0x73, 0xce, 0x9c, 0xcc, 0x1a, 0x4b, 0x22, 0x81, 0x42, 0x5d, 0x76,
+ 0xed, 0xfb, 0x7e, 0x76, 0x92, 0xdc, 0xf7, 0xbf, 0x0f, 0xf4, 0xff, 0x1f,
+ 0xcc, 0xff, 0xcc, 0x9f, 0x9f, 0x25, 0xc9, 0x69, 0x55, 0xfe, 0x25, 0x9b,
+ 0x36, 0xf1, 0x67, 0x3f, 0x7c, 0xf8, 0x3f, 0x09, 0xff, 0x9f, 0x79, 0xe7,
+ 0x27, 0xf3, 0xe7, 0x67, 0x6b, 0xc7, 0xde, 0x49, 0xdc, 0x0b, 0xff, 0xe7,
+ 0xc3, 0x76, 0x72, 0xdf, 0x0b, 0xff, 0x27, 0xd9, 0xa2, 0x17, 0x3e, 0xc8,
+ 0x17, 0x5e, 0xe0, 0xef, 0x1f, 0x3e, 0xac, 0xff, 0xc8, 0x4f, 0x98, 0x15,
+ 0xfe, 0xb3, 0x83, 0xf7, 0x7e, 0xfa, 0x80, 0xbf, 0x9a, 0x9f, 0x7c, 0xf6,
+ 0xd9, 0xbb, 0x97, 0x6f, 0x0f, 0xf5, 0xd5, 0xe9, 0xaa, 0x9a, 0x27, 0xc3,
+ 0xa4, 0xa9, 0xd2, 0xa2, 0xbe, 0xc8, 0xaa, 0x24, 0x4d, 0xde, 0x9f, 0x1d,
+ 0x7f, 0xf6, 0xd9, 0xf8, 0x4f, 0xef, 0x4e, 0x4e, 0xc7, 0x47, 0xe3, 0xd6,
+ 0x63, 0x7f, 0x2e, 0x97, 0x4d, 0x5e, 0x16, 0xb5, 0x99, 0xbe, 0x79, 0xa8,
+ 0xfe, 0xf9, 0xb3, 0xcf, 0x5e, 0x1f, 0x8e, 0x5f, 0x9d, 0x1d, 0x9d, 0x9e,
+ 0x1f, 0x9d, 0xbc, 0x6b, 0x3d, 0x99, 0xe4, 0x75, 0x62, 0x86, 0x6a, 0xca,
+ 0x72, 0x6e, 0xfe, 0xe3, 0x46, 0x9f, 0xa5, 0x4d, 0x9a, 0x5c, 0x54, 0xe5,
+ 0x22, 0x29, 0x2b, 0xfc, 0x22, 0x4d, 0xea, 0xac, 0xba, 0xce, 0xaa, 0x41,
+ 0xb2, 0xaa, 0xf3, 0xe2, 0x32, 0x29, 0x8b, 0x2c, 0x29, 0x2f, 0x92, 0xe6,
+ 0x2a, 0xd3, 0xe1, 0xea, 0xd5, 0x72, 0x59, 0x56, 0x4d, 0x36, 0x4b, 0x96,
+ 0x55, 0xd9, 0x94, 0xd3, 0x72, 0x5e, 0x27, 0x5b, 0xaf, 0x8f, 0x5e, 0x9d,
+ 0x0f, 0x92, 0x37, 0x47, 0xc7, 0x87, 0xe6, 0xbf, 0xe7, 0xa7, 0xf4, 0x9f,
+ 0xf1, 0x20, 0xf9, 0xe6, 0xe4, 0xf4, 0xdb, 0xc3, 0xb3, 0x41, 0xf2, 0xed,
+ 0x39, 0x7e, 0x86, 0xff, 0x9a, 0x1f, 0x26, 0x47, 0x6f, 0x5f, 0x9e, 0x0e,
+ 0x74, 0x38, 0xfc, 0x03, 0x3f, 0x3c, 0x7e, 0x6d, 0x7e, 0xc8, 0x7f, 0xe0,
+ 0x9f, 0xa7, 0x27, 0xa7, 0x8f, 0xe4, 0x0f, 0xfc, 0xf3, 0xec, 0xfc, 0xad,
+ 0xf9, 0xed, 0xd9, 0xf9, 0xd8, 0xfc, 0x77, 0xfc, 0x0a, 0xff, 0xa1, 0xaf,
+ 0x8c, 0xdf, 0x7e, 0x4d, 0xff, 0x19, 0xdb, 0xe1, 0xc6, 0x6f, 0xf9, 0xe7,
+ 0xf4, 0xa5, 0xf3, 0xc3, 0xe3, 0x77, 0x87, 0xe7, 0x49, 0x5a, 0xcc, 0x92,
+ 0x73, 0xf3, 0xfc, 0xf6, 0x28, 0x39, 0xbf, 0xca, 0x92, 0x69, 0xb9, 0x58,
+ 0xe0, 0x47, 0x66, 0x47, 0x66, 0x59, 0x9d, 0x5f, 0x16, 0x66, 0x29, 0x66,
+ 0xe5, 0x37, 0x65, 0xf5, 0x31, 0x49, 0x6e, 0xf2, 0xe6, 0xaa, 0x5c, 0x35,
+ 0x3a, 0xdc, 0xca, 0xec, 0x46, 0x92, 0x17, 0x4d, 0x56, 0xa5, 0x53, 0xec,
+ 0xf4, 0xe8, 0xb3, 0xd6, 0xae, 0x96, 0x17, 0x66, 0x0f, 0x6b, 0xb3, 0x69,
+ 0x93, 0x55, 0x3d, 0x2f, 0xd3, 0x19, 0xb6, 0xca, 0xbc, 0x72, 0xb1, 0x32,
+ 0x9b, 0x5c, 0xe5, 0xd3, 0x8f, 0x75, 0x32, 0xcf, 0x3f, 0x66, 0xd8, 0xa8,
+ 0xdb, 0x3b, 0xdd, 0xb8, 0x01, 0x0f, 0x9a, 0xae, 0xcc, 0x9e, 0x16, 0x43,
+ 0x1d, 0xae, 0xc9, 0xa7, 0x29, 0x3e, 0x40, 0x3b, 0x97, 0xac, 0x96, 0x18,
+ 0x8d, 0x77, 0x2c, 0x59, 0x96, 0xb5, 0x79, 0x69, 0x3c, 0x3e, 0x36, 0x33,
+ 0x2f, 0x8a, 0x8c, 0xe6, 0x51, 0x0f, 0xcc, 0x3f, 0xca, 0x8f, 0x79, 0x66,
+ 0xfe, 0x72, 0x91, 0xcf, 0xb3, 0x84, 0x4f, 0xd4, 0x0e, 0x87, 0xa3, 0x4d,
+ 0xaa, 0xac, 0x5e, 0x2d, 0x32, 0xb3, 0x7b, 0x6f, 0xb3, 0x26, 0x9d, 0xe7,
+ 0xc5, 0x47, 0xf3, 0x57, 0x2c, 0x7c, 0x51, 0x56, 0xd9, 0x28, 0x79, 0x59,
+ 0x27, 0x77, 0xe5, 0xca, 0x2c, 0x78, 0x3e, 0x37, 0x67, 0x9e, 0x25, 0x93,
+ 0x6c, 0x5e, 0xde, 0x0c, 0x70, 0xd2, 0x49, 0xb1, 0x5a, 0x4c, 0xcc, 0x00,
+ 0xe5, 0x85, 0x1b, 0x2e, 0x6d, 0x56, 0x66, 0x38, 0x7e, 0x7a, 0x91, 0x9a,
+ 0x35, 0x99, 0x77, 0xab, 0xe4, 0x2a, 0x33, 0x6b, 0xae, 0x97, 0x79, 0xf1,
+ 0x6f, 0xed, 0x7d, 0x31, 0x5b, 0xbb, 0x2c, 0x6f, 0xb2, 0xca, 0xec, 0xec,
+ 0xe4, 0x2e, 0x31, 0x9b, 0x30, 0x61, 0x22, 0xbc, 0x30, 0x44, 0x96, 0xa4,
+ 0x66, 0x08, 0x4b, 0x80, 0xc3, 0x2a, 0x9b, 0xa7, 0x20, 0x26, 0xfb, 0x8d,
+ 0x91, 0x39, 0xc4, 0xcc, 0x52, 0x9b, 0xbc, 0xba, 0xf5, 0x68, 0x9b, 0x5e,
+ 0x9e, 0x99, 0x95, 0xe4, 0xf3, 0xda, 0x1c, 0x03, 0x2e, 0x85, 0x3c, 0x83,
+ 0x43, 0x05, 0xfd, 0x1b, 0xda, 0xbc, 0x2b, 0x9a, 0xf4, 0x96, 0x3e, 0x2f,
+ 0xb4, 0x39, 0x9c, 0x65, 0xcb, 0xac, 0x98, 0x65, 0x45, 0x33, 0x4a, 0xfe,
+ 0x54, 0xae, 0x36, 0xcd, 0xb7, 0x2f, 0x72, 0xb3, 0x07, 0xa9, 0x0c, 0x65,
+ 0xbe, 0x6c, 0x88, 0x60, 0x5a, 0xe5, 0x4b, 0xef, 0x28, 0xca, 0xc2, 0x9c,
+ 0x79, 0x72, 0xf6, 0xe6, 0x55, 0xf2, 0xe8, 0xf9, 0xe7, 0x4f, 0xdd, 0x99,
+ 0x9b, 0x01, 0x92, 0x69, 0x5a, 0x98, 0x15, 0x67, 0xd3, 0xfc, 0xe2, 0x2e,
+ 0x59, 0xac, 0xe6, 0x4d, 0xbe, 0x34, 0xbb, 0x8f, 0xcb, 0x87, 0x0b, 0xb4,
+ 0x4c, 0xab, 0xa6, 0x06, 0x11, 0xd0, 0x0f, 0x68, 0xed, 0x37, 0x55, 0xde,
+ 0xe0, 0x22, 0xd1, 0xef, 0xcc, 0x0c, 0xb3, 0xa6, 0xd6, 0xe1, 0x40, 0x6b,
+ 0xe6, 0x3b, 0x13, 0x43, 0x5b, 0x66, 0x6b, 0xd3, 0xda, 0x7c, 0xf4, 0xe0,
+ 0x33, 0xc7, 0x41, 0xae, 0x9a, 0x66, 0x79, 0xb0, 0xb3, 0x53, 0xe7, 0x4d,
+ 0x36, 0xfa, 0xbb, 0xb9, 0x87, 0x83, 0xe6, 0xa6, 0x1c, 0x34, 0x57, 0x55,
+ 0x96, 0xfd, 0x63, 0x64, 0x68, 0xd8, 0x3e, 0x69, 0xbe, 0x7b, 0x27, 0x13,
+ 0xbb, 0xcc, 0x1a, 0xf3, 0x85, 0xbf, 0xae, 0xb2, 0x02, 0x23, 0x9a, 0x79,
+ 0xa4, 0xf3, 0xe5, 0x55, 0x6a, 0x8e, 0x33, 0x33, 0xd4, 0x88, 0x9b, 0x6d,
+ 0x08, 0x06, 0xb3, 0xe2, 0xbb, 0xfd, 0xe7, 0x9f, 0xc3, 0x8f, 0x5e, 0xd0,
+ 0x37, 0xcd, 0x7f, 0x47, 0xd9, 0x6d, 0xba, 0x30, 0x6b, 0xc3, 0xa7, 0x76,
+ 0x40, 0x62, 0x7f, 0xde, 0x1b, 0xee, 0xed, 0xee, 0xfe, 0x3c, 0x6a, 0x6e,
+ 0x9b, 0x87, 0x3d, 0xbf, 0xbb, 0xeb, 0xde, 0xc0, 0xa3, 0x5b, 0x58, 0x6f,
+ 0x32, 0x37, 0x24, 0x83, 0x8f, 0xff, 0x2d, 0xab, 0xca, 0x7a, 0xfb, 0x61,
+ 0x23, 0xa5, 0xc3, 0xbf, 0xb5, 0xbf, 0xfb, 0x2e, 0xab, 0x89, 0x66, 0xdc,
+ 0x5a, 0x93, 0xb4, 0x32, 0x74, 0x5b, 0x36, 0x8e, 0x3d, 0x0d, 0xcc, 0xa5,
+ 0x6c, 0xec, 0xce, 0x98, 0x3b, 0x67, 0x9e, 0x36, 0x8c, 0x2d, 0x9d, 0x83,
+ 0xa7, 0xd5, 0x49, 0x91, 0xdd, 0xda, 0x5b, 0x6e, 0x6e, 0x7f, 0x96, 0x4e,
+ 0xaf, 0x92, 0xd2, 0x10, 0x7f, 0x15, 0x39, 0x02, 0x7f, 0x42, 0x69, 0x35,
+ 0xbd, 0xca, 0xaf, 0xcd, 0x6e, 0x3c, 0x7f, 0xfe, 0x74, 0x68, 0xfe, 0xf3,
+ 0xfc, 0xe7, 0x9d, 0xeb, 0x72, 0x6e, 0x36, 0xe7, 0xf1, 0xcf, 0x3b, 0x38,
+ 0xe2, 0xbf, 0xa7, 0x83, 0xc9, 0x60, 0xfa, 0x8f, 0xd1, 0x55, 0xb3, 0x98,
+ 0xf7, 0x12, 0x4e, 0x5a, 0x98, 0xff, 0x5f, 0x94, 0xab, 0xa2, 0xb1, 0xc4,
+ 0x62, 0x68, 0xae, 0xf1, 0x98, 0x93, 0xb9, 0xae, 0xe6, 0x8e, 0x82, 0xb4,
+ 0x41, 0x43, 0xb8, 0x75, 0xe6, 0x82, 0xba, 0xeb, 0xd8, 0x4c, 0xaf, 0xb0,
+ 0x7e, 0x43, 0x3d, 0xa9, 0x6c, 0x42, 0x93, 0xa7, 0xb8, 0x99, 0x86, 0x41,
+ 0x80, 0x61, 0xd1, 0x58, 0xfc, 0xb5, 0xdc, 0x3c, 0x58, 0x56, 0xb3, 0xac,
+ 0x1a, 0x75, 0xa7, 0x61, 0xaf, 0xac, 0xf7, 0xcd, 0x44, 0x25, 0x0a, 0x7e,
+ 0x40, 0x13, 0x5b, 0xe4, 0xb7, 0x66, 0x04, 0x62, 0x98, 0x05, 0x4d, 0x9c,
+ 0x47, 0x4b, 0x30, 0x63, 0xfa, 0x8c, 0xbe, 0xef, 0xae, 0xac, 0x99, 0x7a,
+ 0x6b, 0xe9, 0xf4, 0x51, 0xb7, 0xf8, 0xc4, 0x1c, 0xde, 0xd2, 0xbc, 0xb5,
+ 0x02, 0x5f, 0xa5, 0x6b, 0x8d, 0x61, 0x0c, 0x43, 0xb8, 0x34, 0xe7, 0x62,
+ 0xce, 0x02, 0x54, 0x8c, 0xa3, 0xba, 0x4b, 0xde, 0x19, 0x82, 0x61, 0x66,
+ 0xe4, 0x11, 0xfb, 0x3c, 0x6b, 0x9a, 0x7b, 0x8f, 0xc9, 0x51, 0xec, 0xc1,
+ 0x5e, 0x40, 0xb4, 0x7d, 0xcf, 0x1b, 0x3a, 0x3b, 0xd8, 0x6f, 0x3f, 0xfc,
+ 0x83, 0x61, 0xd2, 0xee, 0xba, 0x98, 0xaf, 0xff, 0xfd, 0x1f, 0x1e, 0xd5,
+ 0xdd, 0xe0, 0xb7, 0x79, 0x71, 0x5d, 0x7e, 0x34, 0x5b, 0x44, 0x52, 0x34,
+ 0x6d, 0xef, 0x26, 0xf8, 0xd0, 0x62, 0xd9, 0x58, 0xf1, 0x04, 0x72, 0x34,
+ 0x3f, 0x9a, 0xa4, 0x93, 0xf9, 0x5d, 0x72, 0x95, 0x5e, 0x67, 0x58, 0xef,
+ 0xd2, 0xd0, 0x29, 0x76, 0xc0, 0x88, 0x8d, 0x39, 0xf1, 0x31, 0x61, 0x0c,
+ 0xb3, 0x72, 0x35, 0x31, 0xcc, 0xe5, 0xaf, 0xab, 0xb2, 0xe1, 0x8d, 0x49,
+ 0xaf, 0xcb, 0x7c, 0xd6, 0x92, 0xc5, 0x57, 0x19, 0x18, 0x1a, 0x3e, 0x4c,
+ 0x42, 0xca, 0x30, 0x54, 0xcc, 0x94, 0x2e, 0x5a, 0xde, 0x40, 0xdc, 0x19,
+ 0x56, 0x98, 0xce, 0xeb, 0x32, 0x49, 0x2e, 0x4b, 0xdc, 0x12, 0x62, 0xc0,
+ 0x44, 0xe6, 0xe6, 0x50, 0xae, 0x52, 0x48, 0x35, 0x23, 0xc0, 0xec, 0x3d,
+ 0xa8, 0x32, 0xe2, 0xc5, 0x74, 0x52, 0xe9, 0x7c, 0xc0, 0xd2, 0x0b, 0xef,
+ 0xc8, 0x56, 0x25, 0x9b, 0xff, 0x6b, 0x73, 0x90, 0x6c, 0xfe, 0xc7, 0x26,
+ 0xd1, 0xc3, 0xe6, 0xbf, 0x6f, 0xba, 0x73, 0x36, 0xca, 0xd8, 0x75, 0x3e,
+ 0xcb, 0x98, 0x24, 0x8e, 0x4e, 0xaf, 0x9f, 0x26, 0x7f, 0x83, 0xee, 0x60,
+ 0x78, 0x6d, 0x76, 0xab, 0x04, 0xa9, 0x6b, 0x33, 0x6f, 0x27, 0x86, 0xe9,
+ 0xa6, 0x4b, 0x28, 0x11, 0x59, 0x35, 0x35, 0xd4, 0x9b, 0x5e, 0x1a, 0x7a,
+ 0x35, 0xb2, 0x58, 0x87, 0xc3, 0xf8, 0x78, 0x85, 0x97, 0x65, 0x18, 0x64,
+ 0x52, 0xa4, 0x0b, 0x73, 0x23, 0x8e, 0x31, 0xa3, 0xbc, 0x08, 0x0f, 0xf3,
+ 0xcf, 0x17, 0xd9, 0xe7, 0xbb, 0x07, 0x07, 0x8f, 0x7e, 0xbf, 0xff, 0x24,
+ 0x6b, 0xae, 0x76, 0x7f, 0xde, 0xb1, 0x8f, 0x1c, 0x5d, 0xd0, 0xb6, 0x2b,
+ 0xf9, 0xe9, 0x24, 0x8c, 0x94, 0xb7, 0x52, 0xc2, 0xbc, 0x6f, 0xfe, 0x9e,
+ 0x5d, 0xe4, 0xb7, 0x03, 0xd5, 0x97, 0xf8, 0xce, 0xa5, 0x86, 0xd4, 0xcc,
+ 0xf9, 0x81, 0x45, 0xe8, 0x70, 0x97, 0xab, 0xac, 0x36, 0x3b, 0x79, 0x73,
+ 0x95, 0x36, 0x89, 0x1d, 0x80, 0x4f, 0x76, 0x91, 0x5f, 0x5e, 0x35, 0xc9,
+ 0x4d, 0x0a, 0x61, 0x73, 0xd4, 0xf0, 0x10, 0x90, 0xf2, 0x46, 0xc4, 0x5c,
+ 0xa4, 0x46, 0x56, 0xe0, 0x0c, 0x49, 0xa4, 0x4f, 0x9c, 0x86, 0xd1, 0x18,
+ 0x32, 0xe7, 0x03, 0x71, 0xea, 0xd4, 0x24, 0xad, 0x71, 0x69, 0x0b, 0xc3,
+ 0x1c, 0x1a, 0xa3, 0x23, 0xac, 0xf0, 0xaf, 0x2b, 0xa3, 0x05, 0xd0, 0x1e,
+ 0xc8, 0x44, 0x49, 0x50, 0xbe, 0xc1, 0x71, 0xe2, 0x6c, 0xac, 0xf0, 0x32,
+ 0x87, 0x34, 0x90, 0x63, 0xb6, 0x6f, 0xd4, 0xe6, 0xc2, 0x19, 0xce, 0x64,
+ 0x29, 0x63, 0x03, 0x4c, 0x76, 0x83, 0xd7, 0x49, 0x73, 0x4c, 0x6b, 0x28,
+ 0x0a, 0xac, 0x0e, 0x98, 0xc9, 0x7b, 0x8b, 0x35, 0x9b, 0x96, 0x7e, 0x84,
+ 0x4a, 0xd2, 0x51, 0x7c, 0xe8, 0xb5, 0x59, 0x69, 0x88, 0xcc, 0xcc, 0xd6,
+ 0x30, 0x63, 0xac, 0x0c, 0x2c, 0x96, 0x76, 0x85, 0x88, 0xdc, 0x8c, 0x89,
+ 0x1f, 0xe6, 0x0d, 0x64, 0x0c, 0xe9, 0xb0, 0x66, 0xbe, 0x66, 0x53, 0x48,
+ 0x11, 0x35, 0x8c, 0xda, 0x5b, 0x3f, 0x89, 0x47, 0xf3, 0x6c, 0x72, 0x6d,
+ 0xb4, 0x14, 0xa3, 0x90, 0x66, 0xf6, 0x2d, 0x92, 0xe7, 0x53, 0xe8, 0x46,
+ 0x73, 0x73, 0x5f, 0xa6, 0x65, 0x55, 0x41, 0xdf, 0xc7, 0x09, 0x4e, 0x98,
+ 0x89, 0x2e, 0x32, 0xa3, 0x46, 0xf8, 0xdb, 0x99, 0x43, 0xa0, 0x19, 0xfe,
+ 0x62, 0xf4, 0x12, 0xe2, 0x20, 0x46, 0x7f, 0x20, 0x9e, 0x4f, 0x0b, 0xa7,
+ 0xd9, 0x61, 0xec, 0xe9, 0x34, 0x5b, 0x36, 0x75, 0x6c, 0x4d, 0x7a, 0xe0,
+ 0x66, 0x3a, 0x55, 0x86, 0x9d, 0xf7, 0x95, 0x2e, 0xda, 0x57, 0x2b, 0xf4,
+ 0x49, 0xef, 0x52, 0x3d, 0xc6, 0xe8, 0x61, 0xb5, 0xdd, 0xb5, 0x86, 0x68,
+ 0xc3, 0xb0, 0x31, 0xda, 0xf3, 0x05, 0x26, 0x8a, 0x87, 0x6b, 0xbe, 0xa9,
+ 0xc4, 0x9a, 0x71, 0x90, 0xac, 0x69, 0xf3, 0x77, 0x21, 0xba, 0xcc, 0x7e,
+ 0xda, 0xc1, 0xcd, 0x57, 0xed, 0x99, 0xe2, 0xf3, 0x50, 0xf1, 0x8d, 0x24,
+ 0x9f, 0xd5, 0x57, 0x46, 0xf9, 0xaa, 0xe5, 0x66, 0xe7, 0x0b, 0x43, 0x33,
+ 0xd7, 0x38, 0xdf, 0x65, 0x96, 0xcd, 0x46, 0xc9, 0xc9, 0x05, 0xb8, 0x6a,
+ 0x65, 0x26, 0xdd, 0xd0, 0xaf, 0x21, 0x55, 0xcc, 0xbe, 0xcd, 0x48, 0x89,
+ 0xb7, 0x57, 0x8b, 0xa7, 0xe2, 0x49, 0x07, 0xe2, 0xe4, 0xa9, 0xf9, 0x89,
+ 0x99, 0xed, 0xbc, 0x2d, 0x82, 0xe8, 0x1e, 0x1a, 0xee, 0x8d, 0xe9, 0x4d,
+ 0xb2, 0x84, 0x28, 0x71, 0x92, 0x35, 0x37, 0x59, 0x66, 0x87, 0xab, 0x33,
+ 0x23, 0xf6, 0x70, 0x68, 0xac, 0xf9, 0x11, 0x33, 0xc4, 0xd6, 0x9e, 0x9e,
+ 0x9d, 0x7c, 0x73, 0x76, 0x38, 0x1e, 0x27, 0x6f, 0x0f, 0xcf, 0x0f, 0xcf,
+ 0x5a, 0x3b, 0x5d, 0x94, 0xd5, 0x82, 0x4e, 0x74, 0x96, 0xd7, 0xcb, 0x79,
+ 0x7a, 0x87, 0xa3, 0x36, 0x2b, 0xb9, 0xac, 0x70, 0xb3, 0x16, 0x19, 0xa4,
+ 0xc2, 0x6c, 0x45, 0x9c, 0xcc, 0x88, 0x23, 0x73, 0x7c, 0xa2, 0xf1, 0x82,
+ 0x99, 0x90, 0x9a, 0x5c, 0x5c, 0xba, 0x9d, 0x36, 0x1c, 0x47, 0x24, 0x29,
+ 0x44, 0xa9, 0x3d, 0x0f, 0xa8, 0x9e, 0x64, 0xdc, 0x0c, 0xdc, 0xcf, 0x78,
+ 0x9b, 0x58, 0xb4, 0x19, 0x9a, 0xcd, 0x17, 0xc4, 0xec, 0xcc, 0x9f, 0x4e,
+ 0xdb, 0xcc, 0x2e, 0x8c, 0xaa, 0x6d, 0xa4, 0x2b, 0x5b, 0x0a, 0xdd, 0x39,
+ 0xe9, 0x6c, 0xad, 0x7e, 0x6c, 0xc8, 0x10, 0xac, 0x19, 0x03, 0xf2, 0x54,
+ 0xf8, 0x0b, 0x96, 0x89, 0x19, 0x9d, 0x04, 0xbc, 0x4f, 0x1e, 0x5b, 0x62,
+ 0x0a, 0x99, 0x39, 0xd9, 0x19, 0x0f, 0x5f, 0xaf, 0x2e, 0xe8, 0x22, 0x27,
+ 0x5b, 0x46, 0x33, 0x7f, 0x6b, 0xac, 0x25, 0x63, 0xb1, 0x0c, 0x92, 0xd3,
+ 0x6d, 0x7a, 0x6f, 0x6f, 0x77, 0xff, 0x31, 0x33, 0x82, 0x91, 0x0e, 0xf7,
+ 0xc6, 0x63, 0xc4, 0x7b, 0x1f, 0x71, 0xbc, 0xfc, 0x10, 0x06, 0x1f, 0x25,
+ 0x7b, 0x6f, 0xf9, 0x27, 0x8f, 0x3f, 0x7f, 0xf2, 0xec, 0xa9, 0xfc, 0xb0,
+ 0x4d, 0xe0, 0x76, 0xfe, 0x44, 0x1d, 0x64, 0xf9, 0xc1, 0x14, 0x34, 0x33,
+ 0x31, 0xab, 0x5b, 0xe4, 0x85, 0xb9, 0x26, 0xe6, 0x5a, 0x09, 0xaf, 0x02,
+ 0x3d, 0x9b, 0xc9, 0x5f, 0x30, 0x67, 0x93, 0x73, 0x6d, 0x9b, 0x94, 0xe6,
+ 0x65, 0x43, 0xb2, 0x86, 0x97, 0xdb, 0x43, 0x62, 0x35, 0xa1, 0xc1, 0x44,
+ 0xd2, 0x09, 0x18, 0x2c, 0xec, 0x2a, 0xa3, 0x00, 0x67, 0xd1, 0xaf, 0x59,
+ 0xa9, 0x68, 0xde, 0x30, 0x73, 0x33, 0x32, 0x11, 0x62, 0x2e, 0xdc, 0x77,
+ 0xc3, 0x0a, 0x88, 0x43, 0xde, 0xe4, 0x35, 0xb1, 0x86, 0x9b, 0x72, 0x35,
+ 0x37, 0x56, 0x0c, 0x1e, 0x58, 0x2d, 0xe9, 0x05, 0xf3, 0xa9, 0xa5, 0xe3,
+ 0x01, 0x46, 0x63, 0x01, 0xed, 0x74, 0x47, 0x31, 0x53, 0x33, 0xff, 0x5c,
+ 0x1a, 0x52, 0xe2, 0xe9, 0x8c, 0xba, 0x12, 0x82, 0x78, 0x5f, 0x40, 0x89,
+ 0xb8, 0xf3, 0xc4, 0xb4, 0x4f, 0x4f, 0xc6, 0xe7, 0xd0, 0x00, 0x4e, 0xdf,
+ 0x9f, 0x9b, 0x81, 0x8c, 0x0a, 0x50, 0x37, 0x86, 0x28, 0xf1, 0x62, 0x91,
+ 0x91, 0x09, 0xa9, 0xc3, 0x19, 0xda, 0xcb, 0x89, 0x51, 0x91, 0x5a, 0xa3,
+ 0x9f, 0xe4, 0x39, 0xb2, 0x8d, 0x8d, 0x2b, 0xa8, 0x16, 0x36, 0xcb, 0x70,
+ 0xfb, 0x4e, 0xb2, 0xf5, 0xc7, 0x6d, 0x43, 0xb3, 0xc3, 0xd2, 0xee, 0xce,
+ 0x70, 0x28, 0xaf, 0x9a, 0x6f, 0xd7, 0xf9, 0x22, 0x9f, 0xa7, 0x95, 0x37,
+ 0x75, 0xe6, 0xa8, 0xb8, 0x9f, 0x96, 0xaf, 0x4c, 0x0d, 0xd5, 0xd0, 0xb4,
+ 0x9d, 0x29, 0x89, 0x3d, 0x24, 0xae, 0xe4, 0x8e, 0x6a, 0x06, 0x85, 0x80,
+ 0x34, 0xe6, 0x65, 0x6e, 0xb7, 0x0e, 0x67, 0x06, 0x76, 0xd5, 0xda, 0xa8,
+ 0xee, 0xb9, 0x05, 0x1b, 0x07, 0x89, 0x44, 0x9e, 0x0a, 0xbb, 0x75, 0xc9,
+ 0xc6, 0x24, 0xad, 0x36, 0x12, 0xcb, 0x8b, 0xf9, 0x6e, 0xe2, 0x86, 0x54,
+ 0xd9, 0xe5, 0xca, 0xac, 0x20, 0xe1, 0xdd, 0xc5, 0x4a, 0x7f, 0xe7, 0xad,
+ 0x54, 0x07, 0x18, 0x4e, 0xf0, 0x48, 0x5e, 0xb3, 0x99, 0x79, 0x61, 0xec,
+ 0x16, 0x5c, 0x1a, 0xd5, 0x5f, 0x49, 0xa3, 0x11, 0x8a, 0x89, 0x10, 0x8c,
+ 0xa7, 0xd7, 0x9a, 0xab, 0xd2, 0x64, 0x86, 0xd1, 0x10, 0xfb, 0xc7, 0x93,
+ 0x43, 0x73, 0x64, 0xc3, 0x61, 0x6d, 0xf6, 0x1f, 0xba, 0xf7, 0x52, 0x6c,
+ 0xfa, 0x13, 0x72, 0x98, 0x58, 0xdf, 0xca, 0x89, 0xe8, 0xc0, 0x24, 0x36,
+ 0xf9, 0x5d, 0x62, 0xa1, 0x46, 0x51, 0xbd, 0x31, 0x1f, 0x4e, 0xcd, 0x91,
+ 0x99, 0x0b, 0xf7, 0x16, 0x1b, 0xc5, 0xbe, 0x91, 0xc4, 0xaa, 0xcd, 0x44,
+ 0x19, 0x39, 0xee, 0x7d, 0xea, 0x74, 0x99, 0xd9, 0x2c, 0xc7, 0x6f, 0xcd,
+ 0xfd, 0x32, 0x12, 0x6e, 0x95, 0x91, 0xed, 0x21, 0x9b, 0xba, 0x70, 0x9b,
+ 0x49, 0x66, 0x6c, 0x7d, 0x55, 0xc2, 0x4c, 0xdc, 0x60, 0x5e, 0x3c, 0xc4,
+ 0xb7, 0x36, 0x48, 0x9e, 0x2f, 0x12, 0xfd, 0x96, 0x7c, 0xca, 0xac, 0x63,
+ 0xe6, 0xeb, 0x66, 0x03, 0x23, 0x68, 0xee, 0x3c, 0x23, 0x81, 0x78, 0x35,
+ 0xcf, 0xbd, 0xb2, 0x0a, 0x8f, 0x11, 0xa9, 0x4b, 0x28, 0x53, 0xc2, 0xc3,
+ 0x49, 0x18, 0xd2, 0x95, 0xad, 0x79, 0x6a, 0x03, 0xb3, 0xb7, 0x78, 0xf2,
+ 0xf2, 0x4a, 0x1f, 0xf5, 0x04, 0x6b, 0x6a, 0x16, 0x07, 0xe1, 0x00, 0x7b,
+ 0x7a, 0xa6, 0x7c, 0xbf, 0xac, 0x98, 0x99, 0xcd, 0x4b, 0x43, 0xcb, 0x1b,
+ 0xac, 0xb2, 0xca, 0xb4, 0x31, 0x6b, 0xcc, 0x12, 0x3b, 0xce, 0x7e, 0xa6,
+ 0xd2, 0x9e, 0x8d, 0x9d, 0xb4, 0xec, 0x57, 0x7d, 0xef, 0xd4, 0xdc, 0x46,
+ 0x8d, 0x69, 0x8f, 0x8c, 0xe8, 0xac, 0x41, 0xc7, 0xba, 0xf3, 0x44, 0xde,
+ 0x46, 0xd4, 0x6d, 0x36, 0x7c, 0x1f, 0xc9, 0xc6, 0xea, 0xec, 0x7c, 0x4d,
+ 0xe4, 0x23, 0x82, 0xcc, 0xae, 0xcc, 0xac, 0x68, 0x96, 0xa7, 0x44, 0x27,
+ 0x7c, 0x34, 0xa4, 0x8c, 0x38, 0x8b, 0x30, 0xa2, 0x07, 0xdf, 0x75, 0x0d,
+ 0xba, 0xf9, 0xdc, 0x17, 0x49, 0x3a, 0xa7, 0xe1, 0x89, 0x59, 0xfb, 0x31,
+ 0xad, 0x63, 0x78, 0x9d, 0xe0, 0xfa, 0x19, 0xb3, 0x01, 0x77, 0x71, 0x78,
+ 0x72, 0x7c, 0xed, 0x5d, 0x23, 0x58, 0xee, 0x05, 0xf4, 0x94, 0x01, 0x79,
+ 0x47, 0x26, 0x65, 0x69, 0xcc, 0x64, 0xb7, 0x34, 0xc8, 0x83, 0xac, 0x00,
+ 0xb5, 0xcb, 0x89, 0x1a, 0x96, 0xb0, 0xb4, 0xfc, 0xf6, 0xce, 0x98, 0x4b,
+ 0xe9, 0x65, 0x9a, 0x5b, 0x7a, 0x93, 0x9b, 0x31, 0x4b, 0xf4, 0xe1, 0xa2,
+ 0x94, 0xe7, 0x71, 0x54, 0x50, 0x81, 0x84, 0x6f, 0xad, 0x6a, 0xbe, 0x3e,
+ 0x66, 0x55, 0x86, 0xf3, 0x10, 0xef, 0x90, 0x71, 0xa1, 0x36, 0xea, 0x70,
+ 0x13, 0x52, 0x94, 0xa1, 0x73, 0x12, 0xf3, 0x25, 0x0d, 0xd2, 0x8c, 0xb8,
+ 0x31, 0x4a, 0xbe, 0x2d, 0x6f, 0x32, 0xf2, 0x15, 0x92, 0x7e, 0x9f, 0xc3,
+ 0xdb, 0x65, 0x54, 0xc1, 0x9b, 0x2c, 0x59, 0x18, 0xd5, 0xd3, 0xec, 0x26,
+ 0x69, 0x1f, 0xf4, 0x33, 0xcf, 0x3c, 0x34, 0x14, 0x7e, 0xc3, 0xbb, 0x64,
+ 0x57, 0x61, 0x8f, 0xf2, 0x82, 0xaf, 0x44, 0xb2, 0x45, 0xea, 0xcd, 0x14,
+ 0xbb, 0xb5, 0x6c, 0xdc, 0x2a, 0xec, 0x86, 0xdc, 0xa4, 0xb5, 0x77, 0xb9,
+ 0x32, 0x32, 0x4d, 0x9f, 0x8d, 0xf6, 0x9e, 0x8f, 0x76, 0x47, 0xc6, 0x10,
+ 0xc9, 0xae, 0xf3, 0x72, 0x55, 0x9b, 0x4f, 0x63, 0x1a, 0xee, 0x9d, 0x0c,
+ 0xb7, 0xb2, 0x29, 0x2f, 0x2f, 0xe7, 0xac, 0xf3, 0xec, 0x94, 0x17, 0x17,
+ 0xac, 0xfb, 0x18, 0x4d, 0xcf, 0xea, 0xcf, 0x6c, 0x01, 0x61, 0x67, 0xe4,
+ 0xba, 0x31, 0x4b, 0x0d, 0x4d, 0xe4, 0x91, 0x73, 0x5e, 0x0c, 0x87, 0xe9,
+ 0xa4, 0x6e, 0x60, 0x4c, 0x0d, 0x57, 0x45, 0x7e, 0x3b, 0xac, 0xcb, 0xe9,
+ 0x47, 0x73, 0x28, 0x2f, 0x96, 0x69, 0x73, 0xf5, 0xc7, 0x8e, 0x4b, 0x78,
+ 0x0b, 0xb2, 0x64, 0x3b, 0x49, 0x5e, 0xb1, 0x5a, 0x89, 0x9d, 0xa8, 0xf8,
+ 0xbe, 0x99, 0xd3, 0x94, 0x51, 0x92, 0xf7, 0x66, 0x14, 0x43, 0xcb, 0x0b,
+ 0x73, 0xa8, 0x09, 0x0f, 0x36, 0x50, 0x56, 0xda, 0x19, 0x8e, 0x1c, 0x8e,
+ 0x10, 0x23, 0xe4, 0xb7, 0x33, 0x57, 0xa7, 0xac, 0x3e, 0x1a, 0x45, 0xfb,
+ 0x9d, 0x31, 0x19, 0x0f, 0xf0, 0x6f, 0xc3, 0xc2, 0x1a, 0xda, 0x72, 0x91,
+ 0xac, 0x66, 0x46, 0xcc, 0x8c, 0x61, 0x91, 0xa7, 0x93, 0x61, 0x67, 0x38,
+ 0xf9, 0xbe, 0x7c, 0x34, 0x51, 0x5b, 0x43, 0x49, 0x29, 0xd9, 0xfc, 0xca,
+ 0xd8, 0x7f, 0x57, 0x7c, 0xec, 0x34, 0x20, 0xaf, 0xd1, 0x50, 0xe8, 0xa5,
+ 0xb1, 0x20, 0x8a, 0xa6, 0x3b, 0xdc, 0x15, 0x89, 0x6a, 0x48, 0x19, 0x36,
+ 0x76, 0x89, 0x48, 0xc4, 0x03, 0x64, 0xed, 0xcf, 0xd1, 0x67, 0x9d, 0xd7,
+ 0x5e, 0xba, 0x33, 0x7d, 0xf2, 0xc8, 0x9c, 0xa9, 0xbf, 0xd1, 0xf3, 0x66,
+ 0x58, 0x5f, 0x4f, 0x93, 0x17, 0xa4, 0x7d, 0x83, 0x4c, 0xa3, 0x1b, 0x3c,
+ 0xde, 0x4e, 0x7e, 0x78, 0x79, 0xf6, 0xee, 0xe8, 0xdd, 0x37, 0x07, 0xfc,
+ 0x51, 0xa1, 0x34, 0xf3, 0xb7, 0xec, 0x76, 0x09, 0x3f, 0x18, 0x66, 0x6b,
+ 0x44, 0x59, 0x92, 0xbc, 0x2e, 0xc9, 0x1e, 0x21, 0x86, 0x09, 0x81, 0xd5,
+ 0x19, 0xce, 0x88, 0x96, 0xd9, 0xaa, 0xe3, 0xfb, 0xb5, 0x0c, 0xdb, 0x0d,
+ 0xcc, 0xd7, 0x93, 0x37, 0x59, 0xe7, 0x68, 0xf8, 0x23, 0xbb, 0x8f, 0x49,
+ 0x5f, 0x1a, 0x41, 0x5a, 0x92, 0x99, 0xaf, 0x33, 0xef, 0x7e, 0xa9, 0x34,
+ 0xc6, 0x2e, 0xdb, 0xf9, 0x66, 0xbc, 0x5b, 0x73, 0x6d, 0xb0, 0x4b, 0x3a,
+ 0xd8, 0xd4, 0xb0, 0xa3, 0x4c, 0x14, 0x07, 0x62, 0x75, 0x64, 0x36, 0x08,
+ 0x2b, 0x1b, 0x25, 0x2f, 0x2f, 0xba, 0x47, 0x09, 0xdd, 0x05, 0x5a, 0xbd,
+ 0x4a, 0xc1, 0x99, 0x53, 0x84, 0xd9, 0xcb, 0xcb, 0x23, 0xea, 0x30, 0xb5,
+ 0x39, 0x9f, 0x99, 0x4a, 0x7a, 0x7c, 0xa6, 0x33, 0x1c, 0x99, 0x9e, 0xc4,
+ 0x66, 0xa0, 0x14, 0xe6, 0x38, 0x50, 0x98, 0x7e, 0x86, 0x51, 0x2f, 0xca,
+ 0x19, 0xd9, 0x11, 0xc1, 0xfe, 0x8c, 0xd9, 0xc2, 0x80, 0xc7, 0x67, 0x63,
+ 0xc3, 0x2d, 0x3b, 0xd9, 0x82, 0xef, 0xcf, 0x90, 0x41, 0x71, 0xd9, 0x5c,
+ 0x6d, 0x33, 0xb3, 0x65, 0xcf, 0x46, 0x02, 0x55, 0xc5, 0x2c, 0x7a, 0xc7,
+ 0x4c, 0xc6, 0x53, 0xf2, 0x3d, 0x97, 0x00, 0xb9, 0x9e, 0x49, 0xfb, 0xfc,
+ 0xcb, 0xaa, 0x6e, 0xc8, 0x22, 0x12, 0x15, 0x80, 0x57, 0x63, 0x66, 0xb7,
+ 0xc8, 0x16, 0x65, 0x75, 0x17, 0x4c, 0xe6, 0x88, 0x14, 0x10, 0x18, 0x9f,
+ 0x72, 0x62, 0xa0, 0x05, 0x92, 0x91, 0xea, 0x16, 0x84, 0x21, 0x00, 0xbf,
+ 0xba, 0xb5, 0x05, 0x49, 0x71, 0x32, 0x4c, 0xc8, 0xd8, 0xe0, 0xce, 0x69,
+ 0xab, 0x46, 0x14, 0x39, 0x7b, 0xd8, 0xbe, 0x17, 0x8b, 0x6a, 0x22, 0x6e,
+ 0x1c, 0xfc, 0xff, 0x3c, 0x05, 0xe7, 0x29, 0xb2, 0xd6, 0x29, 0x91, 0x04,
+ 0xe1, 0xa5, 0xad, 0x23, 0xf9, 0xa7, 0x8f, 0x47, 0x7b, 0x2d, 0x92, 0x2f,
+ 0xee, 0x10, 0x2c, 0x88, 0xf3, 0x91, 0x73, 0xa3, 0x3c, 0xd6, 0x3c, 0x67,
+ 0xb3, 0x8f, 0x17, 0xf9, 0xe5, 0xaa, 0xca, 0x58, 0x8b, 0xa3, 0xf8, 0x82,
+ 0x86, 0x15, 0xa0, 0x18, 0x5d, 0x95, 0xe4, 0x8d, 0x37, 0x02, 0x35, 0x9b,
+ 0x5f, 0x0c, 0x22, 0x9b, 0xcb, 0x37, 0x00, 0xd3, 0x27, 0xc6, 0x69, 0x4c,
+ 0x15, 0x1a, 0xac, 0xc8, 0x44, 0x91, 0x5d, 0x18, 0xa6, 0x92, 0xc0, 0x1d,
+ 0x9d, 0x4c, 0xe7, 0x69, 0xbe, 0x20, 0x52, 0x15, 0x77, 0xeb, 0x28, 0x76,
+ 0x35, 0x60, 0x64, 0xe0, 0xed, 0x09, 0xcc, 0xdf, 0xaa, 0x86, 0x74, 0x26,
+ 0x8a, 0x56, 0xed, 0x99, 0x8d, 0xcb, 0xab, 0x6c, 0xfa, 0x51, 0x19, 0x98,
+ 0xaa, 0x9d, 0x5d, 0x5a, 0x46, 0x9c, 0x81, 0x6c, 0x6c, 0xf3, 0xd4, 0xaa,
+ 0xc6, 0x55, 0xa9, 0xeb, 0x1c, 0x2e, 0x34, 0x98, 0x84, 0xab, 0x29, 0x59,
+ 0x8a, 0x74, 0x69, 0x0c, 0x85, 0x2b, 0x17, 0x4c, 0x0c, 0x5b, 0x2d, 0x66,
+ 0xc3, 0xa6, 0xca, 0x97, 0x7d, 0xb3, 0xe3, 0x53, 0x69, 0x2b, 0xa9, 0xb5,
+ 0x58, 0xed, 0x64, 0x10, 0x33, 0x01, 0x4f, 0x93, 0xce, 0x6e, 0x76, 0x86,
+ 0xe3, 0xbd, 0x1d, 0xc0, 0x27, 0x94, 0x1b, 0x9d, 0x81, 0x0d, 0x26, 0x72,
+ 0x79, 0x1a, 0xf3, 0x48, 0x84, 0x97, 0xb1, 0xe4, 0xf2, 0x29, 0x29, 0x42,
+ 0xf9, 0x65, 0x86, 0x78, 0x8e, 0x91, 0x67, 0xcd, 0xdc, 0xa8, 0x47, 0x9e,
+ 0x64, 0xb4, 0x27, 0x5e, 0x64, 0x97, 0x65, 0x03, 0x8d, 0x24, 0x20, 0x93,
+ 0xf7, 0xc4, 0xeb, 0x2d, 0x4d, 0xa8, 0xea, 0xef, 0xeb, 0x65, 0x39, 0xeb,
+ 0xe4, 0xe6, 0xd3, 0xac, 0xfa, 0x8b, 0xd7, 0xa1, 0x6e, 0xcc, 0xcd, 0xea,
+ 0x9e, 0xba, 0x19, 0x6d, 0x9a, 0x91, 0xfd, 0x45, 0xca, 0xa3, 0xea, 0xae,
+ 0xaa, 0xf4, 0x83, 0x2d, 0x40, 0x4f, 0x6e, 0x6e, 0xf2, 0x69, 0xa6, 0x2e,
+ 0x39, 0xf1, 0x53, 0xcf, 0xf3, 0x90, 0xdd, 0x2f, 0x70, 0x27, 0xcd, 0x4b,
+ 0xac, 0x97, 0xc3, 0x83, 0x72, 0x93, 0x43, 0x6f, 0x17, 0xc6, 0x47, 0x6a,
+ 0x99, 0x88, 0x84, 0xb4, 0xca, 0xc9, 0x5d, 0x64, 0x86, 0x93, 0x79, 0x86,
+ 0x17, 0xde, 0x9b, 0x37, 0xbd, 0x2f, 0xa6, 0x8c, 0x33, 0x61, 0xe8, 0x72,
+ 0x5d, 0xa4, 0xf9, 0x3c, 0xb2, 0x4f, 0xc4, 0xcc, 0x2e, 0x33, 0xf2, 0xac,
+ 0xf1, 0x19, 0xac, 0xb0, 0xe9, 0x88, 0xbd, 0x85, 0x8c, 0x2a, 0xcb, 0xd8,
+ 0xa6, 0x20, 0x03, 0xe4, 0xf6, 0xce, 0x6e, 0x2f, 0x29, 0x6e, 0x7c, 0x76,
+ 0xf2, 0x77, 0x3e, 0x3e, 0xef, 0x7a, 0xa6, 0x18, 0x35, 0x5d, 0x22, 0xc8,
+ 0xd4, 0xbd, 0xa1, 0x30, 0xbf, 0x10, 0xa7, 0xdc, 0x56, 0x2f, 0x72, 0x26,
+ 0x3e, 0x74, 0x1b, 0xdf, 0x23, 0x86, 0x04, 0x9e, 0x26, 0x57, 0x98, 0xc7,
+ 0x11, 0x2e, 0xdc, 0xe5, 0xe7, 0x46, 0xc6, 0x1a, 0x91, 0x4c, 0x6c, 0xb4,
+ 0x45, 0xb1, 0xa5, 0x61, 0x5f, 0x36, 0xca, 0x04, 0xaf, 0xaf, 0xf0, 0x3a,
+ 0x32, 0xb6, 0xe8, 0xce, 0xc6, 0xf8, 0x39, 0xcc, 0x3f, 0xe8, 0xca, 0x2c,
+ 0x69, 0x06, 0x09, 0xeb, 0x76, 0xcc, 0xac, 0xa6, 0xec, 0x07, 0x16, 0x3d,
+ 0x82, 0xc5, 0x0d, 0x4d, 0xf5, 0x62, 0x9e, 0x5e, 0x92, 0x8b, 0xed, 0xb2,
+ 0x7b, 0x43, 0x8b, 0x52, 0x82, 0x7d, 0x75, 0x69, 0x38, 0x3c, 0x56, 0x2d,
+ 0xee, 0xad, 0x3a, 0xd9, 0x32, 0x44, 0x36, 0x5f, 0x91, 0xc8, 0x3f, 0x31,
+ 0xcb, 0x1b, 0x8f, 0xbf, 0xdd, 0xf6, 0xd9, 0x1b, 0xed, 0xee, 0x43, 0x98,
+ 0x1b, 0xb8, 0x13, 0x19, 0xe2, 0x5f, 0xf3, 0x79, 0xb4, 0x19, 0x9c, 0xb5,
+ 0xf0, 0x7c, 0x6d, 0x4e, 0xe9, 0x12, 0xab, 0x80, 0x3b, 0x74, 0x64, 0xaf,
+ 0x3e, 0x9e, 0x54, 0xaf, 0x2c, 0x13, 0x76, 0x4b, 0x49, 0x58, 0xd5, 0x2b,
+ 0x72, 0x50, 0x91, 0x4c, 0xee, 0x0e, 0x67, 0x98, 0xbd, 0x61, 0x45, 0xab,
+ 0x02, 0x7f, 0x5a, 0x3d, 0x3a, 0x27, 0x8b, 0x0e, 0x67, 0x51, 0xc1, 0x0d,
+ 0x0e, 0x5b, 0xd8, 0xea, 0xa1, 0x86, 0xa7, 0xe8, 0xd8, 0xd8, 0xcb, 0xee,
+ 0x25, 0x34, 0x5a, 0x1a, 0xb1, 0x1b, 0x23, 0x46, 0x8d, 0x70, 0xc6, 0x85,
+ 0xeb, 0xe1, 0xde, 0x5b, 0xf5, 0xca, 0xf0, 0x17, 0x98, 0x0f, 0xc2, 0x3c,
+ 0x40, 0x8f, 0xdd, 0xd9, 0x31, 0x7b, 0x31, 0x92, 0xc6, 0xe3, 0x23, 0xdb,
+ 0xbf, 0xf5, 0x05, 0xa1, 0x43, 0xf3, 0x4f, 0xd1, 0x88, 0xdf, 0xcc, 0x18,
+ 0x65, 0xa4, 0x96, 0x05, 0x1a, 0xd9, 0xf9, 0xf1, 0x38, 0x76, 0x98, 0xed,
+ 0x18, 0x15, 0xde, 0x07, 0xb3, 0x85, 0x2b, 0x91, 0x5d, 0xab, 0x25, 0x0c,
+ 0x03, 0x2f, 0x4e, 0xe5, 0xfb, 0xfc, 0x96, 0x19, 0x02, 0x5a, 0x6c, 0x33,
+ 0x73, 0x00, 0x1c, 0x0c, 0x0c, 0xc2, 0x1a, 0x1a, 0x8a, 0x75, 0xa3, 0xbe,
+ 0x7a, 0xe9, 0x8f, 0x4b, 0x7e, 0xd3, 0xee, 0x45, 0xf0, 0x7e, 0xbf, 0x55,
+ 0x6f, 0x5b, 0x1e, 0x66, 0x46, 0x39, 0x3d, 0x7c, 0x4b, 0x36, 0x6c, 0x6a,
+ 0xe8, 0xe6, 0x9d, 0xba, 0x2c, 0x35, 0xbe, 0x3d, 0x59, 0xe5, 0xf3, 0x56,
+ 0x5c, 0xc0, 0x99, 0xdd, 0x14, 0x5c, 0x66, 0xd2, 0xa2, 0xa9, 0x71, 0x84,
+ 0x2b, 0x27, 0x17, 0x71, 0x97, 0xd0, 0x9a, 0xbb, 0xa5, 0x78, 0xb7, 0x57,
+ 0x75, 0xcb, 0x89, 0xa4, 0x72, 0x79, 0xde, 0x90, 0xa6, 0x0d, 0xdb, 0xd6,
+ 0x1b, 0x33, 0x38, 0x21, 0x9a, 0x16, 0xc4, 0xc0, 0x65, 0x91, 0xff, 0x4d,
+ 0xf4, 0xd0, 0xac, 0xb8, 0xce, 0xab, 0xb2, 0x80, 0xa6, 0x6b, 0xcc, 0xdf,
+ 0x2a, 0x27, 0xb6, 0x0c, 0x0d, 0xcc, 0x30, 0x8e, 0xcd, 0x57, 0xef, 0xcf,
+ 0x8e, 0x3f, 0xbc, 0x7a, 0xf9, 0xe1, 0xeb, 0xf7, 0xef, 0x5e, 0x1f, 0x1f,
+ 0x6e, 0x76, 0x86, 0x83, 0xdf, 0x2f, 0x17, 0x67, 0x7d, 0x0d, 0xeb, 0x83,
+ 0x2e, 0x89, 0x99, 0x22, 0x8f, 0x7c, 0x99, 0x5f, 0x1b, 0x86, 0x46, 0xc6,
+ 0x04, 0xf9, 0xe9, 0xe9, 0x6f, 0xe4, 0xd9, 0x92, 0x0d, 0xef, 0x0c, 0x37,
+ 0x59, 0x41, 0x4f, 0x1b, 0xb5, 0x34, 0x66, 0xbd, 0x2a, 0x62, 0xb9, 0xeb,
+ 0x04, 0x23, 0x5a, 0x36, 0xb4, 0xa8, 0x62, 0x06, 0x13, 0xc6, 0x33, 0x14,
+ 0x3d, 0x97, 0xfd, 0xaa, 0x31, 0x96, 0x92, 0x06, 0x09, 0x8c, 0xd6, 0x56,
+ 0x7e, 0xd4, 0x4c, 0x03, 0x63, 0x66, 0xbd, 0x8c, 0x1c, 0x77, 0xed, 0x94,
+ 0xd1, 0x59, 0xb2, 0x89, 0x91, 0x0c, 0xfd, 0x0e, 0x65, 0x92, 0xd3, 0xaa,
+ 0x31, 0x36, 0x4e, 0x96, 0xd3, 0xc5, 0xd0, 0x48, 0x2a, 0xd4, 0x56, 0x72,
+ 0xd0, 0x05, 0x5a, 0xb6, 0xd1, 0x35, 0xb1, 0x07, 0xa4, 0xe1, 0x67, 0xb7,
+ 0x19, 0xdd, 0x3c, 0x79, 0xeb, 0xd5, 0xaa, 0xa2, 0xdb, 0xfc, 0x83, 0xd1,
+ 0x46, 0xc0, 0xfd, 0x5e, 0x93, 0x87, 0xcf, 0xbc, 0xa0, 0x0f, 0x19, 0x31,
+ 0xd3, 0x15, 0x79, 0xe5, 0x1c, 0xb1, 0xd5, 0x94, 0xbc, 0x29, 0xe4, 0xfb,
+ 0x3a, 0x7d, 0x79, 0xfe, 0x6d, 0x54, 0x99, 0x75, 0x69, 0x3d, 0x42, 0x8a,
+ 0xa4, 0x9c, 0xd7, 0x8d, 0x5c, 0x90, 0x77, 0xe3, 0x71, 0x42, 0x49, 0x23,
+ 0xf3, 0x7c, 0x52, 0xa5, 0xf8, 0x26, 0x7e, 0x8c, 0x9f, 0x1a, 0xb2, 0xee,
+ 0x0c, 0x77, 0xfa, 0xdd, 0xab, 0xf1, 0xef, 0xf6, 0xf6, 0xa0, 0xc9, 0xaf,
+ 0xcc, 0xbe, 0x6c, 0x99, 0x57, 0x8a, 0xda, 0xdc, 0xcc, 0xc5, 0xa8, 0x2e,
+ 0xb7, 0x49, 0x6c, 0xd7, 0xa2, 0x0e, 0xa4, 0xd7, 0x46, 0xda, 0x12, 0x1d,
+ 0x29, 0x51, 0x9b, 0xe3, 0x0c, 0xf6, 0x84, 0x18, 0x9d, 0x64, 0xd4, 0x18,
+ 0x7e, 0x61, 0xe4, 0xf5, 0x3c, 0x54, 0xc8, 0xb7, 0xf2, 0x93, 0xb1, 0x2a,
+ 0xf5, 0x53, 0xf3, 0x57, 0x38, 0x0b, 0xb6, 0xb1, 0xb2, 0xf6, 0x0d, 0xd3,
+ 0x55, 0x8d, 0x59, 0x1b, 0x3d, 0x87, 0x09, 0x43, 0x69, 0x34, 0x21, 0x57,
+ 0x28, 0xba, 0x97, 0xcb, 0xa5, 0x2a, 0x11, 0x39, 0x4c, 0xd2, 0xe9, 0xc7,
+ 0x9b, 0xb4, 0x9a, 0xb1, 0x4d, 0x64, 0x28, 0x66, 0x92, 0xcf, 0xf3, 0xe6,
+ 0x8e, 0x6d, 0xdb, 0xae, 0x5d, 0xcd, 0x31, 0x52, 0x6c, 0xa0, 0xb9, 0x47,
+ 0x97, 0xc6, 0xec, 0x87, 0xf6, 0x09, 0x15, 0x3f, 0x6f, 0x7c, 0xb3, 0x96,
+ 0x54, 0xa4, 0xc6, 0xaa, 0x38, 0xf6, 0xdb, 0x81, 0x78, 0x6c, 0xf8, 0x1e,
+ 0xd1, 0x34, 0x1d, 0xed, 0x2a, 0x1b, 0xf4, 0x99, 0x94, 0x92, 0x4f, 0x52,
+ 0xdf, 0x19, 0x29, 0xbf, 0x48, 0x22, 0x2a, 0x22, 0x65, 0x10, 0x25, 0xdf,
+ 0x65, 0x77, 0xc6, 0x86, 0xce, 0x0b, 0xc7, 0x29, 0xd9, 0xc6, 0xcf, 0x60,
+ 0xe1, 0xb1, 0x2e, 0x9a, 0xab, 0x43, 0x3d, 0x93, 0x98, 0x08, 0x4b, 0x92,
+ 0xd0, 0x89, 0xc0, 0xef, 0xab, 0x1e, 0x8e, 0x21, 0x36, 0xeb, 0x16, 0x4b,
+ 0xa6, 0x2f, 0x85, 0x87, 0x38, 0x36, 0x3f, 0x2f, 0x8a, 0x6c, 0x2e, 0xc7,
+ 0x77, 0xbe, 0xee, 0x00, 0xec, 0xb3, 0x66, 0xca, 0x3f, 0xf0, 0x8d, 0xee,
+ 0x0c, 0xf7, 0x8c, 0x03, 0xfc, 0x69, 0xa3, 0x32, 0x49, 0x33, 0x87, 0x8c,
+ 0x55, 0xb4, 0x6b, 0x7f, 0x35, 0xea, 0xfd, 0x4c, 0x70, 0x9b, 0x2a, 0x77,
+ 0xe8, 0xed, 0x33, 0x67, 0xc7, 0x28, 0x1d, 0x32, 0xce, 0x58, 0x8e, 0xf8,
+ 0x0b, 0xab, 0x59, 0x51, 0x10, 0xa3, 0x33, 0x9c, 0xaf, 0x65, 0xab, 0x0c,
+ 0x93, 0x75, 0x6c, 0x1a, 0x3d, 0xb5, 0xac, 0xc8, 0x67, 0x54, 0x95, 0xe6,
+ 0xac, 0x5b, 0xe7, 0xb9, 0xc5, 0xca, 0x46, 0xf7, 0x9a, 0x08, 0x37, 0xf7,
+ 0x36, 0x66, 0x3b, 0x76, 0xd1, 0x03, 0xcd, 0x24, 0x34, 0x59, 0x7b, 0x2d,
+ 0xce, 0xb6, 0x84, 0x26, 0x2e, 0xfd, 0xc2, 0xb0, 0xb1, 0x7f, 0x5e, 0x40,
+ 0x33, 0x33, 0x24, 0xe6, 0x17, 0xca, 0x2c, 0xa1, 0xc5, 0x96, 0xa0, 0x7e,
+ 0xab, 0x12, 0x19, 0x93, 0xb0, 0x6e, 0xd8, 0x25, 0x27, 0x0d, 0xb0, 0xe2,
+ 0xc8, 0xfe, 0xe4, 0xd0, 0x0c, 0x80, 0x4b, 0x50, 0xdc, 0x8e, 0x07, 0x1b,
+ 0xc9, 0x56, 0x36, 0xba, 0x34, 0xe3, 0x6d, 0x60, 0x9c, 0xbd, 0x03, 0xfc,
+ 0x77, 0x9f, 0xfe, 0xfb, 0x68, 0x43, 0xd3, 0xfb, 0xfc, 0xad, 0x87, 0x34,
+ 0xef, 0xca, 0x22, 0x8e, 0xc9, 0x39, 0xe1, 0x3e, 0x60, 0x3f, 0x73, 0x1f,
+ 0xe3, 0x61, 0x9d, 0xf5, 0x98, 0x77, 0x39, 0x54, 0xb7, 0x74, 0x1b, 0x16,
+ 0xec, 0x8f, 0xb8, 0xce, 0xd8, 0x29, 0x62, 0x56, 0x36, 0x35, 0xea, 0x21,
+ 0xb9, 0x12, 0xf5, 0x56, 0x4d, 0x3f, 0x54, 0xd9, 0x55, 0x5a, 0x5f, 0x25,
+ 0xab, 0x86, 0x89, 0xd0, 0xd0, 0x6d, 0x77, 0xb8, 0xe5, 0x3c, 0x77, 0xde,
+ 0x36, 0xf9, 0xf4, 0x48, 0xed, 0x3e, 0x77, 0x8a, 0x1c, 0x05, 0x99, 0x97,
+ 0x37, 0xfa, 0xcc, 0x50, 0xf2, 0xed, 0x62, 0x6a, 0x81, 0x39, 0x4d, 0xf2,
+ 0x9b, 0xe0, 0x31, 0x3f, 0x9a, 0xbd, 0x80, 0x36, 0x89, 0x64, 0x40, 0xc3,
+ 0xe2, 0x2e, 0xcc, 0x8e, 0xc1, 0xa2, 0x9b, 0xd3, 0xb9, 0xc1, 0x76, 0xa5,
+ 0x79, 0x07, 0xa6, 0xa9, 0xe8, 0x79, 0xf9, 0x85, 0x78, 0x70, 0xe5, 0xdf,
+ 0x24, 0x4f, 0x45, 0xfb, 0xaa, 0x39, 0xe2, 0xdd, 0x55, 0xbd, 0xee, 0x27,
+ 0x6d, 0x65, 0x90, 0x56, 0xd3, 0x91, 0xc5, 0x72, 0xd0, 0x44, 0xe9, 0x3a,
+ 0xbf, 0x24, 0x5b, 0x23, 0xe6, 0xc0, 0x60, 0xc7, 0xd4, 0x3f, 0x75, 0x49,
+ 0xcc, 0x8c, 0x87, 0xf0, 0x99, 0xae, 0xea, 0x07, 0xdc, 0x11, 0x8f, 0xe9,
+ 0xf2, 0x3b, 0xd6, 0x67, 0xcc, 0x91, 0x7d, 0x7f, 0x03, 0xba, 0x54, 0x78,
+ 0xe7, 0x11, 0xc6, 0x2b, 0xef, 0x66, 0x8d, 0x79, 0xa0, 0x33, 0x71, 0x91,
+ 0x6c, 0xa5, 0x1f, 0xd3, 0x51, 0x72, 0xf2, 0x6a, 0x7c, 0x8a, 0x4f, 0x18,
+ 0xea, 0x28, 0x2e, 0xcd, 0x2c, 0x8e, 0xc7, 0x9d, 0xe1, 0xb2, 0xdb, 0x26,
+ 0x2b, 0xea, 0x98, 0x93, 0x32, 0xdc, 0x66, 0x8d, 0x24, 0x68, 0x8a, 0x8d,
+ 0x4c, 0xd6, 0x58, 0xfa, 0x14, 0x1b, 0x47, 0xa8, 0x17, 0x79, 0x18, 0x09,
+ 0x5f, 0xb5, 0xe0, 0x43, 0x4b, 0x73, 0xf3, 0x67, 0xdb, 0xd6, 0x55, 0x33,
+ 0x50, 0x5a, 0xb0, 0x21, 0xc3, 0x7a, 0x75, 0x09, 0x1b, 0xa4, 0x56, 0xbb,
+ 0xd1, 0x7e, 0xc1, 0xec, 0x46, 0xa8, 0x2a, 0xc8, 0xb2, 0xad, 0x37, 0xd1,
+ 0x58, 0x4d, 0xc8, 0xa6, 0x22, 0x15, 0xa9, 0x28, 0xdd, 0xa8, 0xc8, 0xa8,
+ 0xa0, 0xcc, 0xd1, 0x9c, 0x82, 0x6c, 0xd3, 0xcc, 0xa8, 0xa0, 0xb3, 0x88,
+ 0x12, 0xc0, 0x87, 0xa2, 0x86, 0xd3, 0x85, 0x64, 0x8b, 0x46, 0xfc, 0x3f,
+ 0x34, 0xd0, 0x94, 0x55, 0x34, 0x50, 0x3d, 0x05, 0x2b, 0x72, 0xf8, 0x4a,
+ 0xa1, 0x30, 0xb3, 0xa9, 0x8e, 0xf1, 0xec, 0xfd, 0xff, 0xa6, 0x58, 0x99,
+ 0x8d, 0x8f, 0x48, 0x63, 0x28, 0x55, 0x10, 0x33, 0xd8, 0xc0, 0x75, 0x8e,
+ 0xbd, 0xc7, 0x7b, 0x6d, 0x5f, 0x36, 0x11, 0x9b, 0x31, 0x00, 0xb2, 0xe4,
+ 0x05, 0xfe, 0x7b, 0x2f, 0x57, 0xa6, 0xf4, 0x15, 0x7a, 0x5e, 0x62, 0x9e,
+ 0xcc, 0x3b, 0xc5, 0x17, 0x93, 0xb4, 0x19, 0x74, 0x20, 0xbd, 0x88, 0xdc,
+ 0x46, 0xe0, 0x7b, 0x83, 0xe4, 0x35, 0x92, 0xb2, 0x0f, 0xdf, 0x7d, 0x43,
+ 0x34, 0x70, 0xba, 0xb7, 0x4f, 0x11, 0x26, 0x6b, 0x3d, 0xcc, 0xe8, 0x23,
+ 0x35, 0x3b, 0x12, 0x38, 0x42, 0x1c, 0x2a, 0xbe, 0x24, 0x13, 0x06, 0xc4,
+ 0x46, 0x11, 0x1a, 0xa4, 0x0c, 0xa2, 0xd9, 0xa7, 0x93, 0x5f, 0x81, 0x21,
+ 0x7a, 0x38, 0x90, 0x1d, 0x14, 0xc7, 0xcc, 0xc7, 0xec, 0xce, 0xfd, 0x8d,
+ 0x76, 0xd5, 0xdb, 0x6a, 0xf7, 0xf0, 0x0b, 0x6f, 0x93, 0xfe, 0x7c, 0x80,
+ 0x2c, 0x25, 0xa3, 0xa5, 0xce, 0x7e, 0xfe, 0x75, 0x12, 0x31, 0xbe, 0xf3,
+ 0x11, 0x67, 0x0b, 0xf9, 0xb9, 0x34, 0x1f, 0x88, 0xc3, 0xff, 0xcc, 0xe2,
+ 0x25, 0x25, 0x1e, 0xd9, 0xf2, 0x20, 0xf8, 0xb4, 0xb0, 0x2a, 0xc9, 0x90,
+ 0x93, 0xc0, 0x28, 0x29, 0xac, 0xbb, 0xf7, 0xd3, 0x72, 0x1e, 0xc8, 0xba,
+ 0x96, 0xe1, 0x4a, 0xfa, 0xfc, 0xbe, 0xc8, 0x37, 0x32, 0xe6, 0x98, 0xd9,
+ 0x88, 0x16, 0xdd, 0xbd, 0x0e, 0x56, 0xa7, 0x26, 0xf5, 0xcb, 0x49, 0x46,
+ 0xbc, 0xc9, 0x2f, 0x52, 0xa8, 0x9b, 0xa6, 0xc6, 0x9a, 0xd2, 0x28, 0x71,
+ 0x1a, 0x6f, 0x4c, 0xfd, 0x37, 0x67, 0xab, 0x7b, 0x6b, 0x0e, 0x1d, 0x7e,
+ 0x26, 0xbb, 0x6b, 0x03, 0xdf, 0xd3, 0x64, 0x98, 0x5c, 0x95, 0xab, 0x7e,
+ 0x2e, 0x09, 0xa5, 0x61, 0x1c, 0x83, 0xb3, 0x0e, 0xc4, 0x1b, 0x25, 0xd9,
+ 0x55, 0x2d, 0x5f, 0x3e, 0x93, 0x1f, 0x2c, 0xd1, 0x0d, 0x6f, 0x4b, 0x36,
+ 0x62, 0x47, 0xd1, 0x70, 0x00, 0x54, 0xae, 0x50, 0x7e, 0x8d, 0xad, 0x53,
+ 0xda, 0x71, 0x8e, 0xcd, 0xb6, 0xea, 0x5b, 0x16, 0xf8, 0xb3, 0x80, 0x4f,
+ 0xec, 0xdf, 0x22, 0x04, 0x19, 0xa5, 0x45, 0xf8, 0xc6, 0x25, 0x38, 0x4c,
+ 0x0a, 0x0c, 0x12, 0x21, 0x25, 0x13, 0x7d, 0x7e, 0xf7, 0x20, 0x83, 0x4e,
+ 0x15, 0x10, 0xb5, 0xdb, 0x3c, 0x63, 0x2e, 0xb0, 0x76, 0xba, 0x04, 0x62,
+ 0xd8, 0x78, 0x83, 0xb4, 0x12, 0xa6, 0x5d, 0xf8, 0x5e, 0xf3, 0xe9, 0x47,
+ 0x0a, 0xbe, 0x88, 0x84, 0xf2, 0xd7, 0xa7, 0xb9, 0x7b, 0x9c, 0x75, 0x1a,
+ 0x39, 0x02, 0xb2, 0x25, 0xe1, 0x14, 0x06, 0x4d, 0x42, 0x3a, 0xe7, 0x05,
+ 0xeb, 0x6c, 0xbd, 0x5e, 0x06, 0x33, 0xd7, 0x0f, 0xaf, 0x8f, 0xce, 0x92,
+ 0x2d, 0x68, 0xe0, 0x5d, 0x23, 0x57, 0xc5, 0xfb, 0x4e, 0xd6, 0x4c, 0x77,
+ 0x96, 0x1f, 0xf3, 0x1d, 0x63, 0x6c, 0xce, 0x26, 0xdb, 0xd6, 0x88, 0xa2,
+ 0xcf, 0x81, 0x0a, 0xad, 0x61, 0xaa, 0x96, 0x29, 0x99, 0xa6, 0x81, 0xeb,
+ 0xd1, 0x99, 0xaa, 0x5c, 0xe5, 0x62, 0x6d, 0x54, 0xde, 0x26, 0x26, 0x68,
+ 0x0a, 0xd1, 0x70, 0x86, 0x04, 0x05, 0x76, 0x32, 0xf6, 0x4b, 0x1b, 0x1b,
+ 0xbb, 0x7b, 0x57, 0x39, 0x03, 0x52, 0x1c, 0x39, 0xec, 0xc0, 0xd1, 0xb4,
+ 0x3d, 0x11, 0x17, 0x4e, 0xfb, 0x1d, 0x20, 0xe1, 0x12, 0x9b, 0xb2, 0x84,
+ 0x48, 0x9a, 0xc1, 0x0d, 0xd8, 0x1d, 0x8e, 0x34, 0xb9, 0x8d, 0xd1, 0xce,
+ 0x46, 0x62, 0x53, 0x4c, 0xcd, 0x2e, 0x73, 0x0e, 0xb5, 0xcd, 0xe9, 0x35,
+ 0x24, 0x76, 0xb1, 0xaa, 0xad, 0x1f, 0x33, 0xb5, 0xe7, 0x35, 0x8a, 0x31,
+ 0x54, 0xef, 0x38, 0xad, 0xce, 0x65, 0x74, 0x63, 0xba, 0x59, 0xbe, 0xb5,
+ 0x2e, 0x93, 0xa2, 0xa3, 0xda, 0xf8, 0x69, 0x23, 0xf1, 0x52, 0x14, 0x5b,
+ 0x99, 0x8a, 0xb9, 0x4b, 0x22, 0xf2, 0x84, 0x80, 0x91, 0xc8, 0xf6, 0x0e,
+ 0xcf, 0xb2, 0x79, 0xbe, 0xc8, 0xc9, 0xf6, 0xf2, 0xa7, 0x30, 0x8c, 0x05,
+ 0x09, 0xdd, 0x94, 0x7e, 0x0a, 0xa7, 0xa4, 0x69, 0xbf, 0x29, 0x7e, 0x6d,
+ 0xa6, 0x44, 0x1e, 0x31, 0xce, 0xca, 0x8c, 0x5b, 0xcd, 0xed, 0x09, 0xd9,
+ 0xc4, 0xe1, 0x35, 0xd1, 0x63, 0x7b, 0x97, 0xfa, 0x54, 0x79, 0xe7, 0x12,
+ 0xd1, 0x4b, 0xcf, 0x4c, 0x2d, 0x59, 0x7e, 0x9c, 0xd6, 0x7b, 0x7b, 0x5d,
+ 0x41, 0x57, 0x3b, 0x8a, 0x12, 0xfb, 0x3d, 0xb5, 0x84, 0xf9, 0xfe, 0xec,
+ 0x28, 0xd9, 0x42, 0xa1, 0xc8, 0xb3, 0x27, 0x7b, 0xfb, 0xdb, 0x7e, 0x76,
+ 0x89, 0x32, 0x80, 0x50, 0x6e, 0xde, 0x71, 0x58, 0xd6, 0xbb, 0x80, 0xf3,
+ 0x72, 0x9a, 0x8a, 0xc6, 0xe1, 0x86, 0x9e, 0x65, 0xd7, 0xf9, 0x14, 0x75,
+ 0x3a, 0x08, 0xca, 0x83, 0x07, 0x4f, 0x32, 0x33, 0xc9, 0x60, 0xc7, 0x5d,
+ 0x56, 0x2f, 0xcf, 0xde, 0x98, 0x48, 0x56, 0x53, 0x46, 0xee, 0xb4, 0xa1,
+ 0x81, 0x46, 0xf6, 0xce, 0x9f, 0xb5, 0x44, 0x09, 0xd2, 0x1e, 0x4f, 0x10,
+ 0xd6, 0xc5, 0x55, 0x34, 0xa4, 0x63, 0x0c, 0x5c, 0xe0, 0x67, 0x38, 0x94,
+ 0xcd, 0x12, 0xd6, 0x6b, 0xe3, 0xc7, 0xc8, 0x42, 0xe9, 0x1e, 0xa0, 0xcc,
+ 0x69, 0x03, 0x82, 0xa4, 0x20, 0xe1, 0x9e, 0xba, 0x41, 0xed, 0xee, 0xfb,
+ 0x9a, 0x50, 0x7b, 0xd4, 0xd0, 0x53, 0x4e, 0x84, 0x63, 0x34, 0x97, 0xf8,
+ 0x90, 0xff, 0x22, 0x27, 0x53, 0x9b, 0x7d, 0xca, 0xf1, 0xe0, 0xec, 0xc5,
+ 0x6b, 0x38, 0x61, 0x45, 0x41, 0xf9, 0x6d, 0xaa, 0x8f, 0x07, 0x72, 0xdc,
+ 0xbc, 0xbe, 0xa3, 0x42, 0x88, 0xa4, 0x90, 0xfa, 0x1b, 0xd9, 0xf3, 0x63,
+ 0x98, 0x27, 0x79, 0x7a, 0x3e, 0x8a, 0xa3, 0x87, 0x94, 0x62, 0x9b, 0xc6,
+ 0x11, 0xfa, 0x8a, 0x55, 0xf0, 0x9b, 0x23, 0x9a, 0x96, 0xb3, 0x8e, 0xc9,
+ 0x8e, 0x4d, 0xf0, 0x04, 0x1e, 0x71, 0x3f, 0x0e, 0x55, 0x12, 0xc7, 0x8b,
+ 0x7b, 0xb2, 0x41, 0xa9, 0xec, 0x5e, 0xff, 0x45, 0x3c, 0x30, 0xe6, 0x51,
+ 0x23, 0x16, 0xf8, 0xab, 0x38, 0xe0, 0x3d, 0x3e, 0xa7, 0x57, 0x81, 0xc4,
+ 0xae, 0xad, 0x32, 0xe4, 0x74, 0x35, 0x24, 0x8c, 0x27, 0xb4, 0x71, 0xa1,
+ 0x45, 0x83, 0xd4, 0x41, 0x4a, 0x09, 0xa0, 0x54, 0x84, 0x8e, 0x3a, 0x47,
+ 0x8e, 0x1d, 0x73, 0x5d, 0xb6, 0x8e, 0x39, 0x48, 0x99, 0x9c, 0xbe, 0xf9,
+ 0x51, 0xb9, 0x65, 0xcc, 0x80, 0x27, 0x47, 0xd4, 0x17, 0x36, 0x43, 0xcc,
+ 0x58, 0x14, 0xc8, 0x56, 0xcb, 0x25, 0xf3, 0x93, 0xdd, 0x44, 0x14, 0x0e,
+ 0xdf, 0x76, 0x09, 0x8d, 0xd8, 0xea, 0x8d, 0x17, 0xf4, 0xbb, 0x6e, 0xac,
+ 0xa9, 0x64, 0x4b, 0xe6, 0x8f, 0x3f, 0xf1, 0xaf, 0x99, 0xc7, 0x9a, 0x7f,
+ 0x35, 0x57, 0xab, 0xc5, 0xc4, 0x9c, 0x67, 0xd1, 0xfc, 0x71, 0x23, 0xe1,
+ 0x60, 0xeb, 0x85, 0xec, 0xe7, 0x1a, 0xb3, 0x33, 0xd7, 0x9a, 0x1d, 0xf5,
+ 0x2d, 0xb6, 0x76, 0x8d, 0x67, 0xa7, 0xf5, 0x03, 0x2e, 0x47, 0xcf, 0x1c,
+ 0x1e, 0xfb, 0xb2, 0x03, 0x55, 0xef, 0xbd, 0x21, 0xcf, 0x9f, 0xde, 0xfe,
+ 0xe9, 0xa7, 0xe7, 0x8f, 0x1e, 0xa7, 0xcf, 0xd2, 0xe9, 0xd3, 0x8b, 0xcf,
+ 0xd3, 0x27, 0xb3, 0x27, 0xcf, 0x9e, 0xef, 0x7f, 0xfe, 0x24, 0x7d, 0xf6,
+ 0xf8, 0x22, 0x7d, 0xba, 0x97, 0xed, 0x3d, 0xbf, 0xd8, 0x7f, 0x34, 0x9b,
+ 0x5d, 0x64, 0x9f, 0xcf, 0x9e, 0xa5, 0x1b, 0x23, 0x32, 0xbf, 0x74, 0xea,
+ 0x21, 0xab, 0xd5, 0xc0, 0x5b, 0x9a, 0x8c, 0xbf, 0x7d, 0x39, 0xdc, 0x4b,
+ 0xae, 0xb2, 0x5b, 0xbd, 0x60, 0xec, 0xd1, 0xb4, 0x99, 0x77, 0x99, 0xe4,
+ 0x56, 0xf7, 0x2f, 0x56, 0x8b, 0x05, 0x91, 0x39, 0x0d, 0x5f, 0x09, 0x69,
+ 0xc0, 0xbc, 0x8b, 0xba, 0xad, 0x9c, 0x5b, 0x67, 0xfd, 0x87, 0x07, 0xea,
+ 0xb3, 0xc7, 0xba, 0xba, 0x97, 0xff, 0xd8, 0xbc, 0x33, 0x7f, 0x9b, 0x4e,
+ 0x8d, 0x92, 0x64, 0xf6, 0x44, 0x1e, 0x1c, 0x1b, 0xd3, 0xd6, 0xb0, 0xe9,
+ 0x41, 0x22, 0x7f, 0x81, 0x97, 0xd8, 0x1b, 0xe3, 0x9b, 0xaa, 0x5c, 0x2d,
+ 0x4f, 0xcb, 0x79, 0x3e, 0xbd, 0x5b, 0x37, 0x9c, 0xff, 0x58, 0xeb, 0x17,
+ 0x87, 0xcc, 0xc2, 0xf3, 0x3a, 0xfb, 0x17, 0x9a, 0x56, 0x1e, 0x3b, 0x7e,
+ 0x80, 0x6d, 0x35, 0x9c, 0xe6, 0xcb, 0x2b, 0xc4, 0x79, 0x5f, 0x50, 0xa6,
+ 0x1f, 0x42, 0x33, 0xfc, 0x83, 0xb8, 0x4d, 0x25, 0x49, 0x41, 0x54, 0x3c,
+ 0x85, 0xf3, 0xd4, 0xb7, 0x45, 0xe3, 0xca, 0xb5, 0x0c, 0x4e, 0xdd, 0x54,
+ 0x92, 0x5d, 0x9a, 0x07, 0x7e, 0x3c, 0xf7, 0x21, 0xbe, 0xed, 0xaa, 0x6d,
+ 0xb3, 0xf3, 0x42, 0x7e, 0x35, 0x4a, 0xce, 0x28, 0x4e, 0xbe, 0x5a, 0xb2,
+ 0x79, 0x41, 0xfe, 0x7c, 0xfe, 0x5d, 0xf7, 0xa2, 0x61, 0xf2, 0x42, 0x31,
+ 0x5c, 0x8c, 0x67, 0x76, 0xf4, 0xfd, 0xd9, 0xf1, 0x41, 0x77, 0x9f, 0xa8,
+ 0xe0, 0xa8, 0x3e, 0xd8, 0xd9, 0xa1, 0x90, 0xcf, 0x55, 0x7a, 0x7b, 0x3b,
+ 0xaa, 0xb3, 0x9d, 0x59, 0x39, 0xad, 0x77, 0xea, 0x7a, 0xae, 0xbb, 0xd1,
+ 0xae, 0xff, 0xfb, 0x04, 0xde, 0xdc, 0x72, 0x41, 0x6c, 0x2b, 0x9b, 0x0d,
+ 0xeb, 0x3a, 0xc8, 0x0d, 0x1a, 0xbf, 0xd2, 0xcc, 0x83, 0x43, 0xc9, 0x4b,
+ 0x23, 0x39, 0x37, 0x34, 0xbb, 0x3b, 0x1e, 0x7f, 0x9b, 0xe8, 0xcb, 0xb4,
+ 0xbd, 0x36, 0x24, 0x6e, 0xf3, 0x72, 0x06, 0x11, 0x35, 0x2c, 0x15, 0x86,
+ 0xfd, 0x85, 0xef, 0xd0, 0x81, 0x3a, 0x5d, 0xf2, 0x1f, 0x52, 0xbf, 0x92,
+ 0x37, 0x6b, 0x93, 0xf9, 0x9e, 0x76, 0x1c, 0x20, 0x76, 0x11, 0xf1, 0xf8,
+ 0xbf, 0x3a, 0xc1, 0xd2, 0xc4, 0x3d, 0xe9, 0x3c, 0x42, 0xdd, 0x02, 0x75,
+ 0x43, 0xbd, 0x97, 0x65, 0x65, 0x84, 0xc7, 0xa2, 0x8e, 0x79, 0x41, 0xf5,
+ 0x96, 0xd7, 0xac, 0xf6, 0xd5, 0x9c, 0x8f, 0x68, 0x86, 0x29, 0xbc, 0xc1,
+ 0xcd, 0x31, 0x52, 0x1e, 0xe3, 0xc8, 0x3f, 0xac, 0x68, 0x7c, 0x4b, 0x0f,
+ 0xaf, 0xcf, 0x8b, 0xb6, 0x2a, 0x5c, 0xf0, 0x83, 0xc4, 0xb1, 0x99, 0xac,
+ 0x14, 0x97, 0x05, 0x16, 0x02, 0xe5, 0xff, 0x93, 0x98, 0x80, 0x0e, 0x51,
+ 0x55, 0xa5, 0xa7, 0xd4, 0x0e, 0xbf, 0x23, 0xe3, 0xd2, 0x48, 0xc7, 0xfc,
+ 0x52, 0xc3, 0xeb, 0xd1, 0x3c, 0x3b, 0x56, 0x2b, 0x1b, 0xca, 0x5f, 0x96,
+ 0x92, 0x70, 0x08, 0x05, 0xa4, 0xb0, 0x51, 0x6a, 0x89, 0x64, 0x68, 0x72,
+ 0x3a, 0x50, 0xab, 0x12, 0x3e, 0xb8, 0x09, 0xa8, 0xfb, 0x71, 0x8f, 0x23,
+ 0x8d, 0x4a, 0xef, 0x25, 0x0d, 0x2f, 0xee, 0x0b, 0x2f, 0xb1, 0x0d, 0x5a,
+ 0x19, 0xb9, 0x19, 0xcc, 0x33, 0x5d, 0x6b, 0x8f, 0xf2, 0x6e, 0xad, 0xce,
+ 0x17, 0x2b, 0x73, 0xed, 0xae, 0x47, 0xd3, 0xef, 0x75, 0x6f, 0x73, 0x2a,
+ 0xac, 0x4e, 0x29, 0xb7, 0x3f, 0x26, 0xda, 0x4b, 0x2f, 0x48, 0x8b, 0x01,
+ 0x43, 0x99, 0xd7, 0xd8, 0xd4, 0x49, 0xad, 0x56, 0x22, 0x85, 0xc0, 0x70,
+ 0x20, 0x23, 0xf6, 0x90, 0x75, 0x8e, 0x72, 0xfa, 0x79, 0xe9, 0x14, 0x2c,
+ 0x43, 0x78, 0x86, 0x17, 0x52, 0x45, 0xe2, 0x28, 0xe0, 0xdb, 0x5c, 0x97,
+ 0xc4, 0x49, 0x84, 0x5c, 0x5f, 0xc7, 0xd9, 0x5e, 0xfc, 0x33, 0x12, 0x5f,
+ 0x13, 0x8d, 0x91, 0x3b, 0x7e, 0x86, 0xf3, 0x8b, 0xb9, 0x86, 0x24, 0x33,
+ 0x9f, 0x8b, 0x1d, 0x73, 0x2a, 0xe3, 0x95, 0xc2, 0x4f, 0x2e, 0x34, 0x50,
+ 0xcf, 0x76, 0x5d, 0x4a, 0xda, 0x26, 0x26, 0x8a, 0x79, 0xf2, 0x1c, 0xbb,
+ 0xa4, 0x6e, 0x8b, 0x3a, 0x5b, 0xc6, 0x48, 0x5a, 0xbb, 0x7c, 0xfd, 0x3a,
+ 0x8c, 0x56, 0xba, 0xcd, 0x8c, 0x59, 0xaf, 0x41, 0xed, 0x03, 0x4d, 0xa4,
+ 0xca, 0xf4, 0x0b, 0x45, 0xd9, 0x9d, 0x94, 0xce, 0x23, 0x96, 0x93, 0xaa,
+ 0xf9, 0xfd, 0xde, 0x04, 0x34, 0xcf, 0xdf, 0x9e, 0x72, 0x5c, 0xd8, 0x65,
+ 0xee, 0x01, 0xf2, 0xe0, 0x94, 0x36, 0xdf, 0xc3, 0x3f, 0xc8, 0xf6, 0x73,
+ 0x42, 0x2d, 0x5d, 0x9d, 0xaf, 0x98, 0xce, 0x4b, 0xad, 0x8f, 0x30, 0xef,
+ 0x73, 0x89, 0xed, 0x28, 0xf9, 0x21, 0x52, 0x78, 0xcb, 0x23, 0x5e, 0x38,
+ 0x0d, 0x22, 0xab, 0x43, 0x3d, 0x7e, 0x99, 0x79, 0x55, 0xc1, 0x50, 0x29,
+ 0xac, 0xc9, 0x78, 0x90, 0xfc, 0xf4, 0xd3, 0x20, 0x81, 0x25, 0xfc, 0x53,
+ 0x63, 0xfe, 0xdf, 0x90, 0xd8, 0x4f, 0x5c, 0x8b, 0xf4, 0xd3, 0x35, 0x6c,
+ 0x3b, 0xf8, 0x8d, 0x83, 0x24, 0xec, 0x39, 0x82, 0x44, 0xac, 0x4d, 0xb7,
+ 0x9d, 0x6f, 0x5c, 0xfa, 0xcc, 0x19, 0x58, 0x14, 0x05, 0xf1, 0x92, 0x8a,
+ 0x91, 0x60, 0x69, 0x8e, 0x61, 0xb5, 0x28, 0x42, 0x41, 0xc9, 0x79, 0xc0,
+ 0x44, 0x82, 0x74, 0xbb, 0x89, 0xdb, 0x6f, 0xfe, 0x6e, 0xd3, 0x91, 0xcb,
+ 0x40, 0x7d, 0xf8, 0x8d, 0x72, 0x53, 0x7a, 0x10, 0xb7, 0x3c, 0x8c, 0x9f,
+ 0x69, 0x9d, 0x30, 0x19, 0x95, 0x1c, 0x13, 0x35, 0x1c, 0xf3, 0x04, 0x0e,
+ 0x74, 0xae, 0xf6, 0x2a, 0x9d, 0x7d, 0x88, 0xa2, 0xb7, 0xe5, 0xd5, 0x5d,
+ 0x8d, 0xf4, 0x8c, 0x35, 0xb7, 0xd3, 0xbb, 0x20, 0xa3, 0x5e, 0xfe, 0xd6,
+ 0x68, 0xb6, 0x0f, 0x59, 0x56, 0x20, 0x80, 0x16, 0x77, 0x34, 0xd3, 0xd9,
+ 0x1c, 0x6e, 0xda, 0x70, 0x97, 0xa4, 0xc4, 0x04, 0x29, 0xf3, 0x36, 0x07,
+ 0xdb, 0xe5, 0x17, 0x06, 0x9f, 0xf4, 0xf2, 0xde, 0x4a, 0x3f, 0xa3, 0xd1,
+ 0xd5, 0xb0, 0xa3, 0x08, 0x55, 0x03, 0xf5, 0xf2, 0x7d, 0x61, 0x31, 0x11,
+ 0x9f, 0x12, 0x65, 0x3e, 0x92, 0x75, 0xa1, 0x03, 0x90, 0xc3, 0xc3, 0x45,
+ 0x80, 0x86, 0x43, 0x82, 0x13, 0x59, 0x32, 0x04, 0x08, 0xc8, 0x83, 0x92,
+ 0x0b, 0xee, 0x50, 0xf0, 0xb5, 0x9c, 0x07, 0x2c, 0x55, 0xb2, 0xfd, 0xb4,
+ 0xa6, 0x1a, 0x77, 0x18, 0xb8, 0x13, 0x37, 0x85, 0xe0, 0x06, 0x8c, 0x4b,
+ 0x72, 0xbc, 0x4c, 0x29, 0x4d, 0x41, 0x32, 0x62, 0xa4, 0x74, 0x2c, 0x62,
+ 0xe8, 0x41, 0xcc, 0x05, 0x6a, 0x0e, 0xe6, 0xf3, 0x65, 0xb2, 0xd1, 0xaf,
+ 0xec, 0x6c, 0x74, 0xdf, 0xa0, 0x24, 0x47, 0xe7, 0xc5, 0x94, 0xb2, 0x78,
+ 0x9a, 0xc8, 0x96, 0x24, 0xcb, 0x0d, 0xff, 0xca, 0x39, 0x6b, 0x5c, 0xb9,
+ 0x25, 0x22, 0x74, 0x9b, 0x73, 0x80, 0xeb, 0x48, 0xf0, 0xde, 0x25, 0x52,
+ 0x79, 0xf4, 0xe1, 0x52, 0x91, 0x72, 0xf2, 0x50, 0x93, 0x80, 0x62, 0x81,
+ 0xe6, 0x3d, 0x1d, 0x44, 0xdb, 0xf5, 0x6d, 0x14, 0x96, 0xe0, 0x7b, 0xe2,
+ 0x75, 0x56, 0xe9, 0x60, 0xef, 0xf7, 0x72, 0x4e, 0x70, 0x1c, 0x5a, 0xd2,
+ 0x42, 0x5a, 0x4f, 0xb0, 0x3b, 0x7b, 0xdb, 0xb6, 0x08, 0x92, 0x30, 0x35,
+ 0x38, 0xf9, 0x5a, 0x54, 0x81, 0x8d, 0xab, 0x92, 0xd3, 0x85, 0x36, 0x0e,
+ 0x50, 0x9f, 0x27, 0x57, 0x93, 0xd6, 0xa8, 0x68, 0x07, 0x9d, 0xe1, 0x28,
+ 0x19, 0xeb, 0xdb, 0x93, 0xb7, 0x87, 0xed, 0x24, 0x5b, 0xfa, 0x49, 0xcc,
+ 0xbf, 0x6a, 0x58, 0xd5, 0x1b, 0xc3, 0x5f, 0x98, 0x06, 0xd2, 0x40, 0x61,
+ 0x63, 0xda, 0x32, 0xd3, 0xba, 0xcc, 0x9a, 0xe5, 0xcd, 0x2a, 0x9f, 0x6d,
+ 0x6d, 0x83, 0x46, 0x50, 0x55, 0x32, 0xa4, 0x52, 0x26, 0xb6, 0xfe, 0xea,
+ 0x64, 0x8b, 0x75, 0xf0, 0x2a, 0x6b, 0x56, 0x55, 0xc1, 0x3e, 0x71, 0xcc,
+ 0xbd, 0x6b, 0x47, 0x19, 0x01, 0xcc, 0xd2, 0xcc, 0xb7, 0xff, 0x05, 0x1a,
+ 0x87, 0xb3, 0x94, 0x78, 0xc0, 0x6d, 0x30, 0x01, 0x4d, 0x89, 0xa0, 0x83,
+ 0xa7, 0xb5, 0x04, 0x22, 0xca, 0xdf, 0x89, 0xe4, 0xe5, 0xe9, 0xe9, 0xeb,
+ 0x97, 0xe7, 0x2f, 0xed, 0xda, 0x48, 0x06, 0x13, 0x67, 0x21, 0x25, 0xd8,
+ 0xb0, 0x24, 0x28, 0x46, 0x78, 0x72, 0xf3, 0xf7, 0xef, 0xc7, 0x87, 0x67,
+ 0xdd, 0x83, 0x3d, 0x3d, 0x3b, 0x01, 0xee, 0xd0, 0xef, 0x7f, 0x7a, 0xb9,
+ 0x5c, 0xce, 0x35, 0xee, 0xf7, 0x3a, 0x6d, 0xd2, 0xcd, 0xe0, 0x56, 0xef,
+ 0x6f, 0x63, 0x7e, 0x37, 0x76, 0x7e, 0x17, 0x22, 0xc7, 0xc8, 0x9a, 0x4f,
+ 0x3e, 0xe0, 0x40, 0xab, 0xa9, 0x66, 0xd8, 0xda, 0xdd, 0xa0, 0x0d, 0xa0,
+ 0x04, 0xd9, 0xfe, 0x85, 0x30, 0xd4, 0x41, 0x2b, 0x57, 0x4c, 0x37, 0x6b,
+ 0x6e, 0xec, 0xe8, 0x6c, 0xba, 0x6a, 0x94, 0xe4, 0x89, 0xbe, 0x50, 0xac,
+ 0xdd, 0xdd, 0x97, 0xe0, 0x78, 0x5c, 0xa4, 0x84, 0xb9, 0x00, 0x61, 0x05,
+ 0x18, 0x42, 0xa3, 0x2c, 0xe8, 0x91, 0xcc, 0x96, 0xb9, 0x58, 0x84, 0xa6,
+ 0x66, 0x19, 0x47, 0x4e, 0x08, 0x3b, 0x80, 0xa7, 0x14, 0x6c, 0xc8, 0xef,
+ 0xcc, 0x6d, 0x1c, 0x26, 0x87, 0x52, 0xd4, 0x46, 0x0b, 0x37, 0x3f, 0x08,
+ 0x1e, 0x6a, 0xac, 0x85, 0x20, 0xcc, 0x3e, 0xce, 0x2b, 0x3c, 0x3c, 0x8d,
+ 0x8d, 0xae, 0x0c, 0xe2, 0x0a, 0x56, 0xf3, 0x10, 0xa6, 0x8d, 0x4d, 0x27,
+ 0x03, 0x69, 0x23, 0x92, 0xd7, 0x34, 0x4c, 0x2f, 0x41, 0x5e, 0xe6, 0x51,
+ 0xa3, 0x40, 0x1b, 0xbb, 0x08, 0xff, 0xda, 0xd9, 0x1b, 0xed, 0x6e, 0x84,
+ 0x93, 0xc7, 0x65, 0x21, 0x2c, 0x14, 0x1b, 0x38, 0x03, 0x37, 0x6c, 0xca,
+ 0xf2, 0xde, 0xf9, 0x31, 0x0b, 0x33, 0x2a, 0xe8, 0xd2, 0x8c, 0x1f, 0x9d,
+ 0xca, 0xf0, 0x24, 0x48, 0xf4, 0x40, 0x72, 0x6e, 0xa5, 0x4c, 0xd1, 0xf0,
+ 0xc4, 0xa2, 0xbc, 0xc1, 0x4a, 0x0c, 0xa9, 0xcd, 0xe7, 0x2d, 0xd0, 0x9a,
+ 0x8d, 0xf8, 0x36, 0x17, 0x84, 0x0f, 0x95, 0x75, 0x77, 0x3b, 0x1a, 0x9c,
+ 0x56, 0xfd, 0xd2, 0x57, 0xe2, 0x6c, 0x56, 0x2b, 0x19, 0x8a, 0x96, 0x12,
+ 0x7c, 0xcc, 0x00, 0xc3, 0xe5, 0x02, 0xbe, 0x37, 0xf7, 0x93, 0x2f, 0x86,
+ 0x9a, 0x01, 0x32, 0xc4, 0x20, 0x50, 0x3c, 0x5f, 0x70, 0x49, 0x7a, 0x60,
+ 0xae, 0xbf, 0x4d, 0x6f, 0xf3, 0xc5, 0x6a, 0x41, 0x1f, 0x03, 0x6d, 0xcb,
+ 0x63, 0x12, 0x32, 0x20, 0xc7, 0x21, 0x67, 0xa0, 0x10, 0x91, 0x6f, 0xd6,
+ 0x89, 0x67, 0xb4, 0xc7, 0x84, 0x8c, 0x11, 0xc9, 0x23, 0xb7, 0xbc, 0x82,
+ 0x52, 0x35, 0x11, 0x53, 0xa8, 0x3b, 0x06, 0xbf, 0xd1, 0x16, 0x52, 0xa4,
+ 0x15, 0xd4, 0xa5, 0xcd, 0xc9, 0x89, 0xb0, 0x73, 0xc6, 0x44, 0x10, 0xf5,
+ 0xcd, 0x4b, 0x49, 0xcd, 0xaa, 0xbc, 0x9c, 0xd9, 0x7b, 0x03, 0xfd, 0x30,
+ 0x2f, 0x56, 0x66, 0x9f, 0xd9, 0x5d, 0xcc, 0x71, 0x86, 0x88, 0x52, 0x93,
+ 0xdd, 0x52, 0xe2, 0xfc, 0x98, 0xea, 0x21, 0x34, 0xcb, 0xf4, 0xd9, 0xe8,
+ 0xd1, 0xfe, 0x68, 0x77, 0xd0, 0xb2, 0xd9, 0x05, 0x3a, 0xc2, 0xdc, 0xae,
+ 0x69, 0xbe, 0xb0, 0x65, 0xa5, 0xa3, 0x7f, 0x99, 0x6f, 0x86, 0x92, 0xbe,
+ 0x17, 0xe9, 0x2d, 0x1d, 0x5f, 0xf4, 0x58, 0xcb, 0xe4, 0xc5, 0xb7, 0x27,
+ 0xe3, 0xf3, 0xbd, 0x83, 0xd3, 0x93, 0x33, 0xf3, 0x5f, 0xfc, 0x7d, 0x9f,
+ 0xfe, 0xbe, 0x1f, 0x18, 0x8e, 0x6f, 0x24, 0x49, 0x56, 0xeb, 0x71, 0x48,
+ 0x43, 0x21, 0x8d, 0x86, 0x77, 0x33, 0xf1, 0x06, 0x82, 0xef, 0x94, 0xd8,
+ 0xe0, 0xd4, 0x16, 0x2e, 0x76, 0x8f, 0xd8, 0xfb, 0x94, 0xe6, 0xd1, 0x8d,
+ 0x92, 0x30, 0x57, 0x2f, 0x6f, 0x54, 0x9b, 0x92, 0x92, 0x77, 0x2d, 0xa6,
+ 0xef, 0xba, 0xb3, 0xb9, 0x5c, 0x59, 0x4a, 0x70, 0x14, 0x96, 0x8e, 0xd2,
+ 0xbf, 0xda, 0xbf, 0x9a, 0xce, 0x8d, 0x92, 0x9f, 0x21, 0x5d, 0x64, 0x96,
+ 0x71, 0x0c, 0x05, 0x3f, 0x89, 0xd9, 0x1e, 0xe6, 0xfa, 0x49, 0x55, 0x42,
+ 0x90, 0x43, 0x48, 0x14, 0xa9, 0x81, 0x1b, 0x33, 0x1b, 0x33, 0xc7, 0xdc,
+ 0x68, 0xe1, 0xbc, 0x1d, 0x45, 0x16, 0x14, 0x01, 0x30, 0x5c, 0x9c, 0xef,
+ 0xa7, 0xa2, 0x5a, 0x7c, 0xaa, 0xaa, 0x7f, 0x77, 0x72, 0x9e, 0xa4, 0x17,
+ 0x17, 0x0a, 0x01, 0x80, 0xca, 0x03, 0x68, 0xac, 0x3b, 0x4b, 0x96, 0x64,
+ 0x69, 0x13, 0xcb, 0xce, 0x10, 0x7d, 0xe4, 0xfc, 0x78, 0xbc, 0x03, 0x2f,
+ 0x15, 0xe7, 0xb9, 0x8d, 0xdf, 0x1d, 0x0d, 0x5a, 0xee, 0x68, 0x3f, 0xbb,
+ 0x65, 0x1b, 0x92, 0x32, 0xae, 0x50, 0xa4, 0x9e, 0x2c, 0x74, 0xc0, 0x32,
+ 0xc8, 0x9b, 0xa3, 0x23, 0xdd, 0x90, 0x82, 0xaf, 0x0d, 0x3a, 0xda, 0x8d,
+ 0x44, 0x03, 0xa3, 0x64, 0xfa, 0x2e, 0x96, 0xcd, 0x5d, 0x58, 0x16, 0x4a,
+ 0xee, 0x0b, 0xc0, 0xad, 0x40, 0xe9, 0xd8, 0x80, 0x49, 0x82, 0x65, 0xd1,
+ 0x92, 0x36, 0x46, 0x3c, 0xec, 0xfe, 0x06, 0x8d, 0x4a, 0x83, 0x9a, 0xbf,
+ 0x63, 0x4c, 0x22, 0xda, 0x49, 0x16, 0xcb, 0xe0, 0xe7, 0x0f, 0x79, 0x83,
+ 0x27, 0x76, 0x78, 0x33, 0x31, 0x5b, 0x8a, 0xa6, 0xd4, 0x01, 0x06, 0x53,
+ 0x56, 0xf9, 0x25, 0x52, 0x01, 0xba, 0xd5, 0x61, 0x6e, 0x22, 0x81, 0xf3,
+ 0x09, 0xca, 0x58, 0xdd, 0x6c, 0x78, 0xde, 0x82, 0x26, 0xc8, 0xc1, 0xa7,
+ 0xcc, 0xd0, 0x4a, 0xed, 0x19, 0x9d, 0x0e, 0xf8, 0x4f, 0x13, 0xd1, 0xe3,
+ 0x59, 0xd9, 0x33, 0xab, 0x83, 0xdc, 0x71, 0x71, 0x1e, 0xad, 0xee, 0xd1,
+ 0xbb, 0x44, 0x80, 0x37, 0x47, 0x8d, 0x32, 0x70, 0x8e, 0x0c, 0x75, 0x87,
+ 0x63, 0x60, 0x36, 0xc3, 0x11, 0xb4, 0xb0, 0x63, 0x63, 0x6f, 0xff, 0xd9,
+ 0x68, 0xd7, 0xfc, 0x9f, 0x39, 0x14, 0xd1, 0x8f, 0x08, 0x15, 0xca, 0xa1,
+ 0xff, 0xd8, 0x27, 0xb3, 0xdb, 0x2e, 0x49, 0xb2, 0x00, 0x2a, 0xab, 0xcb,
+ 0x8d, 0xb5, 0xa5, 0xaa, 0x2d, 0x91, 0x82, 0x83, 0xb4, 0xe2, 0x24, 0x9d,
+ 0xc9, 0x4f, 0xf4, 0x8e, 0x57, 0xab, 0x79, 0x24, 0x73, 0xcf, 0xf3, 0x14,
+ 0x43, 0x3b, 0x9b, 0x5f, 0x8b, 0x9f, 0xf8, 0x5b, 0xf0, 0x26, 0x2e, 0xd5,
+ 0x1b, 0xb5, 0xf2, 0x9e, 0x9e, 0xb7, 0xdc, 0x7e, 0xaf, 0xc4, 0x64, 0x23,
+ 0xce, 0x3c, 0x34, 0x97, 0xe1, 0x45, 0x79, 0x71, 0x51, 0x67, 0x4d, 0x57,
+ 0x00, 0xbd, 0x92, 0x47, 0x76, 0xce, 0x08, 0xc7, 0x90, 0x38, 0x95, 0x16,
+ 0xd5, 0x24, 0x6d, 0xf4, 0x9d, 0x44, 0x12, 0xcd, 0x98, 0x6d, 0xf1, 0x70,
+ 0xa3, 0x48, 0x1d, 0x81, 0xff, 0x7b, 0x4d, 0x02, 0xe1, 0xe2, 0x77, 0xc5,
+ 0x74, 0x21, 0x6b, 0x99, 0xe1, 0x5a, 0x44, 0xd2, 0x75, 0xc1, 0xd7, 0xf4,
+ 0x4a, 0x7c, 0xcc, 0x97, 0x4b, 0x98, 0x37, 0x0c, 0x64, 0x46, 0x64, 0x6b,
+ 0x63, 0x64, 0x14, 0xaa, 0x25, 0x52, 0xd6, 0x84, 0x40, 0xa3, 0x24, 0x4f,
+ 0x45, 0xe6, 0x4f, 0xb2, 0x8b, 0x30, 0xce, 0xc3, 0x79, 0x8b, 0x3e, 0x7a,
+ 0x8d, 0x94, 0xe2, 0xce, 0x80, 0x54, 0x53, 0xa4, 0xca, 0x62, 0x2e, 0x3c,
+ 0x5c, 0x07, 0xa9, 0xef, 0x1b, 0x44, 0xee, 0xbf, 0xab, 0xbf, 0xb2, 0xae,
+ 0xb6, 0xf1, 0xd1, 0xff, 0x75, 0xe8, 0xb0, 0x86, 0x2c, 0x98, 0x0f, 0x57,
+ 0xb4, 0xc4, 0xea, 0x83, 0xcc, 0x2d, 0x1c, 0xbe, 0x32, 0xe7, 0xb5, 0x41,
+ 0x53, 0x71, 0xd9, 0x24, 0x65, 0xa7, 0xe2, 0x82, 0xec, 0x1e, 0x68, 0x12,
+ 0xa4, 0x0d, 0xed, 0xa0, 0xbc, 0x3f, 0x10, 0x0d, 0x0c, 0x45, 0xc9, 0x2e,
+ 0x44, 0x59, 0x23, 0xdd, 0x8e, 0x46, 0x0a, 0xe3, 0xfc, 0xb2, 0x12, 0x51,
+ 0x16, 0x77, 0xf2, 0x02, 0x2a, 0x23, 0x2b, 0x30, 0x41, 0xd5, 0x85, 0x96,
+ 0xba, 0x32, 0xa8, 0xc9, 0xaa, 0xf9, 0x17, 0x86, 0x47, 0x2a, 0xd0, 0x2f,
+ 0xa1, 0xd5, 0x79, 0x44, 0x3d, 0x65, 0xa2, 0x06, 0x24, 0xe7, 0xf0, 0x2f,
+ 0xc6, 0xca, 0x7e, 0xa1, 0x6e, 0x8a, 0xbe, 0xfa, 0x7f, 0x75, 0x6a, 0xa0,
+ 0x4e, 0x82, 0x8c, 0x30, 0xa2, 0x0d, 0x0b, 0x43, 0xa3, 0x5b, 0xcd, 0xfe,
+ 0x94, 0x94, 0x74, 0x19, 0xc2, 0xfb, 0xec, 0xde, 0xf9, 0x0b, 0xc2, 0xb6,
+ 0xf1, 0xaa, 0xbc, 0x6d, 0x79, 0xe4, 0x08, 0x81, 0xa8, 0x39, 0x8f, 0x50,
+ 0x73, 0xee, 0xa4, 0x8c, 0xa1, 0x46, 0x43, 0x1e, 0xc8, 0xdc, 0xbc, 0x18,
+ 0x72, 0xfd, 0xb4, 0x3e, 0x4b, 0xf1, 0x32, 0x80, 0xb3, 0x09, 0x39, 0xf2,
+ 0x11, 0xb1, 0x19, 0xde, 0x48, 0xee, 0x04, 0xa9, 0xb5, 0xf4, 0xd9, 0x98,
+ 0xa7, 0x9c, 0xdd, 0x8d, 0xe4, 0x23, 0xe4, 0x8f, 0xc3, 0x3d, 0xf6, 0xd1,
+ 0xe8, 0xce, 0xc5, 0x00, 0x3f, 0xa5, 0x5a, 0x53, 0x7b, 0xc9, 0xd8, 0xb7,
+ 0xd1, 0x64, 0x1c, 0x97, 0xc8, 0x22, 0xba, 0xac, 0xf7, 0xac, 0x3c, 0xea,
+ 0xb9, 0x51, 0xde, 0x65, 0x8d, 0x64, 0x87, 0xf0, 0xe4, 0xb5, 0xfc, 0x8a,
+ 0x4a, 0xb8, 0x8e, 0x2e, 0x3a, 0xc3, 0x11, 0x2a, 0x5c, 0xd6, 0xb4, 0x8b,
+ 0xf2, 0x25, 0x4c, 0xcb, 0x50, 0x58, 0x70, 0x77, 0x0e, 0xcc, 0x35, 0xd8,
+ 0x50, 0xd7, 0x2b, 0xaf, 0x20, 0x9e, 0x9d, 0xa0, 0xd3, 0x81, 0x9b, 0xa8,
+ 0x99, 0xc5, 0x68, 0x92, 0x75, 0x5f, 0xbd, 0x90, 0x82, 0x10, 0xe8, 0x67,
+ 0x3c, 0x00, 0xeb, 0x8c, 0x02, 0xf4, 0xee, 0x6b, 0x9a, 0x9b, 0x12, 0x29,
+ 0x1c, 0xf4, 0x0a, 0x47, 0x91, 0x25, 0x53, 0xcd, 0xd4, 0x33, 0xa2, 0x13,
+ 0x35, 0x5c, 0x58, 0xec, 0xa2, 0x9b, 0x94, 0x28, 0xcd, 0x8e, 0x1f, 0x2b,
+ 0x6f, 0xf0, 0x52, 0x1c, 0x87, 0x13, 0x47, 0xce, 0x0e, 0x25, 0x27, 0xea,
+ 0x92, 0x95, 0x87, 0x40, 0xf3, 0x46, 0xb0, 0x6c, 0x36, 0x5e, 0xfd, 0x28,
+ 0x01, 0xcf, 0xd8, 0x4d, 0xe1, 0x2d, 0xbc, 0xb9, 0x2a, 0xe7, 0x59, 0x2c,
+ 0x0a, 0xe2, 0x55, 0xf5, 0x12, 0x86, 0x0b, 0x32, 0x77, 0xc9, 0xa1, 0x7c,
+ 0x4d, 0x49, 0xc1, 0xad, 0xe8, 0x88, 0xd1, 0xef, 0xb2, 0x14, 0x35, 0x45,
+ 0x36, 0x2f, 0xfe, 0x7a, 0x10, 0x64, 0xaa, 0x9b, 0x7b, 0x3e, 0x29, 0x6b,
+ 0x4b, 0x2f, 0xa8, 0x9d, 0x85, 0x04, 0xb9, 0x49, 0x2b, 0x62, 0xcc, 0x02,
+ 0x86, 0xa5, 0x38, 0xa1, 0x7e, 0x5a, 0x20, 0x54, 0xc1, 0x6e, 0x49, 0x43,
+ 0x8e, 0x7a, 0x73, 0x43, 0x26, 0x46, 0x01, 0x80, 0xcb, 0x96, 0x68, 0x07,
+ 0x43, 0x0a, 0xcc, 0xd5, 0x15, 0x21, 0xde, 0x4a, 0x51, 0xba, 0xb9, 0x87,
+ 0x57, 0x90, 0xe9, 0x79, 0xb3, 0x4a, 0x9b, 0x87, 0xe5, 0x64, 0xf7, 0xf1,
+ 0x26, 0x66, 0x4e, 0x7e, 0xca, 0x69, 0x1f, 0x34, 0x43, 0x4f, 0xa0, 0xd0,
+ 0x3f, 0xc8, 0x17, 0xb8, 0x6b, 0xff, 0xe7, 0x1e, 0xc6, 0x74, 0x4a, 0xc0,
+ 0x7d, 0x57, 0x6d, 0xe4, 0x27, 0x2a, 0xbb, 0x15, 0x79, 0xa2, 0xc5, 0x6d,
+ 0x3c, 0xa6, 0x8a, 0xfb, 0xa3, 0x48, 0x2c, 0x9f, 0x02, 0x60, 0x66, 0x3a,
+ 0xf3, 0x3b, 0x37, 0xa0, 0x57, 0x15, 0xab, 0x49, 0xdc, 0x1e, 0x2a, 0x9e,
+ 0xfd, 0x42, 0x90, 0x98, 0xb4, 0x31, 0x36, 0x2a, 0x38, 0x7f, 0xf3, 0x60,
+ 0x43, 0x41, 0x46, 0x2d, 0x6a, 0x92, 0x70, 0x11, 0xa9, 0xcb, 0xd2, 0x12,
+ 0x0f, 0xf1, 0x17, 0xd3, 0xf5, 0xef, 0x0e, 0x07, 0xc4, 0xed, 0xbd, 0x2f,
+ 0xbf, 0x7f, 0x79, 0xfc, 0xfe, 0x70, 0xef, 0x8b, 0x04, 0xff, 0xda, 0xe7,
+ 0x7f, 0xed, 0x6f, 0xc4, 0x8e, 0xcb, 0x30, 0xaa, 0xcd, 0x2f, 0x37, 0x93,
+ 0xfa, 0x6e, 0x31, 0x29, 0xe7, 0xf6, 0xc0, 0x64, 0x2b, 0x34, 0x56, 0x36,
+ 0x10, 0x29, 0x6e, 0xab, 0xb3, 0xc5, 0x4f, 0xde, 0x65, 0xd9, 0xb5, 0xe4,
+ 0x15, 0x2a, 0xbb, 0xa1, 0x20, 0x9d, 0x5f, 0x2e, 0xdc, 0x50, 0x31, 0xb5,
+ 0xf2, 0x30, 0x09, 0xd7, 0xf5, 0xe5, 0x7a, 0x92, 0x50, 0xd2, 0x8b, 0x5d,
+ 0x47, 0x38, 0x07, 0x8b, 0x17, 0x87, 0xdc, 0xec, 0x33, 0x8c, 0x30, 0xa1,
+ 0xcc, 0x70, 0x27, 0xba, 0x52, 0x16, 0x5e, 0x9a, 0x5f, 0x17, 0x03, 0x01,
+ 0x80, 0x1b, 0x77, 0x02, 0x31, 0xb0, 0x59, 0x65, 0x96, 0xf5, 0xd2, 0xaa,
+ 0xf1, 0x6e, 0x77, 0xb8, 0x89, 0xe8, 0x2e, 0x1e, 0x02, 0xd7, 0x31, 0x40,
+ 0xbf, 0x86, 0x9a, 0x81, 0xe1, 0x5c, 0x1d, 0x30, 0x46, 0x67, 0xd0, 0xac,
+ 0xd5, 0x9f, 0x91, 0x78, 0x18, 0xcf, 0x16, 0x2d, 0x52, 0xe0, 0x16, 0x93,
+ 0x56, 0xd4, 0x8f, 0x7d, 0xcd, 0x21, 0xc2, 0x0a, 0xe3, 0xbd, 0x98, 0xcd,
+ 0xa1, 0x8c, 0x92, 0x45, 0x90, 0x80, 0x55, 0x18, 0x4d, 0x72, 0xcb, 0xb0,
+ 0xf7, 0x6d, 0x1f, 0xf6, 0x43, 0x8f, 0x4f, 0xdc, 0x12, 0x8d, 0x0d, 0x9a,
+ 0xf6, 0xc4, 0x0a, 0xce, 0xaf, 0x5a, 0x82, 0x46, 0x55, 0x3e, 0xad, 0x61,
+ 0xe6, 0x10, 0xac, 0x48, 0x0e, 0x1e, 0x86, 0xc9, 0x14, 0x09, 0x9a, 0xf3,
+ 0x34, 0x00, 0x9c, 0xa1, 0xbb, 0xa6, 0x88, 0x17, 0x88, 0xe5, 0x5b, 0xc2,
+ 0x37, 0xdf, 0xbf, 0x9b, 0x67, 0xdb, 0x6a, 0x18, 0xa8, 0xb0, 0xdb, 0x79,
+ 0x5b, 0xfe, 0xcd, 0xcc, 0x3b, 0x95, 0x8f, 0xc4, 0x64, 0xa6, 0x88, 0xc0,
+ 0xde, 0x99, 0x3b, 0xfe, 0xc2, 0x95, 0xe0, 0x3e, 0xd7, 0x68, 0xd9, 0xc6,
+ 0x14, 0xe7, 0x85, 0x5e, 0x46, 0xd9, 0xd8, 0x01, 0xe9, 0x88, 0x76, 0x11,
+ 0x48, 0x68, 0x0f, 0x56, 0xc6, 0x90, 0x72, 0x29, 0x49, 0x38, 0x96, 0xc4,
+ 0x44, 0xec, 0x74, 0x59, 0x78, 0x57, 0xa7, 0xea, 0x11, 0x44, 0x87, 0xb7,
+ 0x59, 0x35, 0x05, 0x9a, 0xc4, 0xd4, 0xe8, 0xa5, 0xc4, 0x4f, 0x2f, 0xc4,
+ 0x3d, 0x85, 0x74, 0x29, 0x49, 0x7c, 0x6f, 0x43, 0xbf, 0x90, 0xf8, 0x55,
+ 0x3a, 0xeb, 0x25, 0x31, 0x4a, 0x6f, 0x98, 0x1a, 0xc2, 0x18, 0x59, 0xa4,
+ 0x3b, 0x15, 0x90, 0x6d, 0xf6, 0xa1, 0x75, 0x64, 0x14, 0x4e, 0x08, 0x92,
+ 0xf2, 0x68, 0x87, 0xf5, 0x45, 0xef, 0x34, 0x85, 0x5c, 0x68, 0x2e, 0x8c,
+ 0x5b, 0xe6, 0xa2, 0x43, 0x40, 0x03, 0x20, 0xf8, 0xa7, 0xfe, 0x0c, 0x44,
+ 0x7b, 0x3a, 0x04, 0xd1, 0x41, 0xd1, 0x92, 0xe2, 0x4e, 0x41, 0xa3, 0xb6,
+ 0x48, 0x6c, 0xb2, 0x72, 0xa8, 0xd0, 0x82, 0xa4, 0x79, 0x85, 0xf5, 0xc6,
+ 0xf3, 0xf2, 0x06, 0x31, 0x98, 0x36, 0xd0, 0xa7, 0x62, 0xfa, 0x70, 0xda,
+ 0x1c, 0xf3, 0xe5, 0x21, 0x74, 0x25, 0xfe, 0xec, 0x48, 0x21, 0x26, 0xa2,
+ 0x14, 0xa0, 0x15, 0xb3, 0xdd, 0x62, 0xa3, 0xd4, 0x25, 0x49, 0x34, 0xec,
+ 0x4c, 0x66, 0xfd, 0xc2, 0xe1, 0x6c, 0xc5, 0x04, 0x1b, 0xad, 0x78, 0x52,
+ 0x36, 0x57, 0x5e, 0xaa, 0x29, 0xb0, 0xfb, 0xe0, 0xe7, 0xb9, 0x58, 0x35,
+ 0x64, 0x04, 0xa8, 0x19, 0xd8, 0x48, 0x36, 0xb1, 0x38, 0x8b, 0x82, 0xc4,
+ 0x86, 0x8f, 0xc0, 0x78, 0xc3, 0x12, 0x2d, 0x4e, 0x2d, 0x72, 0x64, 0x0b,
+ 0x4a, 0x06, 0x07, 0x5d, 0x1a, 0x03, 0x98, 0x60, 0x04, 0xcd, 0x37, 0x91,
+ 0x8b, 0x54, 0xd7, 0x80, 0x8c, 0xa3, 0xac, 0x53, 0xb3, 0xb1, 0x01, 0xaa,
+ 0x04, 0x61, 0x21, 0x15, 0xfe, 0x91, 0x6e, 0x31, 0xc2, 0x8d, 0xc3, 0x67,
+ 0x62, 0xe8, 0x0b, 0x58, 0xed, 0x13, 0x39, 0x9a, 0x9a, 0xee, 0x2f, 0xe8,
+ 0x21, 0xe2, 0x14, 0xb1, 0xfa, 0x6b, 0xcf, 0x85, 0xfd, 0xa7, 0x8d, 0x9a,
+ 0xc0, 0xc8, 0xab, 0x6a, 0xc6, 0xc9, 0x25, 0xa4, 0x61, 0x9b, 0xfb, 0x4e,
+ 0xdb, 0x1d, 0x32, 0xae, 0xd4, 0xc5, 0xdf, 0xc8, 0xaa, 0xe8, 0xfa, 0xb0,
+ 0x96, 0x33, 0x52, 0xfb, 0xf4, 0x1d, 0x52, 0x94, 0x3c, 0xbc, 0xcb, 0xba,
+ 0x94, 0xdb, 0x48, 0xc3, 0x83, 0xc9, 0x38, 0x2e, 0x13, 0xc3, 0xc1, 0xe9,
+ 0xde, 0x7f, 0x3f, 0xc0, 0xd2, 0x02, 0x64, 0x63, 0x1f, 0xce, 0xc2, 0xe7,
+ 0x0d, 0xe6, 0x45, 0x12, 0xbe, 0x43, 0x43, 0xfb, 0x75, 0x2c, 0x50, 0xa9,
+ 0x02, 0xdc, 0x70, 0xf8, 0xbf, 0xac, 0x8a, 0x69, 0x47, 0x46, 0x95, 0x03,
+ 0x0f, 0x76, 0x53, 0xa2, 0xb2, 0x56, 0x42, 0x74, 0x89, 0x9e, 0x3e, 0x24,
+ 0x08, 0x37, 0x28, 0xfa, 0x44, 0x81, 0x06, 0xc4, 0xdb, 0xdc, 0xab, 0x92,
+ 0xbd, 0xca, 0xcd, 0x09, 0x55, 0xd3, 0x2b, 0x02, 0x0b, 0x20, 0x3f, 0x52,
+ 0xa6, 0xce, 0xd1, 0x40, 0x11, 0x16, 0xcf, 0x3f, 0x0d, 0x2b, 0xba, 0x58,
+ 0x0e, 0x76, 0x04, 0x40, 0x90, 0xb2, 0x50, 0x26, 0xdd, 0x37, 0xcf, 0x30,
+ 0x79, 0xeb, 0x0a, 0x7b, 0x9e, 0xcd, 0x6b, 0x27, 0x20, 0xed, 0x3b, 0x4e,
+ 0x52, 0x92, 0x11, 0x5e, 0x90, 0x4f, 0x96, 0x45, 0x71, 0x1e, 0xbd, 0xe1,
+ 0x34, 0x13, 0xa3, 0xe6, 0xc8, 0x64, 0x60, 0x57, 0x82, 0x4e, 0xee, 0x14,
+ 0x46, 0x46, 0x46, 0xe8, 0x22, 0xc9, 0x04, 0x92, 0xa7, 0xb4, 0xfb, 0x26,
+ 0x18, 0x35, 0xba, 0x55, 0xb9, 0xc2, 0xaa, 0x33, 0xa9, 0xc0, 0x91, 0x81,
+ 0x0a, 0x69, 0x6a, 0xf7, 0x81, 0xf8, 0xd7, 0x70, 0x78, 0xd1, 0x04, 0x19,
+ 0x59, 0xde, 0x59, 0xb7, 0x49, 0x60, 0x7e, 0x21, 0x30, 0x3c, 0x6f, 0x15,
+ 0x74, 0xef, 0x1a, 0x65, 0x3a, 0xc9, 0xf1, 0x1b, 0xf6, 0xe2, 0xbd, 0x3a,
+ 0xc3, 0xdf, 0x72, 0x0b, 0x42, 0x44, 0xa5, 0xb6, 0xd4, 0xbf, 0x83, 0x73,
+ 0x60, 0xdf, 0x7e, 0xdf, 0xad, 0xb4, 0xdc, 0x3a, 0x19, 0xef, 0x3c, 0x7a,
+ 0xbe, 0xbb, 0x1d, 0x49, 0x4b, 0x36, 0xdf, 0xf0, 0xe1, 0x08, 0x1f, 0xef,
+ 0x8e, 0x76, 0xb7, 0x3b, 0xb3, 0xc1, 0x76, 0xaf, 0xc1, 0x48, 0x51, 0x10,
+ 0x75, 0x2b, 0x34, 0x28, 0xdf, 0xd8, 0xd5, 0x63, 0x49, 0x6a, 0xb4, 0x5f,
+ 0x2f, 0x7a, 0x96, 0x5d, 0x1b, 0x52, 0x8b, 0xa6, 0xa8, 0x1d, 0xe7, 0xb5,
+ 0x18, 0x36, 0x90, 0x64, 0x2a, 0x5b, 0x50, 0x90, 0xdd, 0x4e, 0xfb, 0xa5,
+ 0x47, 0x20, 0x2c, 0x39, 0xd7, 0x21, 0x12, 0x6d, 0xa9, 0xcd, 0xa4, 0x2a,
+ 0xca, 0xbd, 0xa3, 0x98, 0xfe, 0x27, 0x77, 0xb6, 0xbc, 0x6c, 0x81, 0x3a,
+ 0x3e, 0xf3, 0xcf, 0x14, 0x9a, 0xfe, 0x30, 0xad, 0xa7, 0x79, 0xce, 0xf6,
+ 0x4c, 0x8f, 0x19, 0xa3, 0x49, 0x8d, 0x04, 0x13, 0x47, 0xc5, 0xd2, 0x79,
+ 0xca, 0xa1, 0x5a, 0x87, 0x47, 0x1a, 0x0c, 0x0b, 0x65, 0xd5, 0x90, 0xd8,
+ 0xba, 0x71, 0xc5, 0x86, 0x47, 0x4f, 0x16, 0x81, 0x50, 0xb6, 0xfa, 0x65,
+ 0xdd, 0x55, 0xa3, 0xcc, 0x5d, 0x60, 0x44, 0xb2, 0x65, 0x15, 0x96, 0xf0,
+ 0x21, 0xfd, 0x92, 0x92, 0x9a, 0xd3, 0xa6, 0x2e, 0xb1, 0x4f, 0xb1, 0x4d,
+ 0x25, 0x0f, 0x05, 0x81, 0xd0, 0x5a, 0x03, 0xca, 0xde, 0x7d, 0xc9, 0x05,
+ 0xfa, 0xca, 0xcb, 0xdc, 0x69, 0x19, 0x40, 0x69, 0x44, 0x11, 0x64, 0x0c,
+ 0xfd, 0x84, 0xc2, 0xe3, 0x5c, 0x2c, 0x85, 0x85, 0x48, 0x27, 0x09, 0x72,
+ 0x7b, 0x70, 0x8e, 0x88, 0xf4, 0x91, 0x00, 0xd2, 0x90, 0xdd, 0xad, 0x08,
+ 0x7e, 0xd4, 0xc0, 0xac, 0x8f, 0x10, 0x3a, 0x89, 0x82, 0x8a, 0xec, 0x06,
+ 0xdc, 0xb8, 0x16, 0x55, 0xa2, 0xaa, 0x72, 0xf8, 0x8d, 0x6c, 0x72, 0x01,
+ 0xab, 0x63, 0x48, 0xb4, 0x84, 0x70, 0x9e, 0x45, 0xca, 0xb7, 0xa7, 0x74,
+ 0x3b, 0x6b, 0x9b, 0x96, 0x5d, 0x10, 0xca, 0x24, 0x20, 0xe4, 0x82, 0xbd,
+ 0xa1, 0x36, 0x00, 0x34, 0x39, 0xc5, 0x96, 0x6d, 0xda, 0xe9, 0x1f, 0xd0,
+ 0xda, 0x39, 0x85, 0x99, 0x11, 0xcc, 0xca, 0x96, 0x81, 0x59, 0xf7, 0x87,
+ 0x4b, 0x76, 0x6e, 0x87, 0x37, 0x37, 0x37, 0x43, 0x5c, 0x38, 0xe4, 0xe4,
+ 0x48, 0x25, 0xc5, 0xa8, 0x85, 0x11, 0x4d, 0x76, 0x25, 0x9b, 0x9c, 0x60,
+ 0x22, 0x61, 0x7c, 0xc3, 0xcb, 0x8f, 0xaa, 0x26, 0x79, 0x43, 0x25, 0x7b,
+ 0x42, 0x5c, 0xf4, 0x9a, 0x94, 0xce, 0xc9, 0x74, 0x48, 0xc3, 0x51, 0x47,
+ 0x54, 0xe4, 0xf6, 0xb9, 0xb5, 0x00, 0x61, 0x6a, 0xda, 0x64, 0x28, 0x51,
+ 0x37, 0x9f, 0x58, 0x1c, 0x24, 0xc3, 0x6f, 0x93, 0x8d, 0x57, 0xb2, 0xda,
+ 0x73, 0xf3, 0xc4, 0x41, 0x7b, 0x2d, 0xfc, 0x70, 0x18, 0xcc, 0x31, 0xef,
+ 0x6e, 0x3c, 0x0c, 0x21, 0xb1, 0xf7, 0x22, 0x53, 0x13, 0x15, 0x97, 0x35,
+ 0xd3, 0x44, 0x9c, 0x75, 0x48, 0x7b, 0x61, 0xb7, 0x16, 0xc3, 0x9a, 0xd1,
+ 0xd2, 0xd3, 0x5a, 0x1a, 0xee, 0x4c, 0xf8, 0x86, 0xaf, 0xb9, 0x8e, 0x55,
+ 0x7a, 0x73, 0xff, 0x1d, 0xf7, 0x6e, 0xa2, 0x50, 0xef, 0x9c, 0x5c, 0x5d,
+ 0x1e, 0xec, 0x30, 0xfc, 0x3b, 0x36, 0xcf, 0x32, 0x32, 0x53, 0x69, 0x77,
+ 0xe1, 0xea, 0xa5, 0xd8, 0x30, 0x15, 0xbd, 0xf4, 0xab, 0x35, 0xa5, 0x66,
+ 0xce, 0x29, 0xec, 0x56, 0xd1, 0x8a, 0x7c, 0x74, 0xd0, 0x4b, 0x69, 0x59,
+ 0x96, 0xaa, 0x1e, 0xc0, 0x68, 0xdc, 0xea, 0x06, 0xf6, 0x72, 0x0a, 0x2d,
+ 0xb3, 0x63, 0xcf, 0x5b, 0xa6, 0x00, 0xdd, 0xc6, 0x32, 0x38, 0x39, 0xce,
+ 0x81, 0xab, 0xaa, 0x18, 0x64, 0xe2, 0xb2, 0xca, 0x2a, 0x10, 0x3a, 0x25,
+ 0xba, 0x0f, 0x35, 0x4b, 0x39, 0x26, 0xac, 0x0d, 0x43, 0x79, 0xf5, 0xcd,
+ 0x11, 0x25, 0x6c, 0x1b, 0x46, 0x5a, 0x08, 0x4e, 0x03, 0xcf, 0x9f, 0x3b,
+ 0x1b, 0x59, 0xa3, 0xf6, 0x12, 0xac, 0x84, 0xab, 0x1e, 0xd3, 0x24, 0x86,
+ 0x73, 0xaa, 0x36, 0x47, 0xa2, 0xc6, 0x85, 0xe4, 0xa5, 0x8a, 0x8d, 0x20,
+ 0x97, 0xd7, 0x86, 0x77, 0x53, 0x57, 0x05, 0x10, 0xdd, 0x2f, 0xfa, 0xba,
+ 0xe2, 0x89, 0xa4, 0xb5, 0x44, 0x70, 0x49, 0x59, 0x0b, 0x32, 0xc4, 0x1d,
+ 0xbd, 0x72, 0xa7, 0xa8, 0x2c, 0xcc, 0x7b, 0x93, 0xcf, 0xc7, 0x1b, 0xb9,
+ 0xd1, 0x99, 0x74, 0x3c, 0x29, 0x76, 0xeb, 0x32, 0xdf, 0x63, 0xc0, 0xe5,
+ 0x56, 0xf0, 0xa5, 0xc5, 0x3c, 0xb7, 0xaa, 0xea, 0xc1, 0xcd, 0xfd, 0x9f,
+ 0x90, 0x50, 0x24, 0x77, 0x0d, 0xcf, 0x83, 0xe6, 0xa1, 0x25, 0x91, 0xfe,
+ 0x68, 0x8a, 0xd6, 0x27, 0x09, 0xaf, 0xf1, 0xe1, 0x60, 0xff, 0x7d, 0x09,
+ 0x6d, 0xe9, 0x2b, 0x71, 0x54, 0x21, 0xd5, 0xbd, 0xf6, 0xac, 0x11, 0xa9,
+ 0x87, 0xa5, 0xb9, 0x6b, 0x19, 0x10, 0xb6, 0x21, 0x3e, 0x1c, 0x47, 0x38,
+ 0xbd, 0xdd, 0x63, 0x8a, 0x03, 0xba, 0x7c, 0xcd, 0xdd, 0xc2, 0xfe, 0xad,
+ 0xbb, 0x79, 0x5f, 0xde, 0xbf, 0x7b, 0xbf, 0x74, 0xfb, 0xd6, 0xef, 0x1e,
+ 0x77, 0x69, 0xd0, 0x44, 0xd9, 0x2f, 0x3d, 0x07, 0x1d, 0x25, 0x7b, 0xb0,
+ 0xf5, 0x65, 0x1d, 0x75, 0x6d, 0x2e, 0xe3, 0x19, 0x99, 0x5f, 0xfe, 0x56,
+ 0xa7, 0x4e, 0xc4, 0x48, 0x16, 0x3d, 0x26, 0x1f, 0x1f, 0x8e, 0xc3, 0x8a,
+ 0x74, 0xf6, 0x3e, 0xbc, 0xa2, 0xe8, 0xe1, 0x34, 0x82, 0xc0, 0x14, 0x4f,
+ 0x1b, 0x26, 0xe6, 0x09, 0xa5, 0x79, 0x0e, 0xe3, 0xc3, 0x69, 0xad, 0x9f,
+ 0x28, 0xe2, 0xc1, 0xfa, 0xbe, 0x52, 0xc1, 0xff, 0xf0, 0xc5, 0x51, 0x5a,
+ 0x91, 0xeb, 0x0c, 0xe8, 0x67, 0x84, 0x70, 0x08, 0x66, 0x2b, 0xf4, 0x1b,
+ 0xea, 0xf5, 0x11, 0xa4, 0x47, 0xee, 0x14, 0xa5, 0x2a, 0xc1, 0xf6, 0xa0,
+ 0xbd, 0x61, 0x40, 0xb3, 0x23, 0x61, 0xa0, 0xa7, 0x9c, 0xf7, 0x9e, 0xb1,
+ 0x9e, 0x1d, 0xba, 0x2f, 0x44, 0xcf, 0xee, 0xff, 0x4b, 0xeb, 0x23, 0x7a,
+ 0x76, 0x64, 0x80, 0x08, 0x43, 0xcd, 0x50, 0xdd, 0x94, 0x57, 0x9f, 0x50,
+ 0x41, 0x02, 0x44, 0x7c, 0xcf, 0xec, 0x08, 0x60, 0x00, 0x4a, 0x11, 0xe2,
+ 0xad, 0x73, 0x41, 0x04, 0x65, 0x34, 0xf7, 0x2f, 0x9d, 0x32, 0x33, 0xc4,
+ 0x22, 0x87, 0x42, 0xb2, 0x23, 0x22, 0xc2, 0x35, 0x94, 0x6a, 0x29, 0x33,
+ 0x4e, 0x94, 0x01, 0xf9, 0xf5, 0x8b, 0x46, 0x85, 0x50, 0x15, 0xd9, 0xde,
+ 0x92, 0x94, 0x7b, 0x9f, 0xb7, 0x24, 0xa5, 0x7b, 0x67, 0x9d, 0x8c, 0x1c,
+ 0x67, 0x9c, 0x90, 0xe6, 0x3b, 0x30, 0xe9, 0x25, 0x2e, 0xa4, 0x46, 0xbf,
+ 0x8e, 0x30, 0xb5, 0x09, 0xaf, 0x06, 0x75, 0xc5, 0x9c, 0x5b, 0xe4, 0x95,
+ 0x47, 0x52, 0x82, 0x39, 0xa2, 0x66, 0x62, 0x1d, 0x25, 0x93, 0xaa, 0xbc,
+ 0xa9, 0x49, 0x1d, 0x55, 0x03, 0x35, 0xe5, 0x14, 0xd8, 0xab, 0xa0, 0xea,
+ 0xd9, 0x6c, 0xef, 0xdc, 0x42, 0xbd, 0x7e, 0x7b, 0xfe, 0xf6, 0x98, 0xfb,
+ 0x37, 0x70, 0x01, 0x2e, 0xea, 0x8c, 0x64, 0xce, 0xab, 0xc9, 0xc2, 0x58,
+ 0xd2, 0x46, 0x3b, 0x69, 0x98, 0x95, 0x29, 0x77, 0x0c, 0xaa, 0x0b, 0x28,
+ 0xa4, 0x27, 0x01, 0xe1, 0x65, 0x2c, 0x3e, 0x23, 0x8a, 0xa4, 0x07, 0x35,
+ 0xe5, 0x69, 0xc0, 0xbf, 0x5c, 0xd7, 0x35, 0x76, 0x32, 0x65, 0xc4, 0x90,
+ 0x1e, 0xf5, 0x06, 0x47, 0x81, 0x47, 0x82, 0xdb, 0xe7, 0xa9, 0x69, 0xd4,
+ 0x66, 0x8c, 0x50, 0xa3, 0xad, 0x87, 0x06, 0x5a, 0x97, 0xed, 0x31, 0x42,
+ 0xc0, 0x58, 0x69, 0x5b, 0xd3, 0x0a, 0x2a, 0x67, 0xad, 0xe6, 0xe5, 0xba,
+ 0x85, 0xf8, 0xca, 0x17, 0xf4, 0x10, 0xe8, 0x43, 0x12, 0x48, 0x5a, 0x55,
+ 0x70, 0xe6, 0xb1, 0x56, 0x3d, 0x88, 0xe4, 0xdc, 0x8b, 0x42, 0xa2, 0xde,
+ 0x7c, 0x1b, 0xda, 0x6c, 0x99, 0x7a, 0xda, 0x16, 0x01, 0x63, 0x7b, 0x37,
+ 0x38, 0xa2, 0x24, 0x32, 0x08, 0x15, 0x55, 0x73, 0xd3, 0x69, 0x1a, 0x62,
+ 0x33, 0xa3, 0x53, 0xd7, 0xaf, 0x94, 0x9c, 0xe3, 0x81, 0x7a, 0x17, 0x55,
+ 0xb0, 0x5d, 0xcf, 0x90, 0xda, 0xb5, 0x89, 0x50, 0x7b, 0x99, 0xb0, 0xb8,
+ 0x08, 0x7d, 0x8b, 0xfa, 0x44, 0x94, 0x6d, 0x7f, 0x57, 0xe8, 0x7f, 0x14,
+ 0xff, 0xd7, 0xc0, 0x0b, 0xaf, 0xe5, 0xf0, 0x40, 0xf9, 0xf1, 0x42, 0x17,
+ 0x59, 0x5f, 0x64, 0xd5, 0x25, 0x97, 0x21, 0x30, 0xea, 0x6b, 0x14, 0xa8,
+ 0x22, 0x4d, 0x3c, 0x20, 0xb6, 0x24, 0xf9, 0x5f, 0x43, 0x96, 0xa8, 0xe4,
+ 0xaa, 0x5a, 0xa1, 0xb8, 0x55, 0xfc, 0xe9, 0x9b, 0xc3, 0x19, 0xb3, 0x95,
+ 0x59, 0x5a, 0x98, 0x9d, 0x30, 0x37, 0x36, 0xcc, 0x8f, 0x99, 0xcf, 0xbf,
+ 0x9c, 0x97, 0xab, 0xfa, 0x6e, 0x33, 0x91, 0x96, 0x3d, 0xd2, 0xe5, 0xa2,
+ 0x91, 0x5c, 0x1e, 0x9c, 0xa5, 0x39, 0xdf, 0x55, 0xf1, 0x51, 0x85, 0x22,
+ 0x2a, 0x15, 0x6a, 0x76, 0xd4, 0x76, 0x86, 0xdb, 0xf4, 0x3e, 0xf6, 0xbf,
+ 0xfc, 0xb1, 0xa3, 0xbb, 0x4c, 0xee, 0x7f, 0x36, 0x9c, 0x1f, 0x66, 0x39,
+ 0xbb, 0x90, 0x4c, 0xcc, 0x6c, 0x4e, 0x5a, 0x91, 0x3a, 0x3b, 0x20, 0x84,
+ 0x07, 0x23, 0xed, 0x6a, 0xc8, 0xc1, 0xa5, 0x6e, 0x10, 0xbf, 0xe9, 0x29,
+ 0x3e, 0x71, 0x92, 0x87, 0x03, 0x4a, 0x0e, 0x1c, 0x8f, 0x51, 0x4a, 0x6c,
+ 0x8b, 0x1b, 0xbf, 0xca, 0x6d, 0x94, 0x9c, 0x9a, 0xfd, 0x0a, 0xd0, 0x24,
+ 0x10, 0xc9, 0xb6, 0xc3, 0xa5, 0x3e, 0xae, 0xa9, 0xff, 0x13, 0xca, 0x2a,
+ 0xa7, 0x4a, 0x81, 0xa4, 0x65, 0x99, 0x07, 0x96, 0x26, 0x59, 0xea, 0x54,
+ 0x7e, 0xa2, 0xc6, 0xbc, 0x75, 0xba, 0x03, 0x48, 0x1d, 0xc8, 0x1d, 0x48,
+ 0x6c, 0x50, 0x6b, 0x98, 0xc3, 0x16, 0xd6, 0x26, 0xfe, 0xaa, 0xaf, 0x18,
+ 0x0d, 0xbb, 0x11, 0x63, 0x01, 0xde, 0x95, 0xa7, 0x84, 0x3f, 0x8f, 0xa3,
+ 0x44, 0x42, 0x93, 0x9c, 0x51, 0xba, 0x26, 0x1b, 0xcd, 0xbf, 0xd9, 0x9e,
+ 0xac, 0x71, 0x06, 0x57, 0x57, 0x00, 0xf5, 0xbb, 0x5f, 0x1d, 0x3a, 0xad,
+ 0x63, 0x80, 0xfc, 0xfa, 0x11, 0xf9, 0x1c, 0xa8, 0xf3, 0x2d, 0x6b, 0x7a,
+ 0xc3, 0x73, 0xfa, 0x09, 0x3b, 0x10, 0x87, 0x11, 0xf2, 0x69, 0x59, 0x80,
+ 0xd9, 0x3c, 0xbb, 0xe4, 0x25, 0xbf, 0x38, 0x3e, 0xfc, 0xfe, 0xf0, 0x38,
+ 0x10, 0x6d, 0xdf, 0x8c, 0xc7, 0x3b, 0x1f, 0xb3, 0x6a, 0x42, 0xfd, 0x51,
+ 0xb1, 0x3c, 0xb8, 0x2b, 0xf1, 0xa4, 0x4d, 0xc3, 0xf2, 0x38, 0xbe, 0x76,
+ 0xb4, 0x23, 0xfe, 0x4b, 0x56, 0x55, 0x98, 0xd4, 0x21, 0x9f, 0x14, 0xb4,
+ 0x75, 0x2a, 0x0b, 0x92, 0x7c, 0x3f, 0x92, 0x5f, 0xd3, 0x2a, 0x9b, 0x71,
+ 0xfb, 0xd0, 0x30, 0xd3, 0x8f, 0x00, 0x36, 0xd0, 0x22, 0x03, 0xc7, 0xcc,
+ 0xd9, 0xde, 0x14, 0x64, 0xb2, 0x8b, 0x08, 0xde, 0x58, 0x52, 0x11, 0x7b,
+ 0xf2, 0x5a, 0xbe, 0x59, 0xe3, 0x66, 0x60, 0x97, 0x18, 0x5d, 0x8d, 0xed,
+ 0x88, 0x93, 0xef, 0x86, 0x2f, 0xc7, 0xc3, 0xd7, 0x87, 0xc7, 0x87, 0xdf,
+ 0xbc, 0x3c, 0x3f, 0x64, 0x50, 0x71, 0x45, 0x1a, 0x8e, 0x2b, 0x22, 0x56,
+ 0x2e, 0x7f, 0x27, 0x1b, 0xc3, 0x32, 0x1b, 0xa8, 0xf4, 0xe8, 0x9c, 0x4c,
+ 0xfd, 0x51, 0x1c, 0xe2, 0x69, 0x0a, 0xd3, 0xa5, 0x69, 0x35, 0x30, 0xee,
+ 0x66, 0xa3, 0x19, 0x61, 0x25, 0x53, 0x0d, 0x56, 0x90, 0xce, 0x6f, 0xd0,
+ 0x23, 0xed, 0x7d, 0x81, 0x74, 0xf7, 0xdc, 0x56, 0x74, 0xf2, 0xea, 0x7d,
+ 0xaf, 0x8d, 0xdb, 0xd9, 0xd6, 0x01, 0x13, 0x40, 0x7c, 0x5c, 0x5f, 0xd1,
+ 0x62, 0x6c, 0x0a, 0xf1, 0xbe, 0xa6, 0x07, 0x3b, 0x48, 0xdf, 0x0e, 0xa0,
+ 0x9c, 0xfa, 0xb3, 0xc8, 0xef, 0x22, 0xb8, 0x21, 0x74, 0x67, 0xea, 0xe9,
+ 0x55, 0xb6, 0xb0, 0x88, 0x58, 0xc8, 0x20, 0xa0, 0x58, 0x35, 0x57, 0x40,
+ 0x0a, 0x72, 0x0f, 0xb1, 0x81, 0x49, 0x46, 0x36, 0x2f, 0xc5, 0xcd, 0xae,
+ 0x03, 0xce, 0x4f, 0x79, 0x39, 0xc0, 0xfd, 0x47, 0x38, 0x04, 0x99, 0x35,
+ 0x54, 0xe6, 0x3b, 0xa2, 0x1c, 0x40, 0x2f, 0xb4, 0x1f, 0x86, 0xf2, 0xa5,
+ 0x91, 0x5f, 0x57, 0x2d, 0xb0, 0x38, 0xe2, 0x16, 0xf4, 0xbc, 0x24, 0xf7,
+ 0x16, 0xfd, 0x88, 0xfb, 0x88, 0x88, 0x5e, 0x8c, 0x19, 0xfe, 0x12, 0x3f,
+ 0x54, 0xd7, 0x11, 0x45, 0x54, 0xe5, 0xca, 0x1f, 0xa9, 0x0a, 0x27, 0x96,
+ 0x59, 0xbd, 0x86, 0x69, 0xb8, 0xc9, 0x32, 0x73, 0x60, 0x7c, 0xf3, 0x99,
+ 0x1c, 0x0e, 0xfd, 0x48, 0xba, 0x01, 0x8c, 0x5c, 0x6d, 0x46, 0xd4, 0xdd,
+ 0xee, 0xb1, 0x8c, 0x56, 0xcb, 0x00, 0x40, 0xb5, 0xeb, 0x5f, 0xc3, 0xc6,
+ 0x0e, 0xb6, 0x1c, 0x6e, 0x98, 0x2d, 0x03, 0xdc, 0xec, 0xad, 0x37, 0x0a,
+ 0x83, 0x6f, 0xf5, 0x3f, 0xbf, 0xed, 0x99, 0xd7, 0xa5, 0xe8, 0xf0, 0xf4,
+ 0x8c, 0x1b, 0x9d, 0x1f, 0xe3, 0x2f, 0x12, 0x1d, 0xab, 0x63, 0x30, 0x74,
+ 0xd2, 0x84, 0x03, 0x09, 0x23, 0x19, 0x85, 0x57, 0x6c, 0xc0, 0x5b, 0x13,
+ 0x06, 0x39, 0x47, 0x54, 0xf0, 0xce, 0xe5, 0x3a, 0xd0, 0x06, 0x07, 0x09,
+ 0xfa, 0xb6, 0x39, 0x2a, 0x4d, 0x05, 0x73, 0x10, 0xa4, 0x20, 0x9a, 0x05,
+ 0x27, 0xba, 0x6a, 0x14, 0xe3, 0x04, 0xbf, 0x84, 0x52, 0x28, 0xe4, 0xd3,
+ 0xc3, 0x79, 0x5d, 0xd1, 0x13, 0x86, 0xc4, 0x5b, 0x49, 0x45, 0x6d, 0x55,
+ 0x53, 0x33, 0x8f, 0x91, 0x5b, 0x27, 0x7f, 0x82, 0x9d, 0xca, 0x84, 0x7e,
+ 0x19, 0xc6, 0x2c, 0xa8, 0x86, 0xdc, 0xea, 0xfd, 0x9a, 0x3c, 0xce, 0xc9,
+ 0xb1, 0x36, 0x29, 0x7e, 0x20, 0xe8, 0x40, 0x12, 0x17, 0x46, 0x56, 0x7f,
+ 0x59, 0xf8, 0xfd, 0xbc, 0x5a, 0x36, 0x42, 0xad, 0xd9, 0x62, 0xd9, 0x9d,
+ 0x84, 0xb6, 0x59, 0x69, 0xbb, 0x90, 0x10, 0x62, 0x4a, 0xb8, 0xae, 0x64,
+ 0x7e, 0x4c, 0x58, 0xcb, 0xa0, 0xcc, 0xbb, 0xab, 0xb4, 0x88, 0xdc, 0x39,
+ 0xb3, 0xf1, 0xb6, 0x3d, 0x19, 0x2d, 0x54, 0x8e, 0x2d, 0xa2, 0x68, 0x83,
+ 0x36, 0xba, 0xe8, 0x52, 0xc6, 0x18, 0x33, 0x0c, 0x2c, 0x47, 0xec, 0x41,
+ 0xa6, 0xc2, 0x9b, 0x43, 0x3d, 0x7a, 0x84, 0xde, 0xca, 0x18, 0x55, 0x31,
+ 0x77, 0xf1, 0x22, 0x22, 0x2d, 0x12, 0xec, 0x4b, 0xf4, 0xb3, 0xbe, 0x73,
+ 0xaa, 0x81, 0xf1, 0xa0, 0x6d, 0xd1, 0xec, 0xb7, 0x5d, 0x24, 0xc3, 0x3a,
+ 0x27, 0x09, 0x7c, 0xb3, 0xab, 0xdd, 0x52, 0x1b, 0x2e, 0x8c, 0x30, 0xdf,
+ 0xa6, 0xe9, 0xc2, 0x55, 0x63, 0xa3, 0xa6, 0xa0, 0x9d, 0xe0, 0xfb, 0xaf,
+ 0x69, 0x72, 0xa4, 0x75, 0xd2, 0x1b, 0x74, 0xe9, 0x01, 0x01, 0x74, 0xa9,
+ 0xfd, 0x96, 0x98, 0x96, 0x27, 0x99, 0xf9, 0x62, 0x8e, 0x7e, 0x74, 0x2d,
+ 0x5f, 0x7d, 0xf7, 0xfb, 0xb5, 0xa1, 0xbf, 0xe9, 0x95, 0x9a, 0x52, 0x78,
+ 0x71, 0x01, 0xd5, 0xc0, 0xeb, 0xe3, 0xe8, 0xb5, 0x83, 0x1a, 0x9e, 0x92,
+ 0x6c, 0x47, 0xc8, 0x91, 0x32, 0x10, 0x93, 0xb2, 0x0a, 0xcb, 0x54, 0xa7,
+ 0x16, 0xf2, 0x48, 0x1f, 0x4d, 0xeb, 0xeb, 0xf8, 0x0d, 0xaf, 0xaf, 0xa3,
+ 0x37, 0x5c, 0xff, 0xa0, 0x9b, 0xee, 0x75, 0xd7, 0xec, 0xbb, 0xeb, 0xe3,
+ 0xef, 0x7b, 0xb0, 0x1b, 0xbc, 0x1b, 0xae, 0xab, 0x23, 0x6a, 0xf7, 0xee,
+ 0x38, 0x5f, 0x72, 0x39, 0x23, 0x7b, 0xcd, 0xe5, 0x9e, 0x47, 0x7d, 0xf8,
+ 0x7e, 0x53, 0x5c, 0xbe, 0xe7, 0xe6, 0xfb, 0x72, 0xb9, 0x4f, 0x5f, 0x8e,
+ 0xbf, 0xef, 0x5c, 0x6b, 0xef, 0x22, 0xc7, 0x90, 0x2e, 0xa8, 0x55, 0x65,
+ 0xa5, 0xf0, 0xb7, 0x18, 0x2b, 0x4a, 0xef, 0xf5, 0xf5, 0x43, 0xe8, 0xdd,
+ 0x4c, 0x24, 0xa0, 0xf7, 0x60, 0x8f, 0xd7, 0xd1, 0xbb, 0x7f, 0x50, 0x2d,
+ 0xf9, 0x93, 0x25, 0x3e, 0xc5, 0x17, 0xdc, 0xd2, 0x1a, 0x65, 0x18, 0x11,
+ 0x52, 0x27, 0x4a, 0x47, 0xb4, 0x8f, 0x48, 0x3b, 0x4c, 0xf7, 0xa3, 0x79,
+ 0xfe, 0x12, 0x42, 0xa7, 0x17, 0x02, 0x3a, 0xd7, 0x13, 0xfd, 0xc5, 0x84,
+ 0x2e, 0x17, 0x24, 0xa0, 0x73, 0xb2, 0x5a, 0x4f, 0x07, 0x1e, 0x81, 0x7b,
+ 0x54, 0xeb, 0x97, 0x6a, 0x47, 0x76, 0xc8, 0xe2, 0x7e, 0x38, 0xf1, 0xeb,
+ 0x50, 0x17, 0x22, 0x28, 0x1f, 0x03, 0x5b, 0x0f, 0x5b, 0x4d, 0x43, 0x97,
+ 0xbb, 0xad, 0xce, 0xf6, 0x0b, 0x14, 0xc8, 0xda, 0x92, 0x94, 0x66, 0x63,
+ 0xff, 0x40, 0x66, 0x93, 0x05, 0xef, 0xd7, 0xfc, 0xfb, 0x3d, 0x25, 0xdb,
+ 0xb0, 0x4f, 0x3a, 0x89, 0x58, 0x05, 0x79, 0x9d, 0x21, 0x17, 0x83, 0xd0,
+ 0xc0, 0xba, 0xf7, 0x14, 0x6a, 0x1e, 0xe9, 0x03, 0x50, 0x54, 0x86, 0xc6,
+ 0x08, 0x09, 0x53, 0x95, 0xdb, 0xa1, 0xe0, 0x86, 0x40, 0x62, 0x3d, 0xab,
+ 0x0f, 0xb5, 0x84, 0x50, 0x75, 0x25, 0x18, 0x91, 0x26, 0x52, 0xc2, 0x08,
+ 0xc7, 0x3d, 0x89, 0xde, 0x48, 0xd1, 0x6b, 0x14, 0xe8, 0xac, 0xdd, 0x75,
+ 0xa5, 0x29, 0x5b, 0x0e, 0xb3, 0xa7, 0x1d, 0x30, 0xe1, 0x59, 0x51, 0x0f,
+ 0x5d, 0xb3, 0xf4, 0x17, 0xf6, 0xaf, 0x81, 0x7d, 0xf1, 0xfa, 0xdd, 0xb8,
+ 0xa3, 0x52, 0xd4, 0x19, 0x17, 0x70, 0x5c, 0x12, 0xdf, 0x30, 0xbf, 0xb7,
+ 0x45, 0x57, 0xb5, 0x6b, 0x4f, 0x28, 0x43, 0x86, 0x20, 0xf6, 0xe6, 0x13,
+ 0xa3, 0x4e, 0xd5, 0xaa, 0x94, 0x0a, 0xaf, 0xc8, 0xc4, 0xa3, 0xe8, 0x35,
+ 0xd6, 0xe0, 0x66, 0x27, 0x65, 0xe7, 0xf0, 0x0e, 0xc5, 0xa0, 0x86, 0x58,
+ 0x40, 0x60, 0x9e, 0xda, 0x27, 0x79, 0xc9, 0xb0, 0xe8, 0x02, 0x04, 0x66,
+ 0xdb, 0x4c, 0x41, 0x35, 0xb4, 0x83, 0xc6, 0x42, 0x4d, 0x5b, 0x02, 0x5d,
+ 0x24, 0x79, 0x5d, 0xdb, 0xd1, 0x2d, 0xe6, 0x3d, 0xd6, 0x2d, 0x5c, 0x5e,
+ 0x3f, 0x1e, 0xe2, 0xf1, 0x44, 0x8d, 0x45, 0xfe, 0xe1, 0x53, 0xfa, 0xe1,
+ 0xa8, 0xbb, 0xd1, 0x41, 0x99, 0x8b, 0x34, 0x33, 0xb5, 0x9e, 0xd3, 0x55,
+ 0x31, 0x43, 0xf7, 0x0b, 0x4c, 0x5b, 0x7b, 0x19, 0x00, 0xb0, 0xd0, 0xb5,
+ 0x8f, 0xb1, 0xb8, 0x44, 0x86, 0x84, 0x82, 0x82, 0xae, 0x8a, 0x72, 0xf8,
+ 0xdd, 0xa1, 0x3f, 0x7a, 0x14, 0x39, 0x74, 0x3b, 0xe3, 0x17, 0xb2, 0xcc,
+ 0x07, 0x1c, 0xf9, 0x24, 0xe7, 0x36, 0x53, 0x2f, 0xf2, 0xe5, 0x50, 0xdf,
+ 0x62, 0xe1, 0xb1, 0x48, 0x3f, 0x8a, 0x50, 0x7f, 0x4c, 0xa4, 0x10, 0x3a,
+ 0x09, 0xb4, 0xf3, 0xb1, 0x1f, 0xa7, 0xe2, 0x27, 0x85, 0x66, 0x44, 0xd3,
+ 0x6a, 0x32, 0x57, 0x9c, 0x4e, 0xb8, 0xac, 0xfc, 0x9d, 0x58, 0x5d, 0x96,
+ 0x66, 0x50, 0xfb, 0x7e, 0x18, 0xad, 0xc1, 0xa0, 0x99, 0xd8, 0x77, 0xef,
+ 0x3d, 0x3f, 0x47, 0x0f, 0xeb, 0xce, 0x4f, 0xf7, 0xec, 0xbf, 0xc7, 0xf9,
+ 0x3d, 0xfd, 0x24, 0xe7, 0xf7, 0xf4, 0xbf, 0xcd, 0xf9, 0x3d, 0xfd, 0xe7,
+ 0xcf, 0xef, 0x71, 0xf7, 0xfc, 0x9e, 0xfe, 0x77, 0x39, 0x3f, 0x6d, 0x73,
+ 0xa6, 0xa7, 0x97, 0x05, 0xe7, 0x37, 0x96, 0xd4, 0x0e, 0xc5, 0xc7, 0xc3,
+ 0x66, 0xeb, 0x5b, 0x1c, 0x48, 0x91, 0x64, 0x44, 0xf6, 0x54, 0x6b, 0x3e,
+ 0x2c, 0x23, 0x34, 0xf6, 0xf4, 0x0d, 0x91, 0xde, 0x57, 0x3a, 0xe4, 0xd1,
+ 0x69, 0x62, 0x3f, 0xef, 0x1d, 0x82, 0x43, 0xbb, 0x12, 0xf7, 0x6e, 0xd4,
+ 0x8d, 0x5c, 0xc3, 0xb7, 0x68, 0x36, 0x80, 0x4b, 0x20, 0x6b, 0x57, 0xb8,
+ 0x1b, 0x03, 0xb4, 0x32, 0x9b, 0x77, 0xf0, 0x02, 0xfb, 0x35, 0xe4, 0xc7,
+ 0xff, 0x18, 0x2d, 0x48, 0xa3, 0xe6, 0xc9, 0x6e, 0x52, 0xb1, 0xd0, 0x81,
+ 0xb7, 0x75, 0x0f, 0x3e, 0xb6, 0xbe, 0xa6, 0x5b, 0x7a, 0x84, 0xd3, 0xe1,
+ 0xfd, 0x47, 0x56, 0x5e, 0x11, 0xd6, 0xce, 0x8b, 0xf7, 0x67, 0xa1, 0xef,
+ 0xcd, 0x2c, 0xd5, 0x96, 0xe6, 0x39, 0x88, 0x42, 0x73, 0x5e, 0x43, 0x18,
+ 0xf7, 0x43, 0x42, 0x6b, 0x37, 0xd7, 0xf1, 0xe4, 0xdb, 0x6d, 0xcf, 0x0b,
+ 0x44, 0x91, 0x85, 0x32, 0x72, 0xd1, 0xb8, 0x34, 0x56, 0xab, 0xbf, 0xeb,
+ 0x81, 0x7f, 0xc2, 0x2e, 0x2f, 0x3d, 0x73, 0x80, 0xd8, 0xec, 0x1c, 0x49,
+ 0xa4, 0xa8, 0xb6, 0x0a, 0xda, 0x4c, 0x42, 0x19, 0xcc, 0x6b, 0x01, 0x6f,
+ 0x03, 0xd4, 0x85, 0x4a, 0x42, 0x9a, 0xd8, 0x27, 0x6c, 0x1e, 0xf3, 0x9a,
+ 0x74, 0xc1, 0xd5, 0x62, 0x29, 0xe5, 0xbd, 0xf7, 0x94, 0x37, 0x92, 0x89,
+ 0xbd, 0x9d, 0xfc, 0x40, 0xb5, 0x8b, 0xec, 0x63, 0x97, 0x52, 0x1f, 0xb5,
+ 0xba, 0x6d, 0x7d, 0x83, 0x06, 0xb0, 0x7a, 0xf0, 0xc7, 0xa2, 0x78, 0x50,
+ 0x9d, 0xca, 0x7d, 0xae, 0x49, 0x51, 0x10, 0x73, 0xf0, 0x40, 0x4f, 0x27,
+ 0x96, 0x52, 0x03, 0xde, 0x67, 0xf9, 0x68, 0x14, 0x03, 0x1b, 0xca, 0x04,
+ 0x97, 0x39, 0x61, 0xd2, 0x0c, 0xe3, 0x67, 0x5e, 0x37, 0x43, 0x8d, 0xa4,
+ 0xd6, 0xa9, 0x76, 0xd1, 0x62, 0x9d, 0x3d, 0x01, 0x2c, 0xc5, 0x32, 0xf4,
+ 0x55, 0x7b, 0x25, 0x4f, 0x80, 0x40, 0x67, 0x58, 0x6c, 0xa4, 0xe2, 0xda,
+ 0xd6, 0xbe, 0x4c, 0xee, 0xda, 0x94, 0x30, 0x9c, 0x84, 0x85, 0x6c, 0x9a,
+ 0x21, 0xcd, 0x2b, 0xfe, 0x37, 0x3a, 0xfc, 0x9e, 0xda, 0x08, 0xd6, 0xbc,
+ 0x7c, 0xcf, 0x43, 0x70, 0x53, 0xfc, 0xca, 0x8b, 0xd1, 0x67, 0xeb, 0x32,
+ 0xa3, 0x39, 0xe5, 0xf6, 0x2a, 0xf3, 0x8b, 0x89, 0x2d, 0xf8, 0x22, 0x07,
+ 0x07, 0xd8, 0xfd, 0x62, 0x16, 0x27, 0x09, 0xa2, 0x01, 0x54, 0x18, 0x81,
+ 0x05, 0xc8, 0x6e, 0x6d, 0x08, 0xb8, 0xd1, 0x4a, 0x40, 0x57, 0xb9, 0xe1,
+ 0x30, 0x61, 0xc1, 0xfc, 0xeb, 0x8a, 0x77, 0xbd, 0x84, 0x69, 0x9f, 0x2b,
+ 0x64, 0x97, 0x1c, 0x15, 0x5f, 0x97, 0x9c, 0xdb, 0xc1, 0x21, 0xe3, 0x56,
+ 0xda, 0x16, 0x89, 0x8c, 0x0c, 0xf3, 0xa2, 0xa9, 0xca, 0xe5, 0x5d, 0xf2,
+ 0x4d, 0x8a, 0x65, 0x91, 0x32, 0x9d, 0x66, 0x8b, 0xa0, 0x62, 0x8b, 0x9b,
+ 0x6b, 0x8b, 0x6e, 0xcb, 0x8d, 0xb6, 0x75, 0x85, 0xa4, 0x8d, 0xf3, 0xb6,
+ 0x18, 0x3e, 0x60, 0xf6, 0x0b, 0xe2, 0x57, 0xaa, 0x29, 0x38, 0x23, 0x79,
+ 0x3c, 0x3e, 0x0e, 0xcd, 0x27, 0x6d, 0xe9, 0xb3, 0xb6, 0x54, 0x9f, 0x46,
+ 0x1b, 0x76, 0x03, 0x12, 0x32, 0xf8, 0x8b, 0xe8, 0x65, 0x96, 0x75, 0x67,
+ 0x73, 0x85, 0xb2, 0x50, 0x04, 0xf5, 0x69, 0x75, 0xb7, 0x84, 0x49, 0x2e,
+ 0xb5, 0xa9, 0x7c, 0xf7, 0x30, 0x3f, 0x86, 0x3f, 0x5d, 0x5b, 0x0d, 0xfc,
+ 0xbe, 0xf6, 0x50, 0xc4, 0x49, 0x80, 0xc1, 0x17, 0x03, 0x38, 0x60, 0x60,
+ 0x3e, 0x89, 0x40, 0x03, 0xa7, 0x9f, 0x11, 0xc8, 0x49, 0x6f, 0x77, 0x2f,
+ 0xe9, 0xd9, 0xd5, 0xe9, 0x0b, 0x41, 0xbe, 0x1b, 0x2a, 0x76, 0x46, 0xef,
+ 0x01, 0x8a, 0x60, 0x6c, 0xab, 0x48, 0x95, 0x37, 0xa4, 0x98, 0xad, 0x2b,
+ 0xb8, 0x6c, 0xdb, 0x80, 0x14, 0xc0, 0x07, 0x45, 0x80, 0xb0, 0xc2, 0xc9,
+ 0x0f, 0x7b, 0xbb, 0xbb, 0xf7, 0x42, 0xe7, 0x88, 0x81, 0xb8, 0x16, 0x41,
+ 0x07, 0x3c, 0x8a, 0x63, 0x0a, 0xb6, 0xd4, 0x3b, 0xcd, 0xa5, 0x8e, 0xa7,
+ 0x0b, 0x36, 0x66, 0x3e, 0x69, 0x91, 0x6c, 0xdc, 0x15, 0x64, 0x5e, 0xc7,
+ 0x08, 0x53, 0x84, 0xa3, 0x63, 0x58, 0xd8, 0x21, 0xcd, 0xb1, 0x3e, 0x68,
+ 0xbd, 0x13, 0x6d, 0xa6, 0x8c, 0x09, 0xe1, 0x25, 0xd1, 0xfa, 0x46, 0xc9,
+ 0xd7, 0x77, 0xce, 0x54, 0xf6, 0x3c, 0x44, 0x34, 0x2b, 0xba, 0x61, 0x32,
+ 0xff, 0xd1, 0x3a, 0xbc, 0xa2, 0x38, 0x3c, 0xce, 0xbf, 0x31, 0x63, 0xa1,
+ 0x61, 0x0d, 0x03, 0x5a, 0xd6, 0x34, 0x2a, 0xa1, 0x6c, 0xc4, 0x7d, 0x44,
+ 0x76, 0xb5, 0x69, 0x1d, 0xb4, 0x17, 0xf2, 0x3a, 0x05, 0xb1, 0x50, 0x59,
+ 0x8b, 0x64, 0xdc, 0x06, 0x3b, 0x6a, 0x27, 0x67, 0x3e, 0x6b, 0x6b, 0x06,
+ 0xa8, 0x38, 0x1e, 0x52, 0x5d, 0x71, 0x17, 0x4c, 0x01, 0xa5, 0xc8, 0xe0,
+ 0x5d, 0x64, 0xd9, 0x97, 0x85, 0xe7, 0xf2, 0x00, 0xc8, 0x16, 0x27, 0xc4,
+ 0x68, 0x09, 0x52, 0x07, 0xbe, 0xd5, 0x67, 0xac, 0x8a, 0x39, 0xaf, 0x37,
+ 0x7d, 0x56, 0x7a, 0x90, 0x4e, 0xb6, 0xea, 0xac, 0xe3, 0x3b, 0x61, 0xe7,
+ 0x49, 0x88, 0x16, 0xc1, 0x89, 0xb5, 0xce, 0x31, 0xc7, 0xf5, 0xd3, 0x94,
+ 0x34, 0x40, 0xca, 0x17, 0x6b, 0x6b, 0x46, 0x49, 0x18, 0x24, 0xd2, 0x83,
+ 0x1b, 0x79, 0xd4, 0x7c, 0xca, 0x51, 0x8d, 0xd2, 0x39, 0xde, 0x19, 0x5b,
+ 0x92, 0x57, 0x52, 0x3b, 0x94, 0x34, 0x30, 0x6d, 0xee, 0x16, 0x66, 0x46,
+ 0xad, 0x6d, 0xc6, 0x54, 0xe8, 0x84, 0xf4, 0x0a, 0x97, 0xcd, 0x93, 0x00,
+ 0x6e, 0xa9, 0x57, 0xe4, 0x32, 0xe6, 0xe1, 0x2d, 0x30, 0x19, 0xdf, 0x49,
+ 0x2e, 0xe8, 0x86, 0x6b, 0x4a, 0x0a, 0x53, 0xa3, 0x41, 0x69, 0x60, 0x1a,
+ 0x26, 0x74, 0x38, 0x54, 0x19, 0xbe, 0xaa, 0xbc, 0xd0, 0xf4, 0xc6, 0x55,
+ 0x6e, 0x4e, 0xb5, 0xd8, 0x20, 0xbc, 0xc4, 0xd5, 0x84, 0x81, 0x38, 0x1b,
+ 0xfd, 0x68, 0xb0, 0xd8, 0xd5, 0xdc, 0x73, 0x87, 0xc6, 0x1b, 0x6c, 0xb7,
+ 0xe2, 0x4f, 0x83, 0xa4, 0x75, 0x21, 0x54, 0x89, 0xe3, 0xbc, 0x76, 0x57,
+ 0x93, 0xce, 0xe7, 0x16, 0x75, 0xa0, 0xba, 0xfa, 0x34, 0xdc, 0x7c, 0xea,
+ 0x49, 0x35, 0xf0, 0x1b, 0xc2, 0xb8, 0x7c, 0x97, 0x74, 0x01, 0xaf, 0x09,
+ 0x27, 0xc0, 0x60, 0x97, 0xe3, 0xaa, 0x4a, 0x65, 0x91, 0x4c, 0x22, 0x68,
+ 0xba, 0x92, 0xf1, 0x96, 0xde, 0x51, 0x31, 0x8e, 0xfd, 0x34, 0x51, 0x77,
+ 0x80, 0x8b, 0x06, 0x8c, 0xc0, 0x92, 0xb4, 0x6d, 0xa1, 0x63, 0x6c, 0xe1,
+ 0xb4, 0xca, 0x97, 0x0d, 0xa7, 0x01, 0x48, 0xce, 0xf1, 0x7d, 0x2a, 0xd8,
+ 0xe5, 0xbc, 0x9c, 0xa4, 0x7c, 0x47, 0x6c, 0xca, 0x8f, 0x3a, 0x19, 0x5b,
+ 0x50, 0xbd, 0x60, 0x6f, 0x20, 0xcf, 0x48, 0xab, 0x01, 0xb3, 0xe4, 0xe1,
+ 0x01, 0xf5, 0x45, 0x47, 0xf0, 0x71, 0xdd, 0x07, 0xed, 0x27, 0x18, 0x15,
+ 0x6f, 0x78, 0x31, 0x90, 0xdb, 0xab, 0xc5, 0xca, 0x94, 0x31, 0x55, 0x7b,
+ 0x77, 0x2a, 0x50, 0x83, 0x08, 0x5d, 0x60, 0xb6, 0xca, 0xda, 0x09, 0x54,
+ 0x9b, 0x12, 0x9a, 0x95, 0x66, 0x6e, 0x94, 0xc4, 0x63, 0x31, 0xfa, 0x25,
+ 0x04, 0x1a, 0x4d, 0x0e, 0x02, 0x34, 0xae, 0x24, 0xf3, 0x0c, 0x8c, 0xc2,
+ 0x7f, 0x43, 0x85, 0x0b, 0x05, 0xa4, 0x92, 0x9b, 0x9c, 0x26, 0xa5, 0x7a,
+ 0x7b, 0xc5, 0x78, 0x03, 0x21, 0xc5, 0x5f, 0xb0, 0x8e, 0x46, 0x1e, 0x43,
+ 0x3e, 0x93, 0x35, 0x3b, 0xe3, 0xe3, 0x6b, 0xef, 0xb7, 0x38, 0x9a, 0xfd,
+ 0x74, 0x5c, 0x3c, 0x11, 0x5b, 0xab, 0xa1, 0xc7, 0xc3, 0xa5, 0xbe, 0x65,
+ 0x88, 0x45, 0x8a, 0xc2, 0x52, 0x8a, 0xf5, 0x13, 0x64, 0xa4, 0x36, 0xb2,
+ 0x63, 0x5e, 0x10, 0x2f, 0x58, 0xc3, 0x4d, 0x41, 0xea, 0xd7, 0xfc, 0x8e,
+ 0x6a, 0x35, 0xf8, 0xcc, 0x49, 0x03, 0x15, 0x37, 0xbd, 0x12, 0x54, 0xd6,
+ 0x4c, 0xbd, 0x5f, 0xce, 0xb2, 0x74, 0x1e, 0xeb, 0x13, 0x81, 0x09, 0xc3,
+ 0x6d, 0xca, 0xac, 0x0d, 0xe8, 0x21, 0x85, 0x84, 0x29, 0x24, 0xf5, 0x98,
+ 0x93, 0xef, 0x0a, 0x29, 0x94, 0xd6, 0x19, 0xd2, 0xad, 0x8a, 0x98, 0x86,
+ 0xe8, 0x5c, 0x43, 0x0f, 0x50, 0x49, 0xed, 0x54, 0x0a, 0xf5, 0x09, 0x07,
+ 0xce, 0x55, 0xa6, 0x90, 0xee, 0xff, 0xf6, 0xd8, 0x3e, 0x40, 0x14, 0x40,
+ 0x21, 0xf3, 0xee, 0x70, 0xe2, 0xba, 0xe4, 0x72, 0x49, 0x12, 0x32, 0x5a,
+ 0xcd, 0x80, 0x89, 0x71, 0xda, 0x09, 0x98, 0xe4, 0xb6, 0xdc, 0x43, 0x4e,
+ 0x6e, 0x60, 0xce, 0xb1, 0x0c, 0x4f, 0xfa, 0x3a, 0xd3, 0x84, 0x21, 0xb2,
+ 0x2d, 0xf8, 0x00, 0x1a, 0x5b, 0x43, 0x8a, 0xd1, 0x84, 0xcf, 0x30, 0x93,
+ 0xd9, 0xdf, 0xef, 0x01, 0x15, 0x91, 0x0e, 0xe1, 0x42, 0x63, 0x74, 0xd9,
+ 0xeb, 0xf4, 0x22, 0x53, 0x3c, 0x51, 0x61, 0xdf, 0xe5, 0xd4, 0x6c, 0x21,
+ 0xc5, 0x45, 0x09, 0xab, 0x07, 0xda, 0x51, 0x60, 0xb4, 0x32, 0xd7, 0x04,
+ 0x97, 0xb4, 0x22, 0x17, 0x17, 0x41, 0xd8, 0x6d, 0x3d, 0xcf, 0x97, 0xea,
+ 0x13, 0x1e, 0x24, 0x99, 0x64, 0xf3, 0x00, 0xf8, 0x97, 0x4e, 0x65, 0x35,
+ 0x8c, 0x58, 0x43, 0xb6, 0x8d, 0xb9, 0xa0, 0xc2, 0xce, 0xa1, 0xf8, 0x6f,
+ 0x75, 0x46, 0x7f, 0xbc, 0xbb, 0x47, 0x93, 0x7d, 0xbc, 0xfb, 0x6c, 0xbb,
+ 0x2d, 0x95, 0xe7, 0x75, 0x36, 0xa4, 0x5c, 0xae, 0xb8, 0x76, 0x7a, 0xde,
+ 0xf1, 0xbf, 0x93, 0x26, 0x8a, 0x97, 0x24, 0x01, 0x6c, 0xb6, 0xaa, 0x34,
+ 0x2b, 0x12, 0xed, 0xfb, 0x60, 0x2d, 0xd6, 0x57, 0x00, 0x23, 0x0c, 0xa4,
+ 0xbc, 0x7b, 0x87, 0x93, 0x48, 0x20, 0x93, 0x78, 0x9f, 0x52, 0x7a, 0x55,
+ 0x5a, 0x83, 0xf1, 0x3e, 0xd0, 0x73, 0x30, 0x13, 0x39, 0x1b, 0x38, 0xd6,
+ 0xc8, 0x53, 0x8d, 0x3c, 0xae, 0x14, 0x92, 0x80, 0x59, 0xbb, 0xd1, 0xae,
+ 0xe5, 0x3b, 0x6f, 0x72, 0x63, 0xd9, 0x5f, 0x51, 0x83, 0xde, 0xba, 0x4e,
+ 0x2f, 0xb3, 0xb0, 0xee, 0xdb, 0x30, 0x24, 0x63, 0x32, 0x71, 0x03, 0xb9,
+ 0x8a, 0x30, 0xd9, 0x91, 0x91, 0xc5, 0xfb, 0x2e, 0x75, 0x1c, 0xd2, 0x5d,
+ 0x8e, 0x00, 0xc3, 0xdc, 0x32, 0x63, 0xf4, 0x92, 0xd7, 0x5e, 0xeb, 0xc3,
+ 0xbe, 0xce, 0x87, 0xe8, 0xc3, 0x45, 0xc8, 0x51, 0xdc, 0x15, 0x87, 0xdb,
+ 0xe2, 0xc4, 0xfa, 0x9d, 0x18, 0x55, 0xdb, 0x1c, 0xee, 0xc9, 0xd8, 0xb0,
+ 0x20, 0xd7, 0xa5, 0x97, 0x32, 0xe3, 0xcc, 0xcf, 0x7e, 0x34, 0xba, 0xe8,
+ 0xe8, 0xb9, 0xfd, 0xf1, 0xf6, 0xc3, 0x5a, 0x25, 0xee, 0x77, 0x74, 0x33,
+ 0xa4, 0xa8, 0x8a, 0xfb, 0x9f, 0x4c, 0x95, 0x2f, 0xf9, 0x1f, 0x3d, 0xee,
+ 0x07, 0x2a, 0xc5, 0x4c, 0x8e, 0xde, 0xbe, 0x24, 0xa4, 0x25, 0x07, 0x7c,
+ 0xec, 0x27, 0x73, 0xf9, 0xa5, 0x6b, 0xd4, 0x37, 0x12, 0xaa, 0x6a, 0x14,
+ 0xf7, 0xce, 0x42, 0xd5, 0x72, 0x62, 0x5d, 0x0b, 0x84, 0x9c, 0xc3, 0x60,
+ 0x73, 0xb4, 0xc6, 0xc2, 0x35, 0x30, 0x1c, 0xf2, 0x38, 0xe3, 0x36, 0x31,
+ 0xc9, 0xe6, 0x57, 0x9b, 0x91, 0x22, 0xb7, 0xcd, 0x17, 0x1e, 0xea, 0x76,
+ 0xed, 0x5a, 0x50, 0x6d, 0x7e, 0x81, 0x5c, 0x5d, 0x60, 0x8c, 0xf0, 0x37,
+ 0xe5, 0x0c, 0x38, 0xed, 0x54, 0x02, 0x8c, 0x3d, 0x75, 0x4b, 0x02, 0x9b,
+ 0xd7, 0x4e, 0xd8, 0xe1, 0x96, 0xcf, 0x00, 0x24, 0xef, 0xac, 0x5b, 0xf5,
+ 0xb9, 0xcd, 0xa0, 0x08, 0x0e, 0x19, 0xed, 0x0c, 0x62, 0x23, 0x7d, 0xb1,
+ 0x5d, 0x03, 0x4f, 0x9e, 0x13, 0x4f, 0x86, 0xdc, 0x83, 0xd3, 0x69, 0x0e,
+ 0xcd, 0x85, 0xae, 0xbe, 0xf9, 0xe5, 0xe5, 0x65, 0x34, 0xab, 0xc8, 0x6c,
+ 0x01, 0x0e, 0x1e, 0x6b, 0xbe, 0xc8, 0xd2, 0x86, 0xf4, 0x0d, 0xc8, 0xf9,
+ 0xfe, 0x9c, 0x62, 0xa7, 0xbb, 0x47, 0x9e, 0xf1, 0x56, 0xf1, 0xc2, 0x2f,
+ 0xdb, 0x88, 0x53, 0x01, 0x11, 0x01, 0xd3, 0x00, 0x80, 0x2e, 0xe9, 0x67,
+ 0xd6, 0xff, 0x74, 0x91, 0x1a, 0xa2, 0xb8, 0x93, 0x58, 0xee, 0x9c, 0xd2,
+ 0xec, 0x99, 0x83, 0x64, 0x8b, 0x80, 0x87, 0xcd, 0x35, 0x63, 0x95, 0x13,
+ 0xbb, 0xd1, 0x45, 0x83, 0x73, 0x80, 0x13, 0x86, 0x9e, 0x07, 0x20, 0x9f,
+ 0xcd, 0x05, 0x4f, 0xb4, 0x95, 0x84, 0x4b, 0xf1, 0xee, 0x7a, 0x45, 0xfc,
+ 0x84, 0x6f, 0x51, 0x55, 0xd4, 0x06, 0xa4, 0x9c, 0x75, 0x61, 0x18, 0xbe,
+ 0x5f, 0xc8, 0xaf, 0xf1, 0xeb, 0xba, 0x05, 0xc9, 0x84, 0x30, 0xdc, 0x68,
+ 0x87, 0x2e, 0x09, 0x27, 0xda, 0x4f, 0x81, 0xee, 0x42, 0x4c, 0xa6, 0x4c,
+ 0xd0, 0x9e, 0x6c, 0xff, 0xd1, 0xe7, 0x9f, 0x8f, 0xa2, 0xf0, 0x9f, 0x5c,
+ 0xb5, 0x6c, 0x88, 0x10, 0x3b, 0xe5, 0xa0, 0x22, 0x07, 0x16, 0xf4, 0x17,
+ 0xdf, 0x07, 0x85, 0x31, 0xde, 0xfe, 0x02, 0x88, 0x3e, 0x60, 0x8e, 0xab,
+ 0x79, 0x68, 0xde, 0x53, 0xac, 0x6f, 0x01, 0xb5, 0x42, 0xb8, 0x18, 0xa9,
+ 0x57, 0xe0, 0x1a, 0x8b, 0xbc, 0x47, 0xa5, 0xcb, 0x24, 0x25, 0x8e, 0xb3,
+ 0x27, 0x05, 0x31, 0x4f, 0x52, 0x38, 0x39, 0x1b, 0xd6, 0x68, 0x0d, 0x94,
+ 0xfa, 0xcd, 0x89, 0x16, 0xbc, 0x1d, 0x9b, 0x3d, 0x55, 0x92, 0x9b, 0x89,
+ 0x86, 0x1b, 0x27, 0x99, 0x85, 0x1d, 0xe0, 0x9e, 0x53, 0x1d, 0x60, 0x18,
+ 0xae, 0xa4, 0x2e, 0x50, 0x2a, 0x85, 0x1e, 0x0f, 0xe6, 0x03, 0x9d, 0xe1,
+ 0xa8, 0x70, 0xf8, 0x32, 0x6b, 0xc2, 0xf2, 0x1e, 0x2f, 0xb1, 0x76, 0xcd,
+ 0xe0, 0x31, 0x9b, 0x48, 0xaa, 0x93, 0x92, 0x17, 0xe2, 0xbd, 0x4f, 0x66,
+ 0xf9, 0x85, 0x5e, 0x52, 0xdb, 0x17, 0xe1, 0x2b, 0x3a, 0x8d, 0x17, 0xb2,
+ 0xf5, 0x52, 0xad, 0xf7, 0x55, 0x14, 0xfa, 0x4b, 0xb2, 0x7b, 0x09, 0x87,
+ 0xaa, 0x69, 0x8c, 0x5a, 0xed, 0x78, 0x37, 0x25, 0x57, 0x13, 0xd2, 0x90,
+ 0x94, 0xb4, 0xf0, 0x06, 0x73, 0x9a, 0xe4, 0x3c, 0x86, 0x3d, 0xf1, 0xc2,
+ 0x0e, 0x2a, 0x4d, 0x3e, 0x90, 0xdf, 0x8e, 0xa9, 0xc4, 0x76, 0x42, 0xe1,
+ 0xbb, 0xc1, 0x1f, 0xcc, 0xd3, 0x81, 0xd5, 0x83, 0x77, 0xbd, 0x7d, 0x0a,
+ 0xcf, 0xde, 0x0f, 0x66, 0x09, 0xd0, 0x04, 0x6f, 0xb1, 0xcb, 0x8b, 0xf6,
+ 0xdd, 0xe5, 0xb2, 0x52, 0xeb, 0x2e, 0xed, 0x3a, 0x49, 0xb1, 0x54, 0x57,
+ 0xe0, 0x4c, 0x94, 0x75, 0x59, 0x66, 0x3c, 0x4b, 0x42, 0x9b, 0xd0, 0x5d,
+ 0x85, 0xaf, 0xb2, 0xa9, 0x56, 0x53, 0x28, 0x96, 0x64, 0x94, 0xd3, 0xa7,
+ 0x62, 0x7d, 0xa8, 0xa4, 0xeb, 0x9d, 0x5b, 0x31, 0x75, 0x8b, 0xa3, 0xf3,
+ 0xa2, 0x5d, 0x16, 0x9c, 0x3c, 0xb6, 0xf0, 0x04, 0x46, 0x91, 0x93, 0x42,
+ 0x87, 0xd1, 0x0e, 0xa6, 0x19, 0xb9, 0x5b, 0xea, 0xfc, 0x6f, 0xac, 0x94,
+ 0x49, 0x36, 0xad, 0xa2, 0x86, 0x91, 0x83, 0x23, 0x03, 0x8e, 0x7d, 0xf2,
+ 0x1a, 0xfd, 0x35, 0x59, 0x94, 0x83, 0xde, 0x02, 0x3e, 0xed, 0xe7, 0x7b,
+ 0xb3, 0x44, 0x82, 0x1a, 0x57, 0x65, 0x97, 0x2b, 0x48, 0x39, 0xda, 0xa7,
+ 0x2d, 0x45, 0x09, 0xd5, 0x27, 0x96, 0xf9, 0x92, 0x7a, 0x78, 0x18, 0x7b,
+ 0x2e, 0x48, 0x21, 0x37, 0x6f, 0x71, 0xe7, 0xcc, 0x55, 0x61, 0xb6, 0xab,
+ 0x59, 0x21, 0xf2, 0x27, 0x30, 0x29, 0x86, 0x7f, 0xfd, 0x85, 0x5c, 0x7f,
+ 0xa5, 0x2c, 0x9d, 0xdb, 0x51, 0xcc, 0xac, 0xe9, 0x9d, 0x5d, 0x04, 0xb6,
+ 0x4b, 0x46, 0xc9, 0x26, 0x84, 0xef, 0x85, 0xf4, 0x8d, 0x46, 0x19, 0x00,
+ 0xb7, 0x58, 0x83, 0x23, 0xe6, 0x0b, 0x84, 0x06, 0xa7, 0x99, 0x43, 0x37,
+ 0xa5, 0x4d, 0xa1, 0x24, 0xcf, 0xe0, 0x56, 0x13, 0x50, 0xa0, 0xea, 0x4e,
+ 0x3e, 0x7c, 0x24, 0x6b, 0x60, 0x08, 0x63, 0x62, 0xa9, 0x5c, 0xf5, 0x23,
+ 0x58, 0x38, 0x69, 0xcd, 0x55, 0x05, 0x75, 0xd8, 0x7a, 0x94, 0x84, 0x00,
+ 0x6b, 0xd5, 0x7f, 0xb1, 0x06, 0x2f, 0x38, 0x5f, 0x04, 0x55, 0x88, 0xe0,
+ 0x54, 0x0f, 0x38, 0x3b, 0x82, 0x1a, 0xb9, 0x09, 0x43, 0x53, 0xd3, 0x43,
+ 0xab, 0x86, 0x58, 0x45, 0xdc, 0x34, 0xac, 0x13, 0x7b, 0xbf, 0x29, 0x17,
+ 0x37, 0x06, 0x65, 0xe3, 0xec, 0x7c, 0x62, 0xd5, 0x7c, 0x4d, 0x2c, 0x00,
+ 0xa4, 0xe5, 0x21, 0x50, 0xa9, 0xaa, 0xd4, 0x70, 0xcc, 0xbf, 0x2c, 0x2f,
+ 0x7b, 0xb0, 0x06, 0xb9, 0x5b, 0x8c, 0xb1, 0x15, 0xc2, 0xf6, 0x54, 0x44,
+ 0x87, 0xc3, 0x37, 0x89, 0xcc, 0xe7, 0xcb, 0xaf, 0x5a, 0xc3, 0x69, 0x3f,
+ 0x07, 0x1f, 0xae, 0x5c, 0xa0, 0x2f, 0xa6, 0x97, 0xf9, 0x3d, 0x9b, 0xc0,
+ 0x58, 0xff, 0x36, 0x83, 0xb7, 0xbe, 0x2a, 0x33, 0x39, 0xbb, 0x82, 0x4c,
+ 0x60, 0xdb, 0x7d, 0xc8, 0xac, 0xab, 0x8e, 0x36, 0x9a, 0x50, 0x8d, 0xb7,
+ 0x7f, 0xda, 0x24, 0xd7, 0xff, 0xb3, 0xbc, 0x2a, 0xf0, 0x0f, 0x7c, 0x01,
+ 0x1f, 0xf8, 0x72, 0x6f, 0x2f, 0x3a, 0xf3, 0xde, 0xf9, 0xf2, 0x84, 0x75,
+ 0xc6, 0x10, 0x46, 0x92, 0x95, 0xe9, 0xf1, 0xb6, 0x96, 0xe9, 0x3f, 0xa2,
+ 0x62, 0xb2, 0xd0, 0xcd, 0x46, 0x77, 0x88, 0x60, 0xba, 0xbc, 0x57, 0x39,
+ 0xe1, 0x2d, 0xca, 0x12, 0x73, 0x2b, 0x1f, 0xe6, 0x21, 0xe6, 0x83, 0xd1,
+ 0xd5, 0x70, 0x24, 0xfd, 0x8b, 0xdf, 0x40, 0x78, 0xe6, 0xee, 0xcb, 0x17,
+ 0x57, 0xab, 0xcb, 0x8c, 0xf8, 0x66, 0x73, 0xdb, 0x6c, 0x3c, 0x68, 0xe5,
+ 0xf0, 0x52, 0xb0, 0x9b, 0x82, 0xa3, 0xe9, 0x8d, 0x97, 0x49, 0x48, 0x45,
+ 0x02, 0x2d, 0x15, 0x82, 0x03, 0xdf, 0xb0, 0x94, 0xb4, 0x0f, 0x7d, 0xb7,
+ 0xdc, 0x86, 0x95, 0xd1, 0x01, 0x6f, 0x9a, 0xc0, 0x41, 0xb8, 0x02, 0xf4,
+ 0x35, 0x2b, 0xb8, 0xc9, 0x26, 0x5f, 0x7e, 0x05, 0xdf, 0xd6, 0x2d, 0xc1,
+ 0xea, 0xb3, 0x56, 0x8b, 0xad, 0xdb, 0x21, 0x94, 0xfd, 0xc4, 0x5b, 0x44,
+ 0x77, 0x90, 0xb2, 0xea, 0x1f, 0xd6, 0x2b, 0xff, 0xf1, 0x86, 0xbc, 0x28,
+ 0xcb, 0xb5, 0x23, 0xaa, 0xef, 0x86, 0xf6, 0xc4, 0xcb, 0x1f, 0xe4, 0xac,
+ 0x3a, 0x57, 0xda, 0xc8, 0x04, 0x41, 0x72, 0xa6, 0x25, 0x2e, 0x63, 0xa5,
+ 0xe6, 0xf0, 0x90, 0x49, 0x27, 0x6f, 0x95, 0x38, 0x5f, 0x0e, 0xb4, 0xc2,
+ 0x26, 0xd2, 0x48, 0xc5, 0xad, 0x81, 0xaf, 0x23, 0x21, 0x03, 0xe1, 0xaf,
+ 0x5f, 0xd8, 0xd7, 0xf1, 0x1f, 0x73, 0x9b, 0x09, 0xa8, 0x7a, 0xcd, 0x6a,
+ 0x90, 0x76, 0xa7, 0xef, 0xec, 0x50, 0xf8, 0xc9, 0xb6, 0xda, 0xdd, 0x1c,
+ 0xb0, 0xa2, 0xfd, 0xc5, 0x26, 0xb9, 0x71, 0x35, 0x2e, 0x4c, 0x1d, 0x8c,
+ 0x88, 0xc7, 0xcd, 0xca, 0x40, 0xad, 0x45, 0x02, 0x24, 0xb7, 0x38, 0xa2,
+ 0xd9, 0xf7, 0x4c, 0x1c, 0x33, 0xd7, 0xa9, 0xff, 0xb4, 0x61, 0x27, 0xff,
+ 0xd3, 0x86, 0x9b, 0xfe, 0x4f, 0x1b, 0x6e, 0x01, 0x3f, 0x6d, 0x00, 0x9d,
+ 0x11, 0x8b, 0x08, 0x0d, 0xe2, 0x5f, 0x7a, 0xe8, 0x9b, 0xfc, 0x55, 0xf7,
+ 0x51, 0xef, 0x9b, 0xde, 0x27, 0x37, 0x36, 0xd7, 0x6d, 0x9a, 0x1f, 0x1b,
+ 0xca, 0x2f, 0x6c, 0x43, 0x53, 0xb7, 0x87, 0x86, 0x5d, 0xb7, 0xb6, 0xc9,
+ 0x6d, 0x0b, 0x8c, 0xb3, 0xa0, 0x77, 0xb5, 0xf7, 0x00, 0x76, 0x1c, 0xc6,
+ 0x2c, 0xf7, 0x6b, 0xf2, 0x7a, 0x11, 0x58, 0x70, 0x47, 0x3d, 0x07, 0xed,
+ 0x7a, 0x1c, 0xc8, 0x23, 0xfb, 0x7a, 0x20, 0x7f, 0xfe, 0xb7, 0xf9, 0x02,
+ 0xe9, 0xff, 0x34, 0x86, 0xdc, 0x6a, 0xc2, 0x75, 0x91, 0x64, 0x38, 0xca,
+ 0x53, 0x2e, 0x38, 0x6a, 0xc9, 0xe2, 0xef, 0x82, 0x8b, 0x7b, 0x98, 0x24,
+ 0x82, 0xf4, 0xf5, 0x45, 0x4e, 0x4d, 0xba, 0xcc, 0xaa, 0xe6, 0x6c, 0xa1,
+ 0xee, 0x40, 0x2a, 0x50, 0xba, 0x29, 0x75, 0xce, 0xaa, 0xc9, 0x44, 0x17,
+ 0xe3, 0xb5, 0xd5, 0x01, 0xab, 0x9f, 0xa4, 0xa1, 0x88, 0xcf, 0xcb, 0xaa,
+ 0xfe, 0x72, 0xa3, 0x42, 0xcf, 0xd3, 0xe4, 0xb2, 0x32, 0x1a, 0xec, 0x17,
+ 0x20, 0xad, 0x95, 0x39, 0x2c, 0x77, 0x4f, 0x6f, 0x87, 0x8b, 0x3b, 0x33,
+ 0xef, 0xcd, 0x5f, 0x44, 0x19, 0x1e, 0x4b, 0x9b, 0x51, 0xf0, 0xdc, 0x30,
+ 0xc7, 0x45, 0xd2, 0xcd, 0x1c, 0xe0, 0xab, 0xeb, 0x5d, 0x4a, 0xf9, 0xfd,
+ 0x97, 0x31, 0xf4, 0xb7, 0x60, 0x21, 0x1e, 0xe7, 0x25, 0x53, 0xed, 0xcb,
+ 0x93, 0xef, 0xbe, 0xd0, 0x01, 0x7e, 0xda, 0xf8, 0x71, 0xc8, 0x3f, 0xa5,
+ 0x32, 0xda, 0x83, 0xe4, 0xe4, 0x3b, 0x50, 0xf7, 0x2f, 0x63, 0x60, 0xeb,
+ 0x3e, 0xf0, 0x15, 0xff, 0x85, 0x28, 0x7b, 0xdd, 0xb0, 0xe7, 0x2e, 0xe3,
+ 0xe0, 0x4b, 0xb4, 0xee, 0xa5, 0xba, 0x1e, 0xb2, 0xc2, 0x97, 0x4b, 0x54,
+ 0xeb, 0x68, 0xd9, 0x68, 0xc3, 0x65, 0xa3, 0x14, 0x35, 0x4a, 0x27, 0x25,
+ 0x67, 0xdf, 0x37, 0x21, 0x64, 0x34, 0x41, 0xd6, 0xd2, 0xd9, 0x8a, 0xef,
+ 0x6a, 0x49, 0x8e, 0x0b, 0x52, 0x87, 0x75, 0x77, 0xe1, 0x2d, 0x24, 0x05,
+ 0xae, 0x65, 0xed, 0x1c, 0x46, 0x7a, 0x03, 0x38, 0xcc, 0x1f, 0xfe, 0x1b,
+ 0xe9, 0x65, 0xb6, 0x2b, 0x35, 0x9a, 0x8c, 0xa5, 0x55, 0xa6, 0x8d, 0x63,
+ 0xa4, 0x9b, 0x1d, 0x37, 0x2f, 0xfb, 0x22, 0x16, 0x0a, 0x90, 0xe8, 0xa4,
+ 0xe4, 0x7e, 0x5f, 0x94, 0x73, 0xe9, 0x5f, 0x5e, 0x1b, 0xaa, 0xe7, 0x03,
+ 0xb6, 0x0d, 0xe4, 0x8c, 0xc6, 0x81, 0xad, 0x90, 0x48, 0x85, 0x7c, 0x36,
+ 0xa2, 0x72, 0x48, 0x34, 0x91, 0xbd, 0x71, 0xd2, 0xd6, 0x8c, 0x70, 0xb4,
+ 0x98, 0xf0, 0xbf, 0x80, 0xd1, 0x3f, 0xc9, 0xc8, 0xf9, 0x64, 0xab, 0x23,
+ 0x87, 0xe2, 0x1c, 0x8e, 0x78, 0x70, 0x12, 0x7b, 0x6f, 0xf4, 0xe2, 0x70,
+ 0x1a, 0x84, 0x56, 0x48, 0x02, 0x60, 0xe9, 0x5b, 0xa8, 0x84, 0x92, 0x39,
+ 0xae, 0x0d, 0x5f, 0x20, 0x5e, 0xe2, 0x8b, 0xa5, 0x3b, 0xac, 0x6a, 0x44,
+ 0x78, 0xdb, 0x92, 0xdf, 0x89, 0x2f, 0x59, 0x1f, 0x4b, 0x45, 0xdf, 0x92,
+ 0xc3, 0x1a, 0x05, 0x2f, 0xfc, 0x28, 0x79, 0x3a, 0xc3, 0xbd, 0x03, 0xaf,
+ 0x79, 0x0f, 0xff, 0x2c, 0x3e, 0xbc, 0x8f, 0x8d, 0xa2, 0x01, 0xe2, 0x5a,
+ 0xb6, 0x7f, 0xcd, 0xf8, 0xfb, 0x76, 0xfc, 0xcf, 0x22, 0x70, 0x24, 0x0c,
+ 0x18, 0x12, 0xff, 0x2c, 0x50, 0x40, 0x25, 0x6b, 0x4b, 0xbd, 0xa8, 0xd6,
+ 0x93, 0xd1, 0xf2, 0x21, 0x28, 0x12, 0x32, 0x43, 0x95, 0x70, 0xb8, 0x21,
+ 0xec, 0x7d, 0xc0, 0x28, 0x8e, 0x64, 0x06, 0xd2, 0x3a, 0xcc, 0x36, 0x76,
+ 0x4d, 0x44, 0xe9, 0x4e, 0xcf, 0x84, 0x55, 0x2e, 0x80, 0x4c, 0x3a, 0x3b,
+ 0x70, 0xdd, 0x1e, 0x19, 0x5b, 0x21, 0xf7, 0x13, 0xda, 0x5d, 0xfd, 0x6a,
+ 0x50, 0x49, 0xd8, 0xc2, 0xfd, 0x0d, 0x3e, 0x65, 0x58, 0x31, 0x23, 0x12,
+ 0x91, 0x8d, 0x22, 0x37, 0x61, 0x6b, 0x53, 0x9c, 0x2a, 0xf8, 0x10, 0x9a,
+ 0x24, 0x52, 0x76, 0x12, 0xd5, 0x28, 0xa7, 0x04, 0x25, 0x21, 0xbe, 0x9c,
+ 0x61, 0x44, 0xeb, 0x38, 0x20, 0xd6, 0x6e, 0xef, 0x04, 0xe3, 0xe7, 0x10,
+ 0x7c, 0x8e, 0xda, 0xcd, 0x8c, 0x75, 0xd5, 0xc2, 0xcc, 0x09, 0x8d, 0x64,
+ 0x6f, 0x8b, 0x65, 0x30, 0xb6, 0x4d, 0x29, 0x45, 0x50, 0x2e, 0xc5, 0xe6,
+ 0x97, 0xdb, 0x9b, 0x76, 0x69, 0xfd, 0x66, 0x91, 0xda, 0x31, 0xb6, 0x2d,
+ 0xa2, 0x06, 0x21, 0x6d, 0x07, 0x54, 0xf2, 0x2c, 0x2d, 0x90, 0xfb, 0x90,
+ 0x0d, 0xe9, 0x40, 0xa3, 0xc0, 0x72, 0x75, 0x23, 0xde, 0x4e, 0x98, 0x58,
+ 0x05, 0xdd, 0x4e, 0x86, 0x40, 0x61, 0x12, 0x4f, 0xe7, 0x0d, 0xb2, 0xe3,
+ 0xa9, 0x7e, 0x81, 0x41, 0xf0, 0xea, 0x03, 0x4f, 0x1f, 0x8f, 0x5c, 0x4f,
+ 0x04, 0x72, 0xa8, 0xb7, 0x80, 0xb8, 0x44, 0x3c, 0x8f, 0xc6, 0x3a, 0xd5,
+ 0x7b, 0xf3, 0xcb, 0x2d, 0x16, 0x58, 0xce, 0x9f, 0xe6, 0x7d, 0x7b, 0x33,
+ 0xf9, 0x29, 0x5e, 0x4a, 0x9a, 0xf0, 0xbb, 0x9e, 0x85, 0x20, 0x64, 0x7b,
+ 0xdf, 0x1b, 0xc9, 0x8b, 0x49, 0x39, 0xbb, 0xfb, 0x23, 0x85, 0x9d, 0xe4,
+ 0x95, 0x17, 0x3b, 0xf4, 0xa3, 0x8e, 0xca, 0xdc, 0x37, 0x10, 0x8d, 0x62,
+ 0x8e, 0x8a, 0xfe, 0xfc, 0x0a, 0x8f, 0xab, 0xc5, 0xb0, 0x99, 0x8c, 0x46,
+ 0x86, 0x09, 0xd5, 0x0b, 0xea, 0x52, 0xb5, 0x46, 0xb0, 0x30, 0x0c, 0x1c,
+ 0x89, 0x58, 0x28, 0x29, 0x82, 0xe4, 0x41, 0x9e, 0x1d, 0xb5, 0xb2, 0xd9,
+ 0x09, 0xc9, 0xbf, 0xaa, 0xbe, 0x1c, 0x25, 0x2f, 0x6d, 0x96, 0x4c, 0x16,
+ 0x81, 0x8e, 0xc6, 0x35, 0x66, 0xd9, 0xe1, 0x55, 0x61, 0x7f, 0x3e, 0xc9,
+ 0xc5, 0xcd, 0x3e, 0x2b, 0x5b, 0x70, 0x94, 0x0c, 0x75, 0x60, 0x84, 0x7b,
+ 0x1c, 0x40, 0x6c, 0x5a, 0x56, 0x1c, 0x23, 0x62, 0x77, 0xba, 0xb5, 0x5f,
+ 0x64, 0x6a, 0xc3, 0x43, 0xc1, 0xab, 0x52, 0x36, 0x3a, 0x48, 0x9e, 0xd9,
+ 0x2f, 0x45, 0x20, 0xdc, 0xd9, 0xe2, 0xaf, 0x93, 0xcf, 0x87, 0x78, 0xca,
+ 0xeb, 0x93, 0x2a, 0x74, 0xdf, 0xce, 0xe0, 0x18, 0x88, 0x52, 0x38, 0xa4,
+ 0xc4, 0xa4, 0x48, 0x0d, 0x0c, 0x49, 0x82, 0x49, 0x5a, 0x67, 0x4f, 0x1f,
+ 0xab, 0x7a, 0xc9, 0xbb, 0x54, 0xab, 0xff, 0xb6, 0xe5, 0x84, 0x65, 0x39,
+ 0xe4, 0x2d, 0xa8, 0x7b, 0x11, 0xa8, 0x94, 0x17, 0xca, 0x19, 0x7a, 0x62,
+ 0x71, 0xde, 0x2b, 0xa4, 0xa9, 0x51, 0x24, 0x2f, 0x1b, 0x2a, 0xe2, 0x79,
+ 0xf6, 0xd4, 0x9b, 0xf4, 0x3d, 0xee, 0x8a, 0x0e, 0x27, 0x95, 0x15, 0x76,
+ 0x57, 0xa4, 0xf6, 0xfa, 0x22, 0xec, 0x68, 0x4a, 0xce, 0x5b, 0xc6, 0xe3,
+ 0x92, 0x35, 0x5a, 0x07, 0xe3, 0x7d, 0xd7, 0xc8, 0xbf, 0x04, 0x5f, 0x28,
+ 0xe1, 0x74, 0x3f, 0xbd, 0x96, 0xa8, 0x3d, 0x13, 0x49, 0xdf, 0xe7, 0x49,
+ 0x30, 0x61, 0xdf, 0x4f, 0xd7, 0x08, 0x22, 0x5c, 0xac, 0x2a, 0x92, 0x3e,
+ 0xf2, 0x18, 0x2b, 0x09, 0x5a, 0x1a, 0x24, 0x7a, 0xfa, 0xdb, 0x97, 0xef,
+ 0xde, 0xbf, 0x3c, 0x7e, 0x78, 0xb3, 0x9c, 0x56, 0xff, 0xb5, 0xd1, 0xfa,
+ 0xc6, 0x6d, 0xae, 0x1a, 0x38, 0x40, 0xc0, 0x39, 0xd2, 0x3e, 0x39, 0xfc,
+ 0xcf, 0x73, 0xaa, 0x40, 0x0e, 0x02, 0x88, 0x84, 0x26, 0xd0, 0xcd, 0xd6,
+ 0x43, 0x9d, 0x16, 0xe8, 0x0a, 0x49, 0x22, 0x71, 0x64, 0x1c, 0xce, 0xbc,
+ 0x95, 0x10, 0xb9, 0x97, 0xb9, 0x99, 0xd6, 0xd2, 0xaa, 0x70, 0x43, 0xdf,
+ 0xc7, 0xeb, 0x1b, 0x92, 0xaf, 0x6d, 0x4b, 0xb3, 0x63, 0x54, 0x6e, 0x6b,
+ 0xc9, 0x6d, 0xea, 0x95, 0xb6, 0x73, 0x16, 0x81, 0xd6, 0xf2, 0xbe, 0x95,
+ 0x17, 0x17, 0x0e, 0x88, 0xa6, 0x1b, 0xe1, 0x7b, 0xf5, 0xaa, 0xbf, 0xca,
+ 0xf5, 0x53, 0x82, 0x88, 0x76, 0x92, 0xc0, 0x69, 0x1b, 0x1d, 0x77, 0x1f,
+ 0x36, 0x25, 0x97, 0x80, 0xbf, 0x90, 0xb9, 0xc5, 0x77, 0xd5, 0x4c, 0xd0,
+ 0xaf, 0xd6, 0x57, 0x15, 0x97, 0xba, 0xb0, 0x8e, 0x0f, 0xcf, 0x68, 0xb3,
+ 0x4e, 0x5f, 0x8e, 0xc7, 0x56, 0x16, 0xd6, 0x92, 0x96, 0x30, 0x08, 0x8c,
+ 0x31, 0x52, 0x23, 0xfd, 0x6e, 0x20, 0xa3, 0xc4, 0x36, 0x50, 0x95, 0x74,
+ 0x4e, 0x8a, 0xfd, 0x18, 0x9b, 0xef, 0x7c, 0xb5, 0x30, 0x17, 0xc6, 0x68,
+ 0xbc, 0xb3, 0xcd, 0x5a, 0x42, 0xb1, 0x5d, 0xc2, 0x03, 0xe7, 0x12, 0x4d,
+ 0x8a, 0xce, 0x1a, 0xb4, 0x87, 0xb3, 0x1f, 0x6b, 0x0c, 0x09, 0x5c, 0x9e,
+ 0x83, 0xd7, 0x3e, 0xf2, 0xeb, 0x20, 0xee, 0x4c, 0xdf, 0x18, 0x1f, 0x9d,
+ 0x1f, 0x9a, 0xed, 0x7b, 0x7f, 0xfe, 0xed, 0x86, 0xa4, 0x2e, 0x74, 0x61,
+ 0x27, 0xc8, 0x69, 0x8f, 0xce, 0xa7, 0xd7, 0xb6, 0x38, 0xb5, 0x62, 0x47,
+ 0x8a, 0xb1, 0x16, 0x62, 0x1a, 0xb8, 0xfb, 0xe8, 0x68, 0xcd, 0x29, 0x3d,
+ 0x19, 0x3d, 0xe9, 0x9e, 0x52, 0x3f, 0x8a, 0x33, 0xe3, 0xfa, 0x06, 0xe4,
+ 0x2e, 0x60, 0xc1, 0xc8, 0x9e, 0xda, 0x71, 0x3d, 0x45, 0x28, 0xc8, 0x46,
+ 0xa0, 0x33, 0x94, 0xb5, 0x1b, 0x01, 0x95, 0x53, 0x84, 0x3d, 0x2f, 0x2e,
+ 0x4e, 0x90, 0xc6, 0x16, 0x85, 0x47, 0xbc, 0xbd, 0x1c, 0x0e, 0x35, 0x27,
+ 0x96, 0x56, 0x33, 0x5b, 0x89, 0x19, 0xea, 0x87, 0x9a, 0xeb, 0x87, 0x4e,
+ 0x45, 0x86, 0x04, 0xb4, 0x53, 0x49, 0xab, 0x3e, 0x36, 0x6c, 0x39, 0xe0,
+ 0xf2, 0xf9, 0xe2, 0x18, 0xd3, 0xe4, 0x45, 0xa7, 0xe6, 0x25, 0x16, 0x2c,
+ 0x79, 0x6d, 0xf6, 0x63, 0x1c, 0x16, 0x19, 0xfb, 0x2a, 0xf9, 0x22, 0x2f,
+ 0xf8, 0xcf, 0x38, 0xbd, 0x93, 0xc8, 0xad, 0xca, 0x39, 0x3b, 0x10, 0xe5,
+ 0x0d, 0x4e, 0xe2, 0xe4, 0x0a, 0x13, 0x5b, 0xf9, 0x90, 0x52, 0x08, 0x94,
+ 0xec, 0x13, 0x6a, 0xe7, 0x1d, 0x76, 0xa3, 0xda, 0x1a, 0x6f, 0x5b, 0x4f,
+ 0xeb, 0x39, 0x45, 0x14, 0x69, 0xb4, 0x48, 0xe1, 0x90, 0x07, 0x38, 0x28,
+ 0xea, 0x65, 0x0c, 0xf4, 0xc6, 0xbb, 0xbd, 0xa1, 0xc5, 0x44, 0x8c, 0x7a,
+ 0x7a, 0x33, 0xeb, 0x81, 0x70, 0x23, 0xb7, 0x16, 0x25, 0x91, 0x91, 0x0d,
+ 0xc8, 0x65, 0x4a, 0xaf, 0x7e, 0x78, 0xed, 0xf5, 0xa0, 0xd1, 0x3c, 0x35,
+ 0xa6, 0x17, 0x51, 0x48, 0xfb, 0x40, 0xd2, 0x32, 0x97, 0x6c, 0x39, 0xa2,
+ 0xa0, 0xea, 0x2c, 0xcb, 0x96, 0x16, 0xf1, 0x3b, 0xa7, 0xba, 0x96, 0xbc,
+ 0xa6, 0x20, 0xaa, 0xa0, 0xad, 0x53, 0x97, 0xb5, 0x9e, 0xd9, 0x09, 0xeb,
+ 0xb0, 0x35, 0x95, 0xf8, 0x7f, 0xf4, 0xd4, 0x42, 0x18, 0x77, 0xef, 0xd9,
+ 0xa3, 0xcf, 0x8d, 0x6c, 0xbe, 0x23, 0x08, 0x6e, 0xb7, 0x65, 0x0c, 0x91,
+ 0xdb, 0x0f, 0x7f, 0x27, 0x46, 0x8d, 0xa6, 0xf7, 0x0a, 0x82, 0x41, 0x52,
+ 0xc3, 0x8c, 0x20, 0x07, 0x95, 0xd4, 0x13, 0x87, 0xf0, 0x2f, 0x66, 0x13,
+ 0x65, 0xc3, 0x24, 0xe9, 0x8e, 0xf6, 0x89, 0x13, 0xc4, 0x46, 0x1e, 0x01,
+ 0xa3, 0x6f, 0x07, 0x1a, 0x8c, 0x19, 0x96, 0x72, 0x76, 0x78, 0x7e, 0x66,
+ 0xfe, 0x18, 0x9f, 0x9f, 0x9c, 0xf5, 0x00, 0x16, 0x36, 0x8c, 0x8c, 0x81,
+ 0x4d, 0xd3, 0x74, 0x15, 0xda, 0xe6, 0x36, 0x98, 0x19, 0x65, 0x42, 0x33,
+ 0xdb, 0xa9, 0xa3, 0xf8, 0x57, 0x1e, 0x0c, 0x56, 0x3d, 0x6a, 0x2d, 0xf4,
+ 0xc2, 0xc8, 0x87, 0xb5, 0x0b, 0xe3, 0x33, 0x5f, 0x4f, 0x21, 0xb4, 0x60,
+ 0x10, 0x23, 0x56, 0x6c, 0x19, 0x3d, 0xcd, 0xd6, 0x18, 0x6d, 0x70, 0xfe,
+ 0x3b, 0x74, 0x77, 0xed, 0xda, 0xdc, 0x03, 0xf2, 0xc7, 0xa9, 0xb9, 0xdc,
+ 0xb3, 0xc4, 0x35, 0x31, 0x37, 0x9c, 0x56, 0xcb, 0xef, 0x37, 0x92, 0x2d,
+ 0x72, 0x20, 0x8b, 0x5e, 0x72, 0x0f, 0xfd, 0x1a, 0x5d, 0x68, 0xdb, 0x2d,
+ 0xb8, 0x2e, 0x17, 0x19, 0x7b, 0xf8, 0x39, 0x39, 0x57, 0x99, 0x13, 0xcb,
+ 0x16, 0x86, 0x6b, 0x4d, 0x62, 0x10, 0x14, 0x16, 0x59, 0x0b, 0xa7, 0xbc,
+ 0x69, 0x6b, 0xf8, 0x4b, 0xa1, 0x0e, 0x3e, 0x97, 0xcc, 0x58, 0xaa, 0x0d,
+ 0x41, 0x96, 0x6d, 0xea, 0xac, 0x3c, 0xc8, 0xad, 0x36, 0xf3, 0xde, 0xeb,
+ 0x32, 0x19, 0xe0, 0x20, 0xc4, 0x39, 0x0b, 0xb5, 0x97, 0x6b, 0xe1, 0x2f,
+ 0x68, 0x8e, 0x0d, 0xe9, 0x12, 0x7e, 0x5b, 0xcd, 0x53, 0x79, 0x2a, 0x1a,
+ 0x56, 0xa3, 0x72, 0x41, 0xe0, 0x67, 0x58, 0xda, 0x96, 0x23, 0xe7, 0x10,
+ 0xcd, 0xaa, 0xcb, 0x74, 0x5b, 0xfa, 0x5c, 0xc8, 0x66, 0x55, 0x69, 0x4b,
+ 0x5c, 0xa3, 0xa2, 0x4e, 0x81, 0xfc, 0x9a, 0x6e, 0x58, 0xbf, 0x39, 0x68,
+ 0x4d, 0xf2, 0xbe, 0x10, 0xb0, 0x96, 0xc2, 0xd8, 0x16, 0x94, 0xff, 0x30,
+ 0xb3, 0x9b, 0x06, 0x0c, 0x23, 0xa4, 0x6d, 0xb1, 0xd0, 0x9a, 0x95, 0xac,
+ 0xd0, 0x13, 0xd4, 0x71, 0x88, 0x85, 0x47, 0x3e, 0x64, 0xca, 0x26, 0x50,
+ 0x49, 0x23, 0xe3, 0x39, 0xbb, 0x64, 0xda, 0x74, 0x57, 0x4a, 0xc0, 0x0a,
+ 0xc1, 0x42, 0x4f, 0xfd, 0x43, 0x63, 0x96, 0x46, 0xd6, 0x8f, 0xe3, 0x05,
+ 0x0d, 0xe3, 0x1b, 0xb4, 0x60, 0x2a, 0x64, 0xad, 0xd1, 0x5c, 0xf1, 0x42,
+ 0x40, 0x24, 0xb4, 0x47, 0x7c, 0x0b, 0x9d, 0x41, 0xd5, 0xc0, 0xd1, 0x1a,
+ 0xd4, 0x2f, 0x1f, 0xcc, 0xa1, 0x45, 0x92, 0xed, 0x12, 0xf9, 0xf6, 0xea,
+ 0x7a, 0x8b, 0x6d, 0x89, 0x40, 0xcf, 0x70, 0x64, 0x0a, 0xd4, 0xa8, 0xb4,
+ 0x95, 0x17, 0x39, 0xc0, 0x7b, 0xca, 0x6a, 0x07, 0x55, 0x2a, 0x80, 0xb2,
+ 0x33, 0x56, 0x65, 0x39, 0xa7, 0x8e, 0x37, 0xaa, 0xba, 0xc5, 0xfa, 0x14,
+ 0x93, 0x0a, 0xc6, 0xf5, 0x97, 0x66, 0xf0, 0x76, 0xe7, 0x59, 0xaf, 0x87,
+ 0x1b, 0xa4, 0xa9, 0x87, 0xd4, 0x30, 0x8a, 0x75, 0x49, 0xe3, 0x8c, 0x10,
+ 0xca, 0x78, 0x6c, 0xab, 0x63, 0xda, 0xb1, 0x53, 0x7b, 0x6e, 0xd0, 0xb9,
+ 0x92, 0xca, 0x47, 0xf9, 0xf7, 0x3d, 0xe5, 0x75, 0xda, 0xef, 0x84, 0xf0,
+ 0x98, 0xcc, 0xae, 0x0c, 0x38, 0x3b, 0xa4, 0x7d, 0x33, 0xc9, 0x72, 0x68,
+ 0x7f, 0xad, 0xce, 0x9a, 0xd5, 0x32, 0x94, 0xf3, 0xae, 0xe0, 0xd3, 0x8e,
+ 0xa8, 0x41, 0x51, 0x6f, 0x8a, 0x00, 0x32, 0x70, 0xdb, 0xef, 0x83, 0xd6,
+ 0x77, 0x6f, 0x23, 0x69, 0x02, 0x81, 0x74, 0xef, 0x2b, 0xbe, 0x57, 0xf1,
+ 0x82, 0xbe, 0xb9, 0xc9, 0x86, 0xd1, 0x2f, 0x76, 0x37, 0x48, 0x83, 0xd6,
+ 0xc6, 0x07, 0x82, 0x0f, 0xa6, 0x6f, 0x9b, 0x7d, 0xf1, 0xe6, 0x1b, 0xde,
+ 0x19, 0xad, 0x47, 0x91, 0x3a, 0x42, 0x9c, 0xce, 0x16, 0x5a, 0xb4, 0xd3,
+ 0xfd, 0xdd, 0xfe, 0xac, 0x77, 0xe9, 0x6b, 0x66, 0xb5, 0xb1, 0xf7, 0x7c,
+ 0x7f, 0xb4, 0xf7, 0xf4, 0xf3, 0xd1, 0x1e, 0x35, 0x78, 0xf5, 0xe6, 0xe6,
+ 0x1a, 0x91, 0x7a, 0x03, 0x45, 0xda, 0xdc, 0x26, 0xfd, 0x40, 0xb7, 0xfc,
+ 0x85, 0xc5, 0xdd, 0x08, 0xcf, 0x8d, 0xb8, 0xd9, 0x4c, 0xf0, 0x8d, 0x85,
+ 0xd1, 0x69, 0xf2, 0x22, 0x88, 0x83, 0x0c, 0x5d, 0x56, 0x11, 0xd3, 0xe2,
+ 0x32, 0x07, 0x19, 0x29, 0xf8, 0xa4, 0xb7, 0x4f, 0xda, 0x27, 0xcf, 0xf6,
+ 0xfd, 0xa0, 0xdb, 0x19, 0x9f, 0x91, 0xb2, 0xf4, 0xa9, 0xa8, 0x91, 0x8e,
+ 0xab, 0xdb, 0xef, 0x07, 0x6c, 0xf3, 0x17, 0x5b, 0x7d, 0x40, 0x4d, 0xb1,
+ 0x97, 0xae, 0x8b, 0x96, 0x43, 0xa8, 0x4a, 0x5d, 0x60, 0x1e, 0xc1, 0x59,
+ 0xe1, 0x07, 0x7d, 0x0c, 0xab, 0x44, 0x9b, 0x0e, 0xeb, 0x70, 0x04, 0x37,
+ 0xe4, 0x2a, 0x71, 0x6c, 0x5f, 0x37, 0x1d, 0x59, 0x83, 0xe7, 0x5d, 0x04,
+ 0x25, 0x8b, 0x6c, 0xc4, 0x4c, 0x5a, 0x87, 0xc3, 0x3b, 0x7f, 0xf8, 0x83,
+ 0xe3, 0x48, 0xdc, 0x6d, 0x9c, 0x5a, 0x5c, 0x3c, 0x21, 0x04, 0x53, 0x8e,
+ 0x55, 0x33, 0x58, 0xfe, 0xc6, 0xc1, 0x9f, 0xc9, 0x39, 0xfc, 0xf3, 0xf0,
+ 0xcf, 0xe6, 0x9f, 0x3f, 0x6f, 0xe8, 0xa5, 0x66, 0x30, 0x2c, 0x57, 0x30,
+ 0xe2, 0x10, 0x07, 0xe9, 0x80, 0x06, 0x49, 0xbb, 0x5b, 0x2b, 0x69, 0x06,
+ 0xe7, 0xaf, 0x4e, 0xf9, 0x32, 0x56, 0x1c, 0xf6, 0x26, 0x6a, 0x06, 0x1f,
+ 0x22, 0xb5, 0x1e, 0x2c, 0x9c, 0x1a, 0x4d, 0x30, 0x9d, 0xd8, 0xbd, 0xf4,
+ 0x5e, 0x19, 0xb8, 0xa4, 0x86, 0x1b, 0xe6, 0x00, 0xa9, 0xd1, 0x6f, 0x2f,
+ 0xe1, 0x5f, 0xe1, 0x2a, 0x70, 0xc3, 0x77, 0x55, 0x91, 0x96, 0x46, 0xba,
+ 0x40, 0xd2, 0x32, 0x6c, 0xc0, 0x5e, 0x87, 0x1b, 0x33, 0xa5, 0x41, 0x22,
+ 0xa8, 0xb0, 0x5c, 0x1b, 0xd1, 0x28, 0x78, 0x61, 0x01, 0x43, 0x45, 0xb9,
+ 0x6d, 0x95, 0xd7, 0x1f, 0xb1, 0x3e, 0x29, 0xf3, 0xf1, 0x72, 0x85, 0x30,
+ 0x9f, 0xcf, 0xac, 0xd6, 0x77, 0xa7, 0x30, 0x31, 0xb6, 0x70, 0xcf, 0xdb,
+ 0x59, 0x27, 0x1d, 0xf4, 0xd8, 0x15, 0x4e, 0x20, 0x8a, 0x74, 0x25, 0x8f,
+ 0x55, 0xd9, 0x03, 0x00, 0xd8, 0x24, 0x15, 0xe6, 0xd4, 0xe8, 0xb9, 0x96,
+ 0x34, 0x3c, 0x30, 0x24, 0x54, 0x91, 0x83, 0x58, 0x20, 0xfd, 0xb6, 0xbb,
+ 0x52, 0x0b, 0x8d, 0x5b, 0xe0, 0x28, 0x66, 0x50, 0x26, 0x0b, 0x29, 0x46,
+ 0xad, 0xa4, 0x50, 0x3e, 0x51, 0x99, 0x69, 0xcc, 0x06, 0x5a, 0x0f, 0xcf,
+ 0x37, 0x03, 0x41, 0x5e, 0xd5, 0xe9, 0x3e, 0x8b, 0xda, 0x0a, 0x74, 0xd1,
+ 0x9c, 0x32, 0x3a, 0x67, 0x9f, 0x3a, 0x36, 0x9f, 0x76, 0x1d, 0x7f, 0x1a,
+ 0x6e, 0xad, 0x8d, 0xc6, 0x6e, 0x0a, 0xea, 0x1a, 0x9c, 0x84, 0x06, 0x0d,
+ 0x4d, 0x7f, 0x11, 0x43, 0xae, 0xf5, 0x84, 0xea, 0xfe, 0x6e, 0xe8, 0x4a,
+ 0x41, 0x2f, 0x64, 0xda, 0xe4, 0x61, 0xbe, 0xbc, 0x7f, 0x03, 0x71, 0x6c,
+ 0x8a, 0xc6, 0xdb, 0xe2, 0x2c, 0x56, 0xc2, 0xd4, 0xab, 0xcb, 0x4b, 0x42,
+ 0xa2, 0x08, 0x33, 0xf3, 0xa8, 0x62, 0x51, 0x0a, 0x07, 0x04, 0xe6, 0xdf,
+ 0x30, 0x72, 0x9a, 0xb9, 0xee, 0x86, 0x2b, 0x8b, 0x14, 0x86, 0x53, 0xbb,
+ 0x86, 0x1d, 0xbd, 0xa5, 0xb3, 0x68, 0xf1, 0x26, 0xd7, 0xdb, 0x69, 0x32,
+ 0x55, 0x36, 0xd4, 0x89, 0x76, 0xf9, 0x20, 0x52, 0x83, 0x82, 0x0c, 0x58,
+ 0xe6, 0x88, 0xe4, 0x6b, 0xe8, 0xe7, 0x7d, 0x6b, 0xdd, 0x8d, 0xf0, 0xb0,
+ 0x59, 0x20, 0x29, 0x84, 0x91, 0x18, 0x36, 0x8f, 0x71, 0xcf, 0x2a, 0x0b,
+ 0x24, 0xc5, 0x7a, 0xa5, 0xf0, 0xa3, 0xae, 0xd4, 0xbc, 0xa0, 0xed, 0x58,
+ 0xe7, 0x17, 0x70, 0xac, 0xd0, 0xd7, 0x96, 0x1e, 0x8f, 0xf6, 0x83, 0x83,
+ 0xad, 0xe7, 0xc3, 0xe9, 0x74, 0x3a, 0x24, 0x3d, 0xe0, 0x05, 0x2b, 0x27,
+ 0x3b, 0xa2, 0x1c, 0xf4, 0xf8, 0x0c, 0xc6, 0x99, 0xec, 0xf7, 0xab, 0x57,
+ 0xaf, 0x44, 0x8f, 0x39, 0xbf, 0xea, 0x68, 0x14, 0x16, 0xe4, 0x49, 0x34,
+ 0xaa, 0x58, 0xf7, 0xbf, 0xfa, 0x6a, 0xd5, 0xcc, 0xa8, 0x49, 0x30, 0x58,
+ 0x86, 0xb2, 0x5e, 0x5b, 0x23, 0xdb, 0x01, 0xe2, 0x44, 0xaf, 0xf6, 0x81,
+ 0xcb, 0x4c, 0x34, 0x63, 0x07, 0x47, 0xb3, 0xe4, 0xbe, 0x20, 0xf4, 0xa2,
+ 0x8c, 0xdd, 0xed, 0x3c, 0xca, 0x53, 0xf5, 0xd1, 0xb2, 0x74, 0x82, 0x75,
+ 0x2c, 0x93, 0x4d, 0x47, 0xa1, 0xcf, 0xa6, 0xb9, 0x64, 0x80, 0xa5, 0xf2,
+ 0xad, 0xee, 0xd8, 0xf7, 0x9c, 0x87, 0x6c, 0x75, 0xfb, 0x48, 0x9e, 0xf6,
+ 0x1e, 0x49, 0x74, 0xf3, 0x61, 0x55, 0x61, 0xdb, 0xb7, 0x5e, 0x11, 0x8a,
+ 0xe7, 0x2b, 0xb9, 0x10, 0xaf, 0xae, 0x90, 0xbf, 0x45, 0xc8, 0x16, 0x66,
+ 0xca, 0x35, 0x33, 0x01, 0x91, 0x1f, 0xe3, 0xf1, 0xf1, 0xce, 0xf9, 0xf1,
+ 0x38, 0xc8, 0x78, 0xbf, 0x83, 0xcb, 0x98, 0x7b, 0x4b, 0xb7, 0x5c, 0x9e,
+ 0xbc, 0x45, 0x84, 0x99, 0x5c, 0x5e, 0xb4, 0x29, 0x9c, 0xbf, 0x12, 0x85,
+ 0x18, 0x59, 0x15, 0x5a, 0x0c, 0x63, 0x65, 0x77, 0x91, 0x15, 0x54, 0x44,
+ 0x0e, 0x11, 0x4e, 0x37, 0x80, 0x12, 0x62, 0xeb, 0xe4, 0xdd, 0xcb, 0x73,
+ 0x94, 0xb7, 0x34, 0x92, 0xe2, 0x01, 0x17, 0x50, 0xe8, 0x19, 0xbf, 0xb1,
+ 0xb8, 0x04, 0x14, 0xb5, 0x49, 0xa7, 0xae, 0x47, 0x88, 0x2a, 0xeb, 0x7c,
+ 0x7c, 0xb5, 0x12, 0xde, 0xba, 0xed, 0x37, 0x5b, 0x2a, 0xd2, 0xa1, 0x4b,
+ 0xf3, 0xdd, 0xd3, 0xd8, 0x8b, 0x9e, 0x06, 0x6f, 0x40, 0xfc, 0x3a, 0x9c,
+ 0x09, 0x2b, 0xd7, 0x8d, 0x96, 0x2a, 0x7e, 0x9d, 0xfe, 0xbc, 0xbc, 0xcc,
+ 0xe1, 0x09, 0xa4, 0xf3, 0xf2, 0x03, 0x6f, 0x81, 0x9b, 0x94, 0x77, 0xa7,
+ 0xe6, 0x52, 0x9c, 0x36, 0x68, 0x2c, 0x5f, 0x11, 0xc8, 0x09, 0xbb, 0xa7,
+ 0xb6, 0x3d, 0x91, 0x96, 0x40, 0x86, 0x15, 0x86, 0x84, 0xc4, 0x98, 0x4f,
+ 0x8d, 0x89, 0x30, 0x45, 0xf6, 0x07, 0x95, 0x03, 0xd6, 0xed, 0x14, 0xdb,
+ 0xbc, 0x85, 0xfc, 0xa8, 0x1e, 0xd2, 0x3a, 0x8c, 0x55, 0x90, 0xa6, 0x20,
+ 0x2b, 0x5c, 0xeb, 0x87, 0x7f, 0xda, 0x12, 0x1e, 0xdf, 0xc0, 0x22, 0xbb,
+ 0x0c, 0x84, 0xae, 0x45, 0xa1, 0x88, 0x40, 0xed, 0x91, 0x8a, 0x4a, 0xe5,
+ 0xfd, 0xd2, 0xf2, 0xd7, 0x47, 0x3a, 0x87, 0x85, 0x35, 0x9c, 0x0d, 0xa2,
+ 0x30, 0xf5, 0x83, 0x6e, 0x97, 0x2f, 0x06, 0x02, 0x6c, 0xe3, 0x43, 0xb7,
+ 0xd0, 0x78, 0x34, 0xd1, 0xb7, 0x33, 0xdc, 0x37, 0x87, 0xae, 0xab, 0x40,
+ 0x07, 0xb2, 0xa7, 0xd5, 0x71, 0x80, 0xe3, 0x90, 0x88, 0x41, 0xdd, 0xa0,
+ 0x39, 0xe9, 0x4d, 0x8f, 0x91, 0xc3, 0x4a, 0xec, 0xb9, 0x03, 0x29, 0xe7,
+ 0xfb, 0xc1, 0x5a, 0x60, 0x66, 0xb3, 0x54, 0x81, 0xf6, 0xa2, 0x01, 0xfa,
+ 0xff, 0xd8, 0x74, 0x4d, 0x73, 0x46, 0xbd, 0xd0, 0x7c, 0x31, 0xd0, 0x5e,
+ 0x17, 0x7a, 0x1a, 0xb8, 0x09, 0xbb, 0xef, 0xf6, 0x40, 0x6e, 0xdf, 0x33,
+ 0x9f, 0x6f, 0x0f, 0x5f, 0xbe, 0xb6, 0x30, 0x02, 0xbf, 0x2e, 0xa8, 0xc3,
+ 0x3e, 0x11, 0x75, 0x8d, 0x11, 0xe6, 0x24, 0x21, 0x0e, 0xf4, 0xf8, 0x45,
+ 0xac, 0xef, 0x6b, 0x92, 0x71, 0x73, 0x84, 0x95, 0x3a, 0x4a, 0xe8, 0x74,
+ 0x94, 0x50, 0x89, 0x56, 0x8c, 0xba, 0x56, 0x67, 0x7c, 0x43, 0x7a, 0x7b,
+ 0x04, 0xf4, 0x7a, 0x46, 0xfc, 0xec, 0x03, 0xf1, 0x58, 0x43, 0x53, 0xe6,
+ 0xda, 0x2a, 0x8f, 0x90, 0x2f, 0x89, 0x90, 0xe7, 0xe5, 0xa4, 0xbc, 0xb8,
+ 0x58, 0x23, 0xdd, 0x19, 0x91, 0x91, 0x6a, 0xa0, 0x98, 0x60, 0x36, 0xb0,
+ 0x8d, 0x78, 0x6f, 0xc2, 0x88, 0x9d, 0x95, 0xb9, 0x6a, 0x1b, 0x52, 0x98,
+ 0x20, 0xdd, 0xe9, 0x03, 0xc1, 0xe3, 0x17, 0xa6, 0xab, 0xcd, 0xa0, 0x26,
+ 0x1e, 0x15, 0xe6, 0xb3, 0x3b, 0x46, 0xd3, 0x84, 0x2c, 0xde, 0x7d, 0x9d,
+ 0xfc, 0xfd, 0x1f, 0x7f, 0xfe, 0x39, 0x02, 0xfa, 0x0f, 0x87, 0xdf, 0x15,
+ 0x57, 0x16, 0x9a, 0xa7, 0x15, 0x2c, 0xda, 0xe2, 0xb3, 0x73, 0xa2, 0x09,
+ 0xc7, 0x33, 0x9a, 0x3a, 0x9b, 0x5f, 0x8c, 0xbc, 0x9c, 0xca, 0x50, 0x2c,
+ 0xc2, 0x84, 0xd2, 0x0f, 0x52, 0x13, 0x37, 0x94, 0x82, 0x73, 0xf9, 0x2e,
+ 0xc0, 0xb2, 0xa9, 0x73, 0x8e, 0x4b, 0x99, 0xb6, 0x60, 0xba, 0x7c, 0x12,
+ 0x01, 0x7e, 0x8c, 0xeb, 0x6e, 0xd3, 0x0d, 0xa6, 0xbf, 0x3f, 0x3b, 0xb2,
+ 0xae, 0x4e, 0x9f, 0x2b, 0x5f, 0x19, 0x4a, 0xbd, 0x1b, 0x66, 0x77, 0xd9,
+ 0xc4, 0x70, 0x89, 0x5a, 0x81, 0x1f, 0x86, 0x8b, 0x3a, 0x79, 0xb1, 0x30,
+ 0x34, 0x9e, 0xf7, 0x40, 0x76, 0x7c, 0x8b, 0xd7, 0x12, 0x7d, 0xcd, 0x42,
+ 0x86, 0x5e, 0x96, 0x95, 0xd9, 0xa1, 0x85, 0x54, 0xe3, 0x4a, 0x49, 0x72,
+ 0xdb, 0x99, 0x91, 0x50, 0x81, 0x49, 0xe0, 0x0e, 0xb8, 0x7e, 0x2c, 0x1a,
+ 0x37, 0xe1, 0x9f, 0x79, 0xe8, 0x5c, 0xa4, 0xac, 0xaf, 0x8c, 0xf2, 0x68,
+ 0x66, 0x6f, 0x8c, 0x6c, 0x58, 0xeb, 0xf5, 0x40, 0x48, 0xaa, 0x52, 0xe8,
+ 0xb6, 0x28, 0x8c, 0x80, 0x2d, 0x43, 0x64, 0x0b, 0xcb, 0x30, 0x1d, 0x7f,
+ 0x45, 0xb6, 0xb9, 0xa7, 0x0f, 0xb8, 0x26, 0x2d, 0x7d, 0xc3, 0x7d, 0xd5,
+ 0x05, 0xb0, 0x1b, 0x34, 0x71, 0xd9, 0xab, 0x28, 0xd8, 0xc8, 0xb5, 0xed,
+ 0xae, 0xef, 0x89, 0xb5, 0xa6, 0x72, 0x70, 0x29, 0x17, 0xe9, 0xcc, 0x16,
+ 0xd2, 0xfb, 0x68, 0x7d, 0x54, 0x86, 0x98, 0xa2, 0x2e, 0x32, 0x9b, 0x8f,
+ 0xa4, 0xd9, 0x34, 0xa5, 0x55, 0xb9, 0x31, 0x89, 0xe1, 0x76, 0x71, 0x5d,
+ 0x6a, 0xa4, 0x08, 0x70, 0x35, 0xac, 0x38, 0xf4, 0xa9, 0xac, 0x5c, 0x3c,
+ 0x0f, 0xd1, 0x58, 0xef, 0xb9, 0xe0, 0xe5, 0x5c, 0x92, 0xd9, 0x2f, 0xf6,
+ 0x03, 0x21, 0x14, 0x53, 0x4b, 0x2d, 0x86, 0x21, 0xc1, 0xdb, 0x94, 0x5e,
+ 0x01, 0x1e, 0xc2, 0x07, 0x7e, 0x28, 0x07, 0xde, 0x19, 0x0e, 0xb1, 0x96,
+ 0xa7, 0x4f, 0x9e, 0x3c, 0xe1, 0x58, 0xcb, 0xc6, 0x11, 0x7d, 0xf8, 0xec,
+ 0xf0, 0xd5, 0xc9, 0xdb, 0xb7, 0x87, 0xef, 0x5e, 0x1f, 0xbe, 0xd6, 0x8c,
+ 0x0f, 0x6f, 0x25, 0x8e, 0x3a, 0xc2, 0x15, 0x21, 0x4b, 0xd0, 0xec, 0xf3,
+ 0xde, 0x93, 0xdd, 0xe1, 0xfe, 0x93, 0xdd, 0xc4, 0xd0, 0x62, 0x6a, 0xeb,
+ 0xd4, 0xd2, 0x79, 0x0a, 0xfb, 0xf6, 0x6a, 0x65, 0x54, 0x35, 0xa0, 0x69,
+ 0x36, 0xc0, 0xdc, 0x20, 0xd7, 0x2b, 0xbc, 0x3d, 0x59, 0x03, 0x3b, 0x3a,
+ 0x92, 0x19, 0x30, 0xda, 0xb0, 0xc0, 0x68, 0x2e, 0x60, 0x29, 0xba, 0x0f,
+ 0x11, 0xe8, 0xfe, 0x2e, 0x3e, 0x34, 0x4a, 0xde, 0x18, 0xed, 0xe3, 0xa2,
+ 0xbc, 0x65, 0x5a, 0x7c, 0x75, 0x65, 0x94, 0xd2, 0x2c, 0x0c, 0x55, 0xb6,
+ 0xdf, 0xc7, 0xeb, 0x8f, 0xf8, 0xf5, 0x7f, 0x61, 0x8c, 0xfe, 0xc9, 0xf3,
+ 0xb6, 0x61, 0x69, 0x2e, 0x32, 0x41, 0xb1, 0x6b, 0x49, 0x62, 0x0f, 0x08,
+ 0xeb, 0x98, 0xcd, 0xf1, 0x6f, 0x5f, 0x9e, 0xe2, 0x69, 0x63, 0x96, 0x9f,
+ 0xfc, 0xf8, 0x27, 0x57, 0xe6, 0x79, 0xbd, 0xa7, 0xd9, 0x8c, 0x52, 0xc9,
+ 0x4a, 0xfd, 0xe9, 0x8a, 0x30, 0xe8, 0xed, 0x94, 0x59, 0x6b, 0x10, 0xaa,
+ 0x90, 0xa1, 0x15, 0x22, 0x03, 0xd5, 0x6c, 0x1d, 0xb7, 0x8e, 0x92, 0x43,
+ 0xab, 0x6a, 0xb9, 0xe2, 0xb1, 0xba, 0x7e, 0xc3, 0xca, 0x31, 0x8d, 0xdb,
+ 0x9c, 0x5b, 0x2d, 0xe4, 0xc5, 0x8c, 0xfb, 0xb5, 0xb6, 0x1c, 0xb3, 0x4d,
+ 0xb5, 0xca, 0x62, 0x5e, 0xd3, 0xb5, 0x18, 0x3b, 0x50, 0x6a, 0xab, 0x7c,
+ 0x91, 0x56, 0x39, 0x77, 0x65, 0x07, 0x81, 0xdf, 0x70, 0x0b, 0x49, 0x4e,
+ 0x95, 0xa2, 0xd8, 0x97, 0x45, 0x73, 0x84, 0xb3, 0x26, 0x82, 0x65, 0x9e,
+ 0x4f, 0xe5, 0x4a, 0x31, 0xac, 0x91, 0xc4, 0x28, 0x79, 0xb3, 0xd6, 0x1d,
+ 0xd3, 0xd3, 0xb6, 0xfd, 0x6f, 0x15, 0x8a, 0x68, 0x09, 0x2e, 0x54, 0xdc,
+ 0x37, 0x47, 0xc7, 0x87, 0xdb, 0xc9, 0x9b, 0xac, 0x91, 0x12, 0x27, 0xcd,
+ 0x30, 0x86, 0xc8, 0xff, 0x37, 0x52, 0xb0, 0x2c, 0x0e, 0xa0, 0xd4, 0x08,
+ 0x47, 0x73, 0xc1, 0xc4, 0x07, 0x47, 0xca, 0x86, 0xd6, 0x4b, 0xf1, 0xe1,
+ 0xd0, 0x12, 0x11, 0x8f, 0xd3, 0xdc, 0x32, 0x8d, 0x6f, 0xca, 0xc9, 0x47,
+ 0xf2, 0x6e, 0x15, 0xe7, 0x61, 0xe4, 0x21, 0x9e, 0x95, 0x7e, 0x0a, 0x01,
+ 0x26, 0x2d, 0x39, 0xcf, 0x1a, 0x2f, 0xce, 0xeb, 0xe5, 0x1c, 0xdc, 0x20,
+ 0x8a, 0xf2, 0x32, 0xcf, 0x5c, 0x65, 0x1f, 0x51, 0x3e, 0x37, 0x50, 0x17,
+ 0xa3, 0x87, 0x18, 0x2a, 0xd6, 0xeb, 0x6d, 0xdc, 0xb7, 0xba, 0x71, 0x48,
+ 0x3b, 0xe1, 0x3f, 0x77, 0xbe, 0x8a, 0x82, 0x8f, 0x09, 0xa1, 0x1f, 0x52,
+ 0x2b, 0x59, 0x79, 0x83, 0x28, 0x8a, 0x5b, 0x8b, 0x8b, 0x90, 0x57, 0xb5,
+ 0xb3, 0x45, 0x09, 0x11, 0xf5, 0x95, 0x7c, 0x77, 0x6a, 0xee, 0xfe, 0x49,
+ 0xda, 0x17, 0xa9, 0xfe, 0x80, 0x12, 0x70, 0x27, 0x5d, 0xb8, 0x79, 0xad,
+ 0xcd, 0x32, 0x4e, 0x62, 0x9d, 0xc2, 0x98, 0x2b, 0x4b, 0xa7, 0x5a, 0xd6,
+ 0xa6, 0x90, 0xad, 0x9f, 0x6a, 0xba, 0xbe, 0xce, 0x17, 0x8f, 0x5d, 0x09,
+ 0x5a, 0x34, 0xf9, 0x52, 0xb8, 0x8a, 0xac, 0x8e, 0xba, 0xfc, 0xa5, 0xbc,
+ 0x4d, 0x42, 0x7b, 0xd4, 0x69, 0x94, 0x9d, 0x32, 0xac, 0x43, 0xaf, 0xa0,
+ 0xd0, 0x71, 0x65, 0x17, 0x41, 0xff, 0x57, 0x0c, 0x51, 0x19, 0xd1, 0x96,
+ 0xe4, 0xeb, 0x3e, 0x0b, 0xea, 0xea, 0xec, 0xfe, 0x67, 0xda, 0x96, 0x68,
+ 0xa8, 0x2e, 0x9a, 0xbd, 0x23, 0x9d, 0x12, 0x7d, 0x36, 0x50, 0xf5, 0x3e,
+ 0xfd, 0x98, 0x53, 0x21, 0xe2, 0x8a, 0xd4, 0xb9, 0xb4, 0xd0, 0x7a, 0x2b,
+ 0x9e, 0xa6, 0xc3, 0x56, 0x9f, 0x21, 0xe2, 0xf1, 0xa7, 0x3e, 0xed, 0x93,
+ 0x21, 0xcb, 0xe0, 0x34, 0x00, 0xec, 0xa9, 0xce, 0x67, 0x4e, 0x15, 0x0d,
+ 0xf6, 0xb6, 0xa8, 0xa2, 0x86, 0x7a, 0x48, 0xd2, 0x15, 0x23, 0x50, 0xcc,
+ 0x19, 0xf5, 0x21, 0x26, 0x97, 0x9f, 0xf6, 0xb7, 0xdf, 0xac, 0x32, 0x86,
+ 0x83, 0x1f, 0x19, 0x4b, 0x74, 0x81, 0x92, 0x00, 0x4a, 0xb3, 0x95, 0x25,
+ 0xcb, 0xf6, 0x18, 0xde, 0x76, 0x99, 0x5f, 0xc7, 0xb2, 0x2c, 0x90, 0x1f,
+ 0x21, 0x13, 0xa3, 0x2c, 0x0d, 0xd7, 0x45, 0x55, 0xd3, 0x8e, 0x6d, 0x48,
+ 0x9b, 0xfd, 0xd2, 0xc0, 0x01, 0x94, 0x9d, 0x0d, 0x6e, 0xf0, 0x1c, 0x1a,
+ 0x2b, 0x00, 0xbd, 0x0a, 0xee, 0x5b, 0xfb, 0xad, 0xd1, 0x7c, 0x0e, 0x36,
+ 0x2c, 0x88, 0x39, 0xf9, 0x55, 0x19, 0x23, 0xdc, 0xa7, 0x1c, 0xe9, 0xa4,
+ 0x3c, 0x8c, 0xb6, 0xe3, 0x12, 0xcd, 0xbd, 0x51, 0xc6, 0x65, 0x0b, 0x6e,
+ 0xc2, 0xb4, 0x66, 0x5b, 0x00, 0xc3, 0x15, 0xa3, 0x21, 0x48, 0x3b, 0xa6,
+ 0xf4, 0xe3, 0xf0, 0x15, 0x7d, 0x7c, 0xf8, 0x2d, 0x0d, 0xf7, 0xc5, 0x86,
+ 0x75, 0xf8, 0x76, 0x7f, 0x75, 0x10, 0xf6, 0xcf, 0x75, 0x7e, 0x43, 0x36,
+ 0x3c, 0x56, 0x5a, 0x95, 0x41, 0x89, 0x24, 0x32, 0x41, 0x6e, 0x4d, 0x65,
+ 0xae, 0xc8, 0x8e, 0x1e, 0xb8, 0x74, 0xbe, 0x29, 0x9a, 0xbe, 0xc6, 0xad,
+ 0x46, 0x8a, 0x2c, 0x09, 0x4c, 0x67, 0x36, 0x2c, 0x2f, 0x86, 0x94, 0x21,
+ 0x6d, 0x98, 0xff, 0x47, 0x24, 0x23, 0x79, 0xb7, 0x8e, 0x00, 0x42, 0x08,
+ 0xee, 0x7a, 0x36, 0x8b, 0xa9, 0xe6, 0x5c, 0xc8, 0x08, 0xad, 0x43, 0x08,
+ 0x5f, 0x0b, 0x2d, 0xf8, 0x20, 0x0f, 0xc4, 0x2b, 0x4f, 0xaf, 0xdb, 0xe6,
+ 0x4f, 0x40, 0xe6, 0x92, 0x82, 0x88, 0xc0, 0x9f, 0x46, 0xe5, 0x11, 0x03,
+ 0xd6, 0xde, 0x69, 0xd5, 0x64, 0xc3, 0x2d, 0xd8, 0x95, 0x4b, 0xfe, 0xe7,
+ 0xd5, 0x92, 0x54, 0x56, 0x40, 0x68, 0x06, 0xde, 0x17, 0x2d, 0x12, 0xa1,
+ 0xd6, 0x3e, 0x46, 0xf8, 0x3f, 0x19, 0xed, 0x0e, 0x82, 0x40, 0x7d, 0x43,
+ 0xc6, 0x7e, 0xe1, 0xb2, 0x84, 0xcc, 0xc3, 0xc4, 0x23, 0x87, 0xb1, 0xea,
+ 0xda, 0xba, 0xb9, 0x03, 0xbf, 0xb6, 0xc5, 0xb4, 0x94, 0x5a, 0xec, 0xea,
+ 0x1e, 0x5c, 0x4e, 0x0f, 0x6d, 0xa1, 0xb0, 0x4d, 0xae, 0xa2, 0x8d, 0xa1,
+ 0x8e, 0x4a, 0xc6, 0xd6, 0x57, 0xc3, 0x6e, 0xf7, 0x48, 0xdb, 0x04, 0xcc,
+ 0xaf, 0xde, 0xf0, 0xda, 0x79, 0xf5, 0x7a, 0x9a, 0x08, 0xbc, 0xfe, 0xa5,
+ 0xf6, 0x9b, 0x19, 0x9a, 0x4d, 0x95, 0x46, 0xa7, 0xc3, 0x0c, 0x3f, 0x64,
+ 0xc0, 0x0e, 0x85, 0xf2, 0xac, 0xfb, 0xf7, 0x8c, 0x71, 0x6d, 0x9f, 0x61,
+ 0xc7, 0x2c, 0x9a, 0xbf, 0x36, 0xae, 0x71, 0xf2, 0x81, 0xc8, 0xd6, 0xbb,
+ 0x4b, 0xdd, 0x3d, 0x03, 0x57, 0x01, 0x27, 0x28, 0x34, 0xe7, 0x9b, 0xfa,
+ 0x94, 0xdf, 0xde, 0xf5, 0xa6, 0x16, 0xf7, 0xe4, 0xfc, 0xd2, 0xb5, 0x79,
+ 0x03, 0xc5, 0x7e, 0xf8, 0xce, 0x1c, 0xc3, 0x41, 0xf2, 0x9f, 0x65, 0xc6,
+ 0x35, 0xab, 0xf7, 0x94, 0xac, 0xfe, 0xf0, 0xf2, 0xec, 0xdd, 0xd1, 0xbb,
+ 0x6f, 0x0e, 0x2c, 0x8f, 0x03, 0xbf, 0xeb, 0x76, 0x91, 0xb0, 0xbc, 0x9b,
+ 0x7e, 0xcb, 0x6d, 0xca, 0xe1, 0xfd, 0xe9, 0x83, 0xb5, 0x46, 0x2c, 0x93,
+ 0xd8, 0x33, 0x3b, 0x2f, 0xab, 0x8c, 0xe3, 0x22, 0x6c, 0x8b, 0x6a, 0xe5,
+ 0x84, 0x94, 0x6b, 0x92, 0xa8, 0x6c, 0xca, 0xf9, 0x2c, 0x06, 0xd8, 0x30,
+ 0x3c, 0xc6, 0x99, 0xcc, 0xcb, 0x56, 0x5f, 0x26, 0x10, 0xe5, 0x9c, 0x8e,
+ 0xbf, 0xf4, 0x29, 0xc0, 0x6b, 0xaf, 0x04, 0x5b, 0xaa, 0x8c, 0x74, 0xd7,
+ 0x23, 0x33, 0x8f, 0xd3, 0x70, 0x82, 0x7e, 0x34, 0xdc, 0x55, 0xa2, 0xa6,
+ 0x23, 0xab, 0x73, 0x72, 0x36, 0xd8, 0x2d, 0xd1, 0x1c, 0xaf, 0x88, 0x1f,
+ 0x84, 0xf7, 0x6a, 0x9a, 0xae, 0xf8, 0xbe, 0x30, 0x3a, 0x99, 0xfc, 0xd4,
+ 0xd5, 0x65, 0xd8, 0x1d, 0x78, 0x70, 0x9a, 0xb3, 0xcb, 0x73, 0x66, 0x7d,
+ 0x9e, 0x0d, 0x44, 0x8f, 0x65, 0x99, 0x3f, 0x21, 0x4a, 0xa2, 0x38, 0x24,
+ 0xf3, 0xcc, 0x55, 0x25, 0x59, 0x5d, 0xe7, 0x8a, 0x75, 0x9d, 0xf9, 0x32,
+ 0x00, 0xdb, 0xa3, 0x3e, 0x74, 0xf8, 0x8d, 0x3a, 0x75, 0x10, 0xbc, 0x22,
+ 0x09, 0xac, 0x66, 0x49, 0x0b, 0xdc, 0xce, 0x76, 0x4c, 0x64, 0xa6, 0x1e,
+ 0xca, 0x53, 0xe0, 0x3d, 0x65, 0x8c, 0x37, 0xe6, 0x57, 0xc0, 0x98, 0xaf,
+ 0x9b, 0x3d, 0x5e, 0xae, 0x26, 0x8b, 0xd9, 0x93, 0xe4, 0x85, 0xf9, 0x4f,
+ 0xa0, 0x64, 0x51, 0xce, 0xe8, 0xf8, 0x95, 0x51, 0xb4, 0x90, 0xe0, 0x02,
+ 0x79, 0xc1, 0x90, 0x37, 0x5e, 0xdf, 0x86, 0x47, 0xfb, 0x66, 0xa6, 0xb7,
+ 0xa9, 0x42, 0x5b, 0x1a, 0x8d, 0xf0, 0x32, 0x6f, 0x38, 0x4f, 0xaf, 0x07,
+ 0x37, 0xc8, 0x4b, 0x6d, 0xa0, 0x33, 0xdf, 0xdb, 0xff, 0x3c, 0x41, 0xf1,
+ 0xc1, 0xdb, 0xd7, 0x4f, 0x92, 0xe9, 0x55, 0x36, 0xfd, 0x58, 0xaf, 0x16,
+ 0xca, 0x8e, 0xb1, 0xa7, 0x0d, 0xa3, 0x45, 0x07, 0x88, 0x0f, 0x66, 0xe2,
+ 0xf3, 0x7c, 0x8a, 0xd2, 0xbf, 0x41, 0x2b, 0x3a, 0x75, 0xa1, 0xd1, 0x29,
+ 0xcf, 0x0e, 0xb5, 0x62, 0x83, 0xd2, 0x05, 0x38, 0xa7, 0x26, 0x12, 0xbc,
+ 0x30, 0x7b, 0x60, 0x3e, 0x5e, 0x73, 0x93, 0xe7, 0xb5, 0x2e, 0xdb, 0x67,
+ 0x6d, 0xaf, 0x37, 0x2e, 0xf6, 0xee, 0xe8, 0x79, 0x4f, 0x47, 0x76, 0xca,
+ 0x4c, 0xb1, 0x20, 0xf5, 0x30, 0xf8, 0xb5, 0xda, 0x8e, 0xec, 0x01, 0x68,
+ 0xf9, 0x98, 0x24, 0x00, 0xa1, 0x34, 0x8c, 0x17, 0x7c, 0x1c, 0x4f, 0xee,
+ 0xe0, 0x09, 0xce, 0x33, 0xe0, 0x2c, 0xb6, 0x8c, 0x30, 0x29, 0x98, 0xb4,
+ 0x28, 0x4d, 0xc8, 0x46, 0x01, 0x2d, 0xc2, 0x19, 0x85, 0x60, 0x43, 0xa5,
+ 0xcd, 0xd6, 0x7f, 0xab, 0xcb, 0xc6, 0xb1, 0x18, 0x29, 0xa1, 0xf5, 0xd0,
+ 0x1c, 0xb4, 0x96, 0x90, 0xf0, 0xda, 0x60, 0x53, 0x04, 0x44, 0x66, 0xbf,
+ 0xcb, 0x71, 0x69, 0x77, 0x1c, 0x35, 0xa3, 0x11, 0x92, 0xf3, 0x1c, 0xcd,
+ 0x53, 0xd9, 0xa2, 0x2e, 0x6f, 0x8a, 0xcb, 0x0a, 0xfe, 0x11, 0x2a, 0x0a,
+ 0x4b, 0x63, 0xb1, 0x8c, 0x98, 0x59, 0x9c, 0x5c, 0xac, 0xc8, 0x12, 0xa2,
+ 0xe1, 0x75, 0xd7, 0x04, 0x3d, 0xd3, 0xe8, 0xe8, 0x52, 0xd1, 0x48, 0xc2,
+ 0xa0, 0x03, 0x8f, 0x4a, 0x09, 0x61, 0x41, 0xa3, 0x2e, 0x70, 0x2d, 0x43,
+ 0x0e, 0xb4, 0xb5, 0x7b, 0xa3, 0x5d, 0xcd, 0xb5, 0x8a, 0xd8, 0xf2, 0xde,
+ 0x59, 0xef, 0x0e, 0xe4, 0xbc, 0xcd, 0x1b, 0x7d, 0x2d, 0x50, 0x3c, 0xf0,
+ 0x35, 0x49, 0x92, 0x69, 0x1d, 0x34, 0xbe, 0xe5, 0x29, 0xdc, 0x9c, 0x2d,
+ 0x61, 0x6e, 0x4d, 0x4f, 0x1a, 0x9f, 0xd9, 0x31, 0x71, 0x84, 0x65, 0xb3,
+ 0xd6, 0x40, 0x6b, 0x99, 0x97, 0xdf, 0x78, 0x8d, 0xa7, 0xbb, 0x27, 0xf1,
+ 0x1c, 0xfc, 0x6b, 0xbf, 0x4b, 0xbd, 0xe6, 0xd7, 0x0f, 0xa1, 0xde, 0xc8,
+ 0x5a, 0xf6, 0xd6, 0x4e, 0xa3, 0x55, 0xf2, 0xb1, 0x3b, 0x70, 0x9f, 0xdb,
+ 0xd5, 0x46, 0x91, 0x32, 0x1f, 0xbd, 0x5f, 0x61, 0x78, 0x3b, 0x84, 0xab,
+ 0xa7, 0x37, 0x50, 0x37, 0x53, 0x56, 0x43, 0xe8, 0xfe, 0xf3, 0x6c, 0x16,
+ 0xe8, 0x62, 0xb1, 0xc3, 0x20, 0x9e, 0x9d, 0xd7, 0x35, 0x94, 0x64, 0xe8,
+ 0xc7, 0x44, 0xe8, 0x88, 0x3f, 0xd1, 0x92, 0xac, 0x73, 0x20, 0x96, 0xff,
+ 0x4f, 0x44, 0xb2, 0x6f, 0x55, 0x7d, 0xa1, 0x99, 0xbd, 0xe4, 0xfd, 0x92,
+ 0x28, 0x19, 0x91, 0xf2, 0xc6, 0x6b, 0xb5, 0x90, 0xd0, 0xe4, 0x18, 0xa9,
+ 0x25, 0x36, 0x3b, 0xf6, 0x94, 0xf9, 0x0d, 0x95, 0xb4, 0xf0, 0xb3, 0xd6,
+ 0x4f, 0xd5, 0xa8, 0xa8, 0x75, 0x3d, 0xde, 0x18, 0x66, 0x5f, 0xe7, 0x18,
+ 0xc3, 0x07, 0xe6, 0x0b, 0x6a, 0x34, 0x56, 0x19, 0xa0, 0x95, 0x94, 0x0f,
+ 0xdc, 0x73, 0x8e, 0x05, 0xd9, 0x76, 0x7b, 0x33, 0xd7, 0xef, 0x2d, 0xe2,
+ 0xa8, 0xc9, 0x5d, 0x17, 0xee, 0x0e, 0x42, 0x60, 0x10, 0x49, 0x8a, 0x1e,
+ 0xc7, 0x83, 0xfb, 0x17, 0x04, 0x40, 0x60, 0x39, 0x3b, 0xdb, 0xb4, 0x10,
+ 0x96, 0x57, 0x33, 0x7a, 0x18, 0x71, 0xef, 0x0e, 0xa2, 0xb3, 0x03, 0xb9,
+ 0xf9, 0xc4, 0xdf, 0x42, 0xd5, 0x7b, 0x1e, 0x21, 0xae, 0x5f, 0x75, 0x17,
+ 0xf6, 0xd7, 0xc5, 0x53, 0x8d, 0xb5, 0x96, 0xce, 0x97, 0xc5, 0x48, 0xbf,
+ 0xf0, 0xa0, 0xfd, 0xe9, 0x1e, 0xb3, 0xed, 0xf6, 0xf0, 0xeb, 0xf6, 0xa7,
+ 0xbb, 0x37, 0x3e, 0x2f, 0xf3, 0xf7, 0xa7, 0x7b, 0x96, 0x6b, 0x7b, 0x47,
+ 0x70, 0xdd, 0xba, 0x76, 0x4e, 0x1f, 0x72, 0x6d, 0x5e, 0xac, 0x2c, 0x25,
+ 0x91, 0x1b, 0xa9, 0xb8, 0x73, 0x83, 0xe4, 0x88, 0x31, 0x95, 0x29, 0x31,
+ 0x42, 0x5e, 0x3f, 0xe6, 0xd2, 0x3e, 0x71, 0xb9, 0xa9, 0xbb, 0x31, 0x52,
+ 0xfc, 0x9b, 0x4f, 0x81, 0xec, 0xe4, 0x9c, 0x7d, 0x50, 0xd6, 0x6d, 0xeb,
+ 0x8c, 0x15, 0x79, 0x33, 0x93, 0x97, 0x4b, 0x54, 0xe7, 0x19, 0x1e, 0x75,
+ 0x6b, 0x3b, 0xa1, 0xc6, 0x7a, 0x89, 0x1b, 0x0d, 0x8e, 0x5a, 0x9d, 0x18,
+ 0xd9, 0x25, 0x49, 0xbf, 0xdd, 0xe9, 0xd0, 0xe8, 0x8c, 0xbc, 0x36, 0x47,
+ 0x9a, 0x7b, 0xc5, 0x3a, 0xeb, 0x7e, 0x72, 0x99, 0x5f, 0x06, 0x88, 0xee,
+ 0x93, 0xbb, 0x26, 0x52, 0x81, 0x82, 0x55, 0x63, 0x17, 0xb6, 0x6a, 0x49,
+ 0x70, 0x7b, 0xfc, 0x74, 0xb4, 0xbb, 0x3d, 0x40, 0x4b, 0xe8, 0x25, 0xed,
+ 0x00, 0x4a, 0x04, 0xac, 0x5e, 0x87, 0x0a, 0x99, 0xfc, 0x12, 0xc2, 0x8e,
+ 0x1c, 0x0b, 0x91, 0x4c, 0x10, 0x38, 0xd6, 0x24, 0xc3, 0x4a, 0xd3, 0x97,
+ 0x04, 0xe9, 0xb2, 0x5d, 0x1d, 0x97, 0x0f, 0xa8, 0xcb, 0x14, 0xb9, 0xc5,
+ 0xba, 0x7e, 0x6b, 0x71, 0x96, 0xb9, 0x16, 0xf0, 0x9e, 0x24, 0x57, 0x65,
+ 0x5b, 0x78, 0x80, 0x74, 0x07, 0xa0, 0x98, 0x82, 0x70, 0xcb, 0x20, 0x2c,
+ 0xda, 0x7e, 0x71, 0x4a, 0x4e, 0x15, 0xfe, 0x82, 0xd8, 0xbe, 0x6c, 0x61,
+ 0x58, 0x8e, 0x07, 0x03, 0x15, 0xae, 0x44, 0xee, 0xbb, 0x30, 0x08, 0x11,
+ 0xbd, 0xac, 0xdb, 0xcb, 0x61, 0xd4, 0xb6, 0x2e, 0x9c, 0xe2, 0xca, 0x8e,
+ 0x46, 0xa3, 0x48, 0x25, 0xfd, 0x75, 0x9e, 0xdd, 0xb4, 0xbc, 0x80, 0x32,
+ 0xb3, 0x81, 0xed, 0xcd, 0xc0, 0xc6, 0xe7, 0x35, 0x76, 0xc8, 0x0c, 0x39,
+ 0x29, 0x6d, 0xf7, 0xf1, 0x35, 0x17, 0xd9, 0x7f, 0xda, 0xdb, 0xe6, 0x8f,
+ 0xbc, 0xcd, 0x75, 0xac, 0x14, 0x8d, 0x31, 0x59, 0x1d, 0x94, 0xfc, 0x00,
+ 0xc6, 0x58, 0x75, 0x97, 0x50, 0xcf, 0x00, 0xa7, 0xa4, 0x12, 0x5f, 0xe1,
+ 0xd4, 0xe7, 0xbc, 0x66, 0x48, 0x54, 0x86, 0x34, 0x09, 0x03, 0x55, 0xfc,
+ 0x99, 0xf6, 0x9d, 0x17, 0x07, 0x9d, 0x72, 0x27, 0xc3, 0xda, 0xa7, 0xb0,
+ 0x81, 0x49, 0xc8, 0x2a, 0x0e, 0x3a, 0x59, 0x81, 0x91, 0xac, 0x07, 0x39,
+ 0x11, 0xaf, 0x69, 0x82, 0x17, 0xa4, 0x77, 0x9d, 0x2c, 0x12, 0x5d, 0x60,
+ 0x3c, 0xd4, 0xa4, 0xe7, 0xea, 0x07, 0x80, 0xfc, 0x95, 0x4c, 0xee, 0xb4,
+ 0x11, 0x93, 0xb8, 0x81, 0x1c, 0xd4, 0x6b, 0x57, 0x3d, 0x75, 0xa5, 0x71,
+ 0x0e, 0xce, 0xc7, 0x39, 0xd4, 0x18, 0x37, 0x8c, 0x56, 0x26, 0x83, 0xd7,
+ 0x3e, 0x46, 0x6f, 0x50, 0xe5, 0x6c, 0x2b, 0x2f, 0x69, 0x60, 0x6e, 0xf7,
+ 0x11, 0x3d, 0x62, 0x56, 0xfd, 0xb8, 0xe0, 0x1e, 0x0d, 0x67, 0x56, 0x88,
+ 0x79, 0xd3, 0xdd, 0x97, 0xc2, 0x59, 0xa9, 0x95, 0xed, 0xe2, 0x28, 0x58,
+ 0x34, 0x2a, 0xec, 0xfe, 0xe8, 0x2a, 0xbd, 0xbd, 0x1d, 0xd5, 0xd9, 0x8e,
+ 0xa1, 0xda, 0x7a, 0xa7, 0xae, 0xe7, 0xf8, 0x68, 0x4d, 0xc0, 0x4f, 0x6b,
+ 0x7b, 0xd9, 0xdd, 0xde, 0x59, 0x02, 0x12, 0x66, 0x3c, 0x4d, 0xf1, 0x6a,
+ 0x8b, 0xd9, 0xba, 0x66, 0x76, 0xdc, 0x9b, 0xa2, 0x9b, 0xad, 0xc8, 0x98,
+ 0xb7, 0x84, 0xde, 0xec, 0x17, 0xfa, 0x31, 0x6b, 0x70, 0x79, 0x21, 0x76,
+ 0x1c, 0x07, 0xe5, 0x0d, 0x94, 0xdb, 0xaa, 0x2f, 0xab, 0x5c, 0xee, 0xaa,
+ 0x17, 0x95, 0x31, 0x9b, 0x62, 0x73, 0xaf, 0x8d, 0x7c, 0x70, 0x88, 0x1e,
+ 0xdc, 0xff, 0x85, 0xdb, 0xd6, 0x47, 0xd0, 0x66, 0xfa, 0x3c, 0x26, 0xde,
+ 0xd2, 0x90, 0xa5, 0x7e, 0xe0, 0xb0, 0xcd, 0x6e, 0x6e, 0x6e, 0x46, 0xeb,
+ 0x5c, 0x26, 0xff, 0x74, 0xf8, 0xad, 0x3d, 0xdc, 0x89, 0xa1, 0xda, 0x63,
+ 0x63, 0x47, 0xdc, 0x26, 0x1e, 0xbc, 0x84, 0xed, 0x43, 0xa2, 0x31, 0x81,
+ 0xe4, 0xfb, 0xb3, 0x37, 0xb6, 0xed, 0xad, 0x16, 0xf6, 0xc3, 0xe9, 0x54,
+ 0x87, 0xee, 0xf1, 0x2c, 0x67, 0xc8, 0x0f, 0xe0, 0xd5, 0xbe, 0x7a, 0x79,
+ 0xfa, 0xe1, 0xdd, 0xe1, 0xf9, 0x87, 0xb3, 0x97, 0x3f, 0x60, 0x0b, 0xd9,
+ 0x20, 0x34, 0xf2, 0x0a, 0xae, 0xc8, 0xaa, 0x2c, 0xd1, 0xc2, 0xea, 0x2d,
+ 0x55, 0x2c, 0xe5, 0x05, 0x21, 0x3b, 0x44, 0x9b, 0x2a, 0x5b, 0xb8, 0x1a,
+ 0x99, 0xa7, 0x99, 0xcb, 0x41, 0xd2, 0xda, 0xaf, 0x8f, 0xc6, 0x72, 0xc8,
+ 0xe6, 0xa3, 0xb2, 0xba, 0x04, 0x15, 0xee, 0xbc, 0x16, 0xfe, 0x19, 0x1d,
+ 0x6e, 0x47, 0x02, 0xaa, 0x40, 0x3f, 0xba, 0xae, 0x2e, 0x00, 0x96, 0xb0,
+ 0xae, 0x9d, 0xbc, 0xdf, 0x8f, 0xcc, 0x23, 0xcd, 0xc7, 0xc4, 0x00, 0x97,
+ 0xd7, 0x8f, 0xd7, 0x18, 0x03, 0x4d, 0x4b, 0x7f, 0x92, 0x8e, 0x4e, 0x44,
+ 0x41, 0x64, 0x76, 0xfa, 0x61, 0x72, 0x2e, 0x0c, 0x9b, 0xdf, 0x0d, 0x22,
+ 0xb5, 0xd7, 0x04, 0xe6, 0x5d, 0xda, 0x2a, 0x76, 0xaa, 0xad, 0x41, 0x7c,
+ 0x7f, 0x7d, 0x23, 0x35, 0xd5, 0x83, 0xba, 0x66, 0x47, 0x5f, 0x85, 0xfa,
+ 0xf0, 0x69, 0xa8, 0x4b, 0xa2, 0xc5, 0x9a, 0xb7, 0xe6, 0xa7, 0xb2, 0xe6,
+ 0xa7, 0xff, 0xd4, 0x9a, 0x9f, 0xfe, 0x13, 0x6b, 0x7e, 0xfc, 0x1b, 0xaf,
+ 0xf9, 0x71, 0x74, 0xcd, 0xde, 0x57, 0x86, 0x7f, 0xc1, 0x9a, 0xff, 0xb2,
+ 0x2a, 0x3e, 0x0e, 0xcd, 0x7c, 0x21, 0x85, 0xa5, 0xe1, 0x52, 0x1d, 0x57,
+ 0x99, 0x5b, 0x3d, 0x3e, 0xc8, 0xad, 0xe8, 0xb0, 0x4d, 0xbd, 0xfe, 0x51,
+ 0xa9, 0x54, 0x8b, 0x72, 0x74, 0xb1, 0xb7, 0x0f, 0xb6, 0xe7, 0x75, 0xce,
+ 0x51, 0x6a, 0x58, 0x4f, 0x61, 0xdb, 0xc0, 0x31, 0xb6, 0x21, 0xb3, 0xd1,
+ 0x61, 0x37, 0xb4, 0xe5, 0x03, 0xdd, 0xf4, 0x34, 0x84, 0x58, 0x99, 0x92,
+ 0x61, 0x4d, 0x77, 0xd2, 0x86, 0xdf, 0x5c, 0x17, 0xe6, 0xfc, 0xc2, 0xc2,
+ 0xcf, 0xe8, 0xc0, 0x1c, 0x92, 0x80, 0xbb, 0x39, 0xe4, 0x19, 0xe7, 0x77,
+ 0x4b, 0x0c, 0x68, 0x64, 0x73, 0x65, 0x64, 0x30, 0xc7, 0xc0, 0xb9, 0x45,
+ 0xb8, 0x9d, 0x64, 0xd2, 0x99, 0xa0, 0x38, 0x5a, 0xaf, 0xb2, 0xbb, 0xcd,
+ 0x40, 0x61, 0x98, 0xce, 0x4b, 0xf0, 0x1b, 0xe8, 0x75, 0x6b, 0x34, 0x91,
+ 0x89, 0xeb, 0x76, 0xc5, 0xf2, 0xa2, 0xd3, 0xfe, 0xca, 0x97, 0x1b, 0x1f,
+ 0xb3, 0x6c, 0x99, 0xce, 0xa9, 0xaa, 0x1f, 0x61, 0xd7, 0xbe, 0x1e, 0x3d,
+ 0xad, 0xbc, 0x2c, 0xcd, 0x59, 0xa6, 0x37, 0x5a, 0x49, 0x2f, 0xc4, 0xe7,
+ 0xf8, 0x20, 0x91, 0xa4, 0x9f, 0xe4, 0x33, 0x2a, 0xb3, 0x8b, 0xb7, 0x6c,
+ 0x70, 0x78, 0xf0, 0x76, 0x12, 0x64, 0x78, 0x4e, 0x04, 0x7e, 0xc2, 0x7e,
+ 0x42, 0x21, 0xac, 0x90, 0x15, 0x70, 0x9d, 0x23, 0x1b, 0xa8, 0x0b, 0x7b,
+ 0x6a, 0xdf, 0xe7, 0xd7, 0x09, 0xd0, 0xa6, 0x05, 0xda, 0xce, 0x07, 0x88,
+ 0x27, 0x4a, 0x2b, 0xff, 0xa0, 0x6e, 0x50, 0xd7, 0xc0, 0x80, 0xa4, 0x14,
+ 0xbb, 0x95, 0xf5, 0xdf, 0xf3, 0x57, 0xa7, 0x1f, 0xbe, 0x3b, 0x3c, 0x3c,
+ 0x3d, 0x7a, 0x7d, 0x7c, 0x28, 0x17, 0xc6, 0xfe, 0xe8, 0xdd, 0xf9, 0xf7,
+ 0xc7, 0xda, 0xa2, 0x4a, 0x69, 0x31, 0x20, 0x78, 0x41, 0x1c, 0x67, 0xa6,
+ 0x3c, 0xa0, 0x4e, 0x3c, 0x45, 0x93, 0xbc, 0x3c, 0xfa, 0xd1, 0x68, 0xad,
+ 0xa7, 0xc3, 0xf7, 0x3f, 0x06, 0x6d, 0x10, 0xbc, 0xf4, 0xf6, 0xde, 0x8e,
+ 0xe0, 0x86, 0x10, 0xc9, 0x76, 0x74, 0x6b, 0xef, 0xcb, 0xf6, 0xf9, 0x8d,
+ 0xc5, 0xa0, 0x19, 0x6e, 0x55, 0x58, 0x85, 0x81, 0x5f, 0xd4, 0x56, 0x23,
+ 0x5e, 0x46, 0xcd, 0xd3, 0x5d, 0xed, 0xe0, 0xb4, 0xd6, 0x5f, 0xfa, 0x79,
+ 0xdb, 0x66, 0xfc, 0x98, 0xdd, 0x11, 0x7c, 0x5c, 0xf2, 0x02, 0xff, 0x8d,
+ 0x77, 0xd8, 0x3a, 0xad, 0xf2, 0x6b, 0xe8, 0x7f, 0xe6, 0x59, 0x8e, 0x26,
+ 0xe1, 0xd1, 0x91, 0xed, 0x37, 0x26, 0x11, 0x2d, 0x0c, 0x42, 0x41, 0x6f,
+ 0x1a, 0x94, 0x08, 0x2b, 0x88, 0x8a, 0xe6, 0x33, 0xf6, 0x75, 0xf0, 0x78,
+ 0x34, 0xa0, 0xd9, 0x9e, 0x51, 0xf2, 0xfa, 0xf0, 0x6c, 0x90, 0x9c, 0x1e,
+ 0xbe, 0xe5, 0x1c, 0xf9, 0xc3, 0x77, 0xdf, 0x70, 0x0b, 0x36, 0xed, 0xac,
+ 0x45, 0x41, 0xd8, 0x30, 0x4f, 0xcc, 0xdb, 0x13, 0xf3, 0x2e, 0x25, 0xc5,
+ 0xd5, 0xb5, 0x91, 0xae, 0x9f, 0x10, 0xbb, 0x83, 0xd7, 0xf6, 0xc2, 0xfc,
+ 0x27, 0xb6, 0x55, 0xc6, 0x8e, 0xf8, 0x36, 0xb2, 0x5d, 0xa2, 0x98, 0xd9,
+ 0xb0, 0xbd, 0x18, 0x05, 0xd8, 0x0d, 0xde, 0x31, 0xb3, 0x21, 0x61, 0x00,
+ 0x59, 0x37, 0x88, 0xcc, 0x3e, 0x42, 0x2f, 0xe1, 0x66, 0x99, 0x12, 0xfe,
+ 0x83, 0x15, 0x6b, 0x3e, 0x37, 0x00, 0x5d, 0x12, 0x16, 0xb2, 0xdb, 0x8c,
+ 0x58, 0x61, 0x66, 0x95, 0x4b, 0xfd, 0x92, 0x0b, 0xbd, 0x18, 0x85, 0x6a,
+ 0x96, 0xcf, 0xa8, 0xf2, 0xdb, 0x7c, 0xa3, 0xac, 0x66, 0x11, 0xdc, 0x5b,
+ 0xb3, 0x71, 0x2a, 0x32, 0xd8, 0xdd, 0xa1, 0xa9, 0x5f, 0xda, 0x69, 0x6d,
+ 0x9e, 0x4f, 0x2a, 0xa3, 0x70, 0xb9, 0x46, 0x01, 0xda, 0x0d, 0x6e, 0xf9,
+ 0x71, 0x5a, 0xef, 0xed, 0x45, 0x5a, 0x9d, 0x6b, 0x39, 0xd4, 0x40, 0x73,
+ 0xf8, 0x4e, 0xbf, 0x7b, 0x35, 0xfe, 0xdd, 0xde, 0x1e, 0xa5, 0x4c, 0x6e,
+ 0x21, 0xb5, 0xed, 0xd9, 0x93, 0xbd, 0xfd, 0xed, 0x98, 0xbe, 0x17, 0xe4,
+ 0x00, 0x90, 0xfe, 0xb7, 0xf4, 0xf6, 0x9b, 0x02, 0x62, 0x92, 0x1e, 0x6d,
+ 0x07, 0x9e, 0x65, 0x48, 0x27, 0x42, 0x0d, 0x98, 0x8d, 0x7c, 0x50, 0x9e,
+ 0x55, 0x10, 0xa6, 0xf5, 0x2a, 0x61, 0x37, 0x78, 0xfe, 0x07, 0x1b, 0x96,
+ 0x10, 0xfc, 0x8c, 0x53, 0x8a, 0x56, 0x7b, 0xf3, 0x26, 0x02, 0xed, 0xba,
+ 0xe2, 0xfd, 0x75, 0x51, 0x52, 0x94, 0x03, 0xa5, 0x61, 0x79, 0xe3, 0xda,
+ 0xcc, 0x75, 0x82, 0x89, 0x88, 0x25, 0x06, 0xee, 0x38, 0x99, 0xd1, 0x46,
+ 0xc2, 0x27, 0x0e, 0x12, 0x4d, 0xdd, 0xa8, 0x76, 0xff, 0xbd, 0x2b, 0xdd,
+ 0x1e, 0x35, 0x48, 0xb2, 0x22, 0xf1, 0xba, 0x61, 0x2e, 0xdb, 0x46, 0x74,
+ 0xc4, 0x4f, 0x7a, 0x89, 0xaa, 0x49, 0xf2, 0x62, 0x6e, 0x5e, 0x9c, 0xc7,
+ 0xcb, 0x74, 0x0e, 0xb9, 0x33, 0xcf, 0x77, 0xc6, 0xb8, 0xcf, 0xaa, 0xb2,
+ 0xee, 0x14, 0x14, 0x68, 0xd3, 0x75, 0xf6, 0x81, 0xd0, 0x30, 0x02, 0x43,
+ 0x1a, 0x26, 0x6b, 0xe2, 0xd0, 0x64, 0x77, 0x02, 0x0c, 0x8f, 0x4d, 0xaa,
+ 0x6b, 0xd8, 0x1c, 0x24, 0x9b, 0xe8, 0x45, 0x83, 0x3f, 0xa9, 0x09, 0x3b,
+ 0x1a, 0x47, 0xe4, 0xe9, 0x7c, 0x13, 0x1d, 0x42, 0xba, 0xb8, 0xc3, 0x42,
+ 0x6b, 0x9b, 0x86, 0xfb, 0xf1, 0x68, 0xb8, 0xce, 0x54, 0x19, 0x2d, 0xf3,
+ 0x10, 0x24, 0xd7, 0x5a, 0xd2, 0x66, 0x28, 0x4d, 0x5c, 0xaa, 0x21, 0xeb,
+ 0xa0, 0x6b, 0x8a, 0x1d, 0xae, 0x0d, 0xb3, 0xd2, 0x97, 0x8d, 0xf8, 0x1b,
+ 0xcb, 0x15, 0x3e, 0x86, 0x5f, 0xda, 0xdd, 0xd6, 0xf9, 0x3b, 0x3b, 0xc3,
+ 0xe9, 0x61, 0xf9, 0xe7, 0xac, 0xaf, 0x47, 0xdb, 0x56, 0xbe, 0xe4, 0x4a,
+ 0x52, 0x7f, 0x49, 0x04, 0x5f, 0x8e, 0xda, 0x87, 0x19, 0x9b, 0x71, 0x52,
+ 0x26, 0xe7, 0xb7, 0x9a, 0x13, 0x85, 0x20, 0x0c, 0xa4, 0xdd, 0xd8, 0xa0,
+ 0x58, 0xaa, 0xd3, 0x1e, 0xb2, 0xb9, 0xfd, 0x2a, 0x11, 0xff, 0x01, 0x15,
+ 0x51, 0xdc, 0x54, 0x80, 0x56, 0x2c, 0x1c, 0x40, 0xeb, 0x3c, 0xeb, 0x03,
+ 0xdc, 0x51, 0xf4, 0x45, 0x73, 0x48, 0x73, 0xe9, 0x83, 0xa6, 0x99, 0x4b,
+ 0x95, 0x4e, 0x6b, 0x28, 0x81, 0x5f, 0xb5, 0xf0, 0xf1, 0xde, 0xbf, 0xfd,
+ 0x93, 0x27, 0x27, 0xad, 0xeb, 0x18, 0x85, 0x23, 0x52, 0x52, 0xfd, 0x60,
+ 0x5c, 0xa9, 0x4e, 0x49, 0x10, 0x65, 0x17, 0x0f, 0x49, 0x88, 0xbc, 0x30,
+ 0xfc, 0x34, 0x0b, 0x80, 0x75, 0xda, 0x2d, 0x44, 0x17, 0xd2, 0x20, 0xd2,
+ 0x55, 0xdc, 0x24, 0xf4, 0xae, 0xed, 0x5f, 0xeb, 0xfb, 0xdf, 0x87, 0xd0,
+ 0x31, 0xbb, 0xfe, 0x31, 0xb4, 0x36, 0x70, 0x25, 0x9d, 0x74, 0x6d, 0x09,
+ 0xb8, 0x5a, 0x01, 0x51, 0x34, 0xa3, 0x92, 0x37, 0x04, 0xce, 0x63, 0xc9,
+ 0xd5, 0x23, 0x6b, 0x20, 0x0d, 0x9c, 0x16, 0x94, 0x1c, 0xcd, 0xdd, 0x02,
+ 0x30, 0x18, 0x32, 0xc8, 0x66, 0xec, 0xca, 0xa4, 0x23, 0xb1, 0xf3, 0xc4,
+ 0xdd, 0x93, 0x79, 0x31, 0xc2, 0xba, 0xb9, 0xd1, 0x81, 0x6e, 0x3f, 0x31,
+ 0x43, 0xdc, 0xe4, 0xb3, 0xe6, 0x8a, 0xfa, 0x77, 0xa8, 0x29, 0x53, 0x4b,
+ 0x0d, 0x31, 0xbc, 0xca, 0x79, 0x58, 0x21, 0x33, 0x89, 0x7b, 0xdc, 0xf8,
+ 0xc4, 0x68, 0x4f, 0x13, 0xc6, 0xd2, 0x81, 0x63, 0x8d, 0x8e, 0x81, 0x9c,
+ 0xd0, 0x3b, 0xac, 0x9a, 0x59, 0x14, 0x89, 0xd4, 0x5c, 0xa2, 0x0b, 0x74,
+ 0xe6, 0x08, 0x5d, 0xea, 0x5a, 0xca, 0x32, 0xb2, 0x57, 0x84, 0xdb, 0xf5,
+ 0x7c, 0x64, 0x08, 0xed, 0xef, 0x36, 0xb5, 0x07, 0x25, 0x40, 0xd2, 0xbc,
+ 0x7c, 0x7b, 0x73, 0x43, 0x3f, 0xe6, 0x21, 0xaa, 0x3b, 0x7d, 0xde, 0xb0,
+ 0xb6, 0x05, 0xbf, 0xfe, 0x76, 0x53, 0x1d, 0x9b, 0xa8, 0xad, 0xbe, 0x4c,
+ 0xe5, 0xd7, 0x8c, 0xab, 0xb0, 0x79, 0xc9, 0x0f, 0x7d, 0xa3, 0x0f, 0x85,
+ 0xfd, 0x2f, 0xe1, 0x66, 0x67, 0xb7, 0xba, 0x26, 0xde, 0xd4, 0x07, 0x48,
+ 0xe6, 0xfe, 0x6e, 0x90, 0x3c, 0x5a, 0xd0, 0xa1, 0xec, 0x7d, 0x13, 0x45,
+ 0x1f, 0xe1, 0xc4, 0x32, 0x98, 0x4b, 0x9a, 0x15, 0x30, 0xfc, 0x13, 0xac,
+ 0x24, 0xda, 0x33, 0xa6, 0x4c, 0x5b, 0x37, 0xc2, 0xb5, 0x49, 0x4e, 0x7a,
+ 0x75, 0x95, 0x19, 0x1c, 0xd5, 0x12, 0x5a, 0xfd, 0x2c, 0x53, 0x44, 0xe1,
+ 0x05, 0xb9, 0x23, 0x91, 0x59, 0xb1, 0x94, 0xd2, 0x79, 0x90, 0xea, 0xd0,
+ 0xc2, 0x15, 0xd6, 0x73, 0x3c, 0x40, 0x2d, 0x75, 0xca, 0x20, 0x0b, 0x73,
+ 0xbe, 0x24, 0x8b, 0xc6, 0x76, 0xbd, 0xf2, 0xa6, 0x84, 0x0a, 0xb8, 0x69,
+ 0x22, 0x4e, 0x99, 0x4f, 0x28, 0x12, 0xe7, 0x94, 0xce, 0x93, 0xd7, 0xcd,
+ 0x30, 0x82, 0x0d, 0xc9, 0x41, 0x9b, 0xd3, 0x93, 0xd3, 0x47, 0xdb, 0xb6,
+ 0x72, 0x8f, 0xd1, 0xd8, 0xa4, 0x98, 0x3a, 0xd1, 0xdc, 0x60, 0x5b, 0x66,
+ 0xad, 0x58, 0xae, 0x54, 0xd2, 0x13, 0x1a, 0x83, 0xd3, 0x4c, 0x9b, 0x6f,
+ 0xd0, 0xf7, 0xc8, 0x43, 0xef, 0x52, 0xca, 0xbd, 0xbe, 0x69, 0xee, 0x5a,
+ 0x32, 0x4f, 0x40, 0x6a, 0xd8, 0x67, 0x21, 0x04, 0x85, 0x64, 0xe1, 0x08,
+ 0x7e, 0xc3, 0x90, 0x4a, 0x85, 0x92, 0x76, 0xfb, 0x01, 0xe4, 0x39, 0x77,
+ 0x26, 0xc9, 0x49, 0x0a, 0x91, 0xf4, 0x0f, 0xa9, 0xc8, 0x71, 0x0f, 0x52,
+ 0x04, 0x41, 0x0b, 0xa7, 0x58, 0xde, 0xda, 0x80, 0x2a, 0xdc, 0x9b, 0x20,
+ 0x5b, 0xc6, 0x5f, 0x1d, 0xf5, 0xf6, 0x8c, 0xb6, 0x18, 0xf8, 0x2d, 0x13,
+ 0x4a, 0x3a, 0x1c, 0xa5, 0xc9, 0xbb, 0xe3, 0xf1, 0xb9, 0x1f, 0xf5, 0x21,
+ 0x3d, 0x2c, 0x48, 0x7b, 0x6c, 0x83, 0x40, 0x79, 0xb9, 0x03, 0xc7, 0x47,
+ 0xe3, 0xf3, 0x51, 0x0c, 0xdd, 0xfd, 0x20, 0x19, 0x23, 0x33, 0xff, 0x8d,
+ 0x97, 0xc4, 0xc1, 0x5d, 0x84, 0xa9, 0xa6, 0x8c, 0x43, 0x59, 0x94, 0x38,
+ 0x66, 0xc6, 0xcd, 0x2b, 0xbf, 0x81, 0x6e, 0x40, 0xa9, 0x98, 0xe2, 0x17,
+ 0x9c, 0xd2, 0x28, 0xe9, 0x90, 0x1a, 0xd6, 0xa9, 0x57, 0x93, 0xa1, 0x87,
+ 0xba, 0xc6, 0xfa, 0x0e, 0xb5, 0xf3, 0x31, 0xd4, 0x6b, 0x24, 0xd4, 0xc7,
+ 0xd0, 0x28, 0xdc, 0x12, 0x7a, 0x62, 0x42, 0x12, 0xbc, 0xbc, 0x96, 0x77,
+ 0x7a, 0x9a, 0x64, 0x84, 0xcf, 0x49, 0x7e, 0x21, 0x3c, 0xfd, 0x20, 0xa2,
+ 0xc2, 0x46, 0x74, 0xf6, 0x51, 0xfa, 0xbf, 0xb5, 0xb3, 0x9b, 0x11, 0x65,
+ 0xf3, 0x50, 0xc4, 0xd6, 0x05, 0x16, 0x3d, 0x2a, 0x54, 0x38, 0x3f, 0xa1,
+ 0x3a, 0x6e, 0x48, 0xcd, 0x4e, 0x22, 0x3b, 0xeb, 0x3e, 0xc0, 0xd0, 0x7c,
+ 0xc6, 0x98, 0x79, 0x75, 0x1b, 0x34, 0x8f, 0x0b, 0xa4, 0xc1, 0x72, 0xb8,
+ 0x59, 0x08, 0x3c, 0x19, 0x3d, 0x27, 0xc9, 0x3e, 0xb4, 0x56, 0x2a, 0xdb,
+ 0xf0, 0x47, 0x4e, 0x8e, 0xa4, 0xc0, 0xd6, 0x20, 0x06, 0xe6, 0x14, 0x83,
+ 0x20, 0xb1, 0x40, 0x0d, 0x45, 0xf2, 0xfe, 0xe8, 0xf5, 0xb1, 0xdd, 0x2f,
+ 0xd9, 0x1f, 0x4a, 0xb7, 0xb3, 0x4b, 0x45, 0x0a, 0xbc, 0x32, 0x4d, 0x3a,
+ 0x91, 0x20, 0x4a, 0xb3, 0x2a, 0x72, 0xf3, 0xfd, 0x84, 0x55, 0xd7, 0x0b,
+ 0x64, 0x7d, 0x57, 0xd4, 0xe3, 0x5b, 0xc5, 0xd8, 0x66, 0x6d, 0x5b, 0x5e,
+ 0xe5, 0x33, 0xb9, 0xa9, 0x1f, 0x35, 0xdc, 0xd8, 0x93, 0xab, 0xb8, 0x16,
+ 0x65, 0x61, 0xaf, 0x0d, 0x85, 0x48, 0x88, 0xa8, 0x02, 0x5c, 0x64, 0xc4,
+ 0xd1, 0x0e, 0x95, 0x3a, 0x05, 0xca, 0x45, 0xc6, 0x50, 0xd2, 0x2e, 0x85,
+ 0xa6, 0x0d, 0xc9, 0x51, 0x56, 0x52, 0x22, 0xb5, 0xf5, 0xe6, 0xec, 0xe4,
+ 0xed, 0xf0, 0xfc, 0x84, 0x1a, 0x63, 0xd3, 0xd0, 0x49, 0x44, 0xdf, 0xe4,
+ 0xb7, 0x6a, 0xbf, 0xbb, 0x77, 0x3b, 0xd7, 0x6c, 0xab, 0xde, 0xd6, 0xe6,
+ 0xdb, 0x24, 0x50, 0x68, 0x7a, 0xfa, 0x56, 0xd0, 0xea, 0xa0, 0x60, 0x4d,
+ 0x84, 0x1c, 0x0f, 0x86, 0x96, 0xa6, 0x29, 0x14, 0x46, 0x1b, 0x79, 0xa2,
+ 0x01, 0x94, 0x75, 0x4f, 0x56, 0xf5, 0x5d, 0x22, 0x85, 0x68, 0x35, 0x27,
+ 0x46, 0x36, 0xa1, 0x3b, 0x5f, 0x91, 0xbd, 0x2c, 0xa8, 0x09, 0x0a, 0x74,
+ 0xb8, 0x02, 0xa4, 0x29, 0xcd, 0xed, 0x4d, 0xab, 0xaa, 0xbc, 0x51, 0xb9,
+ 0x45, 0x65, 0xa2, 0xe6, 0x18, 0xcd, 0xd4, 0x71, 0x4e, 0xd5, 0x5d, 0x2f,
+ 0x12, 0x84, 0x80, 0x1b, 0x69, 0x97, 0xe1, 0xb5, 0xea, 0xdf, 0x93, 0x76,
+ 0x7d, 0xbe, 0x66, 0x8b, 0x0e, 0x9b, 0x6a, 0x55, 0x87, 0x0d, 0xcb, 0x35,
+ 0x4f, 0xe7, 0x98, 0x42, 0xc3, 0x48, 0x30, 0xf5, 0xde, 0x19, 0x08, 0x00,
+ 0x1b, 0xf0, 0x3a, 0xa8, 0x35, 0x94, 0xad, 0xe6, 0xd1, 0x26, 0x25, 0x7f,
+ 0x08, 0x6e, 0xb0, 0xc0, 0xb2, 0x42, 0xa9, 0x47, 0xcb, 0x47, 0x4a, 0x31,
+ 0x75, 0x3d, 0xfb, 0xf2, 0x86, 0x7b, 0xf5, 0x69, 0x06, 0x28, 0x01, 0x2f,
+ 0x11, 0x37, 0xc0, 0x4f, 0x03, 0x5d, 0x52, 0x11, 0x55, 0x72, 0x54, 0xb3,
+ 0xcf, 0x56, 0x53, 0x3a, 0x25, 0x84, 0xe8, 0xd0, 0x0a, 0x70, 0xc2, 0x18,
+ 0x8f, 0x5a, 0x10, 0x8e, 0xa1, 0x5d, 0x6a, 0x2d, 0x7b, 0x5c, 0xba, 0x5a,
+ 0x16, 0x3f, 0x65, 0xbb, 0x1b, 0x41, 0x95, 0x44, 0xe6, 0x4e, 0xc6, 0x6a,
+ 0x65, 0xd5, 0x35, 0x39, 0x11, 0x04, 0xb2, 0xed, 0x55, 0x23, 0xec, 0x0a,
+ 0x00, 0xdb, 0x04, 0x2d, 0x2c, 0x51, 0x7a, 0xa0, 0xe0, 0x81, 0x7c, 0x29,
+ 0x4a, 0xfe, 0x75, 0x5a, 0x1b, 0xb6, 0xd4, 0x1e, 0x71, 0x7b, 0x8d, 0x3f,
+ 0x79, 0xa5, 0x49, 0xd8, 0xde, 0xe9, 0xb5, 0xf2, 0x7d, 0x7b, 0x4e, 0xee,
+ 0xe8, 0xc2, 0x6f, 0x62, 0x24, 0xd9, 0x14, 0xde, 0x9e, 0x0b, 0x97, 0x22,
+ 0x98, 0xb6, 0x4b, 0x6e, 0x55, 0x8e, 0x4c, 0xd9, 0x59, 0xac, 0x06, 0x47,
+ 0x7b, 0xbf, 0x35, 0x89, 0x7e, 0x34, 0xd9, 0xd2, 0x2a, 0x31, 0x5b, 0xb5,
+ 0x70, 0x2c, 0xbf, 0x3a, 0xb0, 0x65, 0x6c, 0xe0, 0x69, 0x9d, 0xe1, 0x1e,
+ 0xfd, 0xf8, 0x63, 0xd2, 0x6e, 0xd6, 0xba, 0xdd, 0x57, 0x39, 0x2f, 0x09,
+ 0xec, 0xb3, 0xd2, 0x9f, 0x6e, 0x50, 0x83, 0xc3, 0x34, 0x67, 0x14, 0x02,
+ 0x4a, 0xf7, 0x25, 0xdf, 0x8b, 0x78, 0x89, 0x8c, 0xf5, 0x77, 0xa5, 0x45,
+ 0x19, 0x94, 0x70, 0xe1, 0x32, 0x2e, 0x90, 0xd1, 0x4c, 0x05, 0x61, 0x61,
+ 0x5a, 0x12, 0x31, 0x5c, 0x4d, 0x96, 0xe0, 0x20, 0x08, 0xe5, 0xaf, 0xfa,
+ 0x9b, 0xe5, 0xda, 0x79, 0xd7, 0x57, 0x08, 0x06, 0x08, 0xa8, 0xeb, 0xbd,
+ 0x0d, 0x65, 0x19, 0x27, 0x80, 0xd6, 0x45, 0x02, 0x9f, 0xe1, 0xe7, 0x39,
+ 0xe7, 0x6d, 0x5a, 0x65, 0xe2, 0x6b, 0x10, 0xf5, 0x29, 0x06, 0x20, 0x08,
+ 0x80, 0x0f, 0x49, 0xc2, 0x1e, 0xd1, 0x09, 0xa7, 0xde, 0x8d, 0x71, 0xe8,
+ 0x6c, 0x9d, 0x33, 0xe3, 0x9c, 0xed, 0xb0, 0x7b, 0x7d, 0x09, 0xfd, 0x09,
+ 0xf5, 0xf2, 0x04, 0x30, 0x55, 0xb2, 0x53, 0x4b, 0x1a, 0x8d, 0xb2, 0xb4,
+ 0xf9, 0x83, 0xde, 0xdb, 0x51, 0x3b, 0x80, 0x05, 0x2a, 0x88, 0xc5, 0x2c,
+ 0x95, 0x99, 0xd0, 0xc1, 0x00, 0x08, 0x14, 0xd5, 0xc7, 0xda, 0xbf, 0x08,
+ 0xbe, 0x5d, 0x8d, 0x6a, 0xb3, 0x3e, 0x4d, 0x65, 0xeb, 0xdc, 0x45, 0x3c,
+ 0x00, 0xa5, 0x75, 0x57, 0x16, 0x49, 0x37, 0xe4, 0xa7, 0x74, 0x18, 0x56,
+ 0xec, 0xdb, 0x32, 0x26, 0xe9, 0x90, 0x1e, 0xab, 0xfb, 0xf2, 0x43, 0x5c,
+ 0x98, 0x4b, 0x3a, 0x2d, 0xf8, 0x1b, 0xa6, 0x4e, 0x32, 0x0b, 0x90, 0x20,
+ 0x35, 0x29, 0x02, 0xd9, 0x8f, 0xf2, 0xfc, 0xee, 0xd5, 0xf2, 0x43, 0x7d,
+ 0x84, 0x47, 0x60, 0xfe, 0x7d, 0xfa, 0xfe, 0x7c, 0xdb, 0xf5, 0xa3, 0x17,
+ 0x6a, 0xf5, 0x73, 0xda, 0xa5, 0xd6, 0x2d, 0x4c, 0xdb, 0x67, 0x04, 0x00,
+ 0xe1, 0x53, 0x92, 0xbd, 0x23, 0x17, 0x03, 0x2e, 0x96, 0x47, 0xbb, 0x7b,
+ 0xc6, 0x8e, 0xda, 0xdd, 0xa7, 0xe6, 0xb4, 0x8f, 0x76, 0x1f, 0xd9, 0xa2,
+ 0x69, 0x7d, 0x2a, 0x84, 0xb4, 0xe7, 0x17, 0xc9, 0x6b, 0x42, 0xb4, 0xff,
+ 0xe8, 0xf6, 0x96, 0x7e, 0xdc, 0x4e, 0xc5, 0x1e, 0xda, 0xf2, 0x25, 0x7f,
+ 0x9a, 0x51, 0xb9, 0xef, 0xed, 0x37, 0x85, 0xe2, 0x56, 0x05, 0x17, 0x0b,
+ 0x52, 0xf3, 0x5f, 0x60, 0x0c, 0x8c, 0xfa, 0xda, 0x58, 0x35, 0x5d, 0x18,
+ 0x25, 0xbf, 0x8f, 0x95, 0xa1, 0x14, 0x2c, 0xdd, 0x6e, 0x8e, 0x02, 0x16,
+ 0x84, 0xac, 0x99, 0x1e, 0xe3, 0xfa, 0x08, 0xa8, 0x0b, 0x8f, 0x76, 0x6f,
+ 0x7d, 0xa5, 0xb8, 0x45, 0x10, 0x46, 0xd4, 0x09, 0x43, 0xd2, 0xcc, 0xfb,
+ 0xd0, 0x09, 0x01, 0xee, 0x77, 0x80, 0xbc, 0x0e, 0x73, 0x25, 0x68, 0x7f,
+ 0xf5, 0xaf, 0xfb, 0x92, 0xdb, 0xc1, 0xff, 0x7a, 0xd4, 0x96, 0x94, 0x70,
+ 0x0f, 0xeb, 0x98, 0x2f, 0xe4, 0x2f, 0x81, 0xaf, 0x92, 0x7a, 0x92, 0x42,
+ 0x31, 0xa6, 0x66, 0x12, 0xdb, 0xd6, 0x7d, 0x42, 0x06, 0x1f, 0x86, 0xb0,
+ 0xd3, 0x12, 0x25, 0x45, 0x9a, 0x3d, 0x0b, 0x83, 0xee, 0xd2, 0x46, 0x4b,
+ 0x3e, 0x8c, 0xfa, 0xfb, 0x0d, 0xa9, 0x2e, 0x18, 0x7c, 0x42, 0x73, 0x22,
+ 0x6c, 0x7d, 0xb1, 0x55, 0x89, 0xcb, 0x65, 0xec, 0xee, 0x8a, 0x68, 0x80,
+ 0x68, 0x55, 0x4f, 0xbb, 0xcc, 0xb0, 0x33, 0x17, 0xa3, 0x56, 0x34, 0xa4,
+ 0xb8, 0xd5, 0x52, 0x54, 0x17, 0x98, 0xa8, 0xd8, 0x8a, 0x01, 0xdb, 0xa8,
+ 0xdc, 0x94, 0x19, 0xdd, 0x35, 0x34, 0x31, 0xb2, 0x35, 0x51, 0x0e, 0x5d,
+ 0x10, 0x18, 0xac, 0x64, 0x56, 0x44, 0x24, 0x1a, 0x67, 0x55, 0x84, 0x8b,
+ 0x5c, 0x22, 0x51, 0x3c, 0x23, 0x9d, 0x5f, 0xfa, 0xc6, 0x3e, 0x1e, 0xd0,
+ 0xdf, 0x9e, 0xec, 0x3e, 0xdf, 0x57, 0x44, 0x83, 0xc3, 0xf3, 0x37, 0x5d,
+ 0x67, 0x5e, 0x65, 0xe8, 0x89, 0xff, 0x3b, 0xcc, 0xd2, 0xea, 0xca, 0x18,
+ 0x17, 0x80, 0x55, 0x19, 0x02, 0xab, 0x7f, 0xb8, 0xbb, 0x1b, 0x4b, 0xb4,
+ 0xf8, 0x84, 0xa5, 0xe4, 0x8f, 0x1e, 0xb7, 0x63, 0x70, 0x50, 0xe9, 0x87,
+ 0xd8, 0xf1, 0x7e, 0xd4, 0x4f, 0xa6, 0x2f, 0xe7, 0x9f, 0x73, 0xc0, 0xd0,
+ 0xf2, 0x46, 0x2b, 0xc8, 0x1e, 0x64, 0xc9, 0xc4, 0xba, 0xc3, 0x74, 0x5c,
+ 0xea, 0x92, 0x4c, 0xb4, 0xc5, 0x36, 0x44, 0x73, 0xb7, 0xcd, 0x7e, 0x6b,
+ 0x7c, 0x88, 0x3a, 0x43, 0x11, 0x8b, 0x17, 0x23, 0x22, 0x5a, 0x64, 0x5b,
+ 0x4b, 0x9d, 0x51, 0x95, 0x01, 0x9e, 0x89, 0xd5, 0x3e, 0x69, 0xb1, 0x73,
+ 0x3f, 0xc4, 0x14, 0x6d, 0x41, 0x35, 0x5d, 0x4a, 0xc1, 0x19, 0xff, 0x1b,
+ 0xa2, 0xb8, 0x95, 0xf0, 0xba, 0xff, 0x24, 0xb2, 0x71, 0x24, 0xb0, 0x7f,
+ 0xc1, 0xc6, 0xb5, 0xf7, 0xcd, 0x29, 0x47, 0xec, 0xc2, 0x23, 0x83, 0x57,
+ 0x22, 0x05, 0x21, 0xf4, 0x4f, 0xad, 0x2d, 0x60, 0x7f, 0xf1, 0x5a, 0xb0,
+ 0xdd, 0xa3, 0x75, 0x40, 0x75, 0xee, 0xad, 0x7b, 0xd6, 0x32, 0xb6, 0x89,
+ 0x4f, 0xed, 0x95, 0x0c, 0x5c, 0x97, 0x04, 0x48, 0x8f, 0x85, 0x34, 0x81,
+ 0x22, 0x5f, 0x03, 0x45, 0x20, 0xbb, 0x20, 0x12, 0xd9, 0x32, 0xa3, 0xa5,
+ 0xfb, 0x89, 0x06, 0x1e, 0x71, 0x5b, 0x1b, 0x15, 0x65, 0xc5, 0x5a, 0x3c,
+ 0x65, 0xa4, 0x68, 0xbe, 0x04, 0x3a, 0x40, 0x1d, 0xf5, 0xb3, 0xb4, 0x3b,
+ 0xbd, 0xd3, 0x5e, 0xaa, 0x4f, 0x76, 0x20, 0x72, 0x4c, 0xde, 0xd7, 0x3d,
+ 0xb6, 0x69, 0x5c, 0x61, 0x01, 0x2d, 0xcc, 0x75, 0x1a, 0xc2, 0x1e, 0x55,
+ 0xe9, 0xaa, 0x70, 0x79, 0xec, 0x32, 0x2e, 0xfe, 0xfd, 0x59, 0x38, 0xd2,
+ 0xe6, 0x04, 0x45, 0xd5, 0x65, 0xbf, 0x3f, 0x7b, 0xf3, 0x27, 0x35, 0xbb,
+ 0xb7, 0x07, 0x7d, 0x96, 0xb0, 0xce, 0xd6, 0x2f, 0x95, 0xf2, 0x92, 0xf7,
+ 0xa4, 0x62, 0xbc, 0xb5, 0xf1, 0xee, 0x1f, 0x61, 0x9e, 0x37, 0xc3, 0x9e,
+ 0x26, 0x5b, 0x08, 0xb3, 0x99, 0xa7, 0xc6, 0x62, 0xd2, 0x3d, 0x1a, 0x3d,
+ 0x21, 0x8f, 0xc8, 0x9b, 0x57, 0x4f, 0x1e, 0xed, 0xef, 0x19, 0xab, 0x75,
+ 0xab, 0xc3, 0x2d, 0xb6, 0xef, 0x5d, 0x66, 0xfb, 0xbc, 0xb3, 0xdb, 0x25,
+ 0x68, 0x6f, 0xeb, 0xf0, 0xc7, 0xd3, 0x77, 0x9d, 0x45, 0xd2, 0x09, 0x04,
+ 0x81, 0xd4, 0x35, 0x6b, 0x74, 0xd2, 0x36, 0x20, 0x29, 0xe9, 0x6e, 0x1b,
+ 0x86, 0x2a, 0xdf, 0x54, 0x39, 0xf4, 0xdc, 0x0d, 0xec, 0xc7, 0xc6, 0x71,
+ 0x59, 0xcc, 0x8c, 0xf4, 0x3f, 0x01, 0x9c, 0x57, 0xb6, 0x61, 0x64, 0xc9,
+ 0xbd, 0xab, 0xeb, 0xbf, 0x26, 0x6f, 0x07, 0x74, 0x55, 0x8a, 0x30, 0x25,
+ 0xe5, 0x2d, 0xfd, 0x90, 0xd0, 0x53, 0x01, 0x84, 0xc0, 0x35, 0x66, 0x2b,
+ 0x58, 0x39, 0x70, 0xef, 0xc2, 0x34, 0x6b, 0xdf, 0xb6, 0x5b, 0x6a, 0x5e,
+ 0x42, 0x1e, 0x9f, 0x17, 0xe4, 0xd0, 0xee, 0x8b, 0x85, 0xf0, 0xca, 0x39,
+ 0x12, 0x42, 0x8f, 0x6f, 0xa9, 0x53, 0x7f, 0xdb, 0x6b, 0xfd, 0x4c, 0xfa,
+ 0xbb, 0x86, 0x3a, 0x48, 0x51, 0x8f, 0x75, 0xd8, 0xa6, 0x47, 0x9d, 0x61,
+ 0x91, 0xb7, 0x93, 0xd8, 0xe9, 0x2a, 0x52, 0xe5, 0xf8, 0xa0, 0x0d, 0x74,
+ 0x16, 0xf1, 0x81, 0x53, 0xc8, 0x9f, 0xba, 0x73, 0xa5, 0x45, 0x1b, 0x13,
+ 0x12, 0x85, 0xcf, 0x6c, 0x01, 0x65, 0xb7, 0xd4, 0x70, 0xd1, 0xa8, 0x88,
+ 0x4f, 0x1f, 0x45, 0x6a, 0xb8, 0x68, 0x31, 0xa2, 0xdb, 0x55, 0xbe, 0x12,
+ 0xc0, 0x12, 0x5a, 0x94, 0xde, 0x81, 0x17, 0x84, 0x40, 0x0c, 0x82, 0xcc,
+ 0xa8, 0xcd, 0xef, 0x36, 0xa3, 0xd1, 0x37, 0x0e, 0x4a, 0xf0, 0x5a, 0xc5,
+ 0xab, 0x83, 0x3b, 0x42, 0x81, 0x09, 0x89, 0x34, 0x50, 0x24, 0x82, 0x07,
+ 0x79, 0xbb, 0x99, 0xd8, 0x60, 0x44, 0xd7, 0xda, 0xbf, 0x37, 0x34, 0x91,
+ 0x37, 0xf1, 0x58, 0x04, 0x07, 0x23, 0xba, 0x26, 0xa8, 0x0d, 0x4d, 0xb4,
+ 0x88, 0xef, 0xc9, 0xe7, 0x11, 0xe2, 0x7b, 0x77, 0x72, 0x7e, 0x78, 0x20,
+ 0x79, 0xd4, 0x0e, 0x39, 0x43, 0x2d, 0x05, 0xce, 0x25, 0xe3, 0xb6, 0xcf,
+ 0x5c, 0x59, 0x44, 0xf8, 0x8e, 0x7c, 0xee, 0x83, 0xc8, 0x95, 0xa7, 0xa4,
+ 0x6e, 0xdc, 0x12, 0xf6, 0xf4, 0x36, 0xbd, 0x68, 0x9a, 0x54, 0x16, 0x2c,
+ 0x96, 0x01, 0x07, 0x25, 0x71, 0xfc, 0x21, 0x8a, 0x02, 0x50, 0x25, 0xc8,
+ 0x86, 0x04, 0x68, 0x2a, 0x8b, 0xdc, 0x80, 0x88, 0x58, 0x96, 0x91, 0xc5,
+ 0xa5, 0xa5, 0xc1, 0xe8, 0xbd, 0x18, 0x36, 0x0c, 0xa4, 0x08, 0xdd, 0x1b,
+ 0x69, 0x3a, 0x4d, 0xf6, 0x88, 0x85, 0xe4, 0x5b, 0x27, 0xe2, 0x5c, 0x20,
+ 0xb1, 0x7b, 0xa9, 0xc4, 0x38, 0x83, 0x17, 0xb0, 0x07, 0x29, 0x04, 0x6e,
+ 0x40, 0x1b, 0x59, 0x54, 0x22, 0x81, 0xaa, 0xa1, 0x56, 0x1a, 0x8c, 0x4a,
+ 0x6b, 0xa5, 0x50, 0xfe, 0x9e, 0x54, 0x21, 0xc6, 0x04, 0x4e, 0xc7, 0x4d,
+ 0xe5, 0x4c, 0x6e, 0x55, 0xd8, 0x28, 0xd7, 0x06, 0x7b, 0x2b, 0xe1, 0x4a,
+ 0x52, 0x17, 0xe2, 0xa8, 0x8d, 0x7e, 0x3d, 0xb2, 0xa8, 0xd4, 0x10, 0x7d,
+ 0x53, 0x23, 0xb8, 0xfd, 0x92, 0x01, 0xd2, 0xf9, 0xc8, 0x98, 0xcd, 0xb9,
+ 0x28, 0xdc, 0x7c, 0xe2, 0xc9, 0x6e, 0x8f, 0x2d, 0xcb, 0x1a, 0xef, 0x38,
+ 0x6b, 0xba, 0x71, 0xee, 0xe1, 0x9e, 0xc5, 0xeb, 0xc8, 0xa9, 0x10, 0x56,
+ 0x90, 0x9f, 0x3e, 0x5d, 0x88, 0x69, 0x31, 0x90, 0x33, 0x5a, 0x9b, 0x78,
+ 0xf8, 0xd6, 0x06, 0x7d, 0xf1, 0x14, 0x05, 0x26, 0xe4, 0x49, 0x56, 0x95,
+ 0xe0, 0x4d, 0x63, 0x0f, 0x20, 0xbe, 0x79, 0x73, 0x55, 0xce, 0xfd, 0xe8,
+ 0x77, 0xd8, 0x53, 0x1b, 0x85, 0x6a, 0x89, 0x0f, 0x56, 0xa4, 0x25, 0x42,
+ 0x72, 0x2a, 0xd8, 0x74, 0x72, 0xb8, 0x4d, 0x50, 0xea, 0x9b, 0xfc, 0xa5,
+ 0x9c, 0x88, 0x0f, 0x06, 0x85, 0x6e, 0x97, 0x51, 0xd4, 0x0f, 0x42, 0x87,
+ 0x34, 0xb2, 0xca, 0xd0, 0xd9, 0x6c, 0xc5, 0xae, 0x55, 0xcc, 0x47, 0x92,
+ 0xa7, 0xb9, 0x51, 0x2c, 0x42, 0x1e, 0xc9, 0x65, 0xc9, 0xcd, 0x62, 0xe1,
+ 0xaf, 0x61, 0x38, 0xeb, 0xb0, 0xa0, 0x71, 0xbf, 0x8b, 0xec, 0x90, 0x4e,
+ 0xe1, 0x0f, 0x31, 0x43, 0x4b, 0x21, 0x35, 0x83, 0x73, 0xb9, 0x0c, 0xf3,
+ 0x74, 0xda, 0xac, 0x64, 0xe3, 0xbb, 0xb3, 0x2b, 0xd5, 0x45, 0x6a, 0xde,
+ 0x25, 0xc8, 0x68, 0xca, 0x43, 0x9a, 0x1a, 0xba, 0x4b, 0xa7, 0x77, 0xaa,
+ 0x2c, 0x38, 0xc9, 0x2a, 0xe0, 0x6f, 0x0e, 0x60, 0x3a, 0x58, 0xac, 0x9d,
+ 0x04, 0xa2, 0x9d, 0x79, 0xdd, 0xd3, 0xd9, 0xe1, 0x37, 0xb5, 0x53, 0xfc,
+ 0xfe, 0x3c, 0xec, 0x74, 0x56, 0x90, 0xba, 0xd6, 0x55, 0xcf, 0x9a, 0x14,
+ 0x7b, 0x7c, 0x4f, 0xcd, 0x7e, 0xcb, 0x23, 0xc0, 0x41, 0x41, 0xc2, 0x90,
+ 0x42, 0x45, 0x0c, 0x45, 0xc1, 0x35, 0xd5, 0x01, 0x39, 0x52, 0xa1, 0x1e,
+ 0xf1, 0x56, 0xbe, 0xa2, 0xa9, 0x10, 0x5b, 0xc4, 0xae, 0x6c, 0xd1, 0x11,
+ 0x5b, 0x9a, 0x8f, 0x39, 0x69, 0xec, 0xc9, 0xe7, 0x4f, 0x1e, 0x6f, 0xb7,
+ 0xd3, 0x06, 0xb7, 0x23, 0xd9, 0xdb, 0x74, 0xe1, 0x04, 0x7e, 0x9d, 0x24,
+ 0x7b, 0x8e, 0x76, 0x7a, 0x1c, 0x92, 0x13, 0xbf, 0x66, 0xce, 0xfd, 0x75,
+ 0xe0, 0x61, 0xa7, 0x4e, 0x55, 0x12, 0xfb, 0x0c, 0xf2, 0x07, 0xa8, 0xab,
+ 0x6a, 0xc6, 0xaf, 0x6f, 0x89, 0x22, 0xe4, 0xb8, 0xb7, 0xab, 0xe5, 0x61,
+ 0x1c, 0x70, 0xd2, 0xd2, 0x34, 0xf7, 0x6d, 0x1b, 0x09, 0xb3, 0x31, 0x09,
+ 0x4a, 0x3b, 0x4f, 0x8a, 0xaa, 0x68, 0x30, 0x68, 0xdd, 0x5c, 0x7a, 0x42,
+ 0x41, 0xfc, 0x22, 0x8c, 0x18, 0x2d, 0x62, 0x27, 0x89, 0x81, 0xda, 0x52,
+ 0x4d, 0xba, 0x94, 0xff, 0xbb, 0x8d, 0xa4, 0x31, 0x18, 0x27, 0x11, 0xa4,
+ 0xa2, 0x23, 0x48, 0x86, 0x94, 0x9c, 0x0b, 0x89, 0xc7, 0x40, 0x20, 0x2f,
+ 0xb4, 0x93, 0x0c, 0xab, 0x1e, 0xa5, 0xa4, 0x37, 0xb0, 0x8d, 0xae, 0xbd,
+ 0xe3, 0x25, 0xc1, 0xb7, 0x0f, 0xa4, 0x43, 0xfd, 0x20, 0xa9, 0xe2, 0x09,
+ 0xb4, 0x26, 0xd6, 0x5b, 0x90, 0xa2, 0xd4, 0xa6, 0xb0, 0x1d, 0xdd, 0x3a,
+ 0x14, 0xfd, 0xbb, 0xa5, 0xca, 0xb0, 0x04, 0x8d, 0xbf, 0xda, 0xd9, 0x87,
+ 0x9e, 0xd9, 0x93, 0x25, 0xc5, 0x18, 0x5b, 0xe4, 0x49, 0x09, 0x1b, 0x49,
+ 0xce, 0x93, 0x2d, 0x9a, 0xf0, 0xce, 0xce, 0xf6, 0xfd, 0x93, 0x96, 0x27,
+ 0xef, 0x9b, 0xe4, 0x29, 0xbb, 0x36, 0x18, 0x7b, 0xde, 0x02, 0x57, 0xb9,
+ 0x59, 0xe0, 0xab, 0x38, 0x32, 0x46, 0x88, 0xe7, 0x34, 0xc2, 0x4a, 0x14,
+ 0x13, 0x14, 0x15, 0x87, 0x4e, 0x7c, 0xc9, 0x4b, 0xa3, 0xe5, 0xb5, 0x57,
+ 0x2e, 0x26, 0x2f, 0x03, 0x7f, 0x09, 0x03, 0xa1, 0xc4, 0x28, 0x82, 0x62,
+ 0x4a, 0x5e, 0x1a, 0x2a, 0x0c, 0xf5, 0xcd, 0x56, 0x9f, 0x72, 0x6f, 0x7d,
+ 0x6c, 0xe6, 0xfa, 0xd5, 0x8d, 0x74, 0x35, 0x5a, 0x2e, 0xf9, 0x48, 0x31,
+ 0x83, 0x3c, 0x6a, 0xd3, 0x2b, 0xb9, 0xe9, 0xf2, 0x28, 0x00, 0x4f, 0xe5,
+ 0x07, 0xbd, 0xd6, 0xd9, 0x91, 0xc2, 0x74, 0xb1, 0xde, 0xd4, 0x47, 0xc8,
+ 0x63, 0x1a, 0x9e, 0xfa, 0xd1, 0xad, 0x9b, 0xd1, 0x4b, 0xb9, 0xbf, 0xf3,
+ 0x45, 0x0b, 0xe9, 0x2d, 0xad, 0x42, 0xaf, 0x3b, 0xcd, 0xcd, 0xd2, 0x37,
+ 0x37, 0x31, 0x27, 0xe0, 0x8e, 0x09, 0xff, 0xb4, 0xb5, 0x9d, 0x03, 0xbe,
+ 0xa6, 0x04, 0x99, 0x11, 0xd3, 0xd5, 0xa9, 0xc3, 0x5a, 0x58, 0xac, 0xed,
+ 0x36, 0xd0, 0x15, 0xab, 0x7b, 0xd5, 0xe8, 0xf7, 0x64, 0xe1, 0x75, 0x3d,
+ 0x13, 0xe2, 0x6a, 0xd3, 0x41, 0xdb, 0xbe, 0x86, 0x67, 0x6d, 0x5f, 0x83,
+ 0x2d, 0x3c, 0x8f, 0x6b, 0x68, 0x9c, 0x7d, 0x59, 0x27, 0xef, 0xf4, 0xb1,
+ 0x64, 0x6b, 0x7c, 0xfa, 0xee, 0xf0, 0x9b, 0x93, 0xed, 0xfb, 0x7c, 0x94,
+ 0x3e, 0xff, 0xb7, 0x8b, 0x4a, 0x35, 0x49, 0x58, 0xe6, 0x4e, 0xb6, 0xc9,
+ 0x37, 0xe3, 0xf1, 0xf0, 0xe5, 0xe9, 0x11, 0x19, 0x02, 0xe3, 0xb1, 0xf9,
+ 0x4b, 0x1f, 0x6e, 0xf3, 0x48, 0xba, 0x31, 0x0d, 0xbf, 0x27, 0x45, 0x4f,
+ 0x79, 0x3f, 0xd9, 0x5b, 0x70, 0x03, 0x12, 0x35, 0x72, 0x42, 0x1e, 0xb5,
+ 0x7e, 0xd3, 0xda, 0x7d, 0x7c, 0xa0, 0x6b, 0xf2, 0x9c, 0x1e, 0xed, 0xd0,
+ 0xb7, 0x90, 0x3a, 0x4d, 0x0b, 0x8a, 0xbb, 0x0f, 0x56, 0x61, 0x2f, 0x3c,
+ 0x68, 0x3d, 0x94, 0x62, 0x4a, 0x0c, 0x5a, 0x93, 0xb7, 0x8d, 0xed, 0x07,
+ 0x71, 0x82, 0x78, 0x9d, 0x04, 0xec, 0xe2, 0xb5, 0x32, 0x8c, 0x50, 0x83,
+ 0x72, 0x08, 0x85, 0x58, 0xec, 0x78, 0xdf, 0xc8, 0x48, 0x63, 0x20, 0x2d,
+ 0xf4, 0x3a, 0x1f, 0x8b, 0xbd, 0xd5, 0x75, 0x8a, 0x6c, 0x0e, 0x57, 0xc9,
+ 0xc1, 0x26, 0x65, 0xe8, 0x14, 0xe5, 0xea, 0xf2, 0x2a, 0xf4, 0x3f, 0x74,
+ 0x3a, 0x62, 0x8a, 0x26, 0x45, 0xf4, 0x64, 0x66, 0x19, 0x90, 0x20, 0xbd,
+ 0xa8, 0x7a, 0x4f, 0x95, 0x21, 0x38, 0xc4, 0xea, 0x0d, 0x67, 0xfe, 0xcc,
+ 0xfe, 0x25, 0x7d, 0xa4, 0xd6, 0x68, 0x20, 0x13, 0x0e, 0x9c, 0x92, 0x1b,
+ 0xad, 0x68, 0xe6, 0x0b, 0xf9, 0x6b, 0x5a, 0xdc, 0x91, 0xbb, 0x54, 0xfc,
+ 0xf7, 0x54, 0xb0, 0x69, 0x69, 0xba, 0x4d, 0xe8, 0x4d, 0x35, 0x25, 0x43,
+ 0x9f, 0x53, 0x50, 0xb9, 0x52, 0xb3, 0x9f, 0x66, 0xa9, 0xfb, 0xf5, 0xc2,
+ 0xc8, 0x68, 0x32, 0xeb, 0x86, 0xc5, 0x40, 0xc7, 0x18, 0x18, 0x73, 0x58,
+ 0xc2, 0x64, 0x69, 0x23, 0xc9, 0x6c, 0x42, 0x05, 0x31, 0x56, 0xc4, 0x6d,
+ 0x1c, 0xb7, 0xd2, 0x49, 0x5d, 0xce, 0x57, 0x8d, 0xc4, 0x1e, 0xe1, 0x18,
+ 0x45, 0x45, 0xcc, 0xb6, 0xcd, 0x22, 0xa2, 0xa1, 0x5d, 0x06, 0x6a, 0x2c,
+ 0x71, 0xdf, 0xb5, 0x32, 0x1c, 0xb9, 0x40, 0x0b, 0x47, 0x12, 0xc5, 0x3f,
+ 0x81, 0x8d, 0xf5, 0x06, 0x5a, 0x52, 0x5a, 0xd2, 0x75, 0x19, 0x6f, 0xb2,
+ 0x8d, 0xf3, 0xd3, 0x73, 0x6a, 0x6d, 0x8f, 0x3a, 0xd8, 0xc1, 0xb9, 0x5b,
+ 0x99, 0xea, 0x6d, 0xb5, 0x31, 0x2c, 0x80, 0x8e, 0x93, 0x89, 0xa6, 0x0a,
+ 0x4c, 0x70, 0x4d, 0x26, 0x77, 0xf6, 0x5b, 0xfc, 0x99, 0x94, 0x52, 0x79,
+ 0xac, 0x22, 0xfc, 0x50, 0xf4, 0x14, 0x77, 0x1c, 0xa3, 0x75, 0xc9, 0x28,
+ 0xed, 0x2f, 0x75, 0x86, 0xfe, 0x3e, 0xa3, 0xb4, 0xb3, 0xf8, 0x19, 0xb3,
+ 0x8a, 0xef, 0x41, 0xa6, 0x48, 0x16, 0x24, 0x9d, 0xe9, 0x88, 0x1e, 0x0a,
+ 0x08, 0x18, 0x81, 0x74, 0xbb, 0x2a, 0x55, 0x8f, 0xe0, 0x6f, 0x4b, 0xb9,
+ 0xf5, 0x1e, 0xdf, 0x50, 0xef, 0x33, 0xb6, 0x76, 0xa7, 0x5c, 0xdf, 0x1d,
+ 0xd3, 0x1d, 0xce, 0xe8, 0x01, 0x1b, 0xe2, 0xd6, 0xef, 0x7e, 0x18, 0x58,
+ 0x76, 0xb4, 0x18, 0xc6, 0x5f, 0xa9, 0xa7, 0x16, 0xe9, 0x8b, 0x17, 0x66,
+ 0xc8, 0xf5, 0x83, 0xfc, 0xc5, 0x7c, 0xe4, 0x87, 0xbc, 0x30, 0xba, 0x61,
+ 0xbd, 0xed, 0x2b, 0x4a, 0xe1, 0xdd, 0xad, 0x36, 0x6b, 0x63, 0x87, 0x19,
+ 0xb6, 0xe3, 0x12, 0xf5, 0xa0, 0x39, 0x73, 0xc8, 0x46, 0x5d, 0xa0, 0x89,
+ 0x0b, 0x28, 0xdb, 0x26, 0x88, 0x77, 0xcb, 0xa0, 0xe0, 0x85, 0xab, 0x00,
+ 0x99, 0x95, 0x5c, 0x08, 0x42, 0x83, 0x99, 0x08, 0x5a, 0x5a, 0xb9, 0x08,
+ 0xbf, 0x85, 0x6a, 0xf2, 0xa3, 0x9b, 0x59, 0x11, 0xe9, 0x7f, 0x4d, 0x9c,
+ 0xad, 0x1b, 0xc5, 0xc2, 0xee, 0xd2, 0x1a, 0xb7, 0x9e, 0x98, 0x95, 0x35,
+ 0xcb, 0xad, 0xbd, 0x6d, 0xc6, 0xbb, 0x96, 0xbe, 0xcb, 0xa5, 0x13, 0xf7,
+ 0xa1, 0x17, 0x07, 0xb9, 0x85, 0x49, 0xf2, 0x8a, 0x21, 0x34, 0xc9, 0xdb,
+ 0x45, 0x19, 0xfe, 0x04, 0xff, 0x44, 0xa5, 0x77, 0x17, 0x7c, 0x89, 0x59,
+ 0x59, 0x90, 0x54, 0x45, 0xad, 0x6a, 0xec, 0x7a, 0x07, 0x28, 0xeb, 0x67,
+ 0x09, 0x14, 0x48, 0x2a, 0x45, 0x44, 0xdc, 0xc5, 0xba, 0xc4, 0xa5, 0x6f,
+ 0x90, 0xd4, 0x2a, 0x9b, 0x9d, 0x9b, 0xcf, 0x86, 0x60, 0x20, 0x97, 0x55,
+ 0x69, 0x44, 0x64, 0x15, 0xc1, 0xca, 0x13, 0x93, 0x82, 0x54, 0xfd, 0xac,
+ 0xb8, 0xce, 0xab, 0xb2, 0x20, 0x3c, 0xc2, 0xeb, 0xb4, 0xca, 0x29, 0xd2,
+ 0xbf, 0xf1, 0xed, 0xc9, 0xdb, 0xc3, 0x0d, 0xdf, 0x27, 0x72, 0x91, 0x8b,
+ 0x23, 0xfd, 0x2a, 0x44, 0x5c, 0xb6, 0xa7, 0x19, 0x71, 0x1a, 0x1a, 0x99,
+ 0x6e, 0x94, 0x1c, 0x1c, 0xeb, 0xb5, 0xdc, 0x24, 0xa8, 0xf5, 0x1a, 0x20,
+ 0x37, 0xba, 0xa4, 0xa4, 0x00, 0x48, 0x0b, 0x36, 0x25, 0x2e, 0x12, 0x80,
+ 0xd1, 0x4e, 0x19, 0x1e, 0x1e, 0x10, 0x35, 0xcc, 0x28, 0xfd, 0x46, 0x60,
+ 0x89, 0xd7, 0x2c, 0x0c, 0x9a, 0x3e, 0x13, 0x40, 0x5f, 0x37, 0xe8, 0xcd,
+ 0xc5, 0x1d, 0x0c, 0x9b, 0xcd, 0x16, 0xd5, 0x25, 0x9b, 0x35, 0x8c, 0xf1,
+ 0x66, 0x53, 0xb7, 0x97, 0xd2, 0x45, 0x1d, 0x07, 0x08, 0xbb, 0xb3, 0xf6,
+ 0x7c, 0x9a, 0xa9, 0x9a, 0x3f, 0xe1, 0x46, 0xe7, 0xc1, 0xdd, 0xed, 0x3b,
+ 0xe0, 0xdb, 0x77, 0xdb, 0xb5, 0xee, 0x42, 0xc0, 0x9a, 0xd4, 0x55, 0x74,
+ 0xb5, 0x1b, 0xbb, 0xb6, 0xa3, 0xf4, 0xc0, 0xa3, 0x0f, 0xbd, 0x8a, 0xe6,
+ 0xf3, 0xe5, 0x54, 0xa0, 0x83, 0x6c, 0x5c, 0x55, 0x72, 0x29, 0x05, 0x7e,
+ 0x82, 0x85, 0x94, 0xc6, 0x4c, 0x94, 0xe9, 0x63, 0xb8, 0x3e, 0x70, 0xc2,
+ 0x01, 0xe3, 0x4f, 0x2a, 0x44, 0x5b, 0x6e, 0x54, 0x83, 0x9b, 0xc2, 0x8f,
+ 0x21, 0xd3, 0x77, 0x06, 0x7e, 0xf5, 0xf3, 0x20, 0xe9, 0x81, 0x2b, 0x75,
+ 0xa9, 0x28, 0xf6, 0xb4, 0x18, 0xaf, 0x93, 0x11, 0x1f, 0x2d, 0xc2, 0x93,
+ 0xa2, 0x5e, 0x86, 0xfa, 0xf1, 0xc1, 0x20, 0x91, 0xad, 0xd4, 0xfb, 0x86,
+ 0xf0, 0x73, 0xc3, 0x00, 0x8b, 0x6c, 0xd4, 0x58, 0xa1, 0x55, 0xcc, 0x58,
+ 0x26, 0xa2, 0x57, 0x81, 0x40, 0xf2, 0xc6, 0xac, 0x6b, 0xbd, 0x8d, 0x66,
+ 0x65, 0x02, 0xb9, 0x5e, 0xaf, 0xaa, 0x6b, 0x2a, 0x52, 0x95, 0x4e, 0x3d,
+ 0x0c, 0x7d, 0x68, 0x8f, 0xc3, 0x9d, 0x43, 0x4c, 0xca, 0xb7, 0xa6, 0x88,
+ 0xcc, 0xcd, 0x6a, 0x25, 0xd8, 0xdc, 0xdf, 0xc8, 0x3c, 0x64, 0x7e, 0x6a,
+ 0xeb, 0x58, 0xc8, 0x92, 0x20, 0x49, 0xbf, 0xac, 0x09, 0x63, 0xb3, 0xa9,
+ 0xd2, 0xa9, 0xfb, 0xcb, 0x30, 0xad, 0xa7, 0x79, 0xae, 0xbd, 0x5f, 0x10,
+ 0x1f, 0xcc, 0x90, 0x0e, 0x1b, 0x05, 0xb4, 0xb1, 0xe7, 0xa1, 0x3d, 0x17,
+ 0x66, 0x25, 0x3b, 0x77, 0x39, 0xe3, 0x24, 0xe5, 0xa6, 0x60, 0xc8, 0x5f,
+ 0xa1, 0xd2, 0x38, 0x8d, 0x1d, 0x46, 0xdb, 0xe1, 0x28, 0x9c, 0x61, 0x8f,
+ 0x69, 0x6b, 0xac, 0xef, 0x3d, 0xdf, 0xfc, 0xd6, 0x2d, 0x18, 0x02, 0x1c,
+ 0xbc, 0x6e, 0x48, 0x80, 0x9a, 0x67, 0xf6, 0xfd, 0x67, 0xd6, 0x45, 0xc3,
+ 0x9f, 0x76, 0x8c, 0x13, 0x86, 0x67, 0x8a, 0x99, 0x26, 0x63, 0xa3, 0x3a,
+ 0x69, 0x77, 0x3c, 0x3a, 0x82, 0x97, 0xc7, 0xa7, 0xef, 0x08, 0x14, 0x0b,
+ 0x38, 0xcb, 0x05, 0xf9, 0xc7, 0xf8, 0x67, 0xa4, 0x22, 0x93, 0x9d, 0x0c,
+ 0xed, 0x63, 0x16, 0xd6, 0x43, 0x73, 0xc7, 0xcc, 0x8b, 0x88, 0x69, 0xc5,
+ 0xa9, 0x6d, 0x05, 0xb5, 0xc4, 0x49, 0xac, 0xe9, 0x22, 0x8a, 0x9f, 0x9a,
+ 0x17, 0xdd, 0xe5, 0x98, 0x6f, 0x8e, 0x12, 0xfb, 0x69, 0x85, 0x64, 0xb7,
+ 0x85, 0x48, 0xfc, 0x76, 0x17, 0x57, 0x0c, 0x59, 0x32, 0xa4, 0xb5, 0x06,
+ 0xfc, 0xbc, 0xc9, 0x2c, 0xf6, 0x98, 0xd8, 0x75, 0x16, 0x37, 0x51, 0xbb,
+ 0xdd, 0x70, 0x9e, 0x06, 0x21, 0x4d, 0x68, 0x41, 0x7b, 0x7d, 0x0f, 0xea,
+ 0x55, 0xb1, 0x2c, 0xda, 0xd8, 0x5b, 0x76, 0xb3, 0x3b, 0x45, 0x60, 0x6a,
+ 0x80, 0x76, 0xe7, 0xf5, 0xa0, 0xb2, 0x30, 0x9c, 0xc7, 0x68, 0xcd, 0x01,
+ 0xbf, 0x1b, 0xf0, 0x77, 0x27, 0x2b, 0x70, 0x88, 0xce, 0x17, 0xe4, 0x74,
+ 0x59, 0x69, 0xe2, 0x27, 0xf0, 0x3d, 0xf1, 0x80, 0x31, 0xf4, 0x11, 0x8a,
+ 0x38, 0xb3, 0x74, 0x61, 0xb4, 0x82, 0x42, 0x0b, 0x05, 0xe0, 0xf7, 0x45,
+ 0x42, 0x67, 0x77, 0xc2, 0xab, 0x54, 0x58, 0x96, 0xd3, 0x16, 0x3a, 0xc5,
+ 0x03, 0xfc, 0x0d, 0x62, 0xa3, 0x3c, 0xb8, 0x8c, 0x1e, 0xed, 0x1f, 0xd2,
+ 0x62, 0x22, 0x1a, 0xb7, 0xd1, 0x36, 0x81, 0x0c, 0x32, 0xcc, 0x83, 0xd8,
+ 0x4e, 0xc1, 0xe8, 0x72, 0x73, 0xb5, 0x2a, 0x3e, 0x9a, 0x29, 0x84, 0xf5,
+ 0xcb, 0x9a, 0xec, 0x9b, 0x53, 0x33, 0xf7, 0x94, 0xe1, 0xb1, 0xb5, 0x36,
+ 0x94, 0x5e, 0x07, 0xb8, 0xf1, 0x35, 0x79, 0xf1, 0x04, 0xee, 0xb7, 0x65,
+ 0x7c, 0xc5, 0x66, 0x37, 0xb3, 0xcd, 0x23, 0xd3, 0xc6, 0x6d, 0x60, 0x34,
+ 0x9d, 0xdd, 0x79, 0x1b, 0xa4, 0x8f, 0x37, 0x9b, 0x24, 0x97, 0x5e, 0x3e,
+ 0x15, 0x2b, 0x71, 0x8a, 0xf9, 0x04, 0xef, 0x8c, 0x98, 0x20, 0x01, 0x3b,
+ 0x5c, 0xd5, 0x5c, 0x05, 0x26, 0xc7, 0x4a, 0x60, 0x2b, 0x5e, 0xa7, 0x9a,
+ 0xc8, 0x4c, 0xda, 0xc5, 0xf4, 0xeb, 0xe8, 0x40, 0xdc, 0xb5, 0xae, 0xf0,
+ 0x5e, 0xd2, 0x50, 0x6a, 0xd7, 0xb0, 0x1a, 0x2d, 0x24, 0x5b, 0x4d, 0xec,
+ 0x22, 0x7c, 0xcb, 0x95, 0x72, 0x65, 0x85, 0x1d, 0x7c, 0xc1, 0xfc, 0x81,
+ 0xf8, 0xc1, 0xbf, 0x70, 0x97, 0xdc, 0x5a, 0xbc, 0x8d, 0xb2, 0x3f, 0xec,
+ 0x6c, 0x52, 0xd1, 0xcb, 0x0d, 0xfd, 0x56, 0xa1, 0xef, 0x42, 0x56, 0xf8,
+ 0x2e, 0xc2, 0x09, 0x69, 0xa5, 0x41, 0x1d, 0x75, 0xb2, 0x86, 0x11, 0x7a,
+ 0x65, 0xde, 0x1d, 0x3e, 0xf6, 0x0e, 0x5c, 0xcf, 0xfc, 0x27, 0xac, 0xf2,
+ 0x7e, 0x20, 0x07, 0x24, 0xb5, 0xcf, 0x5a, 0xee, 0x8a, 0xed, 0xd8, 0xe3,
+ 0xda, 0xfa, 0xf5, 0x2c, 0xd0, 0x26, 0xb1, 0x2a, 0xbb, 0x0b, 0xb9, 0x60,
+ 0x11, 0x30, 0x41, 0xae, 0x84, 0xfd, 0x24, 0x2c, 0x10, 0x1f, 0x94, 0x09,
+ 0xe7, 0xb3, 0x28, 0xe4, 0x82, 0x1e, 0xac, 0x34, 0x90, 0x94, 0x1b, 0x80,
+ 0x93, 0x50, 0xac, 0x97, 0xa3, 0xd7, 0x86, 0xc2, 0xa0, 0xa9, 0xc2, 0x61,
+ 0xfb, 0x35, 0x50, 0xfc, 0xa3, 0x47, 0x4b, 0x68, 0xd4, 0x36, 0xa6, 0x4b,
+ 0xe6, 0xfd, 0x0c, 0xc6, 0xbc, 0x07, 0xc4, 0x05, 0x64, 0xbe, 0x91, 0x57,
+ 0x27, 0xc1, 0x01, 0x77, 0xe9, 0x56, 0x11, 0x77, 0x47, 0x40, 0x99, 0xa4,
+ 0x52, 0xdb, 0xab, 0x95, 0x59, 0x2d, 0xce, 0x99, 0xbb, 0xcb, 0x30, 0x8b,
+ 0x2a, 0xa1, 0xaa, 0x51, 0x41, 0x03, 0x89, 0x50, 0x37, 0xe3, 0x00, 0x59,
+ 0x8e, 0x5d, 0xd8, 0x75, 0x66, 0xae, 0x21, 0x57, 0x0a, 0x4d, 0xaa, 0xf2,
+ 0x63, 0xc6, 0x24, 0x47, 0x96, 0x05, 0x41, 0x25, 0xa9, 0x12, 0xc5, 0x11,
+ 0xc7, 0x7c, 0x3e, 0xb3, 0x69, 0x8b, 0x41, 0xd0, 0x95, 0xbb, 0xd9, 0x09,
+ 0xc6, 0x82, 0xe3, 0x85, 0xb9, 0x83, 0x38, 0x50, 0xcc, 0x77, 0x3e, 0xae,
+ 0x29, 0x90, 0xd9, 0xe2, 0xf7, 0x5e, 0x88, 0x40, 0x2c, 0xd6, 0x9e, 0x4b,
+ 0xdf, 0xba, 0xf5, 0x36, 0x45, 0xb3, 0xff, 0xde, 0xdb, 0x53, 0xf7, 0xef,
+ 0x7d, 0xe4, 0x48, 0x1f, 0xde, 0xa4, 0xce, 0xd0, 0x12, 0x39, 0xc0, 0x92,
+ 0x17, 0x86, 0xa8, 0xd8, 0x15, 0x86, 0x58, 0x56, 0xd7, 0xcb, 0x45, 0xcd,
+ 0x16, 0x87, 0x6a, 0x71, 0xcc, 0xb8, 0x72, 0x30, 0x61, 0x83, 0x0d, 0x7a,
+ 0x38, 0x17, 0x36, 0xcc, 0x5c, 0xfb, 0x53, 0x81, 0x5b, 0x27, 0x7c, 0x09,
+ 0x43, 0x30, 0xe1, 0x15, 0x77, 0xee, 0x1b, 0x36, 0x3c, 0x49, 0x01, 0xc7,
+ 0xe9, 0x10, 0xc8, 0x4e, 0x5e, 0xbb, 0x04, 0xb5, 0x7f, 0x47, 0x22, 0xb0,
+ 0x51, 0x68, 0x1b, 0x64, 0x81, 0xf1, 0x97, 0x02, 0x95, 0x93, 0x1b, 0x8f,
+ 0xd9, 0x3a, 0x11, 0xc6, 0x93, 0xb0, 0x20, 0x32, 0x80, 0x2a, 0xf6, 0x25,
+ 0x02, 0x23, 0xc1, 0x27, 0x87, 0x30, 0x57, 0x22, 0x86, 0xa0, 0x42, 0x66,
+ 0xd0, 0x1a, 0x73, 0x41, 0x91, 0xe6, 0x74, 0x2d, 0xb1, 0xaa, 0x53, 0x4d,
+ 0xc5, 0x52, 0x30, 0x4a, 0x8b, 0x6d, 0x17, 0xb1, 0xd6, 0x31, 0x23, 0x41,
+ 0x48, 0xd4, 0xe6, 0x88, 0xfa, 0x23, 0xdb, 0x73, 0xac, 0xa5, 0x83, 0x93,
+ 0x75, 0xc2, 0xf6, 0x6a, 0xa4, 0x6d, 0x18, 0xcd, 0x26, 0x71, 0x0f, 0x0d,
+ 0xbc, 0xbf, 0x1f, 0x7c, 0xbe, 0xab, 0x15, 0xee, 0x08, 0x72, 0xf9, 0xcf,
+ 0xc0, 0x39, 0x95, 0x44, 0xb4, 0x08, 0x3c, 0x67, 0x7e, 0x6a, 0x1f, 0x0d,
+ 0x39, 0x20, 0xc1, 0x5c, 0x22, 0xdd, 0xe5, 0x11, 0x62, 0xdd, 0x6d, 0xc8,
+ 0x29, 0xe7, 0x4d, 0x6a, 0x7a, 0x9c, 0x07, 0x75, 0x2c, 0xdb, 0x73, 0xe6,
+ 0x09, 0x1e, 0x39, 0x0c, 0xce, 0x54, 0xaf, 0xd0, 0xb8, 0x9c, 0x30, 0xec,
+ 0x22, 0x6e, 0x08, 0xbc, 0x16, 0xf1, 0x5d, 0x70, 0x02, 0x9b, 0x90, 0x9b,
+ 0xed, 0x19, 0x47, 0x1d, 0x73, 0x98, 0xb4, 0xe9, 0x1c, 0xcd, 0x85, 0xd9,
+ 0xa0, 0x86, 0x17, 0x3a, 0x65, 0xb3, 0xf7, 0x6b, 0xef, 0xc9, 0xf3, 0xd1,
+ 0xe3, 0xd6, 0x3d, 0x69, 0xe6, 0x8b, 0xe1, 0xcd, 0xe4, 0x9e, 0x90, 0xc7,
+ 0xf9, 0xf1, 0x5b, 0x4a, 0xf9, 0x50, 0x76, 0x43, 0x5d, 0x1b, 0xd4, 0xfb,
+ 0x0c, 0xaf, 0x0e, 0x7b, 0x09, 0xaf, 0xc8, 0xe4, 0x0c, 0x73, 0xb8, 0x23,
+ 0xbe, 0x7d, 0x5b, 0x31, 0x2a, 0xc6, 0xbe, 0x20, 0xd4, 0x25, 0x18, 0x91,
+ 0xbc, 0xd8, 0xa8, 0xf8, 0x9e, 0xe7, 0xd1, 0xc2, 0x1e, 0xcd, 0xac, 0xcd,
+ 0x6e, 0xb3, 0xe9, 0x8a, 0xe2, 0xd3, 0x50, 0x0f, 0x01, 0xfa, 0xb4, 0xde,
+ 0x6f, 0xee, 0xf9, 0xca, 0xc5, 0x3b, 0x6e, 0x7e, 0xd0, 0xdd, 0x0c, 0xd7,
+ 0xba, 0x47, 0x16, 0xcf, 0xab, 0x0f, 0x73, 0xbf, 0x29, 0x15, 0x8a, 0x7e,
+ 0xd7, 0xfe, 0x55, 0x10, 0x22, 0xa6, 0x84, 0x7e, 0x08, 0x44, 0x43, 0x4f,
+ 0xf9, 0x65, 0xc1, 0x2a, 0xc0, 0xdb, 0x7c, 0x5a, 0x95, 0x75, 0x79, 0xc1,
+ 0x99, 0x6a, 0x9e, 0x6e, 0x70, 0x74, 0x34, 0x4e, 0x6e, 0xb2, 0x89, 0x56,
+ 0xc5, 0x8e, 0x42, 0x1f, 0x32, 0x73, 0x11, 0xc4, 0x45, 0xaa, 0x3c, 0x6b,
+ 0xb0, 0x6b, 0x1a, 0x09, 0x05, 0xa8, 0x13, 0x35, 0xb1, 0x12, 0x04, 0x15,
+ 0x52, 0xe1, 0xd1, 0x07, 0x70, 0x4e, 0xa2, 0x69, 0x99, 0x95, 0x91, 0x78,
+ 0x38, 0x4f, 0x40, 0xc5, 0x0a, 0xd3, 0x09, 0xc9, 0xf0, 0x49, 0x2a, 0x1d,
+ 0x96, 0xd8, 0x37, 0x60, 0xd8, 0x0e, 0x94, 0x14, 0xf1, 0x57, 0x7e, 0x84,
+ 0xa7, 0x2c, 0xa8, 0x55, 0x99, 0x64, 0xe8, 0x49, 0x08, 0x76, 0xe0, 0xb7,
+ 0xc9, 0xa1, 0x8e, 0x80, 0xb3, 0xb2, 0xa2, 0x0c, 0x24, 0xaf, 0xfb, 0x09,
+ 0xda, 0x04, 0xae, 0x2a, 0xb8, 0x8a, 0x09, 0x6f, 0x34, 0xe4, 0xa7, 0x37,
+ 0x57, 0x25, 0xf7, 0x8a, 0xa2, 0x6d, 0x86, 0x68, 0xa2, 0x1a, 0x5b, 0x2e,
+ 0xeb, 0x11, 0x7c, 0x7d, 0x69, 0x90, 0xad, 0xf2, 0xc6, 0x3f, 0xa8, 0x28,
+ 0x36, 0xa1, 0x9c, 0x87, 0x2b, 0x29, 0x95, 0x14, 0x85, 0xd7, 0xf9, 0x65,
+ 0x4f, 0x2b, 0x4c, 0x76, 0x19, 0x11, 0xb4, 0x03, 0x89, 0x27, 0xba, 0xb4,
+ 0x34, 0x23, 0x11, 0x9a, 0x15, 0xdf, 0xd2, 0xa0, 0xc1, 0x2b, 0xfe, 0x15,
+ 0x3a, 0x60, 0x7b, 0xa8, 0xef, 0x17, 0x25, 0xae, 0xfc, 0xb2, 0xd6, 0x9b,
+ 0x6b, 0x95, 0x3f, 0x6f, 0x2e, 0xf6, 0x0a, 0x44, 0x43, 0xaf, 0x2e, 0xf2,
+ 0x1a, 0x00, 0x50, 0xdc, 0xa7, 0xf3, 0xc5, 0x1d, 0xf5, 0x1a, 0xc9, 0x8a,
+ 0xe4, 0xa3, 0x78, 0xc1, 0x58, 0xdb, 0x02, 0x1e, 0xc7, 0xd3, 0x8e, 0x74,
+ 0xf9, 0x57, 0xb7, 0xc4, 0x0f, 0xf6, 0x87, 0x93, 0x2c, 0x45, 0x37, 0x96,
+ 0x17, 0x0d, 0x14, 0xa6, 0x78, 0x65, 0x0a, 0x57, 0x63, 0x44, 0x6a, 0x53,
+ 0xbe, 0xe6, 0x77, 0xcf, 0x49, 0xd7, 0xc2, 0xd1, 0x9e, 0xbc, 0x7c, 0x7f,
+ 0xfe, 0x6d, 0xb2, 0x3f, 0xda, 0x7d, 0x50, 0x65, 0x0a, 0x31, 0x84, 0xd6,
+ 0x18, 0x7a, 0x78, 0xd4, 0xd4, 0xb5, 0xf8, 0xcb, 0xaa, 0x68, 0x37, 0x7b,
+ 0x88, 0xf9, 0xe6, 0x45, 0x7f, 0x52, 0xf1, 0x0b, 0x87, 0xcb, 0x24, 0x6b,
+ 0xa7, 0x56, 0xfb, 0xed, 0x80, 0x86, 0x43, 0x32, 0xe1, 0xaa, 0xfb, 0xc2,
+ 0x98, 0x75, 0x14, 0x9e, 0xa3, 0x35, 0x59, 0x41, 0x0f, 0xd2, 0x24, 0x6d,
+ 0x6a, 0xbc, 0x02, 0xef, 0x3e, 0xdf, 0x29, 0xdb, 0xc8, 0x93, 0xf4, 0xd8,
+ 0xb3, 0x37, 0xaf, 0x3a, 0xc3, 0x3d, 0x7d, 0xf6, 0x64, 0xf7, 0x13, 0x26,
+ 0xe9, 0x95, 0xf0, 0x8e, 0x88, 0x17, 0x21, 0x8a, 0x9a, 0xf3, 0x43, 0x85,
+ 0xba, 0x55, 0xf5, 0x33, 0x94, 0xf2, 0x90, 0x5f, 0x58, 0x5f, 0x37, 0x33,
+ 0x64, 0x6b, 0x69, 0xe3, 0x2a, 0xce, 0xc5, 0xc0, 0x8a, 0xfe, 0xfe, 0x8f,
+ 0xb0, 0xac, 0xf6, 0xcf, 0x3f, 0x53, 0x34, 0x80, 0xda, 0xdf, 0xd9, 0x2c,
+ 0x7f, 0x65, 0x32, 0xb5, 0x13, 0xc7, 0xb8, 0xce, 0x9b, 0xbf, 0xdb, 0x4c,
+ 0x6c, 0x93, 0x1a, 0xaa, 0xc4, 0x0a, 0x22, 0xd4, 0x9a, 0xcf, 0x29, 0x78,
+ 0x06, 0x3a, 0x3b, 0x3d, 0x56, 0xc2, 0x11, 0x4f, 0x3d, 0x8d, 0x40, 0x77,
+ 0x41, 0x5a, 0xb7, 0xcc, 0xfa, 0x9a, 0x4c, 0x69, 0xb7, 0x15, 0xc1, 0xef,
+ 0x52, 0x37, 0x39, 0xbc, 0xd9, 0x9c, 0x5a, 0x45, 0x2b, 0x80, 0x2e, 0x4a,
+ 0xd5, 0xcb, 0x79, 0xd1, 0xe3, 0xbb, 0x94, 0x04, 0xa2, 0xbf, 0x9b, 0x13,
+ 0x18, 0x34, 0x37, 0xe5, 0x3f, 0xda, 0x7e, 0x4c, 0xa3, 0x61, 0x60, 0xbe,
+ 0x1f, 0x7e, 0xb7, 0x87, 0x8a, 0xa0, 0x8d, 0xee, 0x10, 0x9c, 0xdc, 0x6f,
+ 0x4f, 0xd5, 0x2a, 0x48, 0xeb, 0xd0, 0x74, 0xf5, 0x83, 0xa8, 0x36, 0x1e,
+ 0x40, 0x6b, 0xfc, 0xc7, 0x08, 0xff, 0xfd, 0xf3, 0xde, 0xf0, 0xc9, 0xcf,
+ 0xf6, 0xa3, 0xbf, 0xdb, 0xfb, 0xf0, 0xbb, 0xfd, 0x8d, 0x58, 0xc1, 0x97,
+ 0x2b, 0xfd, 0xf7, 0x12, 0x14, 0xa1, 0xd0, 0x16, 0x77, 0x52, 0xa5, 0x21,
+ 0x01, 0x46, 0xd7, 0x16, 0x8f, 0x9a, 0xec, 0x46, 0xf0, 0x91, 0xe0, 0xb7,
+ 0x1a, 0xb1, 0xb3, 0xd8, 0x69, 0xaa, 0xda, 0x1a, 0x4f, 0x99, 0xc3, 0x4d,
+ 0xc9, 0xef, 0x2b, 0x40, 0x02, 0x6e, 0x88, 0xd4, 0x0f, 0x04, 0xbc, 0xb0,
+ 0xc8, 0xda, 0xe4, 0x01, 0xb4, 0x14, 0x85, 0xd8, 0x08, 0x77, 0x43, 0xd2,
+ 0xa2, 0x8c, 0x3c, 0x4b, 0x93, 0xce, 0xa6, 0x4f, 0x26, 0xf6, 0x27, 0x45,
+ 0x16, 0x14, 0x62, 0x69, 0xcd, 0x26, 0x5b, 0x6f, 0xca, 0x0e, 0xca, 0x96,
+ 0xf3, 0x9f, 0xe5, 0x03, 0xaf, 0x5c, 0x43, 0x6f, 0x09, 0x5d, 0xe9, 0x20,
+ 0xf3, 0xe8, 0x2f, 0x04, 0x14, 0xe6, 0xb9, 0x39, 0x59, 0xaa, 0x98, 0x01,
+ 0xf3, 0xda, 0x85, 0x5f, 0xe8, 0x67, 0x12, 0x7a, 0x41, 0x85, 0x3f, 0xf5,
+ 0x65, 0x2b, 0x23, 0xbc, 0x2c, 0x9d, 0xa0, 0x6b, 0x5d, 0xab, 0x09, 0x90,
+ 0xed, 0xe8, 0x32, 0x71, 0x60, 0x53, 0x69, 0xdd, 0xb3, 0x21, 0xfe, 0x56,
+ 0x78, 0x9b, 0x20, 0x1b, 0x45, 0x9b, 0xb3, 0xbe, 0x61, 0xd7, 0x10, 0xb9,
+ 0xa3, 0x4d, 0x36, 0xf4, 0x6a, 0x62, 0xa9, 0x04, 0x97, 0x7e, 0xca, 0x2b,
+ 0xe4, 0x60, 0x89, 0x86, 0xf5, 0x86, 0x41, 0x2c, 0x12, 0x12, 0x6a, 0x76,
+ 0x67, 0xb8, 0x21, 0x43, 0xb1, 0x8e, 0x6c, 0xed, 0x83, 0xba, 0x08, 0x84,
+ 0xdb, 0x18, 0x52, 0xdb, 0x1c, 0x6e, 0x26, 0x5b, 0xd6, 0xb0, 0x9b, 0xa5,
+ 0xf5, 0xd5, 0x76, 0xcc, 0x0b, 0xe9, 0x1c, 0x7f, 0x8e, 0x51, 0x4d, 0xc4,
+ 0xf3, 0x00, 0x91, 0xc9, 0x1c, 0xaa, 0x5f, 0x81, 0x3d, 0x61, 0x4c, 0x0d,
+ 0xa4, 0x08, 0x0e, 0x6d, 0x1c, 0xb9, 0xf5, 0x93, 0x21, 0x4c, 0x45, 0xc6,
+ 0xd2, 0xfd, 0x4f, 0x8a, 0xc2, 0x84, 0x41, 0x2d, 0x7a, 0x96, 0x93, 0xbc,
+ 0x86, 0x5c, 0x00, 0xe5, 0x84, 0x28, 0xe2, 0x77, 0xc9, 0x8b, 0xe5, 0x55,
+ 0x65, 0x34, 0xbf, 0xb0, 0xce, 0x6a, 0xfc, 0x6d, 0xc2, 0xc0, 0x97, 0xe6,
+ 0x29, 0x7e, 0xc6, 0x52, 0x86, 0x07, 0x36, 0xf8, 0x09, 0xf1, 0xf1, 0x90,
+ 0x3f, 0x32, 0x4c, 0xeb, 0x61, 0xa0, 0xe5, 0x20, 0x8c, 0xe8, 0x87, 0x4c,
+ 0xa1, 0x74, 0xc2, 0x16, 0x41, 0xee, 0x22, 0x42, 0x6a, 0xc5, 0x94, 0xda,
+ 0x77, 0x27, 0x3b, 0xa3, 0xd1, 0x0e, 0xf8, 0xd5, 0x8e, 0xf9, 0x43, 0x2c,
+ 0x19, 0xca, 0xb4, 0xed, 0x76, 0xb8, 0x32, 0x14, 0x8e, 0x6f, 0xc1, 0xfd,
+ 0x23, 0xdd, 0x20, 0xbd, 0x8e, 0x41, 0x7f, 0x5d, 0x51, 0xf6, 0x69, 0x65,
+ 0x34, 0xc9, 0x8a, 0xcb, 0x78, 0x17, 0x1d, 0x01, 0x19, 0xf4, 0x95, 0x62,
+ 0xaf, 0x7a, 0x2d, 0x60, 0x11, 0x9d, 0x5e, 0x69, 0x30, 0xe9, 0xc8, 0xf3,
+ 0x82, 0x45, 0xe4, 0x8d, 0xa2, 0x74, 0x51, 0xfd, 0x74, 0xba, 0xd6, 0x96,
+ 0x7b, 0xbc, 0xdf, 0xf6, 0x79, 0x2c, 0xf3, 0xc2, 0x58, 0x17, 0x46, 0x2f,
+ 0x26, 0x34, 0x4e, 0x64, 0xdf, 0x85, 0xf5, 0x3b, 0xec, 0x48, 0x0b, 0xbb,
+ 0xce, 0xac, 0x14, 0x99, 0xc8, 0x53, 0x36, 0xbc, 0x16, 0x56, 0x1c, 0xbf,
+ 0xdf, 0x0a, 0x04, 0x25, 0x7f, 0x64, 0x1b, 0x43, 0x78, 0xf9, 0xb9, 0xcb,
+ 0xcc, 0xf6, 0xc6, 0x10, 0xb4, 0x97, 0x94, 0x93, 0x7f, 0x48, 0x71, 0x97,
+ 0xb4, 0xe5, 0x98, 0xc7, 0xc3, 0xfa, 0x1b, 0xec, 0x65, 0xf2, 0xa6, 0x60,
+ 0xd6, 0x0c, 0x40, 0x53, 0xb3, 0xf3, 0xaf, 0x0f, 0xcf, 0x44, 0x3b, 0xa1,
+ 0x92, 0x70, 0xd7, 0x00, 0x35, 0xec, 0x0f, 0x0c, 0x23, 0xe6, 0xe9, 0x63,
+ 0xdb, 0x91, 0xbc, 0xbe, 0x4a, 0xf7, 0x9f, 0x3c, 0x95, 0x69, 0x2b, 0x5a,
+ 0x16, 0xd9, 0x48, 0x9b, 0xfc, 0xab, 0x9d, 0x1d, 0x0e, 0x94, 0xc3, 0x30,
+ 0x0d, 0x78, 0x42, 0x2a, 0x7d, 0xd5, 0x37, 0xbf, 0xd8, 0x8c, 0xa6, 0xc8,
+ 0x59, 0xa7, 0xad, 0xb6, 0xe1, 0x84, 0xe7, 0x99, 0xf2, 0xea, 0x5a, 0x9d,
+ 0x14, 0x06, 0xbe, 0xbf, 0x96, 0xa1, 0x0f, 0xd2, 0x35, 0x0d, 0x06, 0x04,
+ 0x5f, 0x42, 0x9a, 0x30, 0x25, 0x5a, 0x8a, 0x0a, 0xe4, 0x4e, 0x6f, 0x77,
+ 0x28, 0xe5, 0x8c, 0x9a, 0xbf, 0x4e, 0x43, 0x10, 0x13, 0x4d, 0x78, 0xc3,
+ 0x81, 0x78, 0x23, 0x4b, 0xda, 0x27, 0xa0, 0xaa, 0x81, 0xeb, 0x07, 0xca,
+ 0xd3, 0x88, 0x0b, 0xbb, 0x63, 0xe8, 0x30, 0x57, 0x93, 0x20, 0x43, 0x41,
+ 0xbe, 0x69, 0x61, 0x36, 0xc9, 0x9a, 0xf7, 0x12, 0x03, 0xdd, 0x75, 0x31,
+ 0x92, 0xa0, 0x62, 0xaf, 0xb1, 0xb7, 0x01, 0x81, 0xd5, 0x48, 0x40, 0xcc,
+ 0x8a, 0x9d, 0x02, 0xc4, 0x1b, 0x73, 0x2e, 0x39, 0xc3, 0x2e, 0x99, 0xb3,
+ 0x45, 0xd0, 0x27, 0xb8, 0x07, 0x86, 0x14, 0x76, 0x40, 0x07, 0x62, 0x68,
+ 0x04, 0x1d, 0x0f, 0xe0, 0x5f, 0x7e, 0x3e, 0xda, 0x3d, 0x50, 0x4c, 0xd6,
+ 0x41, 0xf2, 0x4d, 0xb1, 0xc2, 0x79, 0x60, 0xd1, 0xdf, 0x8c, 0xbf, 0x0b,
+ 0x8a, 0xab, 0xf0, 0xc6, 0xe3, 0x47, 0x78, 0xe3, 0xdd, 0x98, 0x9f, 0xba,
+ 0x29, 0xe7, 0x17, 0xe6, 0xcd, 0x9d, 0x57, 0x77, 0xa9, 0xf9, 0x23, 0xf6,
+ 0xf8, 0x33, 0x3c, 0x6e, 0x08, 0x6f, 0xd6, 0x04, 0xdd, 0xc8, 0x13, 0x69,
+ 0xdd, 0x73, 0x90, 0x9c, 0x96, 0xf3, 0xb4, 0x22, 0x27, 0x35, 0x13, 0xdf,
+ 0x9a, 0x19, 0x3f, 0x7e, 0x1c, 0x99, 0xf1, 0xa0, 0x67, 0x42, 0xa3, 0x7f,
+ 0x7e, 0x46, 0x27, 0xe4, 0xf6, 0xc3, 0xdf, 0x26, 0xe9, 0xf4, 0x23, 0x51,
+ 0x22, 0xe5, 0xb1, 0x5b, 0x88, 0xe1, 0x4f, 0xc9, 0xcd, 0x19, 0x79, 0xe0,
+ 0x21, 0x9d, 0x8c, 0x2a, 0x82, 0x5e, 0x6b, 0xa8, 0xa4, 0xfd, 0xd9, 0xfe,
+ 0xa3, 0xbd, 0x9d, 0xa7, 0xa3, 0xc7, 0xa3, 0x7d, 0x9b, 0x57, 0x66, 0x08,
+ 0xeb, 0x1a, 0x7d, 0x33, 0x10, 0xc8, 0x8f, 0xf8, 0xbe, 0x29, 0xa3, 0x22,
+ 0x2f, 0xcc, 0x38, 0x88, 0xf9, 0xdb, 0x9f, 0x90, 0xd3, 0xc8, 0x65, 0x94,
+ 0xa4, 0x80, 0x99, 0xf0, 0x0b, 0x94, 0x46, 0x91, 0x16, 0x81, 0xc0, 0x6b,
+ 0xc0, 0x24, 0xd4, 0xd1, 0x81, 0x66, 0xc6, 0x94, 0xea, 0x39, 0xc9, 0x8d,
+ 0xc1, 0xdc, 0x94, 0x2b, 0xf2, 0xa8, 0xc3, 0x7d, 0xa3, 0x40, 0xeb, 0xa4,
+ 0x20, 0xd1, 0x3a, 0x70, 0xc5, 0x22, 0x7e, 0x31, 0x9e, 0x3c, 0x65, 0xef,
+ 0x4e, 0x5a, 0xcd, 0xdc, 0xe1, 0x88, 0x6d, 0xc8, 0x19, 0x4b, 0x0d, 0x4e,
+ 0x8c, 0x21, 0x53, 0x4c, 0xa1, 0x85, 0x7c, 0x6b, 0xec, 0x8c, 0x6b, 0xf2,
+ 0x19, 0xc7, 0x3a, 0x84, 0xc3, 0xcc, 0x80, 0x7a, 0x6c, 0xbd, 0xfe, 0x9a,
+ 0xe0, 0xe0, 0xd0, 0xd0, 0xe5, 0x07, 0x5c, 0x33, 0xc1, 0xee, 0x0f, 0x5a,
+ 0x77, 0xc0, 0xee, 0x5a, 0x3d, 0xd5, 0xdd, 0x89, 0x0b, 0x8e, 0x38, 0x2a,
+ 0x96, 0xd8, 0xbb, 0xed, 0xb2, 0x83, 0xfd, 0xc2, 0xb3, 0x98, 0xf7, 0xe5,
+ 0x1e, 0x57, 0x84, 0x00, 0x50, 0xb4, 0x11, 0x28, 0xf8, 0x5f, 0x9d, 0xc6,
+ 0x9e, 0x2a, 0x05, 0x83, 0xca, 0xa5, 0x6e, 0xe7, 0x43, 0x19, 0xf3, 0x57,
+ 0x53, 0xd9, 0xa3, 0xdf, 0x9e, 0xca, 0xf6, 0x1f, 0x4a, 0x65, 0x8e, 0xc8,
+ 0x70, 0xcf, 0xd6, 0x90, 0x18, 0x68, 0x4c, 0x3b, 0x9e, 0xc7, 0xa9, 0xcc,
+ 0x27, 0x33, 0x32, 0x51, 0x63, 0x84, 0xd6, 0xa2, 0x33, 0x4b, 0x66, 0x3d,
+ 0x54, 0xc6, 0x20, 0x55, 0x4c, 0x63, 0xeb, 0x49, 0x8c, 0x69, 0x8c, 0xbb,
+ 0x52, 0xaf, 0xa1, 0xb2, 0xb6, 0x07, 0x7e, 0x3d, 0x9d, 0x39, 0x72, 0x78,
+ 0x30, 0x95, 0x69, 0x1f, 0x1b, 0xe6, 0x3a, 0x3d, 0x24, 0xd6, 0xa2, 0xb1,
+ 0x35, 0x0d, 0xff, 0xf6, 0x9e, 0xc7, 0xa8, 0xec, 0xd1, 0x43, 0xa8, 0xcc,
+ 0x1c, 0xe8, 0x1c, 0xb2, 0xb7, 0x45, 0x65, 0x8f, 0x7f, 0x5b, 0x2a, 0x03,
+ 0x48, 0x4e, 0xb7, 0xd8, 0x32, 0x79, 0xf9, 0xcf, 0x9e, 0x63, 0x4a, 0xc3,
+ 0xea, 0xa8, 0x41, 0x0d, 0xe2, 0x2f, 0xe3, 0x14, 0x9d, 0x0b, 0x7d, 0xef,
+ 0x89, 0xb5, 0x61, 0x69, 0xf6, 0x7e, 0xf1, 0x89, 0xed, 0x77, 0xe2, 0x83,
+ 0x46, 0xf5, 0x63, 0xa7, 0xed, 0x9f, 0xd5, 0x79, 0x7e, 0xb0, 0xb3, 0xf3,
+ 0x33, 0x39, 0x21, 0x0e, 0x20, 0xfb, 0x7e, 0x0e, 0xba, 0xde, 0x46, 0xf4,
+ 0xe3, 0xf1, 0xc9, 0xab, 0xef, 0xc6, 0xe2, 0xfc, 0x15, 0x25, 0x46, 0x95,
+ 0x1c, 0xc2, 0xb3, 0x43, 0xc8, 0x87, 0xca, 0x87, 0x03, 0xbd, 0x99, 0xbb,
+ 0x25, 0x0e, 0x6f, 0x07, 0xea, 0x81, 0xa5, 0xbc, 0x1d, 0x61, 0xc6, 0x84,
+ 0x92, 0xc6, 0xd7, 0x59, 0x9c, 0xbb, 0x32, 0x6a, 0x2f, 0x20, 0x16, 0x4f,
+ 0x44, 0x66, 0x62, 0x6d, 0xff, 0xc2, 0x7b, 0x71, 0xab, 0xb9, 0xaa, 0xa8,
+ 0x38, 0x82, 0x1e, 0xdd, 0xd6, 0xf8, 0xcb, 0xba, 0xd9, 0xc9, 0xbc, 0xbe,
+ 0x25, 0x34, 0xd9, 0x65, 0x95, 0xf5, 0x74, 0x9a, 0x3e, 0xbf, 0xf2, 0x7e,
+ 0xab, 0xae, 0x28, 0x87, 0x2a, 0xee, 0xb6, 0x4b, 0xd0, 0xd1, 0xbc, 0xfd,
+ 0xc6, 0x7b, 0x41, 0x0e, 0x1a, 0xe0, 0x7f, 0xa9, 0x8c, 0xc5, 0x82, 0x93,
+ 0xcc, 0xa9, 0xcf, 0x68, 0xa3, 0x8d, 0x39, 0x6e, 0xef, 0x5c, 0x63, 0xc8,
+ 0x5a, 0x0a, 0x61, 0xd0, 0xfa, 0xa2, 0x7e, 0x6c, 0x86, 0xec, 0x3a, 0x36,
+ 0xf8, 0x17, 0x29, 0x7e, 0xc3, 0x7f, 0x7f, 0x82, 0xef, 0x52, 0x84, 0x82,
+ 0xfe, 0x75, 0x85, 0x7f, 0x4a, 0x70, 0x5e, 0x20, 0x98, 0xfc, 0x53, 0x9e,
+ 0xc6, 0x37, 0xda, 0xaf, 0xb7, 0xb1, 0xf0, 0x00, 0xef, 0xca, 0x00, 0x62,
+ 0x88, 0x56, 0xed, 0xc3, 0xb8, 0x05, 0x79, 0x13, 0x96, 0x0b, 0xd3, 0xc8,
+ 0x8f, 0xe3, 0x0a, 0x57, 0xe6, 0xa3, 0x34, 0x6a, 0xd1, 0xbd, 0xdf, 0x2c,
+ 0xcb, 0x45, 0x1c, 0xe5, 0x00, 0x06, 0xd4, 0x1c, 0x2a, 0x02, 0xa3, 0xcc,
+ 0xad, 0x20, 0x64, 0xde, 0x7b, 0xbb, 0x9f, 0x87, 0x5e, 0xdb, 0xf7, 0x5a,
+ 0x10, 0xe6, 0xa0, 0x0a, 0x29, 0xaf, 0x80, 0x92, 0xb3, 0x27, 0xae, 0x0e,
+ 0x22, 0xf6, 0xd9, 0x48, 0xd5, 0x18, 0x8c, 0xe9, 0x59, 0xc6, 0xd6, 0xd7,
+ 0x84, 0x0d, 0x69, 0xe1, 0x13, 0x69, 0xbb, 0xf5, 0x03, 0x7c, 0x0f, 0xb9,
+ 0x24, 0xd6, 0xc2, 0x31, 0xc3, 0xd1, 0xf1, 0x80, 0xbf, 0x53, 0x83, 0x6d,
+ 0x89, 0xd9, 0x7c, 0xe5, 0x70, 0xaf, 0x7e, 0xff, 0x78, 0x17, 0xa7, 0xaa,
+ 0xa3, 0xa0, 0x1d, 0xcc, 0x5c, 0x7d, 0xed, 0xbf, 0x7f, 0x94, 0x8e, 0xfe,
+ 0x85, 0x40, 0x46, 0x4f, 0xda, 0x66, 0xf9, 0xef, 0xe4, 0x8e, 0x5f, 0x02,
+ 0x6e, 0x65, 0x38, 0x49, 0xab, 0x48, 0x01, 0x82, 0x68, 0x88, 0x0a, 0xd2,
+ 0xa1, 0x08, 0x17, 0xfa, 0x16, 0x77, 0x56, 0x90, 0xac, 0x72, 0xfb, 0x43,
+ 0x33, 0x54, 0x12, 0xb6, 0x6b, 0xb0, 0x0e, 0x6f, 0xbf, 0xbd, 0xea, 0x20,
+ 0x40, 0x96, 0x4a, 0xe7, 0x03, 0x84, 0xc2, 0x22, 0xf8, 0x43, 0x74, 0x36,
+ 0xad, 0x8f, 0xcc, 0xaa, 0xf4, 0xc6, 0x33, 0xc9, 0x19, 0xda, 0xfd, 0x82,
+ 0x1d, 0xdf, 0x36, 0x87, 0x01, 0x29, 0xd6, 0x08, 0x69, 0xc6, 0xb4, 0x8f,
+ 0x7a, 0x5a, 0x65, 0x12, 0x62, 0x00, 0x4e, 0x20, 0x85, 0x2f, 0x01, 0xb0,
+ 0x67, 0xd4, 0x8e, 0xcb, 0x4c, 0x0b, 0x0f, 0xed, 0xaa, 0x15, 0x59, 0x82,
+ 0xe0, 0x24, 0x46, 0x91, 0xac, 0x5e, 0x97, 0xb8, 0xa3, 0xed, 0x6e, 0x53,
+ 0xc1, 0x9e, 0xc0, 0xab, 0x5a, 0x02, 0x2a, 0xe9, 0xd1, 0x0c, 0xdb, 0x82,
+ 0xb6, 0x6d, 0xe6, 0xdb, 0x79, 0xb7, 0x99, 0xf9, 0xd6, 0xf0, 0xcb, 0xf2,
+ 0xcb, 0xe1, 0xb6, 0xba, 0x3e, 0x81, 0xfb, 0x58, 0x93, 0x2d, 0x44, 0x93,
+ 0x45, 0xc0, 0xf3, 0x8a, 0xbc, 0x36, 0x22, 0xbe, 0xa8, 0x88, 0x81, 0x32,
+ 0x18, 0x05, 0xd7, 0x29, 0x68, 0x28, 0xc2, 0x33, 0xab, 0x10, 0xe9, 0x14,
+ 0x7e, 0x07, 0xff, 0x8e, 0xd9, 0xad, 0x0b, 0x4e, 0x90, 0xa2, 0x9a, 0x48,
+ 0x84, 0x81, 0x05, 0x88, 0x98, 0x9d, 0xca, 0xe5, 0xb2, 0x2d, 0x9b, 0x50,
+ 0x5e, 0xab, 0xbc, 0xe1, 0x85, 0x32, 0x95, 0x3f, 0xde, 0x9b, 0x3c, 0x6f,
+ 0xd9, 0xcf, 0x85, 0x78, 0x45, 0x70, 0xf9, 0xa8, 0x98, 0x82, 0x01, 0x8c,
+ 0xa7, 0x57, 0xd9, 0x42, 0x1a, 0xaf, 0xf4, 0x94, 0x22, 0xf7, 0xd6, 0xed,
+ 0xb6, 0xe7, 0xc4, 0xd9, 0x65, 0x17, 0xcd, 0x72, 0xb4, 0x28, 0xff, 0x66,
+ 0xb6, 0x39, 0x45, 0x27, 0xb7, 0xe0, 0x4a, 0x18, 0x59, 0x5f, 0xf0, 0xb9,
+ 0x20, 0x46, 0x50, 0x58, 0xab, 0xd2, 0xb1, 0xef, 0x44, 0x81, 0xa6, 0xb9,
+ 0x62, 0x3c, 0x49, 0x5e, 0x99, 0x19, 0x1f, 0x7e, 0x78, 0xff, 0x6e, 0xfc,
+ 0xfe, 0xb4, 0x4b, 0xd8, 0xa7, 0x27, 0x67, 0xe7, 0x87, 0xaf, 0x3f, 0x9c,
+ 0x9e, 0x9d, 0x9c, 0x9f, 0xbc, 0x3a, 0x39, 0x4e, 0xb6, 0xf6, 0xb6, 0xd7,
+ 0x96, 0x48, 0x59, 0x97, 0x86, 0x87, 0xb7, 0xa7, 0xf3, 0x67, 0x9e, 0x65,
+ 0x67, 0xb1, 0x85, 0xf5, 0x84, 0xa3, 0xfd, 0x20, 0xd4, 0xd5, 0xae, 0xed,
+ 0x63, 0xdf, 0x06, 0x89, 0x37, 0x62, 0xeb, 0x69, 0x72, 0xb9, 0xe2, 0x9b,
+ 0xe2, 0xc2, 0xe5, 0x8c, 0x34, 0x19, 0x28, 0x5c, 0x1a, 0xb0, 0xf3, 0xaa,
+ 0x6b, 0xd6, 0xfa, 0xf7, 0x9e, 0x74, 0x75, 0x16, 0x9c, 0x01, 0x29, 0x60,
+ 0x8e, 0x2a, 0xea, 0xf5, 0x64, 0xc1, 0x90, 0x1c, 0x84, 0xe3, 0x6c, 0xdf,
+ 0x20, 0x94, 0x7b, 0x09, 0xa1, 0x50, 0x49, 0x2a, 0x6b, 0x74, 0x46, 0x94,
+ 0x9e, 0x86, 0xdd, 0x89, 0xe4, 0x15, 0xb4, 0x30, 0x97, 0x1e, 0x99, 0x32,
+ 0x11, 0x0a, 0xa1, 0x61, 0x7f, 0x25, 0xa2, 0x6b, 0x1e, 0xc0, 0x6f, 0x3d,
+ 0xae, 0x4a, 0xa5, 0x45, 0x41, 0x58, 0x92, 0x5f, 0xbe, 0xa0, 0xfe, 0x8c,
+ 0x37, 0xde, 0xa4, 0x30, 0x1c, 0x94, 0x32, 0x42, 0xd3, 0x8b, 0x70, 0xd8,
+ 0x43, 0x8d, 0xce, 0x30, 0xce, 0x06, 0xdd, 0x48, 0x52, 0x5f, 0x14, 0xa4,
+ 0x65, 0xec, 0x2f, 0xe6, 0x1e, 0x42, 0xe6, 0x4d, 0x84, 0xbb, 0x7c, 0x80,
+ 0xb3, 0x1f, 0x30, 0x41, 0x4b, 0x58, 0x6a, 0x4d, 0x86, 0xbe, 0x43, 0x3c,
+ 0xf1, 0x7d, 0x5c, 0x34, 0x21, 0xb8, 0xde, 0xdd, 0x6a, 0xbc, 0xa9, 0x68,
+ 0x91, 0xa4, 0x91, 0x2d, 0xdd, 0xcd, 0x25, 0x59, 0x63, 0x8b, 0xd7, 0x05,
+ 0xc3, 0xc3, 0xe2, 0xf7, 0x02, 0xfe, 0xc2, 0xe8, 0xee, 0x07, 0x92, 0xab,
+ 0xc4, 0xc9, 0x3b, 0x5c, 0xfb, 0x4e, 0x60, 0x82, 0xaf, 0x4e, 0x23, 0xd8,
+ 0x0b, 0xae, 0x12, 0x9e, 0xd8, 0xad, 0x36, 0xf3, 0xdd, 0x1d, 0xed, 0x26,
+ 0xe3, 0xb7, 0x5f, 0x0b, 0x0a, 0xe1, 0xd7, 0x63, 0xc6, 0x69, 0x60, 0xcb,
+ 0x5b, 0x5f, 0x19, 0xc5, 0xb1, 0x9e, 0xd8, 0x99, 0x09, 0x5e, 0x8a, 0xd9,
+ 0xfd, 0x21, 0xb5, 0xc5, 0x65, 0x75, 0xff, 0x9a, 0x07, 0x11, 0xc9, 0xa4,
+ 0x05, 0xeb, 0xe6, 0x52, 0xd5, 0x6e, 0x9e, 0xd2, 0xdf, 0x95, 0x97, 0x3c,
+ 0x5a, 0x8f, 0x79, 0xb5, 0x1f, 0xdc, 0x86, 0xdf, 0xec, 0x1e, 0x68, 0x68,
+ 0xd6, 0xb2, 0xf0, 0xee, 0x66, 0x9c, 0xda, 0xb7, 0x68, 0xeb, 0x32, 0x94,
+ 0xca, 0x90, 0x3f, 0x78, 0x9e, 0x5d, 0x90, 0x02, 0x47, 0xd5, 0x6b, 0x03,
+ 0xfa, 0x25, 0x05, 0xbe, 0x6c, 0x6e, 0x53, 0x14, 0x00, 0x89, 0xc6, 0x48,
+ 0xa7, 0xbe, 0x42, 0xac, 0x58, 0x69, 0xdd, 0x3d, 0xf8, 0x03, 0xb5, 0x4d,
+ 0x65, 0x98, 0x58, 0x16, 0xcd, 0x02, 0x7b, 0x40, 0x20, 0x6e, 0xb9, 0xc6,
+ 0xb6, 0xbc, 0x9b, 0x34, 0x47, 0x39, 0xdc, 0x1d, 0x57, 0xd2, 0x05, 0x86,
+ 0x1a, 0x29, 0x51, 0x33, 0x18, 0x04, 0x2e, 0x89, 0x53, 0x69, 0x9a, 0x3a,
+ 0x1e, 0x39, 0xf4, 0x2b, 0xd1, 0x8a, 0x42, 0xce, 0x38, 0x4c, 0x92, 0xd7,
+ 0x59, 0x71, 0xa7, 0x9c, 0xd1, 0xe5, 0x1f, 0x11, 0x82, 0xc5, 0x35, 0xbb,
+ 0xaa, 0xd9, 0xeb, 0xcc, 0xb8, 0x40, 0x35, 0xc9, 0x40, 0x3b, 0xc5, 0x70,
+ 0x4a, 0xed, 0x39, 0xc7, 0xee, 0xff, 0x97, 0x76, 0x1b, 0xa4, 0x86, 0xda,
+ 0xdf, 0x8b, 0x2d, 0x02, 0x4a, 0xd0, 0xc8, 0x1c, 0x7d, 0x4f, 0x47, 0x5c,
+ 0xbb, 0x0d, 0xdb, 0x03, 0xac, 0x81, 0x0c, 0xa3, 0x7a, 0x35, 0xf9, 0x0b,
+ 0x03, 0x6e, 0x27, 0x30, 0xd0, 0x2b, 0xd9, 0x06, 0xc9, 0x57, 0x33, 0x9c,
+ 0xcd, 0x3c, 0xc0, 0xd1, 0x24, 0x73, 0xa3, 0x8b, 0xd8, 0x70, 0x14, 0x33,
+ 0x54, 0xa4, 0xeb, 0x36, 0x09, 0xd0, 0x94, 0xd6, 0x95, 0x28, 0x1d, 0x7c,
+ 0xd6, 0xc3, 0x28, 0x87, 0x17, 0xe0, 0x4c, 0x9c, 0x06, 0xd5, 0x11, 0x61,
+ 0xbc, 0x97, 0x9c, 0x7a, 0x67, 0x13, 0x41, 0xf1, 0x78, 0xef, 0x58, 0xca,
+ 0xef, 0xea, 0xc1, 0x1f, 0xf0, 0x47, 0xb8, 0x86, 0x56, 0xf4, 0x04, 0xdb,
+ 0xac, 0x37, 0x1d, 0x8f, 0x13, 0xf3, 0xa0, 0xd7, 0xfb, 0x3e, 0xf0, 0xa5,
+ 0x63, 0xa6, 0xeb, 0xc7, 0x26, 0xc6, 0xf3, 0x90, 0x0f, 0xbc, 0x2f, 0x14,
+ 0x55, 0x4c, 0xa9, 0x7b, 0x69, 0x81, 0xce, 0x6f, 0xd2, 0xaa, 0xa0, 0x4c,
+ 0x6f, 0xdf, 0x9c, 0x00, 0x1c, 0xc5, 0x52, 0x7a, 0x20, 0xa4, 0x17, 0xc8,
+ 0x91, 0xad, 0x32, 0x87, 0xcb, 0x8a, 0x93, 0x64, 0xd0, 0x19, 0x81, 0x7a,
+ 0xd6, 0x94, 0xcd, 0x65, 0xd9, 0x30, 0xe8, 0x34, 0x92, 0x6a, 0xa1, 0x2f,
+ 0x54, 0xf0, 0xb4, 0x79, 0x9b, 0xac, 0xaa, 0x26, 0x46, 0xb3, 0x87, 0x8f,
+ 0x91, 0x56, 0x4b, 0x04, 0xf1, 0x24, 0xdd, 0x89, 0x03, 0xa2, 0x1e, 0x93,
+ 0x91, 0xcf, 0x71, 0x5e, 0x14, 0x39, 0x6e, 0x5c, 0xcc, 0x2d, 0xbd, 0x2e,
+ 0x73, 0x24, 0xd7, 0x58, 0x6f, 0x05, 0x29, 0x41, 0x8e, 0x4a, 0xce, 0xc3,
+ 0xae, 0x09, 0x64, 0xa4, 0xd8, 0x8c, 0x14, 0xb1, 0x52, 0xe0, 0x0f, 0xa4,
+ 0x84, 0x21, 0x72, 0x1c, 0x78, 0x45, 0x38, 0x7c, 0xbb, 0x75, 0x38, 0x4a,
+ 0x5b, 0x48, 0x19, 0xf4, 0xcc, 0xd0, 0x64, 0x91, 0x36, 0x7a, 0x5f, 0x3c,
+ 0x8e, 0x88, 0x19, 0x12, 0x28, 0x41, 0x01, 0xdb, 0x61, 0x6a, 0x11, 0x81,
+ 0xba, 0xb8, 0xd2, 0xed, 0xd6, 0xd0, 0x56, 0xa2, 0xda, 0xec, 0x4a, 0xa7,
+ 0x2c, 0x8e, 0xee, 0x61, 0xe2, 0xb7, 0x77, 0x9a, 0xcf, 0xb5, 0x96, 0x81,
+ 0x2f, 0xa9, 0xc2, 0xd6, 0x6c, 0x74, 0xde, 0xd0, 0x81, 0x75, 0xf2, 0x49,
+ 0x35, 0xcd, 0x52, 0xbc, 0x1e, 0x8b, 0xc5, 0x2a, 0xec, 0x63, 0x27, 0x41,
+ 0x34, 0x01, 0x42, 0x27, 0x6e, 0xcf, 0x40, 0x4b, 0xa4, 0x46, 0x88, 0xbb,
+ 0x83, 0xb1, 0xf6, 0xbd, 0xfe, 0x03, 0x48, 0xdb, 0x45, 0x58, 0x2d, 0xee,
+ 0x8d, 0xdb, 0xb1, 0xf8, 0x2a, 0x86, 0x60, 0x8a, 0xd9, 0xd0, 0x30, 0x81,
+ 0xe5, 0x1a, 0x6f, 0x96, 0x73, 0xf8, 0xb4, 0x12, 0x51, 0x7d, 0x44, 0x07,
+ 0xfe, 0x09, 0xe7, 0xbb, 0xc9, 0xde, 0x85, 0x89, 0xdc, 0x46, 0x17, 0x78,
+ 0x14, 0xdb, 0xc9, 0x58, 0x42, 0x5d, 0x37, 0xd6, 0x8b, 0x45, 0xf5, 0x02,
+ 0xf0, 0xf3, 0x0e, 0xd2, 0x06, 0xea, 0x86, 0xf5, 0x65, 0x1f, 0xf1, 0xde,
+ 0xc9, 0xb6, 0xbd, 0xe7, 0x32, 0x27, 0x1a, 0x91, 0xaa, 0x57, 0x0b, 0x49,
+ 0x61, 0xf6, 0xbe, 0xc4, 0x06, 0x51, 0xb0, 0x8f, 0x04, 0x79, 0xa4, 0x50,
+ 0xee, 0xfc, 0x24, 0x05, 0x55, 0x7c, 0x6e, 0x17, 0x3f, 0xed, 0x88, 0x47,
+ 0x85, 0xf8, 0x24, 0x7d, 0x08, 0x13, 0xcb, 0xd7, 0x82, 0x09, 0xf4, 0x1c,
+ 0x46, 0x0c, 0x47, 0x63, 0xd6, 0xc9, 0x0e, 0xd5, 0x9f, 0x73, 0x07, 0xf4,
+ 0x78, 0x4e, 0xda, 0x58, 0xee, 0x9b, 0xf6, 0x49, 0x27, 0x3e, 0xad, 0x09,
+ 0x81, 0x9e, 0x8b, 0x8d, 0x9b, 0x01, 0xdd, 0xae, 0xc9, 0xfc, 0xf0, 0x3e,
+ 0xc7, 0x18, 0x1a, 0xd2, 0x2e, 0x59, 0xc6, 0x75, 0xff, 0xf4, 0x7f, 0x7b,
+ 0x3b, 0x88, 0x31, 0x69, 0x9c, 0x55, 0xbf, 0xaf, 0xa2, 0xfd, 0x99, 0x17,
+ 0xe6, 0x46, 0xaf, 0x5b, 0x14, 0x3d, 0xf4, 0x6b, 0x16, 0x15, 0xac, 0x8a,
+ 0x96, 0x41, 0xfb, 0x1d, 0x9c, 0x09, 0x7f, 0x66, 0x4d, 0xc4, 0xa7, 0x67,
+ 0x09, 0x66, 0xc4, 0x35, 0x2d, 0x5c, 0xbd, 0x65, 0xd8, 0x07, 0x7f, 0xe9,
+ 0x4a, 0xee, 0xdf, 0x46, 0x22, 0x0d, 0xfc, 0xf7, 0xcf, 0x07, 0xe4, 0x4c,
+ 0x9b, 0xfd, 0xdc, 0x3b, 0x8f, 0xc3, 0x81, 0xcc, 0xe5, 0x13, 0x4c, 0x23,
+ 0x5f, 0x5e, 0xc1, 0x59, 0xf2, 0x22, 0x56, 0x01, 0xe3, 0x6d, 0x84, 0x3c,
+ 0xf6, 0xdb, 0x7f, 0xbf, 0x9a, 0x3b, 0xac, 0x99, 0x35, 0xdf, 0x97, 0xc7,
+ 0x7e, 0xf3, 0xef, 0xf3, 0xdd, 0xbd, 0xd7, 0x79, 0x42, 0x8c, 0xea, 0xb5,
+ 0xa4, 0x19, 0x47, 0x78, 0xe2, 0xaf, 0x66, 0x8a, 0x92, 0xba, 0x1c, 0x72,
+ 0x45, 0xf9, 0x58, 0xb4, 0x21, 0x82, 0xb0, 0x45, 0xe2, 0x8a, 0xbf, 0x09,
+ 0x07, 0x23, 0xd6, 0x1c, 0x6e, 0x8e, 0x74, 0x28, 0x79, 0xc1, 0x7f, 0xee,
+ 0x7c, 0x15, 0x3b, 0x23, 0xad, 0x06, 0x81, 0x14, 0xd4, 0x96, 0x26, 0xd4,
+ 0x25, 0x83, 0xeb, 0xf7, 0x45, 0xe3, 0xb5, 0xfd, 0x1d, 0xb0, 0x59, 0xb6,
+ 0xa7, 0x36, 0x5e, 0x8d, 0x35, 0x52, 0x91, 0x1d, 0xd2, 0x6c, 0x4e, 0x0b,
+ 0x78, 0x6d, 0x53, 0x79, 0xa0, 0x78, 0x64, 0xde, 0x17, 0x6b, 0x0b, 0x94,
+ 0x12, 0x71, 0x30, 0xfa, 0xdd, 0x28, 0x1d, 0x96, 0xe8, 0xb7, 0x03, 0xe9,
+ 0x63, 0x62, 0x46, 0x03, 0x55, 0x49, 0x2a, 0xa3, 0x84, 0x10, 0xe4, 0x38,
+ 0x43, 0xc4, 0x15, 0x69, 0x3a, 0x4f, 0x19, 0xf6, 0x94, 0xba, 0x89, 0x15,
+ 0xbe, 0x3a, 0x79, 0xf7, 0xee, 0xf0, 0x55, 0x37, 0xe4, 0x66, 0x7b, 0x3e,
+ 0x3a, 0x55, 0x3f, 0x68, 0xa3, 0x47, 0x9f, 0x27, 0x88, 0x74, 0x89, 0xb9,
+ 0xf0, 0xf7, 0xa9, 0xc7, 0x4e, 0x2a, 0x68, 0xa9, 0xfc, 0x4b, 0x56, 0x49,
+ 0x04, 0x49, 0x53, 0x28, 0x20, 0x52, 0x74, 0x15, 0xd0, 0xc3, 0xd4, 0x43,
+ 0x5f, 0xe1, 0x0e, 0x56, 0x35, 0x35, 0x6d, 0x22, 0x45, 0x94, 0x8c, 0x4c,
+ 0x99, 0x05, 0x25, 0x3e, 0xcf, 0x66, 0x3b, 0x92, 0x57, 0xac, 0xdf, 0xee,
+ 0xa3, 0x65, 0x86, 0xde, 0x42, 0xed, 0xc6, 0xb0, 0xbc, 0xe0, 0x8e, 0x9e,
+ 0x8b, 0xb4, 0xfa, 0x88, 0xa0, 0xb0, 0x57, 0xc5, 0x41, 0x75, 0x7c, 0x84,
+ 0x02, 0x3c, 0x9b, 0xc5, 0xca, 0xc3, 0xc9, 0x77, 0xed, 0x27, 0xad, 0xcb,
+ 0x64, 0xa4, 0x05, 0xde, 0x81, 0x96, 0xd7, 0xe1, 0xf5, 0x22, 0xbb, 0xc1,
+ 0x67, 0x18, 0x13, 0x03, 0x65, 0xde, 0x21, 0xac, 0x3e, 0x43, 0x39, 0xb3,
+ 0x6f, 0xfe, 0x4e, 0xca, 0xcb, 0x71, 0x54, 0x0b, 0x86, 0xad, 0x27, 0x70,
+ 0x5c, 0x74, 0x82, 0xe2, 0xd2, 0x8c, 0x60, 0xaf, 0xbe, 0x15, 0x78, 0xbb,
+ 0x4e, 0x58, 0x2a, 0x68, 0xbc, 0x23, 0x75, 0x2b, 0x16, 0xf3, 0x8e, 0x1c,
+ 0x04, 0x7d, 0x10, 0x21, 0x0e, 0xa7, 0x8a, 0xfc, 0xd0, 0x75, 0x6b, 0x08,
+ 0x3d, 0xdd, 0xb4, 0x27, 0x7e, 0x36, 0x06, 0x5e, 0x35, 0xdd, 0x15, 0x7c,
+ 0xc2, 0x30, 0xb1, 0x27, 0x5d, 0xec, 0x55, 0xc2, 0x0c, 0x25, 0x57, 0x23,
+ 0xf0, 0xc8, 0x2e, 0x29, 0x09, 0x1d, 0x0f, 0xd3, 0x65, 0x0d, 0xd4, 0x5c,
+ 0x30, 0x54, 0xaa, 0xcf, 0x1a, 0x68, 0x0f, 0x72, 0xea, 0xc9, 0x33, 0x43,
+ 0x96, 0x99, 0xee, 0xbd, 0xe2, 0x8b, 0xb0, 0x2f, 0x5f, 0x2e, 0xb0, 0xf9,
+ 0x73, 0xb9, 0x6a, 0x82, 0x70, 0x1c, 0x90, 0x96, 0xb8, 0xcc, 0xfe, 0xab,
+ 0x61, 0xd8, 0x94, 0x28, 0x9d, 0xf9, 0x67, 0x4a, 0x0c, 0x9c, 0xcc, 0xfe,
+ 0xba, 0x31, 0xf7, 0x3f, 0xee, 0x9f, 0xb5, 0x38, 0x52, 0x5a, 0xde, 0x10,
+ 0xb3, 0x6a, 0x68, 0xc7, 0x1c, 0xa9, 0xee, 0x90, 0x5f, 0xa1, 0x4b, 0x0b,
+ 0xf6, 0x15, 0x65, 0x11, 0xeb, 0x00, 0x35, 0x08, 0xed, 0xaf, 0xc3, 0xfd,
+ 0x8c, 0x95, 0x03, 0xcf, 0x53, 0xd6, 0x27, 0x94, 0x3e, 0x32, 0x7c, 0x23,
+ 0x3f, 0xf4, 0xdb, 0x4b, 0xa6, 0xf5, 0x6d, 0xe6, 0x9d, 0x68, 0xb4, 0xcf,
+ 0x7d, 0x8a, 0x19, 0x44, 0xfb, 0xb6, 0xb7, 0xbe, 0xfd, 0xf0, 0xcf, 0x06,
+ 0xb0, 0x73, 0x0f, 0x93, 0xba, 0x0e, 0x52, 0xd1, 0x61, 0x2a, 0x76, 0x65,
+ 0x30, 0x31, 0xdc, 0x20, 0x5d, 0xd4, 0x93, 0xc8, 0x6b, 0x65, 0xb0, 0x2b,
+ 0x27, 0xf2, 0xc5, 0x70, 0x24, 0xec, 0x1d, 0x83, 0x77, 0x94, 0x40, 0xce,
+ 0xc3, 0x44, 0xf2, 0xbd, 0x22, 0xb8, 0x55, 0x8d, 0xd9, 0xcd, 0x56, 0xb2,
+ 0xc5, 0x58, 0x0f, 0xdc, 0xb8, 0x48, 0x69, 0x62, 0xf2, 0x4f, 0xaa, 0x2b,
+ 0x54, 0x01, 0xd6, 0x52, 0x56, 0xe8, 0x2b, 0xad, 0x4d, 0x78, 0x88, 0x54,
+ 0x0a, 0xb6, 0xa4, 0x5b, 0xd2, 0xd5, 0xda, 0xa8, 0x70, 0x17, 0xd6, 0x25,
+ 0xa3, 0x3b, 0xf2, 0xa4, 0xa7, 0x7e, 0xf3, 0x6b, 0xf1, 0xf0, 0x4c, 0xea,
+ 0xf6, 0xc1, 0xac, 0x4d, 0xa3, 0xe6, 0x34, 0x5d, 0xc1, 0x6c, 0xee, 0xcd,
+ 0xa4, 0xee, 0xa6, 0x52, 0x7b, 0x5e, 0x89, 0x48, 0x2e, 0x35, 0x8d, 0xf6,
+ 0xff, 0xc1, 0x4c, 0x6a, 0x3f, 0x91, 0x3a, 0xa5, 0x34, 0xea, 0x48, 0x16,
+ 0xb5, 0x6c, 0xb4, 0x64, 0x3d, 0x4a, 0x0f, 0xb9, 0x75, 0x99, 0xd4, 0x7e,
+ 0x2a, 0xf5, 0xba, 0x5c, 0x6a, 0xaa, 0x2d, 0x5e, 0x93, 0x49, 0xfd, 0xeb,
+ 0x12, 0xa9, 0xfb, 0x32, 0xa9, 0x7f, 0x79, 0x2a, 0xf5, 0x6f, 0x9b, 0x49,
+ 0xfd, 0x5b, 0xe6, 0xf4, 0xd2, 0xed, 0xc1, 0x89, 0xe4, 0x53, 0xa9, 0x51,
+ 0x79, 0x71, 0x1f, 0xba, 0x68, 0x3b, 0x0d, 0xc4, 0x0b, 0xd6, 0xca, 0x30,
+ 0xac, 0xd1, 0x78, 0x8a, 0x7b, 0x11, 0xe8, 0x3c, 0x42, 0x2b, 0x91, 0x3c,
+ 0x32, 0x3f, 0x9a, 0xfa, 0x28, 0x76, 0xd3, 0xeb, 0x7a, 0x3e, 0xa4, 0x19,
+ 0xa0, 0x74, 0x34, 0xb0, 0x12, 0x1d, 0x9f, 0xe9, 0x3c, 0xf7, 0xdb, 0xb3,
+ 0x9c, 0x66, 0x5e, 0xef, 0x3d, 0x72, 0xb6, 0xba, 0xfc, 0x65, 0x85, 0xb2,
+ 0xc6, 0x98, 0xdd, 0x2e, 0x75, 0x1c, 0x63, 0xe1, 0x32, 0x0a, 0x55, 0xc1,
+ 0xaf, 0x91, 0x97, 0x34, 0xb3, 0xfd, 0xd5, 0x6c, 0x48, 0xc2, 0x76, 0x4b,
+ 0x0d, 0x6a, 0x54, 0xa8, 0x8a, 0xd9, 0x5f, 0x07, 0xc9, 0x10, 0x54, 0xa3,
+ 0x28, 0xd3, 0xae, 0xe9, 0x16, 0xee, 0x8d, 0x1e, 0x71, 0xa1, 0xab, 0x86,
+ 0x74, 0x64, 0x9e, 0x01, 0x38, 0x0d, 0x7d, 0x9f, 0xc1, 0x81, 0x5d, 0x26,
+ 0x17, 0xb7, 0x2f, 0xd2, 0x77, 0x46, 0xc9, 0x19, 0xd4, 0x47, 0xa3, 0xac,
+ 0x9b, 0x19, 0xc9, 0xe0, 0xf2, 0xbb, 0xd8, 0x70, 0x6d, 0x3c, 0x4a, 0x43,
+ 0x3f, 0xef, 0xcf, 0x8e, 0xc3, 0x28, 0x2f, 0x45, 0x0f, 0x0e, 0x76, 0x76,
+ 0x28, 0xcf, 0xe8, 0x2a, 0xbd, 0xbd, 0x1d, 0xd5, 0xd9, 0xce, 0xac, 0x9c,
+ 0xd6, 0x3b, 0x38, 0x41, 0xfd, 0xf2, 0x55, 0xb3, 0x98, 0x7f, 0xf2, 0x6b,
+ 0x60, 0x4e, 0x14, 0x92, 0xed, 0x21, 0x0a, 0x9e, 0xff, 0xe8, 0xa7, 0xa0,
+ 0x2c, 0x9b, 0xca, 0xf5, 0x82, 0xf3, 0xb4, 0xd6, 0xce, 0xc4, 0x3e, 0xfc,
+ 0x29, 0x66, 0x42, 0x25, 0xc6, 0x51, 0x9e, 0xd0, 0x9a, 0x03, 0x3d, 0xf6,
+ 0x29, 0xbe, 0x7f, 0xbd, 0xd7, 0xf7, 0x59, 0xea, 0x81, 0x48, 0x4f, 0xfc,
+ 0x86, 0x1f, 0x7e, 0x6f, 0x1d, 0x34, 0x5c, 0x8e, 0xfd, 0x02, 0xff, 0x3d,
+ 0xd0, 0x1d, 0x5e, 0xd7, 0x5c, 0xa9, 0xd5, 0x30, 0xab, 0xd5, 0x36, 0x58,
+ 0xfb, 0x3a, 0x6b, 0xb6, 0xe7, 0x5a, 0xbc, 0x83, 0x5e, 0x40, 0x03, 0x46,
+ 0xb3, 0x11, 0x44, 0x5b, 0x02, 0x1b, 0x1f, 0x2a, 0x22, 0x16, 0xa3, 0x3f,
+ 0x30, 0x20, 0x07, 0x3e, 0x6e, 0x0c, 0x74, 0x01, 0x88, 0x79, 0xd7, 0xc3,
+ 0x7a, 0xa9, 0xb1, 0x43, 0x04, 0x0b, 0x83, 0x6d, 0xcf, 0xbb, 0x58, 0x27,
+ 0x4c, 0x73, 0xb1, 0xe6, 0x86, 0x1b, 0x45, 0x9c, 0x39, 0x3d, 0x2b, 0x27,
+ 0xc9, 0x4b, 0x7c, 0xca, 0x47, 0x51, 0x99, 0x58, 0xdf, 0x51, 0x0c, 0x1a,
+ 0x5c, 0x54, 0x1f, 0x2f, 0x17, 0xd0, 0xbb, 0xe2, 0x07, 0xc9, 0xc6, 0xf0,
+ 0x7d, 0x72, 0xb0, 0x11, 0x6c, 0xd1, 0x49, 0x21, 0x2d, 0x0f, 0xc8, 0xcb,
+ 0x53, 0x51, 0x0d, 0x2f, 0xf5, 0x50, 0xf1, 0xa5, 0xf1, 0x15, 0xb0, 0x56,
+ 0x9c, 0x0a, 0x6d, 0xe1, 0xc2, 0x2f, 0x83, 0xc0, 0x13, 0xcd, 0x53, 0x4a,
+ 0xb0, 0xb4, 0xc7, 0x07, 0xd8, 0x27, 0x5c, 0x15, 0x0e, 0xfd, 0x97, 0x74,
+ 0x06, 0xc6, 0x2f, 0x97, 0x60, 0x3e, 0x22, 0x78, 0xd3, 0xd0, 0xe5, 0x60,
+ 0x9b, 0xe3, 0xd2, 0x88, 0xcb, 0xb2, 0xae, 0xf3, 0x09, 0x40, 0x3e, 0xb3,
+ 0x86, 0xf4, 0x9a, 0x3a, 0xe3, 0x3c, 0x1c, 0xee, 0x31, 0x88, 0xbd, 0xf4,
+ 0x00, 0xe1, 0xea, 0x10, 0x15, 0x88, 0x57, 0xca, 0x0d, 0xa9, 0x9c, 0x4b,
+ 0xc5, 0xcc, 0x8e, 0x59, 0xdb, 0x75, 0x8e, 0xe1, 0x99, 0xe0, 0xd2, 0x64,
+ 0x52, 0xe5, 0xd9, 0x45, 0xb2, 0x28, 0x79, 0xeb, 0x49, 0xd9, 0x08, 0x92,
+ 0x3c, 0x00, 0x2a, 0x80, 0x36, 0xb9, 0xc8, 0xd1, 0xac, 0x81, 0xb9, 0x46,
+ 0x89, 0xbb, 0x94, 0x35, 0xe7, 0xb2, 0x82, 0xab, 0x0c, 0xd1, 0xf2, 0xeb,
+ 0x4c, 0x8e, 0x35, 0x55, 0x44, 0xe5, 0x9e, 0x6c, 0xc6, 0xca, 0x42, 0xd3,
+ 0x52, 0x9e, 0x3c, 0xa1, 0x99, 0x58, 0x68, 0x05, 0x7c, 0x31, 0xd1, 0x2e,
+ 0xd3, 0x69, 0xab, 0xea, 0x78, 0xf4, 0xc9, 0x78, 0xbc, 0xe7, 0x79, 0xfd,
+ 0x05, 0x19, 0xe4, 0xed, 0x4e, 0x37, 0xfd, 0xf9, 0xd4, 0xed, 0xa4, 0x5a,
+ 0xd1, 0xfb, 0xef, 0xcb, 0xa4, 0xbe, 0x00, 0x26, 0xf4, 0xbb, 0xae, 0x64,
+ 0x8f, 0xa4, 0x24, 0x23, 0xf5, 0x8a, 0x33, 0x9d, 0xec, 0xea, 0x1a, 0x2a,
+ 0x8c, 0x26, 0x7c, 0x09, 0x3f, 0x18, 0xfa, 0x3e, 0xe8, 0xad, 0xeb, 0x12,
+ 0xad, 0xfb, 0x53, 0xab, 0xbd, 0xcc, 0x6a, 0x2a, 0x25, 0x60, 0xbf, 0x70,
+ 0x8a, 0x19, 0x84, 0x9d, 0x04, 0x81, 0xa1, 0xcb, 0x59, 0xd5, 0x9a, 0x54,
+ 0xed, 0xe7, 0x54, 0x1b, 0x3d, 0xc7, 0x8b, 0x4f, 0x3b, 0xd0, 0x3b, 0x38,
+ 0x15, 0xe3, 0x91, 0x51, 0xba, 0xa1, 0x04, 0x7f, 0xfe, 0x2c, 0x68, 0x62,
+ 0xc6, 0xbc, 0x5c, 0x19, 0xa7, 0x0e, 0x66, 0x68, 0x3c, 0xb5, 0x7a, 0x83,
+ 0xfb, 0x16, 0xef, 0xa8, 0xfb, 0x54, 0x5f, 0xec, 0x89, 0xa1, 0x42, 0x22,
+ 0x45, 0x86, 0xef, 0xc6, 0xe3, 0x30, 0xb9, 0xba, 0x30, 0x0a, 0x79, 0x79,
+ 0x59, 0xe4, 0x7f, 0x93, 0xe6, 0x32, 0xdd, 0xb4, 0xc8, 0x56, 0x72, 0xbb,
+ 0xa4, 0x47, 0x26, 0x04, 0xbc, 0x4a, 0xc9, 0x01, 0x21, 0x7f, 0x13, 0x10,
+ 0x2b, 0x88, 0x1d, 0xca, 0x52, 0x22, 0xf4, 0x1d, 0xd9, 0x4a, 0x6e, 0x1a,
+ 0xcf, 0x3d, 0x44, 0x5a, 0x81, 0x7e, 0x45, 0xfb, 0xf8, 0x2c, 0x54, 0x9e,
+ 0xb0, 0x07, 0x02, 0x9b, 0xf1, 0xdf, 0x20, 0x19, 0xbd, 0xed, 0x30, 0xf4,
+ 0xb0, 0x63, 0xb2, 0x5b, 0xe6, 0xa0, 0x71, 0x70, 0x2e, 0xc1, 0x55, 0xcc,
+ 0x62, 0xe2, 0xc5, 0xba, 0xdf, 0xa9, 0x7b, 0xc0, 0x43, 0xf0, 0xb9, 0x6a,
+ 0x61, 0xad, 0x81, 0x78, 0x89, 0x80, 0x73, 0xd9, 0xd1, 0x1f, 0x80, 0xca,
+ 0x05, 0xd7, 0xb5, 0x82, 0x2a, 0xcb, 0x94, 0xa9, 0xd1, 0x00, 0x37, 0xb0,
+ 0xcc, 0x18, 0x4a, 0xcb, 0xd6, 0x90, 0x88, 0x5e, 0x8e, 0x0b, 0x1b, 0xed,
+ 0x81, 0xb7, 0x44, 0xab, 0x0a, 0x58, 0x9c, 0x13, 0x2d, 0x2a, 0x6c, 0x78,
+ 0x6f, 0xf1, 0x36, 0x3a, 0x2b, 0x51, 0x39, 0x8e, 0x85, 0xf4, 0x81, 0xf9,
+ 0x4a, 0xd5, 0x85, 0x4a, 0x13, 0x5d, 0xd2, 0x72, 0x00, 0xd7, 0x76, 0x8a,
+ 0x9c, 0x16, 0x21, 0x7e, 0x6d, 0xdb, 0xb6, 0xa9, 0x2d, 0xc3, 0x18, 0x3c,
+ 0x31, 0x20, 0x2d, 0x81, 0xd4, 0x20, 0x35, 0x60, 0x65, 0xec, 0x10, 0x40,
+ 0x5f, 0x72, 0x41, 0x8a, 0x3d, 0x93, 0x01, 0xb8, 0x0f, 0xb3, 0x5c, 0xf1,
+ 0x4e, 0x0d, 0x97, 0xca, 0x65, 0xbb, 0x8b, 0xbd, 0x93, 0x41, 0x7a, 0xda,
+ 0x9d, 0xff, 0xcf, 0xa8, 0x61, 0xf0, 0x24, 0x05, 0xc4, 0x4e, 0x28, 0x27,
+ 0x28, 0x34, 0x06, 0x3f, 0x04, 0xe7, 0xfe, 0xdc, 0xa4, 0xb6, 0xf3, 0x02,
+ 0xbd, 0xd5, 0x4d, 0x46, 0x8d, 0xdd, 0xa4, 0x81, 0xd7, 0x69, 0xa8, 0xc5,
+ 0x41, 0x94, 0x3f, 0x72, 0xf2, 0x34, 0x7a, 0x3e, 0xf5, 0x20, 0x94, 0x64,
+ 0xa8, 0x46, 0x9e, 0x65, 0x82, 0x2e, 0xf4, 0x07, 0xd7, 0xf8, 0xe0, 0x53,
+ 0x1b, 0x60, 0x7b, 0x86, 0x37, 0xbf, 0xf0, 0xe4, 0xf1, 0x1f, 0x1f, 0x52,
+ 0xd2, 0x45, 0x57, 0x2d, 0xc1, 0xab, 0x6d, 0x04, 0xbf, 0x08, 0xd3, 0x8b,
+ 0x5f, 0x18, 0xea, 0xb2, 0x48, 0x61, 0x3d, 0x65, 0x6f, 0xc8, 0x06, 0xc3,
+ 0xcb, 0x3d, 0x0c, 0x4e, 0x30, 0x22, 0x15, 0x1a, 0xde, 0xf0, 0xf3, 0x49,
+ 0xd6, 0xdc, 0x64, 0x99, 0x58, 0xb9, 0xba, 0x8d, 0x1e, 0x0f, 0xb0, 0xfc,
+ 0xb0, 0x37, 0xc7, 0x63, 0x20, 0x98, 0xbc, 0xe0, 0x28, 0x8c, 0x41, 0x6a,
+ 0x9d, 0x01, 0x1a, 0xc8, 0x0c, 0xae, 0x5f, 0xac, 0x93, 0x89, 0x0b, 0xcb,
+ 0xf2, 0xf7, 0xb1, 0x2f, 0x5e, 0xfe, 0x69, 0xab, 0xd6, 0x44, 0x53, 0x75,
+ 0xe4, 0x41, 0xdf, 0xaf, 0x6d, 0xaf, 0xb1, 0x5c, 0xdb, 0x98, 0xc7, 0xaf,
+ 0xcd, 0xe6, 0xf4, 0xf0, 0x3d, 0x3d, 0x6b, 0xd0, 0x69, 0xb1, 0xe3, 0xe2,
+ 0x9d, 0xd1, 0x70, 0x68, 0x1f, 0x97, 0x61, 0xf7, 0x85, 0xfc, 0x36, 0x5d,
+ 0x9a, 0x9f, 0x21, 0x0e, 0x46, 0x70, 0x98, 0xb3, 0x2c, 0x16, 0x8b, 0xef,
+ 0x6c, 0x7e, 0x27, 0x10, 0x4c, 0xe7, 0x13, 0x42, 0xe4, 0x5a, 0xe3, 0x2c,
+ 0xd6, 0xdd, 0xa1, 0x16, 0xd0, 0x19, 0xf5, 0xc8, 0x68, 0x60, 0x58, 0x02,
+ 0x0c, 0x3e, 0xa5, 0x09, 0xb0, 0x5a, 0xc1, 0xe7, 0xd7, 0x84, 0xc8, 0xbb,
+ 0xad, 0x35, 0x86, 0x8d, 0x9f, 0xcf, 0x19, 0x89, 0x8d, 0x4a, 0x79, 0xba,
+ 0xf3, 0x97, 0xbc, 0x35, 0x6d, 0xf8, 0xc5, 0x89, 0x5f, 0xf8, 0x1e, 0x76,
+ 0x99, 0x7a, 0x0a, 0x04, 0x6e, 0x22, 0xc1, 0xad, 0xd1, 0x57, 0x04, 0xbd,
+ 0x55, 0x3e, 0x60, 0x3b, 0x23, 0xf6, 0x45, 0xe3, 0x62, 0x79, 0x0b, 0xad,
+ 0x5b, 0x2b, 0xfe, 0xf6, 0x48, 0x3c, 0x6a, 0x6b, 0x8c, 0x36, 0x18, 0xe3,
+ 0x57, 0xa7, 0xdb, 0xc9, 0x69, 0x07, 0x94, 0x84, 0xca, 0x59, 0x20, 0x4c,
+ 0x7d, 0x46, 0x2c, 0xad, 0xa8, 0x18, 0x9c, 0xaf, 0x1f, 0xc0, 0x42, 0x21,
+ 0x51, 0x2d, 0x0c, 0x25, 0x85, 0x3b, 0x7f, 0x73, 0xc6, 0xd4, 0x59, 0xcb,
+ 0x4b, 0x02, 0xa3, 0x61, 0x7c, 0x0a, 0x31, 0x29, 0xfd, 0x5b, 0x6a, 0x4c,
+ 0xe8, 0x12, 0x45, 0x5a, 0xdc, 0xfb, 0x45, 0x1c, 0xd1, 0x0a, 0xc5, 0x31,
+ 0x0f, 0xd2, 0xfb, 0x38, 0xaa, 0xa0, 0xa9, 0xd6, 0x1e, 0x12, 0x8f, 0x74,
+ 0x61, 0xab, 0x59, 0x2e, 0x75, 0x9a, 0x77, 0x61, 0x15, 0x97, 0x59, 0x11,
+ 0x36, 0x5d, 0xa0, 0x8f, 0x42, 0x90, 0x0b, 0x51, 0xcf, 0x46, 0x5d, 0xe0,
+ 0x5f, 0xcf, 0x51, 0x2e, 0x93, 0xf3, 0x1b, 0x9b, 0xf5, 0x80, 0x03, 0x92,
+ 0xc9, 0x3f, 0xa1, 0xe2, 0xb1, 0x8f, 0xe0, 0x89, 0x97, 0x08, 0x4e, 0x34,
+ 0x24, 0xe3, 0x96, 0x77, 0xd8, 0x0e, 0xf3, 0x60, 0x5d, 0x5f, 0xed, 0x1b,
+ 0xce, 0xb1, 0x3f, 0xfa, 0x9c, 0x4c, 0x14, 0x23, 0xac, 0x23, 0x48, 0xa2,
+ 0x9c, 0x32, 0x21, 0xcd, 0x1a, 0x3b, 0xa3, 0x89, 0x16, 0x3e, 0x72, 0x8a,
+ 0xff, 0xf0, 0x7f, 0x83, 0xd2, 0xfe, 0xba, 0x0a, 0x63, 0x56, 0x5b, 0x44,
+ 0x50, 0x6f, 0xb8, 0xf7, 0x2e, 0xfa, 0x40, 0xc0, 0x78, 0x9f, 0xe4, 0x0d,
+ 0x01, 0x7a, 0xab, 0x0d, 0xd9, 0xbe, 0x98, 0x78, 0x83, 0x5b, 0xb3, 0xbd,
+ 0x09, 0x92, 0x5a, 0x38, 0x0a, 0x61, 0x54, 0xf0, 0xff, 0x8d, 0x6f, 0xe9,
+ 0x00, 0x5c, 0xd5, 0x42, 0x19, 0x00, 0x5f, 0x1f, 0xbe, 0x39, 0x39, 0x3b,
+ 0x6c, 0x57, 0xba, 0x35, 0xd4, 0x7b, 0x88, 0x02, 0xdc, 0xdd, 0xd9, 0x11,
+ 0x20, 0x17, 0xd7, 0x5d, 0xe3, 0x95, 0xbc, 0xc8, 0x61, 0xf4, 0x27, 0xa7,
+ 0x3f, 0xbc, 0xb6, 0x93, 0xcb, 0x89, 0x69, 0xd2, 0xa4, 0x5c, 0x3b, 0x79,
+ 0xd9, 0xe7, 0xae, 0x68, 0x87, 0x12, 0xb0, 0x3d, 0x02, 0x3b, 0xe0, 0xe0,
+ 0xbd, 0x4e, 0x8f, 0xd2, 0x0a, 0x38, 0x19, 0x44, 0x8b, 0xbc, 0x09, 0xfe,
+ 0xb9, 0xae, 0x51, 0xb4, 0x6d, 0x87, 0x0d, 0xf4, 0x5e, 0x12, 0xfd, 0x04,
+ 0x7d, 0x24, 0xb6, 0x28, 0x40, 0xaf, 0x80, 0x83, 0x35, 0x4a, 0xec, 0x47,
+ 0xdc, 0x57, 0xb8, 0x08, 0x8f, 0xdc, 0x20, 0xf4, 0x95, 0x18, 0xc3, 0x46,
+ 0xdb, 0x67, 0x76, 0xfe, 0xb3, 0xbc, 0x83, 0xc3, 0x85, 0xfa, 0xd4, 0x6a,
+ 0xdb, 0x9d, 0x01, 0x83, 0x94, 0x49, 0x88, 0xc3, 0xdf, 0xc7, 0x48, 0x54,
+ 0xd8, 0x7c, 0x76, 0xab, 0xde, 0x1e, 0x78, 0x33, 0xb5, 0xdb, 0x26, 0x13,
+ 0xde, 0xfc, 0xc3, 0x66, 0x22, 0x45, 0x10, 0xc4, 0xf0, 0x38, 0xdf, 0xa7,
+ 0xa7, 0xdd, 0x9e, 0xeb, 0xbe, 0xb4, 0x7d, 0x5f, 0xce, 0x92, 0x2e, 0xba,
+ 0xa7, 0x49, 0x9c, 0x0b, 0x58, 0x49, 0x22, 0x0b, 0xf5, 0x41, 0x5c, 0x31,
+ 0xdc, 0x22, 0xb1, 0x0e, 0x11, 0xa7, 0x3a, 0xce, 0x40, 0x20, 0x88, 0x43,
+ 0xe7, 0x5e, 0xe5, 0xb7, 0xc8, 0x51, 0x86, 0x43, 0x41, 0x22, 0x05, 0xdb,
+ 0x27, 0xf7, 0x3b, 0x37, 0xba, 0xb9, 0x2b, 0x1a, 0x5c, 0x54, 0xe6, 0x29,
+ 0xd3, 0xb2, 0x8a, 0xc1, 0x30, 0x70, 0xaf, 0x21, 0x8f, 0x76, 0x6b, 0x42,
+ 0x29, 0x78, 0xfe, 0xe4, 0x39, 0x84, 0x3b, 0xe5, 0xe5, 0x18, 0xea, 0xc2,
+ 0x33, 0x02, 0x4e, 0x4b, 0x31, 0x43, 0x9e, 0x73, 0x14, 0xd9, 0x44, 0xc6,
+ 0x91, 0x2e, 0xb2, 0x93, 0x6c, 0xce, 0x5d, 0x90, 0xc6, 0xde, 0x10, 0x6b,
+ 0x4b, 0xf8, 0xfa, 0x93, 0xde, 0x47, 0xac, 0x34, 0x98, 0x23, 0x48, 0x3f,
+ 0xba, 0x5a, 0xfb, 0xa4, 0xef, 0x5e, 0x0e, 0x9c, 0xba, 0x2a, 0x68, 0x18,
+ 0x4c, 0x0b, 0x16, 0xcd, 0xdf, 0xf0, 0xed, 0xac, 0xca, 0xeb, 0x8f, 0xc9,
+ 0xd6, 0xbf, 0x6f, 0xdb, 0x0e, 0xd4, 0x91, 0xf4, 0x62, 0x78, 0x80, 0xf3,
+ 0x62, 0x95, 0xb5, 0xfa, 0x92, 0xeb, 0x68, 0x17, 0x14, 0x9e, 0x00, 0x0a,
+ 0x6a, 0xac, 0x4a, 0x0c, 0xdd, 0x61, 0x97, 0x41, 0x4b, 0x13, 0xa9, 0xf0,
+ 0x17, 0x22, 0x08, 0x45, 0x26, 0x9d, 0x08, 0x01, 0xfe, 0x8a, 0x43, 0x56,
+ 0xd5, 0xaf, 0x51, 0xf2, 0xbe, 0xa0, 0xec, 0x34, 0x21, 0x4c, 0x11, 0x24,
+ 0x79, 0x61, 0x16, 0x62, 0xd6, 0x6a, 0x44, 0x49, 0x84, 0x4b, 0xfd, 0xb5,
+ 0xcd, 0x9c, 0x84, 0x8b, 0x76, 0xa2, 0x86, 0x74, 0xad, 0xb5, 0xeb, 0x8f,
+ 0xe5, 0x6b, 0xc9, 0x9b, 0xb0, 0xff, 0x17, 0xf7, 0x2f, 0xc2, 0x5d, 0x30,
+ 0xa7, 0x44, 0x63, 0x23, 0x2e, 0x9c, 0xcd, 0xe7, 0x43, 0x06, 0x88, 0x06,
+ 0x5c, 0x2e, 0xb4, 0x7f, 0x2e, 0xc0, 0xa5, 0xac, 0x2e, 0x35, 0x8d, 0x60,
+ 0x19, 0x05, 0xa2, 0x87, 0xea, 0x88, 0x09, 0x8d, 0x51, 0x91, 0x2c, 0xa4,
+ 0x3e, 0x49, 0xa3, 0x4d, 0xa8, 0x37, 0x73, 0xfe, 0x12, 0xda, 0x1c, 0x5e,
+ 0x52, 0x5f, 0xc7, 0x9e, 0x10, 0x72, 0x71, 0x7a, 0x75, 0x59, 0x2d, 0xb9,
+ 0x6b, 0x58, 0xac, 0xa5, 0x99, 0x6f, 0x5a, 0xf1, 0xa3, 0x7a, 0xba, 0x75,
+ 0xd6, 0xf0, 0x64, 0xf8, 0xdd, 0xa3, 0xd7, 0xad, 0x0e, 0xc4, 0xd8, 0x0a,
+ 0x18, 0x87, 0xf1, 0xe1, 0x5c, 0xff, 0x63, 0x5c, 0x58, 0x27, 0x58, 0xec,
+ 0x50, 0xce, 0x02, 0x99, 0x28, 0xae, 0x2f, 0xfd, 0x2e, 0x3e, 0x9c, 0x8c,
+ 0xc2, 0xaa, 0x2c, 0x8f, 0xa1, 0x03, 0x13, 0xa9, 0x68, 0x7f, 0x6c, 0x10,
+ 0xc3, 0x65, 0x56, 0xd9, 0xcf, 0x84, 0x99, 0x83, 0x57, 0x8b, 0x72, 0x86,
+ 0x42, 0xa7, 0xec, 0xfe, 0xbd, 0xc0, 0x93, 0xee, 0xe2, 0x48, 0x8d, 0x58,
+ 0x6d, 0xe1, 0x22, 0xcd, 0xe2, 0x68, 0x9c, 0x09, 0xe2, 0xea, 0xbc, 0x33,
+ 0xf1, 0xe1, 0xdc, 0x52, 0xb5, 0x8b, 0x9f, 0xbc, 0xe9, 0x2f, 0xa1, 0x48,
+ 0xca, 0x69, 0xe3, 0xad, 0x00, 0x0f, 0xc4, 0x87, 0x63, 0xce, 0x1b, 0x59,
+ 0x19, 0xaa, 0x86, 0xc8, 0xe4, 0x5c, 0xbf, 0x32, 0x7e, 0x30, 0x38, 0x64,
+ 0xf3, 0x43, 0x87, 0xab, 0xd9, 0x3a, 0xe1, 0xfe, 0x95, 0xc5, 0x4e, 0x98,
+ 0x66, 0xd0, 0x3d, 0x60, 0x6e, 0x24, 0x44, 0x78, 0xbf, 0x78, 0x7c, 0x18,
+ 0x1f, 0xce, 0x9e, 0xb0, 0x00, 0xf9, 0xae, 0x39, 0x60, 0xf9, 0x4a, 0xb0,
+ 0x0b, 0x73, 0xc3, 0x22, 0x8d, 0x0a, 0x3c, 0xcd, 0x3e, 0x70, 0x3b, 0xcd,
+ 0xb4, 0xba, 0xcc, 0x9a, 0x0f, 0xeb, 0x37, 0x64, 0x2e, 0x85, 0xfa, 0x77,
+ 0x0b, 0x6a, 0xc3, 0x6b, 0x99, 0x85, 0x60, 0x67, 0xa6, 0x52, 0xb8, 0x6e,
+ 0x34, 0x40, 0xfa, 0x3d, 0x1b, 0x3c, 0x3d, 0x64, 0xef, 0xbe, 0x97, 0x28,
+ 0x4a, 0x8b, 0x91, 0xa7, 0x79, 0xa1, 0xf8, 0x28, 0xc2, 0x63, 0xbc, 0x29,
+ 0x26, 0x31, 0x50, 0x9f, 0x75, 0xf1, 0xac, 0xc5, 0x47, 0xd4, 0x1d, 0x59,
+ 0x2d, 0xe1, 0x43, 0xa4, 0xf1, 0x81, 0x4f, 0xc7, 0xfc, 0xb8, 0x1e, 0x37,
+ 0xaf, 0x49, 0x0a, 0xeb, 0x6c, 0xb7, 0x46, 0xff, 0xa4, 0x93, 0x10, 0xb1,
+ 0xc8, 0x93, 0x98, 0xfa, 0x41, 0x7b, 0x23, 0xbb, 0xb3, 0x5b, 0xde, 0xcc,
+ 0x2c, 0x46, 0x8a, 0xf9, 0xab, 0x7e, 0x57, 0x65, 0x3f, 0x01, 0xe3, 0x6b,
+ 0x3b, 0x54, 0x64, 0xf5, 0xf0, 0x60, 0x17, 0x8a, 0xee, 0xdb, 0xfb, 0xe9,
+ 0xa2, 0x09, 0x15, 0xa4, 0xe0, 0xe3, 0x55, 0xc6, 0xc9, 0xa0, 0xb4, 0xbd,
+ 0x72, 0x18, 0xfd, 0x5b, 0x23, 0x4f, 0xbb, 0x29, 0x32, 0x77, 0xf7, 0x5b,
+ 0xb7, 0x87, 0x5b, 0xd4, 0xcf, 0xee, 0xe4, 0xab, 0x9d, 0xeb, 0x30, 0xcb,
+ 0xe0, 0xb5, 0x15, 0x42, 0x40, 0x16, 0x13, 0x0f, 0xa4, 0x5c, 0x6f, 0x1d,
+ 0x19, 0xf5, 0xee, 0x71, 0xb5, 0xb8, 0xe7, 0x8a, 0x9b, 0x07, 0xdc, 0xaa,
+ 0x18, 0xe2, 0xc1, 0xae, 0x2a, 0xb8, 0x97, 0x72, 0x89, 0x7b, 0x76, 0xbe,
+ 0x6f, 0x06, 0x2d, 0x1a, 0x5c, 0x37, 0x13, 0x9f, 0xfa, 0xfc, 0xc9, 0xb8,
+ 0xad, 0x35, 0xba, 0x5e, 0x83, 0x3f, 0xec, 0xcc, 0xe2, 0xc3, 0x59, 0xf2,
+ 0xd4, 0xf7, 0x64, 0x7b, 0x06, 0x9e, 0x73, 0x93, 0xbb, 0x24, 0x18, 0xbb,
+ 0x32, 0xa4, 0x0d, 0xbd, 0xde, 0xbf, 0x88, 0x3d, 0xc0, 0x80, 0x9f, 0x17,
+ 0xbe, 0xc9, 0x8e, 0x2f, 0x1a, 0xc9, 0xbb, 0xa6, 0xbe, 0xc3, 0x0b, 0x69,
+ 0xdb, 0x03, 0xe7, 0x56, 0x9b, 0x14, 0x98, 0xa5, 0x2c, 0x35, 0xca, 0xde,
+ 0xa4, 0x26, 0x3b, 0xa2, 0xc5, 0x12, 0x12, 0xd9, 0x0c, 0xed, 0x0b, 0xc2,
+ 0x64, 0x72, 0xfe, 0x24, 0xa7, 0x32, 0xd1, 0xa6, 0x52, 0x68, 0x51, 0x94,
+ 0x10, 0x6d, 0xe4, 0x59, 0x67, 0x62, 0x46, 0xe8, 0xe3, 0x09, 0x77, 0x44,
+ 0x08, 0x1b, 0x98, 0x76, 0xb2, 0xca, 0xa0, 0x7e, 0x74, 0xa0, 0x84, 0xb3,
+ 0xcb, 0x99, 0xdf, 0x0d, 0xd8, 0x5b, 0x7e, 0x35, 0xe0, 0x2d, 0xb8, 0x34,
+ 0x8b, 0xa7, 0x3f, 0xa2, 0x95, 0x13, 0x89, 0x5a, 0x9a, 0x54, 0xba, 0xbf,
+ 0x9d, 0x9c, 0x49, 0xec, 0x13, 0x3a, 0xdd, 0x9d, 0xb9, 0xf7, 0x3c, 0xc0,
+ 0x56, 0x3e, 0x32, 0xc2, 0x90, 0x33, 0xe5, 0xa1, 0x20, 0x01, 0x6d, 0x3c,
+ 0x16, 0x49, 0xde, 0x96, 0x88, 0x29, 0xbb, 0xcb, 0x76, 0xf6, 0x46, 0x7b,
+ 0x03, 0xee, 0x0a, 0x5b, 0x89, 0xb2, 0xa8, 0xf9, 0x70, 0x30, 0x54, 0x53,
+ 0x0b, 0x73, 0x8c, 0x4f, 0x77, 0x1d, 0x11, 0x67, 0xf8, 0x70, 0x1d, 0xba,
+ 0x8d, 0xc9, 0xf7, 0xec, 0x2c, 0x9a, 0x9b, 0xf4, 0x2e, 0x54, 0xd3, 0x77,
+ 0x87, 0x8f, 0x9f, 0x3f, 0x6f, 0xc9, 0xf3, 0xda, 0xc3, 0x88, 0x7e, 0xb2,
+ 0xbb, 0x4b, 0x6b, 0x0b, 0x0a, 0x85, 0xcd, 0x2f, 0x86, 0xcf, 0xe9, 0xc5,
+ 0xf6, 0x6b, 0x75, 0x66, 0x8e, 0x60, 0xd6, 0xff, 0xde, 0x10, 0xbf, 0x89,
+ 0x7c, 0x8e, 0x1c, 0x2e, 0xbd, 0x6f, 0x3d, 0xc7, 0xe7, 0x22, 0x6f, 0xd1,
+ 0xc3, 0xbc, 0x8f, 0xe5, 0xc5, 0x05, 0x5c, 0x5d, 0x78, 0x52, 0x21, 0x5f,
+ 0x6e, 0xd2, 0x6a, 0x16, 0x2e, 0x77, 0x77, 0x30, 0xdc, 0xeb, 0x5b, 0x2e,
+ 0x85, 0x9b, 0x29, 0x2b, 0x0c, 0xe7, 0x09, 0x4b, 0xd2, 0x98, 0x11, 0x5c,
+ 0x35, 0xd3, 0x1d, 0x68, 0xcf, 0xcc, 0x68, 0xef, 0xf9, 0xf3, 0x01, 0x66,
+ 0xf6, 0xe4, 0xf9, 0xf3, 0xde, 0x2a, 0x69, 0xef, 0x33, 0x37, 0xa5, 0xf3,
+ 0x4f, 0xe1, 0x75, 0x47, 0x34, 0x35, 0xac, 0x95, 0xf8, 0x77, 0xf0, 0x9b,
+ 0xe4, 0xcb, 0xe4, 0xdd, 0xc9, 0xf9, 0xa1, 0xe7, 0xba, 0xa1, 0xfb, 0xc5,
+ 0x31, 0x45, 0x0f, 0x82, 0x96, 0x82, 0xb4, 0x4b, 0xea, 0x53, 0x44, 0xa6,
+ 0xb1, 0x31, 0xb5, 0x42, 0x6b, 0x93, 0x2a, 0x38, 0xd4, 0x69, 0xf8, 0x6f,
+ 0x61, 0xca, 0x04, 0xb9, 0xb0, 0x2f, 0xf3, 0xc6, 0x47, 0x04, 0xda, 0x32,
+ 0x87, 0xbd, 0x4d, 0x2e, 0x10, 0xce, 0xfc, 0x92, 0x68, 0xcb, 0x66, 0x8d,
+ 0x92, 0x07, 0xce, 0x0e, 0xc5, 0x3f, 0xca, 0xe5, 0x66, 0x50, 0x75, 0x90,
+ 0xcd, 0xe1, 0x37, 0x10, 0x49, 0xc8, 0x2f, 0x0c, 0xe9, 0x49, 0xb9, 0x2e,
+ 0x64, 0xd0, 0x72, 0x0f, 0xe4, 0x94, 0x00, 0x13, 0xfd, 0x8f, 0x47, 0x02,
+ 0x2e, 0xe4, 0xef, 0xa2, 0x4c, 0x0d, 0x2d, 0x57, 0xc2, 0x30, 0x3e, 0x12,
+ 0xef, 0x66, 0xed, 0x7c, 0xa2, 0xd6, 0x7d, 0x57, 0xe0, 0x1c, 0x02, 0xa8,
+ 0x3b, 0xf6, 0xf2, 0xcf, 0xb2, 0xa5, 0xe6, 0x59, 0x16, 0xed, 0x71, 0x0c,
+ 0x2d, 0x5f, 0xe4, 0x97, 0xab, 0x2a, 0x9e, 0x93, 0x48, 0xfd, 0xb0, 0x24,
+ 0x15, 0x42, 0x11, 0xd1, 0xd3, 0x9b, 0xb4, 0xca, 0xb4, 0x81, 0x57, 0x71,
+ 0x67, 0xef, 0xb6, 0x9a, 0xc9, 0x5a, 0x24, 0x03, 0xb8, 0xfa, 0xc0, 0xd4,
+ 0x46, 0x5d, 0x93, 0xd1, 0x63, 0xe0, 0x44, 0x90, 0x14, 0x1e, 0x81, 0x65,
+ 0x4f, 0x1b, 0x57, 0xa6, 0x24, 0x1e, 0x46, 0x1c, 0xf6, 0x25, 0xf5, 0x8b,
+ 0x4d, 0x64, 0x0b, 0xc2, 0x4c, 0xc0, 0xcd, 0xb9, 0x73, 0xee, 0xe3, 0x59,
+ 0x72, 0xc7, 0x5c, 0x95, 0x5e, 0x0b, 0x84, 0x10, 0xc9, 0x00, 0x9c, 0x87,
+ 0xce, 0x93, 0x99, 0x10, 0x1f, 0x92, 0x79, 0xfe, 0xa6, 0x98, 0x97, 0xe9,
+ 0xac, 0x96, 0xe6, 0xec, 0x12, 0x71, 0xa7, 0xcd, 0x62, 0x34, 0x2b, 0x39,
+ 0xda, 0x20, 0xed, 0x03, 0x27, 0xcd, 0x67, 0x9c, 0x6c, 0x69, 0x23, 0x71,
+ 0xa5, 0x50, 0xcf, 0x4b, 0xc2, 0x5c, 0x0a, 0x94, 0xc2, 0xa8, 0x11, 0xe8,
+ 0xf7, 0x1c, 0x9a, 0xbd, 0xa0, 0x77, 0x3e, 0x2d, 0x8b, 0xe1, 0x4f, 0xfd,
+ 0x00, 0x21, 0x24, 0x31, 0x5d, 0x15, 0xc8, 0xe3, 0xa3, 0xff, 0xeb, 0xf0,
+ 0x53, 0x86, 0xa5, 0xaa, 0xf4, 0xc6, 0x56, 0xd3, 0xfd, 0xc0, 0x58, 0x88,
+ 0x12, 0x2e, 0xb2, 0xf0, 0x0d, 0xe9, 0x5c, 0x6c, 0x78, 0x34, 0x4e, 0x27,
+ 0xe9, 0x41, 0x81, 0x47, 0x69, 0xf7, 0x69, 0x08, 0x2b, 0xa4, 0x6d, 0x14,
+ 0xbd, 0x39, 0x50, 0x2c, 0x4e, 0xd0, 0xa6, 0x32, 0x28, 0x76, 0x12, 0xf2,
+ 0x39, 0x72, 0xcf, 0x76, 0x32, 0xed, 0xe1, 0x0d, 0x66, 0xa4, 0xa2, 0x48,
+ 0x27, 0x3f, 0x02, 0xdb, 0xc3, 0xa4, 0xcc, 0x5c, 0xef, 0xe9, 0xb7, 0xe6,
+ 0x97, 0x9f, 0x67, 0x0c, 0x4d, 0x8f, 0x08, 0x56, 0x95, 0xbc, 0x78, 0x7f,
+ 0x76, 0xdc, 0x53, 0x43, 0x38, 0xa6, 0x33, 0xc0, 0x66, 0x6d, 0x9c, 0x65,
+ 0x04, 0x94, 0x55, 0x25, 0xa7, 0xe9, 0x65, 0xb6, 0xe1, 0x63, 0x93, 0xb5,
+ 0xc0, 0x09, 0xc5, 0x01, 0x11, 0xf3, 0x12, 0xf9, 0x2d, 0x05, 0xc0, 0xc4,
+ 0x5d, 0xdc, 0xd8, 0xaf, 0xfc, 0xbb, 0x98, 0xa7, 0xb2, 0x77, 0xab, 0x0a,
+ 0x11, 0x7f, 0xda, 0xf9, 0x48, 0x9b, 0x1c, 0xc5, 0x05, 0xe8, 0xa0, 0x4a,
+ 0x4a, 0xfb, 0x1f, 0xaa, 0x55, 0x4a, 0x97, 0xa0, 0xa1, 0x64, 0xe3, 0x0b,
+ 0xb8, 0xe8, 0x37, 0x74, 0x9a, 0xc3, 0x2c, 0x8c, 0xc2, 0xe9, 0x56, 0x20,
+ 0x72, 0xec, 0xbb, 0x93, 0x3a, 0xce, 0x7d, 0x8e, 0xb2, 0x70, 0xbc, 0x28,
+ 0x03, 0xd4, 0x6b, 0x4d, 0xc1, 0xe6, 0xa0, 0x0d, 0x12, 0xea, 0x39, 0x90,
+ 0x42, 0xc1, 0x10, 0x9f, 0xc8, 0x72, 0x4f, 0x8e, 0x65, 0x7e, 0x07, 0x12,
+ 0x8d, 0x61, 0x5d, 0x48, 0xa7, 0xd6, 0xca, 0x1c, 0x8a, 0x2d, 0x36, 0x9d,
+ 0xa3, 0xd9, 0x87, 0x75, 0x63, 0x61, 0x8d, 0xb3, 0x12, 0x0d, 0x22, 0x30,
+ 0xa5, 0xb4, 0xb0, 0x0e, 0xe7, 0xd6, 0xc9, 0x7e, 0x72, 0x14, 0x3d, 0x17,
+ 0x21, 0x7a, 0x39, 0x90, 0x0e, 0x36, 0x43, 0x43, 0x1d, 0x85, 0x14, 0x87,
+ 0x7b, 0xc7, 0xea, 0xd1, 0xde, 0x7f, 0x7a, 0x6d, 0x11, 0xbc, 0xc6, 0x06,
+ 0x3d, 0x60, 0xac, 0xde, 0x74, 0x1b, 0xaa, 0xdd, 0xa0, 0x23, 0x0c, 0x5a,
+ 0x2b, 0xb8, 0x32, 0x52, 0x11, 0x96, 0x51, 0xbf, 0xe2, 0xd0, 0x8b, 0x1c,
+ 0xbf, 0xe2, 0x7a, 0xc6, 0xe1, 0xeb, 0xdc, 0x08, 0x91, 0x3a, 0x97, 0x4e,
+ 0xd9, 0x46, 0x6f, 0xe4, 0x96, 0x3e, 0x7a, 0x11, 0xb9, 0xae, 0x75, 0x18,
+ 0x02, 0xc7, 0x4d, 0xa5, 0xd8, 0xc1, 0xbe, 0x62, 0x63, 0x3a, 0x86, 0x22,
+ 0xfa, 0x52, 0x71, 0x14, 0x44, 0xde, 0x6a, 0x0b, 0xa9, 0x73, 0x56, 0x48,
+ 0x7b, 0x6b, 0x41, 0xdb, 0x17, 0xcc, 0x0b, 0xa4, 0x7e, 0x44, 0x76, 0xc7,
+ 0x82, 0xe5, 0x50, 0x5e, 0x4d, 0x9d, 0xd8, 0x9c, 0x71, 0xe9, 0x30, 0x13,
+ 0x18, 0x9b, 0xb6, 0xb7, 0x2f, 0x67, 0x83, 0x74, 0xe3, 0x84, 0x66, 0x52,
+ 0xb6, 0xc9, 0x07, 0x07, 0x57, 0x18, 0xe0, 0x8d, 0xeb, 0x35, 0xa7, 0x66,
+ 0xd8, 0x51, 0x67, 0x09, 0xda, 0xa0, 0x24, 0x2e, 0x70, 0xef, 0x5a, 0x0b,
+ 0x6b, 0xae, 0x34, 0x3a, 0x2e, 0xc7, 0x84, 0xe0, 0x41, 0x51, 0x0a, 0xec,
+ 0x49, 0x2c, 0xc6, 0x4e, 0x09, 0x3e, 0x78, 0xc4, 0x97, 0x83, 0x9c, 0xd2,
+ 0x91, 0xfc, 0x7e, 0xe8, 0x9a, 0x44, 0x6c, 0xdd, 0x65, 0x46, 0xc3, 0x76,
+ 0x59, 0x21, 0x64, 0x48, 0x45, 0x4a, 0x22, 0x13, 0xee, 0x7c, 0x58, 0xb7,
+ 0x8a, 0x35, 0xc8, 0x08, 0xf1, 0x42, 0x8f, 0xbc, 0xe9, 0x46, 0x0b, 0xa0,
+ 0x4c, 0xcc, 0x22, 0xbb, 0x05, 0xbc, 0x74, 0xff, 0x70, 0xa1, 0x92, 0xfd,
+ 0xc3, 0xcb, 0xb3, 0x77, 0x47, 0xef, 0xbe, 0x39, 0x00, 0xf8, 0x59, 0x56,
+ 0x4d, 0xd1, 0xa4, 0x37, 0xf9, 0xcb, 0x6a, 0x96, 0x4f, 0x99, 0x53, 0x48,
+ 0xff, 0xd3, 0x56, 0xb9, 0x48, 0x26, 0x0e, 0x56, 0xc3, 0x5c, 0x82, 0xea,
+ 0x10, 0x49, 0xf6, 0x45, 0xb1, 0x4b, 0x55, 0x5e, 0xae, 0xec, 0xd6, 0x4f,
+ 0x49, 0x15, 0xa1, 0x38, 0x01, 0xc5, 0x4f, 0xc1, 0x8f, 0x98, 0x68, 0xcd,
+ 0xe8, 0x50, 0x14, 0x5e, 0x1f, 0x1f, 0x27, 0x21, 0x4a, 0x2c, 0x67, 0x98,
+ 0x0a, 0x7d, 0x71, 0x05, 0x2c, 0x0d, 0x64, 0x53, 0x52, 0x11, 0xee, 0x33,
+ 0xc2, 0x1f, 0xdc, 0xa6, 0xc5, 0xf5, 0x8c, 0xe9, 0xfa, 0x43, 0x98, 0xea,
+ 0x49, 0x79, 0xc8, 0x94, 0x3d, 0x48, 0x27, 0x9c, 0x57, 0x33, 0xb2, 0x85,
+ 0x0c, 0x93, 0x2c, 0x2f, 0x1a, 0xa8, 0x47, 0x2d, 0x49, 0xda, 0xee, 0x79,
+ 0xb2, 0x2e, 0x86, 0x70, 0xc5, 0x56, 0x4e, 0x0b, 0x4d, 0x84, 0x43, 0x96,
+ 0x94, 0xd3, 0x6a, 0xe8, 0x91, 0xf5, 0x42, 0xea, 0x93, 0x13, 0x8d, 0x9e,
+ 0xcd, 0xb2, 0xd4, 0x36, 0xfe, 0xad, 0xc1, 0x2d, 0x43, 0x76, 0x71, 0x93,
+ 0x55, 0x62, 0x7c, 0xda, 0xd2, 0x5a, 0xc3, 0xec, 0x46, 0xc9, 0xb8, 0x34,
+ 0xcf, 0x87, 0x1a, 0x96, 0xed, 0x26, 0xd7, 0x6a, 0x4c, 0xcd, 0x39, 0xb6,
+ 0x36, 0xf1, 0x8a, 0x1a, 0xed, 0x50, 0x50, 0xae, 0xbd, 0xde, 0x48, 0x2f,
+ 0x5b, 0xd0, 0xff, 0x24, 0xb3, 0x0a, 0xc5, 0x9d, 0xc6, 0x7e, 0x40, 0x21,
+ 0x1b, 0x43, 0xc3, 0x4e, 0x37, 0xa8, 0x49, 0x18, 0x3a, 0xec, 0x7a, 0x23,
+ 0xdd, 0xd3, 0x27, 0xd2, 0xcf, 0x63, 0xef, 0x2e, 0x38, 0xda, 0x7e, 0xcb,
+ 0x6b, 0x6b, 0x93, 0x8a, 0xdd, 0xe9, 0x79, 0x4e, 0xa5, 0x0b, 0x92, 0x8d,
+ 0xa6, 0x72, 0xe9, 0x5a, 0x06, 0x0d, 0x33, 0x88, 0x90, 0x9f, 0x30, 0xc2,
+ 0x97, 0x3c, 0xe4, 0x17, 0x8f, 0xfb, 0x2f, 0x8b, 0xb8, 0x19, 0x38, 0xe7,
+ 0x42, 0x4e, 0x38, 0x37, 0x4d, 0x50, 0xbc, 0x76, 0x31, 0xda, 0x8e, 0x26,
+ 0x4f, 0xf1, 0x1c, 0x44, 0x22, 0xd5, 0xe9, 0xb5, 0xcb, 0x08, 0xeb, 0x65,
+ 0x7c, 0xda, 0x41, 0xac, 0x2b, 0xa3, 0xe9, 0x40, 0xad, 0x57, 0x49, 0x87,
+ 0x4a, 0x13, 0x9b, 0xd8, 0xd3, 0x24, 0x7e, 0x2c, 0xb3, 0x55, 0xa8, 0x1f,
+ 0x0e, 0x27, 0x65, 0x50, 0x12, 0xad, 0xea, 0x65, 0xc2, 0x12, 0xb9, 0xc9,
+ 0x8b, 0xeb, 0x92, 0x7e, 0x23, 0xd1, 0xa6, 0x48, 0x0e, 0x8b, 0x03, 0x65,
+ 0x8c, 0x6d, 0x84, 0xbf, 0xab, 0xea, 0xa0, 0xd1, 0x32, 0x03, 0xb3, 0x16,
+ 0xae, 0x97, 0xf3, 0xfb, 0x8b, 0xb8, 0x96, 0x22, 0x5d, 0x52, 0xe0, 0xcb,
+ 0x04, 0xe2, 0x1d, 0x24, 0xda, 0x2e, 0xd9, 0xbc, 0x38, 0xaf, 0x33, 0x69,
+ 0xe1, 0xca, 0x75, 0x72, 0x2a, 0x70, 0x44, 0xde, 0xe4, 0xd6, 0xf7, 0xd3,
+ 0x2f, 0x49, 0x6c, 0xef, 0x36, 0xbb, 0xd7, 0xce, 0x7e, 0x45, 0x80, 0x99,
+ 0x93, 0x35, 0x71, 0x83, 0xa7, 0x57, 0x65, 0x29, 0xc9, 0x5d, 0x7d, 0xcc,
+ 0x36, 0x21, 0x95, 0x86, 0x60, 0x22, 0x7a, 0xf4, 0x07, 0x8b, 0xa9, 0xe5,
+ 0x62, 0x90, 0x41, 0x06, 0xb0, 0x8f, 0xbf, 0xd7, 0x02, 0xbe, 0x6c, 0xcb,
+ 0x36, 0x9e, 0x8f, 0x15, 0xce, 0xc2, 0x5c, 0x43, 0x50, 0x40, 0xe2, 0x02,
+ 0x2c, 0xba, 0xe3, 0xdb, 0x23, 0xa9, 0x97, 0xfe, 0xa6, 0x44, 0x85, 0x1d,
+ 0x67, 0xa8, 0xb9, 0xbc, 0x45, 0xa2, 0x1a, 0x32, 0x9b, 0x8a, 0x76, 0x40,
+ 0x83, 0x66, 0x9a, 0x37, 0xc4, 0x40, 0x7e, 0xbf, 0xbf, 0xdb, 0xc7, 0xe4,
+ 0x31, 0x90, 0x16, 0x7e, 0xe2, 0x36, 0xd6, 0xd6, 0xfe, 0x22, 0x31, 0xe8,
+ 0xea, 0x06, 0x20, 0x43, 0x56, 0x4b, 0xf8, 0xe9, 0x86, 0xa0, 0x97, 0xb4,
+ 0xee, 0xdb, 0xff, 0xb8, 0x55, 0xfc, 0x6b, 0x1b, 0xbb, 0xf5, 0xf4, 0x75,
+ 0x73, 0xfc, 0xeb, 0xcc, 0x3b, 0x63, 0x0c, 0x14, 0xcb, 0x40, 0x53, 0x5e,
+ 0xa2, 0x7e, 0x12, 0x4f, 0x69, 0x77, 0x3a, 0x03, 0xd9, 0xf5, 0xd4, 0xc0,
+ 0x4b, 0xf1, 0x22, 0xf3, 0x90, 0x25, 0x1b, 0x9b, 0x76, 0xb1, 0x4c, 0x22,
+ 0x2c, 0x6b, 0xa0, 0x37, 0x40, 0xf3, 0x58, 0x6c, 0x12, 0x2d, 0x7f, 0x8d,
+ 0x34, 0xe5, 0x32, 0x84, 0x24, 0x11, 0x46, 0xca, 0xc6, 0x78, 0x2a, 0xe9,
+ 0x9c, 0xb4, 0x21, 0xf8, 0x52, 0x5b, 0x30, 0x52, 0x5a, 0xda, 0x30, 0xea,
+ 0xed, 0x8f, 0x36, 0x24, 0x10, 0x8c, 0x33, 0x1f, 0x65, 0x7d, 0x83, 0xdf,
+ 0xde, 0x48, 0xb6, 0xc0, 0x55, 0xb7, 0xad, 0xf2, 0x1a, 0x16, 0x05, 0x6b,
+ 0xdf, 0x0f, 0xb6, 0x61, 0x52, 0x96, 0x90, 0xdd, 0xec, 0x5a, 0xe8, 0xaf,
+ 0xc6, 0xca, 0xab, 0x8c, 0xfc, 0x5f, 0xcd, 0xd3, 0x6a, 0x4e, 0x67, 0x7c,
+ 0xb1, 0x9a, 0xc7, 0xcc, 0x1c, 0xdc, 0x6d, 0x09, 0x0e, 0xe5, 0x75, 0xbd,
+ 0x12, 0x23, 0xd0, 0xa2, 0xae, 0x58, 0x18, 0xbe, 0x64, 0x6e, 0xe6, 0x43,
+ 0x9f, 0xae, 0xe7, 0x48, 0x3d, 0xe9, 0x55, 0x4f, 0xc8, 0x3b, 0x2c, 0x8a,
+ 0xaf, 0x6d, 0x82, 0xc7, 0x76, 0x94, 0x9c, 0xce, 0x25, 0x26, 0xa5, 0x4d,
+ 0xbf, 0xb0, 0x09, 0x03, 0x92, 0x55, 0x9d, 0xe1, 0x36, 0x4e, 0x4e, 0xcf,
+ 0x8f, 0x4e, 0xde, 0x8d, 0x93, 0x7f, 0xdf, 0x58, 0x5b, 0xff, 0xd5, 0xc6,
+ 0xec, 0xfd, 0x71, 0xe0, 0xce, 0x24, 0x79, 0x21, 0x7e, 0x86, 0x3e, 0xdb,
+ 0xd8, 0x53, 0xe2, 0xa7, 0x46, 0x7a, 0x1b, 0xfe, 0xaa, 0x6f, 0x0a, 0xde,
+ 0x99, 0x9c, 0x56, 0x07, 0xa2, 0x2d, 0xd0, 0x96, 0x2d, 0xc6, 0x5d, 0xd7,
+ 0x88, 0x66, 0x66, 0xef, 0x6c, 0x96, 0xce, 0xf0, 0x71, 0x0e, 0x2c, 0x9c,
+ 0xaf, 0x95, 0xeb, 0x29, 0x2f, 0xd0, 0x16, 0xdf, 0x90, 0x5a, 0xca, 0x16,
+ 0xf4, 0x96, 0x34, 0x2e, 0x15, 0x45, 0xab, 0x8e, 0xa4, 0x10, 0x7e, 0x73,
+ 0x78, 0x0e, 0x27, 0x0d, 0x95, 0x7e, 0xba, 0x09, 0x92, 0xab, 0x4b, 0x14,
+ 0x9f, 0xd4, 0x2a, 0x67, 0x5a, 0xf1, 0x49, 0x5d, 0xcf, 0x6f, 0x97, 0xf3,
+ 0xb4, 0x88, 0xd6, 0xb8, 0x19, 0x8d, 0x16, 0x8d, 0xdc, 0x4b, 0x87, 0x87,
+ 0xaa, 0xbe, 0x13, 0xaf, 0x65, 0x06, 0x63, 0x15, 0x9d, 0xbe, 0x3f, 0x17,
+ 0x3f, 0xd5, 0xeb, 0xc3, 0xe3, 0xc3, 0xf3, 0xc3, 0xae, 0xe5, 0x3e, 0x61,
+ 0x84, 0x47, 0xaa, 0x85, 0x69, 0xb2, 0xe9, 0x55, 0x51, 0xce, 0xcb, 0xcb,
+ 0x5c, 0x9a, 0x59, 0x26, 0x3f, 0x64, 0x93, 0xd7, 0x2f, 0xbf, 0x87, 0x3e,
+ 0x01, 0x9f, 0xd3, 0xe9, 0xd9, 0xc9, 0xe9, 0x9b, 0xa3, 0x77, 0xaf, 0x07,
+ 0xc9, 0xab, 0x93, 0xd3, 0x3f, 0x0d, 0x92, 0xb7, 0x27, 0xdf, 0x1f, 0x46,
+ 0x72, 0xa0, 0x81, 0xbc, 0x1e, 0x50, 0x8c, 0x6d, 0x2c, 0xe7, 0x0c, 0xef,
+ 0x82, 0x43, 0x16, 0x9e, 0x10, 0x79, 0x49, 0x59, 0x23, 0x68, 0xba, 0xcc,
+ 0x77, 0xcd, 0x6c, 0x9d, 0x91, 0xa1, 0xdf, 0x1e, 0xbe, 0x7c, 0x3d, 0x08,
+ 0xb0, 0xb1, 0xd1, 0xa5, 0xc3, 0x7c, 0x0c, 0xeb, 0xb3, 0x8b, 0x26, 0x44,
+ 0x65, 0xb6, 0x3e, 0x48, 0x43, 0xe0, 0x20, 0x17, 0xdf, 0x58, 0x43, 0xb0,
+ 0x54, 0xba, 0x3e, 0xeb, 0xcb, 0x9c, 0x10, 0x98, 0xf7, 0xde, 0xf6, 0xb1,
+ 0x5e, 0x47, 0x5f, 0x28, 0x6b, 0xbe, 0x9a, 0x2d, 0x08, 0x46, 0x94, 0x77,
+ 0xaf, 0x55, 0x5a, 0xcc, 0x21, 0x38, 0xbb, 0xba, 0x07, 0x46, 0x67, 0xd0,
+ 0xaa, 0x9f, 0x27, 0x7e, 0xc4, 0xae, 0xc7, 0x54, 0xfa, 0xef, 0x51, 0x3f,
+ 0x1c, 0xe4, 0xfe, 0x8c, 0x19, 0x3f, 0x5a, 0xa0, 0x53, 0xd7, 0x6b, 0xd8,
+ 0x82, 0xd1, 0x2d, 0x58, 0x46, 0xd8, 0x3c, 0xdd, 0xa0, 0x81, 0xb6, 0x22,
+ 0xf9, 0x91, 0x7f, 0x2c, 0x69, 0x3a, 0x91, 0xcc, 0xee, 0xd5, 0x85, 0x21,
+ 0xcb, 0x8c, 0x73, 0xaa, 0xf8, 0x98, 0xac, 0x5b, 0x20, 0x19, 0x1e, 0xa9,
+ 0x53, 0x62, 0x9d, 0x82, 0xa5, 0x37, 0x46, 0x1d, 0x33, 0x0c, 0xa0, 0xa4,
+ 0x3e, 0xab, 0x36, 0x9b, 0xf0, 0x3d, 0x24, 0x58, 0x67, 0x44, 0xdf, 0xd7,
+ 0x23, 0x56, 0x88, 0x1f, 0xf1, 0xe0, 0xf8, 0x9b, 0x42, 0x75, 0x43, 0x81,
+ 0x2f, 0xcb, 0x08, 0xd8, 0x40, 0xb8, 0xd0, 0x93, 0x86, 0x95, 0x14, 0xe2,
+ 0x11, 0x4d, 0x10, 0x7a, 0x1b, 0xb2, 0x2d, 0xed, 0xa7, 0x05, 0x2b, 0xf7,
+ 0x14, 0xdd, 0x54, 0xe6, 0x10, 0x6f, 0x77, 0xee, 0xfa, 0x21, 0xfa, 0xbe,
+ 0xbc, 0x47, 0xbb, 0xb7, 0xce, 0xc7, 0x0e, 0x6d, 0xa2, 0x4e, 0x86, 0x02,
+ 0x53, 0x4d, 0xd5, 0x7d, 0xc1, 0xd6, 0x6d, 0xbd, 0xe9, 0x61, 0x8c, 0xbe,
+ 0xd7, 0xd6, 0x56, 0xb9, 0x5b, 0x16, 0x75, 0x7c, 0x64, 0xae, 0x43, 0x04,
+ 0x2f, 0x66, 0x56, 0x52, 0x53, 0x5c, 0x4a, 0x47, 0x20, 0xbd, 0x8a, 0x76,
+ 0xdf, 0x8c, 0x15, 0x7e, 0x18, 0x4d, 0xa2, 0xa3, 0x5f, 0xa6, 0xee, 0xd1,
+ 0xf7, 0x7c, 0x3a, 0x38, 0xb3, 0xb3, 0xc3, 0xf3, 0xb3, 0x51, 0xb2, 0xe5,
+ 0x03, 0xa1, 0x3e, 0x1d, 0xed, 0x86, 0x41, 0x1b, 0x34, 0xa8, 0x8e, 0x7e,
+ 0x95, 0x3a, 0x57, 0xf7, 0x7c, 0x95, 0x78, 0x03, 0xbe, 0x1b, 0x26, 0x1a,
+ 0x7b, 0xf0, 0x47, 0xbb, 0xb1, 0xef, 0xf9, 0x4d, 0xb0, 0x5b, 0xdf, 0xc3,
+ 0x2f, 0xd6, 0xac, 0xf2, 0xdb, 0xc3, 0xe3, 0x48, 0xdb, 0x98, 0xef, 0xcf,
+ 0xde, 0xfc, 0xa9, 0xbd, 0xca, 0x47, 0x8f, 0x23, 0x5f, 0xfd, 0x2d, 0x1d,
+ 0xea, 0x59, 0x5d, 0xce, 0x8d, 0xc2, 0x42, 0x65, 0x1e, 0x54, 0xe5, 0x71,
+ 0x60, 0x44, 0x00, 0x92, 0xd1, 0xff, 0x3c, 0x90, 0xbf, 0xfc, 0x3c, 0x1a,
+ 0x8d, 0xfe, 0x18, 0x62, 0x79, 0x93, 0x8f, 0xc6, 0x2e, 0x57, 0x9e, 0xed,
+ 0x5a, 0xe0, 0x54, 0x55, 0x43, 0x65, 0x44, 0x88, 0x5a, 0x2c, 0xd3, 0xbc,
+ 0xa2, 0x76, 0x33, 0x51, 0x81, 0x8b, 0x25, 0xb9, 0x52, 0x30, 0xab, 0xcd,
+ 0x09, 0x4c, 0x16, 0x5f, 0xd7, 0xad, 0x7a, 0x5b, 0xea, 0xae, 0xbd, 0x8e,
+ 0xde, 0xb3, 0xc0, 0x11, 0xc2, 0x2d, 0x3f, 0xf0, 0xd9, 0x0a, 0xfe, 0x59,
+ 0xb6, 0x75, 0x9c, 0xac, 0x2d, 0x54, 0x76, 0xc8, 0xea, 0x67, 0x76, 0xfa,
+ 0x51, 0xef, 0x85, 0x14, 0x52, 0xbe, 0x92, 0x90, 0x3a, 0x39, 0x92, 0x53,
+ 0x12, 0x2b, 0xd4, 0x12, 0x35, 0x6b, 0xa6, 0x3b, 0x58, 0x67, 0xdd, 0xd2,
+ 0x00, 0xad, 0x0a, 0x17, 0x38, 0x91, 0xfc, 0x84, 0x47, 0x2a, 0xb1, 0xe5,
+ 0xe4, 0x16, 0xaf, 0x66, 0xc1, 0x55, 0xf9, 0x7a, 0x9a, 0x3a, 0xeb, 0x07,
+ 0x21, 0x37, 0x6b, 0x35, 0xdb, 0xf1, 0x1b, 0x43, 0x68, 0x17, 0x85, 0x80,
+ 0x1d, 0x7a, 0xa5, 0x6c, 0xa1, 0xda, 0x4f, 0xdc, 0x59, 0x29, 0x09, 0x89,
+ 0x14, 0x04, 0xc9, 0x7d, 0xd1, 0x92, 0x08, 0xea, 0xa1, 0xf3, 0x0f, 0x5d,
+ 0xdb, 0x3a, 0x47, 0x80, 0x8d, 0x04, 0x5e, 0x5b, 0x8d, 0x78, 0xac, 0x34,
+ 0x94, 0x87, 0x5f, 0xdb, 0x84, 0x0d, 0xaa, 0x43, 0xdf, 0xfc, 0xf7, 0x4d,
+ 0x28, 0xc2, 0xf4, 0x7a, 0xb4, 0xfa, 0x5d, 0x09, 0x17, 0x86, 0x0d, 0x9e,
+ 0x8a, 0xe8, 0x0d, 0x76, 0x53, 0x2c, 0xf1, 0x29, 0x2f, 0xf5, 0x89, 0x87,
+ 0x96, 0x30, 0x4a, 0x7e, 0xc8, 0xe7, 0xb3, 0x69, 0x5a, 0x51, 0x7a, 0x58,
+ 0x28, 0x5e, 0x85, 0x4c, 0xf8, 0x3e, 0xd5, 0x25, 0x7d, 0xd5, 0x5d, 0x1e,
+ 0xed, 0x53, 0x12, 0xa7, 0xfa, 0x48, 0x55, 0x90, 0x3d, 0x0c, 0x04, 0xbf,
+ 0x7b, 0xfa, 0x41, 0x09, 0xf9, 0xe8, 0x1e, 0x43, 0xd4, 0xb5, 0x9b, 0x43,
+ 0xb4, 0xcf, 0x55, 0xe3, 0x10, 0xc3, 0xc7, 0x61, 0x2c, 0x25, 0x5f, 0x5e,
+ 0x3f, 0x26, 0xf7, 0xd5, 0xd3, 0x01, 0xff, 0xeb, 0x29, 0x03, 0x17, 0x36,
+ 0xed, 0xc8, 0x0a, 0xdb, 0x31, 0xac, 0xf5, 0x1f, 0x9d, 0x6a, 0x09, 0x6c,
+ 0xd0, 0xd3, 0xc0, 0x03, 0xea, 0xe6, 0x59, 0x6a, 0x65, 0x9b, 0x79, 0x47,
+ 0x67, 0x8b, 0x1d, 0x31, 0xfc, 0xeb, 0xcf, 0x93, 0x0a, 0x5d, 0x31, 0x9b,
+ 0xfa, 0xe7, 0x75, 0x05, 0xc7, 0x46, 0xe7, 0x7f, 0x36, 0x0a, 0x0b, 0xbb,
+ 0xe2, 0x1f, 0xb2, 0x59, 0xcc, 0xee, 0x6b, 0xa8, 0x00, 0xa0, 0xb0, 0x1d,
+ 0xb2, 0x7e, 0xf0, 0x9d, 0x35, 0x1f, 0x7a, 0x7e, 0xcf, 0x87, 0xf8, 0x48,
+ 0x2d, 0x18, 0xda, 0x8d, 0x52, 0x85, 0x5f, 0xc4, 0x6c, 0xc6, 0x79, 0xfa,
+ 0x78, 0xb4, 0xfb, 0xf0, 0xc4, 0x6b, 0x67, 0x7c, 0x33, 0x26, 0x1f, 0xff,
+ 0x84, 0xa8, 0x44, 0x52, 0xc4, 0xca, 0x3e, 0x9a, 0x5b, 0xdb, 0xcf, 0x01,
+ 0x58, 0x32, 0x2d, 0x5e, 0x6e, 0x36, 0x80, 0x6a, 0x88, 0x2a, 0x63, 0x1c,
+ 0xd6, 0xc1, 0x0e, 0x1c, 0x15, 0x1d, 0x77, 0x8b, 0xf0, 0x44, 0x04, 0x45,
+ 0xf9, 0xc7, 0xc0, 0x67, 0x50, 0x2e, 0x77, 0x88, 0x3a, 0xa7, 0xb3, 0xc3,
+ 0x37, 0xef, 0xc7, 0x87, 0xaf, 0x09, 0xdb, 0x20, 0x8d, 0xb5, 0xea, 0xc9,
+ 0xc9, 0x2d, 0x27, 0xbd, 0x67, 0x9a, 0xb2, 0xe4, 0x8c, 0x20, 0x99, 0x4b,
+ 0xd0, 0xce, 0x4e, 0x92, 0x8b, 0x8c, 0x65, 0x1c, 0x16, 0xa6, 0xb0, 0x1e,
+ 0x27, 0x2f, 0xfe, 0x02, 0x60, 0x12, 0x5e, 0xf5, 0x2c, 0x43, 0xdf, 0xa7,
+ 0x17, 0x9c, 0x05, 0x13, 0x20, 0x8d, 0xb9, 0x0e, 0x51, 0xf5, 0x3c, 0xcb,
+ 0x96, 0x52, 0x17, 0xb8, 0x28, 0x57, 0x05, 0xbb, 0x45, 0xcd, 0xd9, 0xa8,
+ 0x27, 0x90, 0x5d, 0xcf, 0x04, 0xaf, 0x70, 0xa7, 0x81, 0xc3, 0xb4, 0xa7,
+ 0x49, 0x11, 0x61, 0x8e, 0x25, 0x94, 0x7a, 0xee, 0x30, 0x05, 0xdc, 0xb6,
+ 0xf0, 0xae, 0x6c, 0xe5, 0x4d, 0xc7, 0x85, 0x1e, 0x34, 0x6c, 0x23, 0x97,
+ 0x3a, 0x7a, 0x26, 0x19, 0xbb, 0x88, 0x27, 0x93, 0xce, 0x2f, 0xcb, 0xca,
+ 0x8c, 0xb7, 0xb0, 0xa5, 0x8c, 0x8c, 0xf7, 0x50, 0x6f, 0x77, 0xdb, 0x3c,
+ 0x86, 0x45, 0xe1, 0x5c, 0x87, 0x41, 0x21, 0xf0, 0x8c, 0x2b, 0xbc, 0xc1,
+ 0x16, 0x78, 0x9f, 0xc8, 0x63, 0x82, 0xf0, 0x20, 0xcb, 0xb4, 0xb1, 0xd4,
+ 0x65, 0xd3, 0x7e, 0xf0, 0x16, 0x06, 0xe6, 0xe6, 0xdf, 0xb2, 0xaa, 0xec,
+ 0xba, 0x73, 0x54, 0x75, 0xd7, 0x70, 0x80, 0x3f, 0xf7, 0x7f, 0x65, 0xa3,
+ 0xb0, 0xbd, 0xfd, 0xd8, 0x0d, 0x58, 0xa4, 0xb7, 0xe4, 0xa2, 0xea, 0x25,
+ 0x07, 0x76, 0xd8, 0x62, 0x3b, 0xf0, 0x58, 0xc5, 0x2c, 0x9f, 0x18, 0xac,
+ 0x2b, 0x8d, 0xe1, 0xbc, 0x24, 0x7b, 0xd2, 0xe2, 0xc0, 0x22, 0xbb, 0x3b,
+ 0x0c, 0x3d, 0x52, 0x1a, 0xb7, 0xed, 0x96, 0x45, 0x7e, 0xc2, 0x14, 0xcb,
+ 0x84, 0x11, 0xb7, 0xc5, 0x5d, 0x8b, 0xe8, 0x7b, 0xdb, 0xf8, 0xf1, 0xbc,
+ 0x44, 0x94, 0x92, 0x89, 0x81, 0xbe, 0x1f, 0xe2, 0xd8, 0xc1, 0x48, 0xa8,
+ 0x40, 0x88, 0x6a, 0xd0, 0xb2, 0x4f, 0x98, 0x5a, 0xb0, 0x50, 0x35, 0x19,
+ 0x50, 0xbd, 0xd8, 0x03, 0x76, 0xe1, 0xc6, 0x91, 0x37, 0x83, 0x1c, 0x56,
+ 0x1e, 0x87, 0x15, 0x05, 0x1a, 0x62, 0xd0, 0x86, 0x1b, 0x96, 0xcd, 0xa6,
+ 0xf2, 0x4d, 0xaa, 0xef, 0xa1, 0x2e, 0x5d, 0x52, 0x44, 0x1f, 0x51, 0xd5,
+ 0x06, 0xda, 0xf6, 0x85, 0x6a, 0x9f, 0xb0, 0x1c, 0xb2, 0x33, 0xd3, 0xc2,
+ 0x9f, 0x2b, 0x1d, 0x80, 0x19, 0x23, 0x2f, 0x67, 0x54, 0x35, 0xc5, 0xed,
+ 0x63, 0xfa, 0xf0, 0x65, 0x64, 0x2e, 0x9b, 0xf0, 0x54, 0xde, 0xe6, 0x8b,
+ 0xd5, 0x82, 0xde, 0x1f, 0x70, 0x7d, 0xe4, 0x02, 0x52, 0x4b, 0x0f, 0x95,
+ 0xb2, 0x0b, 0x1b, 0xa5, 0xa8, 0x98, 0x33, 0x03, 0xbc, 0x8d, 0x88, 0xb6,
+ 0xe1, 0x8c, 0x1f, 0xbc, 0xc5, 0x7d, 0x27, 0xe8, 0xa0, 0xfe, 0xcb, 0xe9,
+ 0x33, 0x79, 0x61, 0x34, 0xba, 0x3f, 0x86, 0x93, 0x08, 0x59, 0x07, 0xd1,
+ 0x25, 0xf2, 0x9c, 0xb3, 0x99, 0x67, 0x45, 0x0a, 0xb9, 0x41, 0x55, 0x95,
+ 0x33, 0xea, 0xe7, 0x50, 0x02, 0x1c, 0x41, 0xf3, 0x15, 0x8a, 0xc7, 0x52,
+ 0x9d, 0xf3, 0x97, 0xc5, 0x92, 0xd0, 0xfd, 0x25, 0xe3, 0xdc, 0xad, 0x96,
+ 0x81, 0xcc, 0xb7, 0x7c, 0xc2, 0xaa, 0xa3, 0xe6, 0xf3, 0xbb, 0x92, 0x13,
+ 0x23, 0xb6, 0x2d, 0xfc, 0xe5, 0xb2, 0xc7, 0xd6, 0x8d, 0x25, 0x5d, 0x08,
+ 0xe2, 0x4d, 0x1b, 0x89, 0x97, 0x05, 0x42, 0x84, 0x15, 0x53, 0x86, 0x4b,
+ 0x3a, 0xc0, 0xa6, 0xf0, 0xf1, 0x0d, 0xb4, 0x54, 0xef, 0xf1, 0xed, 0x6d,
+ 0x40, 0xe1, 0x9e, 0x41, 0xcc, 0x20, 0x8c, 0x6c, 0x2d, 0x3f, 0xde, 0xa5,
+ 0x3a, 0xc8, 0x27, 0xb7, 0x1d, 0xa3, 0x79, 0x14, 0x45, 0x4c, 0xd4, 0xca,
+ 0xdd, 0x74, 0x52, 0x72, 0x08, 0x8e, 0x37, 0x2c, 0xf5, 0x36, 0x53, 0xa3,
+ 0x08, 0xd2, 0x54, 0xf4, 0x26, 0xc5, 0xe6, 0x96, 0x45, 0x98, 0xda, 0x40,
+ 0xb9, 0x98, 0x5e, 0x1b, 0x51, 0x0d, 0x94, 0x52, 0x3f, 0x3c, 0xa3, 0xfc,
+ 0x63, 0x33, 0x75, 0xaf, 0x74, 0xd0, 0x59, 0xb9, 0xe2, 0x40, 0x66, 0x16,
+ 0x44, 0xc6, 0x72, 0xde, 0x7d, 0x5c, 0x29, 0x23, 0xb2, 0xf2, 0x39, 0xde,
+ 0xe1, 0x7b, 0x5d, 0x27, 0x7b, 0xe6, 0x18, 0xf2, 0x62, 0xd5, 0x58, 0x04,
+ 0x3b, 0xfa, 0xa0, 0x52, 0x68, 0x74, 0xf7, 0xc1, 0xe7, 0xad, 0x60, 0x11,
+ 0x5e, 0x50, 0x7b, 0x01, 0x42, 0xbe, 0x27, 0xa4, 0x93, 0x8b, 0x83, 0xc7,
+ 0x97, 0xb2, 0x11, 0x57, 0x91, 0x8d, 0xc2, 0x4a, 0x85, 0x79, 0x76, 0x6b,
+ 0x36, 0x9b, 0x51, 0x96, 0x12, 0x2b, 0x1c, 0x9c, 0x50, 0x93, 0x0c, 0x61,
+ 0xee, 0x62, 0x10, 0xc9, 0xfc, 0x69, 0x31, 0x71, 0xdb, 0x7a, 0x8a, 0xf8,
+ 0x5c, 0xd9, 0xc8, 0x95, 0x64, 0xe0, 0x08, 0x09, 0x17, 0xff, 0x37, 0xb8,
+ 0xda, 0x75, 0x5a, 0xcf, 0x87, 0x79, 0x97, 0x97, 0x1f, 0x52, 0x36, 0xa1,
+ 0xcd, 0x05, 0xb2, 0x54, 0x68, 0x86, 0x18, 0xbf, 0x1c, 0x1f, 0x77, 0xc0,
+ 0xbe, 0xd6, 0xa2, 0x2f, 0xef, 0xb5, 0xd5, 0x9e, 0x4f, 0x05, 0x11, 0xc9,
+ 0x90, 0xbd, 0x7d, 0xbd, 0xe3, 0xea, 0x03, 0xfe, 0xba, 0x43, 0xa2, 0x0d,
+ 0x27, 0xc3, 0x10, 0x47, 0xa8, 0xda, 0xe0, 0x1e, 0x7f, 0x49, 0x04, 0x27,
+ 0x87, 0x9e, 0xd8, 0x91, 0x14, 0xa0, 0xfb, 0x22, 0xe9, 0x8c, 0x3b, 0xa9,
+ 0x2b, 0x1f, 0x43, 0x1a, 0xa0, 0x09, 0xe6, 0x30, 0x86, 0xe7, 0x63, 0xe3,
+ 0x50, 0xa2, 0x4f, 0xd6, 0xf4, 0x34, 0x12, 0x82, 0x1a, 0x11, 0x5b, 0x96,
+ 0x63, 0x61, 0x0c, 0x97, 0x57, 0x03, 0xf4, 0xf3, 0x10, 0x2b, 0x9d, 0x43,
+ 0xad, 0x17, 0xdc, 0x67, 0x50, 0x67, 0xe0, 0x8d, 0xd9, 0xe5, 0x93, 0xf4,
+ 0x43, 0xce, 0x1c, 0xff, 0xeb, 0x2a, 0xcf, 0xa8, 0x21, 0xa6, 0xe1, 0x37,
+ 0xc9, 0x6b, 0xce, 0x0c, 0x93, 0x7e, 0x7d, 0xdc, 0x18, 0x94, 0x9a, 0x87,
+ 0xe2, 0x51, 0x3b, 0x81, 0xc0, 0x02, 0x30, 0x13, 0xc2, 0x3d, 0x7c, 0x4b,
+ 0x93, 0x7e, 0x85, 0x49, 0x2f, 0xcc, 0x45, 0x27, 0xfb, 0xdd, 0x03, 0x19,
+ 0xd3, 0xa4, 0x01, 0xcd, 0xe4, 0xe7, 0x2b, 0x99, 0xd6, 0x1f, 0xc3, 0x5c,
+ 0xfd, 0x41, 0xab, 0x4d, 0x13, 0xd9, 0x8c, 0x62, 0x09, 0x34, 0xe8, 0xf1,
+ 0x55, 0xa4, 0xf3, 0x9d, 0xba, 0x99, 0x81, 0xff, 0xad, 0x8a, 0x39, 0x26,
+ 0x89, 0xa1, 0xb4, 0x25, 0x5d, 0x77, 0x6f, 0x9a, 0x18, 0x6a, 0x4c, 0x70,
+ 0x40, 0xe4, 0xbb, 0xb6, 0x76, 0x87, 0xd4, 0x2c, 0xf9, 0x0a, 0x6c, 0xe3,
+ 0x1a, 0xe8, 0x85, 0xe8, 0x40, 0xfe, 0x56, 0xc1, 0x8d, 0xc0, 0x2b, 0xa6,
+ 0x8d, 0x6c, 0x9d, 0xdb, 0x3a, 0xac, 0x84, 0x6b, 0x4c, 0xc8, 0x10, 0xda,
+ 0xa4, 0xac, 0x15, 0x39, 0xd9, 0x2c, 0xd2, 0xbc, 0xde, 0xba, 0x4f, 0x84,
+ 0xc5, 0x75, 0x2f, 0xdc, 0x49, 0xdb, 0x7b, 0xc0, 0x2d, 0x87, 0xef, 0xc5,
+ 0x39, 0xe1, 0x37, 0xc2, 0x3e, 0xcd, 0xbf, 0x18, 0xe9, 0xc4, 0x0b, 0x19,
+ 0x58, 0x20, 0x27, 0x98, 0x92, 0x36, 0xf7, 0x51, 0x12, 0x9a, 0x5a, 0xa0,
+ 0x1f, 0x16, 0x98, 0x2e, 0xd2, 0x40, 0xcf, 0x90, 0xd3, 0x4a, 0x40, 0x12,
+ 0xa6, 0x73, 0xc3, 0xeb, 0x23, 0x06, 0xa7, 0xb6, 0x4e, 0x04, 0x1e, 0xd8,
+ 0xa0, 0xcb, 0x4e, 0xeb, 0x15, 0x54, 0x90, 0xf9, 0x0a, 0xdf, 0x66, 0x28,
+ 0x2d, 0x0b, 0xe5, 0xa4, 0xb5, 0xdd, 0x51, 0xf8, 0x33, 0x0b, 0x98, 0x82,
+ 0x3b, 0xea, 0x21, 0xc1, 0xad, 0xb4, 0xd1, 0xaa, 0x82, 0xa4, 0x75, 0xd1,
+ 0xc4, 0x46, 0x3d, 0xb3, 0x83, 0x55, 0x38, 0xf0, 0xbb, 0x92, 0xfb, 0x06,
+ 0x38, 0xca, 0x59, 0x74, 0x3a, 0xad, 0x96, 0xe3, 0x69, 0x13, 0x75, 0xa6,
+ 0x11, 0x17, 0x23, 0x21, 0xe3, 0xcf, 0x4d, 0xa5, 0x87, 0x56, 0x3c, 0x53,
+ 0x86, 0x79, 0xab, 0xd1, 0xf7, 0x51, 0x11, 0xc4, 0x3d, 0x3a, 0xed, 0xc8,
+ 0x59, 0x71, 0xb0, 0x3d, 0xc5, 0xe5, 0xee, 0xb5, 0xa6, 0xc4, 0x68, 0x35,
+ 0x45, 0x2c, 0x53, 0xf9, 0x21, 0x8d, 0xc8, 0x5b, 0xad, 0xc7, 0xff, 0x95,
+ 0xf2, 0xf0, 0x49, 0xbb, 0x9b, 0x96, 0x60, 0xdb, 0xfd, 0xaa, 0x0b, 0x95,
+ 0x3e, 0xec, 0x46, 0xf5, 0x54, 0x15, 0xfc, 0xcf, 0xbc, 0x51, 0xe9, 0xc3,
+ 0xae, 0x54, 0xda, 0xba, 0x53, 0x3d, 0xed, 0xe3, 0x7b, 0x67, 0xfc, 0x1b,
+ 0xde, 0x32, 0x9b, 0x80, 0xf1, 0xd0, 0x3b, 0xa6, 0x34, 0xf1, 0x3f, 0xfb,
+ 0x96, 0x7d, 0xde, 0xd1, 0x02, 0x09, 0x28, 0x72, 0x4d, 0xd3, 0x3a, 0x3f,
+ 0x47, 0x05, 0xc9, 0xe0, 0xd0, 0xb5, 0x76, 0x2c, 0xa6, 0x5b, 0xbc, 0x73,
+ 0x1d, 0x63, 0x10, 0x45, 0x43, 0x34, 0xa5, 0x1e, 0xed, 0x13, 0x7b, 0x1c,
+ 0x5a, 0x5f, 0xbd, 0x76, 0xe4, 0xc0, 0x49, 0xa5, 0x48, 0xb9, 0x0e, 0xe8,
+ 0x61, 0x24, 0xea, 0x83, 0xae, 0xe9, 0xd2, 0xc8, 0xf5, 0x65, 0x4e, 0xda,
+ 0x81, 0x51, 0x5c, 0x00, 0xd2, 0xf8, 0xcd, 0x78, 0x3c, 0x7c, 0x79, 0x7a,
+ 0x04, 0xc0, 0xde, 0x61, 0x48, 0x51, 0x1e, 0x64, 0x6e, 0xe9, 0xcf, 0x31,
+ 0x66, 0x17, 0xf4, 0xa7, 0x9b, 0xb4, 0xbf, 0x6e, 0xf4, 0xdc, 0xee, 0xb6,
+ 0xbe, 0xac, 0x93, 0x56, 0x3a, 0xa5, 0x4e, 0xca, 0xe2, 0xed, 0x43, 0xdb,
+ 0x56, 0xf4, 0x59, 0x4a, 0x69, 0x86, 0x51, 0x0a, 0xae, 0x45, 0x0f, 0x04,
+ 0xb9, 0xa7, 0x04, 0x35, 0x02, 0x90, 0x90, 0xbd, 0xe7, 0x4f, 0xf7, 0xcc,
+ 0xad, 0xb8, 0x63, 0xfc, 0x3b, 0x79, 0xf9, 0xf1, 0xe8, 0xd1, 0xce, 0xe3,
+ 0xd1, 0x63, 0xf0, 0x34, 0x09, 0x0a, 0x91, 0x51, 0x27, 0xc3, 0x1b, 0x6e,
+ 0x17, 0xc9, 0xbe, 0x60, 0x21, 0xf6, 0xee, 0xf0, 0x55, 0xc2, 0x29, 0x7a,
+ 0x84, 0x88, 0x96, 0x50, 0xb1, 0x10, 0x2a, 0x8f, 0x24, 0x8e, 0x4d, 0x69,
+ 0x02, 0x60, 0xa5, 0x72, 0x84, 0x4c, 0xac, 0x81, 0x31, 0x16, 0x6c, 0x87,
+ 0x9a, 0x12, 0x54, 0x9a, 0x5f, 0xd8, 0x89, 0x80, 0xdd, 0xb1, 0x55, 0x21,
+ 0xfb, 0x82, 0x39, 0x86, 0x95, 0x36, 0xde, 0x96, 0x78, 0x1b, 0x76, 0x4f,
+ 0x1a, 0xed, 0xe3, 0xfe, 0xf3, 0x51, 0xf3, 0xa5, 0xc7, 0x00, 0x72, 0x1e,
+ 0xca, 0xc0, 0xce, 0x11, 0x86, 0xa8, 0x09, 0x86, 0x70, 0xb5, 0x4c, 0x17,
+ 0xd6, 0x24, 0xb9, 0xf8, 0xeb, 0xac, 0x18, 0xfd, 0x52, 0x7b, 0x2a, 0xa2,
+ 0x10, 0x7b, 0x66, 0x93, 0x4e, 0x5d, 0x18, 0x99, 0xd8, 0x4a, 0x7d, 0x0b,
+ 0x12, 0x13, 0xa9, 0xeb, 0x09, 0x60, 0x12, 0xc0, 0x65, 0x66, 0x0b, 0xca,
+ 0x1b, 0xca, 0x8e, 0x1f, 0xf9, 0x99, 0x8e, 0x1e, 0x29, 0xc1, 0xc0, 0xc7,
+ 0x78, 0xac, 0x2a, 0x4b, 0xe7, 0x32, 0x2b, 0xef, 0x3b, 0xe1, 0x2f, 0xa9,
+ 0xc5, 0x36, 0x98, 0x6d, 0x1d, 0xa6, 0x9f, 0x39, 0x94, 0x54, 0x9d, 0x82,
+ 0x4d, 0x47, 0x71, 0x6d, 0x1c, 0x96, 0x95, 0x11, 0x27, 0xf9, 0x32, 0x9d,
+ 0x27, 0x0f, 0xc8, 0xa1, 0xee, 0x3f, 0xfc, 0x7b, 0x9a, 0x74, 0xd2, 0xec,
+ 0xf5, 0x76, 0xae, 0x61, 0x74, 0x0a, 0x7e, 0xd3, 0x15, 0x79, 0x21, 0x97,
+ 0xeb, 0x19, 0x0c, 0x15, 0xe2, 0x8e, 0x9b, 0x29, 0xc5, 0x75, 0x13, 0x05,
+ 0x8c, 0x25, 0x69, 0x3d, 0x4c, 0xd3, 0x72, 0xb1, 0x74, 0x21, 0x03, 0x1d,
+ 0x56, 0x6a, 0xfb, 0xb6, 0xbb, 0x8c, 0x30, 0xc6, 0xdc, 0xb9, 0xff, 0xfb,
+ 0xf4, 0x01, 0x9c, 0xf7, 0xb7, 0x60, 0x86, 0x50, 0xe1, 0xd8, 0xcf, 0xf0,
+ 0xcb, 0x95, 0x39, 0xd9, 0xc2, 0x64, 0x8b, 0xc2, 0xdd, 0x59, 0x1b, 0xdc,
+ 0x4f, 0x03, 0xa8, 0x11, 0x2f, 0x15, 0x45, 0xc7, 0x88, 0x40, 0xb0, 0x21,
+ 0x0f, 0xc0, 0xcd, 0xed, 0x28, 0x7e, 0x21, 0x4e, 0xd0, 0xff, 0x04, 0x35,
+ 0xf0, 0x49, 0x62, 0xcf, 0xea, 0x21, 0xea, 0x20, 0x43, 0x4c, 0x73, 0xb3,
+ 0xe1, 0x00, 0xa7, 0xc9, 0x99, 0x5c, 0xff, 0xbf, 0x36, 0xf8, 0xff, 0x26,
+ 0x6d, 0xf0, 0x9f, 0xb9, 0xa5, 0x43, 0xc9, 0xdf, 0xe4, 0x6b, 0x69, 0x33,
+ 0x48, 0x24, 0xdf, 0x3e, 0x9a, 0x58, 0x3d, 0xbf, 0x1b, 0x79, 0xd0, 0x6c,
+ 0x8c, 0x07, 0xfe, 0xb0, 0x2b, 0x1a, 0x92, 0xc2, 0xff, 0x8c, 0x2b, 0xfa,
+ 0xa0, 0x9b, 0xf9, 0xff, 0xfb, 0x3e, 0xfe, 0xbb, 0xdd, 0xc3, 0x08, 0x41,
+ 0xea, 0x60, 0x5b, 0x86, 0xcc, 0x6e, 0x90, 0x9d, 0xc4, 0x9d, 0x8e, 0xc8,
+ 0xd2, 0xde, 0x76, 0xaa, 0x0f, 0xca, 0x8e, 0x78, 0xeb, 0x8e, 0x4e, 0xbf,
+ 0x7f, 0x4a, 0x68, 0x23, 0xe3, 0x6e, 0xd0, 0xbe, 0x4a, 0x8e, 0x5f, 0xbf,
+ 0x3c, 0xfd, 0x05, 0xb7, 0xfd, 0x4f, 0xe4, 0x66, 0x5d, 0x66, 0xd9, 0x6c,
+ 0xc8, 0xf1, 0x91, 0x17, 0xf4, 0x8f, 0x68, 0x60, 0x51, 0x51, 0x04, 0x88,
+ 0x6c, 0x11, 0x36, 0x09, 0xe3, 0xb5, 0xf4, 0xb2, 0x51, 0x53, 0x0a, 0xc1,
+ 0xf6, 0x58, 0x52, 0xcf, 0xd5, 0xc0, 0xc7, 0x52, 0x16, 0xb3, 0x6d, 0x51,
+ 0x01, 0xf9, 0xdb, 0x44, 0x2a, 0x12, 0x67, 0xc7, 0xf5, 0xbe, 0x04, 0xfe,
+ 0x97, 0xc5, 0x50, 0xf4, 0x9e, 0xe1, 0x8c, 0xa3, 0x68, 0xd2, 0xc7, 0x9d,
+ 0x5b, 0x0a, 0x87, 0x76, 0x18, 0xa5, 0xeb, 0xd1, 0x2e, 0xfc, 0xef, 0xc4,
+ 0x41, 0xb2, 0xe6, 0x13, 0xa2, 0x0a, 0x74, 0x3f, 0xdf, 0x97, 0x36, 0xb0,
+ 0x76, 0x2b, 0xfd, 0x93, 0x68, 0xed, 0x20, 0x22, 0x81, 0xb3, 0x55, 0x15,
+ 0xb6, 0x10, 0x4c, 0xfd, 0xdd, 0xe1, 0x48, 0x39, 0xcf, 0xd7, 0x7e, 0xa2,
+ 0xbd, 0x97, 0xe6, 0xf3, 0xad, 0xed, 0x8c, 0x64, 0x29, 0x0e, 0x5a, 0x59,
+ 0x19, 0xfe, 0x94, 0x6c, 0x3c, 0x70, 0x2f, 0x51, 0xd7, 0x3e, 0xd7, 0xce,
+ 0x4b, 0xc9, 0xfe, 0x9f, 0xc2, 0xac, 0x31, 0xef, 0xf5, 0xfb, 0xda, 0x90,
+ 0x96, 0x45, 0x53, 0x51, 0xb7, 0x05, 0x0d, 0x95, 0xd6, 0x8a, 0x5e, 0xbe,
+ 0xf2, 0x5a, 0xb9, 0xa6, 0x94, 0x10, 0x4d, 0xbb, 0x16, 0x82, 0x42, 0xf2,
+ 0xfd, 0xce, 0x9a, 0xe9, 0xc8, 0x9e, 0x2c, 0x01, 0xb5, 0x99, 0x5f, 0x4d,
+ 0x8d, 0x8a, 0xab, 0xed, 0x68, 0xcd, 0x0a, 0x2b, 0xc5, 0xf7, 0x1b, 0x0e,
+ 0x7b, 0x7c, 0x15, 0x1a, 0xf1, 0xef, 0x49, 0x27, 0xff, 0x0d, 0xd3, 0x67,
+ 0xd7, 0x37, 0x3f, 0x0b, 0x4b, 0xe5, 0xd5, 0x1d, 0x63, 0xb9, 0x42, 0x6a,
+ 0xd8, 0x19, 0x15, 0x99, 0x53, 0x87, 0xd4, 0xbc, 0xb9, 0x03, 0xda, 0xc2,
+ 0x8d, 0xd4, 0xfd, 0x74, 0xf9, 0xfd, 0xf8, 0xf8, 0x11, 0x6d, 0xeb, 0xf9,
+ 0xf1, 0xd8, 0xc7, 0x11, 0xaf, 0xa9, 0x67, 0x2e, 0xd5, 0x79, 0x7d, 0x7d,
+ 0xf8, 0x72, 0x7c, 0x3e, 0x0a, 0x96, 0x68, 0xd6, 0x18, 0x26, 0x86, 0x30,
+ 0xc1, 0x30, 0x13, 0x1e, 0x1f, 0x9b, 0xb5, 0xde, 0x01, 0x26, 0x50, 0xea,
+ 0xc7, 0x30, 0x39, 0x9e, 0x9b, 0x8e, 0x0e, 0x3b, 0x37, 0xe5, 0x2c, 0xe6,
+ 0x26, 0xab, 0xc2, 0xd4, 0x0b, 0xb3, 0x77, 0x93, 0x7c, 0x8e, 0x15, 0x98,
+ 0x79, 0x19, 0x6b, 0x68, 0x21, 0xc9, 0xe1, 0x54, 0x8d, 0x5c, 0xce, 0x91,
+ 0x52, 0x86, 0xcf, 0xb4, 0xfd, 0x10, 0x48, 0xbc, 0x94, 0x12, 0xed, 0xfe,
+ 0x82, 0x4b, 0xa3, 0x77, 0x94, 0xe8, 0x83, 0x63, 0xa7, 0xaa, 0x7b, 0xc5,
+ 0xc5, 0x60, 0xb6, 0x22, 0x83, 0x71, 0x5c, 0x00, 0x56, 0x11, 0xa6, 0xb5,
+ 0xa6, 0xf5, 0x47, 0x4d, 0xee, 0xa7, 0xa6, 0x82, 0x48, 0x9e, 0x59, 0x9b,
+ 0x5b, 0xd7, 0xb5, 0x84, 0xcc, 0x41, 0x53, 0xed, 0x2f, 0xaa, 0x40, 0x82,
+ 0x24, 0x70, 0x38, 0x00, 0x8a, 0x6c, 0xbe, 0xbd, 0xe6, 0xc4, 0x35, 0x42,
+ 0xee, 0x37, 0x3d, 0xc4, 0x68, 0xf1, 0xa6, 0x53, 0xc9, 0xf4, 0x2a, 0x33,
+ 0x42, 0x64, 0xe4, 0x55, 0xb0, 0x3f, 0x78, 0x43, 0x3e, 0x0b, 0x60, 0xce,
+ 0x22, 0xdb, 0xf3, 0x8b, 0x37, 0xe4, 0xf1, 0xe3, 0x70, 0x43, 0xaa, 0xec,
+ 0xaf, 0xb3, 0x18, 0x28, 0x34, 0xe5, 0xda, 0x53, 0x9a, 0x3f, 0xa7, 0xc7,
+ 0x9f, 0x31, 0xb2, 0x35, 0xa6, 0xba, 0x83, 0xde, 0x2e, 0x9a, 0x2f, 0xec,
+ 0x40, 0xc3, 0x60, 0x61, 0x23, 0x00, 0x19, 0xf6, 0x62, 0x56, 0x70, 0x41,
+ 0xaf, 0xf7, 0x5e, 0x1e, 0x87, 0x3d, 0x90, 0x2c, 0x4e, 0xf9, 0xc8, 0x5a,
+ 0x0d, 0x12, 0xd9, 0x9c, 0xd4, 0x21, 0x04, 0xa5, 0x74, 0xf6, 0xf2, 0x0c,
+ 0x87, 0x17, 0xcd, 0xd2, 0x2e, 0x6c, 0x2d, 0x75, 0xec, 0x06, 0x9b, 0xd1,
+ 0xb3, 0xf4, 0xf3, 0x4a, 0x3b, 0xa5, 0xac, 0x5f, 0x7d, 0x98, 0x55, 0x86,
+ 0xf6, 0x23, 0x9c, 0x30, 0x4a, 0xe8, 0x4c, 0xd2, 0x41, 0xb9, 0x77, 0x1b,
+ 0x5c, 0x69, 0x9e, 0x6c, 0x44, 0xc8, 0x3c, 0x68, 0x5b, 0x5a, 0x91, 0x51,
+ 0xbb, 0x60, 0xe1, 0xe0, 0x1a, 0x1d, 0x95, 0x2d, 0xe0, 0x12, 0x32, 0x4a,
+ 0xdc, 0x0e, 0x6e, 0x7b, 0xd1, 0x18, 0x6b, 0xfe, 0x3a, 0x9b, 0x53, 0x21,
+ 0x6b, 0x56, 0x4c, 0xab, 0xbb, 0xa5, 0x8f, 0x62, 0x3e, 0xfb, 0x67, 0xf6,
+ 0x5f, 0x2b, 0x20, 0xa4, 0x9f, 0xf7, 0x9e, 0x61, 0x76, 0xdb, 0xa1, 0xfe,
+ 0x85, 0x7a, 0x44, 0x19, 0x8f, 0x71, 0x17, 0x21, 0x85, 0x1b, 0x3f, 0x27,
+ 0x1a, 0xb6, 0x8c, 0x72, 0x6e, 0x86, 0x0a, 0x94, 0x92, 0xf2, 0x8b, 0xd0,
+ 0x81, 0x8c, 0xcd, 0xb5, 0x19, 0xcf, 0x0f, 0x3e, 0xf9, 0xfd, 0x01, 0x6f,
+ 0xd7, 0xf5, 0x7e, 0xc0, 0x13, 0xc6, 0xc7, 0xdb, 0xc9, 0x1b, 0xf8, 0x68,
+ 0xda, 0x4e, 0x78, 0x5c, 0x57, 0xed, 0xd3, 0xb4, 0xcf, 0x8e, 0x28, 0xbf,
+ 0x55, 0xab, 0xc8, 0xe3, 0x34, 0x48, 0x71, 0xa2, 0x0a, 0x58, 0x7a, 0xdb,
+ 0xd5, 0x22, 0x8e, 0x0d, 0x6b, 0xe5, 0x04, 0x2e, 0xf5, 0x2c, 0x4d, 0x56,
+ 0xb9, 0x00, 0x2d, 0x40, 0xfe, 0x99, 0xa7, 0xaf, 0xf7, 0xfb, 0x10, 0xb9,
+ 0x47, 0xf2, 0x6b, 0x2a, 0xd6, 0x9d, 0x65, 0x04, 0x6a, 0xad, 0x98, 0x81,
+ 0x89, 0xed, 0xd8, 0x4d, 0xd9, 0x8b, 0x70, 0x4f, 0x3f, 0xdd, 0x7b, 0xf6,
+ 0x74, 0x7b, 0x5d, 0x8b, 0x62, 0x34, 0x31, 0x41, 0x11, 0x22, 0x93, 0x10,
+ 0xfe, 0xb5, 0x3f, 0xf2, 0x37, 0x28, 0x71, 0x4d, 0x1e, 0xa4, 0x98, 0x34,
+ 0x94, 0x70, 0x46, 0xdc, 0x80, 0x24, 0x68, 0x23, 0x2c, 0xee, 0x3d, 0x88,
+ 0x85, 0xd7, 0xd5, 0x94, 0xf6, 0x96, 0x13, 0x29, 0x77, 0x8d, 0xc2, 0x00,
+ 0x92, 0x9b, 0x8c, 0xc4, 0xe1, 0x23, 0x9d, 0x03, 0x4b, 0x4f, 0xbf, 0x4f,
+ 0x21, 0x4f, 0x96, 0xfe, 0x3e, 0x6a, 0xff, 0xcb, 0x0f, 0x66, 0xba, 0x01,
+ 0x7e, 0xcd, 0x29, 0x3f, 0xfa, 0x17, 0x9c, 0xf2, 0xa3, 0xf5, 0xa7, 0xfc,
+ 0xe8, 0xa1, 0xa7, 0xfc, 0xec, 0xc9, 0xd3, 0xcf, 0x7f, 0xc5, 0x29, 0x7b,
+ 0x3b, 0xfc, 0x5f, 0x76, 0xca, 0x1e, 0xa5, 0xfd, 0xba, 0x53, 0x96, 0xa4,
+ 0x90, 0x6e, 0xe1, 0x99, 0x24, 0xbf, 0x50, 0xfa, 0x1e, 0x20, 0x03, 0x38,
+ 0x5d, 0x9f, 0x9f, 0x0d, 0xeb, 0x49, 0xa4, 0x0b, 0x1f, 0x77, 0xff, 0x82,
+ 0x1e, 0x16, 0x31, 0xb2, 0x1d, 0x84, 0x02, 0x69, 0xb8, 0xcb, 0x39, 0xba,
+ 0x48, 0x6d, 0x0e, 0x37, 0xd5, 0x3d, 0xa2, 0x65, 0x62, 0x8a, 0xff, 0xc3,
+ 0x9f, 0x33, 0x47, 0xfd, 0x2f, 0x44, 0x8f, 0x0a, 0x73, 0x66, 0xbc, 0xac,
+ 0xa7, 0xf6, 0xa6, 0xdd, 0xcd, 0x8d, 0x99, 0xc0, 0x39, 0x48, 0xd1, 0xec,
+ 0x37, 0x41, 0xb8, 0xb6, 0x08, 0x36, 0xea, 0xa8, 0x99, 0x18, 0xa5, 0xd0,
+ 0x48, 0x81, 0x02, 0x49, 0x3d, 0x77, 0xf3, 0x4c, 0x0a, 0x25, 0xb1, 0x68,
+ 0x50, 0x06, 0x4c, 0xf9, 0xae, 0x4b, 0x58, 0x9a, 0xa6, 0x74, 0x32, 0x96,
+ 0x6c, 0xdb, 0xf5, 0xb2, 0x3d, 0x19, 0xee, 0x91, 0x69, 0x6e, 0xc9, 0x94,
+ 0x70, 0x9b, 0xb2, 0x45, 0x04, 0xd4, 0x64, 0x0d, 0xa7, 0x7f, 0xda, 0x4d,
+ 0xb8, 0xeb, 0x69, 0xd2, 0x12, 0x4b, 0x40, 0xa3, 0x86, 0x3d, 0xed, 0x8e,
+ 0x3d, 0x9c, 0x0b, 0xcb, 0xc8, 0x61, 0xa4, 0xf0, 0x77, 0xdb, 0xe0, 0x48,
+ 0x03, 0x9d, 0xa0, 0xe0, 0x12, 0x32, 0x5d, 0x16, 0xd4, 0xee, 0x3f, 0xe3,
+ 0xb2, 0x09, 0x75, 0x67, 0xee, 0xaf, 0x0d, 0x40, 0x72, 0x6d, 0x63, 0x5b,
+ 0x89, 0x78, 0x79, 0x72, 0xaf, 0x71, 0xba, 0xb3, 0xd5, 0x62, 0xa9, 0xa0,
+ 0x6f, 0xa8, 0xe2, 0xc8, 0xa9, 0x5c, 0x48, 0x0a, 0xbf, 0x63, 0x3d, 0xd2,
+ 0xd3, 0xca, 0xf3, 0x32, 0x49, 0x72, 0x1b, 0x7b, 0xac, 0xf4, 0xac, 0x04,
+ 0xc0, 0x80, 0x17, 0x40, 0x89, 0x6b, 0x54, 0x32, 0x01, 0x1c, 0xa9, 0xec,
+ 0x22, 0x48, 0x3d, 0xa0, 0x16, 0x0a, 0x14, 0x9d, 0xcc, 0x26, 0xab, 0x4b,
+ 0xad, 0x9d, 0xb6, 0x9d, 0xbe, 0xda, 0x54, 0x49, 0x75, 0x26, 0x40, 0x53,
+ 0xc9, 0xb4, 0xf3, 0x7a, 0x08, 0x22, 0xd1, 0xa0, 0xc7, 0xdd, 0x74, 0x5d,
+ 0x72, 0x58, 0xb0, 0x70, 0x22, 0xf6, 0xd6, 0xca, 0xe9, 0x27, 0xad, 0x0e,
+ 0x4c, 0x91, 0x1e, 0x42, 0x3e, 0xa9, 0x34, 0xd3, 0xe5, 0xf0, 0x22, 0x05,
+ 0x04, 0x63, 0x50, 0x40, 0x2b, 0x09, 0xa1, 0x72, 0x05, 0xce, 0x5f, 0x9d,
+ 0x26, 0x6f, 0x52, 0xe9, 0xbb, 0x92, 0x6c, 0x19, 0x0e, 0xfc, 0xec, 0xf1,
+ 0xde, 0xa3, 0xed, 0xb5, 0x7a, 0x78, 0x1b, 0x56, 0x88, 0xbe, 0x55, 0x94,
+ 0xb1, 0xc4, 0xdc, 0xf3, 0x55, 0x55, 0x24, 0x8a, 0x57, 0x62, 0xbe, 0xf4,
+ 0xe1, 0xdd, 0xc9, 0xeb, 0xc3, 0xe3, 0x97, 0x7f, 0xb2, 0xd5, 0xf1, 0xd8,
+ 0x04, 0xad, 0xb0, 0xfc, 0x60, 0xcc, 0xd7, 0xbb, 0x0f, 0x75, 0x66, 0xe6,
+ 0xdc, 0x6c, 0x3d, 0xda, 0x46, 0x85, 0x52, 0xd0, 0x1d, 0xef, 0x32, 0x6b,
+ 0x63, 0x0a, 0x70, 0x9e, 0xf4, 0x1a, 0x60, 0x1c, 0xeb, 0xa0, 0xdc, 0x1d,
+ 0xed, 0x4b, 0x77, 0x05, 0x81, 0x87, 0x77, 0x3c, 0xcb, 0xeb, 0xf4, 0x90,
+ 0x0a, 0x7c, 0x16, 0xd7, 0x20, 0x86, 0x95, 0x28, 0x00, 0x30, 0xc8, 0xa7,
+ 0x39, 0xac, 0x15, 0xb9, 0xd6, 0x39, 0xc2, 0xf0, 0x17, 0x6d, 0xf8, 0x3d,
+ 0x2a, 0x52, 0xc4, 0x2f, 0xd6, 0x87, 0x95, 0xdb, 0xbc, 0xbf, 0x21, 0x61,
+ 0x91, 0xcd, 0x8b, 0xac, 0x19, 0xca, 0xc4, 0x5e, 0x98, 0x3f, 0xbf, 0xbc,
+ 0x4e, 0xe7, 0x41, 0xe9, 0x2b, 0x9a, 0xcb, 0x29, 0x65, 0x5a, 0x56, 0x84,
+ 0x37, 0xbd, 0xce, 0x12, 0x63, 0xdb, 0x62, 0x41, 0x9f, 0x34, 0x57, 0x25,
+ 0xe8, 0xa4, 0x70, 0x7e, 0xfe, 0xa7, 0xd3, 0xc3, 0x2f, 0x5f, 0x80, 0x91,
+ 0xfd, 0x11, 0x39, 0xf6, 0x75, 0x8b, 0xaf, 0x25, 0x68, 0x66, 0x1d, 0xac,
+ 0xe1, 0xc7, 0xd7, 0x47, 0xe3, 0xd3, 0xe3, 0x93, 0x57, 0x5f, 0xbe, 0xf8,
+ 0x11, 0x36, 0xa5, 0x11, 0x1e, 0x77, 0xde, 0xbb, 0xf6, 0x67, 0x16, 0x2d,
+ 0x3e, 0x04, 0x4e, 0x38, 0xfc, 0xe1, 0xc3, 0xe1, 0xbb, 0xef, 0xbf, 0x7c,
+ 0x71, 0x9d, 0x56, 0x03, 0xac, 0x8f, 0xdf, 0xee, 0xe9, 0xdd, 0xd8, 0x22,
+ 0x35, 0xa8, 0xe7, 0x93, 0xf9, 0xc7, 0x3a, 0xff, 0x5b, 0x96, 0x98, 0xd7,
+ 0xe7, 0xab, 0x10, 0xae, 0xf9, 0x5c, 0xfa, 0x01, 0x19, 0xd9, 0x0d, 0x73,
+ 0xe8, 0xeb, 0xe3, 0xef, 0x00, 0x09, 0x6a, 0xfd, 0xa4, 0x0b, 0x6e, 0x40,
+ 0x93, 0xfc, 0xf1, 0xc9, 0xde, 0xfe, 0xb6, 0x6b, 0x7b, 0x48, 0x90, 0xc2,
+ 0x66, 0xc6, 0x1f, 0x83, 0xea, 0x90, 0xbf, 0x49, 0x9d, 0x8b, 0xeb, 0x02,
+ 0xd2, 0x38, 0x8b, 0x8a, 0x04, 0x86, 0xba, 0x9c, 0x08, 0x15, 0x80, 0xf2,
+ 0x5f, 0xd1, 0x35, 0xb2, 0x22, 0x78, 0xa5, 0xc0, 0xe3, 0x76, 0xfe, 0xc6,
+ 0xc3, 0xf2, 0xf8, 0xda, 0x91, 0x9e, 0x99, 0x8e, 0x78, 0xed, 0xd6, 0xca,
+ 0xc7, 0x4f, 0x18, 0xcb, 0xe9, 0x9a, 0x94, 0xb4, 0xd9, 0x46, 0xa4, 0x09,
+ 0xfd, 0xc4, 0xf7, 0xd9, 0xcb, 0xf1, 0xa1, 0x4a, 0x97, 0x92, 0x31, 0xe8,
+ 0x68, 0x95, 0x4a, 0x78, 0x5a, 0x3a, 0x7d, 0x8f, 0x0f, 0x2f, 0x5f, 0xa0,
+ 0xc6, 0x32, 0xab, 0x13, 0xf5, 0xef, 0x78, 0xde, 0x9b, 0x79, 0x76, 0x99,
+ 0x4e, 0xef, 0x2c, 0x92, 0x2e, 0x1d, 0xc8, 0xac, 0x7b, 0x3b, 0xc9, 0xc3,
+ 0x37, 0x85, 0x31, 0x67, 0x44, 0xf0, 0x25, 0xb1, 0x67, 0x86, 0x8c, 0x30,
+ 0xd7, 0xd5, 0x3a, 0x7d, 0x78, 0x6a, 0x16, 0x14, 0x43, 0xc5, 0x25, 0x36,
+ 0xb5, 0x2b, 0x9d, 0xdb, 0x5b, 0xdc, 0xa1, 0x3e, 0x90, 0x0d, 0x35, 0x65,
+ 0x5d, 0xbb, 0xa7, 0x8f, 0xdb, 0x1e, 0xf3, 0xbf, 0xd1, 0x25, 0x07, 0xda,
+ 0x10, 0x39, 0x65, 0x5f, 0xe0, 0xaf, 0x71, 0xbc, 0x71, 0xea, 0x53, 0x44,
+ 0x6e, 0x0b, 0xee, 0xbb, 0xcb, 0xe0, 0xee, 0x58, 0xb6, 0xc5, 0x89, 0x93,
+ 0xf6, 0x1d, 0x80, 0xad, 0x6e, 0x9c, 0x3b, 0x3d, 0x8e, 0xe5, 0x65, 0x9d,
+ 0xda, 0x86, 0x3c, 0x33, 0xdb, 0xf2, 0xa7, 0x67, 0x3c, 0x5b, 0x88, 0x88,
+ 0xdf, 0x47, 0x1c, 0x9b, 0x92, 0x8c, 0xf0, 0x02, 0x63, 0x81, 0x25, 0x42,
+ 0x27, 0x31, 0x3b, 0xf5, 0x47, 0x8d, 0xfa, 0x50, 0x87, 0x97, 0x52, 0x10,
+ 0xa6, 0xe8, 0x21, 0x46, 0xcc, 0xa8, 0x43, 0xb8, 0x01, 0xce, 0x6e, 0x57,
+ 0xc7, 0x01, 0x27, 0x68, 0x20, 0xa4, 0x66, 0xe1, 0x73, 0xcd, 0x34, 0x6b,
+ 0xd5, 0x4a, 0x51, 0xec, 0x45, 0x66, 0xba, 0x03, 0xd8, 0x8c, 0xd4, 0x5c,
+ 0x7b, 0xd5, 0x49, 0x0a, 0x7c, 0xcc, 0x2b, 0x93, 0x74, 0x04, 0x9a, 0xd0,
+ 0xd6, 0x02, 0x0b, 0x11, 0x1c, 0x76, 0x06, 0xbd, 0xef, 0xeb, 0x5c, 0xdd,
+ 0x91, 0x52, 0x66, 0x4c, 0x8c, 0x20, 0x12, 0x8a, 0x64, 0x12, 0x97, 0x9f,
+ 0x77, 0x76, 0x23, 0x52, 0x65, 0xd9, 0x70, 0x12, 0x7f, 0x57, 0x44, 0x01,
+ 0x3c, 0x59, 0x53, 0xe7, 0x5b, 0x23, 0xf8, 0x6d, 0xb9, 0xb6, 0x86, 0xae,
+ 0xa7, 0x51, 0xde, 0x58, 0x95, 0x2d, 0x02, 0x2d, 0x62, 0x01, 0x9e, 0x2d,
+ 0x40, 0x15, 0xbb, 0x3e, 0x95, 0x3e, 0x84, 0x22, 0xf0, 0xb1, 0x1d, 0x2e,
+ 0x71, 0x53, 0x16, 0x94, 0x47, 0x4a, 0x6c, 0x83, 0xc1, 0x8a, 0xec, 0xc6,
+ 0x1f, 0xcc, 0xd9, 0x1d, 0x76, 0xc0, 0x4f, 0xe9, 0xed, 0x36, 0x36, 0x13,
+ 0xea, 0x72, 0x92, 0x17, 0xdf, 0x1f, 0x9e, 0x8d, 0x8f, 0x4e, 0xde, 0xfd,
+ 0x31, 0x6a, 0x0e, 0xcb, 0x2f, 0x6d, 0xc7, 0x2b, 0xad, 0xe8, 0x73, 0x6d,
+ 0x87, 0xe0, 0x05, 0x53, 0x5f, 0x0b, 0x77, 0xaf, 0xc9, 0x0b, 0x3c, 0x12,
+ 0x74, 0x33, 0x9a, 0x66, 0xcb, 0x86, 0xf4, 0x25, 0xb5, 0xa5, 0x5d, 0x67,
+ 0x45, 0xea, 0x77, 0x41, 0x36, 0xdc, 0xee, 0x40, 0xff, 0xb6, 0x67, 0xff,
+ 0xb6, 0x1f, 0x81, 0xb3, 0xe2, 0xdf, 0x3c, 0x0a, 0x36, 0x28, 0x9e, 0xb0,
+ 0xe3, 0xc5, 0xcb, 0x57, 0x4b, 0xae, 0x06, 0x03, 0x68, 0x03, 0x03, 0xbc,
+ 0xf8, 0x0b, 0x08, 0xf0, 0xe9, 0xd1, 0xf9, 0xd4, 0x7f, 0xd1, 0x3c, 0x7c,
+ 0xbd, 0xe7, 0x55, 0xb0, 0xd8, 0xe7, 0xf6, 0x62, 0xcf, 0xed, 0x85, 0xcf,
+ 0xed, 0xc7, 0x9e, 0xdb, 0x0f, 0x9f, 0x7b, 0x14, 0x7b, 0xce, 0x5b, 0xaf,
+ 0x67, 0xc6, 0xcb, 0xce, 0xad, 0xb3, 0x8c, 0x5b, 0xff, 0x7a, 0x34, 0x72,
+ 0xc7, 0xff, 0x99, 0xf5, 0x56, 0x74, 0x7b, 0x76, 0x7a, 0x86, 0xbd, 0xda,
+ 0xf5, 0xfd, 0x66, 0xfd, 0xcb, 0x4e, 0x4b, 0x70, 0xa3, 0x26, 0x76, 0x5c,
+ 0xcc, 0xe6, 0x7b, 0x7b, 0x8f, 0x86, 0xd3, 0x7c, 0x79, 0x05, 0xa9, 0xf3,
+ 0x42, 0x5b, 0x58, 0x61, 0xf3, 0xb1, 0x58, 0xf9, 0xc5, 0x0a, 0x26, 0x79,
+ 0xa8, 0x87, 0x1c, 0x8f, 0xb7, 0x13, 0x0f, 0x97, 0x45, 0xa0, 0x08, 0xe9,
+ 0x95, 0x84, 0xdf, 0x71, 0xa8, 0x2c, 0xa1, 0x83, 0x39, 0x28, 0x75, 0xb1,
+ 0xee, 0x1b, 0xf3, 0x9e, 0x4c, 0x80, 0x49, 0x57, 0x67, 0xa5, 0xd3, 0x94,
+ 0xb1, 0x19, 0x3d, 0x54, 0x43, 0xef, 0x5d, 0xd7, 0x2e, 0x61, 0xf9, 0xeb,
+ 0x2b, 0x8a, 0xe5, 0x85, 0x1e, 0x54, 0x45, 0x67, 0x75, 0x3c, 0x9c, 0x55,
+ 0xb9, 0xcb, 0x22, 0x26, 0x2a, 0xdf, 0x9f, 0x1d, 0x07, 0xaa, 0xa5, 0x6d,
+ 0xc7, 0x4e, 0xad, 0x96, 0xaf, 0xd2, 0xdb, 0xdb, 0x51, 0x9d, 0xed, 0x18,
+ 0x7e, 0x52, 0xef, 0x90, 0xbf, 0x57, 0x3e, 0x7d, 0xd5, 0x2c, 0xe6, 0x9f,
+ 0x96, 0x61, 0x20, 0x1d, 0x0d, 0x8a, 0xac, 0x11, 0xb7, 0xe6, 0xbf, 0x7f,
+ 0x0c, 0x0b, 0x4b, 0x69, 0xc5, 0xdd, 0xa4, 0x35, 0x68, 0xbe, 0x28, 0x78,
+ 0xe2, 0x86, 0xdc, 0xfc, 0x35, 0xdb, 0x5f, 0x50, 0x9b, 0xbd, 0xf7, 0x94,
+ 0xff, 0x12, 0x8f, 0xd8, 0x18, 0x9f, 0x9d, 0x6e, 0x0c, 0x24, 0x52, 0x6d,
+ 0xbe, 0x30, 0x34, 0xff, 0x4e, 0xc8, 0xc2, 0x42, 0x0b, 0x8d, 0x27, 0x8f,
+ 0x25, 0xa9, 0x8c, 0xe7, 0xc8, 0x8d, 0xa4, 0xc2, 0xd0, 0x09, 0xfd, 0xd2,
+ 0x25, 0xd6, 0x55, 0xad, 0x66, 0x37, 0xc6, 0xf6, 0x69, 0x2f, 0x90, 0xb3,
+ 0x5d, 0x06, 0x9c, 0xc1, 0xb0, 0x46, 0xa5, 0x71, 0xd8, 0x6e, 0x68, 0x72,
+ 0x8e, 0x79, 0x8e, 0x3a, 0xde, 0xf1, 0xb2, 0xfa, 0x28, 0x78, 0xff, 0xe2,
+ 0xe3, 0xa7, 0x8b, 0x15, 0xb4, 0x60, 0x6d, 0x5d, 0x34, 0xeb, 0x16, 0x14,
+ 0xdf, 0xa2, 0x5d, 0xb3, 0x6c, 0xd8, 0x20, 0x91, 0x3b, 0xd0, 0xd7, 0x67,
+ 0x54, 0x5a, 0x7f, 0x42, 0x3b, 0xf9, 0xa6, 0x58, 0xe1, 0x50, 0x68, 0x20,
+ 0x1d, 0x47, 0x86, 0xb9, 0x07, 0x8f, 0xe2, 0x71, 0xe7, 0xf4, 0x75, 0xf3,
+ 0x22, 0xc7, 0xee, 0x3a, 0x8b, 0xd3, 0x21, 0x91, 0x3e, 0xaf, 0x90, 0x7b,
+ 0x11, 0x92, 0x10, 0x58, 0xac, 0xde, 0x4a, 0x2a, 0xc5, 0x8f, 0xf0, 0x4e,
+ 0x64, 0xa4, 0x81, 0x27, 0x61, 0x51, 0xee, 0xac, 0x3d, 0xcc, 0xfb, 0xfb,
+ 0x17, 0xe4, 0xaf, 0x87, 0xde, 0x8e, 0x26, 0x1b, 0x63, 0x49, 0x9a, 0x8c,
+ 0xf9, 0xa0, 0x05, 0x39, 0x40, 0xb3, 0xde, 0x25, 0x69, 0x70, 0xbe, 0xbd,
+ 0x28, 0xb7, 0x2a, 0x6f, 0x59, 0x8e, 0x4a, 0xb1, 0xb4, 0x80, 0xf4, 0x1e,
+ 0xb4, 0xd0, 0xd6, 0x4a, 0x21, 0x1e, 0xa2, 0x4c, 0x35, 0xe2, 0xed, 0xf6,
+ 0xc4, 0x21, 0x89, 0x3f, 0xb3, 0x7a, 0xd6, 0x8a, 0x19, 0x3e, 0x63, 0x4d,
+ 0x45, 0x01, 0x85, 0xb7, 0xc4, 0xed, 0x8d, 0x51, 0xb4, 0x57, 0xc1, 0x9a,
+ 0x3a, 0xd8, 0x50, 0x48, 0x40, 0x76, 0xc5, 0xf9, 0xff, 0xbd, 0x73, 0xdd,
+ 0xeb, 0xcc, 0xf5, 0x5f, 0x30, 0xd5, 0xfd, 0x5f, 0xb7, 0xab, 0xfb, 0xff,
+ 0x05, 0xbb, 0xfa, 0xe8, 0x57, 0xee, 0xea, 0xa3, 0xdf, 0x7c, 0x57, 0x5d,
+ 0x03, 0x65, 0x95, 0x8f, 0x79, 0xbb, 0x23, 0x0a, 0x27, 0x5f, 0xa3, 0xf7,
+ 0xee, 0x04, 0xea, 0xa1, 0xa8, 0x09, 0x28, 0x3d, 0xcf, 0xa8, 0x95, 0x6c,
+ 0x67, 0xe5, 0x8d, 0x45, 0xcd, 0xb0, 0xf8, 0xef, 0xe2, 0x78, 0x16, 0x2c,
+ 0x5e, 0x30, 0xfb, 0xaf, 0x4b, 0xd8, 0x4d, 0x86, 0x27, 0x0e, 0x92, 0x77,
+ 0xe3, 0x31, 0x27, 0x1b, 0x8c, 0x29, 0x60, 0xd2, 0xb5, 0xa4, 0xe1, 0x82,
+ 0x20, 0xcd, 0x66, 0x0b, 0x02, 0xf3, 0xc4, 0xcc, 0xd0, 0x11, 0x16, 0xbf,
+ 0xb7, 0x48, 0xa7, 0xf8, 0xf1, 0xee, 0x68, 0xcf, 0x6d, 0xce, 0xf6, 0x2f,
+ 0x80, 0xb9, 0x71, 0xd1, 0x8c, 0xa8, 0xce, 0x1d, 0x01, 0xa4, 0x45, 0x7c,
+ 0x16, 0xf2, 0xb9, 0x7d, 0x34, 0xb7, 0x42, 0x3d, 0xaa, 0xce, 0xf4, 0x43,
+ 0x9f, 0x52, 0x7f, 0x1b, 0x09, 0x48, 0x61, 0x0c, 0xeb, 0x36, 0xa1, 0xc8,
+ 0x2b, 0xa3, 0x34, 0x84, 0x17, 0xbf, 0xeb, 0xb2, 0xe7, 0x16, 0xd4, 0xbf,
+ 0x34, 0x9e, 0xe4, 0xc5, 0x6e, 0xfe, 0xcb, 0xe2, 0x49, 0x0f, 0xd2, 0x8a,
+ 0xfd, 0x2b, 0x53, 0x0d, 0xb5, 0x71, 0x4c, 0x1c, 0x9d, 0xd6, 0xb9, 0x13,
+ 0x90, 0xff, 0x4f, 0xc0, 0x55, 0x33, 0x26, 0x1d, 0xc4, 0xd7, 0x0f, 0xe5,
+ 0x5d, 0xe7, 0xd5, 0xe7, 0xac, 0x8d, 0x10, 0x5d, 0xa2, 0xd4, 0x5c, 0x5b,
+ 0x8b, 0xa7, 0xa0, 0x05, 0xed, 0xbc, 0xca, 0x9a, 0x29, 0x6e, 0x55, 0xe8,
+ 0x67, 0x5c, 0x65, 0x38, 0x21, 0xbb, 0x84, 0x7d, 0x8b, 0x33, 0xc6, 0xfd,
+ 0xc8, 0xef, 0x93, 0x11, 0x4f, 0xdb, 0xeb, 0x4d, 0xa7, 0xd9, 0x30, 0xad,
+ 0xa7, 0x79, 0x1e, 0x6f, 0x5c, 0xa7, 0xd1, 0x1f, 0x84, 0xdb, 0xc9, 0x6f,
+ 0x87, 0x1e, 0xd9, 0xf0, 0xb4, 0x6b, 0x1f, 0xda, 0xbc, 0x10, 0x24, 0x0c,
+ 0x4c, 0xb7, 0x5c, 0x35, 0x97, 0xa5, 0xba, 0xf0, 0x06, 0x11, 0x77, 0x00,
+ 0x7c, 0xf1, 0x74, 0xc4, 0xe6, 0x74, 0xa6, 0x55, 0xbe, 0x24, 0x94, 0x3d,
+ 0xbf, 0xe9, 0xcd, 0xc0, 0xf6, 0x84, 0x25, 0x13, 0x5b, 0x62, 0x26, 0xdc,
+ 0x22, 0xf5, 0x7d, 0x80, 0x40, 0xb0, 0x31, 0xdc, 0x80, 0x33, 0xc3, 0xf6,
+ 0x0a, 0x31, 0xef, 0x02, 0x1b, 0xd5, 0x8b, 0x56, 0x70, 0xbf, 0xed, 0xfe,
+ 0xe0, 0x9b, 0x3a, 0x2f, 0x0d, 0x09, 0xdd, 0x29, 0xfe, 0x26, 0xc1, 0xa1,
+ 0x6b, 0x50, 0x02, 0x2a, 0xa2, 0xb9, 0x83, 0x70, 0xaa, 0x95, 0x52, 0x9f,
+ 0x7f, 0x95, 0xdd, 0x72, 0xf5, 0x58, 0xa8, 0x6c, 0x8a, 0x7a, 0x7b, 0x45,
+ 0xdd, 0x69, 0xf0, 0xec, 0xcb, 0xf1, 0xab, 0xa3, 0xa3, 0x56, 0xad, 0x19,
+ 0x36, 0x8f, 0xc1, 0xfb, 0x08, 0x10, 0xa0, 0x06, 0x88, 0x21, 0x42, 0x35,
+ 0xb1, 0xd8, 0x1b, 0x77, 0xc2, 0x32, 0xd7, 0x8f, 0xfc, 0xad, 0x86, 0x13,
+ 0xe4, 0xda, 0xa7, 0x2c, 0xe5, 0xbc, 0x8e, 0x55, 0x61, 0xa6, 0x99, 0x03,
+ 0x5a, 0xe6, 0x6a, 0xb5, 0x48, 0x8b, 0x4f, 0x0f, 0x9e, 0x11, 0x4f, 0xe1,
+ 0x96, 0xdd, 0xe2, 0x7b, 0xe5, 0xc7, 0x77, 0x42, 0x5a, 0x8b, 0xc0, 0x8e,
+ 0x9f, 0x56, 0xd2, 0x94, 0x8a, 0x71, 0x62, 0x04, 0x37, 0x1c, 0x5d, 0x93,
+ 0x81, 0xe2, 0xc5, 0x23, 0x9b, 0xb5, 0x6a, 0xc8, 0x88, 0x21, 0x79, 0x85,
+ 0x91, 0x44, 0x9a, 0x53, 0x8b, 0xf3, 0x7c, 0x6d, 0x8d, 0xcc, 0x5e, 0x57,
+ 0x54, 0xd2, 0x47, 0xfe, 0x95, 0x37, 0xc0, 0xbf, 0x00, 0xf7, 0xd2, 0xbf,
+ 0x5c, 0x80, 0x9e, 0x1b, 0x40, 0xf9, 0xf1, 0xae, 0xc5, 0xce, 0xfd, 0x97,
+ 0x80, 0xfc, 0x0b, 0x1b, 0xbf, 0xdf, 0x88, 0x03, 0xd3, 0x3f, 0xe0, 0x26,
+ 0xb5, 0x60, 0x17, 0xfe, 0xb5, 0x94, 0x16, 0xc1, 0x81, 0xf0, 0x98, 0x98,
+ 0x7f, 0xa6, 0xab, 0x22, 0xbf, 0xa5, 0x34, 0x6e, 0xa3, 0x4a, 0xbc, 0x00,
+ 0x28, 0x7b, 0x0f, 0xe0, 0xf8, 0x2b, 0x56, 0x6c, 0x12, 0xcd, 0x4a, 0xa7,
+ 0x55, 0xbc, 0x37, 0x2f, 0x27, 0xb3, 0x72, 0x81, 0xa8, 0x3e, 0x8f, 0x31,
+ 0xf0, 0x91, 0x5f, 0x89, 0xad, 0x47, 0xb2, 0x02, 0x8a, 0xac, 0x81, 0xe1,
+ 0xb7, 0xd6, 0x9f, 0xdd, 0x8e, 0x11, 0x9c, 0x53, 0x87, 0xa7, 0x25, 0x52,
+ 0x85, 0xd7, 0xf4, 0x0f, 0x65, 0x37, 0xbf, 0x97, 0x98, 0xeb, 0x03, 0x86,
+ 0xc2, 0x7f, 0xed, 0xda, 0x8c, 0x08, 0xfd, 0x88, 0xd4, 0x27, 0xd0, 0xf9,
+ 0x58, 0x02, 0x83, 0xed, 0x8e, 0xe0, 0x7a, 0x8b, 0xe4, 0x5d, 0x7f, 0x24,
+ 0x75, 0xaf, 0x70, 0x41, 0x1b, 0xe9, 0xfb, 0x15, 0xca, 0xee, 0x4e, 0x93,
+ 0x93, 0x91, 0xd7, 0x6f, 0xb1, 0xd5, 0x83, 0x85, 0x50, 0x98, 0xf2, 0x39,
+ 0xc8, 0x7f, 0x47, 0x63, 0x9a, 0xf3, 0x30, 0xe3, 0xd6, 0x35, 0xf6, 0x60,
+ 0x56, 0x87, 0xf2, 0x0e, 0x8a, 0x6b, 0xe0, 0xdf, 0x04, 0xa0, 0xa2, 0xce,
+ 0xaa, 0xf6, 0x22, 0xa4, 0x59, 0x4f, 0x57, 0x7d, 0xf1, 0xa2, 0x4e, 0x57,
+ 0xe8, 0xf5, 0xaa, 0xf3, 0xaa, 0x98, 0x10, 0xdb, 0xdd, 0x7c, 0x35, 0x90,
+ 0xe5, 0x75, 0x2b, 0x88, 0x74, 0x7b, 0x17, 0xfd, 0x4c, 0xd4, 0x28, 0xc6,
+ 0xd5, 0x43, 0x89, 0x0d, 0xe0, 0xd1, 0x91, 0x9d, 0x63, 0x5b, 0x4b, 0xf2,
+ 0xc1, 0x72, 0x53, 0x5a, 0xa9, 0xe4, 0x0b, 0x70, 0x03, 0xf3, 0x79, 0x2b,
+ 0x5b, 0x7a, 0x25, 0x5d, 0xe9, 0xa4, 0x40, 0x63, 0xcb, 0x28, 0xeb, 0xac,
+ 0xb4, 0xf1, 0xe5, 0x01, 0xb4, 0xb9, 0x02, 0xcf, 0xf6, 0x83, 0x92, 0x46,
+ 0x41, 0x5d, 0xda, 0x69, 0x2b, 0xe0, 0x1c, 0x5b, 0xa9, 0x62, 0xb7, 0xc1,
+ 0x43, 0xbe, 0xad, 0x6a, 0xa7, 0xb9, 0xe1, 0x79, 0xe1, 0x93, 0x7b, 0xe0,
+ 0xd3, 0x96, 0xf6, 0x26, 0xc2, 0x96, 0x92, 0x97, 0x82, 0x99, 0x9b, 0xc1,
+ 0xcd, 0xd3, 0xfd, 0xce, 0xc8, 0xff, 0x0e, 0xa7, 0xc8, 0x6f, 0x07, 0x48,
+ 0xeb, 0x77, 0xdd, 0xde, 0xab, 0xf6, 0xdb, 0x98, 0xa7, 0x56, 0x82, 0xca,
+ 0xcc, 0x28, 0xa5, 0x10, 0xf9, 0x94, 0x14, 0x6e, 0x0c, 0x6f, 0x22, 0x95,
+ 0x26, 0xd3, 0x4b, 0x94, 0xd6, 0x4d, 0xf0, 0x79, 0xd2, 0x25, 0x81, 0xf3,
+ 0x2c, 0x85, 0xa3, 0x31, 0x46, 0x9e, 0xac, 0x16, 0x21, 0x1c, 0x06, 0x4e,
+ 0x0b, 0x7c, 0x34, 0xd4, 0xbd, 0x29, 0xda, 0xaa, 0xc3, 0x2f, 0x14, 0x02,
+ 0x47, 0x0b, 0xaf, 0xb3, 0x6d, 0x84, 0x84, 0xce, 0x0a, 0xa5, 0x22, 0xc0,
+ 0xf7, 0xa1, 0xcd, 0x0b, 0x96, 0x70, 0x72, 0x88, 0x37, 0xc2, 0xc1, 0xfe,
+ 0x20, 0xfd, 0x19, 0x72, 0xbf, 0xd7, 0x19, 0xb5, 0x0c, 0x0e, 0xe8, 0x4a,
+ 0x28, 0x4f, 0x80, 0xab, 0xa9, 0xaa, 0x77, 0x24, 0x6d, 0x3c, 0xa0, 0xb4,
+ 0xab, 0x9a, 0x99, 0x6c, 0x5c, 0xce, 0xcb, 0xc9, 0xc4, 0x2c, 0x7c, 0xc3,
+ 0x53, 0x4a, 0xcd, 0x97, 0x03, 0x2f, 0x9a, 0x3f, 0x0f, 0x63, 0x59, 0x5d,
+ 0x52, 0x4c, 0x63, 0xc0, 0xd9, 0x28, 0x02, 0xfd, 0x0c, 0x81, 0xac, 0xe5,
+ 0x53, 0xf2, 0x7d, 0x45, 0x7a, 0x8d, 0xc8, 0x19, 0xc9, 0x8b, 0x15, 0xc2,
+ 0xc0, 0xc2, 0xbc, 0x2c, 0x67, 0xa9, 0x26, 0xc4, 0x4f, 0x75, 0x82, 0x9c,
+ 0x61, 0x94, 0xf4, 0x25, 0xc9, 0xb5, 0x1a, 0x6d, 0x0c, 0xb4, 0xcf, 0x52,
+ 0x5e, 0x87, 0x5e, 0x55, 0xda, 0x85, 0xf6, 0x82, 0x36, 0xfe, 0x8e, 0x3f,
+ 0xf6, 0x06, 0xf8, 0xef, 0xfe, 0x3f, 0x36, 0xc8, 0xf1, 0x7a, 0xb0, 0xb3,
+ 0x73, 0x73, 0x73, 0x33, 0x12, 0x24, 0xf9, 0x91, 0x39, 0xb2, 0xcf, 0xc2,
+ 0x7a, 0x1f, 0xa0, 0x2f, 0xf5, 0x7c, 0xe0, 0x3c, 0xd9, 0xc8, 0x17, 0x97,
+ 0x7f, 0xde, 0x1b, 0xee, 0xed, 0xee, 0xee, 0xfe, 0x3c, 0x5a, 0x62, 0x8b,
+ 0x2f, 0x68, 0x58, 0xf3, 0x5f, 0x7f, 0xd8, 0x1d, 0x9e, 0xc9, 0x4e, 0x14,
+ 0xd0, 0x4e, 0x36, 0xd2, 0x22, 0x37, 0x14, 0x0c, 0x4a, 0xce, 0x84, 0x7c,
+ 0xe0, 0x31, 0x19, 0x8e, 0x1f, 0xa5, 0xfd, 0xd5, 0xb3, 0xdc, 0x1f, 0x08,
+ 0xce, 0xd3, 0x27, 0x8f, 0xf6, 0xf7, 0x13, 0x56, 0x39, 0xb8, 0x28, 0x85,
+ 0x43, 0x98, 0xa8, 0x47, 0x96, 0x06, 0xaa, 0x2c, 0xcb, 0xa6, 0x80, 0x65,
+ 0xaa, 0xb8, 0x3f, 0x63, 0x79, 0xd1, 0x93, 0xc8, 0xc5, 0x11, 0x43, 0x23,
+ 0x28, 0x81, 0x12, 0x57, 0xce, 0xee, 0xdc, 0xc0, 0x86, 0xca, 0x2b, 0xf0,
+ 0x56, 0xee, 0x75, 0xd6, 0x08, 0xc4, 0x04, 0xb4, 0x95, 0x88, 0xd6, 0x66,
+ 0x0b, 0x4c, 0x48, 0xc8, 0x11, 0x08, 0x60, 0x51, 0x4a, 0x1b, 0x4f, 0x8a,
+ 0xd7, 0x5d, 0xac, 0x2a, 0xe9, 0xe1, 0x40, 0xe1, 0xcd, 0x9b, 0xf4, 0xae,
+ 0x25, 0xec, 0xcd, 0x8e, 0xbf, 0x30, 0xff, 0xe9, 0x6b, 0xbc, 0x9d, 0x6a,
+ 0x0f, 0xca, 0x8b, 0xac, 0x99, 0x5e, 0x05, 0x98, 0xb6, 0xc4, 0xbe, 0xa1,
+ 0xba, 0x5f, 0x99, 0xd5, 0x58, 0xc8, 0xd8, 0xbe, 0xfe, 0x56, 0xae, 0x1a,
+ 0xcf, 0x0c, 0x0a, 0x34, 0x73, 0xca, 0x47, 0xe6, 0x76, 0xb7, 0xcc, 0x13,
+ 0x23, 0xca, 0x91, 0xa7, 0xd5, 0x61, 0x2a, 0xc8, 0x14, 0xcb, 0x6b, 0xad,
+ 0x16, 0x9c, 0x5e, 0x65, 0x0b, 0xe1, 0x97, 0x5b, 0x9a, 0x28, 0xb5, 0x21,
+ 0x44, 0xb8, 0x11, 0x8a, 0xb4, 0x8d, 0x0b, 0xf9, 0x8d, 0x59, 0xcc, 0xb6,
+ 0x54, 0xdb, 0x59, 0x29, 0x27, 0xad, 0x1e, 0x2e, 0x57, 0xb0, 0x1a, 0x27,
+ 0xa9, 0x88, 0x13, 0x2d, 0x03, 0xed, 0xcb, 0x67, 0x04, 0x4f, 0xcc, 0x2a,
+ 0x92, 0x62, 0xf0, 0xbf, 0x0c, 0x45, 0xf7, 0x11, 0xa1, 0x4a, 0x61, 0x65,
+ 0x73, 0x63, 0x5f, 0x1f, 0xbd, 0x3a, 0xa7, 0xd2, 0xb7, 0x01, 0x25, 0xc9,
+ 0x0f, 0xa8, 0xde, 0x2d, 0x6c, 0xc3, 0x71, 0x4a, 0xfe, 0x11, 0x22, 0x54,
+ 0x69, 0x52, 0x98, 0xba, 0xc4, 0x1a, 0x87, 0xb1, 0xaa, 0xd5, 0x2b, 0x5e,
+ 0x03, 0x95, 0x48, 0xc6, 0x60, 0x4b, 0x4b, 0xb4, 0xe9, 0x48, 0x8f, 0x9f,
+ 0x8c, 0x76, 0x79, 0x8d, 0xae, 0xc3, 0xa7, 0xd6, 0x67, 0x90, 0x1b, 0xa9,
+ 0x16, 0xb8, 0xcb, 0x34, 0x1e, 0x29, 0xb4, 0xd3, 0x19, 0x24, 0x8c, 0xed,
+ 0xca, 0x05, 0xd4, 0xfa, 0x5b, 0x2f, 0x47, 0x6a, 0xad, 0x66, 0xea, 0x37,
+ 0x5c, 0x07, 0x59, 0x76, 0x40, 0x39, 0x11, 0x14, 0x28, 0x6d, 0x6d, 0x95,
+ 0xa0, 0x2b, 0xc4, 0x8a, 0x64, 0x88, 0x26, 0x12, 0xf1, 0x60, 0x35, 0x59,
+ 0x31, 0x70, 0x9d, 0x35, 0x4a, 0x48, 0x01, 0x91, 0x58, 0x52, 0x75, 0xd0,
+ 0x6a, 0x44, 0x17, 0xd3, 0x4f, 0x82, 0x86, 0x25, 0xc3, 0xaf, 0xa5, 0x93,
+ 0x28, 0xeb, 0xc9, 0xb1, 0x82, 0x0f, 0x1c, 0xe5, 0xb6, 0xe6, 0xb6, 0xb1,
+ 0xdd, 0xaa, 0x0a, 0xe7, 0x08, 0xee, 0x42, 0x3e, 0xf6, 0xa6, 0xdb, 0x72,
+ 0xd6, 0x5c, 0xd1, 0x61, 0x88, 0x51, 0x37, 0xa5, 0x24, 0x88, 0x3b, 0xdb,
+ 0x19, 0x29, 0x95, 0x15, 0x12, 0x25, 0x90, 0xb1, 0x47, 0xfe, 0xa9, 0x8d,
+ 0x2f, 0xe0, 0x0e, 0xff, 0xf2, 0xe5, 0x46, 0xeb, 0x46, 0xc6, 0x7a, 0x73,
+ 0xd4, 0xcc, 0xdd, 0xda, 0x96, 0x8c, 0xf0, 0x34, 0xf0, 0xfd, 0xec, 0xb6,
+ 0x61, 0xb9, 0x7f, 0x41, 0xfd, 0x35, 0x8b, 0x47, 0xfb, 0x49, 0x7d, 0x67,
+ 0x94, 0x88, 0x85, 0xbf, 0x09, 0xdd, 0x76, 0xaa, 0xd1, 0x20, 0x40, 0xab,
+ 0x0f, 0x11, 0xf3, 0xad, 0xf7, 0x78, 0xe5, 0x25, 0xbd, 0x22, 0x9d, 0x4b,
+ 0x34, 0x4b, 0xe7, 0x01, 0x3d, 0x7a, 0x91, 0x25, 0xc9, 0x5c, 0x6c, 0x32,
+ 0x4f, 0x8b, 0x8f, 0x36, 0x9d, 0x92, 0x47, 0x1a, 0xa0, 0xf9, 0x1d, 0xd7,
+ 0x8f, 0xb9, 0x1f, 0x4a, 0xda, 0x0e, 0x49, 0xc6, 0xa0, 0x47, 0x0c, 0xf4,
+ 0xd2, 0x45, 0x5a, 0xa1, 0xb0, 0x88, 0xf6, 0x4c, 0x52, 0x1e, 0x7b, 0xdb,
+ 0x00, 0x53, 0xc3, 0x58, 0xdb, 0x31, 0x36, 0x14, 0x61, 0x44, 0x50, 0x9c,
+ 0x15, 0x69, 0xf3, 0x46, 0x7b, 0xfa, 0xdd, 0xfc, 0x76, 0x51, 0xc5, 0x95,
+ 0x9e, 0x84, 0xe1, 0xda, 0xe6, 0xbf, 0x07, 0x1a, 0xfa, 0xe8, 0xe3, 0xdf,
+ 0x56, 0x7a, 0xd8, 0x96, 0xae, 0x36, 0x58, 0xe2, 0x37, 0xe9, 0x63, 0xf5,
+ 0xce, 0x05, 0x69, 0x62, 0xb1, 0xc5, 0x51, 0x72, 0xe2, 0xcc, 0xc9, 0x62,
+ 0x40, 0x40, 0x98, 0x4d, 0x35, 0x15, 0x63, 0x92, 0xfe, 0x3e, 0xd4, 0x5e,
+ 0xdb, 0xb1, 0x1d, 0xa0, 0x9e, 0x35, 0x48, 0x86, 0xba, 0xb3, 0x62, 0xa0,
+ 0x35, 0xbb, 0x81, 0xe2, 0x97, 0x30, 0x9f, 0x33, 0x1b, 0x8b, 0xa6, 0x69,
+ 0x1c, 0xc4, 0x4c, 0x83, 0x7c, 0x4c, 0x5e, 0x44, 0xbc, 0x5b, 0x0e, 0x87,
+ 0x34, 0x6d, 0x9b, 0x3c, 0xf7, 0x78, 0x2d, 0x71, 0xcc, 0xb9, 0x91, 0x8b,
+ 0x1c, 0x71, 0x76, 0x68, 0xd7, 0x86, 0xa5, 0x95, 0xc5, 0x20, 0x40, 0x75,
+ 0x41, 0xd4, 0x90, 0x3d, 0x4e, 0xc8, 0x04, 0x5a, 0x48, 0x77, 0x52, 0xdb,
+ 0xe2, 0x30, 0xe5, 0xf7, 0x94, 0x36, 0xfd, 0x2f, 0xdf, 0xd3, 0x48, 0x91,
+ 0x3b, 0x1d, 0xe8, 0x61, 0x18, 0x2a, 0x1c, 0x70, 0x01, 0x4f, 0xb0, 0xa4,
+ 0x93, 0x42, 0x6f, 0xa4, 0x80, 0xcc, 0xe4, 0x5c, 0x3e, 0x59, 0xfb, 0x36,
+ 0xe6, 0x15, 0x5a, 0x52, 0x78, 0xfe, 0x0f, 0x41, 0xea, 0x31, 0xea, 0x66,
+ 0xa0, 0x2f, 0xe3, 0x36, 0x52, 0xf2, 0x91, 0xd9, 0x61, 0x68, 0x2a, 0x14,
+ 0xc5, 0x47, 0x8e, 0x94, 0x4b, 0x49, 0x84, 0x3e, 0x91, 0x15, 0x6c, 0xd5,
+ 0x97, 0x16, 0x71, 0xc9, 0x9c, 0x4f, 0x88, 0x98, 0x36, 0x63, 0x40, 0xcd,
+ 0x5a, 0x5b, 0x3a, 0xda, 0xf6, 0xad, 0x97, 0x22, 0x47, 0x6a, 0x24, 0x78,
+ 0x19, 0x8e, 0xc6, 0x68, 0xfb, 0xd8, 0x20, 0xdb, 0x45, 0x3d, 0xd2, 0x32,
+ 0x83, 0x57, 0x2a, 0x08, 0xe1, 0x77, 0x3e, 0xd0, 0xa7, 0xb9, 0x0b, 0xd7,
+ 0x39, 0xef, 0x3d, 0x43, 0x18, 0x4d, 0xaa, 0x3c, 0xbb, 0x80, 0x06, 0x42,
+ 0x2b, 0x92, 0xcc, 0xb1, 0xc0, 0x6b, 0x94, 0xa5, 0x15, 0x89, 0x3f, 0x28,
+ 0x07, 0x28, 0x1b, 0xcc, 0xc9, 0x73, 0xc4, 0x3c, 0xd1, 0x76, 0x1a, 0x61,
+ 0x08, 0x5d, 0x54, 0x48, 0xd1, 0x22, 0x52, 0xad, 0x64, 0x88, 0x66, 0x65,
+ 0x51, 0x97, 0x59, 0xf1, 0x78, 0x82, 0xba, 0x0a, 0xdc, 0x62, 0xdb, 0xa9,
+ 0x8a, 0xbe, 0xc8, 0x6c, 0x55, 0xb4, 0x1b, 0xaf, 0xd9, 0x49, 0x1c, 0xaf,
+ 0x15, 0xbb, 0xf4, 0x5d, 0x56, 0x19, 0xf9, 0x57, 0xd6, 0xc9, 0xf7, 0x4f,
+ 0x34, 0xf9, 0x4a, 0xfa, 0xed, 0x8a, 0x2a, 0x62, 0x4b, 0xdd, 0x28, 0x49,
+ 0x98, 0xa7, 0x1e, 0x84, 0x2f, 0x38, 0x65, 0x9b, 0xb9, 0x97, 0xbe, 0x2e,
+ 0x0a, 0x09, 0x1b, 0xe9, 0x45, 0xf7, 0xca, 0x99, 0x9f, 0x18, 0xf2, 0x43,
+ 0x9f, 0xf3, 0x68, 0x6f, 0x15, 0xd7, 0x22, 0xd3, 0x68, 0x57, 0x20, 0x16,
+ 0xf8, 0xf2, 0xcc, 0x59, 0x4e, 0x1a, 0x52, 0x72, 0x8c, 0x74, 0xb2, 0x13,
+ 0x4f, 0xce, 0x73, 0xb8, 0x7b, 0x24, 0xb5, 0x20, 0x54, 0x01, 0x39, 0x41,
+ 0x59, 0xd4, 0x1a, 0x87, 0x0a, 0xdc, 0x09, 0x0c, 0x43, 0x8f, 0xac, 0xaf,
+ 0xa0, 0x89, 0x41, 0x43, 0x20, 0x23, 0xbf, 0x47, 0xbd, 0x67, 0xf9, 0xf8,
+ 0xee, 0xfc, 0xf8, 0xad, 0x98, 0xce, 0x8e, 0xcd, 0x89, 0x56, 0xe3, 0xcc,
+ 0x62, 0x61, 0x3b, 0x4c, 0x55, 0x61, 0x25, 0xb0, 0x6e, 0x86, 0x16, 0x15,
+ 0x71, 0x1d, 0x3a, 0xb6, 0x6d, 0x20, 0x49, 0x08, 0x95, 0x94, 0xab, 0x88,
+ 0xd1, 0xa5, 0x9b, 0x1a, 0xf1, 0x64, 0x83, 0x08, 0x6b, 0x3a, 0x7b, 0x72,
+ 0x95, 0x18, 0x89, 0x62, 0x18, 0x8d, 0xd7, 0x59, 0x2b, 0xe4, 0x58, 0xa5,
+ 0xcd, 0x94, 0x49, 0xbc, 0x2f, 0xf3, 0x4a, 0xc0, 0x62, 0x18, 0x0d, 0x3c,
+ 0x79, 0x5d, 0xde, 0x14, 0xc3, 0x63, 0x54, 0x1d, 0x26, 0xc7, 0xe5, 0xa5,
+ 0xd9, 0xaa, 0x77, 0xa4, 0xb0, 0x74, 0x4f, 0xed, 0xfd, 0xe9, 0xbb, 0x64,
+ 0x0b, 0x72, 0x37, 0x39, 0xb5, 0x48, 0x53, 0x78, 0x72, 0x5b, 0xec, 0x8b,
+ 0x9a, 0x75, 0x12, 0x99, 0xcd, 0x20, 0x39, 0xfc, 0xf1, 0xe5, 0xdb, 0xd3,
+ 0xe3, 0xc3, 0x9f, 0xd8, 0xc4, 0x08, 0x96, 0x83, 0x1f, 0x7f, 0xe5, 0xd9,
+ 0x5c, 0x14, 0xa1, 0x41, 0xa6, 0x90, 0x99, 0x47, 0x14, 0x66, 0x82, 0xe9,
+ 0x93, 0x59, 0xa3, 0x92, 0xe0, 0x78, 0x7c, 0x7a, 0x34, 0x54, 0x98, 0x28,
+ 0xee, 0xc5, 0x96, 0x17, 0x30, 0x90, 0x48, 0x1e, 0x09, 0x8c, 0xfb, 0x77,
+ 0x61, 0x30, 0x4a, 0x6f, 0xc4, 0x20, 0x79, 0xa7, 0x09, 0x48, 0x03, 0x3a,
+ 0x71, 0x5c, 0xc1, 0xd7, 0xf9, 0x25, 0x05, 0x94, 0x3a, 0xc9, 0x33, 0x20,
+ 0x0e, 0x9a, 0xc2, 0x34, 0x48, 0xe2, 0xa7, 0x16, 0x3a, 0x0e, 0x23, 0xab,
+ 0xce, 0xe6, 0xec, 0xbe, 0xec, 0x95, 0x90, 0xc4, 0x0c, 0xe8, 0x18, 0x91,
+ 0x1d, 0x1e, 0x84, 0xca, 0x24, 0x5b, 0x7c, 0x72, 0xe7, 0xf7, 0xee, 0xb1,
+ 0x34, 0xc2, 0x72, 0x41, 0xb4, 0x09, 0xcb, 0xf6, 0x0f, 0x92, 0x8d, 0xe1,
+ 0x2a, 0x39, 0xd8, 0xf8, 0x84, 0x2a, 0x82, 0xef, 0xe9, 0x8d, 0xb4, 0x02,
+ 0x91, 0x78, 0x99, 0xba, 0x82, 0x19, 0x9d, 0x81, 0xfd, 0xd5, 0xea, 0x6d,
+ 0x63, 0x8f, 0xb9, 0xb9, 0xea, 0x22, 0x7d, 0xa9, 0x20, 0xe5, 0x32, 0x02,
+ 0xe2, 0x50, 0x10, 0x5f, 0xca, 0x38, 0x6e, 0x6a, 0x34, 0x54, 0x74, 0x49,
+ 0x67, 0x37, 0x3e, 0x58, 0xfc, 0x06, 0xc5, 0x26, 0xc5, 0x82, 0x2a, 0x67,
+ 0x1b, 0xe8, 0x1c, 0x4e, 0x31, 0x88, 0x1a, 0x79, 0xa7, 0xe1, 0x70, 0xb4,
+ 0x57, 0x9b, 0x7f, 0xdc, 0x94, 0xf8, 0xea, 0x86, 0x28, 0x55, 0xe0, 0xd5,
+ 0x1b, 0xac, 0xc0, 0x42, 0x31, 0xc6, 0xec, 0xcd, 0x8d, 0xdf, 0x7c, 0xb1,
+ 0xa9, 0x70, 0xf9, 0xfa, 0x64, 0x97, 0xe1, 0xd0, 0x7b, 0x12, 0xe2, 0x53,
+ 0xb5, 0x5a, 0x4e, 0x5f, 0x32, 0x4a, 0x8d, 0xd4, 0x9c, 0x65, 0x24, 0xbc,
+ 0xb9, 0x2b, 0x16, 0x23, 0xbb, 0x71, 0x08, 0xb1, 0xab, 0x72, 0xb4, 0x66,
+ 0x2e, 0x73, 0xfd, 0x77, 0x9d, 0xab, 0xd7, 0x39, 0x12, 0x41, 0x09, 0xd7,
+ 0xc1, 0x68, 0xc2, 0xcd, 0x07, 0xfb, 0xf4, 0x21, 0x8a, 0x7b, 0x91, 0x71,
+ 0x4c, 0x9a, 0x70, 0xb4, 0x70, 0x68, 0xd0, 0xa9, 0xc8, 0xa1, 0xb8, 0x56,
+ 0xe8, 0xbe, 0x6c, 0x2c, 0x8e, 0x21, 0x46, 0xde, 0xac, 0xd0, 0x9c, 0x82,
+ 0xdb, 0x3a, 0xa3, 0xeb, 0x55, 0xdf, 0x4d, 0x55, 0xd7, 0xae, 0xa3, 0x3c,
+ 0x96, 0xb6, 0x9a, 0x17, 0x0d, 0x75, 0x82, 0x1e, 0x14, 0x75, 0x40, 0x6c,
+ 0xbb, 0x41, 0x88, 0x61, 0xc1, 0x8d, 0x73, 0x14, 0x32, 0xdf, 0x46, 0x9f,
+ 0xda, 0xb1, 0x52, 0x2d, 0x0e, 0x8c, 0x62, 0x67, 0x7b, 0x45, 0x76, 0xed,
+ 0xde, 0x4c, 0xe2, 0xcb, 0x26, 0x50, 0xf1, 0xfe, 0x6a, 0x26, 0xda, 0x26,
+ 0xb7, 0x4f, 0x41, 0x3d, 0x98, 0x0b, 0x86, 0xd8, 0xf9, 0xc5, 0xd3, 0xde,
+ 0xa2, 0x61, 0x91, 0xef, 0xe5, 0x56, 0xd5, 0xa1, 0x9d, 0xf5, 0x5a, 0x02,
+ 0x67, 0x7e, 0x3c, 0x4a, 0x0a, 0x84, 0xd8, 0x71, 0x28, 0x36, 0x8a, 0x86,
+ 0xe7, 0x35, 0x69, 0x20, 0x27, 0xef, 0x7e, 0x3d, 0x8a, 0xb7, 0x16, 0xa7,
+ 0x26, 0x0b, 0x1c, 0xb2, 0x93, 0x15, 0xb1, 0x87, 0x9d, 0xa2, 0x69, 0x3a,
+ 0x04, 0x72, 0x2f, 0xe9, 0x3e, 0xe8, 0xd8, 0x91, 0xd0, 0x2a, 0x49, 0x8f,
+ 0x47, 0x15, 0xb7, 0x5e, 0xbe, 0xc3, 0x93, 0x55, 0x5a, 0x71, 0x53, 0xd2,
+ 0xe2, 0xa3, 0xe6, 0x8e, 0x61, 0xe4, 0xec, 0x36, 0x9b, 0xae, 0x9a, 0x76,
+ 0xe1, 0x8b, 0x37, 0x27, 0x81, 0x73, 0xa1, 0x29, 0x6d, 0xd1, 0x45, 0x50,
+ 0x63, 0xf4, 0x54, 0xb1, 0x38, 0x0e, 0x36, 0xb6, 0x35, 0x88, 0x9b, 0x8a,
+ 0x0e, 0xcf, 0xbf, 0x88, 0xc5, 0x67, 0x75, 0xca, 0x55, 0xc6, 0x1e, 0x55,
+ 0x97, 0xaa, 0x10, 0xfd, 0xbc, 0xa1, 0xd1, 0x2a, 0xfa, 0xf5, 0x37, 0xec,
+ 0x7b, 0xf3, 0x3e, 0x6e, 0x7b, 0x91, 0x89, 0x5b, 0xae, 0x0e, 0xae, 0x72,
+ 0xf0, 0x65, 0x6a, 0xca, 0x6a, 0x18, 0x94, 0x6d, 0xa8, 0xac, 0xaf, 0xea,
+ 0xe6, 0x07, 0xee, 0xd0, 0xa3, 0xd3, 0xeb, 0xa7, 0x9e, 0x37, 0x1b, 0x12,
+ 0x8f, 0x7e, 0x64, 0x39, 0x7e, 0xb0, 0x8a, 0x8f, 0xd5, 0xe4, 0xb1, 0xf9,
+ 0xe3, 0x3b, 0xfc, 0x71, 0xc1, 0x7e, 0x01, 0x81, 0xd2, 0x62, 0x3f, 0x6c,
+ 0x48, 0xda, 0x28, 0x85, 0x4e, 0xfc, 0x7a, 0x6a, 0xaa, 0x6b, 0x40, 0x79,
+ 0x12, 0x70, 0xb7, 0x1c, 0x04, 0x0a, 0x59, 0x35, 0x3a, 0xcc, 0x80, 0x4b,
+ 0x06, 0xc3, 0x20, 0xa5, 0xfc, 0x8f, 0x70, 0xa2, 0x18, 0x87, 0x69, 0x40,
+ 0x3e, 0xa7, 0x31, 0x37, 0x8c, 0x2b, 0x63, 0x55, 0x63, 0x66, 0xab, 0xfe,
+ 0x86, 0x40, 0x85, 0xad, 0x5f, 0xa5, 0x8e, 0xe0, 0x0b, 0x5b, 0x28, 0x00,
+ 0x02, 0x74, 0x09, 0x1d, 0xec, 0x9e, 0xc6, 0x45, 0x63, 0x7e, 0x96, 0xf7,
+ 0x4c, 0xa1, 0x7f, 0xc9, 0x24, 0xdd, 0xe5, 0x8f, 0x10, 0x6a, 0xb2, 0xff,
+ 0xbd, 0xd7, 0x54, 0x33, 0xc9, 0x37, 0x5e, 0xbb, 0x34, 0x41, 0x61, 0xd3,
+ 0xa3, 0x76, 0x55, 0xe3, 0xfc, 0xa8, 0xe5, 0x0e, 0xac, 0x96, 0xf4, 0xcc,
+ 0x73, 0xc1, 0x4d, 0xb1, 0x80, 0xb5, 0x4f, 0x6c, 0xe1, 0x23, 0xfb, 0x64,
+ 0x90, 0xd2, 0x94, 0x2d, 0x10, 0xfa, 0xb2, 0x92, 0x91, 0xc1, 0x7b, 0xa0,
+ 0x59, 0xe1, 0x73, 0xc3, 0xf8, 0x70, 0x33, 0x68, 0x6f, 0x90, 0xb2, 0x9c,
+ 0xbe, 0xf5, 0x6f, 0x41, 0xb4, 0xb3, 0xbe, 0x2b, 0xa6, 0x57, 0xaf, 0xdf,
+ 0x8d, 0xe3, 0xaf, 0x77, 0x17, 0x47, 0x4f, 0x1b, 0x2d, 0x04, 0xb4, 0xc0,
+ 0x26, 0xa7, 0x60, 0xd7, 0xc1, 0x7d, 0xf6, 0xd2, 0xfb, 0x6d, 0x7c, 0xb8,
+ 0xf6, 0x2b, 0xd6, 0x15, 0x08, 0xcd, 0x82, 0xb9, 0xb8, 0x28, 0x9e, 0x94,
+ 0x1f, 0x3e, 0x4c, 0x71, 0x17, 0xd8, 0xeb, 0x11, 0x1f, 0xae, 0xb9, 0x42,
+ 0xb4, 0x88, 0xda, 0x42, 0xd3, 0x88, 0x95, 0x97, 0x80, 0xd6, 0xa5, 0x6b,
+ 0x6a, 0xb3, 0xa1, 0x7f, 0xfc, 0x92, 0x63, 0x3e, 0x46, 0x67, 0xf1, 0x48,
+ 0x70, 0x31, 0xd8, 0x21, 0x1b, 0xa7, 0x71, 0xb1, 0x5f, 0x43, 0xaa, 0x73,
+ 0xbc, 0xce, 0x54, 0x3a, 0x10, 0x62, 0xa5, 0x1f, 0x55, 0x7d, 0x4b, 0x32,
+ 0x7b, 0xb2, 0xff, 0xcd, 0xd7, 0xa1, 0xf4, 0x7c, 0xfd, 0xae, 0xe7, 0x73,
+ 0xf8, 0xcd, 0x50, 0x6b, 0x88, 0x44, 0x23, 0xf0, 0x14, 0xfa, 0x70, 0x2f,
+ 0x04, 0x00, 0x35, 0x3e, 0x01, 0x45, 0x47, 0xbd, 0x87, 0x4b, 0x00, 0x16,
+ 0x9a, 0xff, 0x58, 0xfb, 0xa0, 0x64, 0x33, 0xc7, 0x3f, 0xc5, 0x29, 0xe2,
+ 0x9c, 0xe1, 0x97, 0x9c, 0x71, 0x14, 0xf7, 0x54, 0x14, 0xe1, 0xed, 0x75,
+ 0x67, 0x14, 0x1f, 0x0e, 0xfc, 0x2d, 0x06, 0x44, 0x03, 0xb6, 0xb0, 0xcf,
+ 0x7f, 0xec, 0xec, 0xdb, 0xd4, 0x34, 0x5b, 0x08, 0x46, 0xd7, 0xd4, 0x48,
+ 0xf0, 0x50, 0x41, 0x28, 0xf2, 0xdb, 0x31, 0xe5, 0x13, 0xf4, 0x50, 0x33,
+ 0x25, 0x1e, 0x70, 0xc6, 0x81, 0x9d, 0x1c, 0xe6, 0xa9, 0x9a, 0x58, 0x74,
+ 0x26, 0x63, 0x76, 0xdf, 0xdd, 0x47, 0x4c, 0x79, 0x24, 0x9b, 0x6e, 0x1d,
+ 0xda, 0xde, 0x5b, 0xa3, 0x24, 0x41, 0xb8, 0x3e, 0x98, 0x48, 0xf5, 0x85,
+ 0x64, 0x6b, 0x62, 0xc4, 0xb5, 0x07, 0x9e, 0xc1, 0x2a, 0xf6, 0x63, 0x4e,
+ 0xde, 0x8f, 0x0f, 0xf7, 0xe4, 0xf3, 0x27, 0x8f, 0xb7, 0xb7, 0x5d, 0x86,
+ 0x3b, 0x27, 0xc8, 0x4c, 0xa8, 0x0c, 0x23, 0x07, 0xe7, 0xe2, 0x66, 0xb0,
+ 0x66, 0x8b, 0xaf, 0x88, 0x31, 0x58, 0x9f, 0x51, 0x7c, 0x38, 0xc8, 0x31,
+ 0x7d, 0x0f, 0x87, 0x08, 0x13, 0x9c, 0x18, 0xba, 0x35, 0x84, 0x21, 0x6c,
+ 0x32, 0x7e, 0xc0, 0xc6, 0x5c, 0x7a, 0xb9, 0x02, 0x39, 0x52, 0x9c, 0x87,
+ 0x11, 0x8e, 0x25, 0x0e, 0x17, 0xa7, 0x2a, 0x69, 0xc3, 0x44, 0xd0, 0x53,
+ 0x16, 0x7b, 0xf4, 0x07, 0x95, 0x3c, 0x5d, 0x69, 0x83, 0xca, 0xd3, 0xd5,
+ 0x64, 0x6e, 0x64, 0xd0, 0x18, 0x1d, 0xb5, 0x6f, 0x93, 0xe3, 0x5c, 0x3a,
+ 0x8d, 0xb2, 0x0e, 0x2e, 0xc9, 0x0d, 0x7d, 0x32, 0x87, 0xd6, 0xdd, 0x26,
+ 0x34, 0xc9, 0xf5, 0x74, 0x65, 0x9b, 0xa2, 0xb5, 0x25, 0x1b, 0x4b, 0xfe,
+ 0x10, 0x7a, 0x77, 0x0f, 0xfb, 0x16, 0x76, 0x9b, 0xd5, 0xa1, 0x19, 0xf7,
+ 0x16, 0x71, 0x5b, 0x23, 0xb0, 0x1f, 0x7c, 0xf4, 0xb6, 0xa5, 0x67, 0x3b,
+ 0x65, 0xd7, 0xea, 0x9d, 0x37, 0xd0, 0x3b, 0x09, 0x7a, 0x03, 0xb1, 0x8c,
+ 0xe4, 0x05, 0x6b, 0x98, 0xfd, 0x3d, 0x1e, 0xb5, 0x04, 0xda, 0xd7, 0x45,
+ 0x49, 0xab, 0x27, 0xbf, 0x7f, 0x7a, 0x81, 0xbc, 0x64, 0x4e, 0xc2, 0x9c,
+ 0x67, 0xd4, 0xa6, 0x1e, 0xfc, 0x31, 0xc4, 0x22, 0xa8, 0xd8, 0x3f, 0xc9,
+ 0x63, 0x88, 0xef, 0x43, 0x3c, 0xf8, 0x94, 0x5b, 0x97, 0x12, 0x96, 0x0a,
+ 0x7b, 0x81, 0x18, 0xc3, 0x83, 0x7d, 0x5e, 0x86, 0x76, 0x6e, 0x03, 0x9e,
+ 0x20, 0x29, 0xb5, 0xc5, 0x5d, 0xe2, 0xc5, 0x79, 0xb4, 0xc8, 0xba, 0x6e,
+ 0x7d, 0x29, 0x70, 0xdd, 0xa0, 0xe6, 0x32, 0xd0, 0x49, 0x1a, 0xb2, 0x89,
+ 0x37, 0x78, 0x46, 0x1b, 0x54, 0x54, 0xaa, 0xf1, 0x73, 0xca, 0xbe, 0x52,
+ 0xab, 0x81, 0xf5, 0x6e, 0x1d, 0x5b, 0x3c, 0x94, 0x69, 0x24, 0xa6, 0xae,
+ 0x73, 0xdc, 0xf8, 0x4a, 0x33, 0xb9, 0x36, 0x34, 0x05, 0xa0, 0xd3, 0x78,
+ 0x57, 0xc6, 0x94, 0x21, 0x23, 0x75, 0xd6, 0x9c, 0x16, 0x41, 0x1d, 0x83,
+ 0x71, 0x6a, 0x66, 0xc8, 0xe1, 0x46, 0x54, 0xa1, 0xb5, 0x1b, 0x00, 0x84,
+ 0x53, 0x32, 0x6f, 0x5b, 0x66, 0x9f, 0x7e, 0xc2, 0x45, 0xfd, 0x90, 0xde,
+ 0xdd, 0xe4, 0xcd, 0x2a, 0x64, 0xba, 0x13, 0x45, 0x05, 0xa4, 0xba, 0x74,
+ 0x12, 0xd3, 0x38, 0x0c, 0x57, 0x3c, 0x4e, 0x66, 0x1e, 0x12, 0x3e, 0xd1,
+ 0x4a, 0xae, 0xb6, 0x3c, 0x02, 0xce, 0xcf, 0x79, 0x79, 0x13, 0x64, 0x88,
+ 0xc3, 0xc2, 0xb0, 0xb3, 0x6b, 0x97, 0xfe, 0x98, 0xb7, 0x7f, 0xff, 0x77,
+ 0xfd, 0xe5, 0x07, 0xec, 0xd4, 0x3f, 0x74, 0xa7, 0x34, 0xe9, 0x2e, 0x0d,
+ 0x8a, 0xa3, 0xc9, 0xb6, 0x4e, 0x7e, 0x4f, 0xbb, 0xf2, 0x17, 0x64, 0x35,
+ 0xf1, 0xd6, 0x00, 0x97, 0x84, 0x06, 0xfc, 0xfd, 0xc8, 0xea, 0xd1, 0x32,
+ 0x48, 0x8a, 0x6a, 0x4f, 0x52, 0xf6, 0x27, 0x77, 0x81, 0x4b, 0x0a, 0x64,
+ 0xf8, 0x53, 0x31, 0x20, 0x80, 0x55, 0x63, 0xd2, 0xa5, 0xd4, 0x4e, 0x1e,
+ 0xad, 0x02, 0xf9, 0x14, 0x7f, 0xaa, 0x04, 0x65, 0xc4, 0xd8, 0x32, 0x66,
+ 0xe6, 0x30, 0xf4, 0xf8, 0xe7, 0x71, 0xc3, 0x42, 0x93, 0x5a, 0xc4, 0x9b,
+ 0xd2, 0x02, 0x9e, 0x31, 0xe3, 0xa0, 0x01, 0xae, 0x1a, 0xe2, 0x13, 0xc5,
+ 0x7c, 0xa0, 0xa9, 0x86, 0xcd, 0xb2, 0x19, 0x99, 0x41, 0x20, 0x41, 0xf4,
+ 0x65, 0x6e, 0xd5, 0x64, 0x73, 0x34, 0x7e, 0xff, 0x77, 0x4e, 0x04, 0xfc,
+ 0x47, 0xa8, 0xfb, 0x9e, 0x9c, 0x1f, 0x1e, 0xd0, 0x94, 0x7e, 0x3f, 0xac,
+ 0xef, 0x16, 0x93, 0x72, 0x2e, 0x17, 0x0f, 0x9b, 0x6f, 0x36, 0x50, 0x7f,
+ 0xc6, 0x54, 0x42, 0xb1, 0xba, 0xa1, 0x07, 0x5b, 0x30, 0x88, 0x22, 0xd2,
+ 0xc3, 0x0e, 0x2b, 0xa7, 0x53, 0xaa, 0x26, 0x43, 0xe1, 0x82, 0xb9, 0x79,
+ 0xbf, 0x4f, 0x14, 0x89, 0x80, 0xbb, 0xee, 0x49, 0x7f, 0x45, 0xf1, 0xa8,
+ 0x6a, 0x7f, 0xaa, 0x68, 0x08, 0x68, 0x3d, 0x1d, 0x5b, 0x9e, 0x1e, 0x05,
+ 0x7c, 0x00, 0xbf, 0x30, 0xd3, 0xfc, 0x40, 0xf5, 0x62, 0x62, 0xe6, 0xbe,
+ 0xe2, 0x9f, 0x0d, 0xcf, 0xe9, 0x67, 0x9a, 0x47, 0x23, 0x25, 0xc6, 0xc8,
+ 0xcc, 0x90, 0x1a, 0xe0, 0x41, 0x58, 0x96, 0x98, 0xc4, 0x52, 0xf3, 0xa8,
+ 0x53, 0x71, 0x11, 0x4a, 0x64, 0xbd, 0xd5, 0x1f, 0x32, 0x82, 0xe1, 0xcc,
+ 0xaf, 0xb3, 0xf5, 0xa3, 0x51, 0x5f, 0x0f, 0xc3, 0x98, 0x17, 0xa9, 0x24,
+ 0xb3, 0x71, 0xf6, 0x9a, 0xbd, 0x4f, 0x0a, 0x86, 0x44, 0xb9, 0xcd, 0xe6,
+ 0xb4, 0x47, 0xf7, 0x0d, 0x87, 0x3d, 0xd5, 0xaa, 0x0d, 0xc9, 0xfc, 0x81,
+ 0x7f, 0x2d, 0xbf, 0xb0, 0x1a, 0x46, 0x03, 0x44, 0x20, 0xa4, 0x1c, 0x61,
+ 0xe4, 0x7b, 0xd6, 0x5a, 0x6a, 0x88, 0x42, 0xd8, 0x16, 0x87, 0x2b, 0x4f,
+ 0x06, 0x89, 0x8b, 0x6e, 0x6b, 0x52, 0x5f, 0x82, 0x40, 0xf8, 0xfa, 0xe1,
+ 0x6c, 0x94, 0xdc, 0x86, 0xa6, 0x8e, 0xa8, 0x19, 0x69, 0xc9, 0xe9, 0x87,
+ 0x34, 0x4f, 0xd4, 0xb1, 0x2c, 0xe0, 0xb5, 0x8d, 0xc4, 0x99, 0x93, 0x08,
+ 0xb7, 0xa7, 0xe0, 0xe8, 0x7f, 0x7a, 0xd1, 0x76, 0x76, 0x6d, 0x0d, 0xbd,
+ 0x28, 0xbb, 0xd1, 0x45, 0x18, 0xea, 0x6e, 0xfd, 0x70, 0x9c, 0x7f, 0xff,
+ 0x74, 0xb4, 0xbb, 0x1d, 0x1c, 0x6a, 0xb3, 0xfc, 0x40, 0x7d, 0xaf, 0x3f,
+ 0x20, 0x4b, 0x95, 0xce, 0x4c, 0xa3, 0x0a, 0xf4, 0x03, 0xda, 0x59, 0xae,
+ 0x59, 0x5e, 0x2d, 0x31, 0x0e, 0x91, 0xf9, 0xbc, 0x64, 0x83, 0xed, 0xbe,
+ 0x65, 0xb4, 0xf3, 0x41, 0x7d, 0xe8, 0x8c, 0xad, 0x76, 0xe7, 0xa7, 0xc7,
+ 0xc1, 0xc4, 0x90, 0x80, 0xf2, 0x81, 0x22, 0xd7, 0x96, 0x98, 0x8c, 0xdc,
+ 0xcb, 0xaa, 0x7c, 0xea, 0xb7, 0x41, 0xa4, 0x07, 0x88, 0xa4, 0x18, 0x11,
+ 0x10, 0xa1, 0xec, 0x28, 0xf4, 0x69, 0xe7, 0x7f, 0xe4, 0xff, 0xf5, 0x42,
+ 0x56, 0x36, 0xdd, 0x91, 0x4e, 0xdb, 0x4c, 0x14, 0x99, 0x35, 0x2e, 0x03,
+ 0xe1, 0xe8, 0x9e, 0x75, 0x12, 0xb6, 0xf2, 0x3e, 0xa3, 0x54, 0xcd, 0xf3,
+ 0xb4, 0xb6, 0x13, 0xe4, 0x15, 0xb8, 0xde, 0xdf, 0x84, 0x28, 0x75, 0x15,
+ 0xc0, 0xd7, 0x26, 0x91, 0xa8, 0x11, 0xc7, 0x9a, 0x2e, 0xca, 0x51, 0xcf,
+ 0xce, 0x70, 0xe2, 0x70, 0x77, 0x67, 0xfa, 0x37, 0x84, 0xd7, 0x1c, 0x06,
+ 0x1f, 0xbb, 0x6e, 0x05, 0xde, 0xd8, 0x2d, 0x09, 0xe2, 0x91, 0x72, 0xbe,
+ 0xcd, 0xb7, 0x85, 0x68, 0xc1, 0x03, 0x8f, 0x22, 0x06, 0x73, 0xcf, 0xad,
+ 0xdd, 0x6a, 0x77, 0xbc, 0xec, 0x39, 0x67, 0x5b, 0x9d, 0xcf, 0x1c, 0x0d,
+ 0x3f, 0x4b, 0x5c, 0xc9, 0x3e, 0x27, 0xf7, 0x51, 0x5f, 0x76, 0xcb, 0x7a,
+ 0xe6, 0x77, 0x49, 0x14, 0x55, 0x7b, 0xcd, 0xe7, 0x9f, 0xec, 0x46, 0xe8,
+ 0x9f, 0xd2, 0x87, 0x3f, 0xe4, 0x4b, 0x8f, 0x67, 0x79, 0x5d, 0xe8, 0xa5,
+ 0x6c, 0x82, 0x73, 0x8c, 0x91, 0x72, 0xa1, 0xbd, 0x69, 0x38, 0x57, 0xe9,
+ 0xde, 0xcd, 0x9c, 0x52, 0xf5, 0x71, 0xc2, 0x0e, 0x01, 0xbf, 0x40, 0xdc,
+ 0xd8, 0xb7, 0xa2, 0xa5, 0x89, 0x83, 0xe0, 0xe8, 0xf4, 0xfa, 0x71, 0x18,
+ 0x88, 0x4a, 0x22, 0xee, 0x32, 0x7f, 0x49, 0xfb, 0xcf, 0x7b, 0x97, 0xc4,
+ 0x38, 0xfa, 0xb2, 0x24, 0x5e, 0x80, 0xdf, 0xfc, 0x42, 0x16, 0xa2, 0xeb,
+ 0xf0, 0x27, 0x7a, 0xcf, 0x92, 0xdc, 0x22, 0xee, 0x9d, 0x89, 0xf9, 0xd6,
+ 0x07, 0x8b, 0xcc, 0x6c, 0x64, 0x33, 0x7f, 0x1a, 0xdf, 0x36, 0x8a, 0x89,
+ 0xc3, 0x6c, 0xa6, 0xbe, 0xd1, 0x42, 0xa4, 0x3c, 0x95, 0xb8, 0x46, 0x9d,
+ 0x44, 0x14, 0xec, 0x0e, 0x7d, 0x3d, 0x8a, 0xce, 0x41, 0xfb, 0x4f, 0xd6,
+ 0x76, 0x0e, 0x66, 0x0a, 0xee, 0x87, 0x7c, 0x5d, 0x20, 0xfa, 0x2e, 0x4a,
+ 0xe9, 0x09, 0x6b, 0x67, 0x73, 0xcf, 0x1c, 0xf8, 0x0a, 0xdc, 0x3f, 0x0b,
+ 0xba, 0x46, 0x1f, 0xea, 0x7a, 0x0e, 0x52, 0xcf, 0x2f, 0xee, 0xcc, 0x94,
+ 0xea, 0x5e, 0xc8, 0x08, 0x5f, 0x80, 0xf2, 0x73, 0x7a, 0x5c, 0x9e, 0xc1,
+ 0xbc, 0x59, 0x93, 0x4f, 0x73, 0x99, 0x21, 0xfd, 0x86, 0x21, 0x81, 0xef,
+ 0x23, 0x46, 0xc8, 0x61, 0xfa, 0xbc, 0x0b, 0xf4, 0x09, 0x9f, 0xb0, 0xca,
+ 0xc2, 0x08, 0x3d, 0x99, 0xc5, 0x12, 0xbc, 0x87, 0x10, 0x5a, 0x23, 0x61,
+ 0x10, 0x17, 0xdd, 0x6e, 0x6f, 0x08, 0x0a, 0x11, 0x83, 0x0d, 0xd1, 0xdd,
+ 0xff, 0x40, 0x9a, 0x00, 0xc7, 0xa3, 0xb5, 0xeb, 0xb2, 0xed, 0x2b, 0x9e,
+ 0x0a, 0x6d, 0x68, 0x4c, 0x79, 0x78, 0x0c, 0x61, 0x38, 0x8f, 0x40, 0x1e,
+ 0x27, 0x91, 0x32, 0x7e, 0x6a, 0x71, 0x43, 0x39, 0xd8, 0xee, 0xa8, 0xb7,
+ 0x4a, 0xa9, 0x28, 0xe5, 0x7e, 0xe0, 0xf4, 0x8b, 0xa4, 0xd7, 0xc5, 0xea,
+ 0xd2, 0x3d, 0x9a, 0xed, 0x81, 0x6a, 0x75, 0xaa, 0xaa, 0x49, 0x8e, 0x0d,
+ 0xa1, 0xd6, 0x11, 0xe3, 0x9f, 0xa2, 0x1b, 0x04, 0x65, 0x9a, 0xa5, 0xeb,
+ 0x87, 0xd3, 0xe9, 0x48, 0x97, 0x24, 0xb2, 0xb6, 0x2e, 0x09, 0xd0, 0xa7,
+ 0xec, 0x90, 0x92, 0x11, 0x2a, 0x91, 0x9d, 0x83, 0x30, 0xb5, 0x2c, 0xeb,
+ 0xdc, 0xc9, 0xd7, 0x90, 0x71, 0xfd, 0x53, 0xd7, 0xbb, 0x87, 0x45, 0x75,
+ 0xb8, 0xd0, 0x7d, 0x82, 0x31, 0xca, 0x18, 0x64, 0x0d, 0xca, 0xa3, 0xbc,
+ 0x35, 0xf4, 0xf1, 0xa8, 0x4f, 0xc5, 0xa2, 0x24, 0xfb, 0xb5, 0x15, 0x37,
+ 0xa2, 0x64, 0x41, 0xf9, 0xc5, 0x56, 0xed, 0xc0, 0x53, 0x51, 0x2c, 0x37,
+ 0xb3, 0x11, 0x83, 0xed, 0x18, 0xbe, 0x52, 0x57, 0x8d, 0x33, 0x14, 0xec,
+ 0x8b, 0x2c, 0x0a, 0x47, 0xdf, 0x7b, 0x37, 0x00, 0x50, 0xf5, 0xc1, 0x62,
+ 0xf8, 0x73, 0xe0, 0x86, 0xda, 0x56, 0xa7, 0x0b, 0x23, 0xcf, 0x89, 0x19,
+ 0x30, 0xd4, 0x98, 0x63, 0x5c, 0xfa, 0x74, 0xc4, 0x47, 0x47, 0xa3, 0x49,
+ 0x18, 0x38, 0x59, 0x37, 0x9a, 0xd6, 0x08, 0xda, 0xa1, 0x28, 0x94, 0x7a,
+ 0xcf, 0x4d, 0x03, 0x06, 0x48, 0xf4, 0x8b, 0x7a, 0x89, 0x65, 0x4f, 0xf9,
+ 0x93, 0x6b, 0x56, 0xe0, 0x19, 0xef, 0xeb, 0xbf, 0xe8, 0xb3, 0x88, 0xf8,
+ 0xa7, 0x25, 0xfd, 0x3f, 0x79, 0xd8, 0xd6, 0x69, 0x06, 0x7b, 0x38, 0x16,
+ 0xda, 0x17, 0xb8, 0x73, 0xc0, 0x58, 0x29, 0x12, 0x09, 0x2e, 0xbd, 0x06,
+ 0x0b, 0xdc, 0xf4, 0xc2, 0xd9, 0x34, 0x86, 0x77, 0xd6, 0xab, 0x8a, 0x9b,
+ 0x8a, 0xdf, 0xaf, 0xe3, 0xa9, 0x07, 0xc9, 0x8e, 0x07, 0x48, 0xb9, 0x76,
+ 0xe7, 0x87, 0x9e, 0x59, 0xd9, 0x25, 0xd2, 0xe6, 0xea, 0xb4, 0xb4, 0xf0,
+ 0xe1, 0x37, 0x9a, 0x15, 0x8f, 0xf6, 0x90, 0x39, 0xfd, 0xb3, 0x72, 0xad,
+ 0x2b, 0xc9, 0x48, 0x54, 0x59, 0x09, 0xf3, 0x20, 0x66, 0xbf, 0x5e, 0x94,
+ 0xb5, 0xa4, 0xd5, 0xfd, 0x77, 0xb6, 0x4f, 0x94, 0xed, 0x45, 0x59, 0x08,
+ 0x23, 0xf9, 0xea, 0xff, 0xde, 0x40, 0x71, 0x26, 0x51, 0xb1, 0x2c, 0x73,
+ 0x90, 0x5c, 0x31, 0x10, 0xdb, 0xf2, 0x86, 0x6c, 0x4b, 0xe7, 0x87, 0x8c,
+ 0xd7, 0xdd, 0x26, 0x91, 0x0c, 0x74, 0x72, 0x5d, 0xa9, 0x53, 0x85, 0x8d,
+ 0x08, 0xf5, 0x8c, 0xb0, 0x6b, 0x64, 0xf4, 0x70, 0x86, 0xfc, 0xf4, 0x51,
+ 0x7c, 0x0d, 0x34, 0xa3, 0x4f, 0xbc, 0x86, 0x7e, 0xbf, 0xd0, 0x28, 0xf1,
+ 0xb1, 0x1c, 0xd7, 0x0f, 0x27, 0x79, 0xf2, 0xec, 0x4a, 0xf2, 0x5b, 0x15,
+ 0xb5, 0x00, 0x7b, 0xe1, 0x07, 0x4e, 0xd8, 0x59, 0x7b, 0x8f, 0xc5, 0x43,
+ 0x2f, 0x68, 0x62, 0x35, 0x17, 0x98, 0xb6, 0x2d, 0x87, 0xe8, 0x96, 0x41,
+ 0x28, 0x7c, 0x48, 0x97, 0x4b, 0x91, 0x36, 0xf7, 0x93, 0x7c, 0xc2, 0x70,
+ 0x6d, 0xdc, 0x9c, 0x13, 0xed, 0x61, 0x08, 0x18, 0xaf, 0x29, 0xcb, 0x8f,
+ 0xec, 0x54, 0xe5, 0x14, 0x6c, 0x14, 0x43, 0x86, 0xf8, 0xb0, 0x01, 0xc9,
+ 0xcf, 0xf5, 0xde, 0xec, 0x8c, 0xc7, 0xdf, 0xee, 0x64, 0xcd, 0x54, 0xa5,
+ 0xde, 0x8e, 0xcb, 0xfe, 0x13, 0xeb, 0xfb, 0x7e, 0x2d, 0x96, 0x24, 0x2f,
+ 0xf5, 0xe9, 0x02, 0xf1, 0x5b, 0xbf, 0xf6, 0x03, 0x68, 0x9f, 0x36, 0xa1,
+ 0x6d, 0x8b, 0x7e, 0x82, 0x65, 0x02, 0xe5, 0x56, 0x3f, 0xd2, 0x76, 0x29,
+ 0xd0, 0xa4, 0xb7, 0x18, 0x29, 0xd2, 0xd8, 0xa9, 0xf7, 0xdf, 0x6c, 0xb7,
+ 0xb8, 0xe8, 0x52, 0xe0, 0x5a, 0x41, 0xca, 0xcf, 0x6a, 0xf9, 0x5f, 0x72,
+ 0x9e, 0xe4, 0xd9, 0xe1, 0xd8, 0x2f, 0x25, 0x48, 0xdd, 0x3f, 0xe1, 0x25,
+ 0x7c, 0x18, 0xec, 0xa6, 0xb8, 0x7f, 0xc6, 0x0f, 0x9e, 0xf0, 0xc3, 0x66,
+ 0x2c, 0x81, 0x01, 0xf2, 0xa1, 0xe9, 0x24, 0x68, 0xce, 0xe4, 0x9e, 0x16,
+ 0x74, 0x5f, 0xd4, 0x04, 0x5c, 0xe6, 0xc5, 0x43, 0x9c, 0x7b, 0x36, 0x45,
+ 0x07, 0xfe, 0x56, 0x34, 0x96, 0xb6, 0x83, 0x4a, 0x02, 0x70, 0x2d, 0xb9,
+ 0xc2, 0x97, 0xe5, 0xbd, 0xb3, 0x4b, 0x05, 0x5e, 0x17, 0x62, 0xc1, 0x73,
+ 0xbe, 0x4f, 0x95, 0x7e, 0x90, 0xc7, 0x93, 0x4f, 0x57, 0xc8, 0x3f, 0x8e,
+ 0xf4, 0x99, 0x0d, 0xdc, 0x58, 0x46, 0xdf, 0xe3, 0x5a, 0xab, 0x6b, 0x84,
+ 0xe5, 0x7b, 0xce, 0xc2, 0xea, 0xf5, 0xf7, 0x6d, 0x36, 0x52, 0xaf, 0xe7,
+ 0x73, 0x6b, 0x07, 0xdc, 0x2b, 0x92, 0x8c, 0x38, 0x5b, 0xea, 0xf6, 0x80,
+ 0x2e, 0x88, 0x4c, 0x98, 0x4c, 0x07, 0x7a, 0x31, 0x06, 0xc9, 0x83, 0x49,
+ 0x81, 0x42, 0x0d, 0xba, 0xb5, 0x0e, 0x2c, 0x94, 0xce, 0x12, 0xb1, 0x76,
+ 0xfe, 0x65, 0x2a, 0x9e, 0x8a, 0x9b, 0xb4, 0xbe, 0x6f, 0x76, 0x29, 0xf7,
+ 0x97, 0xea, 0xec, 0x02, 0xe7, 0x11, 0xb5, 0x34, 0x0a, 0xca, 0x8e, 0x7a,
+ 0x90, 0x38, 0xcf, 0x05, 0x04, 0xcb, 0x86, 0xf6, 0xfc, 0xdd, 0xaa, 0x1d,
+ 0x7f, 0x7e, 0x80, 0xc0, 0x8b, 0x1a, 0xe4, 0x34, 0x55, 0x9a, 0xf9, 0xc3,
+ 0xaf, 0xcf, 0x27, 0xb8, 0xf0, 0x9c, 0xa2, 0x06, 0x95, 0xb4, 0x7b, 0x71,
+ 0x14, 0x62, 0xfd, 0xa1, 0xae, 0x10, 0xca, 0xd0, 0x57, 0x27, 0xb9, 0xcd,
+ 0x75, 0xeb, 0xb0, 0x08, 0x8e, 0xe9, 0xcc, 0xeb, 0xf2, 0x7e, 0x2d, 0x90,
+ 0x4e, 0xc0, 0x4b, 0x5f, 0x07, 0xa4, 0x36, 0x3b, 0x30, 0x8d, 0x1d, 0x84,
+ 0x8b, 0xd3, 0x28, 0xd1, 0xdc, 0xef, 0x52, 0x44, 0x73, 0xee, 0xe8, 0x01,
+ 0x88, 0x55, 0xd0, 0x36, 0x12, 0xc2, 0x5d, 0xb6, 0xf8, 0x90, 0x94, 0xb7,
+ 0x47, 0x29, 0xb6, 0x0f, 0x21, 0x22, 0x38, 0x3c, 0x23, 0x77, 0x95, 0xc0,
+ 0xca, 0xd5, 0x28, 0xe3, 0x2f, 0x53, 0x7d, 0xa6, 0x75, 0x9a, 0x66, 0x1c,
+ 0x7f, 0xc2, 0xeb, 0xae, 0x9c, 0x83, 0xac, 0x50, 0xe8, 0x93, 0xc3, 0xfb,
+ 0x5c, 0xed, 0x14, 0x94, 0x40, 0x54, 0x82, 0x72, 0x48, 0xa9, 0x39, 0x2d,
+ 0xc2, 0x12, 0x1a, 0xfe, 0x14, 0x9f, 0x84, 0xc2, 0x6b, 0x1f, 0xac, 0x1f,
+ 0x4e, 0x81, 0xf9, 0x3f, 0x21, 0xc6, 0xe2, 0x6d, 0x6a, 0xee, 0x40, 0xac,
+ 0x3e, 0xa0, 0x4e, 0x49, 0x0a, 0xb9, 0x66, 0x08, 0x1c, 0x30, 0x69, 0xf7,
+ 0xb1, 0x6c, 0xba, 0x5d, 0x93, 0xeb, 0x26, 0x52, 0x42, 0x62, 0xd4, 0x7a,
+ 0x8a, 0x6f, 0xb3, 0xb0, 0x30, 0x16, 0x75, 0x4a, 0xd5, 0x23, 0x38, 0xe5,
+ 0xec, 0xb6, 0xe1, 0xf8, 0x02, 0xfd, 0x0e, 0x73, 0xc9, 0x8d, 0x5e, 0x87,
+ 0x90, 0xb6, 0x83, 0x6f, 0x8c, 0x54, 0x55, 0x48, 0x1d, 0x2b, 0x7d, 0xcd,
+ 0xfa, 0xeb, 0x6e, 0x67, 0x97, 0xa3, 0xb2, 0xca, 0x21, 0x6f, 0x28, 0x91,
+ 0x53, 0x07, 0x03, 0xdd, 0x0f, 0x88, 0x9f, 0xc0, 0x7a, 0x8c, 0x0d, 0xa7,
+ 0x91, 0xb5, 0x24, 0xe1, 0xd0, 0x5a, 0x30, 0xf4, 0x82, 0xe8, 0x15, 0xbf,
+ 0xb3, 0xa3, 0x0a, 0x74, 0x42, 0xac, 0xbe, 0x5c, 0x6b, 0x70, 0x6c, 0x07,
+ 0x47, 0x4d, 0x79, 0xb1, 0xab, 0x75, 0x0b, 0x45, 0x0c, 0xd6, 0x10, 0x5e,
+ 0xc5, 0x95, 0xec, 0x81, 0x2f, 0x2a, 0xaf, 0xeb, 0x15, 0x1d, 0xd8, 0x9b,
+ 0xa3, 0xe3, 0x43, 0x9b, 0xd5, 0xf6, 0x7f, 0xef, 0x8c, 0xb0, 0xe5, 0xd5,
+ 0x34, 0xc8, 0xe1, 0xe3, 0x1a, 0x52, 0xaf, 0x20, 0x58, 0x8a, 0x4c, 0xbf,
+ 0x1b, 0x70, 0xbf, 0x3b, 0xfa, 0x71, 0xab, 0xc2, 0xf4, 0xf0, 0xdd, 0xf7,
+ 0x47, 0x67, 0x27, 0xef, 0xde, 0x1e, 0xbe, 0x3b, 0xff, 0xcc, 0x63, 0x77,
+ 0x31, 0x34, 0xf7, 0x3a, 0x4c, 0x2e, 0xc8, 0x11, 0x0e, 0xba, 0xa1, 0x22,
+ 0x40, 0xee, 0xa9, 0x60, 0x56, 0x2a, 0xff, 0x1a, 0xf9, 0xc3, 0x79, 0x0f,
+ 0xa9, 0x67, 0x1f, 0x99, 0x24, 0x4b, 0x78, 0x76, 0x66, 0x88, 0xab, 0x8e,
+ 0x38, 0x16, 0x60, 0xfb, 0x85, 0x02, 0x50, 0xfe, 0x16, 0x00, 0xbe, 0x94,
+ 0x0a, 0x8c, 0xda, 0xb1, 0xcf, 0xec, 0x96, 0x70, 0x10, 0xd0, 0xc5, 0x4a,
+ 0x5b, 0x93, 0x70, 0xc4, 0xfd, 0x5e, 0x0a, 0x40, 0x8b, 0x24, 0xba, 0x1a,
+ 0xae, 0x60, 0x68, 0x5c, 0xc7, 0x71, 0x2e, 0x45, 0xd7, 0xe8, 0x0b, 0x33,
+ 0x09, 0x2f, 0x07, 0xd4, 0x01, 0x04, 0xf8, 0xad, 0x4d, 0xbb, 0xbd, 0x0b,
+ 0xbc, 0x55, 0xfc, 0x59, 0x9d, 0x45, 0x07, 0x3b, 0x3b, 0x3f, 0x53, 0x57,
+ 0xdd, 0x3f, 0x4a, 0x5b, 0xdd, 0x10, 0xfc, 0xb1, 0xf6, 0xa6, 0xe1, 0x4a,
+ 0x86, 0xb4, 0xba, 0x10, 0x74, 0x6b, 0xb7, 0x93, 0xdc, 0xc0, 0x1f, 0x4e,
+ 0xcf, 0x4e, 0x7e, 0xfc, 0xd3, 0x6f, 0xfc, 0x09, 0x2f, 0xd9, 0xec, 0xcf,
+ 0xc8, 0xc1, 0xd4, 0xc1, 0x7f, 0xfe, 0xcd, 0xbf, 0xd6, 0x1e, 0x7e, 0xe0,
+ 0xf5, 0x7e, 0x8f, 0x29, 0x64, 0x5c, 0xbc, 0xcd, 0x10, 0xd7, 0x2e, 0x25,
+ 0x3a, 0xf1, 0x7c, 0x1c, 0x36, 0x19, 0x88, 0x44, 0x5c, 0xdd, 0x26, 0xd0,
+ 0x34, 0x04, 0xbc, 0x1d, 0x71, 0x49, 0xb1, 0xcb, 0xe0, 0xd5, 0xaa, 0x72,
+ 0x54, 0x8e, 0x73, 0x6d, 0x39, 0xe5, 0xa3, 0xda, 0xfd, 0x78, 0x79, 0x7c,
+ 0xfc, 0x9b, 0x6e, 0x02, 0x75, 0x26, 0x75, 0x6b, 0x19, 0x5a, 0x0d, 0x55,
+ 0x7b, 0x9b, 0xaf, 0xc7, 0xe0, 0x7c, 0x77, 0x22, 0xb3, 0x79, 0x41, 0xca,
+ 0xf1, 0xb0, 0xce, 0x8c, 0x4a, 0x9b, 0x22, 0xde, 0xaf, 0x80, 0xc2, 0x98,
+ 0x58, 0xbd, 0xc3, 0x89, 0x93, 0x01, 0xbe, 0x31, 0x3d, 0x44, 0xc9, 0x02,
+ 0x64, 0x42, 0x51, 0x5e, 0x25, 0xef, 0x26, 0x97, 0xc5, 0x51, 0xdd, 0x42,
+ 0x69, 0x71, 0x89, 0xb8, 0x4f, 0x32, 0xf7, 0xe9, 0xbd, 0x88, 0xb4, 0x61,
+ 0x65, 0x74, 0x08, 0xc8, 0xdb, 0x2a, 0xaf, 0x3f, 0x52, 0x51, 0x07, 0x6e,
+ 0x28, 0x29, 0x48, 0x5a, 0xbf, 0x0f, 0x95, 0x97, 0xe6, 0x34, 0x62, 0x88,
+ 0x11, 0x57, 0x4d, 0x97, 0xd7, 0xb1, 0xd9, 0x51, 0x3f, 0x1b, 0x16, 0xc5,
+ 0x70, 0xa3, 0xb2, 0x13, 0x3a, 0x6d, 0x95, 0x76, 0x09, 0x28, 0x33, 0x27,
+ 0x51, 0xd5, 0x16, 0x67, 0x20, 0x56, 0x96, 0x3e, 0xd0, 0x72, 0x63, 0xdb,
+ 0xdf, 0x3c, 0x6f, 0xea, 0x6c, 0x7e, 0x11, 0xaf, 0xb0, 0x8f, 0x72, 0x0b,
+ 0xa9, 0xf0, 0xb7, 0x8d, 0xa2, 0xfd, 0x46, 0xf4, 0x19, 0x61, 0xd2, 0x20,
+ 0xb4, 0x10, 0xfa, 0xeb, 0x84, 0x0e, 0x5b, 0x79, 0x06, 0xb7, 0xae, 0xbd,
+ 0x4f, 0xe2, 0x55, 0xb3, 0x72, 0x9e, 0x98, 0x9e, 0xed, 0x97, 0xb3, 0xb0,
+ 0x60, 0xca, 0x70, 0x24, 0x1f, 0xbf, 0x43, 0x25, 0xef, 0xf0, 0x36, 0x51,
+ 0xe0, 0x10, 0x3e, 0xa7, 0xd6, 0x33, 0xf2, 0x9b, 0x87, 0x0c, 0x47, 0xa0,
+ 0xe9, 0x35, 0x72, 0xa3, 0x65, 0xaa, 0x49, 0x83, 0xec, 0xde, 0x26, 0x11,
+ 0xbf, 0x38, 0x2b, 0xe1, 0x84, 0xb5, 0x13, 0xd6, 0x49, 0x78, 0x13, 0x5f,
+ 0x37, 0xd1, 0xde, 0x99, 0x46, 0x62, 0xc3, 0xe6, 0x31, 0xb8, 0xe0, 0x19,
+ 0x44, 0xc6, 0x1f, 0xcf, 0xce, 0x93, 0xb4, 0x55, 0x9e, 0x23, 0xeb, 0x71,
+ 0x0a, 0xa5, 0x95, 0xc5, 0x82, 0x70, 0xd1, 0xf4, 0x1b, 0xff, 0xca, 0xc8,
+ 0x5d, 0xb0, 0x25, 0xed, 0xa4, 0x84, 0xdb, 0xb2, 0x50, 0x17, 0x69, 0x47,
+ 0xb8, 0x25, 0x09, 0xfd, 0xe3, 0x14, 0x7f, 0x81, 0x50, 0x27, 0x46, 0x44,
+ 0xb1, 0x12, 0x5b, 0x77, 0x20, 0xc5, 0xb2, 0x54, 0x5f, 0x37, 0xd1, 0x32,
+ 0x63, 0x0d, 0x6e, 0x19, 0x11, 0x38, 0x2f, 0xeb, 0x18, 0x9c, 0xe6, 0x04,
+ 0x59, 0xf3, 0x19, 0x35, 0xe0, 0xe0, 0x2b, 0x6f, 0xfe, 0x7b, 0x7e, 0xf2,
+ 0xea, 0xe4, 0xd8, 0xfc, 0xe5, 0xf0, 0xcd, 0xd1, 0x8f, 0x4e, 0x2b, 0x60,
+ 0x80, 0x8a, 0x56, 0x81, 0x8c, 0xeb, 0x3d, 0x6e, 0xd9, 0x10, 0xe7, 0x20,
+ 0x22, 0xfd, 0x90, 0x53, 0xe2, 0xba, 0x14, 0x6a, 0xb9, 0xa5, 0xc7, 0xe7,
+ 0xa4, 0x83, 0x78, 0xab, 0x1b, 0xb8, 0x00, 0x2f, 0x41, 0x8b, 0xe6, 0x91,
+ 0x6d, 0x31, 0x85, 0xdb, 0x64, 0xd4, 0x48, 0xf9, 0x6c, 0x4e, 0xb2, 0x51,
+ 0xdd, 0x27, 0x73, 0x85, 0x25, 0x6a, 0x4d, 0xae, 0xac, 0x6c, 0x77, 0xca,
+ 0xc6, 0xef, 0x7c, 0xdc, 0x69, 0x35, 0xe1, 0x81, 0xb7, 0x1a, 0x0d, 0xd7,
+ 0x5f, 0xa4, 0x6d, 0x57, 0xdc, 0x54, 0x19, 0x71, 0x45, 0x02, 0xaa, 0x83,
+ 0x22, 0xe0, 0xa3, 0x7c, 0x74, 0x28, 0x82, 0x2a, 0x74, 0xec, 0x88, 0xed,
+ 0x35, 0xc9, 0x06, 0x48, 0x2e, 0x1f, 0xe5, 0x56, 0x40, 0x8f, 0xf7, 0x20,
+ 0x7e, 0x84, 0x5a, 0xa3, 0xe5, 0x82, 0x52, 0xa7, 0x84, 0x3f, 0x28, 0xbb,
+ 0x8a, 0xa3, 0x18, 0xc2, 0x51, 0xcf, 0xbd, 0x96, 0xcb, 0x2c, 0x15, 0x24,
+ 0xf8, 0xb4, 0x0c, 0x4d, 0x2b, 0x9c, 0x81, 0x28, 0xfb, 0x6d, 0x8d, 0xa3,
+ 0xee, 0xfb, 0x34, 0x4c, 0x54, 0xd9, 0x03, 0xf7, 0xe9, 0x20, 0xeb, 0x9a,
+ 0x5b, 0x8e, 0xaf, 0x1b, 0x03, 0x1a, 0xe1, 0x5f, 0x57, 0xf9, 0x75, 0x4a,
+ 0xb5, 0x65, 0xe6, 0xb2, 0x68, 0x9f, 0xf2, 0xce, 0x18, 0xe9, 0xaf, 0x1a,
+ 0x24, 0x6d, 0x8f, 0xf2, 0xe4, 0xd7, 0x0c, 0xf2, 0xa4, 0x33, 0xc6, 0xd5,
+ 0xaf, 0x1a, 0x64, 0xa8, 0x02, 0xc2, 0x28, 0xc6, 0x3f, 0x1e, 0x9d, 0x27,
+ 0xaf, 0x4e, 0x5e, 0xbb, 0x0b, 0x76, 0x6e, 0xb3, 0xb7, 0xd3, 0x64, 0xb2,
+ 0x2a, 0x0c, 0x0d, 0xa2, 0x47, 0x0a, 0x35, 0x38, 0xc5, 0x30, 0x9c, 0xa6,
+ 0x88, 0x1c, 0x9c, 0x5a, 0x2b, 0xd6, 0xf2, 0x8a, 0xa1, 0x88, 0x90, 0x57,
+ 0xc3, 0x48, 0x4a, 0x5e, 0x8d, 0x2e, 0x9e, 0x5e, 0x00, 0xe8, 0xe8, 0x52,
+ 0xa5, 0x2f, 0x6e, 0x25, 0xb0, 0xee, 0xd2, 0x4a, 0xab, 0x4a, 0x27, 0x29,
+ 0xc0, 0x8c, 0x0a, 0xae, 0x8d, 0x34, 0xb2, 0x33, 0x02, 0x3d, 0xac, 0xc3,
+ 0xf9, 0x08, 0xc4, 0x46, 0x77, 0xce, 0x1b, 0x9d, 0x8a, 0x9f, 0x49, 0xb8,
+ 0xa7, 0xb9, 0xfe, 0x2d, 0x4a, 0x97, 0xb6, 0x53, 0x24, 0xfc, 0x90, 0xd7,
+ 0x3d, 0xd3, 0xb2, 0x38, 0x52, 0x89, 0x0b, 0x97, 0xb3, 0xcf, 0xcd, 0x67,
+ 0x03, 0x89, 0x6d, 0x87, 0xb0, 0xdf, 0xd9, 0x97, 0x50, 0x82, 0x51, 0xd1,
+ 0xd9, 0x6f, 0x20, 0x79, 0x65, 0xf9, 0xdf, 0x3c, 0x05, 0xfd, 0x91, 0xd5,
+ 0xc7, 0xcc, 0xca, 0xe7, 0xd4, 0xd1, 0x75, 0xc6, 0x17, 0xa2, 0xbe, 0x33,
+ 0x42, 0xfd, 0x96, 0x0c, 0x72, 0xd8, 0x4f, 0x02, 0xe7, 0xe4, 0xde, 0x7c,
+ 0x2c, 0x5a, 0x59, 0x62, 0x71, 0xa3, 0xa8, 0x2d, 0xce, 0xb2, 0x1d, 0x0d,
+ 0x72, 0x5e, 0x0b, 0x2d, 0x91, 0xe6, 0xfe, 0xe6, 0x35, 0x3a, 0xcc, 0x46,
+ 0x3c, 0x17, 0x2e, 0xf1, 0x80, 0xe1, 0x1b, 0xb8, 0xdc, 0xba, 0x64, 0xb7,
+ 0xa6, 0xd7, 0x3e, 0xcc, 0x82, 0xfd, 0x20, 0x33, 0x89, 0xf6, 0x6b, 0xc8,
+ 0xbd, 0x53, 0x82, 0xba, 0x74, 0x57, 0x81, 0xa9, 0x16, 0xc7, 0xac, 0xa4,
+ 0x0d, 0x1c, 0x50, 0x26, 0x2f, 0x5a, 0x5d, 0xa7, 0x80, 0x7a, 0xa0, 0x96,
+ 0x65, 0x69, 0xc1, 0x95, 0x86, 0x7a, 0x02, 0xf1, 0x9a, 0x3b, 0x57, 0xf3,
+ 0xf4, 0x84, 0xff, 0x78, 0xa5, 0x1a, 0x9b, 0x94, 0x0d, 0xf9, 0x8c, 0x85,
+ 0x85, 0x8c, 0x58, 0x37, 0x25, 0x61, 0x74, 0x40, 0x06, 0xd1, 0xfa, 0x88,
+ 0x41, 0x86, 0x9b, 0x50, 0x77, 0x7c, 0x9c, 0x4f, 0x7b, 0xbe, 0xc2, 0x90,
+ 0x4e, 0xee, 0x23, 0xbe, 0x4f, 0x5e, 0xb7, 0x50, 0x9e, 0xf5, 0x46, 0x7b,
+ 0xd6, 0xa5, 0x0b, 0xcf, 0xb3, 0x4f, 0x23, 0xda, 0x27, 0x3f, 0x17, 0x5f,
+ 0x44, 0x86, 0xa2, 0x45, 0x51, 0x9e, 0xab, 0x6c, 0x39, 0x97, 0x95, 0xc9,
+ 0x4f, 0x28, 0x70, 0x4c, 0xde, 0x04, 0xda, 0xe5, 0xa9, 0xce, 0xd2, 0xa8,
+ 0xc3, 0xbe, 0x29, 0xf8, 0x5c, 0x3e, 0x8b, 0xe6, 0x4c, 0xac, 0x3a, 0x10,
+ 0xee, 0x46, 0x6e, 0xe9, 0x4d, 0x9a, 0x41, 0xd3, 0x8f, 0x90, 0xe0, 0x48,
+ 0xa8, 0x0e, 0xfa, 0x6f, 0x79, 0x23, 0x40, 0xba, 0xeb, 0xb8, 0x92, 0xb1,
+ 0xda, 0x55, 0xc5, 0x45, 0xbb, 0x0e, 0xdb, 0x91, 0xf2, 0xd8, 0xd3, 0xa2,
+ 0x91, 0xfc, 0xbf, 0x0a, 0x90, 0x7c, 0x23, 0xc3, 0x8b, 0xca, 0x00, 0x7d,
+ 0xb2, 0xbc, 0x68, 0x04, 0xfb, 0x8b, 0xfb, 0x20, 0xf1, 0xfe, 0x5c, 0xa5,
+ 0xc5, 0x65, 0xc6, 0xfe, 0x17, 0x0f, 0x9e, 0x92, 0x7b, 0x68, 0xb1, 0x38,
+ 0x34, 0x77, 0x9d, 0x9c, 0x3c, 0xbd, 0xe8, 0x13, 0x6e, 0x1f, 0xf6, 0x76,
+ 0xed, 0x3e, 0x70, 0x7b, 0x1c, 0xaa, 0x4e, 0xc1, 0x2e, 0xfc, 0x40, 0x88,
+ 0x84, 0x37, 0x29, 0xb7, 0xcf, 0xd4, 0x26, 0xd3, 0xce, 0x68, 0xb1, 0x61,
+ 0x1e, 0x44, 0xd6, 0xc2, 0x3c, 0x69, 0x42, 0x72, 0x40, 0x16, 0x0c, 0xf4,
+ 0x01, 0x4e, 0xf5, 0xe4, 0xf2, 0x46, 0x11, 0x57, 0x03, 0x32, 0xe8, 0x2d,
+ 0x83, 0xe4, 0x38, 0x2b, 0xf1, 0xde, 0xeb, 0x2c, 0x06, 0x9b, 0xa1, 0xb8,
+ 0x55, 0x5e, 0x36, 0x87, 0x03, 0x0d, 0xf1, 0xd6, 0xb3, 0x67, 0xd7, 0x73,
+ 0x43, 0x84, 0x72, 0xfa, 0x72, 0x3c, 0x56, 0x32, 0x79, 0x15, 0x52, 0x84,
+ 0x44, 0x8f, 0x08, 0x41, 0x47, 0x8a, 0xa4, 0x23, 0xaa, 0xa2, 0x0c, 0xd2,
+ 0x49, 0x32, 0xd8, 0x63, 0x9e, 0xf6, 0x9a, 0x19, 0x33, 0x69, 0x13, 0xb2,
+ 0x5e, 0xa6, 0x2b, 0x5d, 0xf1, 0xcd, 0xfa, 0x9d, 0xfc, 0x2c, 0x9a, 0xae,
+ 0xc2, 0x01, 0x4b, 0xec, 0x33, 0x15, 0x23, 0x2b, 0x8f, 0x27, 0xd5, 0xf0,
+ 0x76, 0xd9, 0xee, 0x88, 0xbd, 0xf7, 0x28, 0x5c, 0xf4, 0xf7, 0xbc, 0xaa,
+ 0xc1, 0x3f, 0xb5, 0xe8, 0xef, 0x23, 0x8b, 0x7e, 0xec, 0x2e, 0x0e, 0x7f,
+ 0x2c, 0xd9, 0xdf, 0x7f, 0xa6, 0x05, 0x21, 0x86, 0x8e, 0xe9, 0x7b, 0xee,
+ 0x83, 0xde, 0x17, 0xcd, 0x73, 0x43, 0xaa, 0x3f, 0x08, 0xbf, 0xe5, 0x5d,
+ 0x5e, 0xef, 0x53, 0x4f, 0xec, 0xa7, 0x8c, 0xfa, 0x0d, 0x0b, 0xd4, 0xe8,
+ 0xf4, 0xcc, 0x65, 0x02, 0xe6, 0xa3, 0xa6, 0x1c, 0xd4, 0xf0, 0x1b, 0xe4,
+ 0x4f, 0x35, 0x56, 0x97, 0xec, 0x7c, 0x4a, 0x67, 0xe1, 0x7d, 0xe7, 0xa9,
+ 0x75, 0xa3, 0xec, 0xec, 0x6b, 0x00, 0xfd, 0x25, 0xf1, 0xe2, 0x79, 0xb6,
+ 0x20, 0xca, 0x9c, 0x65, 0x40, 0xeb, 0x71, 0xee, 0x3f, 0xae, 0xb9, 0xbb,
+ 0xa8, 0x52, 0x42, 0x5b, 0x9e, 0xa7, 0x77, 0x11, 0xb0, 0x2d, 0xf1, 0x14,
+ 0xb3, 0xb9, 0x92, 0x62, 0xf6, 0x05, 0x6c, 0x05, 0xd2, 0x04, 0xc4, 0x6d,
+ 0x06, 0x3f, 0x2c, 0x4e, 0xb4, 0xbc, 0xb0, 0xae, 0x5a, 0xf9, 0x6a, 0x00,
+ 0x07, 0x50, 0x4b, 0xdb, 0x32, 0xbe, 0x32, 0xa2, 0x25, 0xc4, 0xb1, 0xe1,
+ 0xf6, 0x9e, 0xb9, 0x23, 0xb2, 0xe7, 0x00, 0xc7, 0x16, 0x43, 0x84, 0x78,
+ 0xbb, 0xa7, 0xbc, 0x44, 0xe3, 0x01, 0xd2, 0x42, 0x04, 0x51, 0xba, 0x3c,
+ 0xb4, 0x9a, 0x2b, 0x4f, 0x41, 0xdc, 0x63, 0x6e, 0x7c, 0x0a, 0x66, 0x27,
+ 0x80, 0xbb, 0xa3, 0xe4, 0x84, 0xbc, 0x70, 0x2d, 0x88, 0xf1, 0x0b, 0x26,
+ 0x7d, 0x57, 0x34, 0xda, 0x26, 0xdc, 0xe7, 0xee, 0x84, 0x75, 0x4e, 0x9a,
+ 0xfc, 0xb2, 0xa3, 0x4c, 0xd6, 0x0a, 0x14, 0xf5, 0x36, 0x67, 0xc9, 0xd9,
+ 0xe1, 0xf9, 0x19, 0xc5, 0x79, 0x89, 0x01, 0x04, 0x20, 0xa9, 0x69, 0xb5,
+ 0x6d, 0x41, 0x82, 0x84, 0x9d, 0x39, 0x3d, 0xc4, 0x31, 0x08, 0xc6, 0x2f,
+ 0xb3, 0xe7, 0xcd, 0xff, 0xd4, 0xf7, 0xb8, 0xfa, 0x25, 0xd3, 0x5a, 0x13,
+ 0x17, 0xd1, 0x69, 0x23, 0xab, 0xed, 0xef, 0xbb, 0x2c, 0x24, 0x6e, 0x69,
+ 0xca, 0x62, 0x4e, 0x32, 0xc9, 0x47, 0x92, 0xdd, 0xa2, 0xc5, 0x17, 0xda,
+ 0xc2, 0x0a, 0x0f, 0x71, 0x36, 0x76, 0x59, 0x45, 0x44, 0xae, 0x7c, 0x5a,
+ 0xe5, 0x3f, 0x4f, 0xc1, 0xa1, 0xa8, 0xf1, 0xd7, 0xf8, 0xa7, 0xcc, 0x3d,
+ 0xa5, 0x02, 0x30, 0x79, 0xbc, 0xbb, 0x1b, 0x81, 0x1d, 0x4e, 0x27, 0x86,
+ 0xa9, 0x8a, 0x36, 0x27, 0x55, 0x3d, 0xf4, 0x16, 0x7b, 0x4d, 0x49, 0xbd,
+ 0xac, 0x61, 0x6a, 0x0c, 0x2f, 0xe0, 0xc6, 0xc4, 0x8e, 0x85, 0x46, 0xc5,
+ 0x3e, 0xf3, 0x98, 0x1f, 0xa8, 0xca, 0x48, 0x37, 0xad, 0xc3, 0x5c, 0xb8,
+ 0x04, 0x49, 0x7b, 0x66, 0xa6, 0x1e, 0x18, 0xb3, 0xf8, 0xbf, 0x83, 0x99,
+ 0x05, 0xfc, 0x7b, 0xff, 0x49, 0x48, 0x11, 0xe3, 0xf3, 0x93, 0x33, 0xa1,
+ 0xb0, 0x50, 0x34, 0xf3, 0x8e, 0xd0, 0x23, 0x0e, 0x6d, 0x65, 0x10, 0x42,
+ 0xee, 0xcc, 0x2c, 0x3e, 0x80, 0x45, 0x31, 0xf5, 0xbe, 0xca, 0x1c, 0x80,
+ 0xda, 0x66, 0xc9, 0xd2, 0xbe, 0x17, 0x44, 0x00, 0xc5, 0xeb, 0xd5, 0x7b,
+ 0xe9, 0xbd, 0xc4, 0xd7, 0xec, 0x84, 0xef, 0x2f, 0x57, 0xaf, 0x83, 0x8e,
+ 0xa4, 0x8e, 0x1d, 0x78, 0xbf, 0x92, 0x0e, 0x6b, 0xfb, 0xfb, 0x75, 0x69,
+ 0x91, 0x2f, 0xd1, 0x89, 0x83, 0x64, 0x66, 0x0e, 0x2f, 0xeb, 0xb4, 0x56,
+ 0x31, 0xf5, 0x98, 0x04, 0x9f, 0x60, 0xc8, 0x62, 0x49, 0x6c, 0x4a, 0xd9,
+ 0x17, 0x36, 0x0d, 0x60, 0xdd, 0xcb, 0x6a, 0x26, 0xe9, 0x2b, 0x22, 0x38,
+ 0xd5, 0x58, 0x70, 0x7a, 0xb6, 0x93, 0xfa, 0xa7, 0x27, 0x67, 0xe7, 0x56,
+ 0xe6, 0xe3, 0xb3, 0xf4, 0x83, 0xce, 0xed, 0x41, 0xbf, 0x14, 0xc1, 0x9f,
+ 0x10, 0xc9, 0x46, 0x9d, 0x3b, 0x3f, 0x8b, 0x42, 0x10, 0xc8, 0x91, 0xd0,
+ 0x38, 0x3a, 0xd0, 0x80, 0xda, 0xac, 0xce, 0x4a, 0x86, 0xf3, 0xb1, 0xfc,
+ 0x86, 0x3d, 0xe8, 0x24, 0x68, 0x7a, 0x90, 0xc1, 0x9c, 0x72, 0xfb, 0x68,
+ 0x2f, 0xa4, 0x0c, 0xd8, 0xd0, 0x67, 0x87, 0xe3, 0x73, 0x9e, 0x39, 0xfe,
+ 0x16, 0xcc, 0x9c, 0xeb, 0x43, 0xe5, 0x87, 0xa1, 0x13, 0xd5, 0x52, 0x06,
+ 0x32, 0xd0, 0x8c, 0xb5, 0x41, 0xe3, 0xdb, 0x02, 0x77, 0x6f, 0xc7, 0x1e,
+ 0x79, 0xd9, 0x86, 0xc4, 0x34, 0x85, 0x4e, 0xe8, 0x7e, 0xd3, 0x0f, 0x36,
+ 0xe4, 0x2b, 0x1b, 0x46, 0x2d, 0xe3, 0xeb, 0xd0, 0x82, 0x5f, 0x7f, 0xf4,
+ 0xd8, 0x8d, 0xb0, 0x84, 0xa4, 0x92, 0x01, 0x8e, 0xb4, 0x39, 0x26, 0x7e,
+ 0x38, 0x54, 0x52, 0x21, 0x61, 0xc1, 0x44, 0xc1, 0xcf, 0xb9, 0x71, 0x9e,
+ 0x48, 0x89, 0xfa, 0xb1, 0x55, 0x15, 0xbc, 0xa9, 0xe0, 0xc7, 0x9a, 0xf2,
+ 0x43, 0xda, 0x46, 0x87, 0xe4, 0x1e, 0x31, 0xa5, 0x7f, 0x8d, 0x6c, 0x41,
+ 0x9b, 0xb6, 0xc8, 0x6b, 0xf7, 0xe5, 0x82, 0x51, 0xb6, 0xf2, 0x62, 0x95,
+ 0x91, 0x8e, 0x96, 0x56, 0x73, 0xf4, 0x7a, 0x30, 0x4c, 0xa4, 0xe2, 0xfa,
+ 0xb1, 0x9b, 0x22, 0x06, 0x4b, 0xed, 0x7d, 0x43, 0xe4, 0xcf, 0xd1, 0xf1,
+ 0xa1, 0x3b, 0x2a, 0xee, 0x13, 0x41, 0x97, 0xd8, 0xe9, 0xfa, 0x68, 0x68,
+ 0x6d, 0xc5, 0xc4, 0x28, 0x39, 0x45, 0xa7, 0x62, 0xd2, 0x99, 0xea, 0xff,
+ 0x70, 0xa3, 0xf1, 0x25, 0x21, 0x0f, 0xbc, 0x11, 0x9b, 0x54, 0xee, 0x9c,
+ 0x17, 0xe6, 0x64, 0xe9, 0x27, 0xf8, 0xab, 0x87, 0x69, 0x1e, 0x2c, 0xf7,
+ 0xb9, 0x7b, 0xb9, 0x36, 0x2b, 0x31, 0x16, 0x7a, 0xf7, 0x91, 0xc7, 0x42,
+ 0x57, 0xc6, 0x7c, 0xa7, 0x21, 0x2c, 0x6b, 0xc6, 0x5d, 0x96, 0x66, 0x31,
+ 0x33, 0x1e, 0xe1, 0x42, 0x9f, 0x69, 0xb1, 0x70, 0x6f, 0x28, 0x16, 0x06,
+ 0x2f, 0x27, 0xb6, 0x81, 0x10, 0x92, 0x84, 0xa1, 0xc8, 0x99, 0xb1, 0x0a,
+ 0x70, 0xda, 0xb9, 0xcd, 0xb5, 0xf7, 0x63, 0xc0, 0xb4, 0xb5, 0x16, 0x2f,
+ 0xaa, 0xbb, 0xb9, 0x9d, 0xb6, 0xcb, 0x8f, 0x99, 0x12, 0x2d, 0xd9, 0x58,
+ 0xf9, 0xd5, 0x9a, 0x9d, 0x64, 0x27, 0x0b, 0xee, 0x1d, 0x9c, 0x06, 0x88,
+ 0x07, 0x18, 0xf9, 0xee, 0x2b, 0xff, 0x8f, 0x9f, 0xb8, 0xa1, 0x2e, 0x08,
+ 0xbc, 0x47, 0xf9, 0xfa, 0xcb, 0x96, 0x53, 0xce, 0x76, 0x92, 0xc8, 0xed,
+ 0x93, 0x6c, 0x36, 0x72, 0xed, 0x79, 0xe4, 0x4a, 0x79, 0xdf, 0x78, 0x26,
+ 0xa6, 0x2f, 0x6c, 0xdf, 0xe2, 0xce, 0x25, 0xdf, 0x8f, 0x38, 0xaa, 0xcc,
+ 0x7e, 0x33, 0x6e, 0x54, 0x23, 0xbf, 0x11, 0x10, 0xc6, 0x2b, 0xf1, 0xcb,
+ 0xa0, 0xdf, 0x67, 0x80, 0xb8, 0xb8, 0x5a, 0x48, 0x0e, 0xaf, 0xf7, 0xa5,
+ 0xcf, 0xc5, 0x93, 0x81, 0xe2, 0xf3, 0xc2, 0x81, 0x14, 0x79, 0x0b, 0x81,
+ 0xa2, 0x2b, 0x56, 0xb3, 0x86, 0xf2, 0x0d, 0x73, 0x9c, 0xa6, 0x36, 0x05,
+ 0x38, 0xc4, 0xd8, 0x03, 0x72, 0x19, 0xd8, 0xac, 0x28, 0xbb, 0xea, 0x51,
+ 0x28, 0xb5, 0x08, 0x58, 0x3c, 0x0b, 0xf2, 0x18, 0xff, 0xca, 0x36, 0x0d,
+ 0x0a, 0x5d, 0xe2, 0x55, 0xf6, 0x17, 0x52, 0x24, 0x47, 0xb6, 0x47, 0xa3,
+ 0x06, 0x94, 0xd3, 0x62, 0x95, 0x7a, 0xb6, 0xfc, 0xe3, 0xe7, 0xe2, 0xa1,
+ 0x12, 0x37, 0x88, 0xf6, 0x04, 0xef, 0x86, 0x17, 0x9f, 0xec, 0x59, 0x5f,
+ 0x25, 0x52, 0x66, 0xa5, 0x0e, 0xc4, 0x4f, 0x9c, 0x05, 0xfc, 0xf1, 0xf8,
+ 0xdb, 0xe4, 0xed, 0xeb, 0x27, 0x48, 0xe8, 0xb9, 0xcc, 0xaa, 0x65, 0x85,
+ 0x24, 0x4e, 0xa5, 0xe1, 0x93, 0xef, 0xbc, 0xc1, 0xf6, 0x5d, 0xf6, 0x85,
+ 0x82, 0x23, 0x0a, 0x33, 0x13, 0x7b, 0xc1, 0x1c, 0x21, 0x0a, 0x9f, 0x2f,
+ 0x07, 0x12, 0x6c, 0x51, 0x1c, 0x3f, 0x45, 0xab, 0x22, 0xad, 0xa5, 0xdb,
+ 0x67, 0xbd, 0xcd, 0xc0, 0x9e, 0x3c, 0x72, 0x0c, 0xac, 0xba, 0x5b, 0xa2,
+ 0xb9, 0x4a, 0x71, 0x09, 0xb3, 0x20, 0x72, 0xa3, 0x9e, 0x30, 0xd3, 0x7c,
+ 0xc5, 0xf7, 0x1e, 0x3a, 0x6c, 0xf8, 0x1a, 0xa9, 0xe7, 0xe4, 0x2e, 0xf5,
+ 0xde, 0x7b, 0xe2, 0x7b, 0x15, 0x00, 0x8f, 0x4b, 0x89, 0x52, 0xdc, 0x12,
+ 0x83, 0x34, 0x14, 0xef, 0xd9, 0xa7, 0xf6, 0x59, 0xf8, 0x8d, 0xf2, 0xc2,
+ 0x6b, 0x61, 0xd4, 0xf3, 0x86, 0x28, 0xbf, 0x6a, 0x20, 0xa8, 0x62, 0xc6,
+ 0xfa, 0x8e, 0xb7, 0xf7, 0xde, 0x2b, 0xcf, 0xdb, 0x4e, 0x13, 0xea, 0x6d,
+ 0x60, 0x09, 0x93, 0x16, 0x45, 0x2d, 0x34, 0x3d, 0x37, 0x0b, 0xcb, 0xe8,
+ 0xd3, 0x6e, 0x1e, 0xb4, 0xf2, 0xc0, 0xcc, 0x47, 0x10, 0xd1, 0xab, 0xce,
+ 0xa4, 0xff, 0xea, 0x65, 0xd2, 0x57, 0x04, 0x44, 0xb4, 0xee, 0x7d, 0x64,
+ 0x4f, 0xee, 0x0c, 0xba, 0xd1, 0x5e, 0x16, 0xf9, 0xdf, 0x32, 0x2f, 0x17,
+ 0x4c, 0xdb, 0x4f, 0x79, 0x8f, 0xef, 0x0b, 0xc3, 0xe0, 0x8e, 0xa3, 0xc4,
+ 0x14, 0x11, 0x3c, 0x75, 0x0f, 0x3c, 0x12, 0xaa, 0xe5, 0x16, 0xbd, 0x9c,
+ 0xfb, 0x80, 0x06, 0xdb, 0x08, 0xdd, 0x67, 0xad, 0xb4, 0xfa, 0xa7, 0x8f,
+ 0x45, 0xe7, 0x52, 0xdd, 0x18, 0x92, 0x17, 0x1b, 0x31, 0x27, 0x40, 0xc6,
+ 0x2e, 0x9b, 0x7e, 0x2a, 0x62, 0x4f, 0x8e, 0xd2, 0xb6, 0xa0, 0xb2, 0xed,
+ 0xbc, 0xf0, 0xd7, 0x9b, 0xbc, 0x90, 0x44, 0xf7, 0xe0, 0xf5, 0xa7, 0x3d,
+ 0xee, 0xc7, 0x9a, 0x65, 0xe6, 0x21, 0xd1, 0x92, 0xf7, 0xfc, 0x33, 0x77,
+ 0x13, 0x1c, 0x02, 0xed, 0xc0, 0xe1, 0xde, 0x0e, 0x7c, 0xcc, 0x52, 0xbd,
+ 0x4b, 0xec, 0x42, 0xc9, 0xb8, 0xd7, 0x41, 0x04, 0x59, 0xfe, 0xc2, 0x7e,
+ 0x7e, 0x5e, 0x82, 0x9b, 0x7a, 0xdf, 0x63, 0x92, 0x7a, 0x43, 0xbd, 0x2a,
+ 0x9c, 0x71, 0x50, 0xb4, 0x3a, 0xcc, 0xbb, 0xa7, 0x9f, 0x0b, 0x6d, 0xa8,
+ 0xbc, 0xb4, 0xc6, 0x6a, 0xdf, 0x1b, 0xcf, 0x76, 0x7d, 0x65, 0x75, 0x86,
+ 0xa8, 0x2c, 0x97, 0xf1, 0xf7, 0xbe, 0xc0, 0x94, 0x71, 0x34, 0x47, 0xb3,
+ 0xf6, 0xb9, 0xb6, 0x80, 0x57, 0x34, 0x43, 0xf7, 0xd8, 0x7e, 0x8b, 0xe9,
+ 0x9e, 0xfb, 0xea, 0x53, 0x72, 0xf4, 0xda, 0x7b, 0xf0, 0x91, 0x5b, 0x60,
+ 0x3a, 0x87, 0x36, 0x70, 0xc7, 0x7e, 0xaa, 0x5a, 0x9a, 0xcf, 0x7b, 0x8f,
+ 0x32, 0x65, 0xbc, 0x2b, 0x19, 0x75, 0x8b, 0xb6, 0x3f, 0x78, 0x86, 0xc9,
+ 0xe1, 0xd5, 0x95, 0x91, 0x6a, 0xd3, 0x86, 0x72, 0x42, 0x0b, 0x8d, 0x71,
+ 0x75, 0xcf, 0xfe, 0xd9, 0xd3, 0x35, 0xcf, 0x8a, 0xd0, 0xac, 0xad, 0xa8,
+ 0xf7, 0xde, 0x7b, 0x16, 0x5e, 0x73, 0x35, 0x07, 0xb4, 0x4c, 0xc1, 0x5c,
+ 0x35, 0xdc, 0xb4, 0x64, 0x0b, 0xe5, 0xd1, 0xff, 0xa1, 0x8e, 0xc1, 0x0a,
+ 0x78, 0x82, 0xf5, 0x7f, 0xf8, 0xf3, 0xfd, 0xdc, 0xaf, 0x75, 0x60, 0xaf,
+ 0x60, 0x95, 0x51, 0x9c, 0x60, 0xda, 0x6a, 0x17, 0xe1, 0x72, 0x84, 0x68,
+ 0x77, 0xbc, 0x11, 0xf8, 0xcc, 0x8d, 0x1e, 0xb1, 0x2a, 0x1c, 0xe7, 0x60,
+ 0x23, 0x50, 0xd0, 0x08, 0x66, 0x3e, 0xf4, 0x24, 0x78, 0xbe, 0x78, 0xa0,
+ 0x3c, 0x1f, 0xea, 0x6e, 0xe7, 0x1a, 0xd4, 0x57, 0x2b, 0x36, 0xb9, 0xed,
+ 0x8a, 0x9c, 0x83, 0xcd, 0x7b, 0x6d, 0xdf, 0x71, 0x2f, 0x9a, 0x1b, 0xa9,
+ 0x8d, 0xaf, 0xcc, 0x6c, 0xd9, 0x26, 0xb7, 0xfd, 0x03, 0xa8, 0x5e, 0xfa,
+ 0xa6, 0x2a, 0xf1, 0x57, 0x85, 0x08, 0xd9, 0x4a, 0x7b, 0x52, 0x33, 0x25,
+ 0x89, 0xdc, 0xfb, 0x8c, 0xa8, 0x36, 0x48, 0x71, 0x32, 0xa7, 0x74, 0x95,
+ 0x4d, 0x3f, 0xea, 0x95, 0x91, 0x41, 0x5c, 0xea, 0xb9, 0xf7, 0xd6, 0x63,
+ 0xbb, 0xb5, 0x64, 0xd0, 0x9c, 0x1d, 0x76, 0xad, 0x00, 0xf7, 0x28, 0x53,
+ 0xcd, 0xd9, 0xf9, 0xf8, 0xf4, 0x00, 0x73, 0xe6, 0xb8, 0xa1, 0xb9, 0x10,
+ 0xaf, 0xc6, 0xd9, 0x5f, 0xa5, 0xce, 0xac, 0x76, 0x4f, 0x3f, 0xed, 0x79,
+ 0x7a, 0x2c, 0x8e, 0xbd, 0x23, 0x42, 0x6a, 0x36, 0xe7, 0xe0, 0xbf, 0xc4,
+ 0x44, 0xb3, 0x2a, 0xd4, 0xbf, 0xcf, 0xfe, 0x2f, 0xcc, 0x8c, 0xb8, 0x21,
+ 0x62, 0xcb, 0xee, 0xe1, 0xcf, 0x9d, 0x4d, 0x73, 0xb5, 0x2a, 0x3e, 0x5a,
+ 0x7d, 0x51, 0x70, 0xf4, 0xf4, 0x80, 0xdd, 0x0b, 0xcf, 0xf5, 0x6a, 0x78,
+ 0x7e, 0x50, 0x9b, 0xf7, 0x34, 0x10, 0x0f, 0x85, 0x36, 0x9c, 0xe7, 0x98,
+ 0xa7, 0xe1, 0xaf, 0x2b, 0x6f, 0x0f, 0x9e, 0xef, 0x5a, 0xf1, 0x2b, 0x90,
+ 0x3c, 0x1f, 0xb3, 0x3b, 0x47, 0x75, 0x9a, 0x63, 0xb1, 0xcc, 0x0b, 0xb8,
+ 0x20, 0xdc, 0x23, 0x6e, 0x80, 0xbd, 0x96, 0x10, 0xe8, 0xaa, 0x1b, 0x75,
+ 0x93, 0x36, 0x2b, 0x4f, 0xc4, 0x3c, 0x67, 0xda, 0x19, 0x23, 0xea, 0xb8,
+ 0x10, 0x7a, 0xcd, 0x0b, 0xf5, 0xb6, 0x75, 0x5c, 0x68, 0xfa, 0xd2, 0x8f,
+ 0x3f, 0xb2, 0x1c, 0x29, 0x15, 0x18, 0x49, 0x42, 0x57, 0xb6, 0xf9, 0x93,
+ 0x61, 0xba, 0xac, 0x7a, 0xe0, 0x0a, 0x53, 0xbc, 0xa7, 0xca, 0xd0, 0x9f,
+ 0x52, 0xb1, 0x6f, 0xe8, 0xf2, 0xc4, 0xa2, 0xe7, 0x65, 0x21, 0x31, 0x5b,
+ 0x24, 0x6f, 0x92, 0xeb, 0x93, 0xc1, 0xa6, 0xd9, 0x15, 0x66, 0x66, 0xf0,
+ 0xf2, 0xfd, 0xf9, 0xb7, 0x27, 0x67, 0xe3, 0x64, 0x07, 0xb5, 0xed, 0xe7,
+ 0x67, 0x47, 0x5f, 0xbf, 0x3f, 0x37, 0xff, 0xd4, 0x91, 0x5e, 0xa7, 0x45,
+ 0x6e, 0xa4, 0xd3, 0xb8, 0xc9, 0x0a, 0x43, 0x2b, 0x97, 0xda, 0xa3, 0x89,
+ 0x72, 0x50, 0x20, 0x8f, 0xcb, 0x4a, 0x21, 0x4d, 0x90, 0x8e, 0x52, 0xce,
+ 0x5d, 0x32, 0x01, 0x7b, 0xb0, 0x91, 0xe3, 0x57, 0x3a, 0xcb, 0x39, 0xef,
+ 0x14, 0xe5, 0x6b, 0xda, 0x4e, 0x72, 0xfe, 0xed, 0xcb, 0x77, 0xdf, 0x8d,
+ 0xb5, 0x83, 0xc7, 0x0f, 0x3f, 0xfc, 0xd0, 0x0d, 0xee, 0xfa, 0x7d, 0xb8,
+ 0x3f, 0xfb, 0x6c, 0x7c, 0x78, 0x98, 0xbc, 0x3c, 0x1e, 0x9f, 0x7c, 0xe6,
+ 0x70, 0x1c, 0xb6, 0xf6, 0xb6, 0x8d, 0x92, 0x76, 0x99, 0x35, 0xe6, 0x2f,
+ 0x9f, 0x7d, 0xf6, 0xff, 0x00, 0x41, 0x7c, 0x59, 0x3a, 0x17, 0x88, 0x02,
+ 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
diff --git a/src/tool_main.c b/src/tool_main.c
index 4803adbb3..5679f361e 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -113,9 +113,9 @@ static void memory_tracking_init(void)
strcpy(fname, env);
curl_free(env);
curl_dbg_memdebug(fname);
- /* this weird stuff here is to make curl_free() get called before
- curl_gdb_memdebug() as otherwise memory tracking will log a free()
- without an alloc! */
+ /* this weird stuff here is to make curl_free() get called
+ before curl_memdebug() as otherwise memory tracking will
+ log a free() without an alloc! */
}
/* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
env = curlx_getenv("CURL_MEMLIMIT");
@@ -149,7 +149,6 @@ static CURLcode main_init(struct GlobalConfig *config)
config->showerror = -1; /* Will show errors */
config->errors = stderr; /* Default errors to stderr */
config->styled_output = TRUE; /* enable detection */
- config->parallel_max = PARALLEL_DEFAULT;
/* Allocate the initial operate config */
config->first = config->last = malloc(sizeof(struct OperationConfig));
@@ -161,9 +160,19 @@ static CURLcode main_init(struct GlobalConfig *config)
result = get_libcurl_info();
if(!result) {
- /* Initialise the config */
- config_init(config->first);
- config->first->global = config;
+ /* Get a curl handle to use for all forthcoming curl transfers */
+ config->easy = curl_easy_init();
+ if(config->easy) {
+ /* Initialise the config */
+ config_init(config->first);
+ config->first->easy = config->easy;
+ config->first->global = config;
+ }
+ else {
+ helpf(stderr, "error initializing curl easy handle\n");
+ result = CURLE_FAILED_INIT;
+ free(config->first);
+ }
}
else {
helpf(stderr, "error retrieving curl library information\n");
@@ -205,6 +214,9 @@ static void free_globalconfig(struct GlobalConfig *config)
static void main_free(struct GlobalConfig *config)
{
/* Cleanup the easy handle */
+ curl_easy_cleanup(config->easy);
+ config->easy = NULL;
+
/* Main cleanup */
curl_global_cleanup();
convert_cleanup();
@@ -225,7 +237,7 @@ static void main_free(struct GlobalConfig *config)
config->last = NULL;
}
-#ifdef WIN32
+#ifdef _WIN32
/* TerminalSettings for Windows */
static struct TerminalSettings {
HANDLE hStdOut;
@@ -263,7 +275,7 @@ static void configure_terminal(void)
static void restore_terminal(void)
{
-#ifdef WIN32
+#ifdef _WIN32
/* Restore Console output mode and codepage to whatever they were
* when Curl started */
SetConsoleMode(TerminalSettings.hStdOut, TerminalSettings.dwOutputMode);
diff --git a/src/tool_main.h b/src/tool_main.h
index a68287ec8..868818816 100644
--- a/src/tool_main.h
+++ b/src/tool_main.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,9 +28,6 @@
#define RETRY_SLEEP_DEFAULT 1000L /* ms */
#define RETRY_SLEEP_MAX 600000L /* ms == 10 minutes */
-#define MAX_PARALLEL 300 /* conservative */
-#define PARALLEL_DEFAULT 50
-
#ifndef STDIN_FILENO
# define STDIN_FILENO fileno(stdin)
#endif
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index 889da4bff..4c4261472 100644
--- a/src/tool_metalink.c
+++ b/src/tool_metalink.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,7 +73,7 @@
and later. If you're building for an older cat, well, sorry. */
# define COMMON_DIGEST_FOR_OPENSSL
# include <CommonCrypto/CommonDigest.h>
-#elif defined(WIN32)
+#elif defined(_WIN32)
/* For Windows: If no other crypto library is provided, we fallback
to the hash functions provided within the Microsoft Windows CryptoAPI */
# include <wincrypt.h>
@@ -104,7 +104,6 @@ struct win32_crypto_hash {
#include "tool_paramhlp.h"
#include "tool_cfgable.h"
#include "tool_metalink.h"
-#include "tool_operate.h"
#include "tool_msgs.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -381,7 +380,7 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
sha256_finish(ctx, digest);
}
-#elif defined(WIN32)
+#elif defined(_WIN32)
static void win32_crypto_final(struct win32_crypto_hash *ctx,
unsigned char *digest,
@@ -675,9 +674,8 @@ int metalink_check_hash(struct GlobalConfig *config,
return rv;
}
-static metalink_checksum *
-checksum_from_hex_digest(const metalink_digest_def *digest_def,
- const char *hex_digest)
+static metalink_checksum *new_metalink_checksum_from_hex_digest
+(const metalink_digest_def *digest_def, const char *hex_digest)
{
metalink_checksum *chksum;
unsigned char *digest;
@@ -756,8 +754,8 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
if(curl_strequal(digest_alias->alias_name, (*p)->type) &&
check_hex_digest((*p)->hash, digest_alias->digest_def)) {
f->checksum =
- checksum_from_hex_digest(digest_alias->digest_def,
- (*p)->hash);
+ new_metalink_checksum_from_hex_digest(digest_alias->digest_def,
+ (*p)->hash);
break;
}
}
@@ -893,8 +891,7 @@ int parse_metalink(struct OperationConfig *config, struct OutStruct *outs,
size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
void *userdata)
{
- struct per_transfer *per = userdata;
- struct OutStruct *outs = &per->outs;
+ struct OutStruct *outs = userdata;
struct OperationConfig *config = outs->config;
int rv;
@@ -965,7 +962,7 @@ static void delete_metalink_resource(metalink_resource *res)
Curl_safefree(res);
}
-void delete_metalinkfile(metalinkfile *mlfile)
+static void delete_metalinkfile(metalinkfile *mlfile)
{
metalink_resource *res;
if(mlfile == NULL) {
@@ -984,14 +981,12 @@ void delete_metalinkfile(metalinkfile *mlfile)
void clean_metalink(struct OperationConfig *config)
{
- if(config) {
- while(config->metalinkfile_list) {
- metalinkfile *mlfile = config->metalinkfile_list;
- config->metalinkfile_list = config->metalinkfile_list->next;
- delete_metalinkfile(mlfile);
- }
- config->metalinkfile_last = 0;
+ while(config->metalinkfile_list) {
+ metalinkfile *mlfile = config->metalinkfile_list;
+ config->metalinkfile_list = config->metalinkfile_list->next;
+ delete_metalinkfile(mlfile);
}
+ config->metalinkfile_last = 0;
}
void metalink_cleanup(void)
diff --git a/src/tool_metalink.h b/src/tool_metalink.h
index f5ec306f7..7ee2736a6 100644
--- a/src/tool_metalink.h
+++ b/src/tool_metalink.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,7 +22,6 @@
*
***************************************************************************/
#include "tool_setup.h"
-#include "tool_sdecls.h"
struct GlobalConfig;
struct OperationConfig;
@@ -105,8 +104,6 @@ extern const digest_params SHA256_DIGEST_PARAMS[1];
* Counts the resource in the metalinkfile.
*/
int count_next_metalink_resource(metalinkfile *mlfile);
-
-void delete_metalinkfile(metalinkfile *mlfile);
void clean_metalink(struct OperationConfig *config);
/*
@@ -160,7 +157,6 @@ void metalink_cleanup(void);
#else /* USE_METALINK */
#define count_next_metalink_resource(x) 0
-#define delete_metalinkfile(x) (void)x
#define clean_metalink(x) (void)x
/* metalink_cleanup() takes no arguments */
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 3087d2d14..e1ceabe7a 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -29,10 +29,6 @@
# include <locale.h>
#endif
-#ifdef HAVE_SYS_SELECT_H
-# include <sys/select.h>
-#endif
-
#ifdef __VMS
# include <fabdef.h>
#endif
@@ -79,7 +75,6 @@
#include "tool_vms.h"
#include "tool_help.h"
#include "tool_hugehelp.h"
-#include "tool_progress.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -103,18 +98,10 @@ CURLcode curl_easy_perform_ev(CURL *easy);
"this situation and\nhow to fix it, please visit the web page mentioned " \
"above.\n"
-static CURLcode single_transfer(struct GlobalConfig *global,
- struct OperationConfig *config,
- CURLSH *share,
- bool capath_from_env,
- bool *added);
-static CURLcode create_transfer(struct GlobalConfig *global,
- CURLSH *share,
- bool *added);
-
static bool is_fatal_error(CURLcode code)
{
switch(code) {
+ /* TODO: Should CURLE_PEER_FAILED_VERIFICATION be a critical error? */
case CURLE_FAILED_INIT:
case CURLE_OUT_OF_MEMORY:
case CURLE_UNKNOWN_OPTION:
@@ -201,536 +188,205 @@ static curl_off_t VmsSpecialSize(const char *name,
#define BUFFER_SIZE (100*1024)
-struct per_transfer *transfers; /* first node */
-static struct per_transfer *transfersl; /* last node */
-
-/* add_per_transfer creates a new 'per_transfer' node in the linked
- list of transfers */
-static CURLcode add_per_transfer(struct per_transfer **per)
-{
- struct per_transfer *p;
- p = calloc(sizeof(struct per_transfer), 1);
- if(!p)
- return CURLE_OUT_OF_MEMORY;
- if(!transfers)
- /* first entry */
- transfersl = transfers = p;
- else {
- /* make the last node point to the new node */
- transfersl->next = p;
- /* make the new node point back to the formerly last node */
- p->prev = transfersl;
- /* move the last node pointer to the new entry */
- transfersl = p;
- }
- *per = p;
- all_xfers++; /* count total number of transfers added */
- return CURLE_OK;
-}
-
-/* Remove the specified transfer from the list (and free it), return the next
- in line */
-static struct per_transfer *del_per_transfer(struct per_transfer *per)
+static CURLcode operate_do(struct GlobalConfig *global,
+ struct OperationConfig *config)
{
- struct per_transfer *n;
- struct per_transfer *p;
- DEBUGASSERT(transfers);
- DEBUGASSERT(transfersl);
- DEBUGASSERT(per);
-
- n = per->next;
- p = per->prev;
-
- if(p)
- p->next = n;
- else
- transfers = n;
+ char errorbuffer[CURL_ERROR_SIZE];
+ struct ProgressData progressbar;
+ struct getout *urlnode;
- if(n)
- n->prev = p;
- else
- transfersl = p;
+ struct HdrCbData hdrcbdata;
+ struct OutStruct heads;
- free(per);
+ metalinkfile *mlfile_last = NULL;
- return n;
-}
+ CURL *curl = config->easy;
+ char *httpgetfields = NULL;
-static CURLcode pre_transfer(struct GlobalConfig *global,
- struct per_transfer *per)
-{
- curl_off_t uploadfilesize = -1;
- struct_stat fileinfo;
CURLcode result = CURLE_OK;
+ unsigned long li;
+ bool capath_from_env;
- if(per->separator_err)
- fprintf(global->errors, "%s\n", per->separator_err);
- if(per->separator)
- printf("%s\n", per->separator);
-
- if(per->uploadfile && !stdin_upload(per->uploadfile)) {
- /* VMS Note:
- *
- * Reading binary from files can be a problem... Only FIXED, VAR
- * etc WITHOUT implied CC will work Others need a \n appended to a
- * line
- *
- * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
- * fixed file with implied CC needs to have a byte added for every
- * record processed, this can by derived from Filesize & recordsize
- * for VARiable record files the records need to be counted! for
- * every record add 1 for linefeed and subtract 2 for the record
- * header for VARIABLE header files only the bare record data needs
- * to be considered with one appended if implied CC
- */
-#ifdef __VMS
- /* Calculate the real upload size for VMS */
- per->infd = -1;
- if(stat(per->uploadfile, &fileinfo) == 0) {
- fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
- switch(fileinfo.st_fab_rfm) {
- case FAB$C_VAR:
- case FAB$C_VFC:
- case FAB$C_STMCR:
- per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
- break;
- default:
- per->infd = open(per->uploadfile, O_RDONLY | O_BINARY,
- "rfm=stmlf", "ctx=stm");
- }
- }
- if(per->infd == -1)
-#else
- per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
- if((per->infd == -1) || fstat(per->infd, &fileinfo))
-#endif
- {
- helpf(global->errors, "Can't open '%s'!\n", per->uploadfile);
- if(per->infd != -1) {
- close(per->infd);
- per->infd = STDIN_FILENO;
- }
- return CURLE_READ_ERROR;
- }
- per->infdopen = TRUE;
-
- /* we ignore file size for char/block devices, sockets, etc. */
- if(S_ISREG(fileinfo.st_mode))
- uploadfilesize = fileinfo.st_size;
-
- if(uploadfilesize != -1)
- my_setopt(per->curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
- per->input.fd = per->infd;
- }
- return result;
-}
-
-/*
- * Call this after a transfer has completed.
- */
-static CURLcode post_per_transfer(struct GlobalConfig *global,
- struct per_transfer *per,
- CURLcode result,
- bool *retryp)
-{
- struct OutStruct *outs = &per->outs;
- CURL *curl = per->curl;
- struct OperationConfig *config = per->config;
-
- if(!curl || !config)
- return result;
-
- *retryp = FALSE;
-
- if(per->infdopen)
- close(per->infd);
-
-#ifdef __VMS
- if(is_vms_shell()) {
- /* VMS DCL shell behavior */
- if(!global->showerror)
- vms_show = VMSSTS_HIDE;
- }
- else
-#endif
- if(config->synthetic_error) {
- ;
- }
- else if(result && global->showerror) {
- fprintf(global->errors, "curl: (%d) %s\n", result,
- (per->errorbuffer[0]) ? per->errorbuffer :
- curl_easy_strerror(result));
- if(result == CURLE_PEER_FAILED_VERIFICATION)
- fputs(CURL_CA_CERT_ERRORMSG, global->errors);
- }
+ /* Save the values of noprogress and isatty to restore them later on */
+ bool orig_noprogress = global->noprogress;
+ bool orig_isatty = global->isatty;
- /* Set file extended attributes */
- if(!result && config->xattr && outs->fopened && outs->stream) {
- int rc = fwrite_xattr(curl, fileno(outs->stream));
- if(rc)
- warnf(config->global, "Error setting extended attributes: %s\n",
- strerror(errno));
- }
+ errorbuffer[0] = '\0';
- if(!result && !outs->stream && !outs->bytes) {
- /* we have received no data despite the transfer was successful
- ==> force cration of an empty output file (if an output file
- was specified) */
- long cond_unmet = 0L;
- /* do not create (or even overwrite) the file in case we get no
- data because of unmet condition */
- curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
- if(!cond_unmet && !tool_create_output_file(outs))
- result = CURLE_WRITE_ERROR;
- }
+ /* default headers output stream is stdout */
+ memset(&hdrcbdata, 0, sizeof(struct HdrCbData));
+ memset(&heads, 0, sizeof(struct OutStruct));
+ heads.stream = stdout;
+ heads.config = config;
- if(!outs->s_isreg && outs->stream) {
- /* Dump standard stream buffered data */
- int rc = fflush(outs->stream);
- if(!result && rc) {
- /* something went wrong in the writing process */
- result = CURLE_WRITE_ERROR;
- fprintf(global->errors, "(%d) Failed writing body\n", result);
- }
- }
+ /*
+ ** Beyond this point no return'ing from this function allowed.
+ ** Jump to label 'quit_curl' in order to abandon this function
+ ** from outside of nested loops further down below.
+ */
-#ifdef USE_METALINK
- if(per->metalink && !per->metalink_next_res)
- fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
- per->mlfile->filename, per->this_url);
-
- if(!per->metalink && config->use_metalink && result == CURLE_OK) {
- int rv = parse_metalink(config, outs, per->this_url);
- if(!rv) {
- fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
- per->this_url);
- }
- else if(rv == -1)
- fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
- per->this_url);
- }
- else if(per->metalink && result == CURLE_OK && !per->metalink_next_res) {
- int rv;
- (void)fflush(outs->stream);
- rv = metalink_check_hash(global, per->mlfile, outs->filename);
- if(!rv)
- per->metalink_next_res = 1;
+ /* Check we have a url */
+ if(!config->url_list || !config->url_list->url) {
+ helpf(global->errors, "no URL specified!\n");
+ result = CURLE_FAILED_INIT;
+ goto quit_curl;
}
-#endif /* USE_METALINK */
-
-#ifdef USE_METALINK
- if(outs->metalink_parser)
- metalink_parser_context_delete(outs->metalink_parser);
-#endif /* USE_METALINK */
- if(outs->is_cd_filename && outs->stream && !global->mute &&
- outs->filename)
- printf("curl: Saved to filename '%s'\n", outs->filename);
-
- /* if retry-max-time is non-zero, make sure we haven't exceeded the
- time */
- if(per->retry_numretries &&
- (!config->retry_maxtime ||
- (tvdiff(tvnow(), per->retrystart) <
- config->retry_maxtime*1000L)) ) {
- enum {
- RETRY_NO,
- RETRY_TIMEOUT,
- RETRY_CONNREFUSED,
- RETRY_HTTP,
- RETRY_FTP,
- RETRY_LAST /* not used */
- } retry = RETRY_NO;
- long response;
- if((CURLE_OPERATION_TIMEDOUT == result) ||
- (CURLE_COULDNT_RESOLVE_HOST == result) ||
- (CURLE_COULDNT_RESOLVE_PROXY == result) ||
- (CURLE_FTP_ACCEPT_TIMEOUT == result))
- /* retry timeout always */
- retry = RETRY_TIMEOUT;
- else if(config->retry_connrefused &&
- (CURLE_COULDNT_CONNECT == result)) {
- long oserrno;
- curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
- if(ECONNREFUSED == oserrno)
- retry = RETRY_CONNREFUSED;
- }
- else if((CURLE_OK == result) ||
- (config->failonerror &&
- (CURLE_HTTP_RETURNED_ERROR == result))) {
- /* If it returned OK. _or_ failonerror was enabled and it
- returned due to such an error, check for HTTP transient
- errors to retry on. */
- long protocol;
- curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
- if((protocol == CURLPROTO_HTTP) || (protocol == CURLPROTO_HTTPS)) {
- /* This was HTTP(S) */
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
-
- switch(response) {
- case 429: /* Too Many Requests (RFC6585) */
- case 500: /* Internal Server Error */
- case 502: /* Bad Gateway */
- case 503: /* Service Unavailable */
- case 504: /* Gateway Timeout */
- retry = RETRY_HTTP;
- /*
- * At this point, we have already written data to the output
- * file (or terminal). If we write to a file, we must rewind
- * or close/re-open the file so that the next attempt starts
- * over from the beginning.
- *
- * TODO: similar action for the upload case. We might need
- * to start over reading from a previous point if we have
- * uploaded something when this was returned.
- */
- break;
- }
- }
- } /* if CURLE_OK */
- else if(result) {
- long protocol;
-
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
- curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+ /* On WIN32 we can't set the path to curl-ca-bundle.crt
+ * at compile time. So we look here for the file in two ways:
+ * 1: look at the environment variable CURL_CA_BUNDLE for a path
+ * 2: if #1 isn't found, use the windows API function SearchPath()
+ * to find it along the app's path (includes app's dir and CWD)
+ *
+ * We support the environment variable thing for non-Windows platforms
+ * too. Just for the sake of it.
+ */
+ capath_from_env = false;
+ if(!config->cacert &&
+ !config->capath &&
+ !config->insecure_ok) {
+ struct curl_tlssessioninfo *tls_backend_info = NULL;
- if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
- response / 100 == 4)
- /*
- * This is typically when the FTP server only allows a certain
- * amount of users and we are not one of them. All 4xx codes
- * are transient.
- */
- retry = RETRY_FTP;
+ /* With the addition of CAINFO support for Schannel, this search could find
+ * a certificate bundle that was previously ignored. To maintain backward
+ * compatibility, only perform this search if not using Schannel.
+ */
+ result = curl_easy_getinfo(config->easy,
+ CURLINFO_TLS_SSL_PTR,
+ &tls_backend_info);
+ if(result) {
+ goto quit_curl;
}
- if(retry) {
- long sleeptime = 0;
- curl_off_t retry_after = 0;
- static const char * const m[]={
- NULL,
- "timeout",
- "connection refused",
- "HTTP error",
- "FTP error"
- };
-
- sleeptime = per->retry_sleep;
- if(RETRY_HTTP == retry) {
- curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
- if(retry_after) {
- /* store in a 'long', make sure it doesn't overflow */
- if(retry_after > LONG_MAX/1000)
- sleeptime = LONG_MAX;
- else
- sleeptime = (long)retry_after * 1000; /* milliseconds */
+ /* Set the CA cert locations specified in the environment. For Windows if
+ * no environment-specified filename is found then check for CA bundle
+ * default filename curl-ca-bundle.crt in the user's PATH.
+ *
+ * If Schannel is the selected SSL backend then these locations are
+ * ignored. We allow setting CA location for schannel only when explicitly
+ * specified by the user via CURLOPT_CAINFO / --cacert.
+ */
+ if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
+ char *env;
+ env = curlx_getenv("CURL_CA_BUNDLE");
+ if(env) {
+ config->cacert = strdup(env);
+ if(!config->cacert) {
+ curl_free(env);
+ helpf(global->errors, "out of memory\n");
+ result = CURLE_OUT_OF_MEMORY;
+ goto quit_curl;
}
}
- warnf(config->global, "Transient problem: %s "
- "Will retry in %ld seconds. "
- "%ld retries left.\n",
- m[retry], sleeptime/1000L, per->retry_numretries);
-
- per->retry_numretries--;
- tool_go_sleep(sleeptime);
- if(!config->retry_delay) {
- per->retry_sleep *= 2;
- if(per->retry_sleep > RETRY_SLEEP_MAX)
- per->retry_sleep = RETRY_SLEEP_MAX;
- }
- if(outs->bytes && outs->filename && outs->stream) {
- int rc;
- /* We have written data to a output file, we truncate file
- */
- if(!global->mute)
- fprintf(global->errors, "Throwing away %"
- CURL_FORMAT_CURL_OFF_T " bytes\n",
- outs->bytes);
- fflush(outs->stream);
- /* truncate file at the position where we started appending */
-#ifdef HAVE_FTRUNCATE
- if(ftruncate(fileno(outs->stream), outs->init)) {
- /* when truncate fails, we can't just append as then we'll
- create something strange, bail out */
- if(!global->mute)
- fprintf(global->errors,
- "failed to truncate, exiting\n");
- return CURLE_WRITE_ERROR;
- }
- /* now seek to the end of the file, the position where we
- just truncated the file in a large file-safe way */
- rc = fseek(outs->stream, 0, SEEK_END);
-#else
- /* ftruncate is not available, so just reposition the file
- to the location we would have truncated it. This won't
- work properly with large files on 32-bit systems, but
- most of those will have ftruncate. */
- rc = fseek(outs->stream, (long)outs->init, SEEK_SET);
-#endif
- if(rc) {
- if(!global->mute)
- fprintf(global->errors,
- "failed seeking to end of file, exiting\n");
- return CURLE_WRITE_ERROR;
+ else {
+ env = curlx_getenv("SSL_CERT_DIR");
+ if(env) {
+ config->capath = strdup(env);
+ if(!config->capath) {
+ curl_free(env);
+ helpf(global->errors, "out of memory\n");
+ result = CURLE_OUT_OF_MEMORY;
+ goto quit_curl;
+ }
+ capath_from_env = true;
}
- outs->bytes = 0; /* clear for next round */
- }
- *retryp = TRUE; /* curl_easy_perform loop */
- return CURLE_OK;
- }
- } /* if retry_numretries */
- else if(per->metalink) {
- /* Metalink: Decide to try the next resource or not. Try the next resource
- if download was not successful. */
- long response;
- if(CURLE_OK == result) {
- /* TODO We want to try next resource when download was
- not successful. How to know that? */
- char *effective_url = NULL;
- curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
- if(effective_url &&
- curl_strnequal(effective_url, "http", 4)) {
- /* This was HTTP(S) */
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
- if(response != 200 && response != 206) {
- per->metalink_next_res = 1;
- fprintf(global->errors,
- "Metalink: fetching (%s) from (%s) FAILED "
- "(HTTP status code %ld)\n",
- per->mlfile->filename, per->this_url, response);
+ else {
+ env = curlx_getenv("SSL_CERT_FILE");
+ if(env) {
+ config->cacert = strdup(env);
+ if(!config->cacert) {
+ curl_free(env);
+ helpf(global->errors, "out of memory\n");
+ result = CURLE_OUT_OF_MEMORY;
+ goto quit_curl;
+ }
+ }
}
}
- }
- else {
- per->metalink_next_res = 1;
- fprintf(global->errors,
- "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
- per->mlfile->filename, per->this_url,
- curl_easy_strerror(result));
- }
- }
-
- if((global->progressmode == CURL_PROGRESS_BAR) &&
- per->progressbar.calls)
- /* if the custom progress bar has been displayed, we output a
- newline here */
- fputs("\n", per->progressbar.out);
-
- if(config->writeout)
- ourWriteOut(per->curl, &per->outs, config->writeout);
-
- /* Close the outs file */
- if(outs->fopened && outs->stream) {
- int rc = fclose(outs->stream);
- if(!result && rc) {
- /* something went wrong in the writing process */
- result = CURLE_WRITE_ERROR;
- fprintf(global->errors, "(%d) Failed writing body\n", result);
- }
- }
-
- /* File time can only be set _after_ the file has been closed */
- if(!result && config->remote_time && outs->s_isreg && outs->filename) {
- /* Ask libcurl if we got a remote file time */
- curl_off_t filetime = -1;
- curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
- setfiletime(filetime, outs->filename, config->global->errors);
- }
-
- /* Close function-local opened file descriptors */
- if(per->heads.fopened && per->heads.stream)
- fclose(per->heads.stream);
-
- if(per->heads.alloc_filename)
- Curl_safefree(per->heads.filename);
-
- curl_easy_cleanup(per->curl);
- if(outs->alloc_filename)
- free(outs->filename);
- free(per->this_url);
- free(per->separator_err);
- free(per->separator);
- free(per->outfile);
- free(per->uploadfile);
-
- return CURLE_OK;
-}
-static void single_transfer_cleanup(struct OperationConfig *config)
-{
- if(config) {
- struct State *state = &config->state;
- if(state->urls) {
- /* Free list of remaining URLs */
- glob_cleanup(state->urls);
- state->urls = NULL;
- }
- Curl_safefree(state->outfiles);
- Curl_safefree(state->httpgetfields);
- Curl_safefree(state->uploadfile);
- if(state->inglob) {
- /* Free list of globbed upload files */
- glob_cleanup(state->inglob);
- state->inglob = NULL;
+ if(env)
+ curl_free(env);
+#ifdef WIN32
+ else {
+ result = FindWin32CACert(config, tls_backend_info->backend,
+ "curl-ca-bundle.crt");
+ if(result)
+ goto quit_curl;
+ }
+#endif
}
}
-}
-
-/* create the next (singular) transfer */
-
-static CURLcode single_transfer(struct GlobalConfig *global,
- struct OperationConfig *config,
- CURLSH *share,
- bool capath_from_env,
- bool *added)
-{
- CURLcode result = CURLE_OK;
- struct getout *urlnode;
- metalinkfile *mlfile_last = NULL;
- bool orig_noprogress = global->noprogress;
- bool orig_isatty = global->isatty;
- struct State *state = &config->state;
- char *httpgetfields = state->httpgetfields;
- *added = FALSE; /* not yet */
if(config->postfields) {
if(config->use_httpget) {
+ /* Use the postfields data for a http get */
+ httpgetfields = strdup(config->postfields);
+ Curl_safefree(config->postfields);
if(!httpgetfields) {
- /* Use the postfields data for a http get */
- httpgetfields = state->httpgetfields = strdup(config->postfields);
- Curl_safefree(config->postfields);
- if(!httpgetfields) {
- helpf(global->errors, "out of memory\n");
- result = CURLE_OUT_OF_MEMORY;
- }
- else if(SetHTTPrequest(config,
- (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET),
- &config->httpreq)) {
- result = CURLE_FAILED_INIT;
- }
+ helpf(global->errors, "out of memory\n");
+ result = CURLE_OUT_OF_MEMORY;
+ goto quit_curl;
+ }
+ if(SetHTTPrequest(config,
+ (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET),
+ &config->httpreq)) {
+ result = CURLE_FAILED_INIT;
+ goto quit_curl;
}
}
else {
- if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq))
+ if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) {
result = CURLE_FAILED_INIT;
+ goto quit_curl;
+ }
}
- if(result)
- return result;
}
- if(!state->urlnode) {
- /* first time caller, setup things */
- state->urlnode = config->url_list;
- state->infilenum = 1;
+
+ /* Single header file for all URLs */
+ if(config->headerfile) {
+ /* open file for output: */
+ if(strcmp(config->headerfile, "-")) {
+ FILE *newfile = fopen(config->headerfile, "wb");
+ if(!newfile) {
+ warnf(config->global, "Failed to open %s\n", config->headerfile);
+ result = CURLE_WRITE_ERROR;
+ goto quit_curl;
+ }
+ else {
+ heads.filename = config->headerfile;
+ heads.s_isreg = TRUE;
+ heads.fopened = TRUE;
+ heads.stream = newfile;
+ }
+ }
+ else {
+ /* always use binary mode for protocol header output */
+ set_binmode(heads.stream);
+ }
}
- while(config->state.urlnode) {
+ /*
+ ** Nested loops start here.
+ */
+
+ /* loop through the list of given URLs */
+
+ for(urlnode = config->url_list; urlnode; urlnode = urlnode->next) {
+
+ unsigned long up; /* upload file counter within a single upload glob */
char *infiles; /* might be a glob pattern */
- URLGlob *inglob = state->inglob;
- bool metalink = FALSE; /* metalink download? */
+ char *outfiles;
+ unsigned long infilenum;
+ URLGlob *inglob;
+
+ int metalink = 0; /* nonzero for metalink download. */
metalinkfile *mlfile;
metalink_resource *mlres;
- urlnode = config->state.urlnode;
+ outfiles = NULL;
+ infilenum = 1;
+ inglob = NULL;
+
if(urlnode->flags & GETOUT_METALINK) {
metalink = 1;
if(mlfile_last == NULL) {
@@ -753,15 +409,13 @@ static CURLcode single_transfer(struct GlobalConfig *global,
Curl_safefree(urlnode->outfile);
Curl_safefree(urlnode->infile);
urlnode->flags = 0;
- config->state.urlnode = urlnode->next;
- state->up = 0;
continue; /* next URL please */
}
/* save outfile pattern before expansion */
- if(urlnode->outfile && !state->outfiles) {
- state->outfiles = strdup(urlnode->outfile);
- if(!state->outfiles) {
+ if(urlnode->outfile) {
+ outfiles = strdup(urlnode->outfile);
+ if(!outfiles) {
helpf(global->errors, "out of memory\n");
result = CURLE_OUT_OF_MEMORY;
break;
@@ -770,182 +424,140 @@ static CURLcode single_transfer(struct GlobalConfig *global,
infiles = urlnode->infile;
- if(!config->globoff && infiles && !inglob) {
+ if(!config->globoff && infiles) {
/* Unless explicitly shut off */
- result = glob_url(&inglob, infiles, &state->infilenum,
+ result = glob_url(&inglob, infiles, &infilenum,
global->showerror?global->errors:NULL);
- if(result)
+ if(result) {
+ Curl_safefree(outfiles);
break;
- config->state.inglob = inglob;
+ }
}
- {
+ /* Here's the loop for uploading multiple files within the same
+ single globbed string. If no upload, we enter the loop once anyway. */
+ for(up = 0 ; up < infilenum; up++) {
+
+ char *uploadfile; /* a single file, never a glob */
int separator;
+ URLGlob *urls;
unsigned long urlnum;
- if(!state->up && !infiles)
+ uploadfile = NULL;
+ urls = NULL;
+ urlnum = 0;
+
+ if(!up && !infiles)
Curl_nop_stmt;
else {
- if(!state->uploadfile) {
- if(inglob) {
- result = glob_next_url(&state->uploadfile, inglob);
- if(result == CURLE_OUT_OF_MEMORY)
- helpf(global->errors, "out of memory\n");
- }
- else if(!state->up) {
- state->uploadfile = strdup(infiles);
- if(!state->uploadfile) {
- helpf(global->errors, "out of memory\n");
- result = CURLE_OUT_OF_MEMORY;
- }
+ if(inglob) {
+ result = glob_next_url(&uploadfile, inglob);
+ if(result == CURLE_OUT_OF_MEMORY)
+ helpf(global->errors, "out of memory\n");
+ }
+ else if(!up) {
+ uploadfile = strdup(infiles);
+ if(!uploadfile) {
+ helpf(global->errors, "out of memory\n");
+ result = CURLE_OUT_OF_MEMORY;
}
}
- if(result)
+ else
+ uploadfile = NULL;
+ if(!uploadfile)
break;
}
- if(!state->urlnum) {
- if(metalink) {
- /* For Metalink download, we don't use glob. Instead we use
- the number of resources as urlnum. */
- urlnum = count_next_metalink_resource(mlfile);
- }
- else if(!config->globoff) {
- /* Unless explicitly shut off, we expand '{...}' and '[...]'
- expressions and return total number of URLs in pattern set */
- result = glob_url(&state->urls, urlnode->url, &state->urlnum,
- global->showerror?global->errors:NULL);
- if(result)
- break;
- urlnum = state->urlnum;
+ if(metalink) {
+ /* For Metalink download, we don't use glob. Instead we use
+ the number of resources as urlnum. */
+ urlnum = count_next_metalink_resource(mlfile);
+ }
+ else if(!config->globoff) {
+ /* Unless explicitly shut off, we expand '{...}' and '[...]'
+ expressions and return total number of URLs in pattern set */
+ result = glob_url(&urls, urlnode->url, &urlnum,
+ global->showerror?global->errors:NULL);
+ if(result) {
+ Curl_safefree(uploadfile);
+ break;
}
- else
- urlnum = 1; /* without globbing, this is a single URL */
}
else
- urlnum = state->urlnum;
+ urlnum = 1; /* without globbing, this is a single URL */
/* if multiple files extracted to stdout, insert separators! */
- separator = ((!state->outfiles ||
- !strcmp(state->outfiles, "-")) && urlnum > 1);
+ separator = ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);
/* Here's looping around each globbed URL */
-
- if(state->li >= urlnum) {
- state->li = 0;
- state->up++;
- }
- if(state->up < state->infilenum) {
- struct per_transfer *per;
- struct OutStruct *outs;
- struct InStruct *input;
- struct OutStruct *heads;
- struct HdrCbData *hdrcbdata = NULL;
- CURL *curl = curl_easy_init();
- result = add_per_transfer(&per);
- if(result || !curl) {
- curl_easy_cleanup(curl);
- result = CURLE_OUT_OF_MEMORY;
- break;
- }
- if(state->uploadfile) {
- per->uploadfile = strdup(state->uploadfile);
- if(!per->uploadfile) {
- curl_easy_cleanup(curl);
- result = CURLE_OUT_OF_MEMORY;
- break;
- }
- }
- *added = TRUE;
- per->config = config;
- per->curl = curl;
-
- /* default headers output stream is stdout */
- heads = &per->heads;
- heads->stream = stdout;
- heads->config = config;
-
- /* Single header file for all URLs */
- if(config->headerfile) {
- /* open file for output: */
- if(strcmp(config->headerfile, "-")) {
- FILE *newfile = fopen(config->headerfile, "wb");
- if(!newfile) {
- warnf(config->global, "Failed to open %s\n", config->headerfile);
- result = CURLE_WRITE_ERROR;
- break;
- }
- else {
- heads->filename = config->headerfile;
- heads->s_isreg = TRUE;
- heads->fopened = TRUE;
- heads->stream = newfile;
- }
- }
- else {
- /* always use binary mode for protocol header output */
- set_binmode(heads->stream);
- }
- }
-
-
- hdrcbdata = &per->hdrcbdata;
-
- outs = &per->outs;
- input = &per->input;
-
- per->outfile = NULL;
- per->infdopen = FALSE;
- per->infd = STDIN_FILENO;
+ for(li = 0 ; li < urlnum; li++) {
+
+ int infd;
+ bool infdopen;
+ char *outfile;
+ struct OutStruct outs;
+ struct InStruct input;
+ struct timeval retrystart;
+ curl_off_t uploadfilesize;
+ long retry_numretries;
+ long retry_sleep_default;
+ long retry_sleep;
+ char *this_url = NULL;
+ int metalink_next_res = 0;
+
+ outfile = NULL;
+ infdopen = FALSE;
+ infd = STDIN_FILENO;
+ uploadfilesize = -1; /* -1 means unknown */
/* default output stream is stdout */
- outs->stream = stdout;
- outs->config = config;
+ memset(&outs, 0, sizeof(struct OutStruct));
+ outs.stream = stdout;
+ outs.config = config;
if(metalink) {
/* For Metalink download, use name in Metalink file as
filename. */
- per->outfile = strdup(mlfile->filename);
- if(!per->outfile) {
+ outfile = strdup(mlfile->filename);
+ if(!outfile) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
- per->this_url = strdup(mlres->url);
- if(!per->this_url) {
+ this_url = strdup(mlres->url);
+ if(!this_url) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
- per->mlfile = mlfile;
}
else {
- if(state->urls) {
- result = glob_next_url(&per->this_url, state->urls);
+ if(urls) {
+ result = glob_next_url(&this_url, urls);
if(result)
- break;
+ goto show_error;
}
- else if(!state->li) {
- per->this_url = strdup(urlnode->url);
- if(!per->this_url) {
+ else if(!li) {
+ this_url = strdup(urlnode->url);
+ if(!this_url) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
}
else
- per->this_url = NULL;
- if(!per->this_url)
+ this_url = NULL;
+ if(!this_url)
break;
- if(state->outfiles) {
- per->outfile = strdup(state->outfiles);
- if(!per->outfile) {
+ if(outfiles) {
+ outfile = strdup(outfiles);
+ if(!outfile) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
}
}
if(((urlnode->flags&GETOUT_USEREMOTE) ||
- (per->outfile && strcmp("-", per->outfile))) &&
+ (outfile && strcmp("-", outfile))) &&
(metalink || !config->use_metalink)) {
/*
@@ -953,26 +565,26 @@ static CURLcode single_transfer(struct GlobalConfig *global,
* decided we want to use the remote file name.
*/
- if(!per->outfile) {
+ if(!outfile) {
/* extract the file name from the URL */
- result = get_url_file_name(&per->outfile, per->this_url);
+ result = get_url_file_name(&outfile, this_url);
if(result)
- break;
- if(!*per->outfile && !config->content_disposition) {
+ goto show_error;
+ if(!*outfile && !config->content_disposition) {
helpf(global->errors, "Remote file name has no length!\n");
result = CURLE_WRITE_ERROR;
- break;
+ goto quit_urls;
}
}
- else if(state->urls) {
+ else if(urls) {
/* fill '#1' ... '#9' terms from URL pattern */
- char *storefile = per->outfile;
- result = glob_match_url(&per->outfile, storefile, state->urls);
+ char *storefile = outfile;
+ result = glob_match_url(&outfile, storefile, urls);
Curl_safefree(storefile);
if(result) {
/* bad globbing */
warnf(config->global, "bad output glob!\n");
- break;
+ goto quit_urls;
}
}
@@ -980,16 +592,19 @@ static CURLcode single_transfer(struct GlobalConfig *global,
file output call */
if(config->create_dirs || metalink) {
- result = create_dir_hierarchy(per->outfile, global->errors);
+ result = create_dir_hierarchy(outfile, global->errors);
/* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */
- if(result)
- break;
+ if(result == CURLE_WRITE_ERROR)
+ goto quit_urls;
+ if(result) {
+ goto show_error;
+ }
}
if((urlnode->flags & GETOUT_USEREMOTE)
&& config->content_disposition) {
/* Our header callback MIGHT set the filename */
- DEBUGASSERT(!outs->filename);
+ DEBUGASSERT(!outs.filename);
}
if(config->resume_from_current) {
@@ -997,7 +612,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
of the file as it is now and open it for append instead */
struct_stat fileinfo;
/* VMS -- Danger, the filesize is only valid for stream files */
- if(0 == stat(per->outfile, &fileinfo))
+ if(0 == stat(outfile, &fileinfo))
/* set offset to current file size: */
config->resume_from = fileinfo.st_size;
else
@@ -1009,40 +624,91 @@ static CURLcode single_transfer(struct GlobalConfig *global,
#ifdef __VMS
/* open file for output, forcing VMS output format into stream
mode which is needed for stat() call above to always work. */
- FILE *file = fopen(outfile, "ab",
+ FILE *file = fopen(outfile, config->resume_from?"ab":"wb",
"ctx=stm", "rfm=stmlf", "rat=cr", "mrs=0");
#else
/* open file for output: */
- FILE *file = fopen(per->outfile, "ab");
+ FILE *file = fopen(outfile, config->resume_from?"ab":"wb");
#endif
if(!file) {
- helpf(global->errors, "Can't open '%s'!\n", per->outfile);
+ helpf(global->errors, "Can't open '%s'!\n", outfile);
result = CURLE_WRITE_ERROR;
- break;
+ goto quit_urls;
}
- outs->fopened = TRUE;
- outs->stream = file;
- outs->init = config->resume_from;
+ outs.fopened = TRUE;
+ outs.stream = file;
+ outs.init = config->resume_from;
}
else {
- outs->stream = NULL; /* open when needed */
+ outs.stream = NULL; /* open when needed */
}
- outs->filename = per->outfile;
- outs->s_isreg = TRUE;
+ outs.filename = outfile;
+ outs.s_isreg = TRUE;
}
- if(per->uploadfile && !stdin_upload(per->uploadfile)) {
+ if(uploadfile && !stdin_upload(uploadfile)) {
/*
* We have specified a file to upload and it isn't "-".
*/
- char *nurl = add_file_name_to_url(per->this_url, per->uploadfile);
- if(!nurl) {
+ struct_stat fileinfo;
+
+ this_url = add_file_name_to_url(curl, this_url, uploadfile);
+ if(!this_url) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
- per->this_url = nurl;
+ /* VMS Note:
+ *
+ * Reading binary from files can be a problem... Only FIXED, VAR
+ * etc WITHOUT implied CC will work Others need a \n appended to a
+ * line
+ *
+ * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
+ * fixed file with implied CC needs to have a byte added for every
+ * record processed, this can by derived from Filesize & recordsize
+ * for VARiable record files the records need to be counted! for
+ * every record add 1 for linefeed and subtract 2 for the record
+ * header for VARIABLE header files only the bare record data needs
+ * to be considered with one appended if implied CC
+ */
+#ifdef __VMS
+ /* Calculate the real upload size for VMS */
+ infd = -1;
+ if(stat(uploadfile, &fileinfo) == 0) {
+ fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
+ switch(fileinfo.st_fab_rfm) {
+ case FAB$C_VAR:
+ case FAB$C_VFC:
+ case FAB$C_STMCR:
+ infd = open(uploadfile, O_RDONLY | O_BINARY);
+ break;
+ default:
+ infd = open(uploadfile, O_RDONLY | O_BINARY,
+ "rfm=stmlf", "ctx=stm");
+ }
+ }
+ if(infd == -1)
+#else
+ infd = open(uploadfile, O_RDONLY | O_BINARY);
+ if((infd == -1) || fstat(infd, &fileinfo))
+#endif
+ {
+ helpf(global->errors, "Can't open '%s'!\n", uploadfile);
+ if(infd != -1) {
+ close(infd);
+ infd = STDIN_FILENO;
+ }
+ result = CURLE_READ_ERROR;
+ goto quit_urls;
+ }
+ infdopen = TRUE;
+
+ /* we ignore file size for char/block devices, sockets, etc. */
+ if(S_ISREG(fileinfo.st_mode))
+ uploadfilesize = fileinfo.st_size;
+
}
- else if(per->uploadfile && stdin_upload(per->uploadfile)) {
+ else if(uploadfile && stdin_upload(uploadfile)) {
/* count to see if there are more than one auth bit set
in the authtype field */
int authbits = 0;
@@ -1068,22 +734,22 @@ static CURLcode single_transfer(struct GlobalConfig *global,
" file or a fixed auth type instead!\n");
}
- DEBUGASSERT(per->infdopen == FALSE);
- DEBUGASSERT(per->infd == STDIN_FILENO);
+ DEBUGASSERT(infdopen == FALSE);
+ DEBUGASSERT(infd == STDIN_FILENO);
set_binmode(stdin);
- if(!strcmp(per->uploadfile, ".")) {
- if(curlx_nonblock((curl_socket_t)per->infd, TRUE) < 0)
+ if(!strcmp(uploadfile, ".")) {
+ if(curlx_nonblock((curl_socket_t)infd, TRUE) < 0)
warnf(config->global,
- "fcntl failed on fd=%d: %s\n", per->infd, strerror(errno));
+ "fcntl failed on fd=%d: %s\n", infd, strerror(errno));
}
}
- if(per->uploadfile && config->resume_from_current)
+ if(uploadfile && config->resume_from_current)
config->resume_from = -1; /* -1 will then force get-it-yourself */
- if(output_expected(per->this_url, per->uploadfile) && outs->stream &&
- isatty(fileno(outs->stream)))
+ if(output_expected(this_url, uploadfile) && outs.stream &&
+ isatty(fileno(outs.stream)))
/* we send the output to a tty, therefore we switch off the progress
meter */
global->noprogress = global->isatty = TRUE;
@@ -1095,22 +761,20 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
if(urlnum > 1 && !global->mute) {
- per->separator_err =
- aprintf("\n[%lu/%lu]: %s --> %s",
- state->li + 1, urlnum, per->this_url,
- per->outfile ? per->outfile : "<stdout>");
+ fprintf(global->errors, "\n[%lu/%lu]: %s --> %s\n",
+ li + 1, urlnum, this_url, outfile ? outfile : "<stdout>");
if(separator)
- per->separator = aprintf("%s%s", CURLseparator, per->this_url);
+ printf("%s%s\n", CURLseparator, this_url);
}
if(httpgetfields) {
char *urlbuffer;
/* Find out whether the url contains a file name */
- const char *pc = strstr(per->this_url, "://");
+ const char *pc = strstr(this_url, "://");
char sep = '?';
if(pc)
pc += 3;
else
- pc = per->this_url;
+ pc = this_url;
pc = strrchr(pc, '/'); /* check for a slash */
@@ -1126,40 +790,33 @@ static CURLcode single_transfer(struct GlobalConfig *global,
* Then append ? followed by the get fields to the url.
*/
if(pc)
- urlbuffer = aprintf("%s%c%s", per->this_url, sep, httpgetfields);
+ urlbuffer = aprintf("%s%c%s", this_url, sep, httpgetfields);
else
/* Append / before the ? to create a well-formed url
if the url contains a hostname only
*/
- urlbuffer = aprintf("%s/?%s", per->this_url, httpgetfields);
+ urlbuffer = aprintf("%s/?%s", this_url, httpgetfields);
if(!urlbuffer) {
result = CURLE_OUT_OF_MEMORY;
- break;
+ goto show_error;
}
- Curl_safefree(per->this_url); /* free previous URL */
- per->this_url = urlbuffer; /* use our new URL instead! */
+ Curl_safefree(this_url); /* free previous URL */
+ this_url = urlbuffer; /* use our new URL instead! */
}
if(!global->errors)
global->errors = stderr;
- if((!per->outfile || !strcmp(per->outfile, "-")) &&
- !config->use_ascii) {
+ if((!outfile || !strcmp(outfile, "-")) && !config->use_ascii) {
/* We get the output to stdout and we have not got the ASCII/text
flag, then set stdout to be binary */
set_binmode(stdout);
}
/* explicitly passed to stdout means okaying binary gunk */
- config->terminal_binary_ok =
- (per->outfile && !strcmp(per->outfile, "-"));
-
- /* Avoid having this setopt added to the --libcurl source output. */
- result = curl_easy_setopt(curl, CURLOPT_SHARE, share);
- if(result)
- break;
+ config->terminal_binary_ok = (outfile && !strcmp(outfile, "-"));
if(!config->tcp_nodelay)
my_setopt(curl, CURLOPT_TCP_NODELAY, 0L);
@@ -1168,9 +825,8 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
/* where to store */
- my_setopt(curl, CURLOPT_WRITEDATA, per);
- my_setopt(curl, CURLOPT_INTERLEAVEDATA, per);
-
+ my_setopt(curl, CURLOPT_WRITEDATA, &outs);
+ my_setopt(curl, CURLOPT_INTERLEAVEDATA, &outs);
if(metalink || !config->use_metalink)
/* what call to write */
my_setopt(curl, CURLOPT_WRITEFUNCTION, tool_write_cb);
@@ -1182,7 +838,8 @@ static CURLcode single_transfer(struct GlobalConfig *global,
#endif /* USE_METALINK */
/* for uploads */
- input->config = config;
+ input.fd = infd;
+ input.config = config;
/* Note that if CURLOPT_READFUNCTION is fread (the default), then
* lib/telnet.c will Curl_poll() on the input file descriptor
* rather then calling the READFUNCTION at regular intervals.
@@ -1190,13 +847,13 @@ static CURLcode single_transfer(struct GlobalConfig *global,
* behaviour, by omitting to set the READFUNCTION & READDATA options,
* have not been determined.
*/
- my_setopt(curl, CURLOPT_READDATA, input);
+ my_setopt(curl, CURLOPT_READDATA, &input);
/* what call to read */
my_setopt(curl, CURLOPT_READFUNCTION, tool_read_cb);
/* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what
CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */
- my_setopt(curl, CURLOPT_SEEKDATA, input);
+ my_setopt(curl, CURLOPT_SEEKDATA, &input);
my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb);
if(config->recvpersecond &&
@@ -1206,7 +863,10 @@ static CURLcode single_transfer(struct GlobalConfig *global,
else
my_setopt(curl, CURLOPT_BUFFERSIZE, (long)BUFFER_SIZE);
- my_setopt_str(curl, CURLOPT_URL, per->this_url);
+ /* size of uploaded file: */
+ if(uploadfilesize != -1)
+ my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
+ my_setopt_str(curl, CURLOPT_URL, this_url); /* what to fetch */
my_setopt(curl, CURLOPT_NOPROGRESS, global->noprogress?1L:0L);
if(config->no_body)
my_setopt(curl, CURLOPT_NOBODY, 1L);
@@ -1214,7 +874,10 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->oauth_bearer)
my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->oauth_bearer);
+#if !defined(CURL_DISABLE_PROXY)
{
+ /* TODO: Make this a run-time check instead of compile-time one. */
+
my_setopt_str(curl, CURLOPT_PROXY, config->proxy);
/* new in libcurl 7.5 */
if(config->proxy)
@@ -1252,10 +915,11 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS,
config->suppress_connect_headers?1L:0L);
}
+#endif /* !CURL_DISABLE_PROXY */
my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L);
my_setopt(curl, CURLOPT_REQUEST_TARGET, config->request_target);
- my_setopt(curl, CURLOPT_UPLOAD, per->uploadfile?1L:0L);
+ my_setopt(curl, CURLOPT_UPLOAD, uploadfile?1L:0L);
my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L);
my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);
@@ -1274,7 +938,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options);
my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
my_setopt_str(curl, CURLOPT_RANGE, config->range);
- my_setopt(curl, CURLOPT_ERRORBUFFER, per->errorbuffer);
+ my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));
switch(config->httpreq) {
@@ -1287,14 +951,12 @@ static CURLcode single_transfer(struct GlobalConfig *global,
case HTTPREQ_MIMEPOST:
result = tool2curlmime(curl, config->mimeroot, &config->mimepost);
if(result)
- break;
+ goto show_error;
my_setopt_mimepost(curl, CURLOPT_MIMEPOST, config->mimepost);
break;
default:
break;
}
- if(result)
- break;
/* new in libcurl 7.10.6 (default is Basic) */
if(config->authtype)
@@ -1404,12 +1066,11 @@ static CURLcode single_transfer(struct GlobalConfig *global,
"SSL_CERT_DIR environment variable":"--capath");
}
else if(result)
- break;
+ goto show_error;
}
/* For the time being if --proxy-capath is not set then we use the
--capath value for it, if any. See #1257 */
- if((config->proxy_capath || config->capath) &&
- !tool_setopt_skip(CURLOPT_PROXY_CAPATH)) {
+ if(config->proxy_capath || config->capath) {
result = res_setopt_str(curl, CURLOPT_PROXY_CAPATH,
(config->proxy_capath ?
config->proxy_capath :
@@ -1421,7 +1082,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
}
else if(result)
- break;
+ goto show_error;
}
if(config->crlfile)
@@ -1524,7 +1185,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
result = CURLE_OUT_OF_MEMORY;
home = homedir();
if(home) {
- file = aprintf("%s/.ssh/known_hosts", home);
+ file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR);
if(file) {
/* new in curl 7.19.6 */
result = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
@@ -1536,7 +1197,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
Curl_safefree(home);
}
if(result)
- break;
+ goto show_error;
}
}
@@ -1550,6 +1211,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote);
my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote);
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
if(config->cookie)
my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
@@ -1562,6 +1224,13 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* new in libcurl 7.9.7 */
my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession?1L:0L);
+#else
+ if(config->cookie || config->cookiefile || config->cookiejar) {
+ warnf(config->global, "cookie option(s) used even though cookie "
+ "support is disabled!\n");
+ return CURLE_NOT_BUILT_IN;
+ }
+#endif
my_setopt_enum(curl, CURLOPT_TIMECONDITION, (long)config->timecond);
my_setopt(curl, CURLOPT_TIMEVALUE_LARGE, config->condtime);
@@ -1572,14 +1241,14 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* three new ones in libcurl 7.3: */
my_setopt_str(curl, CURLOPT_INTERFACE, config->iface);
my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel);
- progressbarinit(&per->progressbar, config);
+ progressbarinit(&progressbar, config);
if((global->progressmode == CURL_PROGRESS_BAR) &&
!global->noprogress && !global->mute) {
/* we want the alternative style, then we have to implement it
ourselves! */
my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
- my_setopt(curl, CURLOPT_XFERINFODATA, &per->progressbar);
+ my_setopt(curl, CURLOPT_XFERINFODATA, &progressbar);
}
/* new in libcurl 7.24.0: */
@@ -1640,7 +1309,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->engine) {
result = res_setopt_str(curl, CURLOPT_SSLENGINE, config->engine);
if(result)
- break;
+ goto show_error;
}
/* new in curl 7.10.7, extended in 7.19.4. Modified to use
@@ -1701,6 +1370,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* curl 7.13.0 */
my_setopt_str(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
+
my_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl?1L:0L);
/* curl 7.14.2 */
@@ -1762,17 +1432,17 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->content_disposition
&& (urlnode->flags & GETOUT_USEREMOTE))
- hdrcbdata->honor_cd_filename = TRUE;
+ hdrcbdata.honor_cd_filename = TRUE;
else
- hdrcbdata->honor_cd_filename = FALSE;
+ hdrcbdata.honor_cd_filename = FALSE;
- hdrcbdata->outs = outs;
- hdrcbdata->heads = heads;
- hdrcbdata->global = global;
- hdrcbdata->config = config;
+ hdrcbdata.outs = &outs;
+ hdrcbdata.heads = &heads;
+ hdrcbdata.global = global;
+ hdrcbdata.config = config;
my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
- my_setopt(curl, CURLOPT_HEADERDATA, per);
+ my_setopt(curl, CURLOPT_HEADERDATA, &hdrcbdata);
if(config->resolve)
/* new in 7.21.3 */
@@ -1824,10 +1494,6 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->mail_auth)
my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth);
- /* new in 7.66.0 */
- if(config->sasl_authzid)
- my_setopt_str(curl, CURLOPT_SASL_AUTHZID, config->sasl_authzid);
-
/* new in 7.31.0 */
if(config->sasl_ir)
my_setopt(curl, CURLOPT_SASL_IR, 1L);
@@ -1851,7 +1517,6 @@ static CURLcode single_transfer(struct GlobalConfig *global,
config->unix_socket_path);
}
}
-
/* new in 7.45.0 */
if(config->proto_default)
my_setopt_str(curl, CURLOPT_DEFAULT_PROTOCOL, config->proto_default);
@@ -1883,426 +1548,481 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_ALTSVC, config->altsvc);
#endif
-#ifdef USE_METALINK
- if(!metalink && config->use_metalink) {
- outs->metalink_parser = metalink_parser_context_new();
- if(outs->metalink_parser == NULL) {
- result = CURLE_OUT_OF_MEMORY;
- break;
- }
- fprintf(config->global->errors,
- "Metalink: parsing (%s) metalink/XML...\n", per->this_url);
- }
- else if(metalink)
- fprintf(config->global->errors,
- "Metalink: fetching (%s) from (%s)...\n",
- mlfile->filename, per->this_url);
-#endif /* USE_METALINK */
-
- per->metalink = metalink;
/* initialize retry vars for loop below */
- per->retry_sleep_default = (config->retry_delay) ?
+ retry_sleep_default = (config->retry_delay) ?
config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */
- per->retry_numretries = config->req_retry;
- per->retry_sleep = per->retry_sleep_default; /* ms */
- per->retrystart = tvnow();
- state->li++;
- }
- else {
- /* Free this URL node data without destroying the
- the node itself nor modifying next pointer. */
- Curl_safefree(urlnode->outfile);
- Curl_safefree(urlnode->infile);
- urlnode->flags = 0;
- glob_cleanup(state->urls);
- state->urls = NULL;
- state->urlnum = 0;
-
- Curl_safefree(state->outfiles);
- Curl_safefree(state->uploadfile);
- if(state->inglob) {
- /* Free list of globbed upload files */
- glob_cleanup(state->inglob);
- state->inglob = NULL;
- }
- config->state.urlnode = urlnode->next;
- state->up = 0;
- continue;
- }
- }
- break;
- }
+ retry_numretries = config->req_retry;
+ retry_sleep = retry_sleep_default; /* ms */
+ retrystart = tvnow();
- if(!*added || result) {
- *added = FALSE;
- single_transfer_cleanup(config);
- }
- return result;
-}
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+ if(global->libcurl) {
+ result = easysrc_perform();
+ if(result)
+ goto show_error;
+ }
+#endif
-static long all_added; /* number of easy handles currently added */
+ for(;;) {
+#ifdef USE_METALINK
+ if(!metalink && config->use_metalink) {
+ /* If outs.metalink_parser is non-NULL, delete it first. */
+ if(outs.metalink_parser)
+ metalink_parser_context_delete(outs.metalink_parser);
+ outs.metalink_parser = metalink_parser_context_new();
+ if(outs.metalink_parser == NULL) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto show_error;
+ }
+ fprintf(config->global->errors,
+ "Metalink: parsing (%s) metalink/XML...\n", this_url);
+ }
+ else if(metalink)
+ fprintf(config->global->errors,
+ "Metalink: fetching (%s) from (%s)...\n",
+ mlfile->filename, this_url);
+#endif /* USE_METALINK */
-/*
- * add_parallel_transfers() sets 'morep' to TRUE if there are more transfers
- * to add even after this call returns. sets 'addedp' to TRUE if one or more
- * transfers were added.
- */
-static CURLcode add_parallel_transfers(struct GlobalConfig *global,
- CURLM *multi,
- CURLSH *share,
- bool *morep,
- bool *addedp)
-{
- struct per_transfer *per;
- CURLcode result = CURLE_OK;
- CURLMcode mcode;
- *addedp = FALSE;
- *morep = FALSE;
- result = create_transfer(global, share, addedp);
- if(result || !*addedp)
- return result;
- for(per = transfers; per && (all_added < global->parallel_max);
- per = per->next) {
- bool getadded = FALSE;
- if(per->added)
- /* already added */
- continue;
-
- result = pre_transfer(global, per);
- if(result)
- break;
-
- (void)curl_easy_setopt(per->curl, CURLOPT_PRIVATE, per);
- (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
- (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);
-
- mcode = curl_multi_add_handle(multi, per->curl);
- if(mcode)
- return CURLE_OUT_OF_MEMORY;
-
- result = create_transfer(global, share, &getadded);
- if(result)
- return result;
- per->added = TRUE;
- all_added++;
- *addedp = TRUE;
- }
- *morep = per ? TRUE : FALSE;
- return CURLE_OK;
-}
+#ifdef CURLDEBUG
+ if(config->test_event_based)
+ result = curl_easy_perform_ev(curl);
+ else
+#endif
+ result = curl_easy_perform(curl);
+
+ if(!result && !outs.stream && !outs.bytes) {
+ /* we have received no data despite the transfer was successful
+ ==> force cration of an empty output file (if an output file
+ was specified) */
+ long cond_unmet = 0L;
+ /* do not create (or even overwrite) the file in case we get no
+ data because of unmet condition */
+ curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
+ if(!cond_unmet && !tool_create_output_file(&outs))
+ result = CURLE_WRITE_ERROR;
+ }
-static CURLcode parallel_transfers(struct GlobalConfig *global,
- CURLSH *share)
-{
- CURLM *multi;
- CURLMcode mcode = CURLM_OK;
- CURLcode result = CURLE_OK;
- int still_running = 1;
- struct timeval start = tvnow();
- bool more_transfers;
- bool added_transfers;
-
- multi = curl_multi_init();
- if(!multi)
- return CURLE_OUT_OF_MEMORY;
-
- result = add_parallel_transfers(global, multi, share,
- &more_transfers, &added_transfers);
- if(result)
- return result;
-
- while(!mcode && (still_running || more_transfers)) {
- mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
- if(!mcode)
- mcode = curl_multi_perform(multi, &still_running);
-
- progress_meter(global, &start, FALSE);
-
- if(!mcode) {
- int rc;
- CURLMsg *msg;
- bool removed = FALSE;
- do {
- msg = curl_multi_info_read(multi, &rc);
- if(msg) {
- bool retry;
- struct per_transfer *ended;
- CURL *easy = msg->easy_handle;
- result = msg->data.result;
- curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
- curl_multi_remove_handle(multi, easy);
-
- result = post_per_transfer(global, ended, result, &retry);
- if(retry)
- continue;
- progress_finalize(ended); /* before it goes away */
- all_added--; /* one fewer added */
- removed = TRUE;
- (void)del_per_transfer(ended);
- }
- } while(msg);
- if(removed) {
- /* one or more transfers completed, add more! */
- (void)add_parallel_transfers(global, multi, share,
- &more_transfers,
- &added_transfers);
- if(added_transfers)
- /* we added new ones, make sure the loop doesn't exit yet */
- still_running = 1;
- }
- }
- }
+ if(outs.is_cd_filename && outs.stream && !global->mute &&
+ outs.filename)
+ printf("curl: Saved to filename '%s'\n", outs.filename);
+
+ /* if retry-max-time is non-zero, make sure we haven't exceeded the
+ time */
+ if(retry_numretries &&
+ (!config->retry_maxtime ||
+ (tvdiff(tvnow(), retrystart) <
+ config->retry_maxtime*1000L)) ) {
+ enum {
+ RETRY_NO,
+ RETRY_TIMEOUT,
+ RETRY_CONNREFUSED,
+ RETRY_HTTP,
+ RETRY_FTP,
+ RETRY_LAST /* not used */
+ } retry = RETRY_NO;
+ long response;
+ if((CURLE_OPERATION_TIMEDOUT == result) ||
+ (CURLE_COULDNT_RESOLVE_HOST == result) ||
+ (CURLE_COULDNT_RESOLVE_PROXY == result) ||
+ (CURLE_FTP_ACCEPT_TIMEOUT == result))
+ /* retry timeout always */
+ retry = RETRY_TIMEOUT;
+ else if(config->retry_connrefused &&
+ (CURLE_COULDNT_CONNECT == result)) {
+ long oserrno;
+ curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
+ if(ECONNREFUSED == oserrno)
+ retry = RETRY_CONNREFUSED;
+ }
+ else if((CURLE_OK == result) ||
+ (config->failonerror &&
+ (CURLE_HTTP_RETURNED_ERROR == result))) {
+ /* If it returned OK. _or_ failonerror was enabled and it
+ returned due to such an error, check for HTTP transient
+ errors to retry on. */
+ char *effective_url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
+ if(effective_url &&
+ checkprefix("http", effective_url)) {
+ /* This was HTTP(S) */
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+
+ switch(response) {
+ case 408: /* Request Timeout */
+ case 500: /* Internal Server Error */
+ case 502: /* Bad Gateway */
+ case 503: /* Service Unavailable */
+ case 504: /* Gateway Timeout */
+ retry = RETRY_HTTP;
+ /*
+ * At this point, we have already written data to the output
+ * file (or terminal). If we write to a file, we must rewind
+ * or close/re-open the file so that the next attempt starts
+ * over from the beginning.
+ *
+ * TODO: similar action for the upload case. We might need
+ * to start over reading from a previous point if we have
+ * uploaded something when this was returned.
+ */
+ break;
+ }
+ }
+ } /* if CURLE_OK */
+ else if(result) {
+ long protocol;
+
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+ curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+
+ if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
+ response / 100 == 4)
+ /*
+ * This is typically when the FTP server only allows a certain
+ * amount of users and we are not one of them. All 4xx codes
+ * are transient.
+ */
+ retry = RETRY_FTP;
+ }
- (void)progress_meter(global, &start, TRUE);
+ if(retry) {
+ static const char * const m[]={
+ NULL,
+ "timeout",
+ "connection refused",
+ "HTTP error",
+ "FTP error"
+ };
+
+ warnf(config->global, "Transient problem: %s "
+ "Will retry in %ld seconds. "
+ "%ld retries left.\n",
+ m[retry], retry_sleep/1000L, retry_numretries);
+
+ tool_go_sleep(retry_sleep);
+ retry_numretries--;
+ if(!config->retry_delay) {
+ retry_sleep *= 2;
+ if(retry_sleep > RETRY_SLEEP_MAX)
+ retry_sleep = RETRY_SLEEP_MAX;
+ }
+ if(outs.bytes && outs.filename && outs.stream) {
+ int rc;
+ /* We have written data to a output file, we truncate file
+ */
+ if(!global->mute)
+ fprintf(global->errors, "Throwing away %"
+ CURL_FORMAT_CURL_OFF_T " bytes\n",
+ outs.bytes);
+ fflush(outs.stream);
+ /* truncate file at the position where we started appending */
+#ifdef HAVE_FTRUNCATE
+ if(ftruncate(fileno(outs.stream), outs.init)) {
+ /* when truncate fails, we can't just append as then we'll
+ create something strange, bail out */
+ if(!global->mute)
+ fprintf(global->errors,
+ "failed to truncate, exiting\n");
+ result = CURLE_WRITE_ERROR;
+ goto quit_urls;
+ }
+ /* now seek to the end of the file, the position where we
+ just truncated the file in a large file-safe way */
+ rc = fseek(outs.stream, 0, SEEK_END);
+#else
+ /* ftruncate is not available, so just reposition the file
+ to the location we would have truncated it. This won't
+ work properly with large files on 32-bit systems, but
+ most of those will have ftruncate. */
+ rc = fseek(outs.stream, (long)outs.init, SEEK_SET);
+#endif
+ if(rc) {
+ if(!global->mute)
+ fprintf(global->errors,
+ "failed seeking to end of file, exiting\n");
+ result = CURLE_WRITE_ERROR;
+ goto quit_urls;
+ }
+ outs.bytes = 0; /* clear for next round */
+ }
+ continue; /* curl_easy_perform loop */
+ }
+ } /* if retry_numretries */
+ else if(metalink) {
+ /* Metalink: Decide to try the next resource or
+ not. Basically, we want to try the next resource if
+ download was not successful. */
+ long response;
+ if(CURLE_OK == result) {
+ /* TODO We want to try next resource when download was
+ not successful. How to know that? */
+ char *effective_url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
+ if(effective_url &&
+ curl_strnequal(effective_url, "http", 4)) {
+ /* This was HTTP(S) */
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+ if(response != 200 && response != 206) {
+ metalink_next_res = 1;
+ fprintf(global->errors,
+ "Metalink: fetching (%s) from (%s) FAILED "
+ "(HTTP status code %ld)\n",
+ mlfile->filename, this_url, response);
+ }
+ }
+ }
+ else {
+ metalink_next_res = 1;
+ fprintf(global->errors,
+ "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
+ mlfile->filename, this_url,
+ (errorbuffer[0]) ?
+ errorbuffer : curl_easy_strerror(result));
+ }
+ }
+ if(metalink && !metalink_next_res)
+ fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
+ mlfile->filename, this_url);
- /* Make sure to return some kind of error if there was a multi problem */
- if(mcode) {
- result = (mcode == CURLM_OUT_OF_MEMORY) ? CURLE_OUT_OF_MEMORY :
- /* The other multi errors should never happen, so return
- something suitably generic */
- CURLE_BAD_FUNCTION_ARGUMENT;
- }
+ /* In all ordinary cases, just break out of loop here */
+ break; /* curl_easy_perform loop */
- curl_multi_cleanup(multi);
+ }
- return result;
-}
+ if((global->progressmode == CURL_PROGRESS_BAR) &&
+ progressbar.calls)
+ /* if the custom progress bar has been displayed, we output a
+ newline here */
+ fputs("\n", progressbar.out);
-static CURLcode serial_transfers(struct GlobalConfig *global,
- CURLSH *share)
-{
- CURLcode returncode = CURLE_OK;
- CURLcode result = CURLE_OK;
- struct per_transfer *per;
- bool added = FALSE;
-
- result = create_transfer(global, share, &added);
- if(result || !added)
- return result;
- for(per = transfers; per;) {
- bool retry;
- bool bailout = FALSE;
- result = pre_transfer(global, per);
- if(result)
- break;
+ if(config->writeout)
+ ourWriteOut(curl, &outs, config->writeout);
-#ifndef CURL_DISABLE_LIBCURL_OPTION
- if(global->libcurl) {
- result = easysrc_perform();
- if(result)
- break;
- }
-#endif
-#ifdef CURLDEBUG
- if(global->test_event_based)
- result = curl_easy_perform_ev(per->curl);
- else
-#endif
- result = curl_easy_perform(per->curl);
+ /*
+ ** Code within this loop may jump directly here to label 'show_error'
+ ** in order to display an error message for CURLcode stored in 'res'
+ ** variable and exit loop once that necessary writing and cleanup
+ ** in label 'quit_urls' has been done.
+ */
- /* store the result of the actual transfer */
- returncode = result;
+ show_error:
- result = post_per_transfer(global, per, result, &retry);
- if(retry)
- continue;
+#ifdef __VMS
+ if(is_vms_shell()) {
+ /* VMS DCL shell behavior */
+ if(!global->showerror)
+ vms_show = VMSSTS_HIDE;
+ }
+ else
+#endif
+ if(config->synthetic_error) {
+ ;
+ }
+ else if(result && global->showerror) {
+ fprintf(global->errors, "curl: (%d) %s\n", result, (errorbuffer[0]) ?
+ errorbuffer : curl_easy_strerror(result));
+ if(result == CURLE_PEER_FAILED_VERIFICATION)
+ fputs(CURL_CA_CERT_ERRORMSG, global->errors);
+ }
- /* Bail out upon critical errors or --fail-early */
- if(result || is_fatal_error(returncode) ||
- (returncode && global->fail_early))
- bailout = TRUE;
- else {
- /* setup the next one just before we delete this */
- result = create_transfer(global, share, &added);
- if(result)
- bailout = TRUE;
- }
+ /* Fall through comment to 'quit_urls' label */
- /* Release metalink related resources here */
- delete_metalinkfile(per->mlfile);
+ /*
+ ** Upon error condition and always that a message has already been
+ ** displayed, code within this loop may jump directly here to label
+ ** 'quit_urls' otherwise it should jump to 'show_error' label above.
+ **
+ ** When 'res' variable is _not_ CURLE_OK loop will exit once that
+ ** all code following 'quit_urls' has been executed. Otherwise it
+ ** will loop to the beginning from where it may exit if there are
+ ** no more urls left.
+ */
+
+ quit_urls:
+
+ /* Set file extended attributes */
+ if(!result && config->xattr && outs.fopened && outs.stream) {
+ int rc = fwrite_xattr(curl, fileno(outs.stream));
+ if(rc)
+ warnf(config->global, "Error setting extended attributes: %s\n",
+ strerror(errno));
+ }
- per = del_per_transfer(per);
+ /* Close the file */
+ if(outs.fopened && outs.stream) {
+ int rc = fclose(outs.stream);
+ if(!result && rc) {
+ /* something went wrong in the writing process */
+ result = CURLE_WRITE_ERROR;
+ fprintf(global->errors, "(%d) Failed writing body\n", result);
+ }
+ }
+ else if(!outs.s_isreg && outs.stream) {
+ /* Dump standard stream buffered data */
+ int rc = fflush(outs.stream);
+ if(!result && rc) {
+ /* something went wrong in the writing process */
+ result = CURLE_WRITE_ERROR;
+ fprintf(global->errors, "(%d) Failed writing body\n", result);
+ }
+ }
- if(bailout)
- break;
- }
- if(returncode)
- /* returncode errors have priority */
- result = returncode;
+#ifdef __AMIGA__
+ if(!result && outs.s_isreg && outs.filename) {
+ /* Set the url (up to 80 chars) as comment for the file */
+ if(strlen(urlnode->url) > 78)
+ urlnode->url[79] = '\0';
+ SetComment(outs.filename, urlnode->url);
+ }
+#endif
- if(result)
- single_transfer_cleanup(global->current);
+ /* File time can only be set _after_ the file has been closed */
+ if(!result && config->remote_time && outs.s_isreg && outs.filename) {
+ /* Ask libcurl if we got a remote file time */
+ curl_off_t filetime = -1;
+ curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
+ setfiletime(filetime, outs.filename, config->global->errors);
+ }
- return result;
-}
+#ifdef USE_METALINK
+ if(!metalink && config->use_metalink && result == CURLE_OK) {
+ int rv = parse_metalink(config, &outs, this_url);
+ if(rv == 0)
+ fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
+ this_url);
+ else if(rv == -1)
+ fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
+ this_url);
+ }
+ else if(metalink && result == CURLE_OK && !metalink_next_res) {
+ int rv = metalink_check_hash(global, mlfile, outs.filename);
+ if(rv == 0) {
+ metalink_next_res = 1;
+ }
+ }
+#endif /* USE_METALINK */
-/* setup a transfer for the given config */
-static CURLcode transfer_per_config(struct GlobalConfig *global,
- struct OperationConfig *config,
- CURLSH *share,
- bool *added)
-{
- CURLcode result = CURLE_OK;
- bool capath_from_env;
- *added = FALSE;
+ /* No more business with this output struct */
+ if(outs.alloc_filename)
+ Curl_safefree(outs.filename);
+#ifdef USE_METALINK
+ if(outs.metalink_parser)
+ metalink_parser_context_delete(outs.metalink_parser);
+#endif /* USE_METALINK */
+ memset(&outs, 0, sizeof(struct OutStruct));
+ hdrcbdata.outs = NULL;
- /* Check we have a url */
- if(!config->url_list || !config->url_list->url) {
- helpf(global->errors, "no URL specified!\n");
- return CURLE_FAILED_INIT;
- }
+ /* Free loop-local allocated memory and close loop-local opened fd */
- /* On WIN32 we can't set the path to curl-ca-bundle.crt
- * at compile time. So we look here for the file in two ways:
- * 1: look at the environment variable CURL_CA_BUNDLE for a path
- * 2: if #1 isn't found, use the windows API function SearchPath()
- * to find it along the app's path (includes app's dir and CWD)
- *
- * We support the environment variable thing for non-Windows platforms
- * too. Just for the sake of it.
- */
- capath_from_env = false;
- if(!config->cacert &&
- !config->capath &&
- !config->insecure_ok) {
- CURL *curltls = curl_easy_init();
- struct curl_tlssessioninfo *tls_backend_info = NULL;
+ Curl_safefree(outfile);
+ Curl_safefree(this_url);
- /* With the addition of CAINFO support for Schannel, this search could find
- * a certificate bundle that was previously ignored. To maintain backward
- * compatibility, only perform this search if not using Schannel.
- */
- result = curl_easy_getinfo(curltls, CURLINFO_TLS_SSL_PTR,
- &tls_backend_info);
- if(result)
- return result;
+ if(infdopen)
+ close(infd);
- /* Set the CA cert locations specified in the environment. For Windows if
- * no environment-specified filename is found then check for CA bundle
- * default filename curl-ca-bundle.crt in the user's PATH.
- *
- * If Schannel is the selected SSL backend then these locations are
- * ignored. We allow setting CA location for schannel only when explicitly
- * specified by the user via CURLOPT_CAINFO / --cacert.
- */
- if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
- char *env;
- env = curlx_getenv("CURL_CA_BUNDLE");
- if(env) {
- config->cacert = strdup(env);
- if(!config->cacert) {
- curl_free(env);
- helpf(global->errors, "out of memory\n");
- return CURLE_OUT_OF_MEMORY;
- }
- }
- else {
- env = curlx_getenv("SSL_CERT_DIR");
- if(env) {
- config->capath = strdup(env);
- if(!config->capath) {
- curl_free(env);
- helpf(global->errors, "out of memory\n");
- return CURLE_OUT_OF_MEMORY;
+ if(metalink) {
+ /* Should exit if error is fatal. */
+ if(is_fatal_error(result)) {
+ break;
}
- capath_from_env = true;
+ if(!metalink_next_res)
+ break;
+ mlres = mlres->next;
+ if(mlres == NULL)
+ /* TODO If metalink_next_res is 1 and mlres is NULL,
+ * set res to error code
+ */
+ break;
}
- else {
- env = curlx_getenv("SSL_CERT_FILE");
- if(env) {
- config->cacert = strdup(env);
- if(!config->cacert) {
- curl_free(env);
- helpf(global->errors, "out of memory\n");
- return CURLE_OUT_OF_MEMORY;
- }
- }
+ else if(urlnum > 1) {
+ /* when url globbing, exit loop upon critical error */
+ if(is_fatal_error(result))
+ break;
}
+ else if(result)
+ /* when not url globbing, exit loop upon any error */
+ break;
+
+ } /* loop to the next URL */
+
+ /* Free loop-local allocated memory */
+
+ Curl_safefree(uploadfile);
+
+ if(urls) {
+ /* Free list of remaining URLs */
+ glob_cleanup(urls);
+ urls = NULL;
}
- if(env)
- curl_free(env);
-#ifdef WIN32
- else {
- result = FindWin32CACert(config, tls_backend_info->backend,
- "curl-ca-bundle.crt");
+ if(infilenum > 1) {
+ /* when file globbing, exit loop upon critical error */
+ if(is_fatal_error(result))
+ break;
}
-#endif
- }
- curl_easy_cleanup(curltls);
- }
+ else if(result)
+ /* when not file globbing, exit loop upon any error */
+ break;
- if(!result)
- result = single_transfer(global, config, share, capath_from_env, added);
+ } /* loop to the next globbed upload file */
- return result;
-}
+ /* Free loop-local allocated memory */
-/*
- * 'create_transfer' gets the details and sets up a new transfer if 'added'
- * returns TRUE.
- */
-static CURLcode create_transfer(struct GlobalConfig *global,
- CURLSH *share,
- bool *added)
-{
- CURLcode result = CURLE_OK;
- *added = FALSE;
- while(global->current) {
- result = transfer_per_config(global, global->current, share, added);
- if(!result && !*added) {
- /* when one set is drained, continue to next */
- global->current = global->current->next;
- continue;
+ Curl_safefree(outfiles);
+
+ if(inglob) {
+ /* Free list of globbed upload files */
+ glob_cleanup(inglob);
+ inglob = NULL;
}
- break;
- }
- return result;
-}
-static CURLcode run_all_transfers(struct GlobalConfig *global,
- CURLSH *share,
- CURLcode result)
-{
- /* Save the values of noprogress and isatty to restore them later on */
- bool orig_noprogress = global->noprogress;
- bool orig_isatty = global->isatty;
- struct per_transfer *per;
+ /* Free this URL node data without destroying the
+ the node itself nor modifying next pointer. */
+ Curl_safefree(urlnode->url);
+ Curl_safefree(urlnode->outfile);
+ Curl_safefree(urlnode->infile);
+ urlnode->flags = 0;
- /* Time to actually do the transfers */
- if(!result) {
- if(global->parallel)
- result = parallel_transfers(global, share);
- else
- result = serial_transfers(global, share);
- }
+ /*
+ ** Bail out upon critical errors or --fail-early
+ */
+ if(is_fatal_error(result) || (result && global->fail_early))
+ goto quit_curl;
- /* cleanup if there are any left */
- for(per = transfers; per;) {
- bool retry;
- CURLcode result2 = post_per_transfer(global, per, result, &retry);
- if(!result)
- /* don't overwrite the original error */
- result = result2;
+ } /* for-loop through all URLs */
- /* Free list of given URLs */
- clean_getout(per->config);
+ /*
+ ** Nested loops end here.
+ */
- /* Release metalink related resources here */
- clean_metalink(per->config);
- per = del_per_transfer(per);
- }
+ quit_curl:
/* Reset the global config variables */
global->noprogress = orig_noprogress;
global->isatty = orig_isatty;
+ /* Free function-local referenced allocated memory */
+ Curl_safefree(httpgetfields);
+
+ /* Free list of given URLs */
+ clean_getout(config);
+
+ hdrcbdata.heads = NULL;
+
+ /* Close function-local opened file descriptors */
+ if(heads.fopened && heads.stream)
+ fclose(heads.stream);
+
+ if(heads.alloc_filename)
+ Curl_safefree(heads.filename);
+
+ /* Release metalink related resources here */
+ clean_metalink(config);
return result;
}
-CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
+CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
{
CURLcode result = CURLE_OK;
@@ -2315,18 +2035,18 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
if((argc == 1) ||
(!curl_strequal(argv[1], "-q") &&
!curl_strequal(argv[1], "--disable"))) {
- parseconfig(NULL, global); /* ignore possible failure */
+ parseconfig(NULL, config); /* ignore possible failure */
/* If we had no arguments then make sure a url was specified in .curlrc */
- if((argc < 2) && (!global->first->url_list)) {
- helpf(global->errors, NULL);
+ if((argc < 2) && (!config->first->url_list)) {
+ helpf(config->errors, NULL);
result = CURLE_FAILED_INIT;
}
}
if(!result) {
/* Parse the command line arguments */
- ParameterError res = parse_args(global, argc, argv);
+ ParameterError res = parse_args(config, argc, argv);
if(res) {
result = CURLE_OK;
@@ -2341,7 +2061,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
tool_version_info();
/* Check if we were asked to list the SSL engines */
else if(res == PARAM_ENGINES_REQUESTED)
- tool_list_engines();
+ tool_list_engines(config->easy);
else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
result = CURLE_UNSUPPORTED_PROTOCOL;
else
@@ -2349,7 +2069,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
}
else {
#ifndef CURL_DISABLE_LIBCURL_OPTION
- if(global->libcurl) {
+ if(config->libcurl) {
/* Initialise the libcurl source output */
result = easysrc_init();
}
@@ -2358,50 +2078,40 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
/* Perform the main operations */
if(!result) {
size_t count = 0;
- struct OperationConfig *operation = global->first;
- CURLSH *share = curl_share_init();
- if(!share) {
-#ifndef CURL_DISABLE_LIBCURL_OPTION
- if(global->libcurl) {
- /* Cleanup the libcurl source output */
- easysrc_cleanup();
- }
-#endif
- return CURLE_OUT_OF_MEMORY;
- }
-
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_PSL);
+ struct OperationConfig *operation = config->first;
/* Get the required arguments for each operation */
- do {
+ while(!result && operation) {
result = get_args(operation, count++);
operation = operation->next;
- } while(!result && operation);
+ }
/* Set the current operation pointer */
- global->current = global->first;
+ config->current = config->first;
- /* now run! */
- result = run_all_transfers(global, share, result);
+ /* Perform each operation */
+ while(!result && config->current) {
+ result = operate_do(config, config->current);
+
+ config->current = config->current->next;
+
+ if(config->current && config->current->easy)
+ curl_easy_reset(config->current->easy);
+ }
- curl_share_cleanup(share);
#ifndef CURL_DISABLE_LIBCURL_OPTION
- if(global->libcurl) {
+ if(config->libcurl) {
/* Cleanup the libcurl source output */
easysrc_cleanup();
/* Dump the libcurl code if previously enabled */
- dumpeasysrc(global);
+ dumpeasysrc(config);
}
#endif
}
else
- helpf(global->errors, "out of memory\n");
+ helpf(config->errors, "out of memory\n");
}
}
diff --git a/src/tool_operate.h b/src/tool_operate.h
index 60257fc60..b84388bc5 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,53 +22,7 @@
*
***************************************************************************/
#include "tool_setup.h"
-#include "tool_cb_hdr.h"
-#include "tool_cb_prg.h"
-#include "tool_sdecls.h"
-
-struct per_transfer {
- /* double linked */
- struct per_transfer *next;
- struct per_transfer *prev;
- struct OperationConfig *config; /* for this transfer */
- CURL *curl;
- long retry_numretries;
- long retry_sleep_default;
- long retry_sleep;
- struct timeval retrystart;
- bool metalink; /* nonzero for metalink download. */
- bool metalink_next_res;
- metalinkfile *mlfile;
- metalink_resource *mlres;
- char *this_url;
- char *outfile;
- bool infdopen; /* TRUE if infd needs closing */
- int infd;
- struct ProgressData progressbar;
- struct OutStruct outs;
- struct OutStruct heads;
- struct InStruct input;
- struct HdrCbData hdrcbdata;
- char errorbuffer[CURL_ERROR_SIZE];
-
- bool added; /* set TRUE when added to the multi handle */
-
- /* for parallel progress bar */
- curl_off_t dltotal;
- curl_off_t dlnow;
- curl_off_t ultotal;
- curl_off_t ulnow;
- bool dltotal_added; /* if the total has been added from this */
- bool ultotal_added;
-
- /* NULL or malloced */
- char *separator_err;
- char *separator;
- char *uploadfile;
-};
CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]);
-extern struct per_transfer *transfers; /* first node */
-
#endif /* HEADER_CURL_TOOL_OPERATE_H */
diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c
index 543bf4302..c3a826278 100644
--- a/src/tool_operhlp.c
+++ b/src/tool_operhlp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,20 +37,18 @@
void clean_getout(struct OperationConfig *config)
{
- if(config) {
- struct getout *next;
- struct getout *node = config->url_list;
-
- while(node) {
- next = node->next;
- Curl_safefree(node->url);
- Curl_safefree(node->outfile);
- Curl_safefree(node->infile);
- Curl_safefree(node);
- node = next;
- }
- config->url_list = NULL;
+ struct getout *next;
+ struct getout *node = config->url_list;
+
+ while(node) {
+ next = node->next;
+ Curl_safefree(node->url);
+ Curl_safefree(node->outfile);
+ Curl_safefree(node->infile);
+ Curl_safefree(node);
+ node = next;
}
+ config->url_list = NULL;
}
bool output_expected(const char *url, const char *uploadfile)
@@ -73,13 +71,10 @@ bool stdin_upload(const char *uploadfile)
* Adds the file name to the URL if it doesn't already have one.
* url will be freed before return if the returned pointer is different
*/
-char *add_file_name_to_url(char *url, const char *filename)
+char *add_file_name_to_url(CURL *curl, char *url, const char *filename)
{
/* If no file name part is given in the URL, we add this file name */
char *ptr = strstr(url, "://");
- CURL *curl = curl_easy_init(); /* for url escaping */
- if(!curl)
- return NULL; /* error! */
if(ptr)
ptr += 3;
else
@@ -125,7 +120,6 @@ char *add_file_name_to_url(char *url, const char *filename)
else
Curl_safefree(url);
}
- curl_easy_cleanup(curl);
return url;
}
diff --git a/src/tool_operhlp.h b/src/tool_operhlp.h
index 1e2f02741..90c854929 100644
--- a/src/tool_operhlp.h
+++ b/src/tool_operhlp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@ bool output_expected(const char *url, const char *uploadfile);
bool stdin_upload(const char *uploadfile);
-char *add_file_name_to_url(char *url, const char *filename);
+char *add_file_name_to_url(CURL *curl, char *url, const char *filename);
CURLcode get_url_file_name(char **filename, const char *url);
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index af47516b6..3a4286c67 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -58,17 +58,12 @@ struct getout *new_getout(struct OperationConfig *config)
ParameterError file2string(char **bufp, FILE *file)
{
+ char *ptr;
char *string = NULL;
+
if(file) {
- char *ptr;
- size_t alloc = 512;
- size_t alloc_needed;
char buffer[256];
size_t stringlen = 0;
- string = malloc(alloc);
- if(!string)
- return PARAM_NO_MEM;
-
while(fgets(buffer, sizeof(buffer), file)) {
size_t buflen;
ptr = strchr(buffer, '\r');
@@ -78,24 +73,12 @@ ParameterError file2string(char **bufp, FILE *file)
if(ptr)
*ptr = '\0';
buflen = strlen(buffer);
- alloc_needed = stringlen + buflen + 1;
- if(alloc < alloc_needed) {
-#if SIZEOF_SIZE_T < 8
- if(alloc >= (size_t)SIZE_T_MAX/2) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
-#endif
- /* doubling is enough since the string to add is always max 256 bytes
- and the alloc size start at 512 */
- alloc *= 2;
- ptr = realloc(string, alloc);
- if(!ptr) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
- string = ptr;
+ ptr = realloc(string, stringlen + buflen + 1);
+ if(!ptr) {
+ Curl_safefree(string);
+ return PARAM_NO_MEM;
}
+ string = ptr;
strcpy(string + stringlen, buffer);
stringlen += buflen;
}
@@ -215,28 +198,6 @@ ParameterError str2unum(long *val, const char *str)
}
/*
- * Parse the string and write the long in the given address if it is below the
- * maximum allowed value. Return PARAM_OK on success, otherwise a parameter
- * error enum. ONLY ACCEPTS POSITIVE NUMBERS!
- *
- * Since this function gets called with the 'nextarg' pointer from within the
- * getparameter a lot, we must check it for NULL before accessing the str
- * data.
- */
-
-ParameterError str2unummax(long *val, const char *str, long max)
-{
- ParameterError result = str2unum(val, str);
- if(result != PARAM_OK)
- return result;
- if(*val > max)
- return PARAM_NUMBER_TOO_LARGE;
-
- return PARAM_OK;
-}
-
-
-/*
* Parse the string and write the double in the given address. Return PARAM_OK
* on success, otherwise a parameter specific error enum.
*
diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h
index f13a114fd..854f52256 100644
--- a/src/tool_paramhlp.h
+++ b/src/tool_paramhlp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -33,7 +33,6 @@ void cleanarg(char *str);
ParameterError str2num(long *val, const char *str);
ParameterError str2unum(long *val, const char *str);
-ParameterError str2unummax(long *val, const char *str, long max);
ParameterError str2udouble(double *val, const char *str, long max);
long proto2num(struct OperationConfig *config, long *val, const char *str);
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 9b32e54a0..e36b06c23 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,8 @@
#include "memdebug.h" /* keep this as LAST include */
+#define CURLRC DOT_CHAR "curlrc"
+
/* only acknowledge colon or equals as separators if the option was not
specified with an initial dash! */
#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))
@@ -41,96 +43,78 @@
static const char *unslashquote(const char *line, char *param);
static char *my_get_line(FILE *fp);
-#ifdef WIN32
-static FILE *execpath(const char *filename)
-{
- char filebuffer[512];
- /* Get the filename of our executable. GetModuleFileName is already declared
- * via inclusions done in setup header file. We assume that we are using
- * the ASCII version here.
- */
- unsigned long len = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
- if(len > 0 && len < sizeof(filebuffer)) {
- /* We got a valid filename - get the directory part */
- char *lastdirchar = strrchr(filebuffer, '\\');
- if(lastdirchar) {
- size_t remaining;
- *lastdirchar = 0;
- /* If we have enough space, build the RC filename */
- remaining = sizeof(filebuffer) - strlen(filebuffer);
- if(strlen(filename) < remaining - 1) {
- msnprintf(lastdirchar, remaining, "%s%s", DIR_CHAR, filename);
- return fopen(filebuffer, FOPEN_READTEXT);
- }
- }
- }
-
- return NULL;
-}
-#endif
-
-
/* return 0 on everything-is-fine, and non-zero otherwise */
int parseconfig(const char *filename, struct GlobalConfig *global)
{
- FILE *file = NULL;
+ FILE *file;
+ char filebuffer[512];
bool usedarg = FALSE;
int rc = 0;
struct OperationConfig *operation = global->first;
- char *pathalloc = NULL;
if(!filename || !*filename) {
/* NULL or no file name attempts to load .curlrc from the homedir! */
+#ifndef __AMIGA__
char *home = homedir(); /* portable homedir finder */
-#ifndef WIN32
- if(home) {
- pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
- if(!pathalloc) {
- free(home);
- return 1; /* out of memory */
- }
- filename = pathalloc;
- }
-#else /* Windows */
+ filename = CURLRC; /* sensible default */
if(home) {
- int i = 0;
- char prefix = '.';
- do {
- /* check for .curlrc then _curlrc in the home dir */
- pathalloc = curl_maprintf("%s%s%ccurlrc", home, DIR_CHAR, prefix);
- if(!pathalloc) {
- free(home);
- return 1; /* out of memory */
- }
+ if(strlen(home) < (sizeof(filebuffer) - strlen(CURLRC))) {
+ msnprintf(filebuffer, sizeof(filebuffer),
+ "%s%s%s", home, DIR_CHAR, CURLRC);
- /* Check if the file exists - if not, try _curlrc */
- file = fopen(pathalloc, FOPEN_READTEXT);
- if(file) {
- filename = pathalloc;
- break;
+#ifdef WIN32
+ /* Check if the file exists - if not, try CURLRC in the same
+ * directory as our executable
+ */
+ file = fopen(filebuffer, FOPEN_READTEXT);
+ if(file != NULL) {
+ fclose(file);
+ filename = filebuffer;
}
- prefix = '_';
- } while(++i < 2);
- }
- if(!filename) {
- /* check for .curlrc then _curlrc in the dir of the executable */
- file = execpath(".curlrc");
- if(!file)
- file = execpath("_curlrc");
+ else {
+ /* Get the filename of our executable. GetModuleFileName is
+ * already declared via inclusions done in setup header file.
+ * We assume that we are using the ASCII version here.
+ */
+ int n = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
+ if(n > 0 && n < (int)sizeof(filebuffer)) {
+ /* We got a valid filename - get the directory part */
+ char *lastdirchar = strrchr(filebuffer, '\\');
+ if(lastdirchar) {
+ size_t remaining;
+ *lastdirchar = 0;
+ /* If we have enough space, build the RC filename */
+ remaining = sizeof(filebuffer) - strlen(filebuffer);
+ if(strlen(CURLRC) < remaining - 1) {
+ msnprintf(lastdirchar, remaining,
+ "%s%s", DIR_CHAR, CURLRC);
+ /* Don't bother checking if it exists - we do that later */
+ filename = filebuffer;
+ }
+ }
+ }
+ }
+#else /* WIN32 */
+ filename = filebuffer;
+#endif /* WIN32 */
+ }
+ Curl_safefree(home); /* we've used it, now free it */
}
-#endif
- Curl_safefree(home); /* we've used it, now free it */
- }
+# else /* __AMIGA__ */
+ /* On AmigaOS all the config files are into env:
+ */
+ filename = "ENV:" CURLRC;
- if(!file && filename) { /* no need to fopen() again */
- if(strcmp(filename, "-"))
- file = fopen(filename, FOPEN_READTEXT);
- else
- file = stdin;
+#endif
}
+ if(strcmp(filename, "-"))
+ file = fopen(filename, FOPEN_READTEXT);
+ else
+ file = stdin;
+
if(file) {
char *line;
char *aline;
@@ -244,6 +228,9 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
/* Initialise the newly created config */
config_init(operation->next);
+ /* Copy the easy handle */
+ operation->next->easy = global->easy;
+
/* Set the global config pointer */
operation->next->global = global;
@@ -285,7 +272,6 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
else
rc = 1; /* couldn't open the file */
- free(pathalloc);
return rc;
}
diff --git a/src/tool_progress.c b/src/tool_progress.c
deleted file mode 100644
index a2667f38e..000000000
--- a/src/tool_progress.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "tool_setup.h"
-#include "tool_operate.h"
-#include "tool_progress.h"
-#include "tool_util.h"
-
-#define ENABLE_CURLX_PRINTF
-/* use our own printf() functions */
-#include "curlx.h"
-
-/* The point of this function would be to return a string of the input data,
- but never longer than 5 columns (+ one zero byte).
- Add suffix k, M, G when suitable... */
-static char *max5data(curl_off_t bytes, char *max5)
-{
-#define ONE_KILOBYTE CURL_OFF_T_C(1024)
-#define ONE_MEGABYTE (CURL_OFF_T_C(1024) * ONE_KILOBYTE)
-#define ONE_GIGABYTE (CURL_OFF_T_C(1024) * ONE_MEGABYTE)
-#define ONE_TERABYTE (CURL_OFF_T_C(1024) * ONE_GIGABYTE)
-#define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)
-
- if(bytes < CURL_OFF_T_C(100000))
- msnprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes);
-
- else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE);
-
- else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
- /* 'XX.XM' is good as long as we're less than 100 megs */
- msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
- CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE,
- (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
-
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
-
- else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
- /* 'XXXXM' is good until we're at 10000MB or above */
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
-
- else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
- /* 10000 MB - 100 GB, we show it as XX.XG */
- msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
- CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE,
- (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
-
- else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
- /* up to 10000GB, display without decimal: XXXXG */
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE);
-
- else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
- /* up to 10000TB, display without decimal: XXXXT */
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE);
-
- else
- /* up to 10000PB, display without decimal: XXXXP */
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE);
-
- /* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number
- can hold, but our data type is signed so 8192PB will be the maximum. */
-
-#else
-
- else
- msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
-
-#endif
-
- return max5;
-}
-
-int xferinfo_cb(void *clientp,
- curl_off_t dltotal,
- curl_off_t dlnow,
- curl_off_t ultotal,
- curl_off_t ulnow)
-{
- struct per_transfer *per = clientp;
- per->dltotal = dltotal;
- per->dlnow = dlnow;
- per->ultotal = ultotal;
- per->ulnow = ulnow;
- return 0;
-}
-
-/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
- byte) */
-static void time2str(char *r, curl_off_t seconds)
-{
- curl_off_t h;
- if(seconds <= 0) {
- strcpy(r, "--:--:--");
- return;
- }
- h = seconds / CURL_OFF_T_C(3600);
- if(h <= CURL_OFF_T_C(99)) {
- curl_off_t m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
- curl_off_t s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
- msnprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T
- ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s);
- }
- else {
- /* this equals to more than 99 hours, switch to a more suitable output
- format to fit within the limits. */
- curl_off_t d = seconds / CURL_OFF_T_C(86400);
- h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
- if(d <= CURL_OFF_T_C(999))
- msnprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T
- "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h);
- else
- msnprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d);
- }
-}
-
-static curl_off_t all_dltotal = 0;
-static curl_off_t all_ultotal = 0;
-static curl_off_t all_dlalready = 0;
-static curl_off_t all_ulalready = 0;
-
-curl_off_t all_xfers = 0; /* current total */
-
-struct speedcount {
- curl_off_t dl;
- curl_off_t ul;
- struct timeval stamp;
-};
-#define SPEEDCNT 10
-static unsigned int speedindex;
-static bool indexwrapped;
-static struct speedcount speedstore[SPEEDCNT];
-
-/*
- |DL% UL% Dled Uled Xfers Live Qd Total Current Left Speed
- | 6 -- 9.9G 0 2 2 0 0:00:40 0:00:02 0:00:37 4087M
-*/
-bool progress_meter(struct GlobalConfig *global,
- struct timeval *start,
- bool final)
-{
- static struct timeval stamp;
- static bool header = FALSE;
- struct timeval now;
- long diff;
-
- if(global->noprogress)
- return FALSE;
-
- now = tvnow();
- diff = tvdiff(now, stamp);
-
- if(!header) {
- header = TRUE;
- fputs("DL% UL% Dled Uled Xfers Live Qd "
- "Total Current Left Speed\n",
- global->errors);
- }
- if(final || (diff > 500)) {
- char time_left[10];
- char time_total[10];
- char time_spent[10];
- char buffer[3][6];
- curl_off_t spent = tvdiff(now, *start)/1000;
- char dlpercen[4]="--";
- char ulpercen[4]="--";
- struct per_transfer *per;
- curl_off_t all_dlnow = 0;
- curl_off_t all_ulnow = 0;
- bool dlknown = TRUE;
- bool ulknown = TRUE;
- curl_off_t all_running = 0; /* in progress */
- curl_off_t all_queued = 0; /* pending */
- curl_off_t speed = 0;
- unsigned int i;
- stamp = now;
-
- /* first add the amounts of the already completed transfers */
- all_dlnow += all_dlalready;
- all_ulnow += all_ulalready;
-
- for(per = transfers; per; per = per->next) {
- all_dlnow += per->dlnow;
- all_ulnow += per->ulnow;
- if(!per->dltotal)
- dlknown = FALSE;
- else if(!per->dltotal_added) {
- /* only add this amount once */
- all_dltotal += per->dltotal;
- per->dltotal_added = TRUE;
- }
- if(!per->ultotal)
- ulknown = FALSE;
- else if(!per->ultotal_added) {
- /* only add this amount once */
- all_ultotal += per->ultotal;
- per->ultotal_added = TRUE;
- }
- if(!per->added)
- all_queued++;
- else
- all_running++;
- }
- if(dlknown && all_dltotal)
- /* TODO: handle integer overflow */
- msnprintf(dlpercen, sizeof(dlpercen), "%3d",
- all_dlnow * 100 / all_dltotal);
- if(ulknown && all_ultotal)
- /* TODO: handle integer overflow */
- msnprintf(ulpercen, sizeof(ulpercen), "%3d",
- all_ulnow * 100 / all_ultotal);
-
- /* get the transfer speed, the higher of the two */
-
- i = speedindex;
- speedstore[i].dl = all_dlnow;
- speedstore[i].ul = all_ulnow;
- speedstore[i].stamp = now;
- if(++speedindex >= SPEEDCNT) {
- indexwrapped = TRUE;
- speedindex = 0;
- }
-
- {
- long deltams;
- curl_off_t dl;
- curl_off_t ul;
- curl_off_t dls;
- curl_off_t uls;
- if(indexwrapped) {
- /* 'speedindex' is the oldest stored data */
- deltams = tvdiff(now, speedstore[speedindex].stamp);
- dl = all_dlnow - speedstore[speedindex].dl;
- ul = all_ulnow - speedstore[speedindex].ul;
- }
- else {
- /* since the beginning */
- deltams = tvdiff(now, *start);
- dl = all_dlnow;
- ul = all_ulnow;
- }
- dls = (curl_off_t)((double)dl / ((double)deltams/1000.0));
- uls = (curl_off_t)((double)ul / ((double)deltams/1000.0));
- speed = dls > uls ? dls : uls;
- }
-
-
- if(dlknown && speed) {
- curl_off_t est = all_dltotal / speed;
- curl_off_t left = (all_dltotal - all_dlnow) / speed;
- time2str(time_left, left);
- time2str(time_total, est);
- }
- else {
- time2str(time_left, 0);
- time2str(time_total, 0);
- }
- time2str(time_spent, spent);
-
- fprintf(global->errors,
- "\r"
- "%-3s " /* percent downloaded */
- "%-3s " /* percent uploaded */
- "%s " /* Dled */
- "%s " /* Uled */
- "%5" CURL_FORMAT_CURL_OFF_T " " /* Xfers */
- "%5" CURL_FORMAT_CURL_OFF_T " " /* Live */
- "%5" CURL_FORMAT_CURL_OFF_T " " /* Queued */
- "%s " /* Total time */
- "%s " /* Current time */
- "%s " /* Time left */
- "%s " /* Speed */
- "%5s" /* final newline */,
-
- dlpercen, /* 3 letters */
- ulpercen, /* 3 letters */
- max5data(all_dlnow, buffer[0]),
- max5data(all_ulnow, buffer[1]),
- all_xfers,
- all_running,
- all_queued,
- time_total,
- time_spent,
- time_left,
- max5data(speed, buffer[2]), /* speed */
- final ? "\n" :"");
- return TRUE;
- }
- return FALSE;
-}
-
-void progress_finalize(struct per_transfer *per)
-{
- /* get the numbers before this transfer goes away */
- all_dlalready += per->dlnow;
- all_ulalready += per->ulnow;
-}
diff --git a/src/tool_progress.h b/src/tool_progress.h
deleted file mode 100644
index 34b609816..000000000
--- a/src/tool_progress.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef HEADER_CURL_TOOL_PROGRESS_H
-#define HEADER_CURL_TOOL_PROGRESS_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "tool_setup.h"
-
-int xferinfo_cb(void *clientp,
- curl_off_t dltotal,
- curl_off_t dlnow,
- curl_off_t ultotal,
- curl_off_t ulnow);
-
-bool progress_meter(struct GlobalConfig *global,
- struct timeval *start,
- bool final);
-void progress_finalize(struct per_transfer *per);
-
-extern curl_off_t all_xfers; /* total number */
-
-#endif /* HEADER_CURL_TOOL_PROGRESS_H */
diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index 4c98d9057..745b4546e 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -82,7 +82,6 @@ const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
NV(CURL_HTTP_VERSION_1_1),
NV(CURL_HTTP_VERSION_2_0),
NV(CURL_HTTP_VERSION_2TLS),
- NV(CURL_HTTP_VERSION_3),
NVEND,
};
@@ -714,129 +713,4 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
return ret;
}
-#else /* CURL_DISABLE_LIBCURL_OPTION */
-
-#include "tool_cfgable.h"
-#include "tool_setopt.h"
-
#endif /* CURL_DISABLE_LIBCURL_OPTION */
-
-/*
- * tool_setopt_skip() allows the curl tool code to avoid setopt options that
- * are explicitly disabled in the build.
- */
-bool tool_setopt_skip(CURLoption tag)
-{
-#ifdef CURL_DISABLE_PROXY
-#define USED_TAG
- switch(tag) {
- case CURLOPT_HAPROXYPROTOCOL:
- case CURLOPT_HTTPPROXYTUNNEL:
- case CURLOPT_NOPROXY:
- case CURLOPT_PRE_PROXY:
- case CURLOPT_PROXY:
- case CURLOPT_PROXYAUTH:
- case CURLOPT_PROXY_CAINFO:
- case CURLOPT_PROXY_CAPATH:
- case CURLOPT_PROXY_CRLFILE:
- case CURLOPT_PROXYHEADER:
- case CURLOPT_PROXY_KEYPASSWD:
- case CURLOPT_PROXYPASSWORD:
- case CURLOPT_PROXY_PINNEDPUBLICKEY:
- case CURLOPT_PROXYPORT:
- case CURLOPT_PROXY_SERVICE_NAME:
- case CURLOPT_PROXY_SSLCERT:
- case CURLOPT_PROXY_SSLCERTTYPE:
- case CURLOPT_PROXY_SSL_CIPHER_LIST:
- case CURLOPT_PROXY_SSLKEY:
- case CURLOPT_PROXY_SSLKEYTYPE:
- case CURLOPT_PROXY_SSL_OPTIONS:
- case CURLOPT_PROXY_SSL_VERIFYHOST:
- case CURLOPT_PROXY_SSL_VERIFYPEER:
- case CURLOPT_PROXY_SSLVERSION:
- case CURLOPT_PROXY_TLS13_CIPHERS:
- case CURLOPT_PROXY_TLSAUTH_PASSWORD:
- case CURLOPT_PROXY_TLSAUTH_TYPE:
- case CURLOPT_PROXY_TLSAUTH_USERNAME:
- case CURLOPT_PROXY_TRANSFER_MODE:
- case CURLOPT_PROXYTYPE:
- case CURLOPT_PROXYUSERNAME:
- case CURLOPT_PROXYUSERPWD:
- return TRUE;
- default:
- break;
- }
-#endif
-#ifdef CURL_DISABLE_FTP
-#define USED_TAG
- switch(tag) {
- case CURLOPT_FTPPORT:
- case CURLOPT_FTP_ACCOUNT:
- case CURLOPT_FTP_ALTERNATIVE_TO_USER:
- case CURLOPT_FTP_FILEMETHOD:
- case CURLOPT_FTP_SKIP_PASV_IP:
- case CURLOPT_FTP_USE_EPRT:
- case CURLOPT_FTP_USE_EPSV:
- case CURLOPT_FTP_USE_PRET:
- case CURLOPT_KRBLEVEL:
- return TRUE;
- default:
- break;
- }
-#endif
-#ifdef CURL_DISABLE_RTSP
-#define USED_TAG
- switch(tag) {
- case CURLOPT_INTERLEAVEDATA:
- return TRUE;
- default:
- break;
- }
-#endif
-#if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES)
-#define USED_TAG
- switch(tag) {
- case CURLOPT_COOKIE:
- case CURLOPT_COOKIEFILE:
- case CURLOPT_COOKIEJAR:
- case CURLOPT_COOKIESESSION:
- return TRUE;
- default:
- break;
- }
-#endif
-#if defined(CURL_DISABLE_TELNET)
-#define USED_TAG
- switch(tag) {
- case CURLOPT_TELNETOPTIONS:
- return TRUE;
- default:
- break;
- }
-#endif
-#ifdef CURL_DISABLE_TFTP
-#define USED_TAG
- switch(tag) {
- case CURLOPT_TFTP_BLKSIZE:
- case CURLOPT_TFTP_NO_OPTIONS:
- return TRUE;
- default:
- break;
- }
-#endif
-#ifdef CURL_DISABLE_NETRC
-#define USED_TAG
- switch(tag) {
- case CURLOPT_NETRC:
- case CURLOPT_NETRC_FILE:
- return TRUE;
- default:
- break;
- }
-#endif
-
-#ifndef USED_TAG
- (void)tag;
-#endif
- return FALSE;
-}
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index 63401337f..663041f65 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -29,16 +29,11 @@
* Macros used in operate()
*/
-#define SETOPT_CHECK(v,opt) do { \
- if(!tool_setopt_skip(opt)) { \
- result = (v); \
- if(result) \
- break; \
- } \
- } WHILE_FALSE
-
-/* allow removed features to simulate success: */
-bool tool_setopt_skip(CURLoption tag);
+#define SETOPT_CHECK(v) do { \
+ result = (v); \
+ if(result) \
+ goto show_error; \
+} WHILE_FALSE
#ifndef CURL_DISABLE_LIBCURL_OPTION
@@ -102,25 +97,25 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
const char *name, CURLoption tag, ...);
#define my_setopt(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z))
#define my_setopt_str(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z))
#define my_setopt_enum(x,y,z) \
- SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z), y)
+ SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z))
#define my_setopt_flags(x,y,z) \
- SETOPT_CHECK(tool_setopt_flags(x, global, #y, y, setopt_nv_ ## y, z), y)
+ SETOPT_CHECK(tool_setopt_flags(x, global, #y, y, setopt_nv_ ## y, z))
#define my_setopt_bitmask(x,y,z) \
- SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z), y)
+ SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z))
#define my_setopt_mimepost(x,y,z) \
- SETOPT_CHECK(tool_setopt_mimepost(x, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt_mimepost(x, global, #y, y, z))
#define my_setopt_slist(x,y,z) \
- SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z))
#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, #y, y, z)
@@ -131,25 +126,25 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
/* No --libcurl, so pass options directly to library */
#define my_setopt(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_str(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_enum(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_flags(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_bitmask(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_mimepost(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define my_setopt_slist(x,y,z) \
- SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
+ SETOPT_CHECK(curl_easy_setopt(x, y, z))
#define res_setopt(x,y,z) curl_easy_setopt(x,y,z)
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c
index 450cdcf32..e9007b2b4 100644
--- a/src/tool_urlglob.c
+++ b/src/tool_urlglob.c
@@ -488,9 +488,6 @@ void glob_cleanup(URLGlob* glob)
size_t i;
int elem;
- if(!glob)
- return;
-
for(i = 0; i < glob->size; i++) {
if((glob->pattern[i].type == UPTSet) &&
(glob->pattern[i].content.Set.elements)) {
@@ -556,7 +553,8 @@ CURLcode glob_next_url(char **globbed, URLGlob *glob)
}
}
if(carry) { /* first pattern ptr has run into overflow, done! */
- return CURLE_OK;
+ /* TODO: verify if this should actually return CURLE_OK. */
+ return CURLE_OK; /* CURLE_OK to match previous behavior */
}
}
diff --git a/src/tool_version.h b/src/tool_version.h
index 7c8087f81..a42ccaf2a 100644
--- a/src/tool_version.h
+++ b/src/tool_version.h
@@ -25,7 +25,7 @@
#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.67.0"
+#define CURL_VERSION "7.64.1"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
diff --git a/src/tool_writeout.c b/src/tool_writeout.c
index 27b2ac50d..d5b0bc44f 100644
--- a/src/tool_writeout.c
+++ b/src/tool_writeout.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -314,9 +314,6 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
case CURL_HTTP_VERSION_2_0:
version = "2";
break;
- case CURL_HTTP_VERSION_3:
- version = "3";
- break;
}
fprintf(stream, version);
diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT
index 8a9eb3579..85e731966 100644
--- a/tests/FILEFORMAT
+++ b/tests/FILEFORMAT
@@ -156,6 +156,8 @@ auth_required if this is set and a POST/PUT is made without auth, the
idle do nothing after receiving the request, just "sit idle"
stream continuously send data to the client, never-ending
writedelay: [secs] delay this amount between reply packets
+pipe: [num] tell the server to expect this many HTTP requests before
+ sending back anything, to allow pipelining tests
skip: [num] instructs the server to ignore reading this many bytes from a PUT
or POST request
@@ -186,6 +188,7 @@ ftp-ipv6
ftps
http
http-ipv6
+http-pipe
http-proxy
http-unix
https
@@ -351,6 +354,7 @@ Available substitute variables include:
%HOST6IP - IPv6 address of the host running this test
%HOSTIP - IPv4 address of the host running this test
%HTTP6PORT - IPv6 port number of the HTTP server
+%HTTPPIPEPORT - Port number of the HTTP pipelining server
%HTTPUNIXPATH - Path to the Unix socket of the HTTP server
%HTTPPORT - Port number of the HTTP server
%HTTPSPORT - Port number of the HTTPS server
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f830ae417..6c995e168 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -38,7 +38,7 @@ EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \
CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl \
manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \
negtelnetserver.py $(SMBDEPS) objnames-test08.sh objnames-test10.sh \
- objnames.inc disable-scan.pl manpage-syntax.pl
+ objnames.inc
DISTCLEANFILES = configurehelp.pm
diff --git a/tests/README b/tests/README
index bfd234a10..16a8f06e1 100644
--- a/tests/README
+++ b/tests/README
@@ -216,12 +216,27 @@ The curl Test Suite
2.1 Test case numbering
- Test cases used to be numbered by category, but the ranges filled
- up. Subsets of tests can now be selected by passing keywords to the
- runtests.pl script via the make TFLAGS variable.
-
- New tests should now be added by finding a free number in
- tests/data/Makefile.inc.
+ 1 - 99 HTTP
+ 100 - 199 FTP
+ 200 - 299 FILE
+ 300 - 399 HTTPS
+ 400 - 499 FTPS
+ 500 - 599 libcurl source code tests, not using the curl command tool
+ 600 - 699 SCP/SFTP
+ 700 - 799 SOCKS4 (even numbers) and SOCK5 (odd numbers)
+ 800 - 849 IMAP
+ 850 - 899 POP3
+ 900 - 999 SMTP
+ 1000 - 1299 miscellaneous
+ 1300 - 1399 unit tests
+ 1400 - 1499 miscellaneous
+ 1500 - 1599 libcurl source code tests, not using the curl command tool
+ (same as 5xx)
+ 1600 - 1699 unit tests
+ 2000 - x multiple sequential protocols per test case
+
+ There's nothing in the system that *requires* us to keep within these number
+ series.
3. Write tests
diff --git a/tests/certs/Server-localhost-lastSAN-sv.crl b/tests/certs/Server-localhost-lastSAN-sv.crl
index f87677487..0b4314124 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.crl
+++ b/tests/certs/Server-localhost-lastSAN-sv.crl
@@ -1,12 +1,12 @@
-----BEGIN X509 CRL-----
MIIB3DCBxQIBATANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJOTjExMC8GA1UE
CgwoRWRlbCBDdXJsIEFyY3RpYyBJbGx1ZGl1bSBSZXNlYXJjaCBDbG91ZDEmMCQG
-A1UEAwwdTm9ydGhlcm4gTm93aGVyZSBUcnVzdCBBbmNob3IXDTE5MTEwMjEyNTMy
-N1oXDTE5MTIwMjEyNTMyN1owGTAXAgYOTbnGJLAXDTE5MTEwMjEyNTMyNlqgDjAM
-MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBBQUAA4IBAQClxELmQvUD2S0UcNFbjMe/
-vv80HtpnwhTK356DUggVBh+EjvIXT4EakBbxxgDZMkaxJYH70RQ0UPLtB41pfmg3
-BS6Gl/0Vn+cAk8w/+dG4DHibdeqSPjIHCaAlkKqHV89Lp7IS6qrD0Bn/L7De6O7c
-4xLvRiDvx/cO5uAkX8vOtzKsOU/0U06QSSGK09dRL2mHbaH4FQj2PFMgcDd1GxAQ
-saii0bWZ6qLiYkQRtJGAplD+uqOaSSsioqVFy/NjaIip0axNtCG9sBhvp6lTpeiR
-Phl04I+WyKoP5f/NTU+fKbWarWka4evPSpRM2o9QYrYb/vj0TMK8lJ3JqgwlLrJ+
+A1UEAwwdTm9ydGhlcm4gTm93aGVyZSBUcnVzdCBBbmNob3IXDTE4MDkwNTIzMjkw
+MVoXDTE4MTAwNTIzMjkwMVowGTAXAgYN+LitKqAXDTE4MDkwNTIzMjkwMVqgDjAM
+MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBBQUAA4IBAQBc8MVCmUUhPb/yJ05wh1EA
+rBbLCjTYTDL9DW5YJIoBUKYWi5DGETS5BmgPU3ci6Pfa6eJ51oRurOCJHnL691Gp
+Y1d6R5CiM8mtHOPGCAgvvo0x+xJ/GzikxaggTDPA2CZWAFjBApMNdMvGTwurcnW9
+0jOl7zsfFoxSDlRqdFw7QW7Axju8vxRpMj6/pVBKmqgM+NUavcVPmRAYlsxCaeNH
+cdBviuw4qt3T6eLcb/RNIuCuXcp8a7ysqkGdSS/Pp/drOGZAmugbj1kmjS8b0n1M
+9L8wxG0k/TsgKSlWy+wbCJcUiYHgwzTd9i/XEdwxGvOnKFeiCvqShhkEG7QjfHs2
-----END X509 CRL-----
diff --git a/tests/certs/Server-localhost-lastSAN-sv.crt b/tests/certs/Server-localhost-lastSAN-sv.crt
index 578fff753..b3116b695 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.crt
+++ b/tests/certs/Server-localhost-lastSAN-sv.crt
@@ -1,42 +1,41 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number:
- 0e:4d:b9:c6:24:b0
- Signature Algorithm: sha256WithRSAEncryption
+ Serial Number: 15361901406880 (0xdf8b8ad2aa0)
+ Signature Algorithm: sha1WithRSAEncryption
Issuer:
countryName = NN
organizationName = Edel Curl Arctic Illudium Research Cloud
commonName = Northern Nowhere Trust Anchor
Validity
- Not Before: Nov 2 12:53:25 2019 GMT
- Not After : Jan 19 12:53:25 2028 GMT
+ Not Before: Sep 5 23:29:01 2018 GMT
+ Not After : Nov 22 23:29:01 2026 GMT
Subject:
countryName = NN
organizationName = Edel Curl Arctic Illudium Research Cloud
commonName = localhost.nn
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- RSA Public-Key: (2048 bit)
+ Public-Key: (2048 bit)
Modulus:
- 00:bd:97:0e:a7:6d:b6:73:8c:d0:21:6b:f3:36:74:
- 5d:0a:aa:3a:f0:fa:6e:b1:5c:1c:13:74:ca:67:2b:
- 22:03:d1:a6:3c:25:ef:87:4f:e8:38:9f:21:1d:2e:
- 88:12:36:66:82:03:02:4c:f8:17:35:02:95:31:b1:
- 53:40:21:24:2f:00:f0:bf:80:58:16:b1:92:b3:d3:
- 78:bf:78:cb:0a:91:0c:d2:6d:5d:b2:1f:41:73:16:
- 02:7c:1a:cd:16:25:c9:e1:1b:81:bd:84:93:4c:63:
- ce:38:f4:3e:ad:98:6b:00:89:a8:ba:f5:7e:08:83:
- f3:9a:f5:98:b8:9f:d6:d8:c7:d4:f3:07:1c:8f:ef:
- bc:29:10:60:8c:85:8b:4c:7a:73:c7:9f:a8:23:2f:
- c4:47:f5:18:85:98:fb:27:de:58:93:4b:08:a5:66:
- c9:df:db:f0:22:f8:64:9f:a1:56:89:97:ab:02:2c:
- 5a:99:f2:6f:bf:72:31:90:22:32:ae:86:25:6b:13:
- c6:72:ec:df:2e:c8:12:00:c1:e3:38:b4:a0:40:ba:
- 01:61:c2:d7:b1:ef:7d:4b:29:18:e2:fe:28:d0:98:
- e4:65:3f:4c:34:39:e4:82:a9:ca:b2:3d:c4:91:8f:
- a0:94:bf:e3:f8:b3:73:48:b7:fe:fa:04:43:e7:b5:
- bc:bd
+ 00:df:16:15:5f:2a:a4:50:cf:3a:a8:79:6e:22:8d:
+ 95:16:b7:4d:7d:d2:1f:4f:6d:2d:7a:7d:dc:8a:4f:
+ 53:7b:5f:c9:de:5c:88:6c:a2:74:26:35:1c:78:68:
+ c1:60:25:a7:7b:b6:1a:9a:aa:33:d0:9f:5e:f2:2e:
+ 21:04:8c:0d:9a:28:f5:61:40:3c:34:1a:9b:8a:70:
+ 81:6d:83:9e:7c:d0:4c:d9:79:dc:37:d9:24:6e:73:
+ c7:61:31:71:e9:f5:97:b7:65:ad:3d:f6:af:20:6f:
+ 56:b9:b5:42:b5:3d:96:61:31:eb:0d:4c:e9:f5:31:
+ d3:25:af:40:b3:bb:81:04:7f:1a:ce:21:18:83:52:
+ 2d:51:31:ae:82:f9:cb:10:d3:d5:06:af:f8:71:e8:
+ a3:c6:9f:7b:48:da:e2:28:af:1c:ff:41:6d:32:81:
+ 45:59:d7:64:e4:b1:d7:c9:86:6a:0b:65:71:66:d6:
+ 42:a8:67:fd:83:49:20:75:16:1e:bb:1b:85:5c:7e:
+ e2:8f:5f:1c:81:d3:8a:95:d6:92:5c:9e:7f:a2:10:
+ 08:e1:df:ae:69:68:3f:8d:dd:79:4f:da:3f:79:b5:
+ 02:97:57:30:67:4d:3d:76:35:b5:4f:d1:5d:35:dd:
+ d4:b5:6b:57:b2:e0:23:35:ad:1a:bf:6f:77:e6:bc:
+ 58:ed
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
@@ -46,48 +45,48 @@ Certificate:
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Key Identifier:
- 4E:54:63:95:A1:58:0C:FA:BD:3E:58:26:AF:AF:A4:F3:66:1A:CB:25
+ 7C:9A:EA:9B:92:98:FB:77:25:89:8B:EF:D3:F4:88:34:AF:EA:24:CC
X509v3 Authority Key Identifier:
keyid:12:CA:BA:4B:46:04:A7:75:8A:2C:E8:0E:54:94:BC:12:65:A6:7B:CE
X509v3 Basic Constraints:
CA:FALSE
- Signature Algorithm: sha256WithRSAEncryption
- 2c:f9:48:33:7c:93:ca:3c:9c:58:92:8c:2b:87:61:9f:0d:9c:
- 9d:e8:43:43:12:d6:a3:40:71:ec:cb:31:76:80:68:b1:54:d1:
- 86:f4:b3:9e:c8:50:62:b4:87:12:be:9b:d6:3c:2b:cf:22:0e:
- 66:26:c2:31:dd:1f:c6:97:1e:61:a4:51:ea:68:75:81:66:b9:
- 3b:a6:1f:f6:80:ec:6b:aa:65:66:0c:02:ab:c9:57:bd:6a:4e:
- 6d:24:30:13:7b:65:17:60:9a:14:37:57:f7:22:66:55:7d:1a:
- 1a:5b:27:43:3b:d4:88:bc:2f:d3:d7:bb:d5:3f:9b:25:26:5d:
- 39:a0:4c:8a:84:2c:db:04:87:8a:df:49:7d:4b:d2:85:7a:09:
- 5e:df:6b:1b:b5:6e:9c:bb:2b:f6:c5:01:19:5a:87:d0:cf:16:
- 67:8b:54:41:87:c1:33:c3:21:f6:e5:84:d2:84:5d:da:82:cd:
- 39:4d:50:97:f3:83:37:9e:e5:04:0e:dc:c6:20:d1:b3:f6:c7:
- 3d:dd:95:be:8c:b9:72:72:7a:71:66:aa:4a:8e:cf:37:38:e8:
- c8:06:69:68:8d:d8:d6:8b:4c:23:50:27:fa:e9:bb:2a:a6:89:
- 56:ad:be:4d:bd:be:0c:d7:55:b4:f4:b9:f7:6a:b5:2c:7f:5f:
- 9f:df:f6:61
+ Signature Algorithm: sha1WithRSAEncryption
+ 0f:97:60:47:2f:22:9f:d4:16:99:5a:ed:f4:b5:54:31:bf:9f:
+ a1:bd:2d:8b:eb:c1:24:db:73:30:c7:46:d6:4c:c8:c6:38:0c:
+ 9a:e6:d6:5e:e8:a7:fb:9f:b6:44:66:73:43:86:46:10:c0:4c:
+ 40:4e:c1:d7:e4:41:0b:f0:61:f0:6f:45:8c:5a:14:40:42:97:
+ c3:03:d0:ff:6d:4a:06:80:65:49:d4:2f:07:9d:86:59:6b:5b:
+ 9e:bc:0c:46:8a:62:da:c0:22:af:13:6c:0d:9d:54:5e:46:53:
+ a5:aa:f2:80:44:c7:07:6e:f7:b0:4c:37:5c:31:08:a0:37:df:
+ 8a:35:92:3c:8c:91:2f:64:4f:d3:a0:eb:95:b3:4a:9e:f7:ac:
+ 25:ad:06:13:5c:dd:bd:d5:6b:74:8d:c7:c5:a6:b4:89:27:fd:
+ b7:c2:24:a7:6a:b3:64:e6:e6:31:91:35:fc:0e:15:14:38:d6:
+ 39:b0:c4:b2:c1:c8:c7:ed:25:d7:b0:a9:b9:a0:70:33:42:90:
+ 86:33:2a:d8:d5:8a:02:e6:ab:8d:92:d6:ae:b4:1d:e9:6c:22:
+ a5:2f:1a:48:48:2b:5c:b8:30:01:4b:27:1a:d3:cf:21:77:ab:
+ 9f:bc:55:34:2e:9f:03:2b:17:0b:c3:44:8e:a8:94:ae:92:a2:
+ 9a:33:c0:8e
-----BEGIN CERTIFICATE-----
-MIID3jCCAsagAwIBAgIGDk25xiSwMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNVBAYT
+MIID3jCCAsagAwIBAgIGDfi4rSqgMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNVBAYT
Ak5OMTEwLwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNo
IENsb3VkMSYwJAYDVQQDDB1Ob3J0aGVybiBOb3doZXJlIFRydXN0IEFuY2hvcjAe
-Fw0xOTExMDIxMjUzMjVaFw0yODAxMTkxMjUzMjVaMFcxCzAJBgNVBAYTAk5OMTEw
+Fw0xODA5MDUyMzI5MDFaFw0yNjExMjIyMzI5MDFaMFcxCzAJBgNVBAYTAk5OMTEw
LwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNoIENsb3Vk
MRUwEwYDVQQDDAxsb2NhbGhvc3Qubm4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQC9lw6nbbZzjNAha/M2dF0Kqjrw+m6xXBwTdMpnKyID0aY8Je+HT+g4
-nyEdLogSNmaCAwJM+Bc1ApUxsVNAISQvAPC/gFgWsZKz03i/eMsKkQzSbV2yH0Fz
-FgJ8Gs0WJcnhG4G9hJNMY8449D6tmGsAiai69X4Ig/Oa9Zi4n9bYx9TzBxyP77wp
-EGCMhYtMenPHn6gjL8RH9RiFmPsn3liTSwilZsnf2/Ai+GSfoVaJl6sCLFqZ8m+/
-cjGQIjKuhiVrE8Zy7N8uyBIAweM4tKBAugFhwtex731LKRji/ijQmORlP0w0OeSC
-qcqyPcSRj6CUv+P4s3NIt/76BEPntby9AgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
+ggEKAoIBAQDfFhVfKqRQzzqoeW4ijZUWt0190h9PbS16fdyKT1N7X8neXIhsonQm
+NRx4aMFgJad7thqaqjPQn17yLiEEjA2aKPVhQDw0GpuKcIFtg5580EzZedw32SRu
+c8dhMXHp9Ze3Za099q8gb1a5tUK1PZZhMesNTOn1MdMlr0Czu4EEfxrOIRiDUi1R
+Ma6C+csQ09UGr/hx6KPGn3tI2uIorxz/QW0ygUVZ12TksdfJhmoLZXFm1kKoZ/2D
+SSB1Fh67G4VcfuKPXxyB04qV1pJcnn+iEAjh365paD+N3XlP2j95tQKXVzBnTT12
+NbVP0V013dS1a1ey4CM1rRq/b3fmvFjtAgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
bG9jYWxob3N0MYIKbG9jYWxob3N0MoIJbG9jYWxob3N0MAsGA1UdDwQEAwIDqDAT
-BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUTlRjlaFYDPq9Plgmr6+k82Ya
-yyUwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
-BgkqhkiG9w0BAQsFAAOCAQEALPlIM3yTyjycWJKMK4dhnw2cnehDQxLWo0Bx7Msx
-doBosVTRhvSznshQYrSHEr6b1jwrzyIOZibCMd0fxpceYaRR6mh1gWa5O6Yf9oDs
-a6plZgwCq8lXvWpObSQwE3tlF2CaFDdX9yJmVX0aGlsnQzvUiLwv09e71T+bJSZd
-OaBMioQs2wSHit9JfUvShXoJXt9rG7VunLsr9sUBGVqH0M8WZ4tUQYfBM8Mh9uWE
-0oRd2oLNOU1Ql/ODN57lBA7cxiDRs/bHPd2Vvoy5cnJ6cWaqSo7PNzjoyAZpaI3Y
-1otMI1An+um7KqaJVq2+Tb2+DNdVtPS592q1LH9fn9/2YQ==
+BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUfJrqm5KY+3cliYvv0/SINK/q
+JMwwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
+BgkqhkiG9w0BAQUFAAOCAQEAD5dgRy8in9QWmVrt9LVUMb+fob0ti+vBJNtzMMdG
+1kzIxjgMmubWXuin+5+2RGZzQ4ZGEMBMQE7B1+RBC/Bh8G9FjFoUQEKXwwPQ/21K
+BoBlSdQvB52GWWtbnrwMRopi2sAirxNsDZ1UXkZTparygETHB273sEw3XDEIoDff
+ijWSPIyRL2RP06DrlbNKnvesJa0GE1zdvdVrdI3Hxaa0iSf9t8Ikp2qzZObmMZE1
+/A4VFDjWObDEssHIx+0l17CpuaBwM0KQhjMq2NWKAuarjZLWrrQd6WwipS8aSEgr
+XLgwAUsnGtPPIXern7xVNC6fAysXC8NEjqiUrpKimjPAjg==
-----END CERTIFICATE-----
diff --git a/tests/certs/Server-localhost-lastSAN-sv.csr b/tests/certs/Server-localhost-lastSAN-sv.csr
index a113db635..78077bcd4 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.csr
+++ b/tests/certs/Server-localhost-lastSAN-sv.csr
@@ -1,16 +1,16 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICnDCCAYQCAQAwVzELMAkGA1UEBhMCTk4xMTAvBgNVBAoMKEVkZWwgQ3VybCBB
cmN0aWMgSWxsdWRpdW0gUmVzZWFyY2ggQ2xvdWQxFTATBgNVBAMMDGxvY2FsaG9z
-dC5ubjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL2XDqdttnOM0CFr
-8zZ0XQqqOvD6brFcHBN0ymcrIgPRpjwl74dP6DifIR0uiBI2ZoIDAkz4FzUClTGx
-U0AhJC8A8L+AWBaxkrPTeL94ywqRDNJtXbIfQXMWAnwazRYlyeEbgb2Ek0xjzjj0
-Pq2YawCJqLr1fgiD85r1mLif1tjH1PMHHI/vvCkQYIyFi0x6c8efqCMvxEf1GIWY
-+yfeWJNLCKVmyd/b8CL4ZJ+hVomXqwIsWpnyb79yMZAiMq6GJWsTxnLs3y7IEgDB
-4zi0oEC6AWHC17HvfUspGOL+KNCY5GU/TDQ55IKpyrI9xJGPoJS/4/izc0i3/voE
-Q+e1vL0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCpqiSx7VjqeQ2g8lpHF0Nb
-/10H1DqaK7Z3y49xFK3xxKWdxKUdq3Nf7JYlhKpWDYokrkw5W+nhGQILYt6ZD8tN
-tBZphyp3rvmTcewEFtbBne5N7OsAaanlBxeCLhnCICGhd+QCqYJKWe+zw8Oc5dCp
-SRmWEL5FTu9AavBc0LDx1gNBupDiXGhF+BptOzgfDbijd0aRgy9cYwAQ9kXo4H+y
-TH1ZYcSfB0gs7sShiY5FvuGr54Vv0czn+HqrdyWKDGLp7ilPYCT4WXBWfTon9j1H
-9NDomhrVme9IGKItYHg+p59WpevklW900X4NZCVspePgNeBOvXYbGqDEN01o1xIG
+dC5ubjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN8WFV8qpFDPOqh5
+biKNlRa3TX3SH09tLXp93IpPU3tfyd5ciGyidCY1HHhowWAlp3u2GpqqM9CfXvIu
+IQSMDZoo9WFAPDQam4pwgW2DnnzQTNl53DfZJG5zx2Excen1l7dlrT32ryBvVrm1
+QrU9lmEx6w1M6fUx0yWvQLO7gQR/Gs4hGINSLVExroL5yxDT1Qav+HHoo8afe0ja
+4iivHP9BbTKBRVnXZOSx18mGagtlcWbWQqhn/YNJIHUWHrsbhVx+4o9fHIHTipXW
+klyef6IQCOHfrmloP43deU/aP3m1ApdXMGdNPXY1tU/RXTXd1LVrV7LgIzWtGr9v
+d+a8WO0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCNGbWvnceLjA+R8+p1skgq
+0JxCZIUP/E8iOpg0eX2CjtU+9raYMNa7URtWa1kTSfxbuowPn21CSQmQ+1MDZv0Z
+UTAADKwXO6dDvXkYY4LwpRIozsz1zx1ulUaYmg4D2FPBIxg9QNLB0ic9+gUYdUEX
+Uw7vzxY8ExO99Z6rhJcNZPPYmj97MS/ZmBTZ8jxqjuOQ1R9mIhBvdsYdoDQR8SMK
+1b/0qH0F5Ly2iWt+pi+muoz+tYUyiXrIzYGF4+gImYBJEy35Pni/H8mMY62TxbWi
+QfhD9S8hxfT733X+UQQlQPToNDYdrmm/WcABOXrm8ESXfKvzs8aCodfCpDYIyxbu
-----END CERTIFICATE REQUEST-----
diff --git a/tests/certs/Server-localhost-lastSAN-sv.der b/tests/certs/Server-localhost-lastSAN-sv.der
index c72bcb95d..220e7927b 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.der
+++ b/tests/certs/Server-localhost-lastSAN-sv.der
Binary files differ
diff --git a/tests/certs/Server-localhost-lastSAN-sv.key b/tests/certs/Server-localhost-lastSAN-sv.key
index dae48284a..618e83902 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.key
+++ b/tests/certs/Server-localhost-lastSAN-sv.key
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAvZcOp222c4zQIWvzNnRdCqo68PpusVwcE3TKZysiA9GmPCXv
-h0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEkLwDwv4BYFrGSs9N4v3jLCpEM0m1d
-sh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhrAImouvV+CIPzmvWYuJ/W2MfU8wcc
-j++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Yk0sIpWbJ39vwIvhkn6FWiZerAixa
-mfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSgQLoBYcLXse99SykY4v4o0JjkZT9M
-NDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8vQIDAQABAoIBAQCC0wTKpdtbmtRX
-66y1a9B0NolblgPiISRCjLnKPSpIpldmc+r4XTxqLexkvaIppx5PIpJo2FzzOGgJ
-FUrUGspkIOr/yil+52PK8OcGgOziyrqlTdB0xDqelpZ6WuggG01WJ2v8gco+0TQR
-ewDxOxbDFTq4YARrDdqAmG6dH7baeMDvh6IVe/dkJOVlyh0MA2QP+VR6fDv73jUe
-3yW6G+hql9mjZK6Cgz2lWoeW7YXAvWtTXT68/bcZLO64oLyCjBmsbSrBRQN5m9M9
-dWJV5B0h02P+uMF5H+EAD3qN5I670iSY3d+FWBpd3cA2arRGWlUXNmCGG3CjLYUS
-wGw1lbFhAoGBAPG6JhdXAaH3DN9khp54plbFSIanvjWK8RAEaQgkurwDUL3o1LmC
-ObqiCmMTU25HRlwWkwlCxejHfzOEqFdwiX5QuNmYBE6TYHtmnWSJ5ebMG7SOtlIS
-9Z4dLNZz8j95OGKb3XI9qR0ItxsmuLgWvrJUayd0UXcU7BTzHCXGx99JAoGBAMjI
-0z5+DeTwBhDY1mIUY081FmhrT9PhFHGtRy2OIENW0ZhJ5yE+ygVQssnR+Lr/yl1p
-zGC+CM//5wmJ774Xx0reMsh/rgK4Z0Wq47JJFGo0RMfYVmlod0OndtdobDc7ds7t
-Q3wIGt2ZXW6BtzMo8KVUuuHL8QwZoZqJNe/7QE3VAoGAGGrRRjJHu/CUoEwrPP66
-7rDm7pMrJ4VtbEzFv0jWg/9hvI00T7jT1AJiQjfFibIxbUPqflj8XNMqCi4wQwTf
-Hp9QzMoKRVWlvVFUPL+hNXsQoWB5EjlQDjSsPs1ffwHjrDJKYCvSVVh4BooWxqGl
-iaX1XPrm77xxTHxyL26w6eECgYA176S3g9stpcCrY+RrInju/R7Q3Arsquj4BIk7
-VpOaI0dYdnnNN3XDacMtbec4LKBq6ZHKZyIs5dxldpVdZjvWA8x2ib3v4yNy1o4m
-BXWjdfkICjhkRnjLRsAo61cumx22Row7VF4LKzirB9NzvcqvTwyIvWU6T+RWhAdm
-OQM0JQKBgC+gmBGfnQShTRYlfpb4RVnDijPpC34AdEO7wdeMcdQK9KfWsLZT5y0w
-qoZhW9IPlu1dNRhwHqGHWu2CmQVwFpy5/ccpukCJfyZw7edbb9dIqzKlUWw8Jmmg
-C7WKz4z3mKkZrwptFxDu0dpQ644yOP/gnRaLLyP0zn/brmnYz09X
+MIIEogIBAAKCAQEA3xYVXyqkUM86qHluIo2VFrdNfdIfT20ten3cik9Te1/J3lyI
+bKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwNmij1YUA8NBqbinCBbYOefNBM2Xnc
+N9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2WYTHrDUzp9THTJa9As7uBBH8aziEY
+g1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c/0FtMoFFWddk5LHXyYZqC2VxZtZC
+qGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/ohAI4d+uaWg/jd15T9o/ebUCl1cw
+Z009djW1T9FdNd3UtWtXsuAjNa0av2935rxY7QIDAQABAoIBAFz/H7mkVQs62AET
+Xc4Zp2To1Oz2gwbhRGwju6QMnYh4zfZcLKLctf6XdV7cjIBAMiloKH8BJMh7J2Fd
+yXXTzHfPSztXQ8GUtfJoJAw7Kf5t9xtRqXO+mWlR6nOh4RLexng1cpq6Exc6UrTn
+0v8qxV2PKaVJwt3r/1FeVWKXb5kne/Ob4LS7c0xnVqc7TGPtxLdS5mU5jrt0ZdZl
+tcHulLX24rmxKcNvge6r2EiYuet3vUi1uuLBQbWUJIFRwetDufG/2e2ihOuvCj5s
+aYNlRAo0JUwWl7geicRUdxkCpV/Qld7aYldKIcsSzgl6GLpgNpHjUFBbJBGSng0S
+vA4CMQECgYEA9tseJG2IuudqDHnpuUxtnlfDJTfYjtBQnYG1ojbd9FUiuihv/B2K
+pJ5uuowpKSnXOwaHtzyQ6XJA7JChRcDmJ4rf6R/1B61+1XVasyi2WffTJHbKzUk+
+hBAUoGtJIvrChMOnAlQzifP8+b7ec/ghKy87dNlQzQlSunyEW6lAW/UCgYEA51mQ
+JOFsasSvioKilsJuFCcFInZCRTEMz7vK9HW2Qnv71b3xeB6aNoJA8zf1Gw9q5clN
+Yu+8pkGNsWeone8izTzzpgZGJmM/vLjSdIgaJytStha2FwlQxUjggOjSy1zIdW+v
+ROw6OaT2J5+Qw2ruWqSaw2fiDgOpBCJgfg95JhkCgYAy5SppyEuQfXXX7KrLkX5o
+Tx/k5Ia5qylzz/Jq53ULkyH9z6iHCnAzUJbzz0INQpsliEsi9FHMT8oi/A7EGulY
+7cEMh5I1awfjarawiYxPMFFQC0301U0WXVpjWLtTgu/n/47HZCTcJHnb5AZpUpdE
+GBDiHowSOgHcgR+o5lRmoQKBgFaPi0BRW+hi6S9RC5aO7vL5WpF3X/pVjO6Y3Co1
+dNlRXHuv0w5XnOmyOK0IDdxvG1cYx6yx+IrYUjTDjTJyjDnwiVVgWZT5Y5qwKIZT
+ej2Xlx3sR3s9EAyQ5Pc2pdBTSemuvQxzuqFg2H0g1eBYPRCLMCDW2JzXv8B9QE9K
+aNDZAoGAKbVakgVlwrGffJb5c6ZFF9W/WoJYXJRA2/tMqvOcaZwSNq0ySHI/uUyM
+3aexymibv5cGsFhtcr8vqxlX0PZ+PF2SRe/L58PmByEXGmyv6UZ/fhOCh8ttmPzt
+GIh5PiKOd7RR7ydFY22M2+uW99wMf5jSH6uX1DRATFLxJygbnHA=
-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/Server-localhost-lastSAN-sv.pem b/tests/certs/Server-localhost-lastSAN-sv.pem
index 42e4a1155..c1684fdbb 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.pem
+++ b/tests/certs/Server-localhost-lastSAN-sv.pem
@@ -24,71 +24,70 @@ commonName_value = localhost.nn
# the certificate
# some dhparam
-----BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAvZcOp222c4zQIWvzNnRdCqo68PpusVwcE3TKZysiA9GmPCXv
-h0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEkLwDwv4BYFrGSs9N4v3jLCpEM0m1d
-sh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhrAImouvV+CIPzmvWYuJ/W2MfU8wcc
-j++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Yk0sIpWbJ39vwIvhkn6FWiZerAixa
-mfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSgQLoBYcLXse99SykY4v4o0JjkZT9M
-NDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8vQIDAQABAoIBAQCC0wTKpdtbmtRX
-66y1a9B0NolblgPiISRCjLnKPSpIpldmc+r4XTxqLexkvaIppx5PIpJo2FzzOGgJ
-FUrUGspkIOr/yil+52PK8OcGgOziyrqlTdB0xDqelpZ6WuggG01WJ2v8gco+0TQR
-ewDxOxbDFTq4YARrDdqAmG6dH7baeMDvh6IVe/dkJOVlyh0MA2QP+VR6fDv73jUe
-3yW6G+hql9mjZK6Cgz2lWoeW7YXAvWtTXT68/bcZLO64oLyCjBmsbSrBRQN5m9M9
-dWJV5B0h02P+uMF5H+EAD3qN5I670iSY3d+FWBpd3cA2arRGWlUXNmCGG3CjLYUS
-wGw1lbFhAoGBAPG6JhdXAaH3DN9khp54plbFSIanvjWK8RAEaQgkurwDUL3o1LmC
-ObqiCmMTU25HRlwWkwlCxejHfzOEqFdwiX5QuNmYBE6TYHtmnWSJ5ebMG7SOtlIS
-9Z4dLNZz8j95OGKb3XI9qR0ItxsmuLgWvrJUayd0UXcU7BTzHCXGx99JAoGBAMjI
-0z5+DeTwBhDY1mIUY081FmhrT9PhFHGtRy2OIENW0ZhJ5yE+ygVQssnR+Lr/yl1p
-zGC+CM//5wmJ774Xx0reMsh/rgK4Z0Wq47JJFGo0RMfYVmlod0OndtdobDc7ds7t
-Q3wIGt2ZXW6BtzMo8KVUuuHL8QwZoZqJNe/7QE3VAoGAGGrRRjJHu/CUoEwrPP66
-7rDm7pMrJ4VtbEzFv0jWg/9hvI00T7jT1AJiQjfFibIxbUPqflj8XNMqCi4wQwTf
-Hp9QzMoKRVWlvVFUPL+hNXsQoWB5EjlQDjSsPs1ffwHjrDJKYCvSVVh4BooWxqGl
-iaX1XPrm77xxTHxyL26w6eECgYA176S3g9stpcCrY+RrInju/R7Q3Arsquj4BIk7
-VpOaI0dYdnnNN3XDacMtbec4LKBq6ZHKZyIs5dxldpVdZjvWA8x2ib3v4yNy1o4m
-BXWjdfkICjhkRnjLRsAo61cumx22Row7VF4LKzirB9NzvcqvTwyIvWU6T+RWhAdm
-OQM0JQKBgC+gmBGfnQShTRYlfpb4RVnDijPpC34AdEO7wdeMcdQK9KfWsLZT5y0w
-qoZhW9IPlu1dNRhwHqGHWu2CmQVwFpy5/ccpukCJfyZw7edbb9dIqzKlUWw8Jmmg
-C7WKz4z3mKkZrwptFxDu0dpQ644yOP/gnRaLLyP0zn/brmnYz09X
+MIIEogIBAAKCAQEA3xYVXyqkUM86qHluIo2VFrdNfdIfT20ten3cik9Te1/J3lyI
+bKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwNmij1YUA8NBqbinCBbYOefNBM2Xnc
+N9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2WYTHrDUzp9THTJa9As7uBBH8aziEY
+g1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c/0FtMoFFWddk5LHXyYZqC2VxZtZC
+qGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/ohAI4d+uaWg/jd15T9o/ebUCl1cw
+Z009djW1T9FdNd3UtWtXsuAjNa0av2935rxY7QIDAQABAoIBAFz/H7mkVQs62AET
+Xc4Zp2To1Oz2gwbhRGwju6QMnYh4zfZcLKLctf6XdV7cjIBAMiloKH8BJMh7J2Fd
+yXXTzHfPSztXQ8GUtfJoJAw7Kf5t9xtRqXO+mWlR6nOh4RLexng1cpq6Exc6UrTn
+0v8qxV2PKaVJwt3r/1FeVWKXb5kne/Ob4LS7c0xnVqc7TGPtxLdS5mU5jrt0ZdZl
+tcHulLX24rmxKcNvge6r2EiYuet3vUi1uuLBQbWUJIFRwetDufG/2e2ihOuvCj5s
+aYNlRAo0JUwWl7geicRUdxkCpV/Qld7aYldKIcsSzgl6GLpgNpHjUFBbJBGSng0S
+vA4CMQECgYEA9tseJG2IuudqDHnpuUxtnlfDJTfYjtBQnYG1ojbd9FUiuihv/B2K
+pJ5uuowpKSnXOwaHtzyQ6XJA7JChRcDmJ4rf6R/1B61+1XVasyi2WffTJHbKzUk+
+hBAUoGtJIvrChMOnAlQzifP8+b7ec/ghKy87dNlQzQlSunyEW6lAW/UCgYEA51mQ
+JOFsasSvioKilsJuFCcFInZCRTEMz7vK9HW2Qnv71b3xeB6aNoJA8zf1Gw9q5clN
+Yu+8pkGNsWeone8izTzzpgZGJmM/vLjSdIgaJytStha2FwlQxUjggOjSy1zIdW+v
+ROw6OaT2J5+Qw2ruWqSaw2fiDgOpBCJgfg95JhkCgYAy5SppyEuQfXXX7KrLkX5o
+Tx/k5Ia5qylzz/Jq53ULkyH9z6iHCnAzUJbzz0INQpsliEsi9FHMT8oi/A7EGulY
+7cEMh5I1awfjarawiYxPMFFQC0301U0WXVpjWLtTgu/n/47HZCTcJHnb5AZpUpdE
+GBDiHowSOgHcgR+o5lRmoQKBgFaPi0BRW+hi6S9RC5aO7vL5WpF3X/pVjO6Y3Co1
+dNlRXHuv0w5XnOmyOK0IDdxvG1cYx6yx+IrYUjTDjTJyjDnwiVVgWZT5Y5qwKIZT
+ej2Xlx3sR3s9EAyQ5Pc2pdBTSemuvQxzuqFg2H0g1eBYPRCLMCDW2JzXv8B9QE9K
+aNDZAoGAKbVakgVlwrGffJb5c6ZFF9W/WoJYXJRA2/tMqvOcaZwSNq0ySHI/uUyM
+3aexymibv5cGsFhtcr8vqxlX0PZ+PF2SRe/L58PmByEXGmyv6UZ/fhOCh8ttmPzt
+GIh5PiKOd7RR7ydFY22M2+uW99wMf5jSH6uX1DRATFLxJygbnHA=
-----END RSA PRIVATE KEY-----
Certificate:
Data:
Version: 3 (0x2)
- Serial Number:
- 0e:4d:b9:c6:24:b0
- Signature Algorithm: sha256WithRSAEncryption
+ Serial Number: 15361901406880 (0xdf8b8ad2aa0)
+ Signature Algorithm: sha1WithRSAEncryption
Issuer:
countryName = NN
organizationName = Edel Curl Arctic Illudium Research Cloud
commonName = Northern Nowhere Trust Anchor
Validity
- Not Before: Nov 2 12:53:25 2019 GMT
- Not After : Jan 19 12:53:25 2028 GMT
+ Not Before: Sep 5 23:29:01 2018 GMT
+ Not After : Nov 22 23:29:01 2026 GMT
Subject:
countryName = NN
organizationName = Edel Curl Arctic Illudium Research Cloud
commonName = localhost.nn
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- RSA Public-Key: (2048 bit)
+ Public-Key: (2048 bit)
Modulus:
- 00:bd:97:0e:a7:6d:b6:73:8c:d0:21:6b:f3:36:74:
- 5d:0a:aa:3a:f0:fa:6e:b1:5c:1c:13:74:ca:67:2b:
- 22:03:d1:a6:3c:25:ef:87:4f:e8:38:9f:21:1d:2e:
- 88:12:36:66:82:03:02:4c:f8:17:35:02:95:31:b1:
- 53:40:21:24:2f:00:f0:bf:80:58:16:b1:92:b3:d3:
- 78:bf:78:cb:0a:91:0c:d2:6d:5d:b2:1f:41:73:16:
- 02:7c:1a:cd:16:25:c9:e1:1b:81:bd:84:93:4c:63:
- ce:38:f4:3e:ad:98:6b:00:89:a8:ba:f5:7e:08:83:
- f3:9a:f5:98:b8:9f:d6:d8:c7:d4:f3:07:1c:8f:ef:
- bc:29:10:60:8c:85:8b:4c:7a:73:c7:9f:a8:23:2f:
- c4:47:f5:18:85:98:fb:27:de:58:93:4b:08:a5:66:
- c9:df:db:f0:22:f8:64:9f:a1:56:89:97:ab:02:2c:
- 5a:99:f2:6f:bf:72:31:90:22:32:ae:86:25:6b:13:
- c6:72:ec:df:2e:c8:12:00:c1:e3:38:b4:a0:40:ba:
- 01:61:c2:d7:b1:ef:7d:4b:29:18:e2:fe:28:d0:98:
- e4:65:3f:4c:34:39:e4:82:a9:ca:b2:3d:c4:91:8f:
- a0:94:bf:e3:f8:b3:73:48:b7:fe:fa:04:43:e7:b5:
- bc:bd
+ 00:df:16:15:5f:2a:a4:50:cf:3a:a8:79:6e:22:8d:
+ 95:16:b7:4d:7d:d2:1f:4f:6d:2d:7a:7d:dc:8a:4f:
+ 53:7b:5f:c9:de:5c:88:6c:a2:74:26:35:1c:78:68:
+ c1:60:25:a7:7b:b6:1a:9a:aa:33:d0:9f:5e:f2:2e:
+ 21:04:8c:0d:9a:28:f5:61:40:3c:34:1a:9b:8a:70:
+ 81:6d:83:9e:7c:d0:4c:d9:79:dc:37:d9:24:6e:73:
+ c7:61:31:71:e9:f5:97:b7:65:ad:3d:f6:af:20:6f:
+ 56:b9:b5:42:b5:3d:96:61:31:eb:0d:4c:e9:f5:31:
+ d3:25:af:40:b3:bb:81:04:7f:1a:ce:21:18:83:52:
+ 2d:51:31:ae:82:f9:cb:10:d3:d5:06:af:f8:71:e8:
+ a3:c6:9f:7b:48:da:e2:28:af:1c:ff:41:6d:32:81:
+ 45:59:d7:64:e4:b1:d7:c9:86:6a:0b:65:71:66:d6:
+ 42:a8:67:fd:83:49:20:75:16:1e:bb:1b:85:5c:7e:
+ e2:8f:5f:1c:81:d3:8a:95:d6:92:5c:9e:7f:a2:10:
+ 08:e1:df:ae:69:68:3f:8d:dd:79:4f:da:3f:79:b5:
+ 02:97:57:30:67:4d:3d:76:35:b5:4f:d1:5d:35:dd:
+ d4:b5:6b:57:b2:e0:23:35:ad:1a:bf:6f:77:e6:bc:
+ 58:ed
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
@@ -98,48 +97,48 @@ Certificate:
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Key Identifier:
- 4E:54:63:95:A1:58:0C:FA:BD:3E:58:26:AF:AF:A4:F3:66:1A:CB:25
+ 7C:9A:EA:9B:92:98:FB:77:25:89:8B:EF:D3:F4:88:34:AF:EA:24:CC
X509v3 Authority Key Identifier:
keyid:12:CA:BA:4B:46:04:A7:75:8A:2C:E8:0E:54:94:BC:12:65:A6:7B:CE
X509v3 Basic Constraints:
CA:FALSE
- Signature Algorithm: sha256WithRSAEncryption
- 2c:f9:48:33:7c:93:ca:3c:9c:58:92:8c:2b:87:61:9f:0d:9c:
- 9d:e8:43:43:12:d6:a3:40:71:ec:cb:31:76:80:68:b1:54:d1:
- 86:f4:b3:9e:c8:50:62:b4:87:12:be:9b:d6:3c:2b:cf:22:0e:
- 66:26:c2:31:dd:1f:c6:97:1e:61:a4:51:ea:68:75:81:66:b9:
- 3b:a6:1f:f6:80:ec:6b:aa:65:66:0c:02:ab:c9:57:bd:6a:4e:
- 6d:24:30:13:7b:65:17:60:9a:14:37:57:f7:22:66:55:7d:1a:
- 1a:5b:27:43:3b:d4:88:bc:2f:d3:d7:bb:d5:3f:9b:25:26:5d:
- 39:a0:4c:8a:84:2c:db:04:87:8a:df:49:7d:4b:d2:85:7a:09:
- 5e:df:6b:1b:b5:6e:9c:bb:2b:f6:c5:01:19:5a:87:d0:cf:16:
- 67:8b:54:41:87:c1:33:c3:21:f6:e5:84:d2:84:5d:da:82:cd:
- 39:4d:50:97:f3:83:37:9e:e5:04:0e:dc:c6:20:d1:b3:f6:c7:
- 3d:dd:95:be:8c:b9:72:72:7a:71:66:aa:4a:8e:cf:37:38:e8:
- c8:06:69:68:8d:d8:d6:8b:4c:23:50:27:fa:e9:bb:2a:a6:89:
- 56:ad:be:4d:bd:be:0c:d7:55:b4:f4:b9:f7:6a:b5:2c:7f:5f:
- 9f:df:f6:61
+ Signature Algorithm: sha1WithRSAEncryption
+ 0f:97:60:47:2f:22:9f:d4:16:99:5a:ed:f4:b5:54:31:bf:9f:
+ a1:bd:2d:8b:eb:c1:24:db:73:30:c7:46:d6:4c:c8:c6:38:0c:
+ 9a:e6:d6:5e:e8:a7:fb:9f:b6:44:66:73:43:86:46:10:c0:4c:
+ 40:4e:c1:d7:e4:41:0b:f0:61:f0:6f:45:8c:5a:14:40:42:97:
+ c3:03:d0:ff:6d:4a:06:80:65:49:d4:2f:07:9d:86:59:6b:5b:
+ 9e:bc:0c:46:8a:62:da:c0:22:af:13:6c:0d:9d:54:5e:46:53:
+ a5:aa:f2:80:44:c7:07:6e:f7:b0:4c:37:5c:31:08:a0:37:df:
+ 8a:35:92:3c:8c:91:2f:64:4f:d3:a0:eb:95:b3:4a:9e:f7:ac:
+ 25:ad:06:13:5c:dd:bd:d5:6b:74:8d:c7:c5:a6:b4:89:27:fd:
+ b7:c2:24:a7:6a:b3:64:e6:e6:31:91:35:fc:0e:15:14:38:d6:
+ 39:b0:c4:b2:c1:c8:c7:ed:25:d7:b0:a9:b9:a0:70:33:42:90:
+ 86:33:2a:d8:d5:8a:02:e6:ab:8d:92:d6:ae:b4:1d:e9:6c:22:
+ a5:2f:1a:48:48:2b:5c:b8:30:01:4b:27:1a:d3:cf:21:77:ab:
+ 9f:bc:55:34:2e:9f:03:2b:17:0b:c3:44:8e:a8:94:ae:92:a2:
+ 9a:33:c0:8e
-----BEGIN CERTIFICATE-----
-MIID3jCCAsagAwIBAgIGDk25xiSwMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNVBAYT
+MIID3jCCAsagAwIBAgIGDfi4rSqgMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNVBAYT
Ak5OMTEwLwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNo
IENsb3VkMSYwJAYDVQQDDB1Ob3J0aGVybiBOb3doZXJlIFRydXN0IEFuY2hvcjAe
-Fw0xOTExMDIxMjUzMjVaFw0yODAxMTkxMjUzMjVaMFcxCzAJBgNVBAYTAk5OMTEw
+Fw0xODA5MDUyMzI5MDFaFw0yNjExMjIyMzI5MDFaMFcxCzAJBgNVBAYTAk5OMTEw
LwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNoIENsb3Vk
MRUwEwYDVQQDDAxsb2NhbGhvc3Qubm4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQC9lw6nbbZzjNAha/M2dF0Kqjrw+m6xXBwTdMpnKyID0aY8Je+HT+g4
-nyEdLogSNmaCAwJM+Bc1ApUxsVNAISQvAPC/gFgWsZKz03i/eMsKkQzSbV2yH0Fz
-FgJ8Gs0WJcnhG4G9hJNMY8449D6tmGsAiai69X4Ig/Oa9Zi4n9bYx9TzBxyP77wp
-EGCMhYtMenPHn6gjL8RH9RiFmPsn3liTSwilZsnf2/Ai+GSfoVaJl6sCLFqZ8m+/
-cjGQIjKuhiVrE8Zy7N8uyBIAweM4tKBAugFhwtex731LKRji/ijQmORlP0w0OeSC
-qcqyPcSRj6CUv+P4s3NIt/76BEPntby9AgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
+ggEKAoIBAQDfFhVfKqRQzzqoeW4ijZUWt0190h9PbS16fdyKT1N7X8neXIhsonQm
+NRx4aMFgJad7thqaqjPQn17yLiEEjA2aKPVhQDw0GpuKcIFtg5580EzZedw32SRu
+c8dhMXHp9Ze3Za099q8gb1a5tUK1PZZhMesNTOn1MdMlr0Czu4EEfxrOIRiDUi1R
+Ma6C+csQ09UGr/hx6KPGn3tI2uIorxz/QW0ygUVZ12TksdfJhmoLZXFm1kKoZ/2D
+SSB1Fh67G4VcfuKPXxyB04qV1pJcnn+iEAjh365paD+N3XlP2j95tQKXVzBnTT12
+NbVP0V013dS1a1ey4CM1rRq/b3fmvFjtAgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
bG9jYWxob3N0MYIKbG9jYWxob3N0MoIJbG9jYWxob3N0MAsGA1UdDwQEAwIDqDAT
-BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUTlRjlaFYDPq9Plgmr6+k82Ya
-yyUwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
-BgkqhkiG9w0BAQsFAAOCAQEALPlIM3yTyjycWJKMK4dhnw2cnehDQxLWo0Bx7Msx
-doBosVTRhvSznshQYrSHEr6b1jwrzyIOZibCMd0fxpceYaRR6mh1gWa5O6Yf9oDs
-a6plZgwCq8lXvWpObSQwE3tlF2CaFDdX9yJmVX0aGlsnQzvUiLwv09e71T+bJSZd
-OaBMioQs2wSHit9JfUvShXoJXt9rG7VunLsr9sUBGVqH0M8WZ4tUQYfBM8Mh9uWE
-0oRd2oLNOU1Ql/ODN57lBA7cxiDRs/bHPd2Vvoy5cnJ6cWaqSo7PNzjoyAZpaI3Y
-1otMI1An+um7KqaJVq2+Tb2+DNdVtPS592q1LH9fn9/2YQ==
+BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUfJrqm5KY+3cliYvv0/SINK/q
+JMwwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
+BgkqhkiG9w0BAQUFAAOCAQEAD5dgRy8in9QWmVrt9LVUMb+fob0ti+vBJNtzMMdG
+1kzIxjgMmubWXuin+5+2RGZzQ4ZGEMBMQE7B1+RBC/Bh8G9FjFoUQEKXwwPQ/21K
+BoBlSdQvB52GWWtbnrwMRopi2sAirxNsDZ1UXkZTparygETHB273sEw3XDEIoDff
+ijWSPIyRL2RP06DrlbNKnvesJa0GE1zdvdVrdI3Hxaa0iSf9t8Ikp2qzZObmMZE1
+/A4VFDjWObDEssHIx+0l17CpuaBwM0KQhjMq2NWKAuarjZLWrrQd6WwipS8aSEgr
+XLgwAUsnGtPPIXern7xVNC6fAysXC8NEjqiUrpKimjPAjg==
-----END CERTIFICATE-----
diff --git a/tests/certs/Server-localhost-lastSAN-sv.pub.der b/tests/certs/Server-localhost-lastSAN-sv.pub.der
index 480ee31a9..5cd11dc13 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.pub.der
+++ b/tests/certs/Server-localhost-lastSAN-sv.pub.der
Binary files differ
diff --git a/tests/certs/Server-localhost-lastSAN-sv.pub.pem b/tests/certs/Server-localhost-lastSAN-sv.pub.pem
index 5c1d3330f..aaca85708 100644
--- a/tests/certs/Server-localhost-lastSAN-sv.pub.pem
+++ b/tests/certs/Server-localhost-lastSAN-sv.pub.pem
@@ -1,9 +1,9 @@
-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvZcOp222c4zQIWvzNnRd
-Cqo68PpusVwcE3TKZysiA9GmPCXvh0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEk
-LwDwv4BYFrGSs9N4v3jLCpEM0m1dsh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhr
-AImouvV+CIPzmvWYuJ/W2MfU8wccj++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Y
-k0sIpWbJ39vwIvhkn6FWiZerAixamfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSg
-QLoBYcLXse99SykY4v4o0JjkZT9MNDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8
-vQIDAQAB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3xYVXyqkUM86qHluIo2V
+FrdNfdIfT20ten3cik9Te1/J3lyIbKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwN
+mij1YUA8NBqbinCBbYOefNBM2XncN9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2W
+YTHrDUzp9THTJa9As7uBBH8aziEYg1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c
+/0FtMoFFWddk5LHXyYZqC2VxZtZCqGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/
+ohAI4d+uaWg/jd15T9o/ebUCl1cwZ009djW1T9FdNd3UtWtXsuAjNa0av2935rxY
+7QIDAQAB
-----END PUBLIC KEY-----
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 557f92891..2eca9c670 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -56,8 +56,8 @@ test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
-test325 test326 test327 test328 test329 test330 test331 test332 test333 \
-test334 test335 test336 test337 test338 \
+test325 test326 test327 test328 test329 test330 test331 \
+\
test340 \
\
test350 test351 test352 test353 test354 test355 test356 \
@@ -70,7 +70,7 @@ test500 test501 test502 test503 test504 test505 test506 test507 test508 \
test509 test510 test511 test512 test513 test514 test515 test516 test517 \
test518 test519 test520 test521 test522 test523 test524 test525 test526 \
test527 test528 test529 test530 test531 test532 test533 test534 test535 \
- test537 test538 test539 test540 test541 test542 test543 test544 \
+test536 test537 test538 test539 test540 test541 test542 test543 test544 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
@@ -83,32 +83,30 @@ test617 test618 test619 test620 test621 test622 test623 test624 test625 \
test626 test627 test628 test629 test630 test631 test632 test633 test634 \
test635 test636 test637 test638 test639 test640 test641 test642 \
test643 test644 test645 test646 test647 test648 test649 test650 test651 \
-test652 test653 test654 test655 test656 test658 test659 test660 test661 \
-test662 test663 \
+test652 test653 test654 test655 test656 test658 test659 \
\
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
-test709 test710 test711 test712 test713 test714 test715 test716 test717 \
+test709 test710 test711 test712 test713 test714 test715 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
-test845 test846 test847 test848 test849 \
+test845 test846 test847 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
test868 test869 test870 test871 test872 test873 test874 test875 test876 \
test877 test878 test879 test880 test881 test882 test883 test884 test885 \
-test886 test887 test888 test889 test890 test891 test892 test893 \
+test886 test887 test888 test889 test890 test891 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
-test945 test946 test947 test948 test949 test950 test951 test952 test953 \
-test954 \
+test945 test946 test947 test948 test949 test950 test951 test952 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -130,8 +128,9 @@ test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
-test1160 test1161 test1162 test1163 test1164 test1165 test1166 \
-test1170 test1171 test1172 test1173 test1174 \
+\
+test1160 test1161 test1162 test1163 test1164 \
+test1170 test1171 test1172 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
@@ -142,7 +141,7 @@ test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
-test1268 test1269 \
+test1268 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 \
@@ -171,26 +170,26 @@ test1444 test1445 test1446 test1447 test1448 test1449 test1450 test1451 \
test1452 test1453 test1454 test1455 test1456 test1457 test1458\
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
-test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
+test1516 test1517 test1518 test1519 test1520 test1521 test1522 \
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
-test1558 test1559 test1560 test1561 test1562 test1563 \
+test1558 test1560 test1561 test1562 \
\
-test1590 test1591 test1592 test1593 test1594 test1595 test1596 \
+test1590 test1591 test1592 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
test1608 test1609 test1620 test1621 \
\
-test1650 test1651 test1652 test1653 test1654 test1655 \
+test1650 test1651 test1652 test1653 test1654 \
\
test1700 test1701 test1702 \
\
test1800 test1801 \
\
-test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
+test1900 test1901 test1902 test1903 test1904 test1905 \
\
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
@@ -201,8 +200,7 @@ test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
- test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
-test2078 \
+ test2071 test2072 test2073 test2074 test2075 test2076 \
test2080 \
test2100 \
\
diff --git a/tests/data/test1001 b/tests/data/test1001
index 53d7da381..91b13203e 100644
--- a/tests/data/test1001
+++ b/tests/data/test1001
@@ -66,7 +66,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST --digest with PUT and resumed upload and modified method
diff --git a/tests/data/test1002 b/tests/data/test1002
index 5b6ef9431..83cce6e44 100644
--- a/tests/data/test1002
+++ b/tests/data/test1002
@@ -65,10 +65,9 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
-HTTP PUT with Digest auth, resumed upload and modified method, twice
+HTTP POST --digest with PUT and resumed upload and modified method, twice
</name>
<command>
http://%HOSTIP:%HTTPPORT/1002.upload1 -T log/1002 http://%HOSTIP:%HTTPPORT/1002.upload2 -T log/1002 -u auser:apasswd --digest -x http://%HOSTIP:%HTTPPORT -C 2 -X GET
@@ -104,14 +103,6 @@ Expect: 100-continue
st
GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Content-Range: bytes 2-4/5
-User-Agent: curl/7.16.1
-Accept: */*
-Proxy-Connection: Keep-Alive
-Content-Length: 0
-
-GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"
Content-Range: bytes 2-4/5
User-Agent: curl/7.16.1
diff --git a/tests/data/test1008 b/tests/data/test1008
index 9fca722c8..c123c5c0c 100644
--- a/tests/data/test1008
+++ b/tests/data/test1008
@@ -88,7 +88,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy CONNECT auth NTLM with chunked-encoded 407 response
diff --git a/tests/data/test1010 b/tests/data/test1010
index ef073f5e5..b2083af7b 100644
--- a/tests/data/test1010
+++ b/tests/data/test1010
@@ -49,9 +49,9 @@ PASS ftp@example.com
PWD
EPSV
TYPE A
-LIST /list/this/path/1010
+LIST /list/this/path/1010/
EPSV
-LIST /list/this/path/1010
+LIST /list/this/path/1010/
QUIT
</protocol>
</verify>
diff --git a/tests/data/test1016 b/tests/data/test1016
index 01bf100f3..4927f9eaa 100644
--- a/tests/data/test1016
+++ b/tests/data/test1016
@@ -23,7 +23,7 @@ file
X-Y range on a file:// URL to stdout
</name>
<command option="no-include">
--r 1-4 file://localhost%FILE_PWD/log/test1016.txt
+-r 1-4 file://localhost/%PWD/log/test1016.txt
</command>
<file name="log/test1016.txt">
1234567890
diff --git a/tests/data/test1017 b/tests/data/test1017
index 9790d776d..cfdd80f9e 100644
--- a/tests/data/test1017
+++ b/tests/data/test1017
@@ -24,7 +24,7 @@ file
0-Y range on a file:// URL to stdout
</name>
<command option="no-include">
--r 0-3 file://localhost%FILE_PWD/log/test1017.txt
+-r 0-3 file://localhost/%PWD/log/test1017.txt
</command>
<file name="log/test1017.txt">
1234567890
diff --git a/tests/data/test1018 b/tests/data/test1018
index ddf1f2595..57487014f 100644
--- a/tests/data/test1018
+++ b/tests/data/test1018
@@ -23,7 +23,7 @@ file
X-X range on a file:// URL to stdout
</name>
<command option="no-include">
--r 4-4 file://localhost%FILE_PWD/log/test1018.txt
+-r 4-4 file://localhost/%PWD/log/test1018.txt
</command>
<file name="log/test1018.txt">
1234567890
diff --git a/tests/data/test1019 b/tests/data/test1019
index 2a92ae5cf..054e38d5d 100644
--- a/tests/data/test1019
+++ b/tests/data/test1019
@@ -24,7 +24,7 @@ file
X- range on a file:// URL to stdout
</name>
<command option="no-include">
--r 7- file://localhost%FILE_PWD/log/test1019.txt
+-r 7- file://localhost/%PWD/log/test1019.txt
</command>
<file name="log/test1019.txt">
1234567890
diff --git a/tests/data/test1020 b/tests/data/test1020
index 0d88532f7..8e03a1758 100644
--- a/tests/data/test1020
+++ b/tests/data/test1020
@@ -24,7 +24,7 @@ file
-Y range on a file:// URL to stdout
</name>
<command option="no-include">
--r -9 file://localhost%FILE_PWD/log/test1020.txt
+-r -9 file://localhost/%PWD/log/test1020.txt
</command>
<file name="log/test1020.txt">
1234567890
diff --git a/tests/data/test1021 b/tests/data/test1021
index 689341d60..800973d1c 100644
--- a/tests/data/test1021
+++ b/tests/data/test1021
@@ -93,7 +93,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy CONNECT with any proxyauth and proxy offers NTLM and close
diff --git a/tests/data/test1059 b/tests/data/test1059
index 615e625c9..6820ea679 100644
--- a/tests/data/test1059
+++ b/tests/data/test1059
@@ -26,7 +26,6 @@ Content-Length: 0
<client>
<features>
ftp
-proxy
</features>
<server>
http
diff --git a/tests/data/test1060 b/tests/data/test1060
index c4b264c10..14fc7e53c 100644
--- a/tests/data/test1060
+++ b/tests/data/test1060
@@ -869,7 +869,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP proxy CONNECT auth Digest, large headers and data
diff --git a/tests/data/test1061 b/tests/data/test1061
index 6ddddfee2..c481d39c4 100644
--- a/tests/data/test1061
+++ b/tests/data/test1061
@@ -874,7 +874,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP proxy CONNECT auth Digest, large headers and chunked data
diff --git a/tests/data/test1063 b/tests/data/test1063
index de2085d3e..2979094dc 100644
--- a/tests/data/test1063
+++ b/tests/data/test1063
@@ -28,7 +28,7 @@ Invalid large X- range on a file://
# This range value is 2**32+7, which will be truncated to the valid value 7
# if the large file support is not working correctly
<command>
--r 4294967303- file://localhost%FILE_PWD/log/test1063.txt
+-r 4294967303- file://localhost/%PWD/log/test1063.txt
</command>
<file name="log/test1063.txt">
1234567890
diff --git a/tests/data/test1077 b/tests/data/test1077
index e917e8a56..a3c90245a 100644
--- a/tests/data/test1077
+++ b/tests/data/test1077
@@ -44,7 +44,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<name>
FTP over HTTP proxy with downgrade to HTTP 1.0
diff --git a/tests/data/test1078 b/tests/data/test1078
index d705dbca4..a9bb771be 100644
--- a/tests/data/test1078
+++ b/tests/data/test1078
@@ -45,9 +45,6 @@ HTTP 1.0 CONNECT with proxytunnel and downgrade GET to HTTP/1.0
<command>
--proxy1.0 %HOSTIP:%PROXYPORT -p http://%HOSTIP.1078:%HTTPPORT/we/want/that/page/1078 http://%HOSTIP.1078:%HTTPPORT/we/want/that/page/1078
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1087 b/tests/data/test1087
index 883d98642..d228976ac 100644
--- a/tests/data/test1087
+++ b/tests/data/test1087
@@ -80,9 +80,6 @@ HTTP, proxy with --anyauth and Location: to new host
<command>
http://first.host.it.is/we/want/that/page/10871000 -x %HOSTIP:%HTTPPORT --user iam:myself --location --anyauth
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1088 b/tests/data/test1088
index f2b6fc263..a807ce9e5 100644
--- a/tests/data/test1088
+++ b/tests/data/test1088
@@ -81,9 +81,6 @@ HTTP, proxy with --anyauth and Location: to new host using location-trusted
<command>
http://first.host.it.is/we/want/that/page/10881000 -x %HOSTIP:%HTTPPORT --user iam:myself --location-trusted --anyauth
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1091 b/tests/data/test1091
index 24669334b..f3ce8608a 100644
--- a/tests/data/test1091
+++ b/tests/data/test1091
@@ -34,8 +34,7 @@ FTP URL with type=i
USER anonymous
PASS ftp@example.com
PWD
-CWD /
-CWD tmp
+CWD /tmp
CWD moo
EPSV
TYPE I
diff --git a/tests/data/test1092 b/tests/data/test1092
index 725a274ba..adef4320b 100644
--- a/tests/data/test1092
+++ b/tests/data/test1092
@@ -30,7 +30,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<name>
FTP with type=i over HTTP proxy
diff --git a/tests/data/test1098 b/tests/data/test1098
index 0d397340c..980564810 100644
--- a/tests/data/test1098
+++ b/tests/data/test1098
@@ -29,7 +29,6 @@ http
<features>
http
ftp
-proxy
</features>
<name>
FTP RETR twice over proxy confirming persistent connection
diff --git a/tests/data/test1104 b/tests/data/test1104
index e66da58ad..570f13c51 100644
--- a/tests/data/test1104
+++ b/tests/data/test1104
@@ -61,9 +61,6 @@ HTTP cookie expiry date at Jan 1 00:00:00 GMT 1970
<command>
http://%HOSTIP:%HTTPPORT/want/1104 -L -x %HOSTIP:%HTTPPORT -c log/cookies1104.jar
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1106 b/tests/data/test1106
index 37a77e36e..0c6bec177 100644
--- a/tests/data/test1106
+++ b/tests/data/test1106
@@ -24,7 +24,6 @@ hello
<client>
<features>
ftp
-proxy
</features>
<server>
http
diff --git a/tests/data/test1135 b/tests/data/test1135
index eca6860fb..3591a543b 100644
--- a/tests/data/test1135
+++ b/tests/data/test1135
@@ -91,7 +91,6 @@ CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
-CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
diff --git a/tests/data/test1136 b/tests/data/test1136
index 75b6ee838..e18a92325 100644
--- a/tests/data/test1136
+++ b/tests/data/test1136
@@ -33,7 +33,6 @@ boo
<client>
<features>
PSL
-proxy
</features>
<server>
http
diff --git a/tests/data/test1141 b/tests/data/test1141
index b0cff8e37..9c41d3935 100644
--- a/tests/data/test1141
+++ b/tests/data/test1141
@@ -47,9 +47,6 @@ HTTP redirect to http:/// (three slashes!)
<command>
%HOSTIP:%HTTPPORT/want/1141 -L -x http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1142 b/tests/data/test1142
index 5f1e2b35a..76c6bdf55 100644
--- a/tests/data/test1142
+++ b/tests/data/test1142
@@ -42,9 +42,6 @@ HTTP redirect to http://// (four slashes!)
<command>
%HOSTIP:%HTTPPORT/want/1142 -L -x http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1149 b/tests/data/test1149
index f0c297dc1..f826391e9 100644
--- a/tests/data/test1149
+++ b/tests/data/test1149
@@ -57,7 +57,7 @@ TYPE A
LIST
CWD /
EPSV
-LIST list/this/path/1149
+LIST list/this/path/1149/
QUIT
</protocol>
</verify>
diff --git a/tests/data/test1150 b/tests/data/test1150
index e86c7e154..ecd95d57e 100644
--- a/tests/data/test1150
+++ b/tests/data/test1150
@@ -32,9 +32,6 @@ HTTP proxy with URLs using different ports
<command>
--proxy http://%HOSTIP:%HTTPPORT http://test.remote.example.com.1150:150/path http://test.remote.example.com.1150:1234/path/
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1162 b/tests/data/test1162
index b6b394139..73e4646e1 100644
--- a/tests/data/test1162
+++ b/tests/data/test1162
@@ -31,10 +31,6 @@ FTP wildcard with crazy pattern
<command>
"ftp://%HOSTIP:%FTPPORT/fully_simulated/DOS/[*\\s-'tl"
</command>
-<setenv>
-# Needed for MSYS2 to not convert backslash to forward slash
-MSYS2_ARG_CONV_EXCL=ftp://
-</setenv>
</client>
<verify>
<protocol>
diff --git a/tests/data/test1165 b/tests/data/test1165
deleted file mode 100644
index 24c1c3eb1..000000000
--- a/tests/data/test1165
+++ /dev/null
@@ -1,25 +0,0 @@
-<testcase>
-<info>
-<keywords>
-source analysis
-CURL_DISABLE
-</keywords>
-</info>
-
-#
-# Client-side
-<client>
-<server>
-none
-</server>
-
- <name>
-Verify configure.ac and source code CURL_DISABLE_-sync
- </name>
-
-<command type="perl">
-%SRCDIR/disable-scan.pl %SRCDIR/..
-</command>
-</client>
-
-</testcase>
diff --git a/tests/data/test1166 b/tests/data/test1166
deleted file mode 100644
index 3cae80ecd..000000000
--- a/tests/data/test1166
+++ /dev/null
@@ -1,53 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-followlocation
-cookies
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Set-Cookie: trackyou=want; path=/
-Content-Length: 68
-
-This server reply is for testing a Location: following with cookies
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-HTTP response with cookies but not receiving!
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/want/1166 http://%HOSTIP:%HTTPPORT/want/1166
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /want/1166 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /want/1166 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test1173 b/tests/data/test1173
deleted file mode 100644
index dd09f81d8..000000000
--- a/tests/data/test1173
+++ /dev/null
@@ -1,26 +0,0 @@
-<testcase>
-<info>
-<keywords>
-source analysis
-documentation
---manual
-</keywords>
-</info>
-
-#
-# Client-side
-<client>
-<server>
-none
-</server>
-
- <name>
-Basic man page syntax check
- </name>
-
-<command type="perl">
-%SRCDIR/manpage-syntax.pl %SRCDIR/../docs/*.1 %SRCDIR/../docs/libcurl/*.3 %SRCDIR/../docs/libcurl/opts/*.3
-</command>
-</client>
-
-</testcase>
diff --git a/tests/data/test1174 b/tests/data/test1174
deleted file mode 100644
index b316fde8c..000000000
--- a/tests/data/test1174
+++ /dev/null
@@ -1,50 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP/0.9
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<data>
--foo- swsclose
-</data>
-<datacheck>
-</datacheck>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-HTTP/0.9 GET response denied by default
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/1174
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1174 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-# unsupported protocol
-<errorcode>
-1
-</errorcode>
-</verify>
-</testcase>
diff --git a/tests/data/test1213 b/tests/data/test1213
index 46a6938cb..4f22f0d92 100644
--- a/tests/data/test1213
+++ b/tests/data/test1213
@@ -35,9 +35,6 @@ HTTP with proxy and host-only URL
<command>
-x %HOSTIP:%HTTPPORT we.want.that.site.com.1213
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1214 b/tests/data/test1214
index 73c799a4a..3eeb3e3ad 100644
--- a/tests/data/test1214
+++ b/tests/data/test1214
@@ -35,9 +35,6 @@ HTTP with proxy and URL with ? and no slash separator
<command>
-x %HOSTIP:%HTTPPORT http://we.want.that.site.com.1214?moo=foo
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1215 b/tests/data/test1215
index 8edfd9b4e..08d74369e 100644
--- a/tests/data/test1215
+++ b/tests/data/test1215
@@ -60,7 +60,6 @@ Finally, this is the real page!
NTLM
!SSPI
debug
-proxy
</features>
<server>
http
diff --git a/tests/data/test1216 b/tests/data/test1216
index c4f977b60..be0f5c77a 100644
--- a/tests/data/test1216
+++ b/tests/data/test1216
@@ -39,9 +39,6 @@ example.fake FALSE /b FALSE 0 moo1 indeed
example.fake FALSE /c FALSE 2139150993 moo2 indeed
example.fake TRUE /c FALSE 2139150993 moo3 indeed
</file>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1218 b/tests/data/test1218
index 37c8f4ef0..e3f1f6d04 100644
--- a/tests/data/test1218
+++ b/tests/data/test1218
@@ -32,9 +32,6 @@ HTTP cookies and domains with same prefix
<command>
http://example.fake/c/1218 http://example.fake/c/1218 http://bexample.fake/c/1218 -b nonexisting -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1220 b/tests/data/test1220
index c8eb52cb1..6752eb580 100644
--- a/tests/data/test1220
+++ b/tests/data/test1220
@@ -21,7 +21,7 @@ file
file:// URLs with query string
</name>
<command option="no-include">
-file://localhost%FILE_PWD/log/test1220.txt?a_query=foobar#afragment
+file://localhost/%PWD/log/test1220.txt?a_query=foobar#afragment
</command>
<file name="log/test1220.txt">
contents in a single file
diff --git a/tests/data/test1225 b/tests/data/test1225
index 09a1abb79..2b2519c94 100644
--- a/tests/data/test1225
+++ b/tests/data/test1225
@@ -45,6 +45,7 @@ TYPE I
SIZE 1225
RETR 1225
CWD /
+CWD /
CWD foo
CWD bar
EPSV
diff --git a/tests/data/test1228 b/tests/data/test1228
index 50af6bc2c..a7e56a797 100644
--- a/tests/data/test1228
+++ b/tests/data/test1228
@@ -31,9 +31,6 @@ HTTP cookie path match
<command>
http://example.fake/hoge/1228 http://example.fake/hogege/ -b nonexisting -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1230 b/tests/data/test1230
index 860ce21a4..ca2f6c67d 100644
--- a/tests/data/test1230
+++ b/tests/data/test1230
@@ -43,7 +43,6 @@ mooooooo
<client>
<features>
ipv6
-proxy
</features>
<server>
http-proxy
diff --git a/tests/data/test1232 b/tests/data/test1232
index 7425d44d8..d0659f126 100644
--- a/tests/data/test1232
+++ b/tests/data/test1232
@@ -41,9 +41,6 @@ HTTP URL with dotdot removal from path using an HTTP proxy
<command>
--proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1232:8990/../../hej/but/who/../1232?stupid=me/../1232#soo/../1232 http://test.remote.haxx.se.1232:8990/../../hej/but/who/../12320001#/../12320001
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1233 b/tests/data/test1233
index 1d4d3d561..caf0527f2 100644
--- a/tests/data/test1233
+++ b/tests/data/test1233
@@ -2,7 +2,6 @@
<info>
<keywords>
FTP
-connect to non-listen
</keywords>
</info>
diff --git a/tests/data/test1241 b/tests/data/test1241
index bc6c61801..aaa568868 100644
--- a/tests/data/test1241
+++ b/tests/data/test1241
@@ -40,9 +40,6 @@ HTTP _without_ dotdot removal
<command>
--path-as-is --proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1241:8990/../../hej/but/who/../1241?stupid=me/../1241#soo/../1241 http://test.remote.haxx.se.1241:8990/../../hej/but/who/../12410001#/../12410001
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1246 b/tests/data/test1246
index a35bc89c3..65659292d 100644
--- a/tests/data/test1246
+++ b/tests/data/test1246
@@ -40,9 +40,6 @@ URL with '#' at end of host name instead of '/'
<command>
--proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1246:%HTTPPORT#@127.0.0.1/tricked.html no-scheme-url.com.1246:%HTTPPORT#@127.127.127.127/again.html
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1253 b/tests/data/test1253
index 8f240b0af..74002994b 100644
--- a/tests/data/test1253
+++ b/tests/data/test1253
@@ -35,9 +35,6 @@ NO_PROXY=example.com
<command>
http://somewhere.example.com/1253 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1254 b/tests/data/test1254
index c05975488..817b9342b 100644
--- a/tests/data/test1254
+++ b/tests/data/test1254
@@ -35,9 +35,6 @@ NO_PROXY=example.com
<command>
http://somewhere.example.com/1254 --proxy http://%HOSTIP:%HTTPPORT --noproxy ""
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1256 b/tests/data/test1256
index e86afbb53..09c59f4ff 100644
--- a/tests/data/test1256
+++ b/tests/data/test1256
@@ -36,9 +36,6 @@ NO_PROXY=example.com
<command>
http://somewhere.example.com/1256 --noproxy %HOSTIP
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1257 b/tests/data/test1257
index 16a7c1af6..6b7e93736 100644
--- a/tests/data/test1257
+++ b/tests/data/test1257
@@ -36,9 +36,6 @@ NO_PROXY=example.com
<command>
http://somewhere.example.com/1257 --noproxy ""
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1269 b/tests/data/test1269
deleted file mode 100644
index c77663633..000000000
--- a/tests/data/test1269
+++ /dev/null
@@ -1,34 +0,0 @@
-<testcase>
-<info>
-<keywords>
---retry-delay
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-none
-</server>
- <name>
-too large --retry-delay value
- </name>
- <command>
---retry 3 --retry-delay 9223372036854776 http://%HOSTIP:%HTTPPORT/1269
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<errorcode>
-2
-</errorcode>
-</verify>
-</testcase>
diff --git a/tests/data/test1287 b/tests/data/test1287
index 976fd6ecf..46c292497 100644
--- a/tests/data/test1287
+++ b/tests/data/test1287
@@ -60,9 +60,6 @@ HTTP over proxy-tunnel ignore TE and CL in CONNECT 2xx responses
<command>
-v --proxytunnel -x %HOSTIP:%PROXYPORT http://test.1287:%HTTPPORT/we/want/that/page/1287
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1288 b/tests/data/test1288
index d8a1e524c..543aa3d6e 100644
--- a/tests/data/test1288
+++ b/tests/data/test1288
@@ -44,9 +44,6 @@ Suppress proxy CONNECT response headers
<command>
--proxytunnel --suppress-connect-headers --dump-header - --include --write-out "\nCONNECT CODE: %{http_connect}\nRECEIVED HEADER BYTE TOTAL: %{size_header}\n" --proxy %HOSTIP:%PROXYPORT http://%HOSTIP.1288:%HTTPPORT/we/want/that/page/1288
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1291 b/tests/data/test1291
index a2e505fc9..3f1575184 100644
--- a/tests/data/test1291
+++ b/tests/data/test1291
@@ -21,7 +21,7 @@ HTTP PUT
none
</server>
<name>
-Attempt to upload 1000 files but fail immediately
+Attempt to upload 100K files but fail immediately
</name>
<command>
-K log/cmd1291 --fail-early
@@ -31,7 +31,7 @@ XXXXXXXx
</file>
# generate the config file
<precheck>
-perl -e 'for(1 .. 1000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
+perl -e 'for(1 .. 100000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
</precheck>
</client>
@@ -40,5 +40,11 @@ perl -e 'for(1 .. 1000) { printf("upload-file=log/upload-this\nurl=htttttp://non
<errorcode>
1
</errorcode>
+
+# we disable valgrind here since it takes 40+ seconds even on a fairly snappy
+# machine
+<valgrind>
+disable
+</valgrind>
</verify>
</testcase>
diff --git a/tests/data/test1314 b/tests/data/test1314
index 3963bd93f..078ada64a 100644
--- a/tests/data/test1314
+++ b/tests/data/test1314
@@ -56,9 +56,6 @@ HTTP Location: following a // prefixed url
<command>
http://firstplace.example.com/want/1314 -L -x http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1319 b/tests/data/test1319
index 8fc968c89..f50c53165 100644
--- a/tests/data/test1319
+++ b/tests/data/test1319
@@ -50,7 +50,6 @@ http-proxy
</server>
<features>
http
-proxy
</features>
<name>
POP3 fetch tunneled through HTTP proxy
diff --git a/tests/data/test1320 b/tests/data/test1320
index da4079e93..7a15f8091 100644
--- a/tests/data/test1320
+++ b/tests/data/test1320
@@ -27,7 +27,6 @@ http-proxy
</server>
<features>
http
-proxy
</features>
<name>
SMTP send tunneled through HTTP proxy
diff --git a/tests/data/test1321 b/tests/data/test1321
index cc9117774..72a52c935 100644
--- a/tests/data/test1321
+++ b/tests/data/test1321
@@ -46,7 +46,6 @@ http-proxy
</server>
<features>
http
-proxy
</features>
<name>
IMAP FETCH tunneled through HTTP proxy
diff --git a/tests/data/test1329 b/tests/data/test1329
index 2cec0b895..3d2d0cb6c 100644
--- a/tests/data/test1329
+++ b/tests/data/test1329
@@ -17,9 +17,6 @@ http
<command>
http://%HOSTIP:%HTTPPORT/we/want/that/page/1329 -x "/server"
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1331 b/tests/data/test1331
index 865abd969..6b5823529 100644
--- a/tests/data/test1331
+++ b/tests/data/test1331
@@ -64,9 +64,6 @@ HTTP --proxy-anyauth and 407 with cookies
<command>
-U myname:mypassword -x %HOSTIP:%HTTPPORT http://z.x.com/1331 --proxy-anyauth -c log/dump1331
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1400 b/tests/data/test1400
index c0d409bac..36ddd0e91 100644
--- a/tests/data/test1400
+++ b/tests/data/test1400
@@ -50,13 +50,11 @@ Accept: */*
<stripfile>
s/(USERAGENT, \")[^\"]+/${1}stripped/
# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
-# CURLOPT_INTERLEAVEDATA requires RTSP protocol
# configurations - just ignore them
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
$_ = '' if /CURLOPT_HTTP09_ALLOWED/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
<file name="log/test1400.c" mode="text">
/********* Sample code generated by the curl command line tool **********
@@ -83,6 +81,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
diff --git a/tests/data/test1401 b/tests/data/test1401
index ec3b25cc9..d7033e0b5 100644
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@ -61,7 +61,6 @@ X-Men: cyclops, iceman
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
<file name="log/test1401.c" mode="text">
/********* Sample code generated by the curl command line tool **********
@@ -88,6 +87,7 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "MyUA");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
+ curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_COOKIE, "chocolate=chip");
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -100,6 +100,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
diff --git a/tests/data/test1402 b/tests/data/test1402
index bf7eb7b82..978b26162 100644
--- a/tests/data/test1402
+++ b/tests/data/test1402
@@ -59,7 +59,6 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
<file name="log/test1402.c" mode="text">
/********* Sample code generated by the curl command line tool **********
@@ -80,6 +79,7 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)16);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
+ curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -88,6 +88,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
diff --git a/tests/data/test1403 b/tests/data/test1403
index 731d274b3..9c838d0ed 100644
--- a/tests/data/test1403
+++ b/tests/data/test1403
@@ -56,7 +56,6 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
<file name="log/test1403.c" mode="text">
/********* Sample code generated by the curl command line tool **********
@@ -75,6 +74,7 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1403?foo=bar&baz=quux");
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
+ curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -83,6 +83,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
diff --git a/tests/data/test1404 b/tests/data/test1404
index d3c66a9d5..a7b8cc823 100644
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@ -94,7 +94,6 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
# CURL_DOES_CONVERSION generates an extra comment.
$_ = '' if /\/\* "value" \*\//
</stripfile>
@@ -146,6 +145,7 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
+ curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -154,6 +154,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
diff --git a/tests/data/test1405 b/tests/data/test1405
index dcc8f80b0..4f477c7d9 100644
--- a/tests/data/test1405
+++ b/tests/data/test1405
@@ -96,6 +96,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
@@ -127,7 +128,6 @@ int main(int argc, char *argv[])
</file>
<stripfile>
# CURLOPT_USERAGENT and CURLOPT_MAXREDIRS requires HTTP protocol
-# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
# support, IOW depends on configuration - just ignore these.
$_ = '' if /CURLOPT_USERAGENT/
$_ = '' if /CURLOPT_MAXREDIRS/
@@ -137,7 +137,6 @@ $_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
$_ = '' if /CURLOPT_HTTP09_ALLOWED/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
</verify>
</testcase>
diff --git a/tests/data/test1406 b/tests/data/test1406
index 8803c846e..7d973e7ef 100644
--- a/tests/data/test1406
+++ b/tests/data/test1406
@@ -76,19 +76,20 @@ int main(int argc, char *argv[])
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
+ curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);
curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/1406");
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "sender@example.com");
curl_easy_setopt(hnd, CURLOPT_MAIL_RCPT, slist1);
- curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);
/* Here is a list of options the curl code used that cannot get generated
as source easily. You may select to either not use them or implement
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
@@ -116,14 +117,12 @@ int main(int argc, char *argv[])
</file>
<stripfile>
# These options vary with configurations - just ignore them
-# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
$_ = '' if /CURLOPT_USERAGENT/
$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
$_ = '' if /CURLOPT_HTTP09_ALLOWED/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
</verify>
</testcase>
diff --git a/tests/data/test1407 b/tests/data/test1407
index 917a5deb7..883cf4064 100644
--- a/tests/data/test1407
+++ b/tests/data/test1407
@@ -69,6 +69,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
@@ -94,14 +95,12 @@ int main(int argc, char *argv[])
</file>
<stripfile>
# These options vary with configurations - just ignore them
-# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
$_ = '' if /CURLOPT_USERAGENT/
$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
$_ = '' if /CURLOPT_HTTP09_ALLOWED/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
</verify>
</testcase>
diff --git a/tests/data/test1412 b/tests/data/test1412
index 36d3d1d93..ae63290e9 100644
--- a/tests/data/test1412
+++ b/tests/data/test1412
@@ -25,19 +25,6 @@ Connection: close
This is not the real page
</data>
-# The second URL will get this response
-<data1>
-HTTP/1.1 401 Authorization Required swsclose
-Server: Apache/1.3.27 (Darwin) PHP/4.1.2
-WWW-Authenticate: Blackmagic realm="gimme all yer s3cr3ts"
-WWW-Authenticate: Basic realm="gimme all yer s3cr3ts"
-WWW-Authenticate: Digest realm="gimme all yer s3cr3ts", nonce="11223344"
-Content-Type: text/html; charset=iso-8859-1
-Connection: close
-
-This is not the real page
-</data1>
-
# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1000>
@@ -122,11 +109,6 @@ Accept: */*
GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
-Accept: */*
-
-GET /14120001 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*
diff --git a/tests/data/test1415 b/tests/data/test1415
index 94ce02c59..91abedc33 100644
--- a/tests/data/test1415
+++ b/tests/data/test1415
@@ -46,9 +46,6 @@ TZ=GMT
<command>
http://example.com/we/want/1415 -b none -c log/jar1415.txt -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1418 b/tests/data/test1418
index c137b1c59..b3a2f23b2 100644
--- a/tests/data/test1418
+++ b/tests/data/test1418
@@ -22,15 +22,6 @@ WWW-Authenticate: Basic
Please auth with me
</data>
-<data3>
-HTTP/1.1 401 Authentication please!
-Content-Length: 20
-WWW-Authenticate: Digest realm="loonie", nonce="314156592"
-WWW-Authenticate: Basic
-
-Please auth with me
-</data3>
-
# This is supposed to be returned when the server gets the second
# Authorization: NTLM line passed-in from the client
<data1000>
@@ -108,10 +99,6 @@ Accept: */*
GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /14180003 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"
Accept: */*
diff --git a/tests/data/test1420 b/tests/data/test1420
index 03c4584d5..c3d31f349 100644
--- a/tests/data/test1420
+++ b/tests/data/test1420
@@ -66,6 +66,7 @@ int main(int argc, char *argv[])
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;MAILINDEX=1");
curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret");
+ curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -74,6 +75,7 @@ int main(int argc, char *argv[])
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
+ CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
@@ -99,13 +101,11 @@ int main(int argc, char *argv[])
</file>
<stripfile>
# These options vary with configurations - just ignore them
-# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
$_ = '' if /CURLOPT_USERAGENT/
$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
-$_ = '' if /CURLOPT_INTERLEAVEDATA/
</stripfile>
</verify>
</testcase>
diff --git a/tests/data/test1421 b/tests/data/test1421
index dea49e781..6c59b2160 100644
--- a/tests/data/test1421
+++ b/tests/data/test1421
@@ -35,9 +35,6 @@ Re-using HTTP proxy connection for two different host names
<command>
--proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1421:8990/ http://different.remote.haxx.se.1421:8990
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1428 b/tests/data/test1428
index f09c02dd9..59041ec96 100644
--- a/tests/data/test1428
+++ b/tests/data/test1428
@@ -52,9 +52,6 @@ HTTP over proxy-tunnel with --proxy-header and --header
<command>
http://test.1428:%HTTPPORT/we/want/that/page/1428 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self' --header "header-type: server" --proxy-header "header-type: proxy"
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1429 b/tests/data/test1429
index b6a66c75f..20b031a1e 100644
--- a/tests/data/test1429
+++ b/tests/data/test1429
@@ -9,7 +9,7 @@ HTTP/0.9
<reply>
<data nocheck="yes">
-HTTP/1.1 2345 OK
+HTTP/1.1 1234 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
@@ -43,7 +43,7 @@ http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}' --http0.9
# Verify data after the test has been "shot"
<verify>
<stdout nonewline="yes">
-HTTP/1.1 2345 OK
+HTTP/1.1 1234 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
@@ -55,7 +55,7 @@ Content-Type: text/html
Funny-head: yesyes
-foo-
-234
+123
</stdout>
<strip>
^User-Agent:.*
diff --git a/tests/data/test143 b/tests/data/test143
index 0f36dd9c3..a4df8cbf1 100644
--- a/tests/data/test143
+++ b/tests/data/test143
@@ -32,8 +32,7 @@ FTP URL with type=a
USER anonymous
PASS ftp@example.com
PWD
-CWD /
-CWD tmp
+CWD /tmp
CWD moo
EPSV
TYPE A
diff --git a/tests/data/test1445 b/tests/data/test1445
index 936c9aea6..f60483dcd 100644
--- a/tests/data/test1445
+++ b/tests/data/test1445
@@ -21,7 +21,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test1445.dir
file:// with --remote-time
</name>
<command>
-file://localhost%FILE_PWD/log/test1445.dir/plainfile.txt --remote-time
+file://localhost/%PWD/log/test1445.dir/plainfile.txt --remote-time
</command>
<postcheck>
perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test1445.dir && \
diff --git a/tests/data/test1447 b/tests/data/test1447
index d1182942e..e62cd72f2 100644
--- a/tests/data/test1447
+++ b/tests/data/test1447
@@ -18,7 +18,6 @@ none
</server>
<features>
http
-proxy
</features>
<name>
Provide illegal proxy name
diff --git a/tests/data/test1455 b/tests/data/test1455
index cbe6fe22e..7276ea4ec 100644
--- a/tests/data/test1455
+++ b/tests/data/test1455
@@ -3,8 +3,6 @@
<keywords>
HTTP
HTTP GET
-proxy
-haproxy
</keywords>
</info>
@@ -39,9 +37,6 @@ HTTP GET when PROXY Protocol enabled
<command>
http://%HOSTIP:%HTTPPORT/1455 --haproxy-protocol
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1456 b/tests/data/test1456
index 27d63f505..007473618 100644
--- a/tests/data/test1456
+++ b/tests/data/test1456
@@ -3,8 +3,6 @@
<keywords>
HTTP
HTTP GET
-proxy
-haproxy
IPv6
</keywords>
</info>
@@ -42,9 +40,6 @@ HTTP-IPv6 GET with PROXY protocol
<command>
-g "http://%HOST6IP:%HTTP6PORT/1456" --local-port 44444 --haproxy-protocol
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1506 b/tests/data/test1506
index 815fef923..7377dd6e0 100644
--- a/tests/data/test1506
+++ b/tests/data/test1506
@@ -88,9 +88,13 @@ Accept: */*
* Connection #2 to host server3.example.com left intact
* Closing connection 0
* Connection #3 to host server4.example.com left intact
+* Closing connection
+* Closing connection
+* Closing connection
</file>
<stripfile>
$_ = '' if (($_ !~ /left intact/) && ($_ !~ /Closing connection/))
+s/^(\* Closing connection) [123](?=\r?\n)/$1/
</stripfile>
</verify>
</testcase>
diff --git a/tests/data/test1509 b/tests/data/test1509
index faffc5d9e..b4bfc6603 100644
--- a/tests/data/test1509
+++ b/tests/data/test1509
@@ -53,9 +53,7 @@ http-proxy
<tool>
lib1509
</tool>
-<features>
-proxy
-</features>
+
<name>
simple multi http:// through proxytunnel with authentication info
</name>
diff --git a/tests/data/test1514 b/tests/data/test1514
index 6c09ae3b0..38f5da61f 100644
--- a/tests/data/test1514
+++ b/tests/data/test1514
@@ -4,14 +4,13 @@
HTTP
HTTP POST
Content-Length
-chunked Transfer-Encoding
</keywords>
</info>
# Server-side
<reply>
<data nocheck="yes">
-HTTP/1.1 200 OK
+HTTP/1.1 411 Length Required
Date: Sun, 19 Jan 2014 18:50:58 GMT
Server: test-server/fake swsclose
Connection: close
@@ -37,27 +36,13 @@ http://%HOSTIP:%HTTPPORT/1514
# Verify data after the test has been "shot"
<verify>
# Content-Length header is not present
-# Transfer-Encoding header is added automatically
<protocol>
POST /1514 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
-1
-d
-1
-u
-1
-m
-1
-m
-1
-y
-0
-
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test1519 b/tests/data/test1519
index 292a49c65..ab23dadca 100644
--- a/tests/data/test1519
+++ b/tests/data/test1519
@@ -53,7 +53,7 @@ res: 0
status: 302
redirects: 0
effectiveurl: http://%HOSTIP:%HTTPPORT/1519
-redirecturl: http://%HOSTIP:%HTTPPORT/h%20ttp://1.2.4.5/test
+redirecturl: http://127.0.0.1:8990/h%20ttp://1.2.4.5/test
</stdout>
<errorcode>
0
diff --git a/tests/data/test1523 b/tests/data/test1523
deleted file mode 100644
index 015f50518..000000000
--- a/tests/data/test1523
+++ /dev/null
@@ -1,49 +0,0 @@
-<testcase>
-<info>
-<keywords>
-CURLINFO_LOW_SPEED_LIMIT
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 3
-Connection: close
-Funny-head: yesyes
-
-AA
-</data>
-<servercmd>
-writedelay: 1
-</servercmd>
-</reply>
-#
-# Client-side
-<client>
-<server>
-http
-</server>
-<tool>
-lib1523
-</tool>
-
-<name>
-CURLINFO_LOW_SPEED_LIMIT
-</name>
-
-<command>
-http://%HOSTIP:%HTTPPORT/1523
-</command>
-<killserver>
-http
-</killserver>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1525 b/tests/data/test1525
index 673e048c8..595da5ea9 100644
--- a/tests/data/test1525
+++ b/tests/data/test1525
@@ -49,9 +49,6 @@ CURLOPT_PROXYHEADER is ignored CURLHEADER_UNIFIED
<command>
http://the.old.moo.1525:%HTTPPORT/1525 %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1526 b/tests/data/test1526
index f6fb44dd5..aa111c890 100644
--- a/tests/data/test1526
+++ b/tests/data/test1526
@@ -51,9 +51,6 @@ CURLOPT_PROXYHEADER: separate host/proxy headers
<command>
http://the.old.moo.1526:%HTTPPORT/1526 %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1527 b/tests/data/test1527
index 6bb87d14a..e8d52794b 100644
--- a/tests/data/test1527
+++ b/tests/data/test1527
@@ -50,9 +50,6 @@ Check same headers are generated with CURLOPT_HEADEROPT == CURLHEADER_UNIFIED
<command>
http://the.old.moo.1527:%HTTPPORT/1527 %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1528 b/tests/data/test1528
index 72c0a32d1..876806af4 100644
--- a/tests/data/test1528
+++ b/tests/data/test1528
@@ -43,9 +43,6 @@ Separately specified proxy/server headers sent in a proxy GET
<command>
http://the.old.moo:%HTTPPORT/1528 %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1529 b/tests/data/test1529
index f7be50367..33df26824 100644
--- a/tests/data/test1529
+++ b/tests/data/test1529
@@ -31,9 +31,6 @@ HTTP request-injection in URL sent over proxy
<command>
"http://the.old.moo:%HTTPPORT/1529" %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
# it should be detected and an error should be reported
diff --git a/tests/data/test153 b/tests/data/test153
index 77f7adb01..fc1d812de 100644
--- a/tests/data/test153
+++ b/tests/data/test153
@@ -9,7 +9,7 @@ HTTP Digest auth
# Server-side
<reply>
-# First reply back and ask for Digest auth
+# reply back and ask for Digest auth
<data1>
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
@@ -20,17 +20,6 @@ Content-Length: 26
This is not the real page
</data1>
-# second reply back
-<data2>
-HTTP/1.1 401 Authorization Required swsclose
-Server: Apache/1.3.27 (Darwin) PHP/4.1.2
-WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 26
-
-This is not the real page
-</data2>
-
# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1001>
@@ -51,7 +40,7 @@ HTTP/1.1 401 Authorization re-negotiation please swsbounce
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"
Content-Type: text/html; charset=iso-8859-1
-Content-Length: 26
+Content-Length: 25
This is not the real page
</data1002>
@@ -104,11 +93,6 @@ Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
-Accept: */*
-
-GET /1530002 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"
User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Accept: */*
@@ -133,17 +117,11 @@ Content-Type: text/html; charset=iso-8859-1
Content-Length: 23
This IS the real page!
-HTTP/1.1 401 Authorization Required swsclose
-Server: Apache/1.3.27 (Darwin) PHP/4.1.2
-WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 26
-
HTTP/1.1 401 Authorization re-negotiation please swsbounce
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"
Content-Type: text/html; charset=iso-8859-1
-Content-Length: 26
+Content-Length: 25
HTTP/1.1 200 OK
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
diff --git a/tests/data/test1538 b/tests/data/test1538
index 9374debb7..98d6731e9 100644
--- a/tests/data/test1538
+++ b/tests/data/test1538
@@ -126,8 +126,7 @@ e90: SSL public key does not match pinned public key
e91: SSL server certificate status verification FAILED
e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback
-e94: An authentication function returned an error
-e95: Unknown error
+e94: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
diff --git a/tests/data/test1559 b/tests/data/test1559
deleted file mode 100644
index cbed6fbcc..000000000
--- a/tests/data/test1559
+++ /dev/null
@@ -1,44 +0,0 @@
-<testcase>
-<info>
-<keywords>
-CURLOPT_URL
-</keywords>
-</info>
-
-<reply>
-</reply>
-
-<client>
-<server>
-none
-</server>
-
-# require HTTP so that CURLOPT_POSTFIELDS works as assumed
-<features>
-http
-</features>
-<tool>
-lib1559
-</tool>
-
-<name>
-Set excessive URL lengths
-</name>
-</client>
-
-#
-# Verify that the test runs to completion without crashing
-<verify>
-<errorcode>
-0
-</errorcode>
-<stdout>
-CURLOPT_URL 10000000 bytes URL == 43
-CURLOPT_POSTFIELDS 10000000 bytes data == 0
-CURLUPART_URL 10000000 bytes URL == 3
-CURLUPART_SCHEME 10000000 bytes scheme == 3
-CURLUPART_USER 10000000 bytes user == 3
-</stdout>
-</verify>
-
-</testcase>
diff --git a/tests/data/test1560 b/tests/data/test1560
index a0e603bfc..4b6c97a53 100644
--- a/tests/data/test1560
+++ b/tests/data/test1560
@@ -31,16 +31,4 @@ lib1560
</tool>
</client>
-<verify>
-<stdout>
-we got [fe80::20c:29ff:fe9c:409b]
-we got https://[::1]/hello.html
-we got https://example.com/hello.html
-we got https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html
-we got [fe80::20c:29ff:fe9c:409b]
-we got eth0
-we got https://[fe80::20c:29ff:fe9c:409b%25clown]/hello.html
-success
-</stdout>
-</verify>
</testcase>
diff --git a/tests/data/test1563 b/tests/data/test1563
deleted file mode 100644
index a3597b9b5..000000000
--- a/tests/data/test1563
+++ /dev/null
@@ -1,51 +0,0 @@
-<testcase>
-<info>
-<keywords>
-GOPHER
-HTTP GET
-followlocation
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data1>
-HTTP/1.1 302 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 7
-Location: gopher://www.example.co.uk
-
-nomnom
-</data1>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-Make sure redirects to CURLPROTO_GOPHER are forbidden by default
-</name>
-<command>
-http://%HOSTIP:%HTTPPORT/15630001 -L -H "Host: www.example.com"
-</command>
-</client>
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<errorcode>
-1
-</errorcode>
-<protocol>
-GET /15630001 HTTP/1.1
-Host: www.example.com
-Accept: */*
-
-</protocol>
-
-</verify>
-
-</testcase>
diff --git a/tests/data/test1591 b/tests/data/test1591
index 526933a0e..e864fdbaa 100644
--- a/tests/data/test1591
+++ b/tests/data/test1591
@@ -19,7 +19,7 @@ Server: test-server/fake
# Client-side
<client>
<features>
-http
+HTTP
</features>
<server>
http
diff --git a/tests/data/test1593 b/tests/data/test1593
deleted file mode 100644
index 405aa84e5..000000000
--- a/tests/data/test1593
+++ /dev/null
@@ -1,49 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP replaced headers
-CURLOPT_TIMECONDITION
-If-Modified-Since
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 304 Not Modified
-Date: Thu, 11 Jul 2019 02:26:59 GMT
-Server: test-server/swsclose
-
-</data>
-</reply>
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-HTTP custom header overrides CURLOPT_TIMECONDITION
-</name>
-<tool>
-lib1593
-</tool>
-<command>
-http://%HOSTIP:%HTTPPORT/1593
-</command>
-</client>
-
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-# Note here the lack of If-Modified-Since
-<protocol>
-GET /1593 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test1594 b/tests/data/test1594
deleted file mode 100644
index 4907ca2be..000000000
--- a/tests/data/test1594
+++ /dev/null
@@ -1,52 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP replaced headers
-CURLOPT_TIMECONDITION
-If-Modified-Since
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 503 Error
-Date: Thu, 11 Jul 2019 02:26:59 GMT
-Server: test-server/swsclose
-Retry-After: 22
-
-</data>
-</reply>
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-HTTP Retry-After header parsing and extraction
-</name>
-<tool>
-lib1594
-</tool>
-<command>
-http://%HOSTIP:%HTTPPORT/1594
-</command>
-</client>
-
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1594 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-Retry-After: 22
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test1595 b/tests/data/test1595
deleted file mode 100644
index 29b2b865f..000000000
--- a/tests/data/test1595
+++ /dev/null
@@ -1,51 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP replaced headers
-CURLOPT_TIMECONDITION
-If-Modified-Since
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 503 Error
-Date: Thu, 11 Jul 2019 02:26:59 GMT
-Server: test-server/swsclose
-
-</data>
-</reply>
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-HTTP Retry-After header extraction (without header)
-</name>
-<tool>
-lib1594
-</tool>
-<command>
-http://%HOSTIP:%HTTPPORT/1595
-</command>
-</client>
-
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1595 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-Retry-After: 0
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test1596 b/tests/data/test1596
deleted file mode 100644
index 77a10f08a..000000000
--- a/tests/data/test1596
+++ /dev/null
@@ -1,52 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP replaced headers
-CURLOPT_TIMECONDITION
-If-Modified-Since
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 429 Too Many Requests
-Date: Thu, 11 Jul 2019 02:26:59 GMT
-Server: test-server/swsclose
-Retry-After: Thu, 11 Jul 2024 02:26:59 GMT
-
-</data>
-</reply>
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-HTTP Retry-After header parsing using a date
-</name>
-<tool>
-lib1596
-</tool>
-<command>
-http://%HOSTIP:%HTTPPORT/1596
-</command>
-</client>
-
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1596 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-Retry-After: 172066
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test16 b/tests/data/test16
index 399aa9420..15f4c7a7b 100644
--- a/tests/data/test16
+++ b/tests/data/test16
@@ -33,9 +33,6 @@ HTTP with proxy authorization
<command>
-U fake@user:loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong -x %HOSTIP:%HTTPPORT http://we.want.that.site.com/16
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test162 b/tests/data/test162
index 099641a87..ee2f40aa7 100644
--- a/tests/data/test162
+++ b/tests/data/test162
@@ -28,7 +28,6 @@ isn't because there's no Proxy-Authorization: NTLM header
<features>
NTLM
!SSPI
-proxy
</features>
<server>
http
diff --git a/tests/data/test165 b/tests/data/test165
index 9009425aa..b9a1ed786 100644
--- a/tests/data/test165
+++ b/tests/data/test165
@@ -29,7 +29,6 @@ http
</server>
<features>
idn
-proxy
</features>
<setenv>
LC_ALL=
diff --git a/tests/data/test1654 b/tests/data/test1654
index 6a82daa08..175076c8a 100644
--- a/tests/data/test1654
+++ b/tests/data/test1654
@@ -32,7 +32,7 @@ unit1654
<file name="log/1654" mode="text">
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
# a comment
-h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
+h2c example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
# also a comment
@@ -45,15 +45,14 @@ rubbish
# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
# This file was generated by libcurl! Edit at your own risk.
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
-h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
+h2c example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
h1 example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 2.example.org 8080 h3 2.example.org 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h3 yesyes.com 8080 "20190125 22:34:21" 0 0
-h2 example.org 80 h2 example.com 443 "20190124 22:36:21" 0 0
-h2 example.net 80 h2 example.net 443 "20190124 22:37:21" 0 0
+h2c example.org 80 h2 example.com 443 "20190124 22:36:21" 0 0
</file>
</verify>
</testcase>
diff --git a/tests/data/test1655 b/tests/data/test1655
deleted file mode 100644
index 0c10bedf4..000000000
--- a/tests/data/test1655
+++ /dev/null
@@ -1,26 +0,0 @@
-<testcase>
-<info>
-<keywords>
-unittest
-doh
-</keywords>
-</info>
-
-#
-# Client-side
-<client>
-<server>
-none
-</server>
-<features>
-unittest
-</features>
- <name>
-unit test for doh_encode
- </name>
-<tool>
-unit1655
-</tool>
-</client>
-
-</testcase>
diff --git a/tests/data/test167 b/tests/data/test167
index e08555ecc..0b14996a3 100644
--- a/tests/data/test167
+++ b/tests/data/test167
@@ -45,7 +45,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP with proxy-requiring-Basic to site-requiring-Digest
diff --git a/tests/data/test168 b/tests/data/test168
index fb8762044..20e0b6d9c 100644
--- a/tests/data/test168
+++ b/tests/data/test168
@@ -59,7 +59,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP with proxy-requiring-Digest to site-requiring-Digest
diff --git a/tests/data/test169 b/tests/data/test169
index 8013bcc17..bb089ca35 100644
--- a/tests/data/test169
+++ b/tests/data/test169
@@ -79,7 +79,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP with proxy-requiring-NTLM to site-requiring-Digest
diff --git a/tests/data/test170 b/tests/data/test170
index 49d595bbc..8ce7774f9 100644
--- a/tests/data/test170
+++ b/tests/data/test170
@@ -20,7 +20,6 @@ http
<features>
NTLM
!SSPI
-proxy
</features>
<name>
HTTP POST with --proxy-ntlm and no SSL with no response
diff --git a/tests/data/test171 b/tests/data/test171
index 482c0b7e2..09e48b70a 100644
--- a/tests/data/test171
+++ b/tests/data/test171
@@ -33,9 +33,6 @@ HTTP, get cookie with dot prefixed full domain
<command>
-c log/jar171 -x %HOSTIP:%HTTPPORT http://z.x.com/171
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test179 b/tests/data/test179
index 3a94c00ba..f8f7811a7 100644
--- a/tests/data/test179
+++ b/tests/data/test179
@@ -38,9 +38,6 @@ supertrooper.fake FALSE /a FALSE 2139150993 mooo indeed
supertrooper.fake FALSE /b FALSE 0 moo1 indeed
supertrooper.fake FALSE /c FALSE 2139150993 moo2 indeed
</file>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test183 b/tests/data/test183
index cf992a26f..f34dc0c98 100644
--- a/tests/data/test183
+++ b/tests/data/test183
@@ -30,9 +30,6 @@ HTTP GET two URLs over a single proxy with persistent connection
<command>
http://deathstar.another.galaxy/183 http://a.galaxy.far.far.away/183 --proxy http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test184 b/tests/data/test184
index 42e652e3b..8b09dde28 100644
--- a/tests/data/test184
+++ b/tests/data/test184
@@ -50,9 +50,6 @@ HTTP replace Host: when following Location: to new host
<command>
http://deathstar.another.galaxy/184 -L -H "Host: another.visitor.stay.a.while.stay.foreeeeeever" --proxy http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test185 b/tests/data/test185
index 3bc58a041..298dd49ce 100644
--- a/tests/data/test185
+++ b/tests/data/test185
@@ -50,9 +50,6 @@ HTTP replace Host: when following Location: on the same host
<command>
http://deathstar.another.galaxy/185 -L -H "Host: another.visitor.stay.a.while.stay.foreeeeeever" --proxy http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test188 b/tests/data/test188
index d8ca1cd47..a23a2a11e 100644
--- a/tests/data/test188
+++ b/tests/data/test188
@@ -14,7 +14,7 @@ followlocation
<data>
HTTP/1.1 301 OK swsbounce
Location: /188
-Content-Length: 3
+Content-Length: 2
OK
</data>
@@ -30,7 +30,7 @@ Actual content
<datacheck>
HTTP/1.1 301 OK swsbounce
Location: /188
-Content-Length: 3
+Content-Length: 2
HTTP/1.1 200 OK
Connection: close
diff --git a/tests/data/test189 b/tests/data/test189
index 65780f804..f82b4ad90 100644
--- a/tests/data/test189
+++ b/tests/data/test189
@@ -11,7 +11,7 @@ HTTP GET
<data>
HTTP/1.1 301 OK swsbounce
Location: /189
-Content-Length: 3
+Content-Length: 2
OK
</data>
@@ -26,7 +26,7 @@ Actual content
<datacheck>
HTTP/1.1 301 OK swsbounce
Location: /189
-Content-Length: 3
+Content-Length: 2
HTTP/1.1 200 OK
Connection: close
diff --git a/tests/data/test19 b/tests/data/test19
index 8e1bf5eb4..dd60b8cf3 100644
--- a/tests/data/test19
+++ b/tests/data/test19
@@ -24,7 +24,7 @@ http
attempt connect to non-listening socket
</name>
<command>
-%HOSTIP:2
+%HOSTIP:60000
</command>
</client>
diff --git a/tests/data/test1904 b/tests/data/test1904
index 760285472..08ad534a6 100644
--- a/tests/data/test1904
+++ b/tests/data/test1904
@@ -53,9 +53,6 @@ HTTP CONNECT with 204 response
<command>
http://test.1904:%HTTPPORT/we/want/that/page/1904 -p --proxy %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test1906 b/tests/data/test1906
deleted file mode 100644
index 0ff2b2be0..000000000
--- a/tests/data/test1906
+++ /dev/null
@@ -1,52 +0,0 @@
-<testcase>
-<info>
-<keywords>
-CURLOPT_CURLU
-CURLOPT_PORT
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Type: text/html
-Funny-head: yesyes swsclose
-
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-CURLOPT_CURLU and CURLOPT_PORT
- </name>
-<tool>
-lib1906
-</tool>
-
-# The tool does two requesets, the first sets CURLOPT_PORT to 1
-# the second resets the port again and expects that request to work.
-<command>
-http://%HOSTIP:%HTTPPORT/1906
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1906 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test1907 b/tests/data/test1907
deleted file mode 100644
index 93f37051e..000000000
--- a/tests/data/test1907
+++ /dev/null
@@ -1,53 +0,0 @@
-<testcase>
-<info>
-<keywords>
-CURLINFO_EFFECTIVE_URL
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data nocheck="yes">
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Type: text/html
-Funny-head: yesyes swsclose
-Content-Length: 0
-
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-CURLINFO_EFFECTIVE_URL with non-scheme URL
- </name>
-<tool>
-lib1907
-</tool>
-
-<command>
-%HOSTIP:%HTTPPORT/hello/../1907
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /1907 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-Effective URL: http://%HOSTIP:%HTTPPORT/1907
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test196 b/tests/data/test196
index 31f724b84..ee9d3398a 100644
--- a/tests/data/test196
+++ b/tests/data/test196
@@ -2,7 +2,6 @@
<info>
<keywords>
FTP
-retry
</keywords>
</info>
diff --git a/tests/data/test197 b/tests/data/test197
index 4d06cc5da..c299a22ae 100644
--- a/tests/data/test197
+++ b/tests/data/test197
@@ -3,7 +3,6 @@
<keywords>
HTTP
HTTP GET
-retry
</keywords>
</info>
#
diff --git a/tests/data/test198 b/tests/data/test198
index 0200366c5..dca26b9ab 100644
--- a/tests/data/test198
+++ b/tests/data/test198
@@ -3,7 +3,6 @@
<keywords>
HTTP
HTTP GET
-retry
</keywords>
</info>
#
diff --git a/tests/data/test200 b/tests/data/test200
index d8adda7d8..c27f7c095 100644
--- a/tests/data/test200
+++ b/tests/data/test200
@@ -24,7 +24,7 @@ file
basic file:// file
</name>
<command option="no-include">
-file://localhost%FILE_PWD/log/test200.txt
+file://localhost/%PWD/log/test200.txt
</command>
<file name="log/test200.txt">
foo
diff --git a/tests/data/test2000 b/tests/data/test2000
index a91dcd2c7..db1ba1330 100644
--- a/tests/data/test2000
+++ b/tests/data/test2000
@@ -32,7 +32,7 @@ file
FTP RETR followed by FILE
</name>
<command option="no-include">
-ftp://%HOSTIP:%FTPPORT/2000 file://localhost%FILE_PWD/log/test2000.txt
+ftp://%HOSTIP:%FTPPORT/2000 file://localhost/%PWD/log/test2000.txt
</command>
<file name="log/test2000.txt">
foo
diff --git a/tests/data/test2001 b/tests/data/test2001
index 9232499f9..88a258ebb 100644
--- a/tests/data/test2001
+++ b/tests/data/test2001
@@ -49,7 +49,7 @@ file
HTTP GET followed by FTP RETR followed by FILE
</name>
<command option="no-include">
-http://%HOSTIP:%HTTPPORT/20010001 ftp://%HOSTIP:%FTPPORT/20010002 file://localhost%FILE_PWD/log/test2001.txt
+http://%HOSTIP:%HTTPPORT/20010001 ftp://%HOSTIP:%FTPPORT/20010002 file://localhost/%PWD/log/test2001.txt
</command>
<file name="log/test2001.txt">
foo
diff --git a/tests/data/test2002 b/tests/data/test2002
index efe75fa3b..6dd2f9310 100644
--- a/tests/data/test2002
+++ b/tests/data/test2002
@@ -58,7 +58,7 @@ tftp
HTTP GET followed by FTP RETR followed by FILE followed by TFTP RRQ
</name>
<command option="no-include">
-http://%HOSTIP:%HTTPPORT/20020001 ftp://%HOSTIP:%FTPPORT/20020002 file://localhost%FILE_PWD/log/test2002.txt tftp://%HOSTIP:%TFTPPORT//20020003
+http://%HOSTIP:%HTTPPORT/20020001 ftp://%HOSTIP:%FTPPORT/20020002 file://localhost/%PWD/log/test2002.txt tftp://%HOSTIP:%TFTPPORT//20020003
</command>
<file name="log/test2002.txt">
foo
diff --git a/tests/data/test2003 b/tests/data/test2003
index 68ae71429..09bee8e22 100644
--- a/tests/data/test2003
+++ b/tests/data/test2003
@@ -58,7 +58,7 @@ tftp
HTTP GET followed by FTP RETR followed by FILE followed by TFTP RRQ then again in reverse order
</name>
<command option="no-include">
-http://%HOSTIP:%HTTPPORT/20030001 ftp://%HOSTIP:%FTPPORT/20030002 file://localhost%FILE_PWD/log/test2003.txt tftp://%HOSTIP:%TFTPPORT//20030003 tftp://%HOSTIP:%TFTPPORT//20030003 file://localhost%FILE_PWD/log/test2003.txt ftp://%HOSTIP:%FTPPORT/20030002 http://%HOSTIP:%HTTPPORT/20030001
+http://%HOSTIP:%HTTPPORT/20030001 ftp://%HOSTIP:%FTPPORT/20030002 file://localhost/%PWD/log/test2003.txt tftp://%HOSTIP:%TFTPPORT//20030003 tftp://%HOSTIP:%TFTPPORT//20030003 file://localhost/%PWD/log/test2003.txt ftp://%HOSTIP:%FTPPORT/20030002 http://%HOSTIP:%HTTPPORT/20030001
</command>
<file name="log/test2003.txt">
foo
diff --git a/tests/data/test2004 b/tests/data/test2004
index 5b3b68d0c..b17890b0f 100644
--- a/tests/data/test2004
+++ b/tests/data/test2004
@@ -30,7 +30,7 @@ sftp
TFTP RRQ followed by SFTP retrieval followed by FILE followed by SCP retrieval then again in reverse order
</name>
<command option="no-include">
---key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost/%PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost/%PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
</command>
<file name="log/test2004.txt">
This is test data
diff --git a/tests/data/test2005 b/tests/data/test2005
index f78b4be56..061f99b66 100644
--- a/tests/data/test2005
+++ b/tests/data/test2005
@@ -78,7 +78,7 @@ Data delivered from an HTTP resource
</file1>
<file2 name="log/stdout2005">
</file2>
-<file3 name="log/stderr2005" mode="text">
+<file3 name="log/stderr2005">
Metalink: parsing (file://%PWD/log/test2005.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2005.metalink) OK
Metalink: fetching (log/download2005) from (http://%HOSTIP:%HTTPPORT/2005)...
diff --git a/tests/data/test2006 b/tests/data/test2006
index 1f5971726..3acbdaee2 100644
--- a/tests/data/test2006
+++ b/tests/data/test2006
@@ -86,6 +86,10 @@ Accept: */*
Some data delivered from an HTTP resource
</file1>
<file2 name="log/heads2006">
+Content-Length: 496
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:49:01 GMT
Server: test-server/fake
@@ -98,7 +102,7 @@ Funny-head: yesyes
</file2>
<file3 name="log/stdout2006">
</file3>
-<file4 name="log/stderr2006" mode="text">
+<file4 name="log/stderr2006">
Metalink: parsing (file://%PWD/log/test2006.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2006.metalink) OK
Metalink: fetching (log/download2006) from (http://%HOSTIP:%HTTPPORT/2006)...
diff --git a/tests/data/test2007 b/tests/data/test2007
index a8e5f1b45..b169c4906 100644
--- a/tests/data/test2007
+++ b/tests/data/test2007
@@ -90,6 +90,10 @@ Something delivered from an HTTP resource
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2007">
+Content-Length: 496
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:50:02 GMT
Server: test-server/fake
@@ -102,7 +106,7 @@ Funny-head: yesyes
</file2>
<file3 name="log/stdout2007">
</file3>
-<file4 name="log/stderr2007" mode="text">
+<file4 name="log/stderr2007">
Metalink: parsing (file://%PWD/log/test2007.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2007.metalink) OK
Metalink: fetching (log/download2007) from (http://%HOSTIP:%HTTPPORT/2007)...
diff --git a/tests/data/test2008 b/tests/data/test2008
index 1a0033285..012f221c4 100644
--- a/tests/data/test2008
+++ b/tests/data/test2008
@@ -82,6 +82,10 @@ Some stuff delivered from an HTTP resource
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2008">
+Content-Length: 496
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 15:23:48 GMT
Server: test-server/fake
@@ -94,7 +98,7 @@ Funny-head: yesyes
</file2>
<file3 name="log/stdout2008">
</file3>
-<file4 name="log/stderr2008" mode="text">
+<file4 name="log/stderr2008">
Metalink: parsing (file://%PWD/log/test2008.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2008.metalink) OK
Metalink: fetching (log/download2008) from (http://%HOSTIP:%HTTPPORT/2008)...
diff --git a/tests/data/test2009 b/tests/data/test2009
index 08308d03e..b0e5c6c66 100644
--- a/tests/data/test2009
+++ b/tests/data/test2009
@@ -83,6 +83,10 @@ Some contents delivered from an HTTP resource
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2009">
+Content-Length: 496
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 16:27:17 GMT
Server: test-server/fake
@@ -95,7 +99,7 @@ Funny-head: yesyes
</file2>
<file3 name="log/stdout2009">
</file3>
-<file4 name="log/stderr2009" mode="text">
+<file4 name="log/stderr2009">
Metalink: parsing (file://%PWD/log/test2009.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2009.metalink) OK
Metalink: fetching (log/download2009) from (http://%HOSTIP:%HTTPPORT/2009)...
diff --git a/tests/data/test2010 b/tests/data/test2010
index 068c481b5..33bb309eb 100644
--- a/tests/data/test2010
+++ b/tests/data/test2010
@@ -82,6 +82,10 @@ Contents delivered from an HTTP resource
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2010">
+Content-Length: 496
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 17:37:27 GMT
Server: test-server/fake
@@ -94,7 +98,7 @@ Funny-head: yesyes
</file2>
<file3 name="log/stdout2010">
</file3>
-<file4 name="log/stderr2010" mode="text">
+<file4 name="log/stderr2010">
Metalink: parsing (file://%PWD/log/test2010.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2010.metalink) OK
Metalink: fetching (log/download2010) from (http://%HOSTIP:%HTTPPORT/2010)...
diff --git a/tests/data/test2011 b/tests/data/test2011
index a84502317..46785cf94 100644
--- a/tests/data/test2011
+++ b/tests/data/test2011
@@ -78,7 +78,7 @@ Data delivered from an HTTP resource
</file1>
<file2 name="log/stdout2011">
</file2>
-<file3 name="log/stderr2011" mode="text">
+<file3 name="log/stderr2011">
Metalink: parsing (file://%PWD/log/test2011.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2011.metalink) OK
Metalink: fetching (log/download2011) from (http://%HOSTIP:%HTTPPORT/2011)...
diff --git a/tests/data/test2012 b/tests/data/test2012
index 6751269d5..59c042d12 100644
--- a/tests/data/test2012
+++ b/tests/data/test2012
@@ -77,7 +77,7 @@ Some contents delivered from an HTTP resource
</file1>
<file2 name="log/stdout2012">
</file2>
-<file3 name="log/stderr2012" mode="text">
+<file3 name="log/stderr2012">
Metalink: parsing (file://%PWD/log/test2012.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2012.metalink) WARNING (digest missing)
Metalink: fetching (log/download2012) from (http://%HOSTIP:%HTTPPORT/2012)...
diff --git a/tests/data/test2013 b/tests/data/test2013
index f4d0c2475..0985b32de 100644
--- a/tests/data/test2013
+++ b/tests/data/test2013
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2013 log/name2013 /tmp/download2013
<verify>
<file1 name="log/stdout2013">
</file1>
-<file2 name="log/stderr2013" mode="text">
+<file2 name="log/stderr2013">
Metalink: parsing (file://%PWD/log/test2013.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2013.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2013.metalink) FAILED
diff --git a/tests/data/test2014 b/tests/data/test2014
index 65d2ec766..d2dbdc7a7 100644
--- a/tests/data/test2014
+++ b/tests/data/test2014
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2014 log/name2014 log/download2014
<verify>
<file1 name="log/stdout2014">
</file1>
-<file2 name="log/stderr2014" mode="text">
+<file2 name="log/stderr2014">
Metalink: parsing (file://%PWD/log/test2014.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2014.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2014.metalink) FAILED
diff --git a/tests/data/test2015 b/tests/data/test2015
index d356f88bc..a35f3117d 100644
--- a/tests/data/test2015
+++ b/tests/data/test2015
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2015 log/name2015 log/download2015
<verify>
<file1 name="log/stdout2015">
</file1>
-<file2 name="log/stderr2015" mode="text">
+<file2 name="log/stderr2015">
Metalink: parsing (file://%PWD/log/test2015.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2015.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2015.metalink) FAILED
diff --git a/tests/data/test2016 b/tests/data/test2016
index ff2862d51..572aa65c5 100644
--- a/tests/data/test2016
+++ b/tests/data/test2016
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2016 log/name2016 log/download2016
<verify>
<file1 name="log/stdout2016">
</file1>
-<file2 name="log/stderr2016" mode="text">
+<file2 name="log/stderr2016">
Metalink: parsing (file://%PWD/log/test2016.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2016.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2016.metalink) FAILED
diff --git a/tests/data/test2017 b/tests/data/test2017
index 11c71c3db..15fd9347c 100644
--- a/tests/data/test2017
+++ b/tests/data/test2017
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2017 log/name2017
<verify>
<file1 name="log/stdout2017">
</file1>
-<file2 name="log/stderr2017" mode="text">
+<file2 name="log/stderr2017">
Metalink: parsing (file://%PWD/log/test2017.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2017.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2017.metalink) FAILED
diff --git a/tests/data/test2018 b/tests/data/test2018
index 9fb433d94..6d0652dcc 100644
--- a/tests/data/test2018
+++ b/tests/data/test2018
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2018 log/name2018 log/.download2018
<verify>
<file1 name="log/stdout2018">
</file1>
-<file2 name="log/stderr2018" mode="text">
+<file2 name="log/stderr2018">
Metalink: parsing (file://%PWD/log/test2018.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2018.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2018.metalink) FAILED
diff --git a/tests/data/test2019 b/tests/data/test2019
index abd8cad9a..b17b3f23f 100644
--- a/tests/data/test2019
+++ b/tests/data/test2019
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2019 log/name2019
<verify>
<file1 name="log/stdout2019">
</file1>
-<file2 name="log/stderr2019" mode="text">
+<file2 name="log/stderr2019">
Metalink: parsing (file://%PWD/log/test2019.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2019.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2019.metalink) FAILED
diff --git a/tests/data/test202 b/tests/data/test202
index ad9d854d5..0b324b1d8 100644
--- a/tests/data/test202
+++ b/tests/data/test202
@@ -20,7 +20,7 @@ file
two file:// URLs to stdout
</name>
<command option="no-include">
-file://localhost%FILE_PWD/log/test202.txt FILE://localhost%FILE_PWD/log/test202.txt
+file://localhost/%PWD/log/test202.txt FILE://localhost/%PWD/log/test202.txt
</command>
<file name="log/test202.txt">
contents in a single file
diff --git a/tests/data/test2020 b/tests/data/test2020
index 584f6df3b..8bf85a4d7 100644
--- a/tests/data/test2020
+++ b/tests/data/test2020
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2020 log/name2020
<verify>
<file1 name="log/stdout2020">
</file1>
-<file2 name="log/stderr2020" mode="text">
+<file2 name="log/stderr2020">
Metalink: parsing (file://%PWD/log/test2020.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2020.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2020.metalink) FAILED
diff --git a/tests/data/test2021 b/tests/data/test2021
index b0921d48a..20a92244a 100644
--- a/tests/data/test2021
+++ b/tests/data/test2021
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2021 log/name2021 log/download2021
<verify>
<file1 name="log/stdout2021">
</file1>
-<file2 name="log/stderr2021" mode="text">
+<file2 name="log/stderr2021">
Metalink: parsing (file://%PWD/log/test2021.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2021.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2021.metalink) FAILED
diff --git a/tests/data/test2022 b/tests/data/test2022
index e9044732a..4f4efd176 100644
--- a/tests/data/test2022
+++ b/tests/data/test2022
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2022 log/name2022 log/download2022
<verify>
<file1 name="log/stdout2022">
</file1>
-<file2 name="log/stderr2022" mode="text">
+<file2 name="log/stderr2022">
Metalink: parsing (file://%PWD/log/test2022.metalink) metalink/XML...
Metalink: parsing (file://%PWD/log/test2022.metalink) WARNING (missing or invalid file name)
Metalink: parsing (file://%PWD/log/test2022.metalink) FAILED
diff --git a/tests/data/test2032 b/tests/data/test2032
index ec5771f81..a63e11ef1 100644
--- a/tests/data/test2032
+++ b/tests/data/test2032
@@ -99,22 +99,22 @@ chkhostname curlhost
</strip>
<protocol>
GET /20320100 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
Accept: */*
GET /20320100 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
Accept: */*
GET /20320200 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
Accept: */*
GET /20320200 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=
Accept: */*
diff --git a/tests/data/test204 b/tests/data/test204
index 5dad0149c..0ed94512f 100644
--- a/tests/data/test204
+++ b/tests/data/test204
@@ -16,7 +16,7 @@ file
"upload" with file://
</name>
<command option="no-include">
-file://localhost%FILE_PWD/log/result204.txt -T log/upload204.txt
+file://localhost/%PWD/log/result204.txt -T log/upload204.txt
</command>
<file name="log/upload204.txt">
data
diff --git a/tests/data/test2047 b/tests/data/test2047
index bc7350971..fc140486b 100644
--- a/tests/data/test2047
+++ b/tests/data/test2047
@@ -92,7 +92,7 @@ OK
1
1
3
-http://åäö.se/20470001
+http://xn--4cab6c.se/20470001
text/plain; charset=us-ascii
200
</stdout>
diff --git a/tests/data/test2050 b/tests/data/test2050
index 5eef3dae2..81ef79ffc 100644
--- a/tests/data/test2050
+++ b/tests/data/test2050
@@ -53,9 +53,6 @@ Connect to specific host via HTTP proxy (switch to tunnel mode automatically)
<command>
http://www.example.com.2050/2050 --connect-to ::connect.example.com.2050:%HTTPPORT -x %HOSTIP:%PROXYPORT
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test2055 b/tests/data/test2055
index a5fac62be..cca44942f 100644
--- a/tests/data/test2055
+++ b/tests/data/test2055
@@ -51,9 +51,7 @@ socks5
<name>
Connect to specific host via SOCKS proxy and HTTP proxy (switch to tunnel mode automatically)
</name>
-<features>
-proxy
-</features>
+
<command>
http://www.example.com.2055/2055 --connect-to ::connect.example.com.2055:%HTTPPORT -x %HOSTIP:%PROXYPORT --preproxy socks5://%HOSTIP:%SOCKSPORT
</command>
diff --git a/tests/data/test2058 b/tests/data/test2058
index 65a907f43..0082503e0 100644
--- a/tests/data/test2058
+++ b/tests/data/test2058
@@ -66,7 +66,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST --digest with PUT, resumed upload, modified method and SHA-256
diff --git a/tests/data/test2059 b/tests/data/test2059
index 4272a7b41..b74b0bdc1 100644
--- a/tests/data/test2059
+++ b/tests/data/test2059
@@ -66,7 +66,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=true
diff --git a/tests/data/test206 b/tests/data/test206
index f99ac4c71..5f0c88562 100644
--- a/tests/data/test206
+++ b/tests/data/test206
@@ -73,7 +73,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP proxy CONNECT auth Digest
diff --git a/tests/data/test2060 b/tests/data/test2060
index a0b291dc2..f323eb520 100644
--- a/tests/data/test2060
+++ b/tests/data/test2060
@@ -66,7 +66,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=false
diff --git a/tests/data/test2071 b/tests/data/test2071
index 900f0d5a8..eddfa4df7 100644
--- a/tests/data/test2071
+++ b/tests/data/test2071
@@ -24,7 +24,7 @@ file
basic file:// file with "127.0.0.1" hostname
</name>
<command option="no-include">
-file://127.0.0.1%FILE_PWD/log/test2070.txt
+file://127.0.0.1/%PWD/log/test2070.txt
</command>
<file name="log/test2070.txt">
foo
diff --git a/tests/data/test2077 b/tests/data/test2077
deleted file mode 100644
index 0c600f5c3..000000000
--- a/tests/data/test2077
+++ /dev/null
@@ -1,42 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-GSS-API
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-HTTP/1.1 200 OK swsclose
-Content-Length: 23
-
-This IS the real page!
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<features>
-GSS-API
-</features>
-<name>
-curl --fail --negotiate to unauthenticated service fails
-</name>
-<command>
-http://%HOSTIP:%HTTPPORT/2077 -u : --fail --negotiate
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<errorcode>
-0
-</errorcode>
-</verify>
-</testcase>
diff --git a/tests/data/test2078 b/tests/data/test2078
deleted file mode 100644
index 99bc2dbee..000000000
--- a/tests/data/test2078
+++ /dev/null
@@ -1,54 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-GSS-API
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-HTTP/1.1 200 OK swsclose
-Content-Length: 23
-
-This IS the real page!
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<features>
-GSS-API
-</features>
-<name>
-curl --negotiate should not send empty POST request only
-</name>
-<command>
-http://%HOSTIP:%HTTPPORT/2078 -u : --negotiate --data name=value
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<errorcode>
-0
-</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol nonewline="yes">
-POST /2078 HTTP/1.1
-Host: 127.0.0.1:8990
-Accept: */*
-Content-Length: 10
-Content-Type: application/x-www-form-urlencoded
-
-name=value
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test208 b/tests/data/test208
index 1c86558a8..afb2566b5 100644
--- a/tests/data/test208
+++ b/tests/data/test208
@@ -27,7 +27,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<name>
HTTP PUT to a FTP URL with username+password - over HTTP proxy
diff --git a/tests/data/test209 b/tests/data/test209
index aded6d2d2..a0cc1a533 100644
--- a/tests/data/test209
+++ b/tests/data/test209
@@ -79,7 +79,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy CONNECT auth NTLM
diff --git a/tests/data/test2100 b/tests/data/test2100
index 0414b58d8..5a44aa707 100644
--- a/tests/data/test2100
+++ b/tests/data/test2100
Binary files differ
diff --git a/tests/data/test213 b/tests/data/test213
index 82d82c483..819c8016d 100644
--- a/tests/data/test213
+++ b/tests/data/test213
@@ -79,7 +79,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP 1.0 proxy CONNECT auth NTLM and then POST
diff --git a/tests/data/test217 b/tests/data/test217
index 4ab51a2f3..f10df566b 100644
--- a/tests/data/test217
+++ b/tests/data/test217
@@ -34,9 +34,6 @@ HTTP proxy CONNECT to proxy returning 405
<command>
http://test.remote.example.com.217:%HTTPPORT/path/2170002 --proxy http://%HOSTIP:%HTTPPORT --proxytunnel -w "%{http_code} %{http_connect}\n"
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test219 b/tests/data/test219
index 49f17e43f..be3f0f3c5 100644
--- a/tests/data/test219
+++ b/tests/data/test219
@@ -18,7 +18,6 @@ none
</server>
<features>
http
-proxy
</features>
<name>
try using proxy with unsupported scheme
diff --git a/tests/data/test231 b/tests/data/test231
index 7254953e1..3d4bc7730 100644
--- a/tests/data/test231
+++ b/tests/data/test231
@@ -23,7 +23,7 @@ file
file:// with resume
</name>
<command option="no-include">
-file://localhost%FILE_PWD/log/test231.txt -C 10
+file://localhost/%PWD/log/test231.txt -C 10
</command>
<file name="log/test231.txt">
A01234567
diff --git a/tests/data/test233 b/tests/data/test233
index a38d8c95e..b631e52cf 100644
--- a/tests/data/test233
+++ b/tests/data/test233
@@ -67,9 +67,6 @@ HTTP, proxy, site+proxy auth and Location: to new host
<command>
http://first.host.it.is/we/want/that/page/233 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this --location
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test234 b/tests/data/test234
index 9e197cd1d..1d2e05b39 100644
--- a/tests/data/test234
+++ b/tests/data/test234
@@ -69,9 +69,6 @@ HTTP, proxy, site+proxy auth and Location: to new host using location-trusted
<command>
http://first.host.it.is/we/want/that/page/234 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this --location-trusted
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test239 b/tests/data/test239
index a6f1fd59b..c9e5b6ac7 100644
--- a/tests/data/test239
+++ b/tests/data/test239
@@ -54,7 +54,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy-auth NTLM and then POST
diff --git a/tests/data/test243 b/tests/data/test243
index f83218e14..7d1ed7d6e 100644
--- a/tests/data/test243
+++ b/tests/data/test243
@@ -75,7 +75,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP POST with --proxy-anyauth, picking NTLM
diff --git a/tests/data/test244 b/tests/data/test244
index 080163dd1..8ce4b6346 100644
--- a/tests/data/test244
+++ b/tests/data/test244
@@ -47,7 +47,7 @@ PASS ftp@example.com
PWD
EPSV
TYPE A
-LIST fir#t/third/244
+LIST fir#t/third/244/
QUIT
</protocol>
</verify>
diff --git a/tests/data/test256 b/tests/data/test256
index 1567c6292..17ae807d1 100644
--- a/tests/data/test256
+++ b/tests/data/test256
@@ -35,9 +35,6 @@ HTTP resume request over proxy with auth without server supporting it
This text is here to simulate a partly downloaded file to resume
download on.
</file>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test257 b/tests/data/test257
index 59a419bb1..502448ddb 100644
--- a/tests/data/test257
+++ b/tests/data/test257
@@ -73,9 +73,7 @@ HTTP Location: following with --netrc-optional
<command>
http://supersite.com/want/257 -L -x http://%HOSTIP:%HTTPPORT --netrc-optional --netrc-file log/netrc257
</command>
-<features>
-proxy
-</features>
+
# netrc auth for two out of three sites:
<file name="log/netrc257">
machine supersite.com login user1 password passwd1
diff --git a/tests/data/test258 b/tests/data/test258
index 6c10564b8..98c340141 100644
--- a/tests/data/test258
+++ b/tests/data/test258
@@ -58,7 +58,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST multipart without Expect: header using proxy anyauth (Digest)
diff --git a/tests/data/test259 b/tests/data/test259
index 58d25120f..6e1853601 100644
--- a/tests/data/test259
+++ b/tests/data/test259
@@ -54,7 +54,6 @@ http
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP POST multipart with Expect: header using proxy anyauth (Digest)
diff --git a/tests/data/test263 b/tests/data/test263
index e10c20741..5088141f5 100644
--- a/tests/data/test263
+++ b/tests/data/test263
@@ -25,7 +25,6 @@ hello
<client>
<features>
ipv6
-proxy
</features>
<server>
http-ipv6
diff --git a/tests/data/test264 b/tests/data/test264
index 5aca0e6c5..f4d171a16 100644
--- a/tests/data/test264
+++ b/tests/data/test264
@@ -30,9 +30,6 @@ HTTP with proxy string including http:// and user+password
<command>
http://we.want.that.site.com/264 -x http://f%61ke:user@%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test265 b/tests/data/test265
index ff7d5945e..2e26ff5e5 100644
--- a/tests/data/test265
+++ b/tests/data/test265
@@ -80,7 +80,6 @@ http
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy CONNECT auth NTLM and then POST, response-body in the 407
diff --git a/tests/data/test275 b/tests/data/test275
index 6065b4d81..802c4bbcc 100644
--- a/tests/data/test275
+++ b/tests/data/test275
@@ -56,9 +56,6 @@ HTTP CONNECT with proxytunnel getting two URLs from the same host
<command>
http://remotesite.com.275:%HTTPPORT/we/want/that/page/275 -p -x %HOSTIP:%PROXYPORT --user iam:myself --proxy-user youare:yourself http://remotesite.com.275:%HTTPPORT/we/want/that/page/275
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test278 b/tests/data/test278
index 620f56b17..3112264a3 100644
--- a/tests/data/test278
+++ b/tests/data/test278
@@ -30,9 +30,6 @@ HTTP with proxy string including http:// and user+empty password
<command>
http://we.want.that.site.com/278 -x http://f%61ke:@%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test279 b/tests/data/test279
index d5f4194f1..47f8b687e 100644
--- a/tests/data/test279
+++ b/tests/data/test279
@@ -31,9 +31,6 @@ HTTP with proxy string including http:// and user only
<command>
http://we.want.that.site.com/279 -x http://f%61ke@%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test287 b/tests/data/test287
index 7c29f7f02..6772e220f 100644
--- a/tests/data/test287
+++ b/tests/data/test287
@@ -30,9 +30,6 @@ HTTP proxy CONNECT with custom User-Agent header
<command>
http://test.remote.example.com.287:%HTTPPORT/path/287 -H "User-Agent: looser/2015" --proxy http://%HOSTIP:%HTTPPORT --proxytunnel --proxy-header "User-Agent: looser/2007"
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test288 b/tests/data/test288
index e62eabd3c..9f8f6e121 100644
--- a/tests/data/test288
+++ b/tests/data/test288
@@ -31,7 +31,7 @@ file:// with (unsupported) proxy, authentication and range
all_proxy=http://fake:user@%HOSTIP:%HTTPPORT/
</setenv>
<command option="no-include">
-file://localhost%FILE_PWD/log/test288.txt
+file://localhost/%PWD/log/test288.txt
</command>
<file name="log/test288.txt">
foo
diff --git a/tests/data/test299 b/tests/data/test299
index cfa743020..4daaea47d 100644
--- a/tests/data/test299
+++ b/tests/data/test299
@@ -27,7 +27,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<name>
FTP over HTTP proxy with user:pass not in url
diff --git a/tests/data/test317 b/tests/data/test317
index 68a9b5c79..c6d8697be 100644
--- a/tests/data/test317
+++ b/tests/data/test317
@@ -67,9 +67,6 @@ HTTP with custom Authorization: and redirect to new host
<command>
http://first.host.it.is/we/want/that/page/317 -x %HOSTIP:%HTTPPORT -H "Authorization: s3cr3t" --proxy-user testing:this --location
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test318 b/tests/data/test318
index fd82c7aed..838d1ba0f 100644
--- a/tests/data/test318
+++ b/tests/data/test318
@@ -67,9 +67,6 @@ HTTP with custom Authorization: and redirect to new host
<command>
http://first.host.it.is/we/want/that/page/318 -x %HOSTIP:%HTTPPORT -H "Authorization: s3cr3t" --proxy-user testing:this --location-trusted
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test330 b/tests/data/test330
index 6cda172f6..74607d5ee 100644
--- a/tests/data/test330
+++ b/tests/data/test330
@@ -65,9 +65,6 @@ HTTP with custom Cookie: and redirect to new host
<command>
http://first.host.it.is/we/want/that/page/317 -x %HOSTIP:%HTTPPORT -H "Cookie: test=yes" --location
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test331 b/tests/data/test331
index 2ffac81f7..54b86d2a1 100644
--- a/tests/data/test331
+++ b/tests/data/test331
@@ -41,9 +41,6 @@ HTTP with cookie using host name 'moo'
<command>
-x http://%HOSTIP:%HTTPPORT http://moo/we/want/331 -b none http://moo/we/want/3310002
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test332 b/tests/data/test332
deleted file mode 100644
index 3688c2b08..000000000
--- a/tests/data/test332
+++ /dev/null
@@ -1,45 +0,0 @@
-<testcase>
-<info>
-<keywords>
-TFTP
-TFTP RRQ
-FAILURE
-</keywords>
-</info>
-
-<reply>
-<data>
-a chunk of
-data
-returned
- to client
-</data>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-tftp
-</server>
- <name>
-TFTP retrieve with blksize 400
- </name>
- <command>
-tftp://%HOSTIP:%TFTPPORT//332 --tftp-blksize 400
-</command>
-</client>
-
-#
-# Verify pseudo protocol after the test has been "shot"
-<verify>
-<protocol>
-opcode: 1
-mode: octet
-tsize: 0
-blksize: 400
-timeout: 6
-filename: /332
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test333 b/tests/data/test333
deleted file mode 100644
index 198af9c86..000000000
--- a/tests/data/test333
+++ /dev/null
@@ -1,35 +0,0 @@
-<testcase>
-<info>
-<keywords>
-command-line
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-none
-</server>
- <name>
-Try a non-boolean command line option with --no-
- </name>
- <command>
---no-proxy "hey" http://%HOSTIP:%HTTPPORT/333
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-# detected the bad --no- prefix
-<errorcode>
-2
-</errorcode>
-</verify>
-</testcase>
diff --git a/tests/data/test334 b/tests/data/test334
deleted file mode 100644
index c02a65b8d..000000000
--- a/tests/data/test334
+++ /dev/null
@@ -1,44 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-204
-</keywords>
-</info>
-# Server-side
-<reply>
-<data>
-HTTP/1.1 204 No Content
-Date: Mon, 13 Nov 2000 13:41:09 GMT
-Server: myown/1.0
-Transfer-Encoding: chunked
-
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<name>
-HTTP 204 No content with chunked header
-</name>
-<command>
-http://%HOSTIP:%HTTPPORT/want/334
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /want/334 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test335 b/tests/data/test335
deleted file mode 100644
index 5817365e3..000000000
--- a/tests/data/test335
+++ /dev/null
@@ -1,103 +0,0 @@
-# Mostly a duplicate of test168
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP proxy
-HTTP proxy Digest auth
-HTTP Digest auth
-HTTP auth in URL
-</keywords>
-</info>
-
-# Server-side
-<reply>
-
-# this is returned first since we get no proxy-auth
-<data>
-HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
-Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
-
-And you should ignore this data.
-</data>
-
-# then this is returned since we get no server-auth
-<data1000>
-HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
-WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"
-
-you should ignore this data too
-</data1000>
-
-<data1001>
-HTTP/1.1 200 OK swsclose
-Server: no
-Content-Length: 15
-
-Nice auth sir!
-</data1001>
-
-<datacheck>
-HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
-Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
-
-HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
-WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"
-
-HTTP/1.1 200 OK swsclose
-Server: no
-Content-Length: 15
-
-Nice auth sir!
-</datacheck>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<features>
-!SSPI
-crypto
-proxy
-</features>
- <name>
-HTTP with proxy Digest and site Digest with creds in URLs
- </name>
- <command>
-http://digest:alot@data.from.server.requiring.digest.hohoho.com/335 --proxy http://foo:bar@%HOSTIP:%HTTPPORT --proxy-digest --digest
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
-<protocol>
-GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
-Host: data.from.server.requiring.digest.hohoho.com
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
-Host: data.from.server.requiring.digest.hohoho.com
-Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
-Host: data.from.server.requiring.digest.hohoho.com
-Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
-Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/335", response="08a2e2e684047f4219a38ddc189ac00c"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test336 b/tests/data/test336
deleted file mode 100644
index 85477c96c..000000000
--- a/tests/data/test336
+++ /dev/null
@@ -1,58 +0,0 @@
-<testcase>
-<info>
-<keywords>
-FTP
-PASV
-TYPE A
-RETR
-</keywords>
-</info>
-# Server-side
-<reply>
-<data>
-data
- to
- see
-that FTP
-works
- so does it?
-</data>
-<datacheck nonewline="yes">
-data
-</datacheck>
-<servercmd>
-REPLY EPSV 500 no such command
-REPLY SIZE 500 no such command
-</servercmd>
-</reply>
-
-# Client-side
-<client>
-<server>
-ftp
-</server>
- <name>
-FTP range download when SIZE doesn't work
- </name>
- <command>
-ftp://%HOSTIP:%FTPPORT/336 --use-ascii --range 3-6
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-USER anonymous
-PASS ftp@example.com
-PWD
-EPSV
-PASV
-TYPE A
-SIZE 336
-REST 3
-RETR 336
-ABOR
-QUIT
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test337 b/tests/data/test337
deleted file mode 100644
index 80086dda7..000000000
--- a/tests/data/test337
+++ /dev/null
@@ -1,58 +0,0 @@
-<testcase>
-<info>
-<keywords>
-FTP
-PASV
-TYPE A
-RETR
-</keywords>
-</info>
-# Server-side
-<reply>
-<data>
-data
- to
- see
-that FTP
-works
- so does it?
-</data>
-<datacheck nonewline="yes">
-data
-</datacheck>
-<servercmd>
-REPLY EPSV 500 no such command
-REPLY SIZE 213 file: 213, Size =51
-</servercmd>
-</reply>
-
-# Client-side
-<client>
-<server>
-ftp
-</server>
- <name>
-FTP range download with SIZE returning extra crap
- </name>
- <command>
-ftp://%HOSTIP:%FTPPORT/337 --use-ascii --range 3-6
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-USER anonymous
-PASS ftp@example.com
-PWD
-EPSV
-PASV
-TYPE A
-SIZE 337
-REST 3
-RETR 337
-ABOR
-QUIT
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test356 b/tests/data/test356
index c1234b450..e2ac4860d 100644
--- a/tests/data/test356
+++ b/tests/data/test356
@@ -16,7 +16,7 @@ Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
-Alt-Svc: h1="nowhere.foo:81", un-kno22!wn=":82"
+Alt-Svc: h1="nowhere.foo:81"
-foo-
</data>
@@ -61,7 +61,7 @@ Accept: */*
# matches
s/\"([^\"]*)\"/TIMESTAMP/
</stripfile>
-<file name="log/altsvc-356" mode="text">
+<file name="log/altsvc-356">
# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
# This file was generated by libcurl! Edit at your own risk.
h1 %HOSTIP %HTTPPORT h1 nowhere.foo 81 TIMESTAMP 0 0
diff --git a/tests/data/test43 b/tests/data/test43
index 196017013..e5535bb3a 100644
--- a/tests/data/test43
+++ b/tests/data/test43
@@ -56,9 +56,6 @@ HTTP Location: following over HTTP proxy
<command>
http://%HOSTIP:%HTTPPORT/want/43 -L -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test5 b/tests/data/test5
index b98d27b3b..b62f1a127 100644
--- a/tests/data/test5
+++ b/tests/data/test5
@@ -31,9 +31,6 @@ HTTP over proxy
<command>
http://%HOSTIP:%HTTPPORT/we/want/that/page/5#5 -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test503 b/tests/data/test503
index 472149d2a..e8dc21e8d 100644
--- a/tests/data/test503
+++ b/tests/data/test503
@@ -50,9 +50,7 @@ http-proxy
<tool>
lib503
</tool>
-<features>
-proxy
-</features>
+
<name>
simple multi http:// through proxytunnel with authentication info
</name>
diff --git a/tests/data/test504 b/tests/data/test504
index 7c92209cd..2d3a3dd0d 100644
--- a/tests/data/test504
+++ b/tests/data/test504
@@ -6,7 +6,6 @@ HTTP GET
HTTP proxy
multi
FAILURE
-connect to non-listen
</keywords>
</info>
@@ -21,7 +20,6 @@ none
</server>
<features>
http
-proxy
</features>
# tool is what to use instead of 'curl'
<tool>
diff --git a/tests/data/test506 b/tests/data/test506
index f821ad10e..8f06e0e4f 100644
--- a/tests/data/test506
+++ b/tests/data/test506
@@ -115,98 +115,94 @@ CURLOPT_SHARE
lock: share [Pigs in space]: 16
unlock: share [Pigs in space]: 17
PERFORM
-lock: cookie [Pigs in space]: 18
-unlock: cookie [Pigs in space]: 19
+lock: dns [Pigs in space]: 18
+unlock: dns [Pigs in space]: 19
lock: dns [Pigs in space]: 20
unlock: dns [Pigs in space]: 21
-lock: dns [Pigs in space]: 22
-unlock: dns [Pigs in space]: 23
+lock: cookie [Pigs in space]: 22
+unlock: cookie [Pigs in space]: 23
lock: cookie [Pigs in space]: 24
unlock: cookie [Pigs in space]: 25
lock: cookie [Pigs in space]: 26
unlock: cookie [Pigs in space]: 27
lock: cookie [Pigs in space]: 28
unlock: cookie [Pigs in space]: 29
-lock: cookie [Pigs in space]: 30
-unlock: cookie [Pigs in space]: 31
run 1: set cookie 1, 2 and 3
+lock: dns [Pigs in space]: 30
+unlock: dns [Pigs in space]: 31
lock: dns [Pigs in space]: 32
unlock: dns [Pigs in space]: 33
-lock: dns [Pigs in space]: 34
-unlock: dns [Pigs in space]: 35
CLEANUP
-lock: cookie [Pigs in space]: 36
-unlock: cookie [Pigs in space]: 37
-lock: share [Pigs in space]: 38
-unlock: share [Pigs in space]: 39
+lock: cookie [Pigs in space]: 34
+unlock: cookie [Pigs in space]: 35
+lock: share [Pigs in space]: 36
+unlock: share [Pigs in space]: 37
*** run 2
CURLOPT_SHARE
-lock: share [Pigs in space]: 40
-unlock: share [Pigs in space]: 41
+lock: share [Pigs in space]: 38
+unlock: share [Pigs in space]: 39
PERFORM
+lock: dns [Pigs in space]: 40
+unlock: dns [Pigs in space]: 41
lock: cookie [Pigs in space]: 42
unlock: cookie [Pigs in space]: 43
-lock: dns [Pigs in space]: 44
-unlock: dns [Pigs in space]: 45
+lock: cookie [Pigs in space]: 44
+unlock: cookie [Pigs in space]: 45
lock: cookie [Pigs in space]: 46
unlock: cookie [Pigs in space]: 47
-lock: cookie [Pigs in space]: 48
-unlock: cookie [Pigs in space]: 49
-lock: cookie [Pigs in space]: 50
-unlock: cookie [Pigs in space]: 51
run 2: set cookie 4 and 5
-lock: dns [Pigs in space]: 52
-unlock: dns [Pigs in space]: 53
-lock: dns [Pigs in space]: 54
-unlock: dns [Pigs in space]: 55
+lock: dns [Pigs in space]: 48
+unlock: dns [Pigs in space]: 49
+lock: dns [Pigs in space]: 50
+unlock: dns [Pigs in space]: 51
CLEANUP
-lock: cookie [Pigs in space]: 56
-unlock: cookie [Pigs in space]: 57
-lock: share [Pigs in space]: 58
-unlock: share [Pigs in space]: 59
+lock: cookie [Pigs in space]: 52
+unlock: cookie [Pigs in space]: 53
+lock: share [Pigs in space]: 54
+unlock: share [Pigs in space]: 55
*** run 3
CURLOPT_SHARE
-lock: share [Pigs in space]: 60
-unlock: share [Pigs in space]: 61
+lock: share [Pigs in space]: 56
+unlock: share [Pigs in space]: 57
CURLOPT_COOKIEJAR
CURLOPT_COOKIELIST FLUSH
+lock: cookie [Pigs in space]: 58
+unlock: cookie [Pigs in space]: 59
+PERFORM
+lock: dns [Pigs in space]: 60
+unlock: dns [Pigs in space]: 61
lock: cookie [Pigs in space]: 62
unlock: cookie [Pigs in space]: 63
-PERFORM
-lock: dns [Pigs in space]: 64
-unlock: dns [Pigs in space]: 65
+lock: cookie [Pigs in space]: 64
+unlock: cookie [Pigs in space]: 65
lock: cookie [Pigs in space]: 66
unlock: cookie [Pigs in space]: 67
lock: cookie [Pigs in space]: 68
unlock: cookie [Pigs in space]: 69
lock: cookie [Pigs in space]: 70
unlock: cookie [Pigs in space]: 71
-lock: cookie [Pigs in space]: 72
-unlock: cookie [Pigs in space]: 73
-lock: cookie [Pigs in space]: 74
-unlock: cookie [Pigs in space]: 75
run 3: overwrite cookie 1 and 4, set cookie 6 with and without tailmatch
-lock: dns [Pigs in space]: 76
-unlock: dns [Pigs in space]: 77
-lock: dns [Pigs in space]: 78
-unlock: dns [Pigs in space]: 79
+lock: dns [Pigs in space]: 72
+unlock: dns [Pigs in space]: 73
+lock: dns [Pigs in space]: 74
+unlock: dns [Pigs in space]: 75
CLEANUP
-lock: cookie [Pigs in space]: 80
-unlock: cookie [Pigs in space]: 81
-lock: share [Pigs in space]: 82
-unlock: share [Pigs in space]: 83
+lock: cookie [Pigs in space]: 76
+unlock: cookie [Pigs in space]: 77
+lock: share [Pigs in space]: 78
+unlock: share [Pigs in space]: 79
CURLOPT_SHARE
-lock: share [Pigs in space]: 84
-unlock: share [Pigs in space]: 85
+lock: share [Pigs in space]: 80
+unlock: share [Pigs in space]: 81
CURLOPT_COOKIELIST ALL
-lock: cookie [Pigs in space]: 86
-unlock: cookie [Pigs in space]: 87
+lock: cookie [Pigs in space]: 82
+unlock: cookie [Pigs in space]: 83
CURLOPT_COOKIEJAR
CURLOPT_COOKIELIST RELOAD
-lock: cookie [Pigs in space]: 88
-unlock: cookie [Pigs in space]: 89
-lock: cookie [Pigs in space]: 90
-unlock: cookie [Pigs in space]: 91
+lock: cookie [Pigs in space]: 84
+unlock: cookie [Pigs in space]: 85
+lock: cookie [Pigs in space]: 86
+unlock: cookie [Pigs in space]: 87
loaded cookies:
-----------------
www.host.foo.com FALSE / FALSE 1993463787 test6 six_more
@@ -219,17 +215,17 @@ loaded cookies:
.host.foo.com TRUE / FALSE 1896263787 injected yes
-----------------
try SHARE_CLEANUP...
-lock: share [Pigs in space]: 92
-unlock: share [Pigs in space]: 93
+lock: share [Pigs in space]: 88
+unlock: share [Pigs in space]: 89
SHARE_CLEANUP failed, correct
CLEANUP
-lock: cookie [Pigs in space]: 94
-unlock: cookie [Pigs in space]: 95
-lock: share [Pigs in space]: 96
-unlock: share [Pigs in space]: 97
+lock: cookie [Pigs in space]: 90
+unlock: cookie [Pigs in space]: 91
+lock: share [Pigs in space]: 92
+unlock: share [Pigs in space]: 93
SHARE_CLEANUP
-lock: share [Pigs in space]: 98
-unlock: share [Pigs in space]: 99
+lock: share [Pigs in space]: 94
+unlock: share [Pigs in space]: 95
GLOBAL_CLEANUP
</stdout>
<file name="log/jar506" mode="text">
diff --git a/tests/data/test523 b/tests/data/test523
index c00a0969d..665211d48 100644
--- a/tests/data/test523
+++ b/tests/data/test523
@@ -41,9 +41,6 @@ HTTP GET with proxy and CURLOPT_PORT
<command>
http://www.example.com:999/523 http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test338 b/tests/data/test536
index f8dab6528..51ac9716f 100644
--- a/tests/data/test338
+++ b/tests/data/test536
@@ -1,63 +1,74 @@
-# See https://github.com/curl/curl/issues/4499
<testcase>
<info>
<keywords>
HTTP
HTTP GET
+pipelining
+multi
</keywords>
</info>
-#
-# Server-side
<reply>
<data>
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
-ETag: "21025-dc7-39462498"
-Accept-Ranges: bytes
-Content-Length: 6
-Content-Type: text/html
-Funny-head: yesyes
-
--foo-
+HTTP/1.1 404 Badness
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+ETag: "21025-dc7-39462498"
+Content-Length: 6
+Content-Type: text/html
+Funny-head: yesyes
+
+hejsan
</data>
+<data1>
+HTTP/1.1 200 Fine
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 13
+Connection: close
+Content-Type: text/html
+
+fine content
+</data1>
+
+<datacheck>
+fine content
+Finished!
+</datacheck>
+
<servercmd>
-connection-monitor
+pipe: 1
</servercmd>
</reply>
-#
# Client-side
<client>
<server>
http
</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib536
+</tool>
+
<name>
-ANYAUTH connection reuse of non-authed connection
+HTTP GET multi two files with FAILONERROR and pipelining
</name>
<command>
-http://%HOSTIP:%HTTPPORT/338 --next http://%HOSTIP:%HTTPPORT/338 --anyauth -u foo:moo
+http://%HOSTIP:%HTTPPORT/536 http://%HOSTIP:%HTTPPORT/5360001
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
-GET /338 HTTP/1.1
+GET /536 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-GET /338 HTTP/1.1
+GET /5360001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-[DISCONNECT]
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test539 b/tests/data/test539
index a69834012..e9aadd1f3 100644
--- a/tests/data/test539
+++ b/tests/data/test539
@@ -64,7 +64,7 @@ SYST
CWD /
EPSV
TYPE A
-LIST path/to/the/file/539.
+LIST path/to/the/file/539./
QUIT
</protocol>
</verify>
diff --git a/tests/data/test540 b/tests/data/test540
index 871c558fb..8391cbe78 100644
--- a/tests/data/test540
+++ b/tests/data/test540
@@ -67,7 +67,6 @@ lib540
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP proxy auth Digest multi API re-using connection
diff --git a/tests/data/test547 b/tests/data/test547
index 781799b11..5c4cfaaff 100644
--- a/tests/data/test547
+++ b/tests/data/test547
@@ -78,7 +78,6 @@ lib547
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy auth NTLM with POST data from read callback
diff --git a/tests/data/test548 b/tests/data/test548
index fa98cd437..80b87d10c 100644
--- a/tests/data/test548
+++ b/tests/data/test548
@@ -78,7 +78,6 @@ lib548
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy auth NTLM with POST data from CURLOPT_POSTFIELDS
diff --git a/tests/data/test549 b/tests/data/test549
index a9f1ca21c..a248edbf6 100644
--- a/tests/data/test549
+++ b/tests/data/test549
@@ -32,7 +32,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<tool>
lib549
diff --git a/tests/data/test550 b/tests/data/test550
index 1eff72a17..a609aa216 100644
--- a/tests/data/test550
+++ b/tests/data/test550
@@ -32,7 +32,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<tool>
lib549
diff --git a/tests/data/test551 b/tests/data/test551
index bb31a36f8..ed6aee264 100644
--- a/tests/data/test551
+++ b/tests/data/test551
@@ -63,7 +63,6 @@ lib547
<features>
!SSPI
crypto
-proxy
</features>
<name>
HTTP proxy auth Digest with POST data from read callback
diff --git a/tests/data/test555 b/tests/data/test555
index d4b946614..f8b929839 100644
--- a/tests/data/test555
+++ b/tests/data/test555
@@ -83,7 +83,6 @@ lib555
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy auth NTLM with POST data from read callback multi-if
diff --git a/tests/data/test561 b/tests/data/test561
index 359e54cca..a6188eacf 100644
--- a/tests/data/test561
+++ b/tests/data/test561
@@ -33,7 +33,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<tool>
lib549
diff --git a/tests/data/test563 b/tests/data/test563
index eb9372ed0..c9df79219 100644
--- a/tests/data/test563
+++ b/tests/data/test563
@@ -32,9 +32,7 @@ lib562
<name>
FTP type=A URL and CURLOPT_PORT set and proxy
</name>
-<features>
-proxy
-</features>
+
<setenv>
ftp_proxy=http://%HOSTIP:%HTTPPORT/
</setenv>
diff --git a/tests/data/test564 b/tests/data/test564
index 3078e2d08..4c9ecd466 100644
--- a/tests/data/test564
+++ b/tests/data/test564
@@ -38,9 +38,6 @@ FTP RETR a file over a SOCKS proxy using the multi interface
<command>
ftp://%HOSTIP:%FTPPORT/path/564 %HOSTIP:%SOCKSPORT
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test590 b/tests/data/test590
index 6f6250763..7f30b83ef 100644
--- a/tests/data/test590
+++ b/tests/data/test590
@@ -76,7 +76,6 @@ lib590
NTLM
!SSPI
debug
-proxy
</features>
<name>
HTTP proxy offers Negotiate+NTLM, use only NTLM
diff --git a/tests/data/test62 b/tests/data/test62
index 82bc0d783..2784a0f61 100644
--- a/tests/data/test62
+++ b/tests/data/test62
@@ -29,7 +29,7 @@ http
HTTP, send cookies when using custom Host:
</name>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want/62?hoge=fuga -b log/jar62.txt -H "Host: www.host.foo.com"
+http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want?hoge=fuga -b log/jar62.txt -H "Host: www.host.foo.com"
</command>
<file name="log/jar62.txt">
# Netscape HTTP Cookie File
@@ -55,7 +55,7 @@ Host: www.host.foo.com
Accept: */*
Cookie: test2=yes; test=yes
-GET /we/want/62?hoge=fuga HTTP/1.1
+GET /we/want?hoge=fuga HTTP/1.1
Host: www.host.foo.com
Accept: */*
Cookie: test2=yes; test=yes
diff --git a/tests/data/test63 b/tests/data/test63
index e7d7a4615..ccc19dd24 100644
--- a/tests/data/test63
+++ b/tests/data/test63
@@ -33,9 +33,6 @@ http_proxy=http://fake:user@%HOSTIP:%HTTPPORT/
<command>
http://we.want.that.site.com/63
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test651 b/tests/data/test651
index ae6409479..b00ca5d0e 100644
--- a/tests/data/test651
+++ b/tests/data/test651
@@ -57,7 +57,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
# (5*12) == 60 bytes less
<protocol>
POST /651 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:8990
Accept: */*
Content-Length: 17139
Content-Type: multipart/form-data; boundary=----------------------------
diff --git a/tests/data/test653 b/tests/data/test653
index d7be05923..d620b5761 100644
--- a/tests/data/test653
+++ b/tests/data/test653
@@ -67,7 +67,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
# (5*12) == 60 bytes less
<protocol>
POST /653 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:8990
Accept: */*
Content-Length: 150
Content-Type: multipart/form-data; boundary=----------------------------
@@ -78,7 +78,7 @@ Content-Disposition: form-data; name="name"
short value
--------------------------------
POST /653 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
+Host: 127.0.0.1:8990
Accept: */*
Content-Length: 167
Content-Type: multipart/form-data; boundary=----------------------------
diff --git a/tests/data/test659 b/tests/data/test659
index 048c0d0f2..43e1aaf92 100644
--- a/tests/data/test659
+++ b/tests/data/test659
@@ -36,9 +36,6 @@ CURLOPT_CURLU without the path set - over proxy
<command>
http://%HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
<verify>
diff --git a/tests/data/test660 b/tests/data/test660
deleted file mode 100644
index d480bc313..000000000
--- a/tests/data/test660
+++ /dev/null
@@ -1,34 +0,0 @@
-<testcase>
-<info>
-<keywords>
-IMAP
-CONNECT_ONLY
-</keywords>
-</info>
-
-# Client-side
-<client>
-<server>
-imap
-</server>
-<tool>
-lib597
-</tool>
- <name>
-IMAP CONNECT_ONLY option
- </name>
-
-<command>
-imap://%HOSTIP:%IMAPPORT/660
-</command>
-
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-A001 CAPABILITY
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test661 b/tests/data/test661
deleted file mode 100644
index 067612be5..000000000
--- a/tests/data/test661
+++ /dev/null
@@ -1,73 +0,0 @@
-<testcase>
-<info>
-<keywords>
-FTP
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<data>
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-ftp
-</server>
-# tool is what to use instead of 'curl'
-<tool>
-lib661
-</tool>
-
- <name>
-Avoid redundant CWDs
- </name>
- <command>
-ftp://%HOSTIP:%FTPPORT/
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-USER anonymous
-PASS ftp@example.com
-PWD
-CWD /folderA
-EPSV
-TYPE I
-RETR 661
-CWD /folderB
-EPSV
-RETR 661
-QUIT
-USER anonymous
-PASS ftp@example.com
-PWD
-EPSV
-TYPE I
-RETR /folderA/661
-CWD /folderB
-EPSV
-RETR 661
-EPSV
-RETR /folderA/661
-QUIT
-USER anonymous
-PASS ftp@example.com
-PWD
-SYST
-QUIT
-USER anonymous
-PASS ftp@example.com
-PWD
-SYST
-SYST
-QUIT
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test662 b/tests/data/test662
deleted file mode 100644
index 53d97c39d..000000000
--- a/tests/data/test662
+++ /dev/null
@@ -1,78 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-followlocation
-</keywords>
-</info>
-#
-# Server-side
-<reply>
-<data>
-HTTP/1.1 302 OK
-Location: http://example.net/tes t case=/6620002
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 0
-
-</data>
-<data2>
-HTTP/1.1 200 OK
-Location: this should be ignored
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 5
-
-body
-</data2>
-<datacheck>
-HTTP/1.1 302 OK
-Location: http://example.net/tes t case=/6620002
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Location: this should be ignored
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 5
-
-body
-</datacheck>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-HTTP redirect with whitespace in absolute Location: URL
- </name>
- <command>
-http://example.com/please/gimme/662 -L -x http://%HOSTIP:%HTTPPORT
-</command>
-<features>
-proxy
-</features>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET http://example.com/please/gimme/662 HTTP/1.1
-Host: example.com
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-GET http://example.net/tes%20t%20case=/6620002 HTTP/1.1
-Host: example.net
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test663 b/tests/data/test663
deleted file mode 100644
index 6743b3258..000000000
--- a/tests/data/test663
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# This test is crafted to reproduce oss-fuzz bug
-# https://crbug.com/oss-fuzz/17954
-#
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-followlocation
-</keywords>
-</info>
-#
-# Server-side
-<reply>
-<data>
-HTTP/1.1 302 OK
-Location: http://example.net/there/it/is/../../tes t case=/6630002? yes no
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 0
-
-</data>
-<data2>
-HTTP/1.1 200 OK
-Location: this should be ignored
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 5
-
-body
-</data2>
-<datacheck>
-HTTP/1.1 302 OK
-Location: http://example.net/there/it/is/../../tes t case=/6630002? yes no
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Location: this should be ignored
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Content-Length: 5
-
-body
-</datacheck>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-http
-</server>
- <name>
-HTTP redirect with dotdots and whitespaces in absolute Location: URL
- </name>
- <command>
-http://example.com/please/../gimme/663?foobar#hello -L -x http://%HOSTIP:%HTTPPORT
-</command>
-<features>
-proxy
-</features>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET http://example.com/gimme/663?foobar HTTP/1.1
-Host: example.com
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-GET http://example.net/there/tes%20t%20case=/6630002?+yes+no HTTP/1.1
-Host: example.net
-Accept: */*
-Proxy-Connection: Keep-Alive
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test702 b/tests/data/test702
index c03723676..36af71328 100644
--- a/tests/data/test702
+++ b/tests/data/test702
@@ -12,10 +12,6 @@ FAILURE
<reply>
<data>
</data>
-# 91 is socks4 failure
-<servercmd>
-response 91
-</servercmd>
</reply>
# Client-side
@@ -25,7 +21,6 @@ socks4
</server>
<features>
http
-proxy
</features>
<name>
Attempt connect to non-listening HTTP server via SOCKS4 proxy
diff --git a/tests/data/test703 b/tests/data/test703
index 53d6a0222..4aa89b46a 100644
--- a/tests/data/test703
+++ b/tests/data/test703
@@ -12,10 +12,6 @@ FAILURE
<reply>
<data>
</data>
-# 1 is socks5 failure
-<servercmd>
-response 1
-</servercmd>
</reply>
# Client-side
@@ -25,7 +21,6 @@ socks5
</server>
<features>
http
-proxy
</features>
<name>
Attempt connect to non-listening HTTP server via SOCKS5 proxy
diff --git a/tests/data/test704 b/tests/data/test704
index 7f891fa95..15a1b6701 100644
--- a/tests/data/test704
+++ b/tests/data/test704
@@ -23,11 +23,8 @@ http
Attempt connect to non-listening SOCKS4 proxy
</name>
<command>
---socks4 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/704
+--socks4 %HOSTIP:60000 http://%HOSTIP:%HTTPPORT/704
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test705 b/tests/data/test705
index cfbf3419f..3b904c6b1 100644
--- a/tests/data/test705
+++ b/tests/data/test705
@@ -23,11 +23,8 @@ http
Attempt connect to non-listening SOCKS5 proxy
</name>
<command>
---socks5 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/705
+--socks5 %HOSTIP:60000 http://%HOSTIP:%HTTPPORT/705
</command>
-<features>
-proxy
-</features>
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test709 b/tests/data/test709
index fa7fbc017..022688853 100644
--- a/tests/data/test709
+++ b/tests/data/test709
@@ -34,7 +34,7 @@ http
socks5
</server>
<setenv>
-http_proxy=socks5://%HOSTIP:%SOCKSPORT
+http_proxy=socks5://%HOSTIP:%SOCKSPORT
</setenv>
<name>
HTTP GET via SOCKS5 set in http_proxy environment variable
diff --git a/tests/data/test711 b/tests/data/test711
index 3efbb7977..7be1f3cb5 100644
--- a/tests/data/test711
+++ b/tests/data/test711
@@ -15,8 +15,6 @@ all_proxy
<data>
silly content
</data>
-<servercmd>
-</servercmd>
</reply>
#
@@ -27,7 +25,7 @@ ftp
socks5
</server>
<setenv>
-all_proxy=socks5://%HOSTIP:%SOCKSPORT
+all_proxy=socks5://%HOSTIP:%SOCKSPORT
</setenv>
<name>
FTP fetch with all_proxy set to socks5
diff --git a/tests/data/test714 b/tests/data/test714
index 776d8b292..efec03227 100644
--- a/tests/data/test714
+++ b/tests/data/test714
@@ -41,7 +41,6 @@ http-proxy
</server>
<features>
http
-proxy
</features>
<name>
FTP fetch with --proxy set to http:// and with --connect-to
diff --git a/tests/data/test715 b/tests/data/test715
index 85372ca24..56936b946 100644
--- a/tests/data/test715
+++ b/tests/data/test715
@@ -43,7 +43,6 @@ socks5
</server>
<features>
http
-proxy
</features>
<name>
FTP fetch with --preproxy, --proxy and --connect-to
diff --git a/tests/data/test716 b/tests/data/test716
deleted file mode 100644
index 96167de5c..000000000
--- a/tests/data/test716
+++ /dev/null
@@ -1,45 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-SOCKS5
-all_proxy
-</keywords>
-</info>
-#
-# Server-side
-<reply>
-# method 2 is SOCKS5 asking for user+password
-<servercmd>
-method 2
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-socks5
-</server>
-<features>
-http
-proxy
-</features>
-<name>
-SOCKS5 proxy with too long user name
-</name>
-
-# it should never connect to the target server
- <command>
-http://hohoho.example.com:99/716 -x socks5://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:b@%HOSTIP:%SOCKSPORT
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<errorcode>
-43
-</errorcode>
-</verify>
-</testcase>
diff --git a/tests/data/test717 b/tests/data/test717
deleted file mode 100644
index dae50d9f2..000000000
--- a/tests/data/test717
+++ /dev/null
@@ -1,68 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-SOCKS5
-all_proxy
-</keywords>
-</info>
-#
-# Server-side
-<reply>
-<data>
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
-ETag: "21025-dc7-39462498"
-Accept-Ranges: bytes
-Content-Length: 6
-Connection: close
-Content-Type: text/html
-Funny-head: yesyes
-
--foo-
-</data>
-# method 2 is SOCKS5 asking for user+password
-<servercmd>
-method 2
-user uz3r
-password p4ssworm
-backendport %HTTPPORT
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-socks5
-http
-</server>
-<name>
-SOCKS5 proxy auth
-</name>
-
-# target a port that won't work without the SOCKS magic
- <command>
-http://%HOSTIP:1/717 -x socks5://uz3r:p4ssworm@%HOSTIP:%SOCKSPORT
-</command>
-<features>
-proxy
-</features>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /717 HTTP/1.1
-Host: %HOSTIP:1
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test79 b/tests/data/test79
index 9bc836681..b2566e229 100644
--- a/tests/data/test79
+++ b/tests/data/test79
@@ -29,7 +29,6 @@ http
</server>
<features>
ftp
-proxy
</features>
<name>
FTP over HTTP proxy
diff --git a/tests/data/test80 b/tests/data/test80
index 3e61eddde..147a6aa12 100644
--- a/tests/data/test80
+++ b/tests/data/test80
@@ -55,9 +55,6 @@ HTTP 1.0 CONNECT with proxytunnel and proxy+host Basic authentication
<command>
http://test.80:%HTTPPORT/we/want/that/page/80 -p --proxy1.0 %HOSTIP:%PROXYPORT --user iam:myself --proxy-user youare:yourself
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test81 b/tests/data/test81
index 4cc03975e..499831bb3 100644
--- a/tests/data/test81
+++ b/tests/data/test81
@@ -57,7 +57,6 @@ Finally, this is the real page!
NTLM
!SSPI
debug
-proxy
</features>
<server>
http
diff --git a/tests/data/test819 b/tests/data/test819
index 4213e3ea6..b88e35055 100644
--- a/tests/data/test819
+++ b/tests/data/test819
@@ -14,7 +14,7 @@ RFC4616
<servercmd>
AUTH PLAIN
REPLY AUTHENTICATE +
-REPLY AHVzZXIAc2VjcmV0 A002 OK AUTHENTICATE completed
+REPLY dXNlcgB1c2VyAHNlY3JldA== A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -47,7 +47,7 @@ IMAP plain authentication
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
A003 SELECT 819
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test82 b/tests/data/test82
index 88d5da84d..8b58f75da 100644
--- a/tests/data/test82
+++ b/tests/data/test82
@@ -26,7 +26,6 @@ This is not the real page either!
# Client-side
<client>
<features>
-proxy
</features>
<server>
http
diff --git a/tests/data/test825 b/tests/data/test825
index d28b6a519..b489e95de 100644
--- a/tests/data/test825
+++ b/tests/data/test825
@@ -47,7 +47,7 @@ IMAP plain authentication with initial response
<verify>
<protocol>
A001 CAPABILITY
-A002 AUTHENTICATE PLAIN AHVzZXIAc2VjcmV0
+A002 AUTHENTICATE PLAIN dXNlcgB1c2VyAHNlY3JldA==
A003 SELECT 825
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test83 b/tests/data/test83
index 400e0a0f3..120bcc6a1 100644
--- a/tests/data/test83
+++ b/tests/data/test83
@@ -52,9 +52,6 @@ HTTP over proxy-tunnel with site authentication
<command>
http://test.83:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self'
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test833 b/tests/data/test833
index 2c694adcc..dc8214b8e 100644
--- a/tests/data/test833
+++ b/tests/data/test833
@@ -18,7 +18,7 @@ AUTH CRAM-MD5 PLAIN
REPLY "AUTHENTICATE CRAM-MD5" + Rubbish
REPLY * A002 NO AUTH exchange cancelled by client
REPLY "AUTHENTICATE PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
+REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -56,7 +56,7 @@ A001 CAPABILITY
A002 AUTHENTICATE CRAM-MD5
*
A003 AUTHENTICATE PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
A004 SELECT 833
A005 FETCH 1 BODY[]
A006 LOGOUT
diff --git a/tests/data/test834 b/tests/data/test834
index 35ab06aff..fc131773b 100644
--- a/tests/data/test834
+++ b/tests/data/test834
@@ -18,7 +18,7 @@ REPLY "AUTHENTICATE NTLM" +
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
REPLY * A002 NO AUTH exchange cancelled by client
REPLY "AUTHENTICATE PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
+REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -67,7 +67,7 @@ A002 AUTHENTICATE NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
*
A003 AUTHENTICATE PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
A004 SELECT 834
A005 FETCH 1 BODY[]
A006 LOGOUT
diff --git a/tests/data/test835 b/tests/data/test835
index b44e877ec..400233c0c 100644
--- a/tests/data/test835
+++ b/tests/data/test835
@@ -18,7 +18,7 @@ AUTH DIGEST-MD5 PLAIN
REPLY "AUTHENTICATE DIGEST-MD5" + Rubbish
REPLY * A002 NO AUTH exchange cancelled by client
REPLY "AUTHENTICATE PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
+REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -58,7 +58,7 @@ A001 CAPABILITY
A002 AUTHENTICATE DIGEST-MD5
*
A003 AUTHENTICATE PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
A004 SELECT 835
A005 FETCH 1 BODY[]
A006 LOGOUT
diff --git a/tests/data/test84 b/tests/data/test84
index 4cfde6dbb..629dae2fc 100644
--- a/tests/data/test84
+++ b/tests/data/test84
@@ -33,9 +33,6 @@ HTTP over proxy with site authentication
<command>
http://%HOSTIP:%HTTPPORT/we/want/that/page/84 -x %HOSTIP:%HTTPPORT --user iam:myself
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test842 b/tests/data/test842
index 1d9181e17..e86abd430 100644
--- a/tests/data/test842
+++ b/tests/data/test842
@@ -15,7 +15,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTHENTICATE +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
A003 SELECT 842
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test843 b/tests/data/test843
index bd39dd907..e286fd93f 100644
--- a/tests/data/test843
+++ b/tests/data/test843
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
A001 CAPABILITY
-A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+A002 AUTHENTICATE OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
A003 SELECT 843
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test844 b/tests/data/test844
index c5093d2b8..2cdb265fa 100644
--- a/tests/data/test844
+++ b/tests/data/test844
@@ -15,8 +15,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTHENTICATE +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +
-eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0=
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0=
REPLY AQ== A002 NO Authentication failed
</servercmd>
</reply>
@@ -53,7 +52,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test845 b/tests/data/test845
index 70562c7ab..d8b557488 100644
--- a/tests/data/test845
+++ b/tests/data/test845
@@ -52,7 +52,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "LOGOUT"
<protocol>
A001 CAPABILITY
-A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+A002 AUTHENTICATE OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test848 b/tests/data/test848
deleted file mode 100644
index 2b4a30b2a..000000000
--- a/tests/data/test848
+++ /dev/null
@@ -1,56 +0,0 @@
-<testcase>
-<info>
-<keywords>
-IMAP
-SASL
-SASL AUTH PLAIN
-RFC4616
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTHENTICATE +
-REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= A002 OK AUTHENTICATE completed
-</servercmd>
-<data>
-From: me@somewhere
-To: fake@nowhere
-
-body
-
---
- yours sincerely
-</data>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-imap
-</server>
- <name>
-IMAP plain authentication with alternative authorization identity
- </name>
- <command>
-'imap://%HOSTIP:%IMAPPORT/848/;MAILINDEX=1' -u user:secret --sasl-authzid shared-mailbox
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-A001 CAPABILITY
-A002 AUTHENTICATE PLAIN
-c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=
-A003 SELECT 848
-A004 FETCH 1 BODY[]
-A005 LOGOUT
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test849 b/tests/data/test849
deleted file mode 100644
index 8a4b39c00..000000000
--- a/tests/data/test849
+++ /dev/null
@@ -1,51 +0,0 @@
-<testcase>
-<info>
-<keywords>
-IMAP
-SASL
-SASL AUTH PLAIN
-RFC4616
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTHENTICATE +
-REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= A002 NO Not authorized
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-imap
-</server>
- <name>
-IMAP plain authentication with alternative authorization identity (Not authorized)
- </name>
- <command>
-'imap://%HOSTIP:%IMAPPORT/849/;MAILINDEX=1' -u kurt:xipj3plmq --sasl-authzid ursel
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-# 67 - CURLE_LOGIN_DENIED
-<errorcode>
-67
-</errorcode>
-#
-# The multi interface considers a broken "CONNECT" as a prematurely broken
-# transfer and such a connection will not get a "LOGOUT"
-<protocol>
-A001 CAPABILITY
-A002 AUTHENTICATE PLAIN
-dXJzZWwAa3VydAB4aXBqM3BsbXE=
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test85 b/tests/data/test85
index 8b4cd6abc..cb5e6e052 100644
--- a/tests/data/test85
+++ b/tests/data/test85
@@ -36,9 +36,6 @@ HTTP over proxy with site and proxy authentication
<command>
http://%HOSTIP:%HTTPPORT/we/want/that/page/85 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test865 b/tests/data/test865
index 8a262fcc5..6f66f82d7 100644
--- a/tests/data/test865
+++ b/tests/data/test865
@@ -16,7 +16,7 @@ RFC5034
<servercmd>
AUTH PLAIN
REPLY AUTH +
-REPLY AHVzZXIAc2VjcmV0 +OK Login successful
+REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -49,7 +49,7 @@ pop3://%HOSTIP:%POP3PORT/865 -u user:secret
<protocol>
CAPA
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
RETR 865
QUIT
</protocol>
diff --git a/tests/data/test871 b/tests/data/test871
index 27cc2a4b3..f4f236041 100644
--- a/tests/data/test871
+++ b/tests/data/test871
@@ -48,7 +48,7 @@ pop3://%HOSTIP:%POP3PORT/871 -u user:secret --sasl-ir
<verify>
<protocol>
CAPA
-AUTH PLAIN AHVzZXIAc2VjcmV0
+AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==
RETR 871
QUIT
</protocol>
diff --git a/tests/data/test879 b/tests/data/test879
index 0d45aaa20..681d779b2 100644
--- a/tests/data/test879
+++ b/tests/data/test879
@@ -20,7 +20,7 @@ AUTH CRAM-MD5 PLAIN
REPLY "AUTH CRAM-MD5" + Rubbish
REPLY * -ERR AUTH exchange cancelled by client
REPLY "AUTH PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 +OK Login successful
+REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -58,7 +58,7 @@ CAPA
AUTH CRAM-MD5
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
RETR 879
QUIT
</protocol>
diff --git a/tests/data/test880 b/tests/data/test880
index 738817cd3..f5eb69731 100644
--- a/tests/data/test880
+++ b/tests/data/test880
@@ -20,7 +20,7 @@ REPLY "AUTH NTLM" +
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
REPLY * -ERR AUTH exchange cancelled by client
REPLY "AUTH PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 +OK Login successful
+REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -69,7 +69,7 @@ AUTH NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
RETR 880
QUIT
</protocol>
diff --git a/tests/data/test881 b/tests/data/test881
index ccb906d9d..80eca500c 100644
--- a/tests/data/test881
+++ b/tests/data/test881
@@ -20,7 +20,7 @@ AUTH DIGEST-MD5 PLAIN
REPLY "AUTH DIGEST-MD5" + Rubbish
REPLY * -ERR AUTH exchange cancelled by client
REPLY "AUTH PLAIN" +
-REPLY AHVzZXIAc2VjcmV0 +OK Login successful
+REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -60,7 +60,7 @@ CAPA
AUTH DIGEST-MD5
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
RETR 881
QUIT
</protocol>
diff --git a/tests/data/test887 b/tests/data/test887
index 35419b502..fed4e3d92 100644
--- a/tests/data/test887
+++ b/tests/data/test887
@@ -17,7 +17,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +OK Login successful
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -55,7 +55,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
CAPA
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
RETR 887
QUIT
</protocol>
diff --git a/tests/data/test888 b/tests/data/test888
index 78463feaa..c52974f19 100644
--- a/tests/data/test888
+++ b/tests/data/test888
@@ -54,7 +54,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
CAPA
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
RETR 888
QUIT
</protocol>
diff --git a/tests/data/test889 b/tests/data/test889
index 2edb371e9..da26a3729 100644
--- a/tests/data/test889
+++ b/tests/data/test889
@@ -17,7 +17,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
REPLY AQ== -ERR Authentication failed
</servercmd>
</reply>
@@ -54,7 +54,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
CAPA
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test890 b/tests/data/test890
index ca0ccc7b5..30aa0b232 100644
--- a/tests/data/test890
+++ b/tests/data/test890
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "QUIT"
<protocol>
CAPA
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test892 b/tests/data/test892
deleted file mode 100644
index 4b8318292..000000000
--- a/tests/data/test892
+++ /dev/null
@@ -1,57 +0,0 @@
-<testcase>
-<info>
-<keywords>
-POP3
-SASL
-SASL AUTH PLAIN
-RFC1734
-RFC4616
-RFC5034
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTH +
-REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= +OK Login successful
-</servercmd>
-<data>
-From: me@somewhere
-To: fake@nowhere
-
-body
-
---
- yours sincerely
-</data>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-pop3
-</server>
- <name>
-POP3 plain authentication with alternative authorization identity
- </name>
- <command>
-pop3://%HOSTIP:%POP3PORT/892 -u user:secret --sasl-authzid shared-mailbox
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-CAPA
-AUTH PLAIN
-c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=
-RETR 892
-QUIT
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test893 b/tests/data/test893
deleted file mode 100644
index 2a762fc21..000000000
--- a/tests/data/test893
+++ /dev/null
@@ -1,53 +0,0 @@
-<testcase>
-<info>
-<keywords>
-POP3
-SASL
-SASL AUTH PLAIN
-RFC1734
-RFC4616
-RFC5034
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTH +
-REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= -ERR Not authorized
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-pop3
-</server>
- <name>
-POP3 plain authentication with alternative authorization identity (Not authorized)
- </name>
- <command>
-pop3://%HOSTIP:%POP3PORT/893 -u kurt:xipj3plmq --sasl-authzid ursel
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-# 67 - CURLE_LOGIN_DENIED
-<errorcode>
-67
-</errorcode>
-#
-# The multi interface considers a broken "CONNECT" as a prematurely broken
-# transfer and such a connection will not get a "QUIT"
-<protocol>
-CAPA
-AUTH PLAIN
-dXJzZWwAa3VydAB4aXBqM3BsbXE=
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test903 b/tests/data/test903
index 8a766e56d..2baf5e696 100644
--- a/tests/data/test903
+++ b/tests/data/test903
@@ -15,7 +15,7 @@ RFC4954
<servercmd>
AUTH PLAIN
REPLY AUTH 334 PLAIN supported
-REPLY AHVzZXIAc2VjcmV0 235 Authenticated
+REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
</servercmd>
</reply>
@@ -42,7 +42,7 @@ smtp://%HOSTIP:%SMTPPORT/903 --mail-rcpt recipient@example.com --mail-from sende
<protocol>
EHLO 903
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test919 b/tests/data/test919
index 39794e30b..3e74494cb 100644
--- a/tests/data/test919
+++ b/tests/data/test919
@@ -41,7 +41,7 @@ smtp://%HOSTIP:%SMTPPORT/919 --mail-rcpt recipient@example.com --mail-from sende
<verify>
<protocol>
EHLO 919
-AUTH PLAIN AHVzZXIAc2VjcmV0
+AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test93 b/tests/data/test93
index 58e47bc6b..138724835 100644
--- a/tests/data/test93
+++ b/tests/data/test93
@@ -31,9 +31,6 @@ HTTP GET with failed proxy auth
<command>
http://%HOSTIP:%HTTPPORT/93 -x %HOSTIP:%HTTPPORT
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test935 b/tests/data/test935
index 946611477..3fd5c2e50 100644
--- a/tests/data/test935
+++ b/tests/data/test935
@@ -19,7 +19,7 @@ AUTH CRAM-MD5 PLAIN
REPLY "AUTH CRAM-MD5" 334 Rubbish
REPLY * 501 AUTH exchange cancelled by client
REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY AHVzZXIAc2VjcmV0 235 Authenticated
+REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
</servercmd>
</reply>
@@ -51,7 +51,7 @@ EHLO 935
AUTH CRAM-MD5
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test936 b/tests/data/test936
index 5fde3c967..88c8a937e 100644
--- a/tests/data/test936
+++ b/tests/data/test936
@@ -19,7 +19,7 @@ REPLY "AUTH NTLM" 334 NTLM supported
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 Rubbish
REPLY * 501 AUTH exchange cancelled by client
REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY AHVzZXIAc2VjcmV0 235 Authenticated
+REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
</servercmd>
</reply>
@@ -62,7 +62,7 @@ AUTH NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test937 b/tests/data/test937
index 5e729e308..a2cb9b5c0 100644
--- a/tests/data/test937
+++ b/tests/data/test937
@@ -19,7 +19,7 @@ AUTH DIGEST-MD5 PLAIN
REPLY "AUTH DIGEST-MD5" 334 Rubbish
REPLY * 501 AUTH exchange cancelled by client
REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY AHVzZXIAc2VjcmV0 235 Authenticated
+REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
</servercmd>
</reply>
@@ -53,7 +53,7 @@ EHLO 937
AUTH DIGEST-MD5
*
AUTH PLAIN
-AHVzZXIAc2VjcmV0
+dXNlcgB1c2VyAHNlY3JldA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test94 b/tests/data/test94
index 4ca53c63b..2f3f4824d 100644
--- a/tests/data/test94
+++ b/tests/data/test94
@@ -29,7 +29,6 @@ http
</server>
<features>
SSL
-proxy
</features>
<name>
HTTPS GET with failed proxy auth (CONNECT 1.0)
diff --git a/tests/data/test946 b/tests/data/test946
index c6753dc1e..da4b924f9 100644
--- a/tests/data/test946
+++ b/tests/data/test946
@@ -16,7 +16,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH 334 OAUTHBEARER supported
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 235 Authenticated
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 235 Authenticated
</servercmd>
</reply>
@@ -48,7 +48,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
EHLO 946
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test947 b/tests/data/test947
index 03c3fbe37..d33a55931 100644
--- a/tests/data/test947
+++ b/tests/data/test947
@@ -47,7 +47,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
EHLO 947
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test948 b/tests/data/test948
index 8385f0cd2..9c1e31deb 100644
--- a/tests/data/test948
+++ b/tests/data/test948
@@ -16,7 +16,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH 334 OAUTHBEARER supported
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
REPLY AQ== 535 Username and Password not accepted. Learn more at\r\n535 http://support.example.com/mail/oauth
</servercmd>
</reply>
@@ -56,7 +56,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
EHLO 948
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test949 b/tests/data/test949
index 345940077..9145d61e9 100644
--- a/tests/data/test949
+++ b/tests/data/test949
@@ -55,7 +55,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "QUIT"
<protocol>
EHLO 949
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
AQ==
</protocol>
</verify>
diff --git a/tests/data/test95 b/tests/data/test95
index afc00aede..1cd88acab 100644
--- a/tests/data/test95
+++ b/tests/data/test95
@@ -52,9 +52,6 @@ HTTP over proxytunnel using POST
<command>
http://test.95:%HTTPPORT/we/want/that/page/95 -p -x %HOSTIP:%PROXYPORT -d "datatopost=ohthatsfunyesyes"
</command>
-<features>
-proxy
-</features>
</client>
#
diff --git a/tests/data/test953 b/tests/data/test953
deleted file mode 100644
index 4a70e1f31..000000000
--- a/tests/data/test953
+++ /dev/null
@@ -1,56 +0,0 @@
-<testcase>
-<info>
-<keywords>
-SMTP
-SASL
-SASL AUTH PLAIN
-RFC4616
-RFC4954
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTH 334 PLAIN supported
-REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 235 Authenticated
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-smtp
-</server>
- <name>
-SMTP plain authentication with alternative authorization identity
- </name>
-<stdin>
-mail body
-</stdin>
- <command>
-smtp://%HOSTIP:%SMTPPORT/953 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-EHLO 953
-AUTH PLAIN
-dXJzZWwAa3VydAB4aXBqM3BsbXE=
-MAIL FROM:<sender@example.com>
-RCPT TO:<recipient@example.com>
-DATA
-QUIT
-</protocol>
-<upload>
-mail body
-.
-</upload>
-</verify>
-</testcase>
diff --git a/tests/data/test954 b/tests/data/test954
deleted file mode 100644
index a5e6bb0d3..000000000
--- a/tests/data/test954
+++ /dev/null
@@ -1,55 +0,0 @@
-<testcase>
-<info>
-<keywords>
-SMTP
-SASL
-SASL AUTH PLAIN
-RFC4616
-RFC4954
-</keywords>
-</info>
-
-#
-# Server-side
-<reply>
-<servercmd>
-AUTH PLAIN
-REPLY AUTH 334 PLAIN supported
-REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 501 Not authorized
-</servercmd>
-</reply>
-
-#
-# Client-side
-<client>
-<server>
-smtp
-</server>
- <name>
-SMTP plain authentication with alternative authorization identity (Not authorized)
- </name>
-<stdin>
-mail body
-</stdin>
- <command>
-smtp://%HOSTIP:%SMTPPORT/954 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
-</command>
-</client>
-
-#
-# Verify data after the test has been "shot"
-<verify>
-# 67 - CURLE_LOGIN_DENIED
-<errorcode>
-67
-</errorcode>
-#
-# The multi interface considers a broken "CONNECT" as a prematurely broken
-# transfer and such a connection will not get a "QUIT"
-<protocol>
-EHLO 954
-AUTH PLAIN
-dXJzZWwAa3VydAB4aXBqM3BsbXE=
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/dictserver.py b/tests/dictserver.py
index 2d1b5a3b6..a41a8a0d6 100755
--- a/tests/dictserver.py
+++ b/tests/dictserver.py
@@ -33,7 +33,7 @@ def dictserver(options):
with open(options.pidfile, "w") as f:
f.write("{0}".format(pid))
- local_bind = (options.host, options.port)
+ local_bind = (HOST, options.port)
log.info("[DICT] Listening on %s", local_bind)
# Need to set the allow_reuse on the class, not on the instance.
@@ -83,8 +83,6 @@ def get_options():
parser.add_argument("--port", action="store", default=9016,
type=int, help="port to listen on")
- parser.add_argument("--host", action="store", default=HOST,
- help="host to listen on")
parser.add_argument("--verbose", action="store", type=int, default=0,
help="verbose output")
parser.add_argument("--pidfile", action="store",
diff --git a/tests/disable-scan.pl b/tests/disable-scan.pl
deleted file mode 100755
index e57fdc697..000000000
--- a/tests/disable-scan.pl
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/usr/bin/env perl
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-#
-
-use strict;
-use warnings;
-
-# the DISABLE options that can be set by configure
-my %disable;
-# the DISABLE options that are used in C files
-my %file;
-
-# we may get the dir root pointed out
-my $root=$ARGV[0] || ".";
-
-sub scan_configure {
- open S, "<$root/configure.ac";
- while(<S>) {
- if(/(CURL_DISABLE_[A-Z_]+)/g) {
- my ($sym)=($1);
- $disable{$sym} = 1;
- }
- }
- close S;
-}
-
-sub scan_file {
- my ($source)=@_;
- open F, "<$source";
- while(<F>) {
- if(/(CURL_DISABLE_[A-Z_]+)/g) {
- my ($sym)=($1);
- $file{$sym} = $source;
- }
- }
- close F;
-}
-
-sub scan_dir {
- my ($dir)=@_;
- opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
- my @cfiles = grep { /\.c\z/ && -f "$dir/$_" } readdir($dh);
- closedir $dh;
- for my $f (sort @cfiles) {
- scan_file("$dir/$f");
- }
-}
-
-sub scan_sources {
- scan_dir("$root/src");
- scan_dir("$root/lib");
- scan_dir("$root/lib/vtls");
- scan_dir("$root/lib/vauth");
-}
-
-scan_configure();
-scan_sources();
-
-
-my $error = 0;
-# Check the configure symbols for use in code
-for my $s (sort keys %disable) {
- if(!$file{$s}) {
- printf "Present in configure.ac, not used by code: %s\n", $s;
- $error++;
- }
-}
-
-# Check the code symbols for use in configure
-for my $s (sort keys %file) {
- if(!$disable{$s}) {
- printf "Not set by configure: %s (%s)\n", $s, $file{$s};
- $error++;
- }
-}
-
-exit $error;
diff --git a/tests/getpart.pm b/tests/getpart.pm
index 7080bf4b7..5198b5fa3 100644
--- a/tests/getpart.pm
+++ b/tests/getpart.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 9ba72d7de..e38f48102 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -16,24 +16,25 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 lib508 lib509 \
lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 lib518 lib519 \
lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532 \
- lib533 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
+ lib533 lib536 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
lib583 lib585 lib586 lib587 lib589 lib590 lib591 lib597 lib598 lib599 \
lib643 lib644 lib645 lib650 lib651 lib652 lib653 lib654 lib655 lib658 \
- lib659 lib661 \
+ lib659 \
lib1156 \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
- lib1518 lib1520 lib1521 lib1522 lib1523 \
+ lib1518 lib1520 lib1521 lib1522 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
lib1534 lib1535 lib1536 lib1537 lib1538 \
lib1540 lib1541 \
lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
- lib1558 lib1559 lib1560 \
- lib1591 lib1592 lib1593 lib1594 lib1596 \
- lib1900 lib1905 lib1906 lib1907 \
+ lib1558 \
+ lib1560 \
+ lib1591 lib1592 \
+ lib1900 lib1905 \
lib2033
chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
@@ -159,6 +160,10 @@ lib533_SOURCES = lib533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib533_LDADD = $(TESTUTIL_LIBS)
lib533_CPPFLAGS = $(AM_CPPFLAGS)
+lib536_SOURCES = lib536.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib536_LDADD = $(TESTUTIL_LIBS)
+lib536_CPPFLAGS = $(AM_CPPFLAGS)
+
lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS)
lib537_CPPFLAGS = $(AM_CPPFLAGS)
@@ -345,9 +350,6 @@ lib659_SOURCES = lib659.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib659_LDADD = $(TESTUTIL_LIBS)
lib659_CPPFLAGS = $(AM_CPPFLAGS)
-lib661_SOURCES = lib661.c $(SUPPORTFILES)
-lib661_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
lib1500_LDADD = $(TESTUTIL_LIBS)
lib1500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -431,9 +433,6 @@ lib1521_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)
lib1522_SOURCES = lib1522.c $(SUPPORTFILES)
lib1522_CPPFLAGS = $(AM_CPPFLAGS)
-lib1523_SOURCES = lib1523.c $(SUPPORTFILES)
-lib1523_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1525_LDADD = $(TESTUTIL_LIBS)
lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
@@ -530,9 +529,6 @@ lib1557_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1557
lib1558_SOURCES = lib1558.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1558_LDADD = $(TESTUTIL_LIBS)
-lib1559_SOURCES = lib1559.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1559_LDADD = $(TESTUTIL_LIBS)
-
lib1560_SOURCES = lib1560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1560_LDADD = $(TESTUTIL_LIBS)
@@ -544,16 +540,6 @@ lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1592_LDADD = $(TESTUTIL_LIBS)
lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592
-lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1593_LDADD = $(TESTUTIL_LIBS)
-
-lib1594_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1594_LDADD = $(TESTUTIL_LIBS)
-
-lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1596_LDADD = $(TESTUTIL_LIBS)
-lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
-
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
@@ -562,14 +548,6 @@ lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
lib1905_CPPFLAGS = $(AM_CPPFLAGS)
-lib1906_SOURCES = lib1906.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1906_LDADD = $(TESTUTIL_LIBS)
-lib1906_CPPFLAGS = $(AM_CPPFLAGS)
-
-lib1907_SOURCES = lib1907.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1907_LDADD = $(TESTUTIL_LIBS)
-lib1907_CPPFLAGS = $(AM_CPPFLAGS)
-
lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib2033_LDADD = $(TESTUTIL_LIBS)
lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
diff --git a/tests/libtest/first.c b/tests/libtest/first.c
index 2731ef8db..d687bf276 100644
--- a/tests/libtest/first.c
+++ b/tests/libtest/first.c
@@ -97,9 +97,9 @@ static void memory_tracking_init(void)
strcpy(fname, env);
curl_free(env);
curl_dbg_memdebug(fname);
- /* this weird stuff here is to make curl_free() get called before
- curl_dbg_memdebug() as otherwise memory tracking will log a free()
- without an alloc! */
+ /* this weird stuff here is to make curl_free() get called
+ before curl_memdebug() as otherwise memory tracking will
+ log a free() without an alloc! */
}
/* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
env = curl_getenv("CURL_MEMLIMIT");
diff --git a/tests/libtest/lib1156.c b/tests/libtest/lib1156.c
index df6062c56..cb8878c21 100644
--- a/tests/libtest/lib1156.c
+++ b/tests/libtest/lib1156.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -88,7 +88,7 @@ static int onetest(CURL *curl, const char *url, const testparams *p)
unsigned int replyselector;
char urlbuf[256];
- replyselector = (p->flags & F_CONTENTRANGE)? 1: 0;
+ replyselector = p->flags & F_CONTENTRANGE? 1: 0;
if(p->flags & F_HTTP416)
replyselector += 2;
msnprintf(urlbuf, sizeof(urlbuf), "%s%04u", url, replyselector);
@@ -96,7 +96,7 @@ static int onetest(CURL *curl, const char *url, const testparams *p)
test_setopt(curl, CURLOPT_RESUME_FROM, (p->flags & F_RESUME)? 3: 0);
test_setopt(curl, CURLOPT_RANGE, !(p->flags & F_RESUME)?
"3-1000000": (char *) NULL);
- test_setopt(curl, CURLOPT_FAILONERROR, (p->flags & F_FAIL)? 1: 0);
+ test_setopt(curl, CURLOPT_FAILONERROR, p->flags & F_FAIL? 1: 0);
hasbody = 0;
res = curl_easy_perform(curl);
if(res != p->result) {
diff --git a/tests/libtest/lib1522.c b/tests/libtest/lib1522.c
index 6df152f1f..2de955284 100644
--- a/tests/libtest/lib1522.c
+++ b/tests/libtest/lib1522.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,16 +32,14 @@ static char g_Data[40 * 1024]; /* POST 40KB */
static int sockopt_callback(void *clientp, curl_socket_t curlfd,
curlsocktype purpose)
{
-#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
int sndbufsize = 4 * 1024; /* 4KB send buffer */
(void) clientp;
(void) purpose;
+#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
setsockopt(curlfd, SOL_SOCKET, SO_SNDBUF,
(const char *)&sndbufsize, sizeof(sndbufsize));
#else
- (void)clientp;
(void)curlfd;
- (void)purpose;
#endif
return CURL_SOCKOPT_OK;
}
@@ -84,7 +82,6 @@ int test(char *URL)
curl_slist_free_all(pHeaderList);
curl_easy_cleanup(pCurl);
- curl_global_cleanup();
return 0;
}
diff --git a/tests/libtest/lib1523.c b/tests/libtest/lib1523.c
deleted file mode 100644
index 170527d84..000000000
--- a/tests/libtest/lib1523.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-/* test case and code based on https://github.com/curl/curl/issues/3927 */
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-static int dload_progress_cb(void *a, curl_off_t b, curl_off_t c,
- curl_off_t d, curl_off_t e)
-{
- (void)a;
- (void)b;
- (void)c;
- (void)d;
- (void)e;
- return 0;
-}
-
-static size_t write_cb(char *d, size_t n, size_t l, void *p)
-{
- /* take care of the data here, ignored in this example */
- (void)d;
- (void)p;
- return n*l;
-}
-
-static CURLcode run(CURL *hnd, long limit, long time)
-{
- curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_LIMIT, limit);
- curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_TIME, time);
- return curl_easy_perform(hnd);
-}
-
-int test(char *URL)
-{
- CURLcode ret;
- CURL *hnd = curl_easy_init();
- char buffer[CURL_ERROR_SIZE];
- curl_easy_setopt(hnd, CURLOPT_URL, URL);
- curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, write_cb);
- curl_easy_setopt(hnd, CURLOPT_ERRORBUFFER, buffer);
- curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 0L);
- curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, dload_progress_cb);
-
- printf("Start: %d\n", time(NULL));
- ret = run(hnd, 1, 2);
- if(ret)
- fprintf(stderr, "error %d: %s\n", ret, buffer);
-
- ret = run(hnd, 12000, 1);
- if(ret != CURLE_OPERATION_TIMEDOUT)
- fprintf(stderr, "error %d: %s\n", ret, buffer);
- else
- ret = 0;
-
- printf("End: %d\n", time(NULL));
- curl_easy_cleanup(hnd);
-
- return (int)ret;
-}
diff --git a/tests/libtest/lib1541.c b/tests/libtest/lib1541.c
index f3b41f5be..983a47e01 100644
--- a/tests/libtest/lib1541.c
+++ b/tests/libtest/lib1541.c
@@ -104,6 +104,7 @@ int test(char *URL)
{
pthread_t tid[NUM_THREADS];
int i;
+ int error;
CURLSH *share;
struct initurl url[NUM_THREADS];
@@ -118,7 +119,6 @@ int test(char *URL)
init_locks();
for(i = 0; i< NUM_THREADS; i++) {
- int error;
url[i].url = URL;
url[i].share = share;
url[i].threadno = i;
@@ -131,7 +131,7 @@ int test(char *URL)
/* now wait for all threads to terminate */
for(i = 0; i< NUM_THREADS; i++) {
- pthread_join(tid[i], NULL);
+ error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
diff --git a/tests/libtest/lib1559.c b/tests/libtest/lib1559.c
deleted file mode 100644
index 2aa3615e0..000000000
--- a/tests/libtest/lib1559.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define EXCESSIVE 10*1000*1000
-int test(char *URL)
-{
- CURLcode res = 0;
- CURL *curl = NULL;
- char *longurl = malloc(EXCESSIVE);
- CURLU *u;
- (void)URL;
-
- memset(longurl, 'a', EXCESSIVE);
- longurl[EXCESSIVE-1] = 0;
-
- global_init(CURL_GLOBAL_ALL);
- easy_init(curl);
-
- res = curl_easy_setopt(curl, CURLOPT_URL, longurl);
- printf("CURLOPT_URL %d bytes URL == %d\n",
- EXCESSIVE, (int)res);
-
- res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, longurl);
- printf("CURLOPT_POSTFIELDS %d bytes data == %d\n",
- EXCESSIVE, (int)res);
-
- u = curl_url();
- if(u) {
- CURLUcode uc = curl_url_set(u, CURLUPART_URL, longurl, 0);
- printf("CURLUPART_URL %d bytes URL == %d\n",
- EXCESSIVE, (int)uc);
- uc = curl_url_set(u, CURLUPART_SCHEME, longurl, CURLU_NON_SUPPORT_SCHEME);
- printf("CURLUPART_SCHEME %d bytes scheme == %d\n",
- EXCESSIVE, (int)uc);
- uc = curl_url_set(u, CURLUPART_USER, longurl, 0);
- printf("CURLUPART_USER %d bytes user == %d\n",
- EXCESSIVE, (int)uc);
- curl_url_cleanup(u);
- }
-
- free(longurl);
-
- curl_easy_cleanup(curl);
- curl_global_cleanup();
-
- return 0;
-
-test_cleanup:
-
- curl_easy_cleanup(curl);
- curl_global_cleanup();
-
- return res; /* return the final return code */
-}
diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c
index 7f8accc7d..7ae1025be 100644
--- a/tests/libtest/lib1560.c
+++ b/tests/libtest/lib1560.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -99,8 +99,7 @@ struct setcase {
const char *out;
unsigned int urlflags;
unsigned int setflags;
- CURLUcode ucode; /* for the main URL set */
- CURLUcode pcode; /* for updating parts */
+ CURLUcode ucode;
};
struct testcase {
@@ -140,33 +139,6 @@ static struct testcase get_parts_list[] ={
"file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
#endif
- {"https://example.com/color/#green?no-black",
- "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
- "green?no-black",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/color/#green#no-black",
- "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
- "green#no-black",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/color/?green#no-black",
- "https | [11] | [12] | [13] | example.com | [15] | /color/ | green | "
- "no-black",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/#color/?green#no-black",
- "https | [11] | [12] | [13] | example.com | [15] | / | [16] | "
- "color/?green#no-black",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.#com/color/?green#no-black",
- "https | [11] | [12] | [13] | example. | [15] | / | [16] | "
- "com/color/?green#no-black",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"http://[ab.be:1]/x", "",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
- {"http://[ab.be]/x", "",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
- /* URL without host name */
- {"http://a:b@/x", "",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
{"boing:80",
"https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
@@ -180,13 +152,7 @@ static struct testcase get_parts_list[] ={
"http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
{"https://[::1%252]:1234",
- "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
- CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
-
- /* here's "bad" zone id */
- {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
- "https | [11] | [12] | [13] | [fe80::20c:29ff:fe9c:409b] | 1234 "
- "| / | [16] | [17]",
+ "https | [11] | [12] | [13] | [::1%252] | 1234 | / | [16] | [17]",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
{"https://127.0.0.1:443",
"https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
@@ -306,26 +272,6 @@ static struct testcase get_parts_list[] ={
};
static struct urltestcase get_url_list[] = {
- /* 40 bytes scheme is the max allowed */
- {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa://hostname/path",
- CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
- /* 41 bytes scheme is not allowed */
- {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
- "",
- CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
- {"https://[fe80::20c:29ff:fe9c:409b%]:1234",
- "",
- 0, 0, CURLUE_MALFORMED_INPUT},
- {"https://[fe80::20c:29ff:fe9c:409b%25]:1234",
- "https://[fe80::20c:29ff:fe9c:409b%2525]:1234/",
- 0, 0, CURLUE_OK},
- {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
- "https://[fe80::20c:29ff:fe9c:409b%25eth0]:1234/",
- 0, 0, CURLUE_OK},
- {"https://[::%25fakeit]/moo",
- "https://[::%25fakeit]/moo",
- 0, 0, CURLUE_OK},
{"smtp.example.com/path/html",
"smtp://smtp.example.com/path/html",
CURLU_GUESS_SCHEME, 0, CURLUE_OK},
@@ -434,18 +380,6 @@ static struct urltestcase get_url_list[] = {
{"tp://example.com/path/html",
"tp://example.com/path/html",
CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
- {"custom-scheme://host?expected=test-good",
- "custom-scheme://host/?expected=test-good",
- CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
- {"custom-scheme://?expected=test-bad",
- "",
- CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
- {"custom-scheme://?expected=test-new-good",
- "custom-scheme:///?expected=test-new-good",
- CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
- {"custom-scheme://host?expected=test-still-good",
- "custom-scheme://host/?expected=test-still-good",
- CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
{NULL, NULL, 0, 0, 0}
};
@@ -461,140 +395,87 @@ static int checkurl(const char *url, const char *out)
/* !checksrc! disable SPACEBEFORECOMMA 1 */
static struct setcase set_parts_list[] = {
- {"https://example.com/",
- /* Set a 41 bytes scheme. That's too long so the old scheme remains set. */
- "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc,",
- "https://example.com/",
- 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_MALFORMED_INPUT},
- {"https://example.com/",
- /* set a 40 bytes scheme */
- "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,",
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb://example.com/",
- 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
- {"https://[::1%25fake]:1234/",
- "zoneid=NULL,",
- "https://[::1]:1234/",
- 0, 0, CURLUE_OK, CURLUE_OK},
- {"https://host:1234/",
- "port=NULL,",
- "https://host/",
- 0, 0, CURLUE_OK, CURLUE_OK},
- {"https://host:1234/",
- "port=\"\",",
- "https://host:1234/",
- 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
- {"https://host:1234/",
- "port=56 78,",
- "https://host:1234/",
- 0, 0, CURLUE_OK, CURLUE_MALFORMED_INPUT},
- {"https://host:1234/",
- "port=0,",
- "https://host:1234/",
- 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
- {"https://host:1234/",
- "port=65535,",
- "https://host:65535/",
- 0, 0, CURLUE_OK, CURLUE_OK},
- {"https://host:1234/",
- "port=65536,",
- "https://host:1234/",
- 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
{"https://host/",
"path=%4A%4B%4C,",
"https://host/%4a%4b%4c",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{"https://host/mooo?q#f",
"path=NULL,query=NULL,fragment=NULL,",
"https://host/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{"https://user:secret@host/",
"user=NULL,password=NULL,",
"https://host/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{NULL,
"scheme=https,user= @:,host=foobar,",
"https://%20%20%20%40%3a@foobar/",
- 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
+ 0, CURLU_URLENCODE, CURLUE_OK},
{NULL,
"scheme=https,host= ,path= ,user= ,password= ,query= ,fragment= ,",
"https://%20:%20@%20%20/%20?+#%20",
- 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
+ 0, CURLU_URLENCODE, CURLUE_OK},
{NULL,
"scheme=https,host=foobar,path=/this /path /is /here,",
"https://foobar/this%20/path%20/is%20/here",
- 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
- {NULL,
- "scheme=https,host=foobar,path=\xc3\xa4\xc3\xb6\xc3\xbc,",
- "https://foobar/%c3%a4%c3%b6%c3%bc",
- 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
+ 0, CURLU_URLENCODE, CURLUE_OK},
{"imap://user:secret;opt@host/",
"options=updated,scheme=imaps,password=p4ssw0rd,",
"imaps://user:p4ssw0rd;updated@host/",
- 0, 0, CURLUE_NO_HOST, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{"imap://user:secret;optit@host/",
"scheme=https,",
"https://user:secret@host/",
- 0, 0, CURLUE_NO_HOST, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{"file:///file#anchor",
"scheme=https,host=example,",
"https://example/file#anchor",
- 0, 0, CURLUE_NO_HOST, CURLUE_OK},
+ 0, 0, CURLUE_NO_HOST},
{NULL, /* start fresh! */
"scheme=file,host=127.0.0.1,path=/no,user=anonymous,",
"file:///no",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{NULL, /* start fresh! */
"scheme=ftp,host=127.0.0.1,path=/no,user=anonymous,",
"ftp://anonymous@127.0.0.1/no",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{NULL, /* start fresh! */
"scheme=https,host=example.com,",
"https://example.com/",
- 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
+ 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK},
{"http://user:foo@example.com/path?query#frag",
"fragment=changed,",
"http://user:foo@example.com/path?query#changed",
- 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
+ 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK},
{"http://example.com/",
"scheme=foo,", /* not accepted */
"http://example.com/",
- 0, 0, CURLUE_OK, CURLUE_UNSUPPORTED_SCHEME},
+ 0, 0, CURLUE_OK},
{"http://example.com/",
"scheme=https,path=/hello,fragment=snippet,",
"https://example.com/hello#snippet",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{"http://example.com:80",
"user=foo,port=1922,",
"http://foo@example.com:1922/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{"http://example.com:80",
"user=foo,password=bar,",
"http://foo:bar@example.com:80/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{"http://example.com:80",
"user=foo,",
"http://foo@example.com:80/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{"http://example.com",
"host=www.example.com,",
"http://www.example.com/",
- 0, 0, CURLUE_OK, CURLUE_OK},
+ 0, 0, CURLUE_OK},
{"http://example.com:80",
"scheme=ftp,",
"ftp://example.com:80/",
- 0, 0, CURLUE_OK, CURLUE_OK},
- {"custom-scheme://host",
- "host=\"\",",
- "custom-scheme://host/",
- CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK,
- CURLUE_MALFORMED_INPUT},
- {"custom-scheme://host",
- "host=\"\",",
- "custom-scheme:///",
- CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY,
- CURLUE_OK, CURLUE_OK},
-
- {NULL, NULL, NULL, 0, 0, 0, 0}
+ 0, 0, CURLUE_OK},
+ {NULL, NULL, NULL, 0, 0, 0}
};
static CURLUPart part2id(char *part)
@@ -619,15 +500,12 @@ static CURLUPart part2id(char *part)
return CURLUPART_QUERY;
if(!strcmp("fragment", part))
return CURLUPART_FRAGMENT;
- if(!strcmp("zoneid", part))
- return CURLUPART_ZONEID;
return 9999; /* bad input => bad output */
}
-static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
+static void updateurl(CURLU *u, const char *cmd, unsigned int setflags)
{
const char *p = cmd;
- CURLUcode uc;
/* make sure the last command ends with a comma too! */
while(p) {
@@ -645,24 +523,17 @@ static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
/* for debugging this */
fprintf(stderr, "%s = %s [%d]\n", part, value, (int)what);
#endif
- if(what > CURLUPART_ZONEID)
- fprintf(stderr, "UNKNOWN part '%s'\n", part);
-
if(!strcmp("NULL", value))
- uc = curl_url_set(u, what, NULL, setflags);
- else if(!strcmp("\"\"", value))
- uc = curl_url_set(u, what, "", setflags);
+ curl_url_set(u, what, NULL, setflags);
else
- uc = curl_url_set(u, what, value, setflags);
- if(uc)
- return uc;
+ curl_url_set(u, what, value, setflags);
}
p = e + 1;
continue;
}
break;
}
- return CURLUE_OK;
+
}
static struct redircase set_url_list[] = {
@@ -692,11 +563,13 @@ static struct redircase set_url_list[] = {
static int set_url(void)
{
int i;
+ CURLUcode rc;
+ CURLU *urlp;
int error = 0;
for(i = 0; set_url_list[i].in && !error; i++) {
- CURLUcode rc;
- CURLU *urlp = curl_url();
+ char *url = NULL;
+ urlp = curl_url();
if(!urlp)
break;
rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].in,
@@ -711,7 +584,6 @@ static int set_url(void)
error++;
}
else {
- char *url = NULL;
rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
if(rc) {
fprintf(stderr, "%s:%d Get URL returned %d\n",
@@ -723,8 +595,8 @@ static int set_url(void)
error++;
}
}
- curl_free(url);
}
+ curl_free(url);
}
else if(rc != set_url_list[i].ucode) {
fprintf(stderr, "Set URL\nin: %s\nreturned %d (expected %d)\n",
@@ -739,10 +611,11 @@ static int set_url(void)
static int set_parts(void)
{
int i;
+ CURLUcode rc;
int error = 0;
for(i = 0; set_parts_list[i].set && !error; i++) {
- CURLUcode rc;
+ char *url = NULL;
CURLU *urlp = curl_url();
if(!urlp) {
error++;
@@ -754,16 +627,7 @@ static int set_parts(void)
else
rc = CURLUE_OK;
if(!rc) {
- char *url = NULL;
- CURLUcode uc = updateurl(urlp, set_parts_list[i].set,
- set_parts_list[i].setflags);
-
- if(uc != set_parts_list[i].pcode) {
- fprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
- set_parts_list[i].set, (int)uc, set_parts_list[i].pcode);
- error++;
- }
-
+ updateurl(urlp, set_parts_list[i].set, set_parts_list[i].setflags);
rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
if(rc) {
@@ -774,13 +638,13 @@ static int set_parts(void)
else if(checkurl(url, set_parts_list[i].out)) {
error++;
}
- curl_free(url);
}
else if(rc != set_parts_list[i].ucode) {
fprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
set_parts_list[i].in, (int)rc, set_parts_list[i].ucode);
error++;
}
+ curl_free(url);
curl_url_cleanup(urlp);
}
return error;
@@ -789,9 +653,10 @@ static int set_parts(void)
static int get_url(void)
{
int i;
+ CURLUcode rc;
int error = 0;
for(i = 0; get_url_list[i].in && !error; i++) {
- CURLUcode rc;
+ char *url = NULL;
CURLU *urlp = curl_url();
if(!urlp) {
error++;
@@ -800,7 +665,6 @@ static int get_url(void)
rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
get_url_list[i].urlflags);
if(!rc) {
- char *url = NULL;
rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
if(rc) {
@@ -813,13 +677,13 @@ static int get_url(void)
error++;
}
}
- curl_free(url);
}
else if(rc != get_url_list[i].ucode) {
fprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
get_url_list[i].in, (int)rc, get_url_list[i].ucode);
error++;
}
+ curl_free(url);
curl_url_cleanup(urlp);
}
return error;
@@ -828,10 +692,11 @@ static int get_url(void)
static int get_parts(void)
{
int i;
+ CURLUcode rc;
+ CURLU *urlp;
int error = 0;
for(i = 0; get_parts_list[i].in && !error; i++) {
- CURLUcode rc;
- CURLU *urlp = curl_url();
+ urlp = curl_url();
if(!urlp) {
error++;
break;
@@ -876,10 +741,11 @@ static struct querycase append_list[] = {
static int append(void)
{
int i;
+ CURLUcode rc;
+ CURLU *urlp;
int error = 0;
for(i = 0; append_list[i].in && !error; i++) {
- CURLUcode rc;
- CURLU *urlp = curl_url();
+ urlp = curl_url();
if(!urlp) {
error++;
break;
@@ -923,139 +789,10 @@ static int append(void)
return error;
}
-static int scopeid(void)
-{
- CURLU *u = curl_url();
- int error = 0;
- CURLUcode rc;
- char *url;
-
- rc = curl_url_set(u, CURLUPART_URL,
- "https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html", 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_set returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
-
- rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_set(u, CURLUPART_HOST, "[::1]", 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
-
- rc = curl_url_get(u, CURLUPART_URL, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_set(u, CURLUPART_HOST, "example.com", 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
-
- rc = curl_url_get(u, CURLUPART_URL, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_set(u, CURLUPART_HOST,
- "[fe80::20c:29ff:fe9c:409b%25eth0]", 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
-
- rc = curl_url_get(u, CURLUPART_URL, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_get(u, CURLUPART_ZONEID, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_ZONEID returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- rc = curl_url_set(u, CURLUPART_ZONEID, "clown", 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_set CURLUPART_ZONEID returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
-
- rc = curl_url_get(u, CURLUPART_URL, &url, 0);
- if(rc != CURLUE_OK) {
- fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
- __FILE__, __LINE__, (int)rc);
- error++;
- }
- else {
- printf("we got %s\n", url);
- curl_free(url);
- }
-
- curl_url_cleanup(u);
-
- return error;
-}
-
int test(char *URL)
{
(void)URL; /* not used */
- if(scopeid())
- return 6;
-
if(append())
return 5;
diff --git a/tests/libtest/lib1593.c b/tests/libtest/lib1593.c
deleted file mode 100644
index 5408c724a..000000000
--- a/tests/libtest/lib1593.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* Test suppressing the If-Modified-Since header */
-
-#include "test.h"
-
-#include "memdebug.h"
-
-int test(char *URL)
-{
- struct curl_slist *header = NULL;
- long unmet;
- CURL *curl = NULL;
- int res = 0;
-
- global_init(CURL_GLOBAL_ALL);
-
- easy_init(curl);
-
- easy_setopt(curl, CURLOPT_URL, URL);
- easy_setopt(curl, CURLOPT_TIMECONDITION, (long)CURL_TIMECOND_IFMODSINCE);
- /* Some TIMEVALUE; it doesn't matter. */
- easy_setopt(curl, CURLOPT_TIMEVALUE, 1566210680L);
-
- header = curl_slist_append(NULL, "If-Modified-Since:");
- if(!header) {
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- easy_setopt(curl, CURLOPT_HTTPHEADER, header);
-
- res = curl_easy_perform(curl);
- if(res)
- goto test_cleanup;
-
- /* Confirm that the condition checking still worked, even though we
- * suppressed the actual header.
- * The server returns 304, which means the condition is "unmet".
- */
-
- res = curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &unmet);
- if(res)
- goto test_cleanup;
-
- if(unmet != 1L) {
- res = TEST_ERR_FAILURE;
- goto test_cleanup;
- }
-
-test_cleanup:
-
- /* always cleanup */
- curl_easy_cleanup(curl);
- curl_slist_free_all(header);
- curl_global_cleanup();
-
- return res;
-}
diff --git a/tests/libtest/lib1594.c b/tests/libtest/lib1594.c
deleted file mode 100644
index a76971590..000000000
--- a/tests/libtest/lib1594.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* Testing Retry-After header parser */
-
-#include "test.h"
-
-#include "memdebug.h"
-
-int test(char *URL)
-{
- struct curl_slist *header = NULL;
- curl_off_t retry;
- CURL *curl = NULL;
- int res = 0;
-
- global_init(CURL_GLOBAL_ALL);
-
- easy_init(curl);
-
- easy_setopt(curl, CURLOPT_URL, URL);
-
- res = curl_easy_perform(curl);
- if(res)
- goto test_cleanup;
-
- res = curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry);
- if(res)
- goto test_cleanup;
-
-#ifdef LIB1596
- /* we get a relative number of seconds, so add the number of seconds
- we're at to make it a somewhat stable number. Then remove accuracy. */
- retry += time(NULL);
- retry /= 10000;
-#endif
- printf("Retry-After: %" CURL_FORMAT_CURL_OFF_T "\n", retry);
-
-test_cleanup:
-
- /* always cleanup */
- curl_easy_cleanup(curl);
- curl_slist_free_all(header);
- curl_global_cleanup();
-
- return res;
-}
diff --git a/tests/libtest/lib1905.c b/tests/libtest/lib1905.c
index 7556d45e7..b09c4f526 100644
--- a/tests/libtest/lib1905.c
+++ b/tests/libtest/lib1905.c
@@ -27,11 +27,12 @@
int test(char *URL)
{
+ CURLM *cm = NULL;
CURLSH *sh = NULL;
CURL *ch = NULL;
int unfinished;
- CURLM *cm = curl_multi_init();
+ cm = curl_multi_init();
if(!cm)
return 1;
sh = curl_share_init();
@@ -87,7 +88,6 @@ int test(char *URL)
curl_easy_cleanup(ch);
curl_share_cleanup(sh);
curl_multi_cleanup(cm);
- curl_global_cleanup();
return 0;
}
diff --git a/tests/libtest/lib1906.c b/tests/libtest/lib1906.c
deleted file mode 100644
index 6c7a4bf6e..000000000
--- a/tests/libtest/lib1906.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-int test(char *URL)
-{
- char *url_after;
- CURLU *curlu = curl_url();
- CURL *curl = curl_easy_init();
- CURLcode curl_code;
- char error_buffer[CURL_ERROR_SIZE] = "";
-
- curl_url_set(curlu, CURLUPART_URL, URL, CURLU_DEFAULT_SCHEME);
- curl_easy_setopt(curl, CURLOPT_CURLU, curlu);
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
- /* set a port number that makes this reqeuest fail */
- curl_easy_setopt(curl, CURLOPT_PORT, 1L);
- curl_code = curl_easy_perform(curl);
- if(!curl_code)
- fprintf(stderr, "failure expected, "
- "curl_easy_perform returned %ld: <%s>, <%s>\n",
- (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
-
- /* print the used url */
- curl_url_get(curlu, CURLUPART_URL, &url_after, 0);
- fprintf(stderr, "curlu now: <%s>\n", url_after);
- curl_free(url_after);
-
- /* now reset CURLOP_PORT to go back to originally set port number */
- curl_easy_setopt(curl, CURLOPT_PORT, 0L);
-
- curl_code = curl_easy_perform(curl);
- if(curl_code)
- fprintf(stderr, "success expected, "
- "curl_easy_perform returned %ld: <%s>, <%s>\n",
- (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
-
- /* print url */
- curl_url_get(curlu, CURLUPART_URL, &url_after, 0);
- fprintf(stderr, "curlu now: <%s>\n", url_after);
- curl_free(url_after);
-
- curl_easy_cleanup(curl);
- curl_url_cleanup(curlu);
- curl_global_cleanup();
-
- return 0;
-}
diff --git a/tests/libtest/lib1907.c b/tests/libtest/lib1907.c
deleted file mode 100644
index 2d9465aee..000000000
--- a/tests/libtest/lib1907.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-int test(char *URL)
-{
- char *url_after;
- CURL *curl;
- CURLcode curl_code;
- char error_buffer[CURL_ERROR_SIZE] = "";
-
- curl_global_init(CURL_GLOBAL_DEFAULT);
- curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_URL, URL);
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
- curl_code = curl_easy_perform(curl);
- if(!curl_code)
- fprintf(stderr, "failure expected, "
- "curl_easy_perform returned %ld: <%s>, <%s>\n",
- (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
-
- /* print the used url */
- if(!curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url_after))
- printf("Effective URL: %s\n", url_after);
-
- curl_easy_cleanup(curl);
- curl_global_cleanup();
-
- return 0;
-}
diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c
index e0325ee00..9f656e032 100644
--- a/tests/libtest/lib506.c
+++ b/tests/libtest/lib506.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -142,7 +142,6 @@ static void *fire(void *ptr)
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, tdata->url);
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
printf("CURLOPT_SHARE\n");
curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
diff --git a/tests/libtest/lib509.c b/tests/libtest/lib509.c
index e8e803ffc..59ced355f 100644
--- a/tests/libtest/lib509.c
+++ b/tests/libtest/lib509.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,8 +21,6 @@
***************************************************************************/
#include "test.h"
-#include <string.h>
-
/*
* This test uses these funny custom memory callbacks for the only purpose
* of verifying that curl_global_init_mem() functionality is present in
diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c
new file mode 100644
index 000000000..e6943626d
--- /dev/null
+++ b/tests/libtest/lib536.c
@@ -0,0 +1,142 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include <fcntl.h>
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+
+static int perform(CURLM *multi)
+{
+ int handles;
+ fd_set fdread, fdwrite, fdexcep;
+ int res = 0;
+
+ for(;;) {
+ struct timeval interval;
+ int maxfd = -99;
+
+ interval.tv_sec = 0;
+ interval.tv_usec = 100000L; /* 100 ms */
+
+ res_multi_perform(multi, &handles);
+ if(res)
+ return res;
+
+ res_test_timedout();
+ if(res)
+ return res;
+
+ if(!handles)
+ break; /* done */
+
+ FD_ZERO(&fdread);
+ FD_ZERO(&fdwrite);
+ FD_ZERO(&fdexcep);
+
+ res_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
+ if(res)
+ return res;
+
+ /* At this point, maxfd is guaranteed to be greater or equal than -1. */
+
+ res_select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
+ if(res)
+ return res;
+
+ res_test_timedout();
+ if(res)
+ return res;
+ }
+
+ return 0; /* success */
+}
+
+int test(char *URL)
+{
+ CURLM *multi = NULL;
+ CURL *easy = NULL;
+ int res = 0;
+
+ start_test_timing();
+
+ global_init(CURL_GLOBAL_ALL);
+
+ multi_init(multi);
+
+ easy_init(easy);
+
+ multi_setopt(multi, CURLMOPT_PIPELINING, 1L);
+
+ easy_setopt(easy, CURLOPT_WRITEFUNCTION, fwrite);
+ easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
+ easy_setopt(easy, CURLOPT_URL, URL);
+
+ res_multi_add_handle(multi, easy);
+ if(res) {
+ printf("curl_multi_add_handle() 1 failed\n");
+ goto test_cleanup;
+ }
+
+ res = perform(multi);
+ if(res) {
+ printf("retrieve 1 failed\n");
+ goto test_cleanup;
+ }
+
+ curl_multi_remove_handle(multi, easy);
+
+ curl_easy_reset(easy);
+
+ easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
+ easy_setopt(easy, CURLOPT_URL, libtest_arg2);
+
+ res_multi_add_handle(multi, easy);
+ if(res) {
+ printf("curl_multi_add_handle() 2 failed\n");
+ goto test_cleanup;
+ }
+
+ res = perform(multi);
+ if(res) {
+ printf("retrieve 2 failed\n");
+ goto test_cleanup;
+ }
+
+ curl_multi_remove_handle(multi, easy);
+
+test_cleanup:
+
+ /* undocumented cleanup sequence - type UB */
+
+ curl_easy_cleanup(easy);
+ curl_multi_cleanup(multi);
+ curl_global_cleanup();
+
+ printf("Finished!\n");
+
+ return res;
+}
diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c
index bcbaa481c..94a26a4b7 100644
--- a/tests/libtest/lib541.c
+++ b/tests/libtest/lib541.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -97,7 +97,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_READDATA, hd_src);
/* Now run off and do what you've been told! */
- curl_easy_perform(curl);
+ res = curl_easy_perform(curl);
/* and now upload the exact same again, but without rewinding so it already
is at end of file */
diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c
index 2e51b99c1..e9415c432 100644
--- a/tests/libtest/lib557.c
+++ b/tests/libtest/lib557.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -122,7 +122,7 @@ static struct curloff_st co_test[COFFT_TESTS_ARRSZ];
static int test_unsigned_short_formatting(void)
{
int i, j;
- int num_ushort_tests = 0;
+ int num_ushort_tests;
int failed = 0;
#if (SIZEOF_SHORT == 1)
@@ -229,7 +229,7 @@ static int test_unsigned_short_formatting(void)
static int test_signed_short_formatting(void)
{
int i, j;
- int num_sshort_tests = 0;
+ int num_sshort_tests;
int failed = 0;
#if (SIZEOF_SHORT == 1)
@@ -399,7 +399,7 @@ static int test_signed_short_formatting(void)
static int test_unsigned_int_formatting(void)
{
int i, j;
- int num_uint_tests = 0;
+ int num_uint_tests;
int failed = 0;
#if (SIZEOF_INT == 2)
@@ -549,7 +549,7 @@ static int test_unsigned_int_formatting(void)
static int test_signed_int_formatting(void)
{
int i, j;
- int num_sint_tests = 0;
+ int num_sint_tests;
int failed = 0;
#if (SIZEOF_INT == 2)
@@ -777,7 +777,7 @@ static int test_signed_int_formatting(void)
static int test_unsigned_long_formatting(void)
{
int i, j;
- int num_ulong_tests = 0;
+ int num_ulong_tests;
int failed = 0;
#if (SIZEOF_LONG == 2)
@@ -926,7 +926,7 @@ static int test_unsigned_long_formatting(void)
static int test_signed_long_formatting(void)
{
int i, j;
- int num_slong_tests = 0;
+ int num_slong_tests;
int failed = 0;
#if (SIZEOF_LONG == 2)
@@ -1154,7 +1154,7 @@ static int test_signed_long_formatting(void)
static int test_curl_off_t_formatting(void)
{
int i, j;
- int num_cofft_tests = 0;
+ int num_cofft_tests;
int failed = 0;
#if (SIZEOF_CURL_OFF_T == 2)
diff --git a/tests/libtest/lib569.c b/tests/libtest/lib569.c
index 80116dad3..9c25db45d 100644
--- a/tests/libtest/lib569.c
+++ b/tests/libtest/lib569.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,8 +39,9 @@ int test(char *URL)
char *rtsp_session_id;
int request = 1;
int i;
+ FILE *idfile = NULL;
- FILE *idfile = fopen(libtest_arg2, "wb");
+ idfile = fopen(libtest_arg2, "wb");
if(idfile == NULL) {
fprintf(stderr, "couldn't open the Session ID File\n");
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib571.c b/tests/libtest/lib571.c
index 002617878..c048747d9 100644
--- a/tests/libtest/lib571.c
+++ b/tests/libtest/lib571.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -104,8 +104,9 @@ int test(char *URL)
CURL *curl;
char *stream_uri = NULL;
int request = 1;
+ FILE *protofile = NULL;
- FILE *protofile = fopen(libtest_arg2, "wb");
+ protofile = fopen(libtest_arg2, "wb");
if(protofile == NULL) {
fprintf(stderr, "Couldn't open the protocol dump file\n");
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib661.c b/tests/libtest/lib661.c
deleted file mode 100644
index a4f2c8e5c..000000000
--- a/tests/libtest/lib661.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-#include "memdebug.h"
-
-int test(char *URL)
-{
- CURLcode res;
- CURL *curl = NULL;
- char *newURL = NULL;
- struct curl_slist *slist = NULL;
-
- if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
- fprintf(stderr, "curl_global_init() failed\n");
- return TEST_ERR_MAJOR_BAD;
- }
-
- curl = curl_easy_init();
- if(!curl) {
- fprintf(stderr, "curl_easy_init() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- /* test: CURLFTPMETHOD_SINGLECWD with absolute path should
- skip CWD to entry path */
- newURL = aprintf("%s/folderA/661", URL);
- test_setopt(curl, CURLOPT_URL, newURL);
- test_setopt(curl, CURLOPT_VERBOSE, 1L);
- test_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
- res = curl_easy_perform(curl);
-
- free(newURL);
- newURL = aprintf("%s/folderB/661", URL);
- test_setopt(curl, CURLOPT_URL, newURL);
- res = curl_easy_perform(curl);
-
- /* test: CURLFTPMETHOD_NOCWD with absolute path should
- never emit CWD (for both new and reused easy handle) */
- curl_easy_cleanup(curl);
- curl = curl_easy_init();
- if(!curl) {
- fprintf(stderr, "curl_easy_init() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- free(newURL);
- newURL = aprintf("%s/folderA/661", URL);
- test_setopt(curl, CURLOPT_URL, newURL);
- test_setopt(curl, CURLOPT_VERBOSE, 1L);
- test_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
- res = curl_easy_perform(curl);
-
- /* curve ball: CWD /folderB before reusing connection with _NOCWD */
- free(newURL);
- newURL = aprintf("%s/folderB/661", URL);
- test_setopt(curl, CURLOPT_URL, newURL);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
- res = curl_easy_perform(curl);
-
- free(newURL);
- newURL = aprintf("%s/folderA/661", URL);
- test_setopt(curl, CURLOPT_URL, newURL);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
- res = curl_easy_perform(curl);
-
- /* test: CURLFTPMETHOD_NOCWD with home-relative path should
- not emit CWD for first FTP access after login */
- curl_easy_cleanup(curl);
- curl = curl_easy_init();
- if(!curl) {
- fprintf(stderr, "curl_easy_init() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- slist = curl_slist_append(NULL, "SYST");
- if(slist == NULL) {
- fprintf(stderr, "curl_slist_append() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- test_setopt(curl, CURLOPT_URL, URL);
- test_setopt(curl, CURLOPT_VERBOSE, 1L);
- test_setopt(curl, CURLOPT_NOBODY, 1L);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
- test_setopt(curl, CURLOPT_QUOTE, slist);
- res = curl_easy_perform(curl);
-
- /* test: CURLFTPMETHOD_SINGLECWD with home-relative path should
- not emit CWD for first FTP access after login */
- curl_easy_cleanup(curl);
- curl = curl_easy_init();
- if(!curl) {
- fprintf(stderr, "curl_easy_init() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- test_setopt(curl, CURLOPT_URL, URL);
- test_setopt(curl, CURLOPT_VERBOSE, 1L);
- test_setopt(curl, CURLOPT_NOBODY, 1L);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
- test_setopt(curl, CURLOPT_QUOTE, slist);
- res = curl_easy_perform(curl);
-
- /* test: CURLFTPMETHOD_NOCWD with home-relative path should
- not emit CWD for second FTP access when not needed +
- bonus: see if path buffering survives curl_easy_reset() */
- curl_easy_reset(curl);
- test_setopt(curl, CURLOPT_URL, URL);
- test_setopt(curl, CURLOPT_VERBOSE, 1L);
- test_setopt(curl, CURLOPT_NOBODY, 1L);
- test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
- test_setopt(curl, CURLOPT_QUOTE, slist);
- res = curl_easy_perform(curl);
-
-
-test_cleanup:
-
- curl_slist_free_all(slist);
- free(newURL);
- curl_easy_cleanup(curl);
- curl_global_cleanup();
-
- return (int)res;
-}
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
index f4add1a02..fb1401a53 100755
--- a/tests/libtest/mk-lib1521.pl
+++ b/tests/libtest/mk-lib1521.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2017 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -205,6 +205,17 @@ while(<STDIN>) {
print " (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
print "${pref} stringpointerextra);\n$check";
}
+ elsif(($name eq "HTTPHEADER") ||
+ ($name eq "POSTQUOTE") ||
+ ($name eq "PREQUOTE") ||
+ ($name eq "HTTP200ALIASES") ||
+ ($name eq "TELNETOPTIONS") ||
+ ($name eq "MAIL_RCPT") ||
+ ($name eq "RESOLVE") ||
+ ($name eq "PROXYHEADER") ||
+ ($name eq "QUOTE")) {
+ print "${pref} slist);\n$check";
+ }
elsif($name eq "HTTPPOST") {
print "${pref} httppost);\n$check";
}
@@ -219,9 +230,6 @@ while(<STDIN>) {
}
print "${pref} NULL);\n$check";
}
- elsif($type eq "SLISTPOINT") {
- print "${pref} slist);\n$check";
- }
elsif($type eq "FUNCTIONPOINT") {
if($name =~ /([^ ]*)FUNCTION/) {
my $l=lc($1);
diff --git a/tests/manpage-scan.pl b/tests/manpage-scan.pl
index ba6577c18..b6864c857 100755
--- a/tests/manpage-scan.pl
+++ b/tests/manpage-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -138,7 +138,6 @@ my %opts = (
'-N, --no-buffer' => 1,
'--no-sessionid' => 1,
'--no-keepalive' => 1,
- '--no-progress-meter' => 1,
# pretend these options without -no exist in curl.1 and tool_help.c
'--alpn' => 6,
@@ -148,7 +147,6 @@ my %opts = (
'--keepalive' => 6,
'-N, --buffer' => 6,
'--sessionid' => 6,
- '--progress-meter' => 6,
# deprecated options do not need to be in tool_help.c nor curl.1
'--krb4' => 6,
diff --git a/tests/manpage-syntax.pl b/tests/manpage-syntax.pl
deleted file mode 100644
index 7a7137a70..000000000
--- a/tests/manpage-syntax.pl
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env perl
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-#
-# Scan man page(s) and detect some simple and yet common formatting mistakes.
-#
-# Output all deviances to stderr.
-
-use strict;
-use warnings;
-
-# we may get the dir roots pointed out
-my @manpages=@ARGV;
-my $errors = 0;
-
-sub scanmanpage {
- my ($file) = @_;
-
- print "Check $file\n";
- open(M, "<$file") || die "no such file: $file";
- my $line = 1;
- while(<M>) {
- if($_ =~ /^\'/) {
- print STDERR "$file:$line line starts with single quote!\n";
- $errors++;
- }
- if($_ =~ /\\f([BI])(.*)/) {
- my ($format, $rest) = ($1, $2);
- if($rest !~ /\\fP/) {
- print STDERR "$file:$line missing \\f${format} terminator!\n";
- $errors++;
- }
- }
- $line++;
- }
- close(M);
-}
-
-
-for my $m (@manpages) {
- scanmanpage($m);
-}
-
-exit $errors;
diff --git a/tests/python_dependencies/impacket/nmb.py b/tests/python_dependencies/impacket/nmb.py
index 791377bc2..dc8777e65 100644
--- a/tests/python_dependencies/impacket/nmb.py
+++ b/tests/python_dependencies/impacket/nmb.py
@@ -1,5 +1,3 @@
-from __future__ import print_function
-from __future__ import absolute_import
# Copyright (c) 2003-2016 CORE Security Technologies
#
# This software is provided under under a slightly modified version
@@ -42,7 +40,7 @@ from random import randint
from struct import pack, unpack
import time
-from .structure import Structure
+from structure import Structure
CVS_REVISION = '$Revision: 526 $'
@@ -456,7 +454,7 @@ class NetBIOS:
except socket.error:
pass
if not has_bind:
- raise NetBIOSError( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN)
+ raise NetBIOSError, ( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN )
self.__sock = s
# Set the default NetBIOS domain nameserver.
@@ -533,15 +531,15 @@ class NetBIOS:
if res.get_rcode() == 0x03:
return None
else:
- raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
+ raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
if res.get_ancount() != 1:
raise NetBIOSError( 'Malformed response')
return NBPositiveNameQueryResponse(res.get_answers())
- except select.error as ex:
+ except select.error, ex:
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
+ raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
raise
@@ -572,25 +570,25 @@ class NetBIOS:
else:
try:
data, _ = self.__sock.recvfrom(65536, 0)
- except Exception as e:
- raise NetBIOSError("recvfrom error: %s" % str(e))
+ except Exception, e:
+ raise NetBIOSError, "recvfrom error: %s" % str(e)
self.__sock.close()
res = NetBIOSPacket(data)
if res.get_trn_id() == p.get_trn_id():
if res.get_rcode():
if res.get_rcode() == 0x03:
# I'm just guessing here
- raise NetBIOSError("Cannot get data from server")
+ raise NetBIOSError, "Cannot get data from server"
else:
- raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
+ raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
answ = NBNodeStatusResponse(res.get_answers())
self.mac = answ.get_mac()
return answ.get_node_names()
- except select.error as ex:
+ except select.error, ex:
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
- except socket.error as ex:
- raise NetBIOSError('Connection error: %s' % str(ex))
+ raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
+ except socket.error, ex:
+ raise NetBIOSError, 'Connection error: %s' % str(ex)
# Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
def encode_name(name, type, scope):
@@ -843,7 +841,7 @@ class NetBIOSTCPSession(NetBIOSSession):
af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_STREAM)[0]
sock = socket.socket(af, socktype, proto)
sock.connect(sa)
- except socket.error as e:
+ except socket.error, e:
raise socket.error("Connection error (%s:%s)" % (peer[0], peer[1]), e)
return sock
@@ -868,7 +866,7 @@ class NetBIOSTCPSession(NetBIOSSession):
while 1:
p = self.recv_packet(timeout)
if p.get_type() == NETBIOS_SESSION_NEGATIVE_RESPONSE:
- raise NetBIOSError( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]))
+ raise NetBIOSError, ( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]) )
elif p.get_type() == NETBIOS_SESSION_POSITIVE_RESPONSE:
break
else:
@@ -898,13 +896,13 @@ class NetBIOSTCPSession(NetBIOSSession):
received = self._sock.recv(bytes_left)
if len(received) == 0:
- raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
+ raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
data = data + received
bytes_left = read_length - len(data)
- except select.error as ex:
+ except select.error, ex:
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
+ raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
return data
@@ -921,13 +919,13 @@ class NetBIOSTCPSession(NetBIOSSession):
received = self._sock.recv(bytes_left)
if len(received) == 0:
- raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
+ raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
data = data + received
bytes_left = read_length - len(data)
- except select.error as ex:
+ except select.error, ex:
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
+ raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
return data
@@ -976,7 +974,7 @@ def main():
n = get_netbios_host_by_name("some-host")
- print(n)
+ print n
if __name__ == '__main__':
main()
diff --git a/tests/python_dependencies/impacket/ntlm.py b/tests/python_dependencies/impacket/ntlm.py
index 8845e9d50..8376644bd 100644
--- a/tests/python_dependencies/impacket/ntlm.py
+++ b/tests/python_dependencies/impacket/ntlm.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
# Copyright (c) 2003-2016 CORE Security Technologies:
#
# This software is provided under under a slightly modified version
@@ -18,8 +17,8 @@ from impacket.structure import Structure
from impacket import LOG
-# This is important. NTLMv2 is not negotiated by the client or server.
-# It is used if set locally on both sides. Change this item if you don't want to use
+# This is important. NTLMv2 is not negotiated by the client or server.
+# It is used if set locally on both sides. Change this item if you don't want to use
# NTLMv2 by default and fall back to NTLMv1 (with EXTENDED_SESSION_SECURITY or not)
# Check the following links:
# http://davenport.sourceforge.net/ntlm.html
@@ -210,7 +209,7 @@ class AV_PAIRS():
self.fields[key] = (len(value),value)
def __getitem__(self, key):
- if key in self.fields:
+ if self.fields.has_key(key):
return self.fields[key]
return None
@@ -237,16 +236,16 @@ class AV_PAIRS():
def dump(self):
for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
+ print "%s: {%r}" % (i,self[i])
def getData(self):
- if NTLMSSP_AV_EOL in self.fields:
+ if self.fields.has_key(NTLMSSP_AV_EOL):
del self.fields[NTLMSSP_AV_EOL]
ans = ''
for i in self.fields.keys():
ans+= struct.pack('<HH', i, self[i][0])
ans+= self[i][1]
-
+
# end with a NTLMSSP_AV_EOL
ans += struct.pack('<HH', NTLMSSP_AV_EOL, 0)
@@ -261,7 +260,7 @@ class NTLMAuthMixin:
minor_v = struct.unpack('B',self['os_version'][1])[0]
build_v = struct.unpack('H',self['os_version'][2:4])
return (mayor_v,minor_v,build_v)
-
+
class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
structure = (
@@ -277,7 +276,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
('os_version',':'),
('host_name',':'),
('domain_name',':'))
-
+
def __init__(self):
Structure.__init__(self)
self['flags']= (
@@ -294,7 +293,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
self['host_name']=''
self['domain_name']=''
self['os_version']=''
-
+
def getData(self):
if len(self.fields['host_name']) > 0:
self['flags'] |= NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
@@ -343,7 +342,7 @@ class NTLMAuthChallenge(Structure):
('TargetInfoFields_len','<H-TargetInfoFields'),
('TargetInfoFields_max_len','<H-TargetInfoFields'),
('TargetInfoFields_offset','<L'),
- ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
+ ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
('Version',':'),
('domain_name',':'),
('TargetInfoFields',':'))
@@ -366,11 +365,11 @@ class NTLMAuthChallenge(Structure):
self['TargetInfoFields'] = self['TargetInfoFields'][:self['TargetInfoFields_len']]
# We gotta process the TargetInfoFields
#if self['TargetInfoFields_len'] > 0:
- # av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
+ # av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
# self['TargetInfoFields'] = av_pairs
return self
-
+
class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
structure = (
@@ -395,7 +394,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
('session_key_max_len','<H-session_key'),
('session_key_offset','<L'),
('flags','<L'),
- ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
+ ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
('Version',':=""'),
('MICLen','_-MIC','self.checkMIC(self["flags"])'),
('MIC',':=""'),
@@ -425,7 +424,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
# NTLMSSP_TARGET |
0)
# Here we do the stuff
- if username and ( lmhash != '' or nthash != ''):
+ if username and ( lmhash != '' or nthash != ''):
self['lanman'] = get_ntlmv1_response(lmhash, challenge)
self['ntlm'] = get_ntlmv1_response(nthash, challenge)
elif (username and password):
@@ -451,7 +450,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
return 0
return 16
-
+
def getData(self):
self['domain_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])
self['user_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])+len(self['domain_name'])
@@ -464,7 +463,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
def fromString(self,data):
Structure.fromString(self,data)
# [MS-NLMP] page 27
- # Payload data can be present in any order within the Payload field,
+ # Payload data can be present in any order within the Payload field,
# with variable-length padding before or after the data
domain_offset = self['domain_offset']
@@ -479,15 +478,15 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
user_end = self['user_len'] + user_offset
self['user_name'] = data[ user_offset: user_end ]
- ntlm_offset = self['ntlm_offset']
- ntlm_end = self['ntlm_len'] + ntlm_offset
+ ntlm_offset = self['ntlm_offset']
+ ntlm_end = self['ntlm_len'] + ntlm_offset
self['ntlm'] = data[ ntlm_offset : ntlm_end ]
- lanman_offset = self['lanman_offset']
+ lanman_offset = self['lanman_offset']
lanman_end = self['lanman_len'] + lanman_offset
self['lanman'] = data[ lanman_offset : lanman_end]
- #if len(data) >= 36:
+ #if len(data) >= 36:
# self['os_version'] = data[32:36]
#else:
# self['os_version'] = ''
@@ -608,11 +607,11 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
# Let's start with the original flags sent in the type1 message
responseFlags = type1['flags']
- # Token received and parsed. Depending on the authentication
+ # Token received and parsed. Depending on the authentication
# method we will create a valid ChallengeResponse
ntlmChallengeResponse = NTLMAuthChallengeResponse(user, password, ntlmChallenge['challenge'])
- clientChallenge = "".join([random.choice(string.digits+string.letters) for i in range(8)])
+ clientChallenge = "".join([random.choice(string.digits+string.letters) for i in xrange(8)])
serverName = ntlmChallenge['TargetInfoFields']
@@ -648,7 +647,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
if ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH:
# not exactly what I call random tho :\
# exportedSessionKey = this is the key we should use to sign
- exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in range(16)])
+ exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in xrange(16)])
#exportedSessionKey = "A"*16
#print "keyExchangeKey %r" % keyExchangeKey
# Let's generate the right session key based on the challenge flags
@@ -678,7 +677,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
ntlmChallengeResponse['domain_name'] = domain.encode('utf-16le')
ntlmChallengeResponse['lanman'] = lmResponse
ntlmChallengeResponse['ntlm'] = ntResponse
- if encryptedRandomSessionKey is not None:
+ if encryptedRandomSessionKey is not None:
ntlmChallengeResponse['session_key'] = encryptedRandomSessionKey
return ntlmChallengeResponse, exportedSessionKey
@@ -689,13 +688,13 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
def generateSessionKeyV1(password, lmhash, nthash):
if POW:
hash = POW.Digest(POW.MD4_DIGEST)
- else:
+ else:
hash = MD4.new()
hash.update(NTOWFv1(password, lmhash, nthash))
return hash.digest()
-
+
def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='', use_ntlmv2 = USE_NTLMv2):
- if (user == '' and password == ''):
+ if (user == '' and password == ''):
# Special case for anonymous authentication
lmResponse = ''
ntResponse = ''
@@ -714,7 +713,7 @@ def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, d
else:
ntResponse = get_ntlmv1_response(nthash,serverChallenge)
lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
-
+
sessionBaseKey = generateSessionKeyV1(password, lmhash, nthash)
return ntResponse, lmResponse, sessionBaseKey
@@ -728,7 +727,7 @@ def compute_lmhash(password):
def NTOWFv1(password, lmhash = '', nthash=''):
if nthash != '':
return nthash
- return compute_nthash(password)
+ return compute_nthash(password)
def LMOWFv1(password, lmhash = '', nthash=''):
if lmhash != '':
@@ -739,15 +738,13 @@ def compute_nthash(password):
# This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
try:
password = unicode(password).encode('utf_16le')
- except NameError: # unicode() was removed in Python 3
- password = str(password).encode('utf_16le')
except UnicodeDecodeError:
import sys
password = password.decode(sys.getfilesystemencoding()).encode('utf_16le')
if POW:
hash = POW.Digest(POW.MD4_DIGEST)
- else:
+ else:
hash = MD4.new()
hash.update(password)
return hash.digest()
@@ -783,7 +780,7 @@ def MAC(flags, handle, signingKey, seqNum, message):
messageSignature['SeqNum'] = handle('\x00\x00\x00\x00')
messageSignature['SeqNum'] = struct.unpack('<i',messageSignature['SeqNum'])[0] ^ seqNum
messageSignature['RandomPad'] = 0
-
+
return messageSignature
def SEAL(flags, signingKey, sealingKey, messageToSign, messageToEncrypt, seqNum, handle):
@@ -866,7 +863,7 @@ def KXKEY(flags, sessionBaseKey, lmChallengeResponse, serverChallenge, password,
raise "Can't create a valid KXKEY!"
return keyExchangeKey
-
+
def hmac_md5(key, data):
if POW:
h = POW.Hmac(POW.MD5_DIGEST, key)
@@ -881,7 +878,7 @@ def hmac_md5(key, data):
def NTOWFv2( user, password, domain, hash = ''):
if hash != '':
- theHash = hash
+ theHash = hash
else:
theHash = compute_nthash(password)
return hmac_md5(theHash, user.upper().encode('utf-16le') + domain.encode('utf-16le'))
@@ -910,7 +907,7 @@ def computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName,
#aTime = '\x00'*8
av_pairs[NTLMSSP_AV_TIME] = aTime
serverName = av_pairs.getData()
-
+
######################
#aTime = '\x00'*8
######################
@@ -940,20 +937,20 @@ class NTLM_HTTP(object):
if msg_64 != '':
msg = base64.b64decode(msg_64[5:]) # Remove the 'NTLM '
msg_type = ord(msg[8])
-
+
for _cls in NTLM_HTTP.__subclasses__():
if msg_type == _cls.MSG_TYPE:
instance = _cls()
instance.fromString(msg)
return instance
-
+
class NTLM_HTTP_AuthRequired(NTLM_HTTP):
commonHdr = ()
# Message 0 means the first HTTP request e.g. 'GET /bla.png'
MSG_TYPE = 0
- def fromString(self,data):
+ def fromString(self,data):
pass
@@ -971,3 +968,4 @@ class NTLM_HTTP_AuthChallengeResponse(NTLM_HTTP, NTLMAuthChallengeResponse):
def __init__(self):
NTLMAuthChallengeResponse.__init__(self)
+
diff --git a/tests/python_dependencies/impacket/smb.py b/tests/python_dependencies/impacket/smb.py
index c4ea6fc68..95efb2c63 100644
--- a/tests/python_dependencies/impacket/smb.py
+++ b/tests/python_dependencies/impacket/smb.py
@@ -629,9 +629,9 @@ class SharedFile:
@staticmethod
def __convert_smbtime(t):
x = t >> 32
- y = t & 0xffffffff
+ y = t & 0xffffffffL
geo_cal_offset = 11644473600.0 # = 369.0 * 365.25 * 24 * 60 * 60 - (3.0 * 24 * 60 * 60 + 6.0 * 60 * 60)
- return (x * 4.0 * (1 << 30) + (y & 0xfff00000)) * 1.0e-7 - geo_cal_offset
+ return (x * 4.0 * (1 << 30) + (y & 0xfff00000L)) * 1.0e-7 - geo_cal_offset
# Contain information about a SMB machine
@@ -676,12 +676,12 @@ class NewSMBPacket(Structure):
def __init__(self, **kargs):
Structure.__init__(self, **kargs)
- if ('Flags2' in self.fields) is False:
+ if self.fields.has_key('Flags2') is False:
self['Flags2'] = 0
- if ('Flags1' in self.fields) is False:
+ if self.fields.has_key('Flags1') is False:
self['Flags1'] = 0
- if 'data' not in kargs:
+ if not kargs.has_key('data'):
self['Data'] = []
def addCommand(self, command):
@@ -709,9 +709,9 @@ class NewSMBPacket(Structure):
return 1
elif self.isMoreProcessingRequired():
return 1
- raise SessionError("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
+ raise SessionError, ("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
else:
- raise UnsupportedFeature("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
+ raise UnsupportedFeature, ("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
class SMBCommand(Structure):
@@ -2550,7 +2550,7 @@ class SMB:
if s.get_error_class() == 0x00 and s.get_error_code() == 0x00:
return 1
else:
- raise SessionError( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS)
+ raise SessionError, ( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS )
else:
break
return 0
@@ -2583,7 +2583,7 @@ class SMB:
self.__server_name = self._dialects_data['ServerName']
if self._dialects_parameters['DialectIndex'] == 0xffff:
- raise UnsupportedFeature("Remote server does not know NT LM 0.12")
+ raise UnsupportedFeature,"Remote server does not know NT LM 0.12"
return 1
else:
return 0
@@ -2734,7 +2734,7 @@ class SMB:
self._SigningSessionKey = key
def get_encryption_key(self):
- if 'Challenge' in self._dialects_data.fields:
+ if self._dialects_data.fields.has_key('Challenge'):
return self._dialects_data['Challenge']
else:
return None
@@ -3241,7 +3241,7 @@ class SMB:
pass
# Parse Version to know the target Operating system name. Not provided elsewhere anymore
- if 'Version' in ntlmChallenge.fields:
+ if ntlmChallenge.fields.has_key('Version'):
version = ntlmChallenge['Version']
if len(version) >= 4:
diff --git a/tests/python_dependencies/impacket/smb3.py b/tests/python_dependencies/impacket/smb3.py
index d81c7e117..5548e4b0c 100644
--- a/tests/python_dependencies/impacket/smb3.py
+++ b/tests/python_dependencies/impacket/smb3.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
# Copyright (c) 2003-2016 CORE Security Technologies
#
# This software is provided under under a slightly modified version
@@ -232,13 +231,13 @@ class SMB3:
self.negotiateSession(preferredDialect)
def printStatus(self):
- print("CONNECTION")
+ print "CONNECTION"
for i in self._Connection.items():
- print("%-40s : %s" % i)
- print()
- print("SESSION")
+ print "%-40s : %s" % i
+ print
+ print "SESSION"
for i in self._Session.items():
- print("%-40s : %s" % i)
+ print "%-40s : %s" % i
def getServerName(self):
return self._Session['ServerName']
@@ -309,7 +308,7 @@ class SMB3:
packet['SessionID'] = self._Session['SessionID']
# Default the credit charge to 1 unless set by the caller
- if ('CreditCharge' in packet.fields) is False:
+ if packet.fields.has_key('CreditCharge') is False:
packet['CreditCharge'] = 1
# Standard credit request after negotiating protocol
@@ -319,7 +318,7 @@ class SMB3:
messageId = packet['MessageID']
if self._Session['SigningActivated'] is True and self._Connection['SequenceWindow'] > 2:
- if packet['TreeID'] > 0 and (packet['TreeID'] in self._Session['TreeConnectTable']) is True:
+ if packet['TreeID'] > 0 and self._Session['TreeConnectTable'].has_key(packet['TreeID']) is True:
if self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is False:
packet['Flags'] = SMB2_FLAGS_SIGNED
self.signSMB(packet)
@@ -351,7 +350,7 @@ class SMB3:
def recvSMB(self, packetID = None):
# First, verify we don't have the packet already
- if packetID in self._Connection['OutstandingResponses']:
+ if self._Connection['OutstandingResponses'].has_key(packetID):
return self._Connection['OutstandingResponses'].pop(packetID)
data = self._NetBIOSSession.recv_packet(self._timeout)
@@ -728,7 +727,7 @@ class SMB3:
pass
# Parse Version to know the target Operating system name. Not provided elsewhere anymore
- if 'Version' in ntlmChallenge.fields:
+ if ntlmChallenge.fields.has_key('Version'):
version = ntlmChallenge['Version']
if len(version) >= 4:
@@ -786,7 +785,7 @@ class SMB3:
#print self._Session['TreeConnectTable']
share = share.split('\\')[-1]
- if share in self._Session['TreeConnectTable']:
+ if self._Session['TreeConnectTable'].has_key(share):
# Already connected, no need to reconnect
treeEntry = self._Session['TreeConnectTable'][share]
treeEntry['NumberOfUses'] += 1
@@ -838,10 +837,10 @@ class SMB3:
return packet['TreeID']
def disconnectTree(self, treeId):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if treeId in self._Session['TreeConnectTable']:
+ if self._Session['TreeConnectTable'].has_key(treeId):
# More than 1 use? descrease it and return, if not, send the packet
if self._Session['TreeConnectTable'][treeId]['NumberOfUses'] > 1:
treeEntry = self._Session['TreeConnectTable'][treeId]
@@ -863,7 +862,7 @@ class SMB3:
return True
def create(self, treeId, fileName, desiredAccess, shareMode, creationOptions, creationDisposition, fileAttributes, impersonationLevel = SMB2_IL_IMPERSONATION, securityFlags = 0, oplockLevel = SMB2_OPLOCK_LEVEL_NONE, createContexts = None):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
fileName = string.replace(fileName, '/', '\\')
@@ -886,7 +885,7 @@ class SMB3:
# Is this file NOT on the root directory?
if len(fileName.split('\\')) > 2:
parentDir = ntpath.dirname(pathName)
- if parentDir in self.GlobalFileTable:
+ if self.GlobalFileTable.has_key(parentDir):
LOG.critical("Don't know what to do now! :-o")
raise
else:
@@ -958,9 +957,9 @@ class SMB3:
return str(createResponse['FileID'])
def close(self, treeId, fileId):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -989,9 +988,9 @@ class SMB3:
# This function should NOT be used for reading files directly, but another higher
# level function should be used that will break the read into smaller pieces
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1031,9 +1030,9 @@ class SMB3:
# This function should NOT be used for writing directly to files, but another higher
# level function should be used that will break the writes into smaller pieces
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1072,9 +1071,9 @@ class SMB3:
return bytesWritten
def queryDirectory(self, treeId, fileId, searchString = '*', resumeIndex = 0, informationClass = FILENAMES_INFORMATION, maxBufferSize = None, enumRestart = False, singleEntry = False):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1125,12 +1124,12 @@ class SMB3:
self.sendSMB(packet)
def ioctl(self, treeId, fileId = None, ctlCode = -1, flags = 0, inputBlob = '', maxInputResponse = None, maxOutputResponse = None, waitAnswer = 1):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
if fileId is None:
fileId = '\xff'*16
else:
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1166,9 +1165,9 @@ class SMB3:
return smbIoctlResponse['Buffer']
def flush(self,treeId, fileId):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1187,9 +1186,9 @@ class SMB3:
return True
def lock(self, treeId, fileId, locks, lockSequence = 0):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1249,9 +1248,9 @@ class SMB3:
return True
def queryInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0, flags = 0 ):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1281,9 +1280,9 @@ class SMB3:
return queryResponse['Buffer']
def setInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0 ):
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
+ if self._Session['OpenTable'].has_key(fileId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
packet = self.SMB_PACKET()
@@ -1386,7 +1385,7 @@ class SMB3:
files.append(smb.SharedFile(fileInfo['CreationTime'],fileInfo['LastAccessTime'],fileInfo['LastChangeTime'],fileInfo['EndOfFile'],fileInfo['AllocationSize'],fileInfo['ExtFileAttributes'],fileInfo['FileName'].decode('utf-16le'), fileInfo['FileName'].decode('utf-16le')))
nextOffset = fileInfo['NextEntryOffset']
res = res[nextOffset:]
- except SessionError as e:
+ except SessionError, e:
if (e.get_error_code()) != STATUS_NO_MORE_FILES:
raise
break
@@ -1513,7 +1512,7 @@ class SMB3:
def waitNamedPipe(self, treeId, pipename, timeout = 5):
pipename = ntpath.basename(pipename)
- if (treeId in self._Session['TreeConnectTable']) is False:
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
raise SessionError(STATUS_INVALID_PARAMETER)
if len(pipename) > 0xffff:
raise SessionError(STATUS_INVALID_PARAMETER)
diff --git a/tests/python_dependencies/impacket/smbserver.py b/tests/python_dependencies/impacket/smbserver.py
index 3473c9f0c..aa795e52e 100644
--- a/tests/python_dependencies/impacket/smbserver.py
+++ b/tests/python_dependencies/impacket/smbserver.py
@@ -54,12 +54,6 @@ from impacket.nt_errors import STATUS_NO_MORE_FILES, STATUS_NETWORK_NAME_DELETED
STATUS_SMB_BAD_UID = 0x005B0002
STATUS_SMB_BAD_TID = 0x00050002
-try:
- unicode # Python 2
-except NameError:
- unicode = str # Python 3
-
-
# Utility functions
# and general functions.
# There are some common functions that can be accessed from more than one SMB
@@ -86,7 +80,7 @@ def outputToJohnFormat(challenge, username, domain, lmresponse, ntresponse):
else:
# NTLMv1
ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
- except Exception as e:
+ except Exception, e:
LOG.error("outputToJohnFormat: %s" % e)
pass
@@ -189,7 +183,7 @@ def openFile(path,fileName, accessMode, fileAttributes, openMode):
if sys.platform == 'win32':
mode |= os.O_BINARY
fid = os.open(pathName, mode)
- except Exception as e:
+ except Exception, e:
LOG.error("openFile: %s,%s" % (pathName, mode) ,e)
fid = 0
errorCode = STATUS_ACCESS_DENIED
@@ -448,7 +442,7 @@ def queryPathInformation(path, filename, level):
else:
# NOT FOUND
return None, STATUS_OBJECT_NAME_NOT_FOUND
- except Exception as e:
+ except Exception, e:
LOG.error('queryPathInfo: %s' % e)
raise
@@ -492,7 +486,7 @@ class TRANSCommands:
# (beto) If offset == 0 it crashes explorer.exe on windows 7
entry['RemarkOffsetLow'] = 20 * len(shares) + len(tailData)
respData += entry.getData()
- if 'comment' in shares[i]:
+ if shares[i].has_key('comment'):
tailData += shares[i]['comment'] + '\x00'
else:
tailData += '\x00'
@@ -517,7 +511,7 @@ class TRANSCommands:
shareInfo['NetworkName'] = request['ShareName'].upper() + '\x00'
shareInfo['Type'] = int(share['share type'])
respData = shareInfo.getData()
- if 'comment' in share:
+ if share.has_key('comment'):
shareInfo['RemarkOffsetLow'] = len(respData)
respData += share['comment'] + '\x00'
respParameters['TotalBytesAvailable'] = len(respData)
@@ -544,7 +538,7 @@ class TRANSCommands:
# Extract the FID
fid = struct.unpack('<H', transParameters['Setup'][2:])[0]
- if fid in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(fid):
fileHandle = connData['OpenedFiles'][fid]['FileHandle']
if fileHandle != PIPE_FILE_DESCRIPTOR:
os.write(fileHandle,data)
@@ -572,7 +566,7 @@ class TRANS2Commands:
respData = ''
errorCode = STATUS_SUCCESS
setPathInfoParameters = smb.SMBSetPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
fileName = decodeSMBString(recvPacket['Flags2'], setPathInfoParameters['FileName'])
fileName = os.path.normpath(fileName.replace('\\','/'))
@@ -625,8 +619,8 @@ class TRANS2Commands:
errorCode = STATUS_SUCCESS
setFileInfoParameters = smb.SMBSetFileInformation_Parameters(parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if setFileInfoParameters['FID'] in connData['OpenedFiles']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ if connData['OpenedFiles'].has_key(setFileInfoParameters['FID']):
fileName = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileName']
informationLevel = setFileInfoParameters['InformationLevel']
if informationLevel == smb.SMB_SET_FILE_DISPOSITION_INFO:
@@ -681,8 +675,8 @@ class TRANS2Commands:
queryFileInfoParameters = smb.SMBQueryFileInformation_Parameters(parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if queryFileInfoParameters['FID'] in connData['OpenedFiles']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ if connData['OpenedFiles'].has_key(queryFileInfoParameters['FID']):
fileName = connData['OpenedFiles'][queryFileInfoParameters['FID']]['FileName']
infoRecord, errorCode = queryFileInformation('', fileName, queryFileInfoParameters['InformationLevel'])
@@ -710,11 +704,11 @@ class TRANS2Commands:
queryPathInfoParameters = smb.SMBQueryPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
try:
infoRecord, errorCode = queryPathInformation(path, decodeSMBString(recvPacket['Flags2'], queryPathInfoParameters['FileName']), queryPathInfoParameters['InformationLevel'])
- except Exception as e:
+ except Exception, e:
smbServer.log("queryPathInformation: %s" % e,logging.ERROR)
if infoRecord is not None:
@@ -732,7 +726,7 @@ class TRANS2Commands:
connData = smbServer.getConnectionData(connId)
errorCode = 0
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
data = queryFsInformation(connData['ConnectedShares'][recvPacket['Tid']]['path'], '', struct.unpack('<H',parameters)[0])
smbServer.setConnectionData(connId, connData)
@@ -750,8 +744,8 @@ class TRANS2Commands:
findNext2Parameters = smb.SMBFindNext2_Parameters(flags = recvPacket['Flags2'], data = parameters)
sid = findNext2Parameters['SID']
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if sid in connData['SIDs']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ if connData['SIDs'].has_key(sid):
searchResult = connData['SIDs'][sid]
respParameters = smb.SMBFindNext2Response_Parameters()
endOfSearch = 1
@@ -796,7 +790,7 @@ class TRANS2Commands:
respData = ''
findFirst2Parameters = smb.SMBFindFirst2_Parameters( recvPacket['Flags2'], data = parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
searchResult, searchCount, errorCode = findFirst2(path,
@@ -887,7 +881,7 @@ class SMBCommands:
else:
command = struct.unpack('<H', transParameters['Setup'][:2])[0]
- if command in transCommands:
+ if transCommands.has_key(command):
# Call the TRANS subcommand
setup = ''
parameters = ''
@@ -899,7 +893,7 @@ class SMBCommands:
transData['Trans_Parameters'],
transData['Trans_Data'],
transParameters['MaxDataCount'])
- except Exception as e:
+ except Exception, e:
#print 'Transaction: %s' % e,e
smbServer.log('Transaction: (%r,%s)' % (command, e), logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
@@ -1024,7 +1018,7 @@ class SMBCommands:
# Call the handler for this TRANSACTION
command = NTTransParameters['Function']
- if command in transCommands:
+ if transCommands.has_key(command):
# Call the NT TRANS subcommand
setup = ''
parameters = ''
@@ -1036,7 +1030,7 @@ class SMBCommands:
NTTransData['NT_Trans_Parameters'],
NTTransData['NT_Trans_Data'],
NTTransParameters['MaxDataCount'])
- except Exception as e:
+ except Exception, e:
smbServer.log('NTTransaction: (0x%x,%s)' % (command, e), logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
#raise
@@ -1163,7 +1157,7 @@ class SMBCommands:
# Call the handler for this TRANSACTION
command = struct.unpack('<H', trans2Parameters['Setup'])[0]
- if command in transCommands:
+ if transCommands.has_key(command):
# Call the TRANS2 subcommand
try:
setup, parameters, data, errorCode = transCommands[command](connId,
@@ -1172,7 +1166,7 @@ class SMBCommands:
trans2Data['Trans_Parameters'],
trans2Data['Trans_Data'],
trans2Parameters['MaxDataCount'])
- except Exception as e:
+ except Exception, e:
smbServer.log('Transaction2: (0x%x,%s)' % (command, e), logging.ERROR)
#import traceback
#traceback.print_exc()
@@ -1288,7 +1282,7 @@ class SMBCommands:
comClose = smb.SMBClose_Parameters(SMBCommand['Parameters'])
- if comClose['FID'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(comClose['FID']):
errorCode = STATUS_SUCCESS
fileHandle = connData['OpenedFiles'][comClose['FID']]['FileHandle']
try:
@@ -1296,7 +1290,7 @@ class SMBCommands:
connData['OpenedFiles'][comClose['FID']]['Socket'].close()
elif fileHandle != VOID_FILE_DESCRIPTOR:
os.close(fileHandle)
- except Exception as e:
+ except Exception, e:
smbServer.log("comClose %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1304,7 +1298,7 @@ class SMBCommands:
if connData['OpenedFiles'][comClose['FID']]['DeleteOnClose'] is True:
try:
os.remove(connData['OpenedFiles'][comClose['FID']]['FileName'])
- except Exception as e:
+ except Exception, e:
smbServer.log("comClose %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
del(connData['OpenedFiles'][comClose['FID']])
@@ -1332,7 +1326,7 @@ class SMBCommands:
comWriteParameters = smb.SMBWrite_Parameters(SMBCommand['Parameters'])
comWriteData = smb.SMBWrite_Data(SMBCommand['Data'])
- if comWriteParameters['Fid'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(comWriteParameters['Fid']):
fileHandle = connData['OpenedFiles'][comWriteParameters['Fid']]['FileHandle']
errorCode = STATUS_SUCCESS
try:
@@ -1346,7 +1340,7 @@ class SMBCommands:
sock = connData['OpenedFiles'][comWriteParameters['Fid']]['Socket']
sock.send(comWriteData['Data'])
respParameters['Count'] = comWriteParameters['Count']
- except Exception as e:
+ except Exception, e:
smbServer.log('smbComWrite: %s' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1373,12 +1367,12 @@ class SMBCommands:
comFlush = smb.SMBFlush_Parameters(SMBCommand['Parameters'])
- if comFlush['FID'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(comFlush['FID']):
errorCode = STATUS_SUCCESS
fileHandle = connData['OpenedFiles'][comFlush['FID']]['FileHandle']
try:
os.fsync(fileHandle)
- except Exception as e:
+ except Exception, e:
smbServer.log("comFlush %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1406,7 +1400,7 @@ class SMBCommands:
comCreateDirectoryData= smb.SMBCreateDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
errorCode = STATUS_SUCCESS
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comCreateDirectoryData['DirectoryName']).replace('\\','/'))
@@ -1423,7 +1417,7 @@ class SMBCommands:
else:
try:
os.mkdir(pathName)
- except Exception as e:
+ except Exception, e:
smbServer.log("smbComCreateDirectory: %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1450,7 +1444,7 @@ class SMBCommands:
comRenameData = smb.SMBRename_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
errorCode = STATUS_SUCCESS
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
oldFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['OldFileName']).replace('\\','/'))
@@ -1472,7 +1466,7 @@ class SMBCommands:
else:
try:
os.rename(oldPathName,newPathName)
- except OSError as e:
+ except OSError, e:
smbServer.log("smbComRename: %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1500,7 +1494,7 @@ class SMBCommands:
comDeleteData = smb.SMBDelete_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
errorCode = STATUS_SUCCESS
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteData['FileName']).replace('\\','/'))
@@ -1516,7 +1510,7 @@ class SMBCommands:
else:
try:
os.remove(pathName)
- except OSError as e:
+ except OSError, e:
smbServer.log("smbComDelete: %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1544,7 +1538,7 @@ class SMBCommands:
comDeleteDirectoryData= smb.SMBDeleteDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
errorCode = STATUS_SUCCESS
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteDirectoryData['DirectoryName']).replace('\\','/'))
@@ -1560,7 +1554,7 @@ class SMBCommands:
else:
try:
os.rmdir(pathName)
- except OSError as e:
+ except OSError, e:
smbServer.log("smbComDeleteDirectory: %s" % e,logging.ERROR)
if e.errno == errno.ENOTEMPTY:
errorCode = STATUS_DIRECTORY_NOT_EMPTY
@@ -1599,13 +1593,13 @@ class SMBCommands:
writeAndXData.fromString(SMBCommand['Data'])
- if writeAndX['Fid'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(writeAndX['Fid']):
fileHandle = connData['OpenedFiles'][writeAndX['Fid']]['FileHandle']
errorCode = STATUS_SUCCESS
try:
if fileHandle != PIPE_FILE_DESCRIPTOR:
offset = writeAndX['Offset']
- if 'HighOffset' in writeAndX.fields:
+ if writeAndX.fields.has_key('HighOffset'):
offset += (writeAndX['HighOffset'] << 32)
# If we're trying to write past the file end we just skip the write call (Vista does this)
if os.lseek(fileHandle, 0, 2) >= offset:
@@ -1617,7 +1611,7 @@ class SMBCommands:
respParameters['Count'] = writeAndX['DataLength']
respParameters['Available']= 0xff
- except Exception as e:
+ except Exception, e:
smbServer.log('smbComWriteAndx: %s' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1643,7 +1637,7 @@ class SMBCommands:
comReadParameters = smb.SMBRead_Parameters(SMBCommand['Parameters'])
- if comReadParameters['Fid'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(comReadParameters['Fid']):
fileHandle = connData['OpenedFiles'][comReadParameters['Fid']]['FileHandle']
errorCode = STATUS_SUCCESS
try:
@@ -1657,7 +1651,7 @@ class SMBCommands:
respParameters['Count'] = len(content)
respData['DataLength'] = len(content)
respData['Data'] = content
- except Exception as e:
+ except Exception, e:
smbServer.log('smbComRead: %s ' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1686,13 +1680,13 @@ class SMBCommands:
else:
readAndX = smb.SMBReadAndX_Parameters(SMBCommand['Parameters'])
- if readAndX['Fid'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(readAndX['Fid']):
fileHandle = connData['OpenedFiles'][readAndX['Fid']]['FileHandle']
errorCode = 0
try:
if fileHandle != PIPE_FILE_DESCRIPTOR:
offset = readAndX['Offset']
- if 'HighOffset' in readAndX.fields:
+ if readAndX.fields.has_key('HighOffset'):
offset += (readAndX['HighOffset'] << 32)
os.lseek(fileHandle,offset,0)
content = os.read(fileHandle,readAndX['MaxCount'])
@@ -1704,7 +1698,7 @@ class SMBCommands:
respParameters['DataOffset'] = 59
respParameters['DataCount_Hi'] = 0
respData = content
- except Exception as e:
+ except Exception, e:
smbServer.log('smbComReadAndX: %s ' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -1731,7 +1725,7 @@ class SMBCommands:
queryInformation= smb.SMBQueryInformation_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
fileSize, lastWriteTime, fileAttributes = queryFsInformation(
connData['ConnectedShares'][recvPacket['Tid']]['path'],
decodeSMBString(recvPacket['Flags2'],queryInformation['FileName']))
@@ -1761,7 +1755,7 @@ class SMBCommands:
respData = ''
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
totalUnits, freeUnits = queryDiskInformation(
connData['ConnectedShares'][recvPacket['Tid']]['path'])
@@ -1813,7 +1807,7 @@ class SMBCommands:
respParameters = ''
respData = ''
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['Tid'],connData['ConnectedShares'][recvPacket['Tid']]['shareName']))
del(connData['ConnectedShares'][recvPacket['Tid']])
errorCode = STATUS_SUCCESS
@@ -1860,7 +1854,7 @@ class SMBCommands:
queryInformation2 = smb.SMBQueryInformation2_Parameters(SMBCommand['Parameters'])
errorCode = 0xFF
- if queryInformation2['Fid'] in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(queryInformation2['Fid']):
errorCode = STATUS_SUCCESS
pathName = connData['OpenedFiles'][queryInformation2['Fid']]['FileName']
try:
@@ -1879,7 +1873,7 @@ class SMBCommands:
if os.path.isfile(pathName):
attribs = smb.SMB_FILE_ATTRIBUTE_NORMAL
respParameters['FileAttributes'] = attribs
- except Exception as e:
+ except Exception, e:
smbServer.log('smbComQueryInformation2 %s' % e,logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
@@ -1910,14 +1904,14 @@ class SMBCommands:
# respParameters['VolumeGUID'] = '\x00'
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
# If we have a rootFid, the path is relative to that fid
errorCode = STATUS_SUCCESS
if ntCreateAndXParameters['RootFid'] > 0:
path = connData['OpenedFiles'][ntCreateAndXParameters['RootFid']]['FileName']
LOG.debug("RootFid present %s!" % path)
else:
- if 'path' in connData['ConnectedShares'][recvPacket['Tid']]:
+ if connData['ConnectedShares'][recvPacket['Tid']].has_key('path'):
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
else:
path = 'NONE'
@@ -1953,7 +1947,7 @@ class SMBCommands:
else:
mode |= os.O_CREAT
elif createDisposition & smb.FILE_OPEN == smb.FILE_OPEN:
- if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
+ if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
errorCode = STATUS_NO_SUCH_FILE
if errorCode == STATUS_SUCCESS:
@@ -1975,7 +1969,7 @@ class SMBCommands:
# Let's create the directory
os.mkdir(pathName)
mode = os.O_RDONLY
- except Exception as e:
+ except Exception, e:
smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
if createOptions & smb.FILE_NON_DIRECTORY_FILE == smb.FILE_NON_DIRECTORY_FILE:
@@ -1995,13 +1989,13 @@ class SMBCommands:
else:
if sys.platform == 'win32':
mode |= os.O_BINARY
- if unicode(pathName) in smbServer.getRegisteredNamedPipes():
+ if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
fid = PIPE_FILE_DESCRIPTOR
sock = socket.socket()
sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
else:
fid = os.open(pathName, mode)
- except Exception as e:
+ except Exception, e:
smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
#print e
fid = 0
@@ -2080,7 +2074,7 @@ class SMBCommands:
openAndXData = smb.SMBOpenAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
# Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
openedFile, mode, pathName, errorCode = openFile(path,
decodeSMBString(recvPacket['Flags2'],openAndXData['FileName']),
@@ -2229,7 +2223,7 @@ class SMBCommands:
mechType = blob['MechTypes'][0]
if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
# Nope, do we know it?
- if mechType in MechTypes:
+ if MechTypes.has_key(mechType):
mechStr = MechTypes[mechType]
else:
mechStr = hexlify(mechType)
@@ -2437,7 +2431,7 @@ class SMBCommands:
_dialects_parameters = smb.SMBNTLMDialect_Parameters()
_dialects_data= smb.SMBNTLMDialect_Data()
_dialects_data['Payload'] = ''
- if 'EncryptionKey' in connData:
+ if connData.has_key('EncryptionKey'):
_dialects_data['Challenge'] = connData['EncryptionKey']
_dialects_parameters['ChallengeLength'] = len(str(_dialects_data))
else:
@@ -2469,7 +2463,7 @@ class SMBCommands:
connData['_dialects_data'] = _dialects_data
connData['_dialects_parameters'] = _dialects_parameters
- except Exception as e:
+ except Exception, e:
# No NTLM throw an error
smbServer.log('smbComNegotiate: %s' % e, logging.ERROR)
respSMBCommand['Data'] = struct.pack('<H',0xffff)
@@ -2576,7 +2570,7 @@ class SMB2Commands:
mechType = blob['MechTypes'][0]
if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
# Nope, do we know it?
- if mechType in MechTypes:
+ if MechTypes.has_key(mechType):
mechStr = MechTypes[mechType]
else:
mechStr = hexlify(mechType)
@@ -2787,10 +2781,10 @@ class SMB2Commands:
respSMBCommand['Buffer'] = '\x00'
# Get the Tid associated
- if recvPacket['TreeID'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
# If we have a rootFid, the path is relative to that fid
errorCode = STATUS_SUCCESS
- if 'path' in connData['ConnectedShares'][recvPacket['TreeID']]:
+ if connData['ConnectedShares'][recvPacket['TreeID']].has_key('path'):
path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
else:
path = 'NONE'
@@ -2826,7 +2820,7 @@ class SMB2Commands:
else:
mode |= os.O_CREAT
elif createDisposition & smb2.FILE_OPEN == smb2.FILE_OPEN:
- if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
+ if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
errorCode = STATUS_NO_SUCH_FILE
if errorCode == STATUS_SUCCESS:
@@ -2848,7 +2842,7 @@ class SMB2Commands:
# Let's create the directory
os.mkdir(pathName)
mode = os.O_RDONLY
- except Exception as e:
+ except Exception, e:
smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
if createOptions & smb2.FILE_NON_DIRECTORY_FILE == smb2.FILE_NON_DIRECTORY_FILE:
@@ -2868,13 +2862,13 @@ class SMB2Commands:
else:
if sys.platform == 'win32':
mode |= os.O_BINARY
- if unicode(pathName) in smbServer.getRegisteredNamedPipes():
+ if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
fid = PIPE_FILE_DESCRIPTOR
sock = socket.socket()
sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
else:
fid = os.open(pathName, mode)
- except Exception as e:
+ except Exception, e:
smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
#print e
fid = 0
@@ -2945,14 +2939,14 @@ class SMB2Commands:
if str(closeRequest['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(closeRequest['FileID'])
else:
fileID = str(closeRequest['FileID'])
- if fileID in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(fileID):
errorCode = STATUS_SUCCESS
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
pathName = connData['OpenedFiles'][fileID]['FileName']
@@ -2963,7 +2957,7 @@ class SMB2Commands:
elif fileHandle != VOID_FILE_DESCRIPTOR:
os.close(fileHandle)
infoRecord, errorCode = queryFileInformation(os.path.dirname(pathName), os.path.basename(pathName), smb2.SMB2_FILE_NETWORK_OPEN_INFO)
- except Exception as e:
+ except Exception, e:
smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
errorCode = STATUS_INVALID_HANDLE
else:
@@ -2974,7 +2968,7 @@ class SMB2Commands:
shutil.rmtree(connData['OpenedFiles'][fileID]['FileName'])
else:
os.remove(connData['OpenedFiles'][fileID]['FileName'])
- except Exception as e:
+ except Exception, e:
smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
@@ -3010,15 +3004,15 @@ class SMB2Commands:
if str(queryInfo['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(queryInfo['FileID'])
else:
fileID = str(queryInfo['FileID'])
- if recvPacket['TreeID'] in connData['ConnectedShares']:
- if fileID in connData['OpenedFiles']:
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+ if connData['OpenedFiles'].has_key(fileID):
fileName = connData['OpenedFiles'][fileID]['FileName']
if queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
@@ -3061,16 +3055,16 @@ class SMB2Commands:
if str(setInfo['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(setInfo['FileID'])
else:
fileID = str(setInfo['FileID'])
- if recvPacket['TreeID'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
- if fileID in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(fileID):
pathName = connData['OpenedFiles'][fileID]['FileName']
if setInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
@@ -3110,7 +3104,7 @@ class SMB2Commands:
try:
os.rename(pathName,newPathName)
connData['OpenedFiles'][fileID]['FileName'] = newPathName
- except Exception as e:
+ except Exception, e:
smbServer.log("smb2SetInfo: %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -3151,14 +3145,14 @@ class SMB2Commands:
if str(writeRequest['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(writeRequest['FileID'])
else:
fileID = str(writeRequest['FileID'])
- if fileID in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(fileID):
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
errorCode = STATUS_SUCCESS
try:
@@ -3174,7 +3168,7 @@ class SMB2Commands:
respSMBCommand['Count'] = writeRequest['Length']
respSMBCommand['Remaining']= 0xff
- except Exception as e:
+ except Exception, e:
smbServer.log('SMB2_WRITE: %s' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -3194,14 +3188,14 @@ class SMB2Commands:
if str(readRequest['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(readRequest['FileID'])
else:
fileID = str(readRequest['FileID'])
- if fileID in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(fileID):
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
errorCode = 0
try:
@@ -3217,7 +3211,7 @@ class SMB2Commands:
respSMBCommand['DataLength'] = len(content)
respSMBCommand['DataRemaining']= 0
respSMBCommand['Buffer'] = content
- except Exception as e:
+ except Exception, e:
smbServer.log('SMB2_READ: %s ' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -3233,12 +3227,12 @@ class SMB2Commands:
respSMBCommand = smb2.SMB2Flush_Response()
flushRequest = smb2.SMB2Flush(recvPacket['Data'])
- if str(flushRequest['FileID']) in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(str(flushRequest['FileID'])):
fileHandle = connData['OpenedFiles'][str(flushRequest['FileID'])]['FileHandle']
errorCode = STATUS_SUCCESS
try:
os.fsync(fileHandle)
- except Exception as e:
+ except Exception, e:
smbServer.log("SMB2_FLUSH %s" % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -3257,21 +3251,21 @@ class SMB2Commands:
respSMBCommand['Buffer'] = '\x00'
# The server MUST locate the tree connection, as specified in section 3.3.5.2.11.
- if (recvPacket['TreeID'] in connData['ConnectedShares']) is False:
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']) is False:
return [smb2.SMB2Error()], None, STATUS_NETWORK_NAME_DELETED
# Next, the server MUST locate the open for the directory to be queried
# If no open is found, the server MUST fail the request with STATUS_FILE_CLOSED
if str(queryDirectoryRequest['FileID']) == '\xff'*16:
# Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
else:
fileID = str(queryDirectoryRequest['FileID'])
else:
fileID = str(queryDirectoryRequest['FileID'])
- if (fileID in connData['OpenedFiles']) is False:
+ if connData['OpenedFiles'].has_key(fileID) is False:
return [smb2.SMB2Error()], None, STATUS_FILE_CLOSED
# If the open is not an open to a directory, the request MUST be failed
@@ -3389,7 +3383,7 @@ class SMB2Commands:
respSMBCommand = smb2.SMB2TreeDisconnect_Response()
- if recvPacket['TreeID'] in connData['ConnectedShares']:
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['TreeID'],connData['ConnectedShares'][recvPacket['TreeID']]['shareName']))
del(connData['ConnectedShares'][recvPacket['TreeID']])
errorCode = STATUS_SUCCESS
@@ -3426,7 +3420,7 @@ class SMB2Commands:
ioctlRequest = smb2.SMB2Ioctl(recvPacket['Data'])
ioctls = smbServer.getIoctls()
- if ioctlRequest['CtlCode'] in ioctls:
+ if ioctls.has_key(ioctlRequest['CtlCode']):
outputData, errorCode = ioctls[ioctlRequest['CtlCode']](connId, smbServer, ioctlRequest)
if errorCode == STATUS_SUCCESS:
respSMBCommand['CtlCode'] = ioctlRequest['CtlCode']
@@ -3481,7 +3475,7 @@ class Ioctls:
ioctlResponse = ''
- if str(ioctlRequest['FileID']) in connData['OpenedFiles']:
+ if connData['OpenedFiles'].has_key(str(ioctlRequest['FileID'])):
fileHandle = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['FileHandle']
errorCode = STATUS_SUCCESS
try:
@@ -3491,7 +3485,7 @@ class Ioctls:
sock = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['Socket']
sock.sendall(ioctlRequest['Buffer'])
ioctlResponse = sock.recv(ioctlRequest['MaxOutputResponse'])
- except Exception as e:
+ except Exception, e:
smbServer.log('fsctlPipeTransceive: %s ' % e, logging.ERROR)
errorCode = STATUS_ACCESS_DENIED
else:
@@ -3557,7 +3551,7 @@ class SMBSERVERHandler(SocketServer.BaseRequestHandler):
# a single packet
for i in resp:
session.send_packet(str(i))
- except Exception as e:
+ except Exception, e:
self.__SMB.log("Handle: %s" % e)
#import traceback
#traceback.print_exc()
@@ -3740,7 +3734,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
def getConnectionData(self, connId, checkStatus = True):
conn = self.__activeConnections[connId]
if checkStatus is True:
- if ('Authenticated' in conn) is not True:
+ if conn.has_key('Authenticated') is not True:
# Can't keep going further
raise Exception("User not Authenticated!")
return conn
@@ -3753,13 +3747,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
return True
def unregisterNamedPipe(self, pipeName):
- if pipeName in self.__registeredNamedPipes:
+ if self.__registeredNamedPipes.has_key(pipeName):
del(self.__registeredNamedPipes[unicode(pipeName)])
return True
return False
def unregisterTransaction(self, transCommand):
- if transCommand in self.__smbTransCommands:
+ if self.__smbTransCommands.has_key(transCommand):
del(self.__smbTransCommands[transCommand])
def hookTransaction(self, transCommand, callback):
@@ -3794,7 +3788,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
# respData: the data reponse of the transaction
# errorCode: the NT error code
- if transCommand in self.__smbTransCommands:
+ if self.__smbTransCommands.has_key(transCommand):
originalCommand = self.__smbTransCommands[transCommand]
else:
originalCommand = None
@@ -3803,13 +3797,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
return originalCommand
def unregisterTransaction2(self, transCommand):
- if transCommand in self.__smbTrans2Commands:
+ if self.__smbTrans2Commands.has_key(transCommand):
del(self.__smbTrans2Commands[transCommand])
def hookTransaction2(self, transCommand, callback):
# Here we should add to __smbTrans2Commands
# Same description as Transaction
- if transCommand in self.__smbTrans2Commands:
+ if self.__smbTrans2Commands.has_key(transCommand):
originalCommand = self.__smbTrans2Commands[transCommand]
else:
originalCommand = None
@@ -3818,13 +3812,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
return originalCommand
def unregisterNTTransaction(self, transCommand):
- if transCommand in self.__smbNTTransCommands:
+ if self.__smbNTTransCommands.has_key(transCommand):
del(self.__smbNTTransCommands[transCommand])
def hookNTTransaction(self, transCommand, callback):
# Here we should add to __smbNTTransCommands
# Same description as Transaction
- if transCommand in self.__smbNTTransCommands:
+ if self.__smbNTTransCommands.has_key(transCommand):
originalCommand = self.__smbNTTransCommands[transCommand]
else:
originalCommand = None
@@ -3833,7 +3827,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
return originalCommand
def unregisterSmbCommand(self, smbCommand):
- if smbCommand in self.__smbCommands:
+ if self.__smbCommands.has_key(smbCommand):
del(self.__smbCommands[smbCommand])
def hookSmbCommand(self, smbCommand, callback):
@@ -3872,7 +3866,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
# transCommands: a list of transaction subcommands already registered
#
- if smbCommand in self.__smbCommands:
+ if self.__smbCommands.has_key(smbCommand):
originalCommand = self.__smbCommands[smbCommand]
else:
originalCommand = None
@@ -3881,11 +3875,11 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
return originalCommand
def unregisterSmb2Command(self, smb2Command):
- if smb2Command in self.__smb2Commands:
+ if self.__smb2Commands.has_key(smb2Command):
del(self.__smb2Commands[smb2Command])
def hookSmb2Command(self, smb2Command, callback):
- if smb2Command in self.__smb2Commands:
+ if self.__smb2Commands.has_key(smb2Command):
originalCommand = self.__smb2Commands[smb2Command]
else:
originalCommand = None
@@ -3975,13 +3969,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
packet,
self.__smbTransCommands)
else:
- if packet['Command'] in self.__smbCommands:
+ if self.__smbCommands.has_key(packet['Command']):
if self.__SMB2Support is True:
if packet['Command'] == smb.SMB.SMB_COM_NEGOTIATE:
try:
respCommands, respPackets, errorCode = self.__smb2Commands[smb2.SMB2_NEGOTIATE](connId, self, packet, True)
isSMB2 = True
- except Exception as e:
+ except Exception, e:
self.log('SMB2_NEGOTIATE: %s' % e, logging.ERROR)
# If something went wrong, let's fallback to SMB1
respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
@@ -4012,7 +4006,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
else:
done = False
while not done:
- if packet['Command'] in self.__smb2Commands:
+ if self.__smb2Commands.has_key(packet['Command']):
if self.__SMB2Support is True:
respCommands, respPackets, errorCode = self.__smb2Commands[packet['Command']](
connId,
@@ -4031,7 +4025,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
else:
done = True
- except Exception as e:
+ except Exception, e:
#import traceback
#traceback.print_exc()
# Something wen't wrong, defaulting to Bad user ID
diff --git a/tests/python_dependencies/impacket/spnego.py b/tests/python_dependencies/impacket/spnego.py
index 98069f579..43e65fb5c 100644
--- a/tests/python_dependencies/impacket/spnego.py
+++ b/tests/python_dependencies/impacket/spnego.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
# Copyright (c) 2003-2016 CORE Security Technologies
#
# This software is provided under under a slightly modified version
@@ -14,7 +13,7 @@ from __future__ import print_function
from struct import pack, unpack, calcsize
############### GSS Stuff ################
-GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
+GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
ASN1_SEQUENCE = 0x30
ASN1_AID = 0x60
ASN1_OID = 0x06
@@ -34,59 +33,59 @@ MechTypes = {
TypesMech = dict((v,k) for k, v in MechTypes.iteritems())
def asn1encode(data = ''):
- #res = asn1.SEQUENCE(str).encode()
- #import binascii
- #print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
- if 0 <= len(data) <= 0x7F:
- res = pack('B', len(data)) + data
- elif 0x80 <= len(data) <= 0xFF:
- res = pack('BB', 0x81, len(data)) + data
- elif 0x100 <= len(data) <= 0xFFFF:
- res = pack('!BH', 0x82, len(data)) + data
- elif 0x10000 <= len(data) <= 0xffffff:
- res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
- elif 0x1000000 <= len(data) <= 0xffffffff:
- res = pack('!BL', 0x84, len(data)) + data
- else:
- raise Exception('Error in asn1encode')
- return str(res)
+ #res = asn1.SEQUENCE(str).encode()
+ #import binascii
+ #print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
+ if 0 <= len(data) <= 0x7F:
+ res = pack('B', len(data)) + data
+ elif 0x80 <= len(data) <= 0xFF:
+ res = pack('BB', 0x81, len(data)) + data
+ elif 0x100 <= len(data) <= 0xFFFF:
+ res = pack('!BH', 0x82, len(data)) + data
+ elif 0x10000 <= len(data) <= 0xffffff:
+ res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
+ elif 0x1000000 <= len(data) <= 0xffffffff:
+ res = pack('!BL', 0x84, len(data)) + data
+ else:
+ raise Exception('Error in asn1encode')
+ return str(res)
def asn1decode(data = ''):
- len1 = unpack('B', data[:1])[0]
- data = data[1:]
- if len1 == 0x81:
- pad = calcsize('B')
- len2 = unpack('B',data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- elif len1 == 0x82:
- pad = calcsize('H')
- len2 = unpack('!H', data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- elif len1 == 0x83:
- pad = calcsize('B') + calcsize('!H')
- len2, len3 = unpack('!BH', data[:pad])
- data = data[pad:]
- ans = data[:len2 << 16 + len3]
- elif len1 == 0x84:
- pad = calcsize('!L')
- len2 = unpack('!L', data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- # 1 byte length, string <= 0x7F
- else:
- pad = 0
- ans = data[:len1]
- return ans, len(ans)+pad+1
+ len1 = unpack('B', data[:1])[0]
+ data = data[1:]
+ if len1 == 0x81:
+ pad = calcsize('B')
+ len2 = unpack('B',data[:pad])[0]
+ data = data[pad:]
+ ans = data[:len2]
+ elif len1 == 0x82:
+ pad = calcsize('H')
+ len2 = unpack('!H', data[:pad])[0]
+ data = data[pad:]
+ ans = data[:len2]
+ elif len1 == 0x83:
+ pad = calcsize('B') + calcsize('!H')
+ len2, len3 = unpack('!BH', data[:pad])
+ data = data[pad:]
+ ans = data[:len2 << 16 + len3]
+ elif len1 == 0x84:
+ pad = calcsize('!L')
+ len2 = unpack('!L', data[:pad])[0]
+ data = data[pad:]
+ ans = data[:len2]
+ # 1 byte length, string <= 0x7F
+ else:
+ pad = 0
+ ans = data[:len1]
+ return ans, len(ans)+pad+1
class GSSAPI:
-# Generic GSSAPI Header Format
+# Generic GSSAPI Header Format
def __init__(self, data = None):
self.fields = {}
self['UUID'] = GSS_API_SPNEGO_UUID
if data:
- self.fromString(data)
+ self.fromString(data)
pass
def __setitem__(self,key,value):
@@ -116,27 +115,27 @@ class GSSAPI:
if next_byte != ASN1_AID:
raise Exception('Unknown AID=%x' % next_byte)
data = data[1:]
- decode_data, total_bytes = asn1decode(data)
+ decode_data, total_bytes = asn1decode(data)
# Now we should have a OID tag
- next_byte = unpack('B',decode_data[:1])[0]
+ next_byte = unpack('B',decode_data[:1])[0]
if next_byte != ASN1_OID:
raise Exception('OID tag not found %x' % next_byte)
decode_data = decode_data[1:]
# Now the OID contents, should be SPNEGO UUID
- uuid, total_bytes = asn1decode(decode_data)
+ uuid, total_bytes = asn1decode(decode_data)
self['OID'] = uuid
# the rest should be the data
self['Payload'] = decode_data[total_bytes:]
#pass
-
+
def dump(self):
for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
+ print "%s: {%r}" % (i,self[i])
def getData(self):
ans = pack('B',ASN1_AID)
ans += asn1encode(
- pack('B',ASN1_OID) +
+ pack('B',ASN1_OID) +
asn1encode(self['UUID']) +
self['Payload'] )
return ans
@@ -164,7 +163,7 @@ class SPNEGO_NegTokenResp:
def __init__(self, data = None):
self.fields = {}
if data:
- self.fromString(data)
+ self.fromString(data)
pass
def __setitem__(self,key,value):
@@ -199,7 +198,7 @@ class SPNEGO_NegTokenResp:
if next_byte != ASN1_MECH_TYPE:
# MechType not found, could be an AUTH answer
if next_byte != ASN1_RESPONSE_TOKEN:
- raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
+ raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
else:
decode_data2 = decode_data[1:]
decode_data2, total_bytes = asn1decode(decode_data2)
@@ -246,30 +245,30 @@ class SPNEGO_NegTokenResp:
def dump(self):
for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
-
+ print "%s: {%r}" % (i,self[i])
+
def getData(self):
ans = pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP)
- if 'NegResult' in self.fields and 'SupportedMech' in self.fields:
+ if self.fields.has_key('NegResult') and self.fields.has_key('SupportedMech'):
# Server resp
ans += asn1encode(
pack('B', ASN1_SEQUENCE) +
asn1encode(
pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
asn1encode(
- pack('B',ASN1_ENUMERATED) +
+ pack('B',ASN1_ENUMERATED) +
asn1encode( self['NegResult'] )) +
pack('B',ASN1_SUPPORTED_MECH) +
- asn1encode(
+ asn1encode(
pack('B',ASN1_OID) +
asn1encode(self['SupportedMech'])) +
pack('B',ASN1_RESPONSE_TOKEN ) +
asn1encode(
pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
- elif 'NegResult' in self.fields:
+ elif self.fields.has_key('NegResult'):
# Server resp
ans += asn1encode(
- pack('B', ASN1_SEQUENCE) +
+ pack('B', ASN1_SEQUENCE) +
asn1encode(
pack('B', SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
asn1encode(
@@ -286,24 +285,24 @@ class SPNEGO_NegTokenResp:
return ans
class SPNEGO_NegTokenInit(GSSAPI):
- # http://tools.ietf.org/html/rfc4178#page-8
+ # http://tools.ietf.org/html/rfc4178#page-8
# NegTokeInit :: = SEQUENCE {
- # mechTypes [0] MechTypeList,
+ # mechTypes [0] MechTypeList,
# reqFlags [1] ContextFlags OPTIONAL,
- # mechToken [2] OCTET STRING OPTIONAL,
+ # mechToken [2] OCTET STRING OPTIONAL,
# mechListMIC [3] OCTET STRING OPTIONAL,
# }
SPNEGO_NEG_TOKEN_INIT = 0xa0
def fromString(self, data = 0):
GSSAPI.fromString(self, data)
payload = self['Payload']
- next_byte = unpack('B', payload[:1])[0]
+ next_byte = unpack('B', payload[:1])[0]
if next_byte != SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT:
raise Exception('NegTokenInit not found %x' % next_byte)
payload = payload[1:]
decode_data, total_bytes = asn1decode(payload)
# Now we should have a SEQUENCE Tag
- next_byte = unpack('B', decode_data[:1])[0]
+ next_byte = unpack('B', decode_data[:1])[0]
if next_byte != ASN1_SEQUENCE:
raise Exception('SEQUENCE tag not found %x' % next_byte)
decode_data = decode_data[1:]
@@ -322,14 +321,14 @@ class SPNEGO_NegTokenInit(GSSAPI):
# And finally we should have the MechTypes
self['MechTypes'] = []
while decode_data:
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_OID:
- # Not a valid OID, there must be something else we won't unpack
- break
- decode_data = decode_data[1:]
- item, total_bytes = asn1decode(decode_data)
- self['MechTypes'].append(item)
- decode_data = decode_data[total_bytes:]
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte != ASN1_OID:
+ # Not a valid OID, there must be something else we won't unpack
+ break
+ decode_data = decode_data[1:]
+ item, total_bytes = asn1decode(decode_data)
+ self['MechTypes'].append(item)
+ decode_data = decode_data[total_bytes:]
# Do we have MechTokens as well?
decode_data = remaining_data[total_bytes3:]
@@ -353,7 +352,7 @@ class SPNEGO_NegTokenInit(GSSAPI):
mechToken = ''
# Do we have tokens to send?
- if 'MechToken' in self.fields:
+ if self.fields.has_key('MechToken'):
mechToken = pack('B', ASN1_MECH_TOKEN) + asn1encode(
pack('B', ASN1_OCTET_STRING) + asn1encode(
self['MechToken']))
@@ -364,9 +363,10 @@ class SPNEGO_NegTokenInit(GSSAPI):
asn1encode(
pack('B', ASN1_MECH_TYPE) +
asn1encode(
- pack('B', ASN1_SEQUENCE) +
+ pack('B', ASN1_SEQUENCE) +
asn1encode(mechTypes)) + mechToken ))
self['Payload'] = ans
return GSSAPI.getData(self)
+
diff --git a/tests/python_dependencies/impacket/structure.py b/tests/python_dependencies/impacket/structure.py
index 68066a61f..7a04117ff 100644
--- a/tests/python_dependencies/impacket/structure.py
+++ b/tests/python_dependencies/impacket/structure.py
@@ -1,4 +1,3 @@
-from __future__ import print_function
# Copyright (c) 2003-2016 CORE Security Technologies
#
# This software is provided under under a slightly modified version
@@ -98,18 +97,18 @@ class Structure:
def packField(self, fieldName, format = None):
if self.debug:
- print("packField( %s | %s )" % (fieldName, format))
+ print "packField( %s | %s )" % (fieldName, format)
if format is None:
format = self.formatForField(fieldName)
- if fieldName in self.fields:
+ if self.fields.has_key(fieldName):
ans = self.pack(format, self.fields[fieldName], field = fieldName)
else:
ans = self.pack(format, None, field = fieldName)
if self.debug:
- print("\tanswer %r" % ans)
+ print "\tanswer %r" % ans
return ans
@@ -120,8 +119,8 @@ class Structure:
for field in self.commonHdr+self.structure:
try:
data += self.packField(field[0], field[1])
- except Exception as e:
- if field[0] in self.fields:
+ except Exception, e:
+ if self.fields.has_key(field[0]):
e.args += ("When packing field '%s | %s | %r' in %s" % (field[0], field[1], self[field[0]], self.__class__),)
else:
e.args += ("When packing field '%s | %s' in %s" % (field[0], field[1], self.__class__),)
@@ -137,16 +136,16 @@ class Structure:
self.rawData = data
for field in self.commonHdr+self.structure:
if self.debug:
- print("fromString( %s | %s | %r )" % (field[0], field[1], data))
+ print "fromString( %s | %s | %r )" % (field[0], field[1], data)
size = self.calcUnpackSize(field[1], data, field[0])
if self.debug:
- print(" size = %d" % size)
+ print " size = %d" % size
dataClassOrCode = str
if len(field) > 2:
dataClassOrCode = field[2]
try:
self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
- except Exception as e:
+ except Exception,e:
e.args += ("When unpacking field '%s | %s | %r[:%d]'" % (field[0], field[1], data, size),)
raise
@@ -176,7 +175,7 @@ class Structure:
def pack(self, format, data, field = None):
if self.debug:
- print(" pack( %s | %r | %s)" % (format, data, field))
+ print " pack( %s | %r | %s)" % (format, data, field)
if field:
addressField = self.findAddressFieldFor(field)
@@ -207,7 +206,7 @@ class Structure:
try:
return self.pack(two[0], data)
except:
- if (two[1] in self.fields) and (self[two[1]] is not None):
+ if (self.fields.has_key(two[1])) and (self[two[1]] is not None):
return self.pack(two[0], id(self[two[1]]) & ((1<<(calcsize(two[0])*8))-1) )
else:
return self.pack(two[0], 0)
@@ -229,7 +228,7 @@ class Structure:
if two[0]:
if two[0].isdigit():
if int(two[0]) != len(data):
- raise Exception("Array field has a constant size, and it doesn't match the actual value")
+ raise Exception, "Array field has a constant size, and it doesn't match the actual value"
else:
return self.pack(two[0], len(data))+answer
return answer
@@ -257,7 +256,7 @@ class Structure:
return '%s\0\0\0\0%s%s' % (l,l,data)
if data is None:
- raise Exception("Trying to pack None")
+ raise Exception, "Trying to pack None"
# literal specifier
if format[:1] == ':':
@@ -268,7 +267,7 @@ class Structure:
def unpack(self, format, data, dataClassOrCode = str, field = None):
if self.debug:
- print(" unpack( %s | %r )" % (format, data))
+ print " unpack( %s | %r )" % (format, data)
if field:
addressField = self.findAddressFieldFor(field)
@@ -289,7 +288,7 @@ class Structure:
if format[:1] == "'" or format[:1] == '"':
answer = format[1:]
if answer != data:
- raise Exception("Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer))
+ raise Exception, "Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer)
return answer
# address specifier
@@ -335,13 +334,13 @@ class Structure:
# asciiz specifier
if format == 'z':
if data[-1] != '\x00':
- raise Exception("%s 'z' field is not NUL terminated: %r" % (field, data))
+ raise Exception, ("%s 'z' field is not NUL terminated: %r" % (field, data))
return data[:-1] # remove trailing NUL
# unicode specifier
if format == 'u':
if data[-2:] != '\x00\x00':
- raise Exception("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
+ raise Exception, ("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
return data[:-2] # remove trailing NUL
# DCE-RPC/NDR string specifier
@@ -393,7 +392,7 @@ class Structure:
answer = 0
if two[0].isdigit():
if int(two[0]) != len(data):
- raise Exception("Array field has a constant size, and it doesn't match the actual value")
+ raise Exception, "Array field has a constant size, and it doesn't match the actual value"
elif two[0]:
answer += self.calcPackSize(two[0], len(data))
@@ -429,7 +428,7 @@ class Structure:
def calcUnpackSize(self, format, data, field = None):
if self.debug:
- print(" calcUnpackSize( %s | %s | %r)" % (field, format, data))
+ print " calcUnpackSize( %s | %s | %r)" % (field, format, data)
# void specifier
if format[:1] == '_':
@@ -488,7 +487,7 @@ class Structure:
# "printf" string specifier
if format[:1] == '%':
- raise Exception("Can't guess the size of a printf like specifier for unpacking")
+ raise Exception, "Can't guess the size of a printf like specifier for unpacking"
# asciiz specifier
if format[:1] == 'z':
@@ -521,7 +520,7 @@ class Structure:
for field in self.commonHdr+self.structure:
if field[0] == fieldName:
return field[1]
- raise Exception("Field %s not found" % fieldName)
+ raise Exception, ("Field %s not found" % fieldName)
def findAddressFieldFor(self, fieldName):
descriptor = '&%s' % fieldName
@@ -559,7 +558,7 @@ class Structure:
def dump(self, msg = None, indent = 0):
if msg is None: msg = self.__class__.__name__
ind = ' '*indent
- print("\n%s" % msg)
+ print "\n%s" % msg
fixedFields = []
for field in self.commonHdr+self.structure:
i = field[0]
@@ -567,18 +566,18 @@ class Structure:
fixedFields.append(i)
if isinstance(self[i], Structure):
self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
- print("%s}" % ind)
+ print "%s}" % ind
else:
- print("%s%s: {%r}" % (ind,i,self[i]))
+ print "%s%s: {%r}" % (ind,i,self[i])
# Do we have remaining fields not defined in the structures? let's
# print them
remainingFields = list(set(self.fields) - set(fixedFields))
for i in remainingFields:
if isinstance(self[i], Structure):
self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
- print("%s}" % ind)
+ print "%s}" % ind
else:
- print("%s%s: {%r}" % (ind,i,self[i]))
+ print "%s%s: {%r}" % (ind,i,self[i])
class _StructureTest:
@@ -590,23 +589,23 @@ class _StructureTest:
return self.theClass(alignment = self.alignment)
def run(self):
- print()
- print("-"*70)
+ print
+ print "-"*70
testName = self.__class__.__name__
- print("starting test: %s....." % testName)
+ print "starting test: %s....." % testName
a = self.create()
self.populate(a)
a.dump("packing.....")
a_str = str(a)
- print("packed: %r" % a_str)
- print("unpacking.....")
+ print "packed: %r" % a_str
+ print "unpacking....."
b = self.create(a_str)
b.dump("unpacked.....")
- print("repacking.....")
+ print "repacking....."
b_str = str(b)
if b_str != a_str:
- print("ERROR: original packed and repacked don't match")
- print("packed: %r" % b_str)
+ print "ERROR: original packed and repacked don't match"
+ print "packed: %r" % b_str
class _Test_simple(_StructureTest):
class theClass(Structure):
@@ -733,7 +732,7 @@ if __name__ == '__main__':
try:
_Test_fixedLength().run()
except:
- print("cannot repack because length is bogus")
+ print "cannot repack because length is bogus"
_Test_simple_aligned4().run()
_Test_nested().run()
diff --git a/tests/python_dependencies/impacket/uuid.py b/tests/python_dependencies/impacket/uuid.py
index 750eba459..fb4d7b3a0 100644
--- a/tests/python_dependencies/impacket/uuid.py
+++ b/tests/python_dependencies/impacket/uuid.py
@@ -17,14 +17,9 @@ import re
from random import randrange
from struct import pack, unpack
-try:
- long # Python 2
-except NameError:
- long = int # Python 3
-
def generate():
# UHm... crappy Python has an maximum integer of 2**31-1.
- top = (1<<31)-1
+ top = (1L<<31)-1
return pack("IIII", randrange(top), randrange(top), randrange(top), randrange(top))
def bin_to_string(uuid):
@@ -54,16 +49,16 @@ def bin_to_uuidtup(bin):
return uuidstr, "%d.%d" % (maj, min)
#input: string
-#output: tuple (uuid,version)
+#output: tuple (uuid,version)
#if version is not found in the input string "1.0" is returned
-#example:
-# "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
+#example:
+# "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+# "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+# "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+# "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
def string_to_uuidtup(s):
g = re.search("([A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}).*?([0-9]{1,5}\.[0-9]{1,5})",s+" 1.0")
- if g:
+ if g:
(u,v) = g.groups()
return (u,v)
return
diff --git a/tests/runtests.1 b/tests/runtests.1
index 8491de37f..c43decc64 100644
--- a/tests/runtests.1
+++ b/tests/runtests.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH runtests.pl 1 "May 05, 2017" "Curl 7.67.0" "runtests"
+.TH runtests.pl 1 "May 05, 2017" "Curl 7.64.1" "runtests"
.SH NAME
runtests.pl \- run one or more test cases
diff --git a/tests/runtests.pl b/tests/runtests.pl
index 63bd2da68..1fb7354ec 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -244,7 +244,7 @@ my $h2cver = "h2c";
my $has_openssl; # built with a lib using an OpenSSL-like API
my $has_gnutls; # built with GnuTLS
my $has_nss; # built with NSS
-my $has_wolfssl; # built with wolfSSL
+my $has_yassl; # built with yassl
my $has_polarssl; # built with polarssl
my $has_winssl; # built with WinSSL (Secure Channel aka Schannel)
my $has_darwinssl; # built with DarwinSSL (Secure Transport)
@@ -276,7 +276,7 @@ my $sshdvernum; # for socks server, ssh daemon version number
my $sshdverstr; # for socks server, ssh daemon version string
my $sshderror; # for socks server, ssh daemon version error
-my $defserverlogslocktimeout = 2; # timeout to await server logs lock removal
+my $defserverlogslocktimeout = 20; # timeout to await server logs lock removal
my $defpostcommanddelay = 0; # delay between command and postcheck sections
my $timestats; # time stamping and stats generation
@@ -291,7 +291,6 @@ my %timevrfyend; # timestamp for each test result verification end
my $testnumcheck; # test number, set in singletest sub.
my %oldenv;
-my %feature; # array of enabled features
#######################################################################
# variables that command line options may set
@@ -2013,6 +2012,7 @@ sub runsshserver {
my ($id, $verbose, $ipv6) = @_;
my $ip=$HOSTIP;
my $port = $SSHPORT;
+ my $socksport = $SOCKSPORT;
my $proto = 'ssh';
my $ipvnum = 4;
my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
@@ -2046,7 +2046,7 @@ sub runsshserver {
$flags .= "--pidfile \"$pidfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
$flags .= "--ipv$ipvnum --addr \"$ip\" ";
- $flags .= "--sshport $port ";
+ $flags .= "--sshport $port --socksport $socksport ";
$flags .= "--user \"$USER\"";
my $cmd = "$perl $srcdir/sshserver.pl $flags";
@@ -2139,27 +2139,108 @@ sub runsocksserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
- # start our socks server, get commands from the FTP cmd file
- my $cmd="server/socksd".
- " --port $port ".
- " --pidfile $pidfile".
- " --backend $HOSTIP".
- " --config $FTPDCMD";
- my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
+ # The ssh server must be already running
+ if(!$run{'ssh'}) {
+ logmsg "RUN: SOCKS server cannot find running SSH server\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Find out ssh daemon canonical file name
+ my $sshd = find_sshd();
+ if(!$sshd) {
+ logmsg "RUN: SOCKS server cannot find $sshdexe\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Find out ssh daemon version info
+ ($sshdid, $sshdvernum, $sshdverstr, $sshderror) = sshversioninfo($sshd);
+ if(!$sshdid) {
+ # Not an OpenSSH or SunSSH ssh daemon
+ logmsg "$sshderror\n" if($verbose);
+ logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ logmsg "ssh server found $sshd is $sshdverstr\n" if($verbose);
+
+ # Find out ssh client canonical file name
+ my $ssh = find_ssh();
+ if(!$ssh) {
+ logmsg "RUN: SOCKS server cannot find $sshexe\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Find out ssh client version info
+ my ($sshid, $sshvernum, $sshverstr, $ssherror) = sshversioninfo($ssh);
+ if(!$sshid) {
+ # Not an OpenSSH or SunSSH ssh client
+ logmsg "$ssherror\n" if($verbose);
+ logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Verify minimum ssh client version
+ if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum < 100))) {
+ logmsg "ssh client found $ssh is $sshverstr\n";
+ logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ logmsg "ssh client found $ssh is $sshverstr\n" if($verbose);
+
+ # Verify if ssh client and ssh daemon versions match
+ if(($sshdid ne $sshid) || ($sshdvernum != $sshvernum)) {
+ # Our test harness might work with slightly mismatched versions
+ logmsg "Warning: version mismatch: sshd $sshdverstr - ssh $sshverstr\n"
+ if($verbose);
+ }
+
+ # Config file options for ssh client are previously set from sshserver.pl
+ if(! -e $sshconfig) {
+ logmsg "RUN: SOCKS server cannot find $sshconfig\n";
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ $sshlog = server_logfilename($LOGDIR, 'socks', $ipvnum, $idnum);
- if($sockspid <= 0 || !pidexists($sockspid)) {
+ # start our socks server
+ my $cmd="\"$ssh\" -N -F $sshconfig $ip > $sshlog 2>&1";
+ my ($sshpid, $pid2) = startnew($cmd, $pidfile, 30, 1); # fake pidfile
+
+ if($sshpid <= 0 || !pidexists($sshpid)) {
# it is NOT alive
logmsg "RUN: failed to start the $srvrname server\n";
+ display_sshlog();
+ display_sshconfig();
+ display_sshdlog();
+ display_sshdconfig();
stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
return (0,0);
}
+ # Ugly hack but ssh doesn't support pid files. PID is from fake pidfile.
+ my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
+ if(!$pid3) {
+ logmsg "RUN: $srvrname server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ stopserver($server, "$sshpid $pid2");
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ $pid2 = $pid3;
+
if($verbose) {
logmsg "RUN: $srvrname server is now running PID $pid2\n";
}
- return ($pid2, $sockspid);
+ return ($pid2, $sshpid);
}
#######################################################################
@@ -2203,8 +2284,7 @@ sub rundictserver {
$flags .= "--verbose 1 " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--port $port --srcdir \"$srcdir\" ";
- $flags .= "--host $HOSTIP";
+ $flags .= "--port $port --srcdir \"$srcdir\"";
my $cmd = "$srcdir/dictserver.py $flags";
my ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -2280,8 +2360,7 @@ sub runsmbserver {
$flags .= "--verbose 1 " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--port $port --srcdir \"$srcdir\" ";
- $flags .= "--host $HOSTIP";
+ $flags .= "--port $port --srcdir \"$srcdir\"";
my $cmd = "$srcdir/smbserver.py $flags";
my ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -2547,7 +2626,7 @@ sub compare {
if($result) {
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
if(!$short) {
logmsg "\n $testnum: $subject FAILED:\n";
@@ -2564,65 +2643,6 @@ sub compare {
return $result;
}
-sub setupfeatures {
- $feature{"SSL"} = $has_ssl;
- $feature{"MultiSSL"} = $has_multissl;
- $feature{"SSLpinning"} = $has_sslpinning;
- $feature{"OpenSSL"} = $has_openssl;
- $feature{"GnuTLS"} = $has_gnutls;
- $feature{"NSS"} = $has_nss;
- $feature{"WinSSL"} = $has_winssl;
- $feature{"Schannel"} = $has_winssl; # alias
- $feature{"sectransp"} = $has_darwinssl;
- $feature{"DarwinSSL"} = $has_darwinssl; # alias
- $feature{"ld_preload"} = ($has_ldpreload && !$debug_build);
- $feature{"unittest"} = $debug_build;
- $feature{"debug"} = $debug_build;
- $feature{"TrackMemory"} = $has_memory_tracking;
- $feature{"large_file"} = $has_largefile;
- $feature{"idn"} = $has_idn;
- $feature{"ipv6"} = $has_ipv6;
- $feature{"libz"} = $has_libz;
- $feature{"brotli"} = $has_brotli;
- $feature{"NTLM"} = $has_ntlm;
- $feature{"NTLM_WB"} = $has_ntlm_wb;
- $feature{"SSPI"} = $has_sspi;
- $feature{"GSS-API"} = $has_gssapi;
- $feature{"Kerberos"} = $has_kerberos;
- $feature{"SPNEGO"} = $has_spnego;
- $feature{"getrlimit"} = $has_getrlimit;
- $feature{"crypto"} = $has_crypto;
- $feature{"TLS-SRP"} = $has_tls_srp;
- $feature{"Metalink"} = $has_metalink;
- $feature{"http/2"} = $has_http2;
- $feature{"threaded-resolver"} = $has_threadedres;
- $feature{"PSL"} = $has_psl;
- $feature{"alt-svc"} = $has_altsvc;
- $feature{"manual"} = $has_manual;
- $feature{"unix-sockets"} = $has_unix;
-
- # make each protocol an enabled "feature"
- for my $p (@protocols) {
- $feature{$p} = 1;
- }
- # 'socks' was once here but is now removed
-
- #
- # strings that must match the names used in server/disabled.c
- #
- $feature{"cookies"} = 1;
- $feature{"DoH"} = 1;
- $feature{"HTTP-auth"} = 1;
- $feature{"Mime"} = 1;
- $feature{"netrc"} = 1;
- $feature{"parsedate"} = 1;
- $feature{"proxy"} = 1;
- $feature{"shuffle-dns"} = 1;
- $feature{"typecheck"} = 1;
- $feature{"verbose-strings"} = 1;
-
-}
-
#######################################################################
# display information about curl and the host the test suite runs on
#
@@ -2636,8 +2656,6 @@ sub checksystem {
my $versretval;
my $versnoexec;
my @version=();
- my @disabled;
- my $dis = "";
my $curlverout="$LOGDIR/curlverout.log";
my $curlvererr="$LOGDIR/curlvererr.log";
@@ -2653,15 +2671,6 @@ sub checksystem {
@version = <VERSOUT>;
close(VERSOUT);
- open(DISABLED, "server/disabled|");
- @disabled = <DISABLED>;
- close(DISABLED);
-
- if($disabled[0]) {
- map s/[\r\n]//g, @disabled;
- $dis = join(", ", @disabled);
- }
-
$resolver="stock";
for(@version) {
chomp;
@@ -2678,7 +2687,6 @@ sub checksystem {
# This is a Windows MinGW build or native build, we need to use
# Win32-style path.
$pwd = pathhelp::sys_native_current_path();
- $has_textaware = 1;
}
if ($libcurl =~ /(winssl|schannel)/i) {
$has_winssl=1;
@@ -2696,8 +2704,8 @@ sub checksystem {
$has_nss=1;
$has_sslpinning=1;
}
- elsif ($libcurl =~ /wolfssl/i) {
- $has_wolfssl=1;
+ elsif ($libcurl =~ /(yassl|wolfssl)/i) {
+ $has_yassl=1;
$has_sslpinning=1;
}
elsif ($libcurl =~ /polarssl/i) {
@@ -2951,12 +2959,11 @@ sub checksystem {
my $hosttype=join(' ', runclientoutput("uname -a"));
logmsg ("********* System characteristics ******** \n",
- "* $curl\n",
- "* $libcurl\n",
- "* Features: $feat\n",
- "* Disabled: $dis\n",
- "* Host: $hostname",
- "* System: $hosttype");
+ "* $curl\n",
+ "* $libcurl\n",
+ "* Features: $feat\n",
+ "* Host: $hostname",
+ "* System: $hosttype");
if($has_memory_tracking && $has_threadedres) {
$has_memory_tracking = 0;
@@ -3025,14 +3032,9 @@ sub checksystem {
}
}
}
+ $has_textaware = ($^O eq 'MSWin32') || ($^O eq 'msys');
logmsg "***************************************** \n";
-
- setupfeatures();
- # toggle off the features that were disabled in the build
- for my $d(@disabled) {
- $feature{$d} = 0;
- }
}
#######################################################################
@@ -3201,18 +3203,16 @@ sub singletest {
my @what;
my $why;
+ my %feature;
my $cmd;
my $disablevalgrind;
- # fist, remove all lingering log files
- cleardir($LOGDIR);
-
# copy test number to a global scope var, this allows
# testnum checking when starting test harness servers.
$testnumcheck = $testnum;
# timestamp test preparation start
- $timeprepini{$testnum} = Time::HiRes::time();
+ $timeprepini{$testnum} = Time::HiRes::time() if($timestats);
if($disttests !~ /test$testnum\W/ ) {
logmsg "Warning: test$testnum not present in tests/data/Makefile.inc\n";
@@ -3239,7 +3239,177 @@ sub singletest {
$f =~ s/\s//g;
if($f =~ /^([^!].*)$/) {
- if($feature{$1}) {
+ # Store the feature for later
+ $feature{$1} = $1;
+
+ if($1 eq "SSL") {
+ if($has_ssl) {
+ next;
+ }
+ }
+ elsif($1 eq "MultiSSL") {
+ if($has_multissl) {
+ next;
+ }
+ }
+ elsif($1 eq "SSLpinning") {
+ if($has_sslpinning) {
+ next;
+ }
+ }
+ elsif($1 eq "OpenSSL") {
+ if($has_openssl) {
+ next;
+ }
+ }
+ elsif($1 eq "GnuTLS") {
+ if($has_gnutls) {
+ next;
+ }
+ }
+ elsif($1 eq "NSS") {
+ if($has_nss) {
+ next;
+ }
+ }
+ elsif(($1 eq "WinSSL") || ($1 eq "Schannel")) {
+ if($has_winssl) {
+ next;
+ }
+ }
+ elsif($1 eq "DarwinSSL") {
+ if($has_darwinssl) {
+ next;
+ }
+ }
+ elsif($1 eq "ld_preload") {
+ if($has_ldpreload && !$debug_build) {
+ next;
+ }
+ }
+ elsif($1 eq "unittest") {
+ if($debug_build) {
+ next;
+ }
+ }
+ elsif($1 eq "debug") {
+ if($debug_build) {
+ next;
+ }
+ }
+ elsif($1 eq "TrackMemory") {
+ if($has_memory_tracking) {
+ next;
+ }
+ }
+ elsif($1 eq "large_file") {
+ if($has_largefile) {
+ next;
+ }
+ }
+ elsif($1 eq "idn") {
+ if($has_idn) {
+ next;
+ }
+ }
+ elsif($1 eq "ipv6") {
+ if($has_ipv6) {
+ next;
+ }
+ }
+ elsif($1 eq "libz") {
+ if($has_libz) {
+ next;
+ }
+ }
+ elsif($1 eq "brotli") {
+ if($has_brotli) {
+ next;
+ }
+ }
+ elsif($1 eq "NTLM") {
+ if($has_ntlm) {
+ next;
+ }
+ }
+ elsif($1 eq "NTLM_WB") {
+ if($has_ntlm_wb) {
+ next;
+ }
+ }
+ elsif($1 eq "SSPI") {
+ if($has_sspi) {
+ next;
+ }
+ }
+ elsif($1 eq "GSS-API") {
+ if($has_gssapi) {
+ next;
+ }
+ }
+ elsif($1 eq "Kerberos") {
+ if($has_kerberos) {
+ next;
+ }
+ }
+ elsif($1 eq "SPNEGO") {
+ if($has_spnego) {
+ next;
+ }
+ }
+ elsif($1 eq "getrlimit") {
+ if($has_getrlimit) {
+ next;
+ }
+ }
+ elsif($1 eq "crypto") {
+ if($has_crypto) {
+ next;
+ }
+ }
+ elsif($1 eq "TLS-SRP") {
+ if($has_tls_srp) {
+ next;
+ }
+ }
+ elsif($1 eq "Metalink") {
+ if($has_metalink) {
+ next;
+ }
+ }
+ elsif($1 eq "http/2") {
+ if($has_http2) {
+ next;
+ }
+ }
+ elsif($1 eq "threaded-resolver") {
+ if($has_threadedres) {
+ next;
+ }
+ }
+ elsif($1 eq "PSL") {
+ if($has_psl) {
+ next;
+ }
+ }
+ elsif($1 eq "alt-svc") {
+ if($has_altsvc) {
+ next;
+ }
+ }
+ elsif($1 eq "manual") {
+ if($has_manual) {
+ next;
+ }
+ }
+ elsif($1 eq "socks") {
+ next;
+ }
+ elsif($1 eq "unix-sockets") {
+ next if $has_unix;
+ }
+ # See if this "feature" is in the list of supported protocols
+ elsif (grep /^\Q$1\E$/i, @protocols) {
next;
}
@@ -3255,7 +3425,135 @@ sub singletest {
$f =~ s/\s//g;
if($f =~ /^!(.*)$/) {
- if(!$feature{$1}) {
+ if($1 eq "SSL") {
+ if(!$has_ssl) {
+ next;
+ }
+ }
+ elsif($1 eq "MultiSSL") {
+ if(!$has_multissl) {
+ next;
+ }
+ }
+ elsif($1 eq "OpenSSL") {
+ if(!$has_openssl) {
+ next;
+ }
+ }
+ elsif($1 eq "GnuTLS") {
+ if(!$has_gnutls) {
+ next;
+ }
+ }
+ elsif($1 eq "NSS") {
+ if(!$has_nss) {
+ next;
+ }
+ }
+ elsif(($1 eq "WinSSL") || ($1 eq "Schannel")) {
+ if(!$has_winssl) {
+ next;
+ }
+ }
+ elsif($1 eq "DarwinSSL") {
+ if(!$has_darwinssl) {
+ next;
+ }
+ }
+ elsif($1 eq "TrackMemory") {
+ if(!$has_memory_tracking) {
+ next;
+ }
+ }
+ elsif($1 eq "large_file") {
+ if(!$has_largefile) {
+ next;
+ }
+ }
+ elsif($1 eq "idn") {
+ if(!$has_idn) {
+ next;
+ }
+ }
+ elsif($1 eq "ipv6") {
+ if(!$has_ipv6) {
+ next;
+ }
+ }
+ elsif($1 eq "unix-sockets") {
+ next if !$has_unix;
+ }
+ elsif($1 eq "libz") {
+ if(!$has_libz) {
+ next;
+ }
+ }
+ elsif($1 eq "brotli") {
+ if(!$has_brotli) {
+ next;
+ }
+ }
+ elsif($1 eq "NTLM") {
+ if(!$has_ntlm) {
+ next;
+ }
+ }
+ elsif($1 eq "NTLM_WB") {
+ if(!$has_ntlm_wb) {
+ next;
+ }
+ }
+ elsif($1 eq "SSPI") {
+ if(!$has_sspi) {
+ next;
+ }
+ }
+ elsif($1 eq "GSS-API") {
+ if(!$has_gssapi) {
+ next;
+ }
+ }
+ elsif($1 eq "Kerberos") {
+ if(!$has_kerberos) {
+ next;
+ }
+ }
+ elsif($1 eq "SPNEGO") {
+ if(!$has_spnego) {
+ next;
+ }
+ }
+ elsif($1 eq "getrlimit") {
+ if(!$has_getrlimit) {
+ next;
+ }
+ }
+ elsif($1 eq "crypto") {
+ if(!$has_crypto) {
+ next;
+ }
+ }
+ elsif($1 eq "TLS-SRP") {
+ if(!$has_tls_srp) {
+ next;
+ }
+ }
+ elsif($1 eq "Metalink") {
+ if(!$has_metalink) {
+ next;
+ }
+ }
+ elsif($1 eq "PSL") {
+ if(!$has_psl) {
+ next;
+ }
+ }
+ elsif($1 eq "threaded-resolver") {
+ if(!$has_threadedres) {
+ next;
+ }
+ }
+ else {
next;
}
}
@@ -3310,14 +3608,14 @@ sub singletest {
unlink($FTPDCMD) if(-f $FTPDCMD);
# timestamp required servers verification start
- $timesrvrini{$testnum} = Time::HiRes::time();
+ $timesrvrini{$testnum} = Time::HiRes::time() if($timestats);
if(!$why) {
$why = serverfortest($testnum);
}
# timestamp required servers verification end
- $timesrvrend{$testnum} = Time::HiRes::time();
+ $timesrvrend{$testnum} = Time::HiRes::time() if($timestats);
my @setenv = getpart("client", "setenv");
if(@setenv) {
@@ -3344,7 +3642,6 @@ sub singletest {
}
}
$ENV{$var} = "$content";
- print "setenv $var = $content\n" if($verbose);
}
}
}
@@ -3460,7 +3757,7 @@ sub singletest {
}
# if this section exists, it might be FTP server instructions:
- my @ftpservercmd = fixarray ( getpart("reply", "servercmd") );
+ my @ftpservercmd = getpart("reply", "servercmd");
my $CURLOUT="$LOGDIR/curl$testnum.out"; # curl output if not stdout
@@ -3684,7 +3981,7 @@ sub singletest {
}
# timestamp starting of test command
- $timetoolini{$testnum} = Time::HiRes::time();
+ $timetoolini{$testnum} = Time::HiRes::time() if($timestats);
# run the command line we built
if ($torture) {
@@ -3712,7 +4009,7 @@ sub singletest {
}
# timestamp finishing of test command
- $timetoolend{$testnum} = Time::HiRes::time();
+ $timetoolend{$testnum} = Time::HiRes::time() if($timestats);
if(!$dumped_core) {
if(-r "core") {
@@ -3762,7 +4059,7 @@ sub singletest {
sleep($postcommanddelay) if($postcommanddelay);
# timestamp removal of server logs advisor read lock
- $timesrvrlog{$testnum} = Time::HiRes::time();
+ $timesrvrlog{$testnum} = Time::HiRes::time() if($timestats);
# test definition might instruct to stop some servers
# stop also all servers relative to the given one
@@ -3847,7 +4144,7 @@ sub singletest {
if($rc != 0 && !$torture) {
logmsg " postcheck FAILED\n";
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
}
@@ -3867,8 +4164,11 @@ sub singletest {
# Skip all the verification on torture tests
if ($torture) {
+ if(!$cmdres && !$keepoutfiles) {
+ cleardir($LOGDIR);
+ }
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return $cmdres;
}
@@ -4125,7 +4425,7 @@ sub singletest {
"has no name attribute\n";
stopservers($verbose);
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return -1;
}
my @generated=loadarray($filename);
@@ -4189,7 +4489,7 @@ sub singletest {
}
logmsg " exit FAILED\n";
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
@@ -4212,7 +4512,7 @@ sub singletest {
logmsg "\n** MEMORY FAILURE\n";
logmsg @memdata;
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
else {
@@ -4229,7 +4529,7 @@ sub singletest {
unless(opendir(DIR, "$LOGDIR")) {
logmsg "ERROR: unable to read $LOGDIR\n";
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
my @files = readdir(DIR);
@@ -4244,7 +4544,7 @@ sub singletest {
if(!$vgfile) {
logmsg "ERROR: valgrind log file missing for test $testnum\n";
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
my @e = valgrindparse("$LOGDIR/$vgfile");
@@ -4257,7 +4557,7 @@ sub singletest {
logmsg @e;
}
# timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
$ok .= "v";
@@ -4277,26 +4577,27 @@ sub singletest {
logmsg "$ok " if(!$short);
- # timestamp test result verification end
- $timevrfyend{$testnum} = Time::HiRes::time();
-
my $sofar= time()-$start;
my $esttotal = $sofar/$count * $total;
my $estleft = $esttotal - $sofar;
my $left=sprintf("remaining: %02d:%02d",
$estleft/60,
$estleft%60);
- my $took = $timevrfyend{$testnum} - $timeprepini{$testnum};
- my $duration = sprintf("duration: %02d:%02d",
- $sofar/60, $sofar%60);
+
if(!$automakestyle) {
- logmsg sprintf("OK (%-3d out of %-3d, %s, took %.1fs, %s)\n",
- $count, $total, $left, $took, $duration);
+ logmsg sprintf("OK (%-3d out of %-3d, %s)\n", $count, $total, $left);
}
else {
logmsg "PASS: $testnum - $testname\n";
}
+ # the test succeeded, remove all log files
+ if(!$keepoutfiles) {
+ cleardir($LOGDIR);
+ }
+
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 0;
}
@@ -4538,6 +4839,10 @@ sub startservers {
# we can't run ftps tests without stunnel
return "no stunnel";
}
+ if(!$has_ssl) {
+ # we can't run ftps tests if libcurl is SSL-less
+ return "curl lacks SSL support";
+ }
if($runcert{'ftps'} && ($runcert{'ftps'} ne $certfile)) {
# stop server when running and using a different cert
stopserver('ftps');
@@ -4572,6 +4877,10 @@ sub startservers {
# we can't run https tests without stunnel
return "no stunnel";
}
+ if(!$has_ssl) {
+ # we can't run https tests if libcurl is SSL-less
+ return "curl lacks SSL support";
+ }
if($runcert{'https'} && ($runcert{'https'} ne $certfile)) {
# stop server when running and using a different cert
stopserver('https');
@@ -4665,7 +4974,7 @@ sub startservers {
$run{'tftp-ipv6'}="$pid $pid2";
}
}
- elsif($what eq "sftp" || $what eq "scp") {
+ elsif($what eq "sftp" || $what eq "scp" || $what eq "socks4" || $what eq "socks5" ) {
if(!$run{'ssh'}) {
($pid, $pid2) = runsshserver("", $verbose);
if($pid <= 0) {
@@ -4674,15 +4983,32 @@ sub startservers {
printf ("* pid ssh => %d %d\n", $pid, $pid2) if($verbose);
$run{'ssh'}="$pid $pid2";
}
- }
- elsif($what eq "socks4" || $what eq "socks5" ) {
- if(!$run{'socks'}) {
- ($pid, $pid2) = runsocksserver("", $verbose);
- if($pid <= 0) {
- return "failed starting socks server";
+ if($what eq "socks4" || $what eq "socks5") {
+ if(!$run{'socks'}) {
+ ($pid, $pid2) = runsocksserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting socks server";
+ }
+ printf ("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'socks'}="$pid $pid2";
+ }
+ }
+ if($what eq "socks5") {
+ if(!$sshdid) {
+ # Not an OpenSSH or SunSSH ssh daemon
+ logmsg "Not OpenSSH or SunSSH; socks5 tests need at least OpenSSH 3.7\n";
+ return "failed starting socks5 server";
+ }
+ elsif(($sshdid =~ /OpenSSH/) && ($sshdvernum < 370)) {
+ # Need OpenSSH 3.7 for socks5 - https://www.openssh.com/txt/release-3.7
+ logmsg "$sshdverstr insufficient; socks5 tests need at least OpenSSH 3.7\n";
+ return "failed starting socks5 server";
+ }
+ elsif(($sshdid =~ /SunSSH/) && ($sshdvernum < 100)) {
+ # Need SunSSH 1.0 for socks5
+ logmsg "$sshdverstr insufficient; socks5 tests need at least SunSSH 1.0\n";
+ return "failed starting socks5 server";
}
- printf ("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
- $run{'socks'}="$pid $pid2";
}
}
elsif($what eq "http-unix") {
diff --git a/tests/server/Makefile.inc b/tests/server/Makefile.inc
index 6296af7cc..c6233affa 100644
--- a/tests/server/Makefile.inc
+++ b/tests/server/Makefile.inc
@@ -1,4 +1,4 @@
-noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm socksd disabled
+noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm
CURLX_SRCS = \
../../lib/mprintf.c \
@@ -50,12 +50,6 @@ sockfilt_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
sockfilt_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
sockfilt_CFLAGS = $(AM_CFLAGS)
-socksd_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
- server_sockaddr.h socksd.c \
- ../../lib/inet_pton.c
-socksd_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
-socksd_CFLAGS = $(AM_CFLAGS)
-
sws_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
server_sockaddr.h \
sws.c \
@@ -74,5 +68,3 @@ fake_ntlm_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
fake_ntlm.c
fake_ntlm_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
fake_ntlm_CFLAGS = $(AM_CFLAGS)
-
-disabled_SOURCES = disabled.c
diff --git a/tests/server/disabled.c b/tests/server/disabled.c
deleted file mode 100644
index c82847d8e..000000000
--- a/tests/server/disabled.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/*
- * The purpose of this tool is to figure out which, if any, features that are
- * disabled which should otherwise exist and work. These aren't visible in
- * regular curl -V output.
- *
- * Disabled protocols are visible in curl_version_info() and are not included
- * in this table.
- */
-
-#include "curl_setup.h"
-#include <stdio.h>
-
-static const char *disabled[]={
-#ifdef CURL_DISABLE_COOKIES
- "cookies",
-#endif
-#ifdef CURL_DISABLE_CRYPTO_AUTH
- "crypto",
-#endif
-#ifdef CURL_DISABLE_DOH
- "DoH",
-#endif
-#ifdef CURL_DISABLE_HTTP_AUTH
- "HTTP-auth",
-#endif
-#ifdef CURL_DISABLE_MIME
- "Mime",
-#endif
-#ifdef CURL_DISABLE_NETRC
- "netrc",
-#endif
-#ifdef CURL_DISABLE_PARSEDATE
- "parsedate",
-#endif
-#ifdef CURL_DISABLE_PROXY
- "proxy",
-#endif
-#ifdef CURL_DISABLE_SHUFFLE_DNS
- "shuffle-dns",
-#endif
-#ifdef CURL_DISABLE_TYPECHECK
- "typecheck",
-#endif
-#ifdef CURL_DISABLE_VERBOSE_STRINGS
- "verbose-strings",
-#endif
- NULL
-};
-
-int main(void)
-{
- int i;
- for(i = 0; disabled[i]; i++)
- printf("%s\n", disabled[i]);
-
- return 0;
-}
diff --git a/tests/server/socksd.c b/tests/server/socksd.c
deleted file mode 100644
index 5e32bc904..000000000
--- a/tests/server/socksd.c
+++ /dev/null
@@ -1,1162 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "server_setup.h"
-#include <stdlib.h>
-
-/* Function
- *
- * Accepts a TCP connection on a custom port (IPv4 or IPv6). Connects to a
- * given addr + port backend (that is NOT extracted form the client's
- * request). The backend server default to connect to can be set with
- * --backend and --backendport.
- *
- * Read commands from FILE (set with --config). The commands control how to
- * act and is reset to defaults each client TCP connect.
- *
- * Config file keywords:
- *
- * "version [number: 5]" - requires the communication to use this version.
- * "nmethods_min [number: 1]" - the minimum numberf NMETHODS the client must
- * state
- * "nmethods_max [number: 3]" - the minimum numberf NMETHODS the client must
- * state
- * "user [string]" - the user name that must match (if method is 2)
- * "password [string]" - the password that must match (if method is 2)
- * "backend [IPv4]" - numerical IPv4 address of backend to connect to
- * "backendport [number:0]" - TCP port of backend to connect to. 0 means use
- the client's specified port number.
- * "method [number: 0]" - connect method to respond with:
- * 0 - no auth
- * 1 - GSSAPI (not supported)
- * 2 - user + password
- * "response [number]" - the decimal number to repsond to a connect
- * SOCKS5: 0 is OK, SOCKS4: 90 is ok
- *
- */
-
-/* based on sockfilt.c */
-
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifdef HAVE_NETINET_IN6_H
-#include <netinet/in6.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-
-#define ENABLE_CURLX_PRINTF
-/* make the curlx header define all printf() functions to use the curlx_*
- versions instead */
-#include "curlx.h" /* from the private lib dir */
-#include "getpart.h"
-#include "inet_pton.h"
-#include "util.h"
-#include "server_sockaddr.h"
-#include "warnless.h"
-
-/* include memdebug.h last */
-#include "memdebug.h"
-
-#ifdef USE_WINSOCK
-#undef EINTR
-#define EINTR 4 /* errno.h value */
-#undef EAGAIN
-#define EAGAIN 11 /* errno.h value */
-#undef ENOMEM
-#define ENOMEM 12 /* errno.h value */
-#undef EINVAL
-#define EINVAL 22 /* errno.h value */
-#endif
-
-#define DEFAULT_PORT 8905
-
-#ifndef DEFAULT_LOGFILE
-#define DEFAULT_LOGFILE "log/socksd.log"
-#endif
-
-#ifndef DEFAULT_CONFIG
-#define DEFAULT_CONFIG "socksd.config"
-#endif
-
-static const char *backendaddr = "127.0.0.1";
-static unsigned short backendport = 0; /* default is use client's */
-
-struct configurable {
- unsigned char version; /* initial version byte in the request must match
- this */
- unsigned char nmethods_min; /* minimum number of nmethods to expect */
- unsigned char nmethods_max; /* maximum number of nmethods to expect */
- unsigned char responseversion;
- unsigned char responsemethod;
- unsigned char reqcmd;
- unsigned char connectrep;
- unsigned short port; /* backend port */
- char addr[32]; /* backend IPv4 numerical */
- char user[256];
- char password[256];
-};
-
-#define CONFIG_VERSION 5
-#define CONFIG_NMETHODS_MIN 1 /* unauth, gssapi, auth */
-#define CONFIG_NMETHODS_MAX 3
-#define CONFIG_RESPONSEVERSION CONFIG_VERSION
-#define CONFIG_RESPONSEMETHOD 0 /* no auth */
-#define CONFIG_REQCMD 1 /* CONNECT */
-#define CONFIG_PORT backendport
-#define CONFIG_ADDR backendaddr
-#define CONFIG_CONNECTREP 0
-
-static struct configurable config;
-
-const char *serverlogfile = DEFAULT_LOGFILE;
-static const char *configfile = DEFAULT_CONFIG;
-
-#ifdef ENABLE_IPV6
-static bool use_ipv6 = FALSE;
-#endif
-static const char *ipv_inuse = "IPv4";
-static unsigned short port = DEFAULT_PORT;
-
-static void resetdefaults(void)
-{
- logmsg("Reset to defaults");
- config.version = CONFIG_VERSION;
- config.nmethods_min = CONFIG_NMETHODS_MIN;
- config.nmethods_max = CONFIG_NMETHODS_MAX;
- config.responseversion = CONFIG_RESPONSEVERSION;
- config.responsemethod = CONFIG_RESPONSEMETHOD;
- config.reqcmd = CONFIG_REQCMD;
- config.connectrep = CONFIG_CONNECTREP;
- config.port = CONFIG_PORT;
- strcpy(config.addr, CONFIG_ADDR);
- strcpy(config.user, "user");
- strcpy(config.password, "password");
-}
-
-static unsigned char byteval(char *value)
-{
- unsigned long num = strtoul(value, NULL, 10);
- return num & 0xff;
-}
-
-static unsigned short shortval(char *value)
-{
- unsigned long num = strtoul(value, NULL, 10);
- return num & 0xffff;
-}
-
-static void getconfig(void)
-{
- FILE *fp = fopen(configfile, FOPEN_READTEXT);
- resetdefaults();
- if(fp) {
- char buffer[512];
- logmsg("parse config file");
- while(fgets(buffer, sizeof(buffer), fp)) {
- char key[32];
- char value[32];
- if(2 == sscanf(buffer, "%31s %31s", key, value)) {
- if(!strcmp(key, "version")) {
- config.version = byteval(value);
- logmsg("version [%d] set", config.version);
- }
- else if(!strcmp(key, "nmethods_min")) {
- config.nmethods_min = byteval(value);
- logmsg("nmethods_min [%d] set", config.nmethods_min);
- }
- else if(!strcmp(key, "nmethods_max")) {
- config.nmethods_max = byteval(value);
- logmsg("nmethods_max [%d] set", config.nmethods_max);
- }
- else if(!strcmp(key, "backend")) {
- strcpy(config.addr, value);
- logmsg("backend [%s] set", config.addr);
- }
- else if(!strcmp(key, "backendport")) {
- config.port = shortval(value);
- logmsg("backendport [%d] set", config.port);
- }
- else if(!strcmp(key, "user")) {
- strcpy(config.user, value);
- logmsg("user [%s] set", config.user);
- }
- else if(!strcmp(key, "password")) {
- strcpy(config.password, value);
- logmsg("password [%s] set", config.password);
- }
- /* Methods:
- o X'00' NO AUTHENTICATION REQUIRED
- o X'01' GSSAPI
- o X'02' USERNAME/PASSWORD
- */
- else if(!strcmp(key, "method")) {
- config.responsemethod = byteval(value);
- logmsg("method [%d] set", config.responsemethod);
- }
- else if(!strcmp(key, "response")) {
- config.connectrep = byteval(value);
- logmsg("response [%d] set", config.connectrep);
- }
- }
- }
- fclose(fp);
- }
-}
-
-
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGALRM
-static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGALRM
- /* ignore SIGALRM signal */
- old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
- if(old_sigalrm_handler == SIG_ERR)
- logmsg("cannot install SIGALRM handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGALRM
- if(SIG_ERR != old_sigalrm_handler)
- (void)signal(SIGALRM, old_sigalrm_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
-static void loghex(unsigned char *buffer, ssize_t len)
-{
- char data[1200];
- ssize_t i;
- unsigned char *ptr = buffer;
- char *optr = data;
- ssize_t width = 0;
- int left = sizeof(data);
-
- for(i = 0; i<len && (left >= 0); i++) {
- msnprintf(optr, left, "%02x", ptr[i]);
- width += 2;
- optr += 2;
- left -= 2;
- }
- if(width)
- logmsg("'%s'", data);
-}
-
-/* RFC 1928, SOCKS5 byte index */
-#define SOCKS5_VERSION 0
-#define SOCKS5_NMETHODS 1 /* number of methods that is listed */
-
-/* in the request: */
-#define SOCKS5_REQCMD 1
-#define SOCKS5_RESERVED 2
-#define SOCKS5_ATYP 3
-#define SOCKS5_DSTADDR 4
-
-/* connect response */
-#define SOCKS5_REP 1
-#define SOCKS5_BNDADDR 4
-
-/* auth request */
-#define SOCKS5_ULEN 1
-#define SOCKS5_UNAME 2
-
-#define SOCKS4_CD 1
-#define SOCKS4_DSTPORT 2
-
-/* connect to a given IPv4 address, not the one asked for */
-static curl_socket_t socksconnect(unsigned short connectport,
- const char *connectaddr)
-{
- int rc;
- srvr_sockaddr_union_t me;
- curl_socket_t sock = socket(AF_INET, SOCK_STREAM, 0);
- if(sock == CURL_SOCKET_BAD)
- return CURL_SOCKET_BAD;
- memset(&me.sa4, 0, sizeof(me.sa4));
- me.sa4.sin_family = AF_INET;
- me.sa4.sin_port = htons(connectport);
- me.sa4.sin_addr.s_addr = INADDR_ANY;
- Curl_inet_pton(AF_INET, connectaddr, &me.sa4.sin_addr);
-
- rc = connect(sock, &me.sa, sizeof(me.sa4));
-
- if(rc) {
- int error = SOCKERRNO;
- logmsg("Error connecting to %s:%hu: (%d) %s",
- connectaddr, connectport, error, strerror(error));
- return CURL_SOCKET_BAD;
- }
- logmsg("Connected fine to %s:%d", connectaddr, connectport);
- return sock;
-}
-
-static curl_socket_t socks4(curl_socket_t fd,
- unsigned char *buffer,
- ssize_t rc)
-{
- unsigned char response[256 + 16];
- curl_socket_t connfd;
- unsigned char cd;
- unsigned short s4port;
-
- if(buffer[SOCKS4_CD] != 1) {
- logmsg("SOCKS4 CD is not 1: %d", buffer[SOCKS4_CD]);
- return CURL_SOCKET_BAD;
- }
- if(rc < 9) {
- logmsg("SOCKS4 connect message too short: %d", rc);
- return CURL_SOCKET_BAD;
- }
- if(!config.port)
- s4port = (unsigned short)((buffer[SOCKS4_DSTPORT]<<8) |
- (buffer[SOCKS4_DSTPORT + 1]));
- else
- s4port = config.port;
-
- connfd = socksconnect(s4port, config.addr);
- if(connfd == CURL_SOCKET_BAD) {
- /* failed */
- cd = 91;
- }
- else {
- /* success */
- cd = 90;
- }
- response[0] = 0; /* reply version 0 */
- response[1] = cd; /* result */
- /* copy port and address from connect request */
- memcpy(&response[2], &buffer[SOCKS4_DSTPORT], 6);
- rc = (send)(fd, (char *)response, 8, 0);
- if(rc != 8) {
- logmsg("Sending SOCKS4 response failed!");
- return CURL_SOCKET_BAD;
- }
- logmsg("Sent %d bytes", rc);
- loghex(response, rc);
-
- if(cd == 90)
- /* now do the transfer */
- return connfd;
-
- if(connfd != CURL_SOCKET_BAD)
- sclose(connfd);
-
- return CURL_SOCKET_BAD;
-}
-
-static curl_socket_t sockit(curl_socket_t fd)
-{
- unsigned char buffer[256 + 16];
- unsigned char response[256 + 16];
- ssize_t rc;
- unsigned char len;
- unsigned char type;
- unsigned char rep = 0;
- unsigned char *address;
- unsigned short socksport;
- curl_socket_t connfd = CURL_SOCKET_BAD;
- unsigned short s5port;
-
- getconfig();
-
- rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
-
- logmsg("READ %d bytes", rc);
- loghex(buffer, rc);
-
- if(buffer[SOCKS5_VERSION] == 4)
- return socks4(fd, buffer, rc);
-
- if(buffer[SOCKS5_VERSION] != config.version) {
- logmsg("VERSION byte not %d", config.version);
- return CURL_SOCKET_BAD;
- }
- if((buffer[SOCKS5_NMETHODS] < config.nmethods_min) ||
- (buffer[SOCKS5_NMETHODS] > config.nmethods_max)) {
- logmsg("NMETHODS byte not within %d - %d ",
- config.nmethods_min, config.nmethods_max);
- return CURL_SOCKET_BAD;
- }
- /* after NMETHODS follows that many bytes listing the methods the client
- says it supports */
- if(rc != (buffer[SOCKS5_NMETHODS] + 2)) {
- logmsg("Expected %d bytes, got %d", buffer[SOCKS5_NMETHODS] + 2, rc);
- return CURL_SOCKET_BAD;
- }
- logmsg("Incoming request deemed fine!");
-
- /* respond with two bytes: VERSION + METHOD */
- response[0] = config.responseversion;
- response[1] = config.responsemethod;
- rc = (send)(fd, (char *)response, 2, 0);
- if(rc != 2) {
- logmsg("Sending response failed!");
- return CURL_SOCKET_BAD;
- }
- logmsg("Sent %d bytes", rc);
- loghex(response, rc);
-
- /* expect the request or auth */
- rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
-
- logmsg("READ %d bytes", rc);
- loghex(buffer, rc);
-
- if(config.responsemethod == 2) {
- /* RFC 1929 authentication
- +----+------+----------+------+----------+
- |VER | ULEN | UNAME | PLEN | PASSWD |
- +----+------+----------+------+----------+
- | 1 | 1 | 1 to 255 | 1 | 1 to 255 |
- +----+------+----------+------+----------+
- */
- unsigned char ulen;
- unsigned char plen;
- bool login = TRUE;
- if(rc < 5) {
- logmsg("Too short auth input: %d", rc);
- return CURL_SOCKET_BAD;
- }
- if(buffer[SOCKS5_VERSION] != 1) {
- logmsg("Auth VERSION byte not 1, got %d", buffer[SOCKS5_VERSION]);
- return CURL_SOCKET_BAD;
- }
- ulen = buffer[SOCKS5_ULEN];
- if(rc < 4 + ulen) {
- logmsg("Too short packet for username: %d", rc);
- return CURL_SOCKET_BAD;
- }
- plen = buffer[SOCKS5_ULEN + ulen + 1];
- if(rc < 3 + ulen + plen) {
- logmsg("Too short packet for ulen %d plen %d: %d", ulen, plen, rc);
- return CURL_SOCKET_BAD;
- }
- if((ulen != strlen(config.user)) ||
- (plen != strlen(config.password)) ||
- memcmp(&buffer[SOCKS5_UNAME], config.user, ulen) ||
- memcmp(&buffer[SOCKS5_UNAME + ulen + 1], config.password, plen)) {
- /* no match! */
- logmsg("mismatched credentials!");
- login = FALSE;
- }
- response[0] = 1;
- response[1] = login ? 0 : 1;
- rc = (send)(fd, (char *)response, 2, 0);
- if(rc != 2) {
- logmsg("Sending auth response failed!");
- return CURL_SOCKET_BAD;
- }
- logmsg("Sent %d bytes", rc);
- loghex(response, rc);
- if(!login)
- return CURL_SOCKET_BAD;
-
- /* expect the request */
- rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
-
- logmsg("READ %d bytes", rc);
- loghex(buffer, rc);
- }
- if(rc < 6) {
- logmsg("Too short for request: %d", rc);
- return CURL_SOCKET_BAD;
- }
-
- if(buffer[SOCKS5_VERSION] != config.version) {
- logmsg("Request VERSION byte not %d", config.version);
- return CURL_SOCKET_BAD;
- }
- /* 1 == CONNECT */
- if(buffer[SOCKS5_REQCMD] != config.reqcmd) {
- logmsg("Request COMMAND byte not %d", config.reqcmd);
- return CURL_SOCKET_BAD;
- }
- /* reserved, should be zero */
- if(buffer[SOCKS5_RESERVED] != 0) {
- logmsg("Request COMMAND byte not %d", config.reqcmd);
- return CURL_SOCKET_BAD;
- }
- /* ATYP:
- o IP V4 address: X'01'
- o DOMAINNAME: X'03'
- o IP V6 address: X'04'
- */
- type = buffer[SOCKS5_ATYP];
- address = &buffer[SOCKS5_DSTADDR];
- switch(type) {
- case 1:
- /* 4 bytes IPv4 address */
- len = 4;
- break;
- case 3:
- /* The first octet of the address field contains the number of octets of
- name that follow */
- len = buffer[SOCKS5_DSTADDR];
- len++;
- break;
- case 4:
- /* 16 bytes IPv6 address */
- len = 16;
- break;
- default:
- logmsg("Unknown ATYP %d", type);
- return CURL_SOCKET_BAD;
- }
- if(rc < (4 + len + 2)) {
- logmsg("Request too short: %d, expected %d", rc, 4 + len + 2);
- return CURL_SOCKET_BAD;
- }
-
- if(!config.port) {
- unsigned char *portp = &buffer[SOCKS5_DSTADDR + len];
- s5port = (unsigned short)((portp[0]<<8) | (portp[1]));
- }
- else
- s5port = config.port;
-
- if(!config.connectrep)
- connfd = socksconnect(s5port, config.addr);
-
- if(connfd == CURL_SOCKET_BAD) {
- /* failed */
- rep = 1;
- }
- else {
- rep = config.connectrep;
- }
-
- /* */
- response[SOCKS5_VERSION] = config.responseversion;
-
- /*
- o REP Reply field:
- o X'00' succeeded
- o X'01' general SOCKS server failure
- o X'02' connection not allowed by ruleset
- o X'03' Network unreachable
- o X'04' Host unreachable
- o X'05' Connection refused
- o X'06' TTL expired
- o X'07' Command not supported
- o X'08' Address type not supported
- o X'09' to X'FF' unassigned
- */
- response[SOCKS5_REP] = rep;
- response[SOCKS5_RESERVED] = 0; /* must be zero */
- response[SOCKS5_ATYP] = type; /* address type */
-
- /* mirror back the original addr + port */
-
- /* address or hostname */
- memcpy(&response[SOCKS5_BNDADDR], address, len);
-
- /* port number */
- memcpy(&response[SOCKS5_BNDADDR + len],
- &buffer[SOCKS5_DSTADDR + len], sizeof(socksport));
-
- rc = (send)(fd, (char *)response, len + 6, 0);
- if(rc != (len + 6)) {
- logmsg("Sending connect response failed!");
- return CURL_SOCKET_BAD;
- }
- logmsg("Sent %d bytes", rc);
- loghex(response, rc);
-
- if(!rep)
- return connfd;
-
- if(connfd != CURL_SOCKET_BAD)
- sclose(connfd);
-
- return CURL_SOCKET_BAD;
-}
-
-struct perclient {
- size_t fromremote;
- size_t fromclient;
- curl_socket_t remotefd;
- curl_socket_t clientfd;
- bool used;
-};
-
-/* return non-zero when transfer is done */
-static int tunnel(struct perclient *cp, fd_set *fds)
-{
- ssize_t nread;
- ssize_t nwrite;
- char buffer[512];
- if(FD_ISSET(cp->clientfd, fds)) {
- /* read from client, send to remote */
- nread = recv(cp->clientfd, buffer, sizeof(buffer), 0);
- if(nread > 0) {
- nwrite = send(cp->remotefd, (char *)buffer,
- (SEND_TYPE_ARG3)nread, 0);
- if(nwrite != nread)
- return 1;
- cp->fromclient += nwrite;
- }
- else
- return 1;
- }
- if(FD_ISSET(cp->remotefd, fds)) {
- /* read from remote, send to client */
- nread = recv(cp->remotefd, buffer, sizeof(buffer), 0);
- if(nread > 0) {
- nwrite = send(cp->clientfd, (char *)buffer,
- (SEND_TYPE_ARG3)nread, 0);
- if(nwrite != nread)
- return 1;
- cp->fromremote += nwrite;
- }
- else
- return 1;
- }
- return 0;
-}
-
-/*
- sockfdp is a pointer to an established stream or CURL_SOCKET_BAD
-
- if sockfd is CURL_SOCKET_BAD, listendfd is a listening socket we must
- accept()
-*/
-static bool incoming(curl_socket_t listenfd)
-{
- fd_set fds_read;
- fd_set fds_write;
- fd_set fds_err;
- int clients = 0; /* connected clients */
- struct perclient c[2];
-
- memset(c, 0, sizeof(c));
- if(got_exit_signal) {
- logmsg("signalled to die, exiting...");
- return FALSE;
- }
-
-#ifdef HAVE_GETPPID
- /* As a last resort, quit if socks5 process becomes orphan. */
- if(getppid() <= 1) {
- logmsg("process becomes orphan, exiting");
- return FALSE;
- }
-#endif
-
- do {
- int i;
- ssize_t rc;
- int error = 0;
- curl_socket_t sockfd = listenfd;
- int maxfd = (int)sockfd;
-
- FD_ZERO(&fds_read);
- FD_ZERO(&fds_write);
- FD_ZERO(&fds_err);
-
- /* there's always a socket to wait for */
- FD_SET(sockfd, &fds_read);
-
- for(i = 0; i < 2; i++) {
- if(c[i].used) {
- curl_socket_t fd = c[i].clientfd;
- FD_SET(fd, &fds_read);
- if((int)fd > maxfd)
- maxfd = (int)fd;
- fd = c[i].remotefd;
- FD_SET(fd, &fds_read);
- if((int)fd > maxfd)
- maxfd = (int)fd;
- }
- }
-
- do {
- /* select() blocking behavior call on blocking descriptors please */
- rc = select(maxfd + 1, &fds_read, &fds_write, &fds_err, NULL);
- if(got_exit_signal) {
- logmsg("signalled to die, exiting...");
- return FALSE;
- }
- } while((rc == -1) && ((error = errno) == EINTR));
-
- if(rc < 0) {
- logmsg("select() failed with error: (%d) %s",
- error, strerror(error));
- return FALSE;
- }
-
- if((clients < 2) && FD_ISSET(sockfd, &fds_read)) {
- curl_socket_t newfd = accept(sockfd, NULL, NULL);
- if(CURL_SOCKET_BAD == newfd) {
- error = SOCKERRNO;
- logmsg("accept(%d, NULL, NULL) failed with error: (%d) %s",
- sockfd, error, strerror(error));
- }
- else {
- curl_socket_t remotefd;
- logmsg("====> Client connect, fd %d. Read config from %s",
- newfd, configfile);
- remotefd = sockit(newfd); /* SOCKS until done */
- if(remotefd == CURL_SOCKET_BAD) {
- logmsg("====> Client disconnect");
- sclose(newfd);
- }
- else {
- struct perclient *cp = &c[0];
- logmsg("====> Tunnel transfer");
-
- if(c[0].used)
- cp = &c[1];
- cp->fromremote = 0;
- cp->fromclient = 0;
- cp->clientfd = newfd;
- cp->remotefd = remotefd;
- cp->used = TRUE;
- clients++;
- }
-
- }
- }
- for(i = 0; i < 2; i++) {
- struct perclient *cp = &c[i];
- if(cp->used) {
- if(tunnel(cp, &fds_read)) {
- logmsg("SOCKS transfer completed. Bytes: < %zu > %zu",
- cp->fromremote, cp->fromclient);
- sclose(cp->clientfd);
- sclose(cp->remotefd);
- cp->used = FALSE;
- clients--;
- }
- }
- }
- } while(clients);
-
- return TRUE;
-}
-
-static curl_socket_t sockdaemon(curl_socket_t sock,
- unsigned short *listenport)
-{
- /* passive daemon style */
- srvr_sockaddr_union_t listener;
- int flag;
- int rc;
- int totdelay = 0;
- int maxretr = 10;
- int delay = 20;
- int attempt = 0;
- int error = 0;
-
- do {
- attempt++;
- flag = 1;
- rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
- (void *)&flag, sizeof(flag));
- if(rc) {
- error = SOCKERRNO;
- logmsg("setsockopt(SO_REUSEADDR) failed with error: (%d) %s",
- error, strerror(error));
- if(maxretr) {
- rc = wait_ms(delay);
- if(rc) {
- /* should not happen */
- error = errno;
- logmsg("wait_ms() failed with error: (%d) %s",
- error, strerror(error));
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
- if(got_exit_signal) {
- logmsg("signalled to die, exiting...");
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
- totdelay += delay;
- delay *= 2; /* double the sleep for next attempt */
- }
- }
- } while(rc && maxretr--);
-
- if(rc) {
- logmsg("setsockopt(SO_REUSEADDR) failed %d times in %d ms. Error: (%d) %s",
- attempt, totdelay, error, strerror(error));
- logmsg("Continuing anyway...");
- }
-
- /* When the specified listener port is zero, it is actually a
- request to let the system choose a non-zero available port. */
-
-#ifdef ENABLE_IPV6
- if(!use_ipv6) {
-#endif
- memset(&listener.sa4, 0, sizeof(listener.sa4));
- listener.sa4.sin_family = AF_INET;
- listener.sa4.sin_addr.s_addr = INADDR_ANY;
- listener.sa4.sin_port = htons(*listenport);
- rc = bind(sock, &listener.sa, sizeof(listener.sa4));
-#ifdef ENABLE_IPV6
- }
- else {
- memset(&listener.sa6, 0, sizeof(listener.sa6));
- listener.sa6.sin6_family = AF_INET6;
- listener.sa6.sin6_addr = in6addr_any;
- listener.sa6.sin6_port = htons(*listenport);
- rc = bind(sock, &listener.sa, sizeof(listener.sa6));
- }
-#endif /* ENABLE_IPV6 */
- if(rc) {
- error = SOCKERRNO;
- logmsg("Error binding socket on port %hu: (%d) %s",
- *listenport, error, strerror(error));
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
-
- if(!*listenport) {
- /* The system was supposed to choose a port number, figure out which
- port we actually got and update the listener port value with it. */
- curl_socklen_t la_size;
- srvr_sockaddr_union_t localaddr;
-#ifdef ENABLE_IPV6
- if(!use_ipv6)
-#endif
- la_size = sizeof(localaddr.sa4);
-#ifdef ENABLE_IPV6
- else
- la_size = sizeof(localaddr.sa6);
-#endif
- memset(&localaddr.sa, 0, (size_t)la_size);
- if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
- error = SOCKERRNO;
- logmsg("getsockname() failed with error: (%d) %s",
- error, strerror(error));
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
- switch(localaddr.sa.sa_family) {
- case AF_INET:
- *listenport = ntohs(localaddr.sa4.sin_port);
- break;
-#ifdef ENABLE_IPV6
- case AF_INET6:
- *listenport = ntohs(localaddr.sa6.sin6_port);
- break;
-#endif
- default:
- break;
- }
- if(!*listenport) {
- /* Real failure, listener port shall not be zero beyond this point. */
- logmsg("Apparently getsockname() succeeded, with listener port zero.");
- logmsg("A valid reason for this failure is a binary built without");
- logmsg("proper network library linkage. This might not be the only");
- logmsg("reason, but double check it before anything else.");
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
- }
-
- /* start accepting connections */
- rc = listen(sock, 5);
- if(0 != rc) {
- error = SOCKERRNO;
- logmsg("listen(%d, 5) failed with error: (%d) %s",
- sock, error, strerror(error));
- sclose(sock);
- return CURL_SOCKET_BAD;
- }
-
- return sock;
-}
-
-
-int main(int argc, char *argv[])
-{
- curl_socket_t sock = CURL_SOCKET_BAD;
- curl_socket_t msgsock = CURL_SOCKET_BAD;
- int wrotepidfile = 0;
- const char *pidname = ".socksd.pid";
- bool juggle_again;
- int error;
- int arg = 1;
-
- while(argc>arg) {
- if(!strcmp("--version", argv[arg])) {
- printf("socksd IPv4%s\n",
-#ifdef ENABLE_IPV6
- "/IPv6"
-#else
- ""
-#endif
- );
- return 0;
- }
- else if(!strcmp("--pidfile", argv[arg])) {
- arg++;
- if(argc>arg)
- pidname = argv[arg++];
- }
- else if(!strcmp("--config", argv[arg])) {
- arg++;
- if(argc>arg)
- configfile = argv[arg++];
- }
- else if(!strcmp("--backend", argv[arg])) {
- arg++;
- if(argc>arg)
- backendaddr = argv[arg++];
- }
- else if(!strcmp("--backendport", argv[arg])) {
- arg++;
- if(argc>arg)
- backendport = (unsigned short)atoi(argv[arg++]);
- }
- else if(!strcmp("--logfile", argv[arg])) {
- arg++;
- if(argc>arg)
- serverlogfile = argv[arg++];
- }
- else if(!strcmp("--ipv6", argv[arg])) {
-#ifdef ENABLE_IPV6
- ipv_inuse = "IPv6";
- use_ipv6 = TRUE;
-#endif
- arg++;
- }
- else if(!strcmp("--ipv4", argv[arg])) {
- /* for completeness, we support this option as well */
-#ifdef ENABLE_IPV6
- ipv_inuse = "IPv4";
- use_ipv6 = FALSE;
-#endif
- arg++;
- }
- else if(!strcmp("--port", argv[arg])) {
- arg++;
- if(argc>arg) {
- char *endptr;
- unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
- if((endptr != argv[arg] + strlen(argv[arg])) ||
- ((ulnum != 0UL) && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
- fprintf(stderr, "socksd: invalid --port argument (%s)\n",
- argv[arg]);
- return 0;
- }
- port = curlx_ultous(ulnum);
- arg++;
- }
- }
- else {
- puts("Usage: socksd [option]\n"
- " --backend [ipv4 addr]\n"
- " --backendport [TCP port]\n"
- " --config [file]\n"
- " --version\n"
- " --logfile [file]\n"
- " --pidfile [file]\n"
- " --ipv4\n"
- " --ipv6\n"
- " --bindonly\n"
- " --port [port]\n");
- return 0;
- }
- }
-
-#ifdef WIN32
- win32_init();
- atexit(win32_cleanup);
-
- setmode(fileno(stdin), O_BINARY);
- setmode(fileno(stdout), O_BINARY);
- setmode(fileno(stderr), O_BINARY);
-#endif
-
- install_signal_handlers();
-
-#ifdef ENABLE_IPV6
- if(!use_ipv6)
-#endif
- sock = socket(AF_INET, SOCK_STREAM, 0);
-#ifdef ENABLE_IPV6
- else
- sock = socket(AF_INET6, SOCK_STREAM, 0);
-#endif
-
- if(CURL_SOCKET_BAD == sock) {
- error = SOCKERRNO;
- logmsg("Error creating socket: (%d) %s",
- error, strerror(error));
- goto socks5_cleanup;
- }
-
- {
- /* passive daemon style */
- sock = sockdaemon(sock, &port);
- if(CURL_SOCKET_BAD == sock) {
- goto socks5_cleanup;
- }
- msgsock = CURL_SOCKET_BAD; /* no stream socket yet */
- }
-
- logmsg("Running %s version", ipv_inuse);
- logmsg("Listening on port %hu", port);
-
- wrotepidfile = write_pidfile(pidname);
- if(!wrotepidfile) {
- goto socks5_cleanup;
- }
-
- do {
- juggle_again = incoming(sock);
- } while(juggle_again);
-
-socks5_cleanup:
-
- if((msgsock != sock) && (msgsock != CURL_SOCKET_BAD))
- sclose(msgsock);
-
- if(sock != CURL_SOCKET_BAD)
- sclose(sock);
-
- if(wrotepidfile)
- unlink(pidname);
-
- restore_signal_handlers();
-
- if(got_exit_signal) {
- logmsg("============> socksd exits with signal (%d)", exit_signal);
- /*
- * To properly set the return status of the process we
- * must raise the same signal SIGINT or SIGTERM that we
- * caught and let the old handler take care of it.
- */
- raise(exit_signal);
- }
-
- logmsg("============> socksd quits");
- return 0;
-}
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 963357799..87c0204c9 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -111,12 +111,15 @@ struct httprequest {
bool ntlm; /* Authorization ntlm header found */
int writedelay; /* if non-zero, delay this number of seconds between
writes in the response */
+ int pipe; /* if non-zero, expect this many requests to do a "piped"
+ request/response */
int skip; /* if non-zero, the server is instructed to not read this
many bytes from a PUT/POST request. Ie the client sends N
bytes said in Content-Length, but the server only reads N
- skip bytes. */
int rcmd; /* doing a special command, see defines above */
int prot_version; /* HTTP version * 10 */
+ bool pipelining; /* true if request is pipelined */
int callcount; /* times ProcessRequest() gets called */
bool connmon; /* monitor the state of the connection, log disconnects */
bool upgrade; /* test case allows upgrade to http2 */
@@ -423,6 +426,14 @@ static int parse_servercmd(struct httprequest *req)
logmsg("swsclose: close this connection after response");
req->close = TRUE;
}
+ else if(1 == sscanf(cmd, "pipe: %d", &num)) {
+ logmsg("instructed to allow a pipe size of %d", num);
+ if(num < 0)
+ logmsg("negative pipe size ignored");
+ else if(num > 0)
+ req->pipe = num-1; /* decrease by one since we don't count the
+ first request in this number */
+ }
else if(1 == sscanf(cmd, "skip: %d", &num)) {
logmsg("instructed to skip this number of bytes %d", num);
req->skip = num;
@@ -695,6 +706,11 @@ static int ProcessRequest(struct httprequest *req)
}
}
+ if(req->pipe)
+ /* we do have a full set, advance the checkindex to after the end of the
+ headers, for the pipelining case mostly */
+ req->checkindex += (end - line) + strlen(end_of_headers);
+
/* **** Persistence ****
*
* If the request is a HTTP/1.0 one, we close the connection unconditionally
@@ -828,7 +844,8 @@ static int ProcessRequest(struct httprequest *req)
if(strstr(req->reqbuf, "Connection: close"))
req->open = FALSE; /* close connection after this request */
- if(req->open &&
+ if(!req->pipe &&
+ req->open &&
req->prot_version >= 11 &&
end &&
req->reqbuf + req->offset > end + strlen(end_of_headers) &&
@@ -838,6 +855,19 @@ static int ProcessRequest(struct httprequest *req)
/* If we have a persistent connection, HTTP version >= 1.1
and GET/HEAD request, enable pipelining. */
req->checkindex = (end - req->reqbuf) + strlen(end_of_headers);
+ req->pipelining = TRUE;
+ }
+
+ while(req->pipe) {
+ if(got_exit_signal)
+ return 1; /* done */
+ /* scan for more header ends within this chunk */
+ line = &req->reqbuf[req->checkindex];
+ end = strstr(line, end_of_headers);
+ if(!end)
+ break;
+ req->checkindex += (end - line) + strlen(end_of_headers);
+ req->pipe--;
}
/* If authentication is required and no auth was provided, end now. This
@@ -921,8 +951,13 @@ storerequest_cleanup:
static void init_httprequest(struct httprequest *req)
{
- req->checkindex = 0;
- req->offset = 0;
+ /* Pipelining is already set, so do not initialize it here. Only initialize
+ checkindex and offset if pipelining is not set, since in a pipeline they
+ need to be inherited from the previous request. */
+ if(!req->pipelining) {
+ req->checkindex = 0;
+ req->offset = 0;
+ }
req->testno = DOCNUMBER_NOTHING;
req->partno = 0;
req->connect_request = FALSE;
@@ -932,6 +967,7 @@ static void init_httprequest(struct httprequest *req)
req->cl = 0;
req->digest = FALSE;
req->ntlm = FALSE;
+ req->pipe = 0;
req->skip = 0;
req->writedelay = 0;
req->rcmd = RCMD_NORMALREQ;
@@ -952,19 +988,39 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
ssize_t got = 0;
int overflow = 0;
+ char *pipereq = NULL;
+ size_t pipereq_length = 0;
+
+ if(req->pipelining) {
+ pipereq = reqbuf + req->checkindex;
+ pipereq_length = req->offset - req->checkindex;
+
+ /* Now that we've got the pipelining info we can reset the
+ pipelining-related vars which were skipped in init_httprequest */
+ req->pipelining = FALSE;
+ req->checkindex = 0;
+ req->offset = 0;
+ }
+
if(req->offset >= REQBUFSIZ-1) {
/* buffer is already full; do nothing */
overflow = 1;
}
else {
- if(req->skip)
- /* we are instructed to not read the entire thing, so we make sure to
- only read what we're supposed to and NOT read the enire thing the
- client wants to send! */
- got = sread(sock, reqbuf + req->offset, req->cl);
- else
- got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset);
-
+ if(pipereq_length && pipereq) {
+ memmove(reqbuf, pipereq, pipereq_length);
+ got = curlx_uztosz(pipereq_length);
+ pipereq_length = 0;
+ }
+ else {
+ if(req->skip)
+ /* we are instructed to not read the entire thing, so we make sure to
+ only read what we're supposed to and NOT read the enire thing the
+ client wants to send! */
+ got = sread(sock, reqbuf + req->offset, req->cl);
+ else
+ got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset);
+ }
if(got_exit_signal)
return -1;
if(got == 0) {
@@ -995,6 +1051,11 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
req->done_processing = ProcessRequest(req);
if(got_exit_signal)
return -1;
+ if(req->done_processing && req->pipe) {
+ logmsg("Waiting for another piped request");
+ req->done_processing = 0;
+ req->pipe--;
+ }
}
if(overflow || (req->offset == REQBUFSIZ-1 && got > 0)) {
@@ -1014,7 +1075,7 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
/* at the end of a request dump it to an external file */
if(fail || req->done_processing)
- storerequest(reqbuf, req->offset);
+ storerequest(reqbuf, req->pipelining ? req->checkindex : req->offset);
if(got_exit_signal)
return -1;
@@ -1537,6 +1598,7 @@ static void http_connect(curl_socket_t *infdp,
logmsg("====> TCP_NODELAY for client DATA connection failed");
}
#endif
+ req2.pipelining = FALSE;
init_httprequest(&req2);
while(!req2.done_processing) {
err = get_request(datafd, &req2);
@@ -2219,6 +2281,7 @@ int main(int argc, char *argv[])
the pipelining struct field must be initialized previously to FALSE
every time a new connection arrives. */
+ req.pipelining = FALSE;
init_httprequest(&req);
for(;;) {
diff --git a/tests/server/util.c b/tests/server/util.c
index cc53d3bf4..c3935f58a 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -150,8 +150,8 @@ void win32_perror(const char *msg)
char buf[512];
DWORD err = SOCKERRNO;
- if(!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
- LANG_NEUTRAL, buf, sizeof(buf), NULL))
+ if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ LANG_NEUTRAL, buf, sizeof(buf), NULL))
msnprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err);
if(msg)
fprintf(stderr, "%s: ", msg);
diff --git a/tests/smbserver.py b/tests/smbserver.py
index 4fcd34f2b..195ae395b 100755
--- a/tests/smbserver.py
+++ b/tests/smbserver.py
@@ -24,14 +24,11 @@
from __future__ import (absolute_import, division, print_function)
# unicode_literals)
import argparse
+import ConfigParser
import os
import sys
import logging
import tempfile
-try: # Python 3
- import configparser
-except ImportError: # Python 2
- import ConfigParser as configparser
# Import our curl test data helper
import curl_test_data
@@ -61,7 +58,7 @@ def smbserver(options):
f.write("{0}".format(pid))
# Here we write a mini config for the server
- smb_config = configparser.ConfigParser()
+ smb_config = ConfigParser.ConfigParser()
smb_config.add_section("global")
smb_config.set("global", "server_name", "SERVICE")
smb_config.set("global", "server_os", "UNIX")
@@ -89,7 +86,7 @@ def smbserver(options):
test_data_dir = os.path.join(options.srcdir, "data")
- smb_server = TestSmbServer((options.host, options.port),
+ smb_server = TestSmbServer(("127.0.0.1", options.port),
config_parser=smb_config,
test_data_directory=test_data_dir)
log.info("[SMB] setting up SMB server on port %s", options.port)
@@ -315,8 +312,6 @@ def get_options():
parser.add_argument("--port", action="store", default=9017,
type=int, help="port to listen on")
- parser.add_argument("--host", action="store", default="127.0.0.1",
- help="host to listen on")
parser.add_argument("--verbose", action="store", type=int, default=0,
help="verbose output")
parser.add_argument("--pidfile", action="store",
diff --git a/tests/sshhelp.pm b/tests/sshhelp.pm
index 47ea2324c..7345eb300 100644
--- a/tests/sshhelp.pm
+++ b/tests/sshhelp.pm
@@ -430,16 +430,6 @@ sub sshversioninfo {
$error = undef;
last;
}
- if($tmpstr =~ /OpenSSH[_-]for[_-]Windows[_-](\d+)\.(\d+)(\.(\d+))*/i) {
- $major = $1;
- $minor = $2;
- $patch = $4?$4:0;
- $sshid = 'OpenSSH-Windows';
- $versnum = (100*$major) + (10*$minor) + $patch;
- $versstr = "$sshid $major.$minor.$patch";
- $error = undef;
- last;
- }
if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
$major = $1;
$minor = $2;
diff --git a/tests/sshserver.pl b/tests/sshserver.pl
index bcb2f1b3a..9b3d122fd 100644..100755
--- a/tests/sshserver.pl
+++ b/tests/sshserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
#
#***************************************************************************
-# Starts sshd for use in the SCP and SFTP curl test harness tests.
+# Starts sshd for use in the SCP, SFTP and SOCKS curl test harness tests.
# Also creates the ssh configuration files needed for these tests.
use strict;
@@ -81,6 +81,7 @@ use pathhelp;
my $verbose = 0; # set to 1 for debugging
my $debugprotocol = 0; # set to 1 for protocol debugging
my $port = 8999; # our default SCP/SFTP server port
+my $socksport = $port + 1; # our default SOCKS4/5 server port
my $listenaddr = '127.0.0.1'; # default address on which to listen
my $ipvnum = 4; # default IP version of listener address
my $idnum = 1; # default ssh daemon instance number
@@ -156,6 +157,14 @@ while(@ARGV) {
}
}
}
+ elsif($ARGV[0] eq '--socksport') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $socksport = $1;
+ shift @ARGV;
+ }
+ }
+ }
else {
print STDERR "\nWarning: sshserver.pl unknown parameter: $ARGV[0]\n";
}
@@ -172,10 +181,11 @@ if(!$pidfile) {
#***************************************************************************
-# ssh and sftp server log file names
+# ssh, socks and sftp server log file names
#
$sshdlog = server_logfilename($logdir, 'ssh', $ipvnum, $idnum);
$sftplog = server_logfilename($logdir, 'sftp', $ipvnum, $idnum);
+$sshlog = server_logfilename($logdir, 'socks', $ipvnum, $idnum);
#***************************************************************************
@@ -216,7 +226,7 @@ my ($sshdid, $sshdvernum, $sshdverstr, $sshderror) = sshversioninfo($sshd);
if(!$sshdid) {
# Not an OpenSSH or SunSSH ssh daemon
logmsg $sshderror if($verbose);
- logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
exit 1;
}
logmsg "ssh server found $sshd is $sshdverstr" if($verbose);
@@ -245,7 +255,7 @@ logmsg "ssh server found $sshd is $sshdverstr" if($verbose);
#
if((($sshdid =~ /OpenSSH/) && ($sshdvernum < 299)) ||
(($sshdid =~ /SunSSH/) && ($sshdvernum < 100))) {
- logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
exit 1;
}
@@ -300,7 +310,7 @@ my ($sshid, $sshvernum, $sshverstr, $ssherror) = sshversioninfo($ssh);
if(!$sshid) {
# Not an OpenSSH or SunSSH ssh client
logmsg $ssherror if($verbose);
- logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
exit 1;
}
logmsg "ssh client found $ssh is $sshverstr" if($verbose);
@@ -331,7 +341,7 @@ logmsg "ssh client found $ssh is $sshverstr" if($verbose);
#
if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
(($sshid =~ /SunSSH/) && ($sshvernum < 100))) {
- logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
exit 1;
}
@@ -389,17 +399,6 @@ if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
$pidfile_config = pathhelp::build_sys_abs_path($pidfile_config);
$sftpsrv_config = "internal-sftp";
}
-if ($sshdid =~ /OpenSSH-Windows/) {
- # Ensure to use native Windows paths with OpenSSH for Windows
- $clipubkeyf_config = pathhelp::sys_native_abs_path($clipubkeyf);
- $hstprvkeyf_config = pathhelp::sys_native_abs_path($hstprvkeyf);
- $pidfile_config = pathhelp::sys_native_abs_path($pidfile);
- $sftpsrv_config = pathhelp::sys_native_abs_path($sftpsrv);
-
- $sshdconfig = pathhelp::sys_native_abs_path($sshdconfig);
- $sshconfig = pathhelp::sys_native_abs_path($sshconfig);
- $sftpconfig = pathhelp::sys_native_abs_path($sftpconfig);
-}
#***************************************************************************
# ssh daemon configuration file options we might use and version support
@@ -494,18 +493,8 @@ logmsg 'generating ssh server config file...' if($verbose);
push @cfgarr, '# This is a generated file. Do not edit.';
push @cfgarr, "# $sshdverstr sshd configuration file for curl testing";
push @cfgarr, '#';
-
-# AllowUsers and DenyUsers options should use lowercase on Windows
-# and do not support quotes around values for some unknown reason.
-if ($sshdid =~ /OpenSSH-Windows/) {
- my $username_lc = lc $username;
- push @cfgarr, "DenyUsers !$username_lc";
- push @cfgarr, "AllowUsers $username_lc";
-} else {
- push @cfgarr, "DenyUsers !$username";
- push @cfgarr, "AllowUsers $username";
-}
-
+push @cfgarr, "DenyUsers !$username";
+push @cfgarr, "AllowUsers $username";
push @cfgarr, 'DenyGroups';
push @cfgarr, 'AllowGroups';
push @cfgarr, '#';
@@ -779,11 +768,7 @@ if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
$identity_config = pathhelp::build_sys_abs_path($identity_config);
$knownhosts_config = pathhelp::build_sys_abs_path($knownhosts_config);
}
-if ($sshdid =~ /OpenSSH-Windows/) {
- # Ensure to use native Windows paths with OpenSSH for Windows
- $identity_config = pathhelp::sys_native_abs_path($identity);
- $knownhosts_config = pathhelp::sys_native_abs_path($knownhosts);
-}
+
#***************************************************************************
# ssh client configuration file options we might use and version support
@@ -878,12 +863,8 @@ push @cfgarr, "HostName $listenaddr";
push @cfgarr, "User $username";
push @cfgarr, 'Protocol 2';
push @cfgarr, '#';
-
-# BindAddress option is not supported by OpenSSH for Windows
-if (!($sshdid =~ /OpenSSH-Windows/)) {
- push @cfgarr, "BindAddress $listenaddr";
-}
-
+push @cfgarr, "BindAddress $listenaddr";
+push @cfgarr, "DynamicForward $socksport";
push @cfgarr, '#';
push @cfgarr, "IdentityFile $identity_config";
push @cfgarr, "UserKnownHostsFile $knownhosts_config";
@@ -905,12 +886,8 @@ push @cfgarr, 'NumberOfPasswordPrompts 0';
push @cfgarr, 'PasswordAuthentication no';
push @cfgarr, 'PreferredAuthentications publickey';
push @cfgarr, 'PubkeyAuthentication yes';
-
-# RSA authentication options are not supported by OpenSSH for Windows
-if (!($sshdid =~ /OpenSSH-Windows/)) {
- push @cfgarr, 'RhostsRSAAuthentication no';
- push @cfgarr, 'RSAAuthentication no';
-}
+push @cfgarr, 'RhostsRSAAuthentication no';
+push @cfgarr, 'RSAAuthentication no';
# Disabled StrictHostKeyChecking since it makes the tests fail on my
# OpenSSH_6.0p1 on Debian Linux / Daniel
diff --git a/tests/symbol-scan.pl b/tests/symbol-scan.pl
index 1379299d3..6706aa707 100755
--- a/tests/symbol-scan.pl
+++ b/tests/symbol-scan.pl
@@ -119,13 +119,11 @@ for my $e (sort @syms) {
# CURL_EXTERN - is a define used for libcurl functions that are external,
# public. No app or other code should ever use it.
#
- # CURLINC_ - defines for header dual-include prevention, ignore those.
- #
# *_LAST and *_LASTENTRY are just prefix for the placeholders used for the
# last entry in many enum series.
#
- if($e =~ /(OBSOLETE|^CURL_EXTERN|^CURLINC_|_LAST\z|_LASTENTRY\z)/) {
+ if($e =~ /(OBSOLETE|^CURL_EXTERN|_LAST\z|_LASTENTRY\z)/) {
$ignored++;
next;
}
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index 0cb415003..755f51112 100644
--- a/tests/testcurl.1
+++ b/tests/testcurl.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH testcurl.pl 1 "October 22, 2016" "Curl 7.67.0" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.64.1" "testcurl"
.SH NAME
testcurl.pl \- (automatically) test curl
diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt
index bc0699231..4b0cec4a8 100644
--- a/tests/unit/CMakeLists.txt
+++ b/tests/unit/CMakeLists.txt
@@ -22,7 +22,6 @@ set(UT_SRC
# Broken link on Linux
# unit1604.c
unit1620.c
- unit1655.c
)
set(UT_COMMON_FILES ../libtest/first.c ../libtest/test.h curlcheck.h)
diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc
index 45278ba81..f3cba1c2a 100644
--- a/tests/unit/Makefile.inc
+++ b/tests/unit/Makefile.inc
@@ -11,7 +11,7 @@ UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
unit1399 \
unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 unit1607 \
unit1608 unit1609 unit1620 unit1621 \
- unit1650 unit1651 unit1652 unit1653 unit1654 unit1655
+ unit1650 unit1651 unit1652 unit1653 unit1654
unit1300_SOURCES = unit1300.c $(UNITFILES)
unit1300_CPPFLAGS = $(AM_CPPFLAGS)
@@ -118,7 +118,3 @@ unit1653_CPPFLAGS = $(AM_CPPFLAGS)
unit1654_SOURCES = unit1654.c $(UNITFILES)
unit1654_CPPFLAGS = $(AM_CPPFLAGS)
-
-unit1655_SOURCES = unit1655.c $(UNITFILES)
-unit1655_CPPFLAGS = $(AM_CPPFLAGS)
-
diff --git a/tests/unit/README b/tests/unit/README
index 060b670c6..b8a513b3b 100644
--- a/tests/unit/README
+++ b/tests/unit/README
@@ -35,9 +35,6 @@ We put tests that focus on an area or a specific function into a single C
source file. The source file should be named 'unitNNNN.c' where NNNN is a
number that starts with 1300 and you can pick the next free number.
-Add your test to tests/unit/Makefile.inc (if it is a unit test).
-Add your test data to tests/data/Makefile.inc
-
You also need a separate file called tests/data/testNNNN (using the same
number) that describes your test case. See the test1300 file for inspiration
and the tests/FILEFORMAT documentation.
@@ -49,10 +46,9 @@ For the actual C file, here's a very simple example:
#include "a libcurl header.h" /* from the lib dir */
-static CURLcode unit_setup( void )
+static void unit_setup( void )
{
/* whatever you want done first */
- return CURLE_OK;
}
static void unit_stop( void )
diff --git a/tests/unit/unit1303.c b/tests/unit/unit1303.c
index 945b82ba7..b065683a6 100644
--- a/tests/unit/unit1303.c
+++ b/tests/unit/unit1303.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -68,7 +68,7 @@ struct timetest {
int timeout_ms;
int connecttimeout_ms;
bool connecting;
- timediff_t result;
+ time_t result;
const char *comment;
};
@@ -138,7 +138,7 @@ UNITTEST_START
data->progress.t_startop.tv_usec = 0;
for(i = 0; i < sizeof(run)/sizeof(run[0]); i++) {
- timediff_t timeout;
+ time_t timeout;
NOW(run[i].now_s, run[i].now_us);
TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms);
timeout = Curl_timeleft(data, &now, run[i].connecting);
diff --git a/tests/unit/unit1304.c b/tests/unit/unit1304.c
index c1d36e840..6d8334c98 100644
--- a/tests/unit/unit1304.c
+++ b/tests/unit/unit1304.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -207,4 +207,8 @@ UNITTEST_START
fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'");
fail_unless(!login_changed, "login should not have been changed");
+ /* TODO:
+ * Test over the size limit password / login!
+ * Test files with a bad format
+ */
UNITTEST_STOP
diff --git a/tests/unit/unit1307.c b/tests/unit/unit1307.c
index 7e88ea4d9..91e4606b7 100644
--- a/tests/unit/unit1307.c
+++ b/tests/unit/unit1307.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1398.c b/tests/unit/unit1398.c
index 8b132a0d7..22cc837e2 100644
--- a/tests/unit/unit1398.c
+++ b/tests/unit/unit1398.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -74,6 +74,7 @@ fail_unless(!strcmp(output, " bu"), "wrong output");
/* output a number in a limited output */
rc = curl_msnprintf(output, 4, "%d", 10240);
+/* TODO: this should return 5 to be POSIX/msnprintf compliant! */
fail_unless(rc == 4, "return code should be 4");
fail_unless(!strcmp(output, "102"), "wrong output");
diff --git a/tests/unit/unit1399.c b/tests/unit/unit1399.c
index 3b52989e4..7383fbd86 100644
--- a/tests/unit/unit1399.c
+++ b/tests/unit/unit1399.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -50,7 +50,7 @@ static void fake_t_startsingle_time(struct Curl_easy *data,
data->progress.t_startsingle.tv_usec = fake_now.tv_usec;
}
-static bool usec_matches_seconds(timediff_t time_usec, int expected_seconds)
+static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
{
int time_sec = (int)(time_usec / usec_magnitude);
bool same = (time_sec == expected_seconds);
diff --git a/tests/unit/unit1607.c b/tests/unit/unit1607.c
index a8b0331ce..22c2e8482 100644
--- a/tests/unit/unit1607.c
+++ b/tests/unit/unit1607.c
@@ -25,10 +25,18 @@
#include "connect.h"
#include "share.h"
+/* retrieves ip address and port from a sockaddr structure.
+ note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
+bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);
+
#include "memdebug.h" /* LAST include file */
+static struct Curl_easy *easy;
+static struct curl_hash *hostcache;
+
static void unit_stop(void)
{
+ curl_easy_cleanup(easy);
curl_global_cleanup();
}
@@ -38,6 +46,18 @@ static CURLcode unit_setup(void)
global_init(CURL_GLOBAL_ALL);
+ easy = curl_easy_init();
+ if(!easy) {
+ curl_global_cleanup();
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ hostcache = Curl_global_host_cache_init();
+ if(!hostcache) {
+ unit_stop();
+ return CURLE_OUT_OF_MEMORY;
+ }
+
return res;
}
@@ -102,7 +122,7 @@ UNITTEST_START
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);
- for(i = 0; i < testnum; ++i) {
+ for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
int j;
int addressnum = sizeof(tests[i].address) / sizeof(*tests[i].address);
struct Curl_addrinfo *addr;
@@ -110,17 +130,10 @@ UNITTEST_START
struct curl_slist *list;
void *entry_id;
bool problem = false;
- struct Curl_multi *multi;
- struct Curl_easy *easy = curl_easy_init();
- if(!easy) {
- curl_global_cleanup();
- return CURLE_OUT_OF_MEMORY;
- }
- /* create a multi handle and add the easy handle to it so that the
- hostcache is setup */
- multi = curl_multi_init();
- curl_multi_add_handle(multi, easy);
+ Curl_hostcache_clean(easy, hostcache);
+ easy->dns.hostcache = hostcache;
+ easy->dns.hostcachetype = HCACHE_GLOBAL;
list = curl_slist_append(NULL, tests[i].optval);
if(!list)
@@ -150,8 +163,8 @@ UNITTEST_START
if(tests[i].address[j] == &skip)
continue;
- if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
- ipaddress, &port)) {
+ if(addr && !getaddressinfo(addr->ai_addr,
+ ipaddress, &port)) {
fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
__FILE__, __LINE__, i);
problem = true;
@@ -201,8 +214,7 @@ UNITTEST_START
addr = addr->ai_next;
}
- curl_easy_cleanup(easy);
- curl_multi_cleanup(multi);
+ Curl_hostcache_clean(easy, easy->dns.hostcache);
curl_slist_free_all(list);
if(problem) {
diff --git a/tests/unit/unit1608.c b/tests/unit/unit1608.c
index 38d5cb278..4fc24704b 100644
--- a/tests/unit/unit1608.c
+++ b/tests/unit/unit1608.c
@@ -65,7 +65,6 @@ UNITTEST_START
}
curl_easy_cleanup(easy);
- curl_global_cleanup();
abort_unless(addrhead != addrs, "addresses are not being reordered");
diff --git a/tests/unit/unit1609.c b/tests/unit/unit1609.c
index 8223a147c..865c9e459 100644
--- a/tests/unit/unit1609.c
+++ b/tests/unit/unit1609.c
@@ -25,10 +25,18 @@
#include "connect.h"
#include "share.h"
+/* retrieves ip address and port from a sockaddr structure.
+ note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
+bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);
+
#include "memdebug.h" /* LAST include file */
+static struct Curl_easy *easy;
+static struct curl_hash *hostcache;
+
static void unit_stop(void)
{
+ curl_easy_cleanup(easy);
curl_global_cleanup();
}
@@ -38,6 +46,18 @@ static CURLcode unit_setup(void)
global_init(CURL_GLOBAL_ALL);
+ easy = curl_easy_init();
+ if(!easy) {
+ curl_global_cleanup();
+ return CURLE_OUT_OF_MEMORY;
+ }
+
+ hostcache = Curl_global_host_cache_init();
+ if(!hostcache) {
+ unit_stop();
+ return CURLE_OUT_OF_MEMORY;
+ }
+
return res;
}
@@ -97,15 +117,17 @@ static const struct testcase tests[] = {
};
UNITTEST_START
-{
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);
/* important: we setup cache outside of the loop
and also clean cache after the loop. In contrast,for example,
test 1607 sets up and cleans cache on each iteration. */
+ Curl_hostcache_clean(easy, hostcache);
+ easy->dns.hostcache = hostcache;
+ easy->dns.hostcachetype = HCACHE_GLOBAL;
- for(i = 0; i < testnum; ++i) {
+ for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
int j;
int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address);
struct Curl_addrinfo *addr;
@@ -113,16 +135,6 @@ UNITTEST_START
struct curl_slist *list;
void *entry_id;
bool problem = false;
- struct Curl_multi *multi;
- struct Curl_easy *easy = curl_easy_init();
- if(!easy) {
- curl_global_cleanup();
- return CURLE_OUT_OF_MEMORY;
- }
- /* create a multi handle and add the easy handle to it so that the
- hostcache is setup */
- multi = curl_multi_init();
- curl_multi_add_handle(multi, easy);
list = curl_slist_append(NULL, tests[i].optval);
if(!list)
@@ -150,9 +162,9 @@ UNITTEST_START
if(!addr && !tests[i].address[j])
break;
- if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
- ipaddress, &port)) {
- fprintf(stderr, "%s:%d tests[%d] failed. Curl_addr2string failed.\n",
+ if(addr && !getaddressinfo(addr->ai_addr,
+ ipaddress, &port)) {
+ fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
__FILE__, __LINE__, i);
problem = true;
break;
@@ -193,9 +205,6 @@ UNITTEST_START
addr = addr->ai_next;
}
- curl_easy_cleanup(easy);
- Curl_hash_destroy(&multi->hostcache);
- curl_multi_cleanup(multi);
curl_slist_free_all(list);
if(problem) {
@@ -203,5 +212,7 @@ UNITTEST_START
continue;
}
}
-}
+
+ Curl_hostcache_clean(easy, easy->dns.hostcache);
+
UNITTEST_STOP
diff --git a/tests/unit/unit1620.c b/tests/unit/unit1620.c
index c6aa721cf..b8b096521 100644
--- a/tests/unit/unit1620.c
+++ b/tests/unit/unit1620.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -83,7 +83,7 @@ UNITTEST_START
Curl_free_request_state(empty);
- rc = Curl_close(&empty);
+ rc = Curl_close(empty);
fail_unless(rc == CURLE_OK, "Curl_close() failed");
}
diff --git a/tests/unit/unit1621.c b/tests/unit/unit1621.c
index 618abedfa..6e07b6ea9 100644
--- a/tests/unit/unit1621.c
+++ b/tests/unit/unit1621.c
@@ -35,9 +35,7 @@ static void unit_stop(void)
{
}
-#if defined(__MINGW32__) || \
- (!defined(HAVE_FSETXATTR) && \
- (!defined(__FreeBSD_version) || (__FreeBSD_version < 500000)))
+#ifdef __MINGW32__
UNITTEST_START
{
return 0;
diff --git a/tests/unit/unit1651.c b/tests/unit/unit1651.c
index 3652601f9..db3a0f35b 100644
--- a/tests/unit/unit1651.c
+++ b/tests/unit/unit1651.c
@@ -33,7 +33,7 @@ static void unit_stop(void)
}
#if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
- defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
+ defined(USE_CYASSL) || defined(USE_SCHANNEL)
/* cert captured from gdb when connecting to curl.haxx.se on October 26
2018 */
diff --git a/tests/unit/unit1653.c b/tests/unit/unit1653.c
index c5d8f3b3a..2f7ccd5ca 100644
--- a/tests/unit/unit1653.c
+++ b/tests/unit/unit1653.c
@@ -168,7 +168,7 @@ UNITTEST_START
u = curl_url();
if(!u)
goto fail;
- ipv6port = strdup("[fe80::250:56ff:fea7:da15!25eth3]:80");
+ ipv6port = strdup("[fe80::250:56ff:fea7:da15%!25eth3]:80");
if(!ipv6port)
goto fail;
ret = Curl_parse_port(u, ipv6port);
@@ -184,7 +184,7 @@ UNITTEST_START
if(!ipv6port)
goto fail;
ret = Curl_parse_port(u, ipv6port);
- fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+ fail_unless(ret != CURLUE_OK, "Curl_parse_port returned non-error");
fail:
free(ipv6port);
curl_url_cleanup(u);
diff --git a/tests/unit/unit1654.c b/tests/unit/unit1654.c
index a800d9c3a..7532c6d61 100644
--- a/tests/unit/unit1654.c
+++ b/tests/unit/unit1654.c
@@ -53,10 +53,8 @@ UNITTEST_START
if(!asi)
return 1;
result = Curl_altsvc_load(asi, arg);
- if(result) {
- Curl_altsvc_cleanup(asi);
+ if(result)
return result;
- }
curl = curl_easy_init();
if(!curl)
goto fail;
@@ -90,22 +88,13 @@ UNITTEST_START
fail_unless(asi->num == 8, "wrong number of entries");
result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
- ALPN_h2, "example.org", 80);
+ ALPN_h2c, "example.org", 80);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
unitfail++;
}
fail_unless(asi->num == 9, "wrong number of entries");
- /* quoted 'ma' value */
- result = Curl_altsvc_parse(curl, asi, "h2=\"example.net:443\"; ma=\"180\";",
- ALPN_h2, "example.net", 80);
- if(result) {
- fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
- unitfail++;
- }
- fail_unless(asi->num == 10, "wrong number of entries");
-
result = Curl_altsvc_parse(curl, asi,
"h2=\":443\", h3=\":443\"; ma = 120; persist = 1",
ALPN_h1, "curl.haxx.se", 80);
@@ -113,7 +102,7 @@ UNITTEST_START
fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 12, "wrong number of entries");
+ fail_unless(asi->num == 11, "wrong number of entries");
/* clear that one again and decrease the counter */
result = Curl_altsvc_parse(curl, asi, "clear;",
@@ -122,7 +111,7 @@ UNITTEST_START
fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 10, "wrong number of entries");
+ fail_unless(asi->num == 9, "wrong number of entries");
Curl_altsvc_save(asi, outname);
diff --git a/tests/unit/unit1655.c b/tests/unit/unit1655.c
deleted file mode 100644
index 7fea134d5..000000000
--- a/tests/unit/unit1655.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "curlcheck.h"
-
-#include "doh.h" /* from the lib dir */
-
-static CURLcode unit_setup(void)
-{
- /* whatever you want done first */
- return CURLE_OK;
-}
-
-static void unit_stop(void)
-{
- /* done before shutting down and exiting */
-}
-
-UNITTEST_START
-
-/* introduce a scope and prove the corner case with write overflow,
- * so we can prove this test would detect it and that it is properly fixed
- */
-do {
- const char *bad = "this.is.a.hostname.where.each.individual.part.is.within."
- "the.sixtythree.character.limit.but.still.long.enough.to."
- "trigger.the.the.buffer.overflow......it.is.chosen.to.be."
- "of.a.length.such.that.it.causes.a.two.byte.buffer......."
- "overwrite.....making.it.longer.causes.doh.encode.to....."
- ".return.early.so.dont.change.its.length.xxxx.xxxxxxxxxxx"
- "..xxxxxx.....xx..........xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx..x......xxxx"
- "xxxx..xxxxxxxxxxxxxxxxxxx.x...xxxx.x.x.x...xxxxx";
-
- /* plays the role of struct dnsprobe in urldata.h */
- struct demo {
- unsigned char dohbuffer[512];
- unsigned char canary1;
- unsigned char canary2;
- unsigned char canary3;
- };
-
- size_t olen = 100000;
- struct demo victim;
- DOHcode d;
- victim.canary1 = 87; /* magic numbers, arbritrarily picked */
- victim.canary2 = 35;
- victim.canary3 = 41;
- d = doh_encode(bad, DNS_TYPE_A, victim.dohbuffer,
- sizeof(victim.dohbuffer), &olen);
- fail_unless(victim.canary1 == 87, "one byte buffer overwrite has happened");
- fail_unless(victim.canary2 == 35, "two byte buffer overwrite has happened");
- fail_unless(victim.canary3 == 41,
- "three byte buffer overwrite has happened");
- if(d == DOH_OK) {
- fail_unless(olen <= sizeof(victim.dohbuffer), "wrote outside bounds");
- fail_unless(olen > strlen(bad), "unrealistic low size");
- }
-} while(0);
-
-/* run normal cases and try to trigger buffer length related errors */
-do {
- DNStype dnstype = DNS_TYPE_A;
- unsigned char buffer[128];
- const size_t buflen = sizeof(buffer);
- const size_t magic1 = 9765;
- size_t olen1 = magic1;
- const char *sunshine1 = "a.com";
- const char *sunshine2 = "aa.com";
- size_t olen2;
- DOHcode ret2;
- size_t olen;
-
- DOHcode ret = doh_encode(sunshine1, dnstype, buffer, buflen, &olen1);
- fail_unless(ret == DOH_OK, "sunshine case 1 should pass fine");
- fail_if(olen1 == magic1, "olen has not been assigned properly");
- fail_unless(olen1 > strlen(sunshine1), "bad out length");
-
- /* add one letter, the response should be one longer */
- olen2 = magic1;
- ret2 = doh_encode(sunshine2, dnstype, buffer, buflen, &olen2);
- fail_unless(ret2 == DOH_OK, "sunshine case 2 should pass fine");
- fail_if(olen2 == magic1, "olen has not been assigned properly");
- fail_unless(olen1 + 1 == olen2, "olen should grow with the hostname");
-
- /* pass a short buffer, should fail */
- ret = doh_encode(sunshine1, dnstype, buffer, olen1 - 1, &olen);
- fail_if(ret == DOH_OK, "short buffer should have been noticed");
-
- /* pass a minimum buffer, should succeed */
- ret = doh_encode(sunshine1, dnstype, buffer, olen1, &olen);
- fail_unless(ret == DOH_OK, "minimal length buffer should be long enough");
- fail_unless(olen == olen1, "bad buffer length");
-} while(0);
-UNITTEST_STOP
diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
index 1ede14f01..c75b15c4e 100644
--- a/winbuild/BUILD.WINDOWS.txt
+++ b/winbuild/BUILD.WINDOWS.txt
@@ -86,7 +86,6 @@ where <options> is one or many of:
WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
- WITH_PREFIX=<dir> - Where to install the build
ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
ENABLE_IDN=<yes or no> - Enable use of Windows IDN APIs, defaults to yes
diff --git a/winbuild/Makefile.vc b/winbuild/Makefile.vc
index 7ad49f09f..94ce8db36 100644
--- a/winbuild/Makefile.vc
+++ b/winbuild/Makefile.vc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -39,13 +39,9 @@ CFGSET=true
!MESSAGE where <options> is one or many of:
!MESSAGE VC=<6,7,8,9,10,11,12,14,15> - VC versions
!MESSAGE WITH_DEVEL=<path> - Paths for the development files (SSL, zlib, etc.)
-!MESSAGE Defaults to curl's sibling directory deps: ../deps
+!MESSAGE Defaults to sibbling directory deps: ../deps
!MESSAGE Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
!MESSAGE Uncompress them into the deps folder.
-!MESSAGE WITH_PREFIX=<path> - Installation directory path
-!MESSAGE Defaults to a configuration dependent (SSL, zlib, etc.)
-!MESSAGE directory inside curl's subdirectory builds: ./builds
-!MESSAGE Use backslashes as path separator
!MESSAGE WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
!MESSAGE WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
!MESSAGE WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
@@ -59,7 +55,6 @@ CFGSET=true
!MESSAGE ENABLE_WINSSL=<yes or no> - Enable native Windows SSL support, defaults to yes
!MESSAGE ENABLE_OPENSSL_AUTO_LOAD_CONFIG=<yes or no>
!MESSAGE - Whether the OpenSSL configuration will be loaded automatically, defaults to yes
-!MESSAGE ENABLE_UNICODE=<yes or no> - Enable UNICODE support, defaults to no
!MESSAGE GEN_PDB=<yes or no> - Generate Program Database (debug symbols for release build)
!MESSAGE DEBUG=<yes or no> - Debug builds
!MESSAGE MACHINE=<x86 or x64> - Target architecture (default x64 on AMD64, x86 on others)
@@ -139,20 +134,6 @@ USE_WINSSL = false
!IFNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
ENABLE_OPENSSL_AUTO_LOAD_CONFIG = true
-!ELSEIF "$(ENABLE_OPENSSL_AUTO_LOAD_CONFIG)"=="yes"
-!UNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
-ENABLE_OPENSSL_AUTO_LOAD_CONFIG = true
-!ELSEIF "$(ENABLE_OPENSSL_AUTO_LOAD_CONFIG)"=="no"
-!UNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
-ENABLE_OPENSSL_AUTO_LOAD_CONFIG = false
-!ENDIF
-
-!IFNDEF ENABLE_UNICODE
-USE_UNICODE = false
-!ELSEIF "$(ENABLE_UNICODE)"=="yes"
-USE_UNICODE = true
-!ELSEIF "$(ENABLE_UNICODE)"=="no"
-USE_UNICODE = false
!ENDIF
CONFIG_NAME_LIB = libcurl
@@ -187,6 +168,12 @@ USE_MBEDTLS = true
MBEDTLS = $(WITH_MBEDTLS)
!ENDIF
+!IF ( "$(USE_SSL)"=="true" && "$(USE_WINSSL)"=="true" ) \
+ || ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \
+ || ( "$(USE_MBEDTLS)"=="true" && "$(USE_WINSSL)"=="true" )
+!ERROR SSL, MBEDTLS and WINSSL are mutual exclusive options.
+!ENDIF
+
!IF "$(WITH_CARES)"=="dll"
USE_CARES = true
CARES = dll
@@ -286,7 +273,6 @@ $(MODE):
@SET USE_IPV6=$(USE_IPV6)
@SET USE_SSPI=$(USE_SSPI)
@SET USE_WINSSL=$(USE_WINSSL)
- @SET USE_UNICODE=$(USE_UNICODE)
# compatibility bit
@SET WITH_NGHTTP2=$(WITH_NGHTTP2)
diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index 8267250c2..3125c21b8 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -393,11 +393,11 @@ CFGSET = true
!IF "$(DEBUG)"=="yes"
RC_FLAGS = /dDEBUGBUILD=1 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
CURL_CC = $(CC_DEBUG) $(RTLIB_DEBUG)
-CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc
+CURL_RC_FLAGS = /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc
!ELSE
RC_FLAGS = /dDEBUGBUILD=0 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
CURL_CC = $(CC_NODEBUG) $(RTLIB)
-CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc
+CURL_RC_FLAGS = /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc
!ENDIF
!IF "$(AS_DLL)" == "true"
@@ -479,24 +479,9 @@ CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)"
LFLAGS = $(LFLAGS) $(LFLAGS_PDB)
!ENDIF
-!IF ( "$(USE_SSL)"=="true" && "$(USE_WINSSL)"=="true" ) \
- || ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \
- || ( "$(USE_MBEDTLS)"=="true" && "$(USE_WINSSL)"=="true" )
-CFLAGS = $(CFLAGS) /DCURL_WITH_MULTI_SSL
-!ENDIF
-
-!IF "$(USE_UNICODE)"=="true"
-CFLAGS = $(CFLAGS) /DUNICODE /D_UNICODE
-!ENDIF
-
LIB_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-lib
CURL_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-curl
-
-!IFDEF WITH_PREFIX
-DIRDIST = $(WITH_PREFIX)
-!ELSE
DIRDIST = ..\builds\$(CONFIG_NAME_LIB)\
-!ENDIF
#
# curl.exe
@@ -563,8 +548,6 @@ $(LIB_DIROBJ):
@if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)
@if not exist "$(LIB_DIROBJ)\vauth" mkdir $(LIB_DIROBJ)\vauth
@if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls
- @if not exist "$(LIB_DIROBJ)\vssh" mkdir $(LIB_DIROBJ)\vssh
- @if not exist "$(LIB_DIROBJ)\vquic" mkdir $(LIB_DIROBJ)\vquic
$(CURL_DIROBJ):
@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)
@@ -583,12 +566,6 @@ $(CURL_DIROBJ):
{$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj:
$(CURL_CC) $(CFLAGS) /Fo"$@" $<
-{$(LIBCURL_SRC_DIR)\vssh\}.c{$(LIB_DIROBJ)\vssh\}.obj:
- $(CURL_CC) $(CFLAGS) /Fo"$@" $<
-
-{$(LIBCURL_SRC_DIR)\vquic\}.c{$(LIB_DIROBJ)\vquic\}.obj:
- $(CURL_CC) $(CFLAGS) /Fo"$@" $<
-
$(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc
$(RC) $(RC_FLAGS)
diff --git a/winbuild/gen_resp_file.bat b/winbuild/gen_resp_file.bat
index 79a27acf7..c640cee09 100755
--- a/winbuild/gen_resp_file.bat
+++ b/winbuild/gen_resp_file.bat
@@ -1,32 +1,8 @@
-@echo off
-rem ***************************************************************************
-rem * _ _ ____ _
-rem * Project ___| | | | _ \| |
-rem * / __| | | | |_) | |
-rem * | (__| |_| | _ <| |___
-rem * \___|\___/|_| \_\_____|
-rem *
-rem * Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
-rem *
-rem * This software is licensed as described in the file COPYING, which
-rem * you should have received as part of this distribution. The terms
-rem * are also available at https://curl.haxx.se/docs/copyright.html.
-rem *
-rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-rem * copies of the Software, and permit persons to whom the Software is
-rem * furnished to do so, under the terms of the COPYING file.
-rem *
-rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-rem * KIND, either express or implied.
-rem *
-rem ***************************************************************************
-
-if exist %OUTFILE% (
- del %OUTFILE%
+@echo OFF
+@if exist %OUTFILE% (
+ del %OUTFILE%
)
-
-echo %MACRO_NAME% = \> %OUTFILE%
-for %%i in (%*) do echo %DIROBJ%/%%i \>> %OUTFILE%
-echo. >> %OUTFILE%
-
+@echo %MACRO_NAME% = \> %OUTFILE%
+@for %%i in (%*) do @echo %DIROBJ%/%%i \>> %OUTFILE%
+@echo. >> %OUTFILE%
:END