diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index f88a124..fa0536c 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -14,10 +14,10 @@ jobs:
actions: read
steps:
- uses: actions/checkout@v6
- - uses: github/codeql-action/init@v3
+ - uses: github/codeql-action/init@v4
with:
languages: python
queries: security-extended,security-and-quality
- - uses: github/codeql-action/analyze@v3
+ - uses: github/codeql-action/analyze@v4
with:
category: "/language:python"
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index f0cdec4..b2f32f4 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -17,6 +17,7 @@ jobs:
with:
python-version: "3.13"
cache: 'pip'
+ - run: python -m pip install --upgrade pip
- run: pip install ruff bandit mypy pip-audit
# Fast checks
- run: ruff check .
@@ -43,6 +44,7 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with: { python-version: "3.13" }
+ - run: python -m pip install --upgrade pip
- run: pip install pip-audit
- run: pip-audit --strict
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f56d5a..517636c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@ We [keep a changelog.](http://keepachangelog.com/)
## [Unreleased]
+## [1.7.0] - 2026-06-10
+
### Security
- **Enterprise Runtime Security:** Added opt-in PEP 578 Audit Hooks (`sys.addaudithook`) via `Config.enable_security_audit` to track runtime network events.
@@ -38,6 +40,12 @@ We [keep a changelog.](http://keepachangelog.com/)
- Legacy compatibility: Restored parity with old exceptions and dynamic routing mechanics to keep integration completely seamless for existing users.
+### Pull Requests Merged
+
+- [PR_129](https://github.com/mailjet/mailjet-apiv3-python/pull/129) - Use hyphen in the package name in readme.
+- [PR_130](https://github.com/mailjet/mailjet-apiv3-python/pull/130) - refactor: Modernize SDK architecture, harden security, and enable O(1) routing.
+- [PR_131](https://github.com/mailjet/mailjet-apiv3-python/pull/131) - Release 1.7.0.
+
## [1.6.0] - 2026-04-27
### Security
@@ -295,4 +303,5 @@ We [keep a changelog.](http://keepachangelog.com/)
[1.5.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.5.0
[1.5.1]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.5.1
[1.6.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.6.0
+[1.7.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.7.0
[unreleased]: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.7.0...HEAD
diff --git a/MANIFEST.in b/MANIFEST.in
index 20b4bfe..7a24c68 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -3,7 +3,7 @@ include README.md
include CHANGELOG.md
include PERFORMANCE.md
include SECURITY.md
-recursive-include mailjet_rest *.py *.pyi py.typed
+recursive-include mailjet_rest *.py py.typed
prune tests
prune samples
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
index 11a96fe..cfa5196 100644
--- a/conda.recipe/meta.yaml
+++ b/conda.recipe/meta.yaml
@@ -46,7 +46,7 @@ test:
- responses
commands:
- pip check
- - pytest tests/unit/ -v -m "not property_heavy"
+ - pytest tests/unit/ -v
about:
home: {{ project['urls']['Homepage'] }}
diff --git a/mailjet_rest/_version.py b/mailjet_rest/_version.py
index d81298f..14d9d2f 100644
--- a/mailjet_rest/_version.py
+++ b/mailjet_rest/_version.py
@@ -1 +1 @@
-__version__ = "1.6.0.post1.dev23"
+__version__ = "1.7.0"
diff --git a/mailjet_rest/types.py b/mailjet_rest/types.py
index a3710e1..ffc453b 100644
--- a/mailjet_rest/types.py
+++ b/mailjet_rest/types.py
@@ -13,6 +13,21 @@
from typing_extensions import NotRequired
+__all__ = [
+ # Constants
+ "_ALLOWED_TRACE_FIELDS",
+ "_DEFAULT_TIMEOUT",
+ "_JSON_HEADERS",
+ "_TEXT_HEADERS",
+ "Attachment",
+ "EmailAddress",
+ "HttpMethod",
+ "PayloadType",
+ "SendV31Message",
+ "SendV31Payload",
+ "TimeoutType",
+]
+
# ==========================================
# Types & Constants
# ==========================================
diff --git a/manage.sh b/manage.sh
index 35698a1..c9365c6 100755
--- a/manage.sh
+++ b/manage.sh
@@ -85,7 +85,7 @@ test_integration() {
test_cov() {
# Example: ./manage.sh test_cov
- info "Running tests with Coverage requirements (Fail under 80%)..."
+ info "Running tests with Coverage requirements (Fail under 80%)...."
pytest -n auto --cov="${SRC_DIR}" "${TEST_DIR}" --cov-fail-under=80 --cov-report=term-missing --cov-report=html
success "Coverage report generated in htmlcov/index.html"
}
@@ -108,26 +108,35 @@ test_strict_warnings() {
# SECURITY & FUZZING
# ==============================================================================
fuzz_all() {
- # Usage: ./manage.sh fuzz_all [duration_in_seconds]
- local duration=${1:-30}
+ # Usage: ./manage.sh fuzz_all [duration_in_seconds] [extra_libfuzzer_flags...]
+ local duration=${1:-20}
+ if [ $# -gt 0 ]; then shift; fi
+
+ local root_dir="$(pwd)"
local fuzzer_dir="tests/fuzz"
local dictionary="tests/fuzz/fuzzer.dict"
local corpus_dir="tests/fuzz/corpus"
+ local log_dir="logs"
if [ ! -d "$fuzzer_dir" ]; then
error "Fuzzer directory '$fuzzer_dir' not found."
return 1
fi
+ mkdir -p "$log_dir"
+
# Ensure the dictionary exists before passing the argument
local dict_arg=""
if [ -f "$dictionary" ]; then
- dict_arg="-dict=$dictionary"
+ dict_arg="-dict=$root_dir/$dictionary"
else
- echo "⚠️ Warning: Dictionary '$dictionary' not found. Running without it."
+ echo -e "${YELLOW}⚠️ Warning: Dictionary '$dictionary' not found. Running without it.${NC}"
fi
info "🚀 Starting security fuzzing suite (duration: ${duration} seconds per fuzzer)..."
+ if [ $# -gt 0 ]; then
+ info "Applying extra LibFuzzer arguments: $@"
+ fi
# Safely gather fuzzer files to prevent errors if none exist
shopt -s nullglob
@@ -141,27 +150,49 @@ fuzz_all() {
for fuzzer in "${fuzzers[@]}"; do
local fuzzer_name=$(basename "$fuzzer" .py)
- local fuzzer_corpus="$corpus_dir/$fuzzer_name"
+
+ # Create dedicated directories for THIS specific fuzzer
+ local fuzzer_work_dir="$root_dir/$log_dir/$fuzzer_name"
+ local fuzzer_corpus="$root_dir/$corpus_dir/$fuzzer_name"
+
+ mkdir -p "$fuzzer_work_dir"
mkdir -p "$fuzzer_corpus"
- info "🔍 Running fuzzer: $fuzzer (Corpus: $fuzzer_corpus)"
-
- conda run --name "${CONDA_ENV_NAME}" python "$fuzzer" \
- $dict_arg \
- -max_len=512 \
- -max_total_time="$duration" \
- "$fuzzer_corpus"
-
- local exit_code=$?
- # libFuzzer returns 1 for crash, 70 for OOM, 77 for timeout.
- # Catching any non-zero exit ensures we don't miss Python tracebacks.
- if [ $exit_code -ne 0 ]; then
- error "❌ Fuzzing failed: Crash or error detected in $fuzzer (Exit Code: $exit_code)."
- return $exit_code
- fi
+ echo -e "🔍 Running fuzzer: $fuzzer_name (Logs: logs/$fuzzer_name/fuzz_output.log)"
+
+ # Isolate execution:
+ # 1. Background subshell `(...) &` runs fuzzers in parallel.
+ # 2. `cd` into log folder ensures LibFuzzer outputs (crash, leak files) are neatly contained.
+ # 3. Use absolute paths for the execution dependencies to avoid pathing errors.
+ (
+ cd "$fuzzer_work_dir"
+
+ # Prevent Conda's double-stack path bug by checking if we are already activated
+ if [[ "$CONDA_DEFAULT_ENV" == "${CONDA_ENV_NAME}" ]]; then
+ EXEC_CMD="python"
+ else
+ EXEC_CMD="conda run --name ${CONDA_ENV_NAME} python"
+ fi
+
+ $EXEC_CMD "$root_dir/$fuzzer" \
+ $dict_arg \
+ -max_len=512 \
+ -max_total_time="$duration" \
+ -artifact_prefix="./" \
+ "$fuzzer_corpus" \
+ "$@" > "fuzz_output.log" 2>&1
+
+ local exit_code=$?
+ # libFuzzer returns 1 for crash, 70 for OOM, 77 for timeout.
+ if [ $exit_code -ne 0 ]; then
+ echo -e "${RED}❌ Fuzzing failed: Crash or error detected in $fuzzer_name (Exit Code: $exit_code). Check logs/$fuzzer_name/fuzz_output.log${NC}"
+ fi
+ ) &
done
- success "✅ All fuzz tests passed successfully."
+ echo -e "${CYAN}⏳ All fuzzers launched in isolation. Waiting for completion...${NC}"
+ wait
+ success "✅ All fuzz tests finished."
}
# ==============================================================================
@@ -243,6 +274,7 @@ clean() {
find . -type f -name '*.egg' -exec rm -f {} +
# Temp logs and profilers
+ rm -rf logs/
rm -f *.prof profile.html profile.json tmp.txt wget-log
success "Workspace cleaned!"
@@ -270,7 +302,7 @@ help() {
echo " test_strict_warnings - Run tests and fail on any DeprecationWarning"
echo ""
echo -e "${YELLOW}Security & Fuzzing:${NC}"
- echo " fuzz_all - Run all fuzz tests"
+ echo " fuzz_all - Run all fuzz tests (pass duration as first arg, optionally pass fuzzer flags)"
echo ""
echo -e "${YELLOW}Performance & Security:${NC}"
echo " perf_bench - Run pytest-benchmark suite"
@@ -286,7 +318,7 @@ help() {
echo -e "${GREEN}Examples:${NC}"
echo " ./manage.sh test_unit -vvv -s"
echo " ./manage.sh test_unit -k \"test_pep578_audit_hooks\""
- echo " ./manage.sh test_no_warnings tests/unit/test_client.py"
+ echo " ./manage.sh fuzz_all 60 -max_len=16384"
}
# Check if at least one argument is provided
@@ -299,39 +331,11 @@ COMMAND=$1
shift # Remove the command from the arguments list, leaving only extra flags
case "$COMMAND" in
- env_setup|format|lint|test_all|test_unit|test_integration|test_cov|test_no_warnings|test_strict_warnings|perf_bench|perf_profile|audit_deps|run_hooks|build_pkg|release|clean|help)
+ env_setup|format|lint|test_all|test_unit|test_integration|test_cov|test_no_warnings|test_strict_warnings|perf_bench|perf_profile|audit_deps|run_hooks|build_pkg|release|clean|fuzz_all)
"$COMMAND" "$@" # Execute the function with any remaining arguments
;;
- fuzz_all)
- # 1. Grab the duration, defaulting to 20 if not provided
- DURATION=${1:-20}
-
- # 2. Shift the duration out of the arguments list (if it was provided)
- # This leaves ONLY the extra flags (like -max_len=16384) in "$@"
- if [ $# -gt 0 ]; then shift; fi
-
- info "🚀 Starting security fuzzing suite (duration: ${DURATION} seconds per fuzzer)..."
- if [ $# -gt 0 ]; then
- info "Applying extra LibFuzzer arguments: $@"
- fi
-
- # Find all fuzzers
- FUZZERS=$(find tests/fuzz -maxdepth 1 -name "fuzz_*.py" -type f)
-
- for fuzzer in $FUZZERS; do
- fuzzer_name=$(basename "$fuzzer" .py)
- corpus_dir="tests/fuzz/corpus/$fuzzer_name"
-
- mkdir -p "$corpus_dir"
-
- info "🔍 Running fuzzer: $fuzzer (Corpus: $corpus_dir)"
-
- # 3. Append "$@" to the end to forward any extra arguments
- python "$fuzzer" "$corpus_dir" -dict=tests/fuzz/fuzzer.dict -max_total_time="$DURATION" "$@"
-
- echo ""
- done
- success "✅ All fuzz tests passed successfully."
+ help)
+ help
;;
*)
error "Unknown command: $COMMAND"
diff --git a/pyproject.toml b/pyproject.toml
index a4a9735..51721e5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,9 +16,10 @@ py-modules = ["mailjet_rest._version"]
[tool.setuptools.packages.find]
include = ["mailjet_rest", "mailjet_rest.*"]
+exclude = ["tests*"]
[tool.setuptools.package-data]
-mailjet_rest = ["py.typed", "*.pyi"]
+mailjet_rest = ["py.typed"]
[project]
name = "mailjet-rest"
diff --git a/samples/smoke_readme_runner.py b/samples/smoke_readme_runner.py
index fd41e22..fd973fd 100644
--- a/samples/smoke_readme_runner.py
+++ b/samples/smoke_readme_runner.py
@@ -8,7 +8,6 @@
import os
import uuid
import logging
-import warnings
import time
from mailjet_rest import Client, MailjetAuthError
diff --git a/tests/fuzz/fuzz_state_machine.py b/tests/fuzz/fuzz_state_machine.py
index b90b8f6..4e29ea0 100644
--- a/tests/fuzz/fuzz_state_machine.py
+++ b/tests/fuzz/fuzz_state_machine.py
@@ -32,7 +32,7 @@ def TestOneInput(data: bytes) -> None:
builder._msg = {}
elif op == 3:
payload = builder.build()
- client._execute_request("POST", "https://api.mailjet.com/v3/send", data=payload) # type: ignore[call-arg]
+ client.api_call("POST", "https://api.mailjet.com/v3/send", data=payload)
elif op == 4:
client.auth = (fdp.ConsumeUnicodeNoSurrogates(5), None) # type: ignore[attr-defined]
diff --git a/tests/fuzz/fuzzer.dict b/tests/fuzz/fuzzer.dict
index cebc7c3..3431d7d 100644
--- a/tests/fuzz/fuzzer.dict
+++ b/tests/fuzz/fuzzer.dict
@@ -1,7 +1,7 @@
# ==========================================
# 1. Target-Specific API & Domain Context
# ==========================================
-# Routing terms, versions, and parameters specific to the target API.
+# Routing terms, versions, and parameters specific to the Mailjet API.
"v1"
"v3"
"v3.1"
@@ -57,6 +57,8 @@
"APIKey"
"SecretKey"
"Token"
+
+# Common state flags & analytics
"open"
"click"
"bounce"
@@ -66,6 +68,8 @@
"unsubscribed"
"statcounters"
"statistics_linkClick"
+
+# Extracted internal routing aliases
"parseroute"
"campaigndraft"
"campaigndraft_schedule"
@@ -110,15 +114,20 @@
"TimeoutError"
"ValidationError"
"DoesNotExistError"
+"RequestsConnectionError"
+"TypeError"
+"ValueError"
"IsTextPartGenerationEnabled"
"CounterSource"
"Date"
# ==========================================
-# 2. Path Traversal & Filesystem Boundaries
+# 2. Path Traversal & Filesystem Boundaries (CWE-22)
# ==========================================
-# Payloads targeting local file inclusion (LFI) and OS-level file exposure (CWE-22).
+# Payloads targeting local file inclusion (LFI) and OS-level file exposure.
"//"
+"../"
+"/.."
".."
"///"
"/."
@@ -134,13 +143,17 @@
"/private/tmp/safe"
"/private/tm/.p./\x10"
"../../../../../../../../../../../../"
+"../../../"
+"%2F"
+"%2f"
+"%2E%2E%2F"
"%2e%2e%2f"
"%252e%252e%252f"
+"1%2E%2E%2F"
"%c0%af"
"%e0%80%af"
"%c0%ae%c0%ae%c0%af"
"%5C..%5C..%5C"
-"%5C..%5C..%5C"
"C:%5C"
"c:\\windows\\system32\\config\\sam"
"/etc/passwd"
@@ -157,12 +170,15 @@
"com1"
# ==========================================
-# 3. SSRF, Hostnames & Scheme Bypasses
+# 3. SSRF, Hostnames & Scheme Bypasses (CWE-918)
# ==========================================
-# Targets Server-Side Request Forgery (CWE-918) and URL parsing logic.
+# Targets Server-Side Request Forgery and URL parsing logic.
+"http://"
+"https://"
"http://127.0.0.1"
"https://127.0.0.1"
"http://localhost"
+"localhost"
"http://[::1]"
"http://169.254.169.254/latest/meta-data/"
"file://"
@@ -175,15 +191,13 @@
"0x7f.0x0.0x0.0x1"
"::ffff:7f000001"
"api.mailjet.com"
-"mailjet.com"
-"api.mailgun.net"
-"api.eu.mailgun.net"
"api.mailjet.com.attacker.com"
+"mailjet.com"
"//mailjet.com"
"blob:"
# ==========================================
-# 4. Protocol Smuggling, HTTP Headers & CRLF
+# 4. Protocol Smuggling, HTTP Headers & CRLF (CWE-113, CWE-444)
# ==========================================
# Targets HTTP/1.x, HTTP/2 framing, cache poisoning, and connection pools.
"\x0D\x0A"
@@ -219,6 +233,7 @@
"TRACE"
"CONNECT"
"Authorization"
+"Authorization: Basic"
"Bearer "
"Basic "
"Expect: 100-continue"
@@ -243,9 +258,13 @@
"{\"Variables\": {\"level1\": {\"level2\": {\"level3\": {\"level4\": 1}}}}}"
"[[[[[[[[[[]]]]]]]]]]"
"{\"\\u0000\": \"null_key\"}"
+"\"members\":\"[{"
+"[{\"address\":"
+"\"vars\":{"
""
"]>"
"application/json"
+"Content-Type: application/json"
"application/xml"
"application/pdf"
"text/html"
@@ -253,6 +272,9 @@
"image/gif"
"application/x-www-form-urlencoded"
"multipart/form-data"
+"Content-Type: multipart/form-data"
+"message/rfc2822"
+"message/rfc822"
"multipart/form-data; boundary=---------------------------"
"\x0D\x0A\x0D\x0A--"
"data:image/png;base64,iVBORw0KGgo"
@@ -261,12 +283,13 @@
"=?utf-8?q?"
"=?ISO-8859-1?Q?"
"Content-Transfer-Encoding: base64\x0D\x0A\x0D\x0A===="
+"Content-Transfer-Encoding: quoted-printable"
"Content-Transfer-Encoding: quoted-printable\x0D\x0A\x0D\x0A=ZZ"
# ==========================================
-# 6. SQL, NoSQL & Data Store Injection
+# 6. Code Injection (SQLi, NoSQLi, Command, SSTI, XSS)
# ==========================================
-# Targets database query builders and NoSQL evaluation engines.
+# Targets database query builders, templating logic, and unsafe evaluation.
"' OR '1'='1"
"\" OR \"1\"=\"1"
"admin' --"
@@ -275,11 +298,6 @@
"1' WAITFOR DELAY '0:0:10'--"
"||"
"&&"
-
-# ==========================================
-# 7. Command Injection, Metaprogramming & Deserialization
-# ==========================================
-# Targets unsafe evaluation, Python introspection, and shell execution.
";id;"
"|id"
"`id`"
@@ -305,11 +323,6 @@
"cos\x0asystem\x0a(S'id'\x0atR."
"c__builtin__\x0aeval\x0a(Vprint('XSS')\x0atR."
"Z3tfQW5f/////////////////////19pb25fL2FjdG9uYWlkZ1k="
-
-# ==========================================
-# 8. XSS & Server-Side Template Injection (SSTI)
-# ==========================================
-# Targets rendering engines, web outputs, and templating logic.
""
"
"
@@ -326,10 +339,20 @@
"#{7*7}"
"<%= 7*7 %>"
"{{config.items()}}"
+"{{config.SECRET}}"
+"{{ "
"{{ joiner.__init__.__globals__.os.popen('id').read() }}"
+"{\"AND\":[{"
+"comparator"
+"attribute"
+"{{#if"
+"{{#unless"
+"{{#each"
+"{{#with"
+"{{#equal"
# ==========================================
-# 9. Format Strings & Regex Denial of Service (ReDoS)
+# 7. Format Strings & Regex Denial of Service (ReDoS)
# ==========================================
"%s"
"%n"
@@ -348,7 +371,7 @@
"a*?"
# ==========================================
-# 10. Numeric Boundaries, Integers & Floats
+# 8. Numeric Boundaries, Integers & Floats
# ==========================================
# Targets type coercion, overflows, NaN/Infinity, and math operations.
"0"
@@ -367,12 +390,25 @@
"NaN"
"Infinity"
"-Infinity"
+"null"
+"true"
+"false"
# ==========================================
-# 11. Unicode, Encodings & Control Characters
+# 9. Unicode, Encodings & Control Characters
# ==========================================
-# Targets charset normalizers, BOMs, string allocators, and delimiter limits.
+# Targets charset normalizers, string allocators, and parsing bugs.
"\x00"
+"\x0a"
+"\x0b"
+"\x0c"
+"\x0d"
+"\x13"
+"\x1b"
+"\x1f"
+"\x22"
+"\x27"
+"\x7f"
"\\u0000"
"%\x00"
"a/"
@@ -381,6 +417,9 @@
"Gc"
"e/"
"httpr"
+"htt5"
+"htt5://"
+"httgs"
"e4"
"m\x1e"
"P&"
@@ -394,18 +433,18 @@
"9G"
"Ce"
"/["
+"[$"
"X-"
-";/"
"/T"
"TT"
"\x7f\x03"
"OggS"
-"DATA"
"Offset"
"Value"
"w+"
"addnoforce"
-"application/pdf"
+"proxy"
+"mailjet,com"
"user+tag@example.com"
"\"much.more unusual\"@example.com"
"admin@[IPv6:2001:db8::1]"
@@ -428,41 +467,39 @@
"%EF%BC%8E"
"%EF%BC%8F"
"%D0%CF%11%E0%A1%B1%1A%E1"
+"\xe2\x80\xaa\xe2\x80\xa0\xe1\x85\xa1"
+"\xe2\x80\xaa\xe3\x80\xa0\xe2\x80\xa0\xe5\x88\xa0\xe7\x85\x85\xe6\xa5\xad\xe7\xa1\xa3\xeb\xb0\x94"
+"\xe0\xa8\xa0\xe2\x84\xa1\xe4\xa8\xa0\xe2\x81\x90\xe2\x80\xb2"
+"\xE6\xA9\xAA\xE6\xA9\xAA\xE6\xA9\xAA\xE6\xA9\xAA\xE7\x9D\xB7\xE7\x9D\xB7\xE7\x9C\xA0\xE2\x80\xA3\xE2\x80\xA0\xE7\x9D\xB7\xE7\xB3\xB8\xE9\xBC\xA0"
+"\xeb\xa9\xbd\xef\xbf\xbf\xef\xbe\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xef\xbd\xba\xef\xbf\xbf\xe7\xab\xbf\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\x85\xba\xe7\xa9\xba\xe7"
+"\xe5\xb9\x95\x06\xc4\x80\x00\x00\x00\xe1\xac\x85\xe1\xac\x99\xe1\xac\x9b\xe4\xb8\xb6\xe5\xb5\x9b"
+"\xf1\x96\x97\xbf\xf3\x84\x84\xad\xf1\xa0\x98\x86\x06\x00\xe2\xbd\x87"
+"\xf1\xbc\x9f\x87\x00\x00THz\xf1\x93\x84\xad\xe3\x80\xb0"
+"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\x00\xf4\x80\x80\x80\xc4\xb3\x00"
+"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf1\xbc\x9f\x87\x00\x00\xe3\x8e\x94\xf1\x93\x84\xad0"
+"\xc4\x80h\x00\x00\x00\xc4\x80\xe7\x91\xa8\xe4\x81\xb4\xe3\xa9\xad\xe7\xbd\xbf\xe2\xbd\x95"
+"\xe6\x85\xa5\xea\x90\xb6\xe6\xbd\x83\xef\xbf\xbf\x20\xcc\x84\xe6\xa7\xbf\xc5\xa3\xe6\xac\x80\xe3\x83\x84"
+"\xe6\xbd\xb2\xe6\xa9\xa2\x65\xe8\x80\x80\xe7\x88\x80\xef\xbd\xaf"
+"\xe6\x84\xaf\x68\x00\xe1\x85\xa3\xe3\x82\xb3"
+"\xef\xbc\xb0\xe2\x8d\xb2\xe3\x88\x80\xe6\xb0\xaf"
# ==========================================
-# 12. Binary, Memory & Synthesized Fuzzer Boundaries
+# 10. Binary Alignment, Memory Boundaries & Synthesized Magic Bytes
# ==========================================
-# Hex sequences, magic bytes, and memory markers synthesized by LibFuzzer.
+# Hex sequences, structure delimiters, and memory markers synthesized by LibFuzzer.
"0x3fffffff"
"PK%03%04"
+"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0."
"\x00\x00"
-"\x00\x00\x00\x00"
-"\x00\x00\x00\x00\x00\x00\x00\x00"
-"\x00\x00\x00\x00\x00\x00\x00\x01"
-"\x00\x00\x00\x00\x00\x00\x00\x05"
-"\x00\x00\x00\x00\x00\x00\x00\x0a"
-"\x00\x00\x00\x00\x00\x00\x00\x11"
-"\x00\x00\x00\x00\x00\x00\x00\x12"
-"\x00\x00\x00\x00\x00\x00\x00\x16"
-"\x00\x00\x00\x00\x00\x00\x00\x28"
-"\x00\x00\x00\x00\x00\x00\x00\xae"
-"\x00\x00\x00\x00\x00\x00\x00\xfb"
-"\x00\x00\x00\x01\x00\xef\xbf\xbf\xef\xbf\xbf\xef\xbf\xbf\xe1\x8b\xbf\x00\x00\x00\xe4\xb8\x80a/c"
-"\x00\x00\x00\xe2\xbf\xbf\xe2\x84\x80"
"\x01\x00"
+"\x00\x00\x00\x00"
"\x01\x00\x00\x00"
+"\xff\xff"
+"\xff\xff\xff\xff"
+"\xff\xff\xff\xff\xff\xff\xff\xff"
+"\xfe\xff\xff\xff\xff\xff\xff\xff"
+"\x00\x00\x00\x00\x00\x00\x00\x00"
"\x01\x00\x00\x00\x00\x00\x00\x00"
-"\x01\x00\x00\x00\x00\x00\x00\x0a"
-"\x01\x00\x00\x00\x00\x00\x00\x33"
-"\x01\x00\x00\x00\x00\x00\x00\x40"
-"\x01\x00\x00\x00\x00\x00\x00\x65"
-"\x01\x00\x00\x00\x00\x00\x00\x76"
-"\x01\x00\x00\x00\x00\x00\x00\x88"
-"\x01\x00\x00\x00\x00\x00\x00\x8b"
-"\x01\x00\x00\x00\x00\x00\x00\xf7"
-"\x01\x00\x00\x00\x00\x00\x00\x98"
-"\x01\x00\x00\x00\x00\x00\x01\x52"
-"\x01\x00\x00\x00\x00\x00\x02\x17"
"\x02\x00\x00\x00\x00\x00\x00\x00"
"\x03\x00\x00\x00\x00\x00\x00\x00"
"\x04\x00\x00\x00\x00\x00\x00\x00"
@@ -483,95 +520,233 @@
"\x13\x00\x00\x00\x00\x00\x00\x00"
"\x14\x00\x00\x00\x00\x00\x00\x00"
"\x15\x00\x00\x00\x00\x00\x00\x00"
-"\x15\x01\x00\x00\x00\x00\x00\x00"
+"\x16\x00\x00\x00\x00\x00\x00\x00"
+"\x17\x00\x00\x00\x00\x00\x00\x00"
+"\x19\x00\x00\x00\x00\x00\x00\x00"
+"\x1a\x00\x00\x00\x00\x00\x00\x00"
+"\x1b\x00\x00\x00\x00\x00\x00\x00"
+"\x1d\x00\x00\x00\x00\x00\x00\x00"
"\x1e\x00\x00\x00\x00\x00\x00\x00"
"\x1f\x00\x00\x00\x00\x00\x00\x00"
"\x20\x00\x00\x00\x00\x00\x00\x00"
"\x21\x00\x00\x00\x00\x00\x00\x00"
-"\x23\x01\x00\x00\x00\x00\x00\x00"
"\x25\x00\x00\x00\x00\x00\x00\x00"
"\x2b\x00\x00\x00\x00\x00\x00\x00"
-"\x2e\x01\x00\x00\x00\x00\x00\x00"
-"\x2f\x2f"
"\x31\x00\x00\x00\x00\x00\x00\x00"
+"\x32\x00\x00\x00\x00\x00\x00\x00"
"\x33\x00\x00\x00\x00\x00\x00\x00"
+"\x34\x00\x00\x00\x00\x00\x00\x00"
"\x37\x00\x00\x00\x00\x00\x00\x00"
+"\x39\x00\x00\x00\x00\x00\x00\x00"
"\x3a\x00\x00\x00\x00\x00\x00\x00"
"\x3b\x00\x00\x00\x00\x00\x00\x00"
"\x3c\x00\x00\x00\x00\x00\x00\x00"
"\x3f\x00\x00\x00\x00\x00\x00\x00"
"\x40\x00\x00\x00\x00\x00\x00\x00"
-"\x41\x23"
"\x53\x00\x00\x00\x00\x00\x00\x00"
"\x56\x00\x00\x00\x00\x00\x00\x00"
-"\x57\x57"
-"\x65\x65"
"\x67\x00\x00\x00\x00\x00\x00\x00"
"\x6a\x00\x00\x00\x00\x00\x00\x00"
"\x6c\x00\x00\x00\x00\x00\x00\x00"
-"\x79\x4e"
"\x7c\x00\x00\x00\x00\x00\x00\x00"
-"\x7e\x2f"
+"\x7f\x00\x00\x00\x00\x00\x00\x00"
"\x88\x00\x00\x00\x00\x00\x00\x00"
"\x8b\x00\x00\x00\x00\x00\x00\x00"
"\x8d\x00\x00\x00\x00\x00\x00\x00"
"\x90\x00\x00\x00\x00\x00\x00\x00"
"\x99\x00\x00\x00\x00\x00\x00\x00"
+"\xa8\x00\x00\x00\x00\x00\x00\x00"
"\xb5\x00\x00\x00\x00\x00\x00\x00"
-"\xb5\x01\x00\x00\x00\x00\x00\x00"
"\xc3\x00\x00\x00\x00\x00\x00\x00"
-"\xc4\x80h\x00\x00\x00\xc4\x80\xe7\x91\xa8\xe4\x81\xb4\xe3\xa9\xad\xe7\xbd\xbf\xe2\xbd\x95"
+"\xc5\x00\x00\x00\x00\x00\x00\x00"
"\xc8\x00\x00\x00\x00\x00\x00\x00"
"\xc9\x00\x00\x00\x00\x00\x00\x00"
"\xd8\x00\x00\x00\x00\x00\x00\x00"
"\xd9\x00\x00\x00\x00\x00\x00\x00"
"\xdc\x00\x00\x00\x00\x00\x00\x00"
"\xdf\x00\x00\x00\x00\x00\x00\x00"
-"\xe5\xb9\x95\x06\xc4\x80\x00\x00\x00\xe1\xac\x85\xe1\xac\x99\xe1\xac\x9b\xe4\xb8\xb6\xe5\xb5\x9b"
"\xe7\x03\x00\x00\x00\x00\x00\x00"
"\xee\x00\x00\x00\x00\x00\x00\x00"
"\xef\x00\x00\x00\x00\x00\x00\x00"
-"\xf1\x96\x97\xbf\xf3\x84\x84\xad\xf1\xa0\x98\x86\x06\x00\xe2\xbd\x87"
-"\xf1\xbc\x9f\x87\x00\x00THz\xf1\x93\x84\xad\xe3\x80\xb0"
-"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\x00\xf4\x80\x80\x80\xc4\xb3\x00"
-"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf1\xbc\x9f\x87\x00\x00\xe3\x8e\x94\xf1\x93\x84\xad0"
"\xfb\x00\x00\x00\x00\x00\x00\x00"
"\xfc\x00\x00\x00\x00\x00\x00\x00"
"\xfd\x00\x00\x00\x00\x00\x00\x00"
"\xfe\x00\x00\x00\x00\x00\x00\x00"
-"\xff\xff"
-"\xff\xff\xff\xff"
+"\x00\x00\x00\x00\x00\x00\x00\x01"
+"\x00\x00\x00\x00\x00\x00\x00\x03"
+"\x00\x00\x00\x00\x00\x00\x00\x04"
+"\x00\x00\x00\x00\x00\x00\x00\x05"
+"\x00\x00\x00\x00\x00\x00\x00\x07"
+"\x00\x00\x00\x00\x00\x00\x00\x08"
+"\x00\x00\x00\x00\x00\x00\x00\x09"
+"\x00\x00\x00\x00\x00\x00\x00\x0a"
+"\x00\x00\x00\x00\x00\x00\x00\x0d"
+"\x00\x00\x00\x00\x00\x00\x00\x0f"
+"\x00\x00\x00\x00\x00\x00\x00\x11"
+"\x00\x00\x00\x00\x00\x00\x00\x12"
+"\x00\x00\x00\x00\x00\x00\x00\x16"
+"\x00\x00\x00\x00\x00\x00\x00\x17"
+"\x00\x00\x00\x00\x00\x00\x00\x19"
+"\x00\x00\x00\x00\x00\x00\x00\x28"
+"\x00\x00\x00\x00\x00\x00\x00\x31"
+"\x00\x00\x00\x00\x00\x00\x00\x39"
+"\x00\x00\x00\x00\x00\x00\x00\x3b"
+"\x00\x00\x00\x00\x00\x00\x00\x3e"
+"\x00\x00\x00\x00\x00\x00\x00\x88"
+"\x00\x00\x00\x00\x00\x00\x00\xae"
+"\x00\x00\x00\x00\x00\x00\x00\xd8"
+"\x00\x00\x00\x00\x00\x00\x00\xfb"
+"\x00\x00\x00\x00\x00\x00\x009"
+"\x00\x00\x00\x00\x00\x00\x00i"
+"\x00\x00\x00\x00\x00\x00\x00y"
+"\x01\x00\x00\x00\x00\x00\x00\x01"
+"\x01\x00\x00\x00\x00\x00\x00\x02"
+"\x01\x00\x00\x00\x00\x00\x00\x04"
+"\x01\x00\x00\x00\x00\x00\x00\x05"
+"\x01\x00\x00\x00\x00\x00\x00\x07"
+"\x01\x00\x00\x00\x00\x00\x00\x08"
+"\x01\x00\x00\x00\x00\x00\x00\x0a"
+"\x01\x00\x00\x00\x00\x00\x00\x0b"
+"\x01\x00\x00\x00\x00\x00\x00\x0c"
+"\x01\x00\x00\x00\x00\x00\x00\x0d"
+"\x01\x00\x00\x00\x00\x00\x00\x0e"
+"\x01\x00\x00\x00\x00\x00\x00\x0f"
+"\x01\x00\x00\x00\x00\x00\x00\x11"
+"\x01\x00\x00\x00\x00\x00\x00\x18"
+"\x01\x00\x00\x00\x00\x00\x00\x24"
+"\x01\x00\x00\x00\x00\x00\x00\x27"
+"\x01\x00\x00\x00\x00\x00\x00\x2b"
+"\x01\x00\x00\x00\x00\x00\x00\x33"
+"\x01\x00\x00\x00\x00\x00\x00\x35"
+"\x01\x00\x00\x00\x00\x00\x00\x36"
+"\x01\x00\x00\x00\x00\x00\x00\x3b"
+"\x01\x00\x00\x00\x00\x00\x00\x40"
+"\x01\x00\x00\x00\x00\x00\x00\x4f"
+"\x01\x00\x00\x00\x00\x00\x00\x5d"
+"\x01\x00\x00\x00\x00\x00\x00\x63"
+"\x01\x00\x00\x00\x00\x00\x00\x65"
+"\x01\x00\x00\x00\x00\x00\x00\x76"
+"\x01\x00\x00\x00\x00\x00\x00\x80"
+"\x01\x00\x00\x00\x00\x00\x00\x88"
+"\x01\x00\x00\x00\x00\x00\x00\x8b"
+"\x01\x00\x00\x00\x00\x00\x00\x94"
+"\x01\x00\x00\x00\x00\x00\x00\x98"
+"\x01\x00\x00\x00\x00\x00\x00\xd7"
+"\x01\x00\x00\x00\x00\x00\x00\xf7"
+"\x01\x00\x00\x00\x00\x00\x00-"
+"\x01\x00\x00\x00\x00\x00\x003"
+"\x01\x00\x00\x00\x00\x00\x00]"
+"\x01\x00\x00\x00\x00\x00\x01\x47"
+"\x01\x00\x00\x00\x00\x00\x01\x52"
+"\x01\x00\x00\x00\x00\x00\x02\x17"
+"\x01\x00\x00\x00\x00\x03\x0d\x40"
+"\x00\x00\x00\x00\x00\x03\x0d\x40"
+"\x00\x01\x00\x00\x00\x00\x00\x00"
+"\x01\x00\x01\x00\x00\x00\x00\x00"
+"\x15\x01\x00\x00\x00\x00\x00\x00"
+"\x23\x01\x00\x00\x00\x00\x00\x00"
+"\x2e\x01\x00\x00\x00\x00\x00\x00"
+"\x51\x01\x00\x00\x00\x00\x00\x00"
+"\x81\x00\x00\x00\x00\x00\x00\x00"
+"\x90\x01\x00\x00\x00\x00\x00\x00"
+"\x91\x01\x00\x00\x00\x00\x00\x00"
+"\xb5\x01\x00\x00\x00\x00\x00\x00"
+"\x1a\x03\x00\x00\x00\x00\x00\x00"
+"\xff\xff\xff\xff\xff\xff\x02\x00"
+"\xff\xff\xff\xff\xff\x02\x0d\x40"
+"\xff\xff\xff\xff\xff\x00\x00\x00"
"\xff\xff\xff\xff\x20"
+"\xff\xff\xff\xff\xff\xff\xff\x00"
"\xff\xff\xff\xff\xff\xff\xff\x01"
"\xff\xff\xff\xff\xff\xff\xff\x02"
"\xff\xff\xff\xff\xff\xff\xff\x03"
"\xff\xff\xff\xff\xff\xff\xff\x04"
+"\xff\xff\xff\xff\xff\xff\xff\x05"
+"\xff\xff\xff\xff\xff\xff\xff\x07"
+"\xff\xff\xff\xff\xff\xff\xff\x08"
"\xff\xff\xff\xff\xff\xff\xff\x09"
"\xff\xff\xff\xff\xff\xff\xff\x0a"
"\xff\xff\xff\xff\xff\xff\xff\x0b"
+"\xff\xff\xff\xff\xff\xff\xff\x0c"
"\xff\xff\xff\xff\xff\xff\xff\x0f"
+"\xff\xff\xff\xff\xff\xff\xff\x10"
"\xff\xff\xff\xff\xff\xff\xff\x12"
"\xff\xff\xff\xff\xff\xff\xff\x13"
+"\xff\xff\xff\xff\xff\xff\xff\x14"
"\xff\xff\xff\xff\xff\xff\xff\x1d"
"\xff\xff\xff\xff\xff\xff\xff\x25"
"\xff\xff\xff\xff\xff\xff\xff\x27"
+"\xff\xff\xff\xff\xff\xff\xff\x29"
+"\xff\xff\xff\xff\xff\xff\xff\x2f"
+"\xff\xff\xff\xff\xff\xff\xff\x31"
"\xff\xff\xff\xff\xff\xff\xff\x32"
+"\xff\xff\xff\xff\xff\xff\xff\x39"
"\xff\xff\xff\xff\xff\xff\xff\x3b"
"\xff\xff\xff\xff\xff\xff\xff\x3f"
"\xff\xff\xff\xff\xff\xff\xff\x49"
"\xff\xff\xff\xff\xff\xff\xff\x68"
+"\xff\xff\xff\xff\xff\xff\xff\x69"
"\xff\xff\xff\xff\xff\xff\xff\x6e"
"\xff\xff\xff\xff\xff\xff\xff\x76"
"\xff\xff\xff\xff\xff\xff\xff\x7b"
+"\xff\xff\xff\xff\xff\xff\xff\x7c"
"\xff\xff\xff\xff\xff\xff\xff\x7e"
"\xff\xff\xff\xff\xff\xff\xff\x8c"
"\xff\xff\xff\xff\xff\xff\xff\x92"
+"\xff\xff\xff\xff\xff\xff\xff\x95"
"\xff\xff\xff\xff\xff\xff\xff\x97"
"\xff\xff\xff\xff\xff\xff\xff\xd0"
+"\xff\xff\xff\xff\xff\xff\xff\xd2"
+"\xff\xff\xff\xff\xff\xff\xff\xdb"
"\xff\xff\xff\xff\xff\xff\xff\xeb"
"\xff\xff\xff\xff\xff\xff\xff\xfa"
"\xff\xff\xff\xff\xff\xff\xff\xfb"
"\xff\xff\xff\xff\xff\xff\xff\xfd"
"\xff\xff\xff\xff\xff\xff\xff\xfe"
-"\xff\xff\xff\xff\xff\xff\xff\xff"
-"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0."
+"\xff\xff\xff\xff\xff\xff\xffN"
+"\xff\xff\xff\xff\xff\xff\xffV"
+"\x00\xd0\x80\x00\xe7\xbc\x80\x00\x00\x00-\x00\x00`\x00\x00\x00\x00\x00\x00-\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xb4\x80\xe7\x93\x9c"
+"\x22\x00\x00\x00\x00\x00\x00\x00"
+"\x2f\x2f"
+"\x41\x23"
+"\x57\x57"
+"\x65\x65"
+"\x73\x00\x00\x00\x00\x00\x00\x00"
+"\x79\x4e"
+"\x7e\x2f"
+"\x7f5"
+"\x7f\x00"
+"\xed\x80\x80\x00\x00\xc4\xb2"
+"?\x00\x00\x00\x00\x00\x00\x00"
+".\x00\x00\x00\x00\x00\x00\x00"
+"0["
+"[\x00\x00\x00\x00\x00\x00\x00"
+"@E"
+"\x05["
+"\x77\x27"
+"\x4f\x67\x67\x53"
+"\x78\x35\x30\x39"
+"\x37\x37\x37\x37"
+"\x25\x6e"
+"\x69\x7e"
+"\x73\x68\x6c\x76\x6c"
+"\x7b\x2b"
+"\x21\x28\x00\x00\x00\x00\x00\x00"
+"\x69\x64\x79\x79\x79\x79\x7a\x79"
+"\x30\x6f"
+"\x2f\x61"
+"\x41\x7f"
+"\x27\x00"
+"\x30\x30"
+"\xe2\xbd\x9b\x7f\xe2\xb8\x80\xc2\x80\x00\x00\x00\x00\x00"
+"\x2f\x7f"
+"\x5b\x6e"
+"\x32\x6f"
+"\x2f\x64"
+"\x6e\x73\x65\x64\x76\x75\x6e"
+"\x24\x76"
+"\x70\x28"
+"\x25\x30"
+"\xe2\xbc\x81\x00"
+"\x68\x74\x2b\x31"
+"\x4c\x00\x00\x00\x00\x00\x00\x00"