Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Poll inner connection until EOF after gzip decoder is complete #2484

Merged

Conversation

Andrey36652
Copy link
Contributor

Fix for #2381

@Andrey36652
Copy link
Contributor Author

Should I expand the fix on all other decompression methods?

@seanmonstar
Copy link
Owner

If they all have the same characteristic, namely that they know they ended before reading EOF, then they probably all suffer from the same thing.

@Andrey36652
Copy link
Contributor Author

Should I add tests for all other decompression methods?

@seanmonstar
Copy link
Owner

You can. If so, I'd do with a for loop, or some pattern to reduce the duplicate parts.

@Andrey36652
Copy link
Contributor Author

Can reqwest deal with such cases (multiple compression algorithms)?

// Multiple, in the order in which they were applied
Content-Encoding: deflate, gzip

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding

@seanmonstar
Copy link
Owner

I don't think it can, but not a single person has filed saying they needed it. So I suspect that is more of a theoretical part of the spec, and not something that servers ever actually do.

So I wouldn't bother supporting it for now, it'd make things complicated and we don't seem to need it.

@Andrey36652
Copy link
Contributor Author

I don't know why it fails style check, cargo fmt -- --check locallly shows no errors.

@seanmonstar
Copy link
Owner

Some code doesn't get formatted automatically because of conditional #[cfg] flags leaving some files out. You can run cargo fmt -- $(find . -name '*.rs' -print) to get all of them.

Copy link
Owner

@seanmonstar seanmonstar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent, excellent, excellent work. Thanks so much for cleaning this up! <3

@seanmonstar seanmonstar merged commit d36c0f5 into seanmonstar:master Dec 3, 2024
36 checks passed
kodiakhq bot pushed a commit to pdylanross/fatigue that referenced this pull request Dec 27, 2024
Bumps reqwest from 0.12.9 to 0.12.10.

Release notes
Sourced from reqwest's releases.

v0.12.10
What's Changed

Add ClientBuilder::connector_layer() to allow customizing the connector stack. by @​jlizen in seanmonstar/reqwest#2496
Add ClientBuilder::http2_max_header_list_size() option by @​DSharifi in seanmonstar/reqwest#2465
Fix decompression of chunked bodies so the connections can be reused more often by @​Andrey36652 in seanmonstar/reqwest#2484
Fix propagating body size hint (content-length) information when wrapping bodies by @​seanmonstar in seanmonstar/reqwest#2503

New Contributors

@​DSharifi made their first contribution in seanmonstar/reqwest#2465
@​gretchenfrage made their first contribution in seanmonstar/reqwest#2464
@​hsivonen made their first contribution in seanmonstar/reqwest#2470
@​ovnicraft made their first contribution in seanmonstar/reqwest#2469
@​Nuhvi made their first contribution in seanmonstar/reqwest#2473
@​caojen made their first contribution in seanmonstar/reqwest#2488
@​Andrey36652 made their first contribution in seanmonstar/reqwest#2484
@​jlizen made their first contribution in seanmonstar/reqwest#2499

Thanks

@​seanmonstar
@​nyurik

Full Changelog: seanmonstar/reqwest@v0.12.9...v0.12.10



Changelog
Sourced from reqwest's changelog.

v0.12.10

Add ClientBuilder::connector_layer() to allow customizing the connector stack.
Add ClientBuilder::http2_max_header_list_size() option.
Fix propagating body size hint (content-length) information when wrapping bodies.
Fix decompression of chunked bodies so the connections can be reused more often.




Commits

409cff3 v0.12.10
ea48da7 docs: fix a few spelling issues (#2478)
3ce98b5 fix: propagate Body::size_hint when wrapping bodies (#2503)
44ca5ee remove Clone from connect::Unnameable for now (#2502)
2a7c1b6 feat: allow pluggable tower layers in connector service stack (#2496)
8a2174f chore: in README, update requirements to mention rustls along with vendored o...
d36c0f5 perf: fix decoder streams to make pooled connections reusable (#2484)
4367d30 ci: pin hashbrown for msrv job (#2488)
e2d4b14 docs: document using non-zero ports in resolved addresses (#2473)
6e21413 chore: fix a number of newer clippy lints (#2469)
Additional commits viewable in compare view




Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

@dependabot rebase will rebase this PR
@dependabot recreate will recreate this PR, overwriting any edits that have been made to it
@dependabot merge will merge this PR after your CI passes on it
@dependabot squash and merge will squash and merge this PR after your CI passes on it
@dependabot cancel merge will cancel a previously requested merge and block automerging
@dependabot reopen will reopen this PR if it is closed
@dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
@dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
@dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
AaronDewes pushed a commit to AaronDewes/reqwest-no-rustls that referenced this pull request Jan 4, 2025
…nstar#2484)

When a response body is being decompressed, and the length wasn't known, but was using chunked transfer-encoding, the remaining `0\r\n\r\n` was not consumed. That would leave the connection in a state that could be not be reused, and so the pool had to discard it.

This fix makes sure the remaining end chunk is consumed, improving the amount of pooled connections that can be reused.

Closes seanmonstar#2381
@yanns
Copy link

yanns commented Mar 5, 2025

@Andrey36652 this change broke the response decompression using zstd: #2574
Do you maybe have an idea of what I can look at?

@Andrey36652
Copy link
Contributor Author

@yanns can you provide pcap file of traffic in question + TLS key to decrypt it?

@yanns
Copy link

yanns commented Mar 5, 2025

@Andrey36652 I've never done this. I can check.
In the meantime, I can provide the logs from reqwest:

2025-03-05T12:51:58.609489Z TRACE reqwest::connect::verbose: d614d5d7 read: b"HTTP/1.1 200 OK\r\ncontent-type: application/json; charset=utf-8\r\nx-graphql-operation-type: Query\r\nx-graphql-query-complexity: 18770.0\r\nx-graphql-top-level-fields: products\r\nx-graphql-contains-deprecated-field: false\r\nx-graphql-number-of-errors: 0\r\nx-client-id: mBBqhRlhYSbibI1lK7Nn_1P1\r\naccess-control-allow-origin: *\r\naccess-control-allow-headers: Accept, Authorization, Content-Type, Origin, User-Agent, X-Correlation-ID\r\naccess-control-allow-methods: GET, POST, DELETE, OPTIONS\r\naccess-control-expose-headers: X-Correlation-ID\r\naccess-control-max-age: 299\r\nx-correlation-id: projects-e6aaa04b-4a64-4098-886d-fd15c80316b2\r\nserver-timing: projects;dur=1523\r\ncontent-encoding: zstd\r\nContent-Length: 638430\r\nx-envoy-upstream-service-time: 1542\r\ndate: Wed, 05 Mar 2025 12:51:58 GMT\r\nserver: istio-envoy\r\nVia: 1.1 google\r\nAlt-Svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\n\r\n(\xb5/\xfd`\0\xff=\xda\0Z\xa7\xe5D>`I\x93t0\x0ck\x1a\x12\xc0\xfa\x1ac\xc80\xfe\xf3Q#\x8b\xc8\xde=\xda\xde\xb4vlBd\x92\x89\x7f-b#\"T\xf5\xe7\xedg\x18z\xf4\xfd\niKRJ\x99\xa4$\xe6\x9b\xc2m:\x0ck\x05\xe6\x04_\x04\xed\x03.\x9b2b\x8b\xd9u\xeb\x14\xb7\xf1\xb6'\xf4\xb4\xa9\x1c\xd4|mQ\xae\xff\xa5\xad B\xab\xcd\xd9?\xf4N=\xe6\xb2\xfb7;AM\x87keL\xcb\xe8\x976R\r\xc1\xe6\xd47fT\xd4\xb9+j\xba\x159\x17'\xf5\xe8\x0e\x0f\x0f\xa8U\xf6\xcf\xb5\x88:f\xa7\xc5\xc9lin7KM\x91W\xb1k\xd5H\xab^I)\xd6\x1a\\\xa9\x19\x8c0[s\x9d\x90]\xf3\x1bj\xaa\x96\x16\\\xf1%2\xc0w\x12\xa8\xfc\xb2\xf0\xc2!\x1aL\xf3\xa0y\x06\xf38\rG\x12\x19\x90\x02<\xe0\0i\x10\xe1\t\xa6\xdaK\x0b\x9e\xe5=q\x12\xff\x86\xc2\xb3\xbc#Mck\xbb\xa2#\xe52*\x7f\xd9\xcc5YB\x9a\xce\x91\xfa\xef\x87\xa4\x85\x93\x86\r\xa0(\x0bo\xf8\x1d$Qa\xc1,\xcc\xe0\x86\x0b7\0\x17n\xc0i\x98\xc7y_\x18ITX@\x03\xb2|\xd3\0*\xc9\xc2\x91D\x85t\xd2Qp\xe7\xf2\x0c\xe6\x82\xa2\xa18\xac(\x0c\xe1\x1c|\xbc\xd30\x0c\x14\xdcG\xf3Pi0\x8b'q$Q!\x03\xf2pI\x9aWP`\x82f\0\x87\xc3\xf0h8\x0eC,\x0b\x8e\x87KC\xb14\x9a\x87\x0b\x05&h\x1e\x02F\xc30p|\x02\x13EQ\x81\t\x18\xcd\x1f\xff$\xef4\x0f\x1b\xc6\0G\xf3\xf0\x88\r>^B\x8cI\xa3x\x057\x0e\x1c\x9f\xc0#\xb1<\xe3\x93\xa6\xf9Gi,\xfc\x81\xb1\xf8\xa5\xf9\x1bn\x08\x8e\xe6\x1d\x0e\x05\x8a\x04.\xdf<\x07\\\x1a)\xe1\x9fO&\xe4\xf2\x14\x8e\xe5\x95\xe4\xe9\x86\x930\x04p,\xc9\xf1Xh\x92\x0bG\xf3\xf0#\x1c\xbf4\xdfJ\xe2\x1c\x0e;\x1c\n<Y48\x96"    
2025-03-05T12:51:58.611124Z TRACE reqwest::connect::verbose: d614d5d7 read: b"_^\xb14.H\xf0\x8a\xa5q,\xbfp\x87q\x8e\xc6\x02\x13\xc4cyx<\xcdC4\x15\x98\xc0B\xf3\x10\x1c\xbfp\x87\x1d8  \x81\xc4!\x91!\x81(x\x92\xf84\x98#\xa2y\x08\xfe\x88\xcc\xb1\xf0\x87\x19\x87\xc2\x0f\x13'i\x18\x82\x83\xd10\xf1x\x96o>\xc6\x04\x1e\x8f\xf3\nE\xc39\x9e\x85i\xe2\xc2\x1c\xce\xf3\x8b\x82\x19\x8a%i\x1e\xe7q\x1a\x0c\x80\xfcJ3\x04\x0c\xe3\x9bc\xc1\xa1\xc0\x81\x8d\xc7\xb1\xe0Ls\xc0\x84\xc1M\x04\xc4\xe1\x89\xa2\xf0\xf3\x8cCQ\x98\xe1,\x9e\xe4\xc2\x924\x83\xf1cI\x8e\x85\xbbi\x1cp\xe1Ca\x18?\x9c\x86\x1f\x02\x82\x8f'a$G\xf3\x8b\x87_9\x9a\x87@I\x9c\xe3\x17\x0e\x1c\n\x1c\xe7\x1b\x0f\x8e\xc8\x1c\x9e,\xfc\x88p\xf8\x0f\x85=\x81\x88x\x8e_<\x87\xf3\td\x9a\xf1G\x04\x1cp\x81\x85\x95\x08\x07\x088\xe0\x02\xc7/\x1c\xc0\xb0\0\x076\xcc\x85\x88\x17\0?\xcfx\xe5I\x1c\xe0\xe7\x19\x08\x86\x06\xe4Y\xbei\x1a\xee\xd0\xfc\xe30\x03Id\xc8P!C\x85\x83\xc2\x82\x07\x85\x97\xe6\x9f\x08\x1c@\xf0\x85\x9f\xe0<\xfe\x8f\x05\x0b\x0c\x13\x81\x82\x05\x86Q\x9cy\x1e\x96\x018\xc9+\x0c\xd3\t?<8\xfc\x10\x10\x8dF\xa1|\xa2\x80\x07py\x85\x92<\x0f\x0f\xafD<\x8e\x83\xa3$\xfc<t8\x1aFa\x1a4\x96\x85'/\xc1w7\xfc\r\x03\xddpd\x14\xe5\xc1\x83\xf3\x13\x98\xa0\x02\x134\x8a\x97 q\x9a\x7f\x94\x84\x01\t\x92\x87\x85a0\x18W,\x89\xa2\xbc\xe30M\x03\x0b\x0c\x13\xe1\x17\x0e\xfc\xf3\n\x04\x83\xf1w\x8e%9\x1e\xb2\x84\x08\x85\x1f\x08\x0b\x84\x87\xccpP\x94\x05\r\xc3\xc03\xf8aQ$\xceCFc\xf9w\x98\x81\x938\xcc\xe0\x1d\xeeCB\xa3\x01\xc9\xf2\0\x84\x10A\xd2<\xccP\xdeB\xf24\x0b\x16N\x94\x84\x91D\xc0\x12\x0e\x07\x08\x0b\"p\x80\xb0\xe0h\x9e\xc1h,\xcd\x7f\x03\r\xc7\xc6\xc2\x12\x9aoFc\xc2+\x9e<\r?\x11\xfc\x93\xc8P!\x03\xc2h<\x0c\x15\xe5\x1f\xa7q\xf0\xf0I\x12\x19\x90\x06Gd\x8e\x7f\xd8\x01i@\xbe\xa10\x04H\x02Y\x1ei@\x14\x85\x9d\x89\xa0(\x0b\x94oV\x90\x04\xf2\x0b3\x01i@\x9e%\xe1\xe6q\x16\xa6\xc1\xc3\x0e\x0b\x93<\xfc\x8dg@\x9e\x91<\xff0|\x16&y\x92%\x89\xef\xf0O\xa3\x93\xe6y\x18I \xdf4\x1eo4\xcf\xc3\xf1\xfc\xc3\xc1\x0f;\x1c\x14\x8ew\x92fi< \tdI\x98\x81\xa1\x01y\x88\x08\x07\x12\x19*D\x98\xa0\x92r\xe0\xb0\xfb\xf0@J\x89\x0c\x88\x03\x0b\x90\x06$\xa2y\x96\x06\xe3HB)@\r\xc8\xb34\x18\x06#\tD\x81\xe2Kr\0\0\xa9\x7f\xb8A\x12\x88\x8a\x8ay\x82.\xa9\x87\xb9\xda;76M\xa7\xcc\xe5\xd3\xb5\xa8_\x8ax\x0b\x0b\x93<\x10I\xe3\xceC$\x81\xc0\x86\xe1\xc2\x8f\x834 \xcf\xe0\x05\xc1\xd0\x80D4\x8c\xe2\x1fn\x10\x01?\x90\x91\xf0\x9e4\x10HBQ\x1aK\x03\xf2\x0f?\x0e\x92\xa8\x80<\xd0\xa7\x90r\x80\x16 \x0bh@\x9c\x86\x05\x07I K\xb5\xc5\xd8\xf9[\xfd\x19\x95\xdbL\x885\xbb\xa9\x96\x1c\x91s\x90\x19\xd2\x80\xc0\x04\xc1\xb0\x80\x06\xc4y\x94\x86\xf3\r\x82\xa1\x01q\x1eo@\xa6\x81@04 \xfc0D0\x041&C\x86\\\x84O\x99\xa6n\xed\xeb.%?z\x19#k&\xe7\x9b\xd0u\xd5\x913g\xfd\x9c[\x14\xdf\xcb\xb5m\xb3\x1b\xd2\\\xcf]\xc2\x15\xd3{\xea\xda\xf4{\xa1?\xd7\x89\xe0o\xaa\xb74\xe1r.Soz\x0f-\xf76\xb9\x8e\x9fXS\xcdb\xfe\xea\x97\x1dU3\xb5\xf2\\\xebj]\xaf\x02(0\xf8E\xf3\x0bO\x1c%y\x1e\x8eO\x1e\x8e\xe5\x9d\xe4/|\x1f\xdfH8\x14(\x98\xc1\xe1\xe0x,p\x03q<\xc0\x01\x178\x96\x7f\x92\xb7\xb0<\xfcd\xe1\xcf?\x9f\xf4\xb1\xc0\x85\x1b8\x92\xbf \x01#\xc1x\x12F\xf2\x8a\x85\xe3\x13\x87C\xc1\xf3$\x078\x9a\x87\xcf\x80\xe3I\x18\x8cs<\n\x05&X$\x0cF\xe3\xc1\xe14\xb8!\xc1\xf1,\xfeq\xbe\x17\xe6\x13\x07\xc7\xf9e\xe1$J\xc4\xe3\x1c\x0f\x01\xd3@\x1c\r&\xe2\x888\xc0\xa1@\xc1\x9d\x11\x0c#\x9a\x87\xe0qn \x0e>\xf2p\x98C\xb1$\x11M\xc3\xee4\x1f#s8\xaf\xc0\x85\x17\x07\x04\xf3\x1c\xaft\x83\x81\x10\xdc<N\xe2\x95\xe6\x85\xf3\xf3P\xc1\xfd,\xef\x0el\xf8\xfb\x95\xe7I\x94\xe3\x17\tFCqx\xf2\xfc\xe2Y\"\x9c\x03\0\x08\xa5#2\xc7\xd3`\x8e\x87\xcc8\x9c\xe4H\x96\xa4\xe1d\xd1\xe0H\x96\x85\x93\x07GD\x1f\x12\x1exp0\x98&\x1e\n\xeeC\x01\x14\x18\xb46\xd4\x11\xb1\x18\xdd\xcb\x87js\xa1\xd6\\\xc8\x9e\xa8\xb1\x94\xd4\xf97\x9a\x87\xa5\x05\xcb3\xd8\x01\x89x\x1a\x06\"\x03\xd2|+\t\\\x1eI \xcc\xb3\xbc\xe2I\x10\x0c\xc7/\xcc\xf1\x0b\x834 \x12$\x0f\xbf0\xcc\xc2,\x19\x10\xa4\x01q\x9co(\x10J\xeb!\x11 \x11 <\x1c\xc8!\xb6\xc7&\t\x0f\x07h\xe0\x02\x17\xc0\xa9\xf0\x12B\xe9H\xc0\x84\xa6\x16\x8f[\x16\x1a&\x01\xc7\x85\x9f\xe0\x8bmCV\xf1\xdd\xe5K\xfc\x92\xf1s\xe9X\xf2\x15\xa1j\xa6QW\xff)\xc8\x998\xa6T\xb6\xedu\xec\x85\x92\xee\xb1\xa0\x01b\xed\xe1\x80\xcb;\xcb\x05\xc6\x01w\x12_\xb8a\xe0X\xf8\x81E\xe5\x9f\xd2zmO\x05\xd7\xcb\xe7\x92&T\xb8\xf9)>u\xf7\x9d\xa0\xb3"    
2025-03-05T12:51:58.611845Z TRACE reqwest::connect::verbose: d614d5d7 read: b"U\xd5\xb1[\xae\xf8\x9b\x8f\x9f&\xef\xfa|\x8e\x10o\xaf\x96T\xe2y8\"\x9aF_\xf8\t\x0c\x0e\x0b\xce\x0cv\xf9\xd3_)\xf1R\xa9\x1a\xdcL)i\xc6\x97:\x91z\xdf\xa4\\\xda\xd6X\xab\xa8\x98i:\x95:\x95&\xcd\x87\x90\xe7'\x15\xd1\xe2\xc4PC\xed\x88\0a\xe5\x8b\xe0\x0b\x16\x1a\xa6p8\xce7\x8a\x85ip<\xce\x1f\x80Q\xb0'\x8b\x06\xff\x9c\xb5\xc6\xaa9\xf4\xb9T;\xffA\xcdue\x99 \xaf\xf2\xd8\xccP\xa3g\xaa\xddv2\xf7\x97\x91\xa1&{\xe8\xd3\x11k}\xd1\x93&\x85\x8e\x05\x12\x10J\n\x05'i^Q\xf8\xc1\xf10yx\x05L\x9afp\x83ca\x1e\x87q\x0e\xf9c\xe8\xfdC1\xdd\xf7K\xb4Os\xa1\xb4\xb98\xaa\xeb\xa7\x94\xfbE\xcc\xcf1\x96\xafu\xd3\x1fi>\xbfOu\xe7\xda\xb1\xc4\x16!\xc5\x14\xcd\xf7[\xf0\xa5\x02\x13HP4\x8dfp\x03+\xa2\xe5\t\xbe\x98\xdbZgTH3>~\xb9\xad9\xb3E\x8e=\x95\xb6\xdf\xa7\xc8\xfa)\xdd}\x13\xaa\xa6\xd9\x10\xc6\xd4\xa8\xaf\xda}k\x88\xfd\x04&\xe0\xe6q\x9c\x06/\x14\x8dW\x80\x82Q\x98\x06P\x9d\xb9O(rz\x19\x1f\xe4\\\xe44\x17t.\xf5U\xf9:\xb6\x8c-f\xd4\xd6\xf2[\xaea\xbe\x079\xa3\xae\x86\x92\xa5\x96bcl5\xf4\x9eJ\n\x9a\xe7\xe1h\xbe\xc1\x0bg\x87\x85'KC\x82vs\xfb\x1c\\\xac6!T\x9d\xdf\x98f[\xb4\x12\xba\xb7\xd2Cm1\xd5m\xf0\x1b.m)\xb1\xe4v\x9b\xdb\x9a\xa62b\xb9j\xb5_z\xa8)\x96\xa4Y\x9a\x87\x18\0/\xcb'\x06h\xea\xbd\xd7V[\x05W\"\xd7\xce~\xa5\xf9\\C\xf9\xac\xee\xbe\xcb\xa5\xb5\x1b\xd7\xfdK\xaf3){\xe94j\xa2\xef\x98(1E\x8fS\x86\x0c\xac8M\x12\x91\x84\xe2\x1b\xa4\x01\x89x\x12G\x12\x88K\t%\x85\x1f\x87\x81@\x12HRH\x03\x02\x97$B\xf3\xcf\xf2\xc0\x84\xe7\xbfy\x1c\xe7\x1b\x08Yi\x9e\xc1\xf1\r\xf3<\x1c\x0e\x1e \x14`\xc2\x03\x0f\t\xfd2ZV\xef+_\x83\x9b\xfe\x94&{\xa6\xa9\x92Z\x8c\x96cp\xba\x18?\xe8Mw\xb9\x05?Y\xe2\xcd\xa8^\x13\xaaM\t\x17\xb2\xe5`[\xdf\x0e:\x96\x9a\x1d\xcc\xde\xd8\t\xdf\xd3\xdc\xd6\x01\xc9\xe0\xd2|\x85\x9e\xa7\x18\x9b\x99\xc3\xf7\x0f\xbbc.|N\xdd\xa5\x99\x9az\xf6r\xaf\x17b\t\xee3\x84\xbaiC\xb9\xd8o*}Mg\xa9%D\xcb\xd8j+9^\x8dv5\xd4\xe0n\xb6\xd6/\x13[\x9ai\xdd&z\xaau\xdd\xbd\x97\x96\xd2O\xe83zk.\xc8Rjr\xbd\x1c*\xb4\xdd\xee\xed.g\xed\xa5R\x91\x93y\xd4D1j\xc2u\xcc=\xf6\xc9\x9djh\x9f\xba\xcc\xb4Hs)\x83\xaf)^\x0eq\\\xd5\x96\xb7\xf4^\x9b\xee\xbd\xe6\xfa\x85r\xc1\x15\xe3[nU/\xd4\x90W\xdb\xceN\xcf\xf9\xde\xd2D\xbe\x9f-\xad\xe8>1\xfb\xb7\xd5\x9c\x99'Oo\xdb\xb9~5\x95r\x95\xedY?|\x87\xa2>l\x85\xafT\xe5\xb7\xc8\xe9Zkv3L\xd5U\xec\xfa\xb1\x14\xffmS\xeen\xf35s6\xa6\x9ap\xa9NW\x102\xc6\xfa\xa5\xb6\xbd\x9c\xdcK\xdd\xc4\xb9\xfa5U1\x96\x08-\x84\x902\x06\xaa\x82\xa3(\xbfH\x1c\xcfB\x91(\x19\x1aJ'\x90\x06+\x8d\xa1\x01QZ\xd5\x03\x02\x10\x10A\x04\xcf?\xe4\x92\\p\xe0ygI.<\x12\\C\x08\x1dm\xb1\x07\x15\x80\x8f\xab%U\xab^\xf3%\xedTkivL(\xb9\xa3J\xdb\x9b~\x9d\xa5\xd5\xc72\xa6\xb8\x99Z\xd2dM\xb5T\x87\x90w\xec\x87\xd6j\xd5`S\x94\xc8\xdb\xa6\x8aQ\xb3-\xe4\xa9\xab\x15D\xee\x93\xbf]\xd5\xaa\x90\xbfln\x9d\xdfL3\xfen\xaa\xc4\xcb\x95s\xe5\x92b\xb1}B\xafs{u2\xc64\x1b1\x95\xc8\xa9\xc7\x92S\xda\xd2\xa2\xf4\xd4\xc7\xe5\xd4\xa5\"\xdf\\\xcf+\xa3\x8a\xbe*E\xc7Rj\xea\xfa\x9e7c.\xe1B\x9d\x1d\x9bfw\xfb\x8co\xed\xaa\xb5\xcb\x12D\xcbWl\t>\xedl,\xbe|\x11j\xee\x8a/\xd7?\xd6e\xa5\x1aC*1\xe7Z\xf2GH\xa5d\xfe\xcd\x84\x92\xe6\x83.\xe6;U\x86\x10c\x0f6\xb5\xfd\xcd^\xbf\x95\xe8\xe3Ke\xd6d\xd5\x97*\xbeK\xc8\x1f\xa7\xa7\xfe\x9e\xa3J\x9d\xd1\xbbs\xbb5\x9d\x1f\xa7B\xee\xc1\xc7\xc9\x9b?U.\xa6\xd5\x95\x9f\x96\x93u\xd4\x8c\xcc=YR\xfc\x94G\xe6\x92\xfa\xfb\x87\xae\xbdN(\x1f\xa9\xceUK\x93\x9bs\xb9`Z\x0b\x15\xfb\xd4\xad\x1d\\\x0c\xdbg\xaf\xea\\\x8f5#l\xdb k\xd5U\xf6f\xac\xc1\x97\x89\xd3\xcbgN\x93YWF}\xd1\xdb\x8b\xaaKU\x13k\x8c!]M%r\xb7\xc9\xbb4\x17?\xce\xb8\x1c7ROjE\x8d\xd1\xad\xfb*\x97\xed\xd4fR\xab\xb9\xcaW6\xe7\xf8\xbf\x12\xf2\x15v\x18\x9c(\x8a\xa4{\x01L^\xb1\xf0\x0c\x18\x90\x8a%Y<\x8c\xe2\x0b\x7f\0\x08@a\0\x13$D\x10@\0 4\xf0\x80\x01\x07\x0e\r\x18$\x90\x05\x0b\xd6\x81\x84g\xb5\xf6\xbd\xc50;\xf2&CJy\xaeco\xbd\x85\xceG|\x04\xa3\xf1\x80\xa1\0\n\x0c\x18rZ\0\x07\x06\x88\0\xe1\xe1\x90\x10\xe1\xd8\xe5\xd2\x03\x83\xf5W\xef\x1b\xb6J\x04QgT\xec%|\n!F\x0c\xc5\xf6\x9d\xda+\xf4\\\xad\x9c\xcb\x95\xe6\x8a\xc8\x13\xa5\x84`SN1\xb5\xdaz\x1cUSz\\\x9b\x0f!M\x87\xde\xc9\x1c\xdf"    
2025-03-05T12:51:58.612691Z TRACE reqwest::connect::verbose: d614d5d7 read: b"\x913\xe5\xd4\xdc\x951\xd4\xf9\x10\xdc\xdc\x864\xb9\xf7\xa5{b\xa7o\xdd7\xa7\xceU\xe3]\x19\x1d\xbe\xd4\xf44\xdd\x83\x9d\x9aX=}t\xeb\x1c\xe3\xa5\xfbJE\xe5R\xa5\xd8\xc9ki\xee\xf7&\xbbz\xf1\xad\xa5\xa8\xbd_\xdb\xfbq\xa5[\xf7r)\xa8\xd9\x1cu2\xd3G\xec\x8a\x98\xe3E\xec\xc1\xd4XU\xe5r\xee\xf4\xe5\x9a\xcc\x0ce\xafe\xad\xed\x90SH\x9f{\xaf\xc8\xd6R\x9c\x10\xa9M\xa6\xab\xd9\x8eu.\x8b\x1c\x957u\xebEw\xfa\xa0j\x8cU\xd3A\xf42\xad\xa4\xd9\x12r\xa9\x0b\x99U!\xec\x8d\xcc\x15jiu\xaa\x87\x9b,\xbafD\xea\xb3Ao_\xb8\x9e\xb6E\x8dy\xa9\\\xab\x9b\xeaM\xd3\xed~*\x8f\xac\xce\x92\x83\xaa5U\x1a\xa3\xcb\x85\xfd\xf2\xad\xd7\x8c0\xbb\x1c7\xa2}\x1bS1\xe3t]Mw\xc8\xd7/m\xac%\x87vmLl\x95\xad\\qq.+\xcd\x94P\xca\xe4\x8ei\x8ai%\xb4\x8e\xd0rN1\x99~'DK\xf3_\x84\xb9\x0e\xb7y3\x97\x10'\x85\xe0\xe2l\xe68\x99\xba\xa6\"\x16\x93\xb9k\xea \\\r\xe9B\x90\x9b\xbb\x97Pu\x13\xeej\xben0\x15{\xba`j\xb5|_{\xf5\xe0\xa6t\xc97\xd3j\x9a\xee\xb9%\xa3\xb8\xfccC\xcfW\xfc\xa4\x94\xa9\x97Q-\xce\x16\x95fc\xde\xf2\x1f\xa1\xd5\xfa\x1dT\x8f \x83o)\x95\xbb\xdeK\x18U\xd3\x91S\xa9\xdd\xcf]\xff;/r\xdd\xfa\x9c\x89Y\xd3\x13\xeaT\x91\xdf\xfa\xf4\xd6;\xb9\xd5\xec\xcdY>\xff\xce\xd4\xa0f\xf4_\xc9\x96\xdbU\x0c:`\xce!\xa2\x08\x1f#\xa4\xba}\xaa\xf58\xd9z\x9a\x1b\xdd\xb3\xf5\xf5k\xb5\xd4R\xe58\xae~K\xf5\xdafz\xaa\xc9+\xa6l\xc8\xfc\xb9!b\xefOE\xc6>y\xbb\xf3\xad\x87\xc9\xb4\xb5{\xfe\x1c'\xc7\x9e\xda\xb9tI;\xd9\xa9\xceV\xe4\x92v\xa3\xee\xc4\xc8\xd5?S\xda\x97p\x9b\xa6\xfec\xe9\x9e\xb1\xbf\xb7\x9eod\x8a\xdcr{\x97\xbb^\xe7\xfb\xd3d\x91;\xbf\xf1\xbf\xaa\xf7ZBL\x17\xf6sL\xd9\xff:\x95'M\xc8\xba\xb3\x9f\x9d\xb9\xd8\xeb%\x065E\x04\xd9\xbd\xd8\x1cc\x9a\xeb\xc1\x95\x1f\xd1k\xb8\x1e\xadnM\xa3/M\t\xe6Co\xf3!\xd5Lh\xa9l\xcd\xbd\xd8\r\xb2\xe7\x96y\xb9}\xf4\xe9e\xf4\xed|}\x9a\xeeqeS\x10\xba\xfe\xc6\x18b}\xef\x90{\x9a\xfa\xa9s\xc5\xa7\x89\x12b\xf5\x96{H\x19\xaa_\x10\xa5F}\xf9Z\xd2Dm\xa1D\xdf\xf6=\xc2\xa5\xde\xfakQ\xdb\x82\x8c4]UL\xa4\\BmE\x98:2\xb6N\xddK\xd4p3>\xd4\xf4\x049\xa3\xb7nj=}ki\xb12[)QD/\x1dL\x9akm\xccw\xa6\xdc\xa3\xa6qQ|\xbe\xd4\xaatI_\xc6\x944\xd7{O\xe4m\xbd\xc8b\xc3\xf8Xb\x996\xbe\xe4o\xcd\x96`\xcc\x7f\x10:\xb3\xe5\xa0\xad\x01\\\x8b\xe1j\xfa\x06c*\x8a\x9d\xceAM\xa7.\xa6\xae\xf5\xd6szI\xc1w\xae\xa2n&\xc56\xfd\xa3\xa6\x8a\x0e\xa52gN%\xa4\x086}\x14\x97s\xc5\xb7\xd9\xf4i6\xa6.cb}\xedVk\x87bb\xaa\x8fy\xb2\xa4\x9a\x0c\xa5M\xf7\xdc\xc7~\xb4\xfa?\xb9\xf7^%sk\x13\xb1\xd6|\xef\x98\xa9\xa1\xe7\xd0[\x83\xe9\x9b\xe2\xc7\x9e^\xd3\xb5\xbdl.i\xaa\xc8\x9e\x10zB\xf1QSk9\xb3\xe8\xacq\xa2\xe5\xce\xe4V3E\xd8\xd2ql\xbd\xbbVl\xd0\xe9\xaf\x15\xd9K\xef\xd6\xc9\x10\xd4lV\x9c\xe8\xb5V}\xd5\xd0n\xf2wJW\xe3\xf6\x91\xa5vw\xfaC\x9a\xcf\xd0eZ\xca\xa9\xde\xa8v\xb5m\xb0\xf1\xe2\xfcV\x9b\xde\xae\xf9jc.j\x04;>\x05W\xf5\xf2\x97b*\x8c\x9b\xaci\xe7r\xc9w#s\xb5\xbb\x16-\xe8\xd9\xd0;_C\x9a\x91\x13\xe7\xbb\xb7\x8a\x98\x11\x8a\xcb\xc5\x05\x13j\x94\xccj\x13\xf5j\xa6\xde\x97\xdd\x0f>\x06\x19R\xae\xde\xfb\x86\xe0J\xc9Z\xe4lU\xcd\x98:f\xfa\x85\x0c\x17\x84\xf15\xc5n#s\xcb\xe5\xc6\xe9zi6\xc7<[C\xea\xceZk\xbb\x16\xfbF\xaf2)\xdb|\xde\x9a\xfb/\xa5o\\k\x1d\xbd;\xb6\xfa\xf0\xb1\xb5\xa9\xdc8ckM\xb8\xca\xc9\xfe\xec\xb5\xad\x06\x8b1p\xd7(vj\xec\x8ce'}\xe9\xcf5{\xb5J\x05\xfb\xd9j\xa4\xa9\xa9\xba\xa7\x8f\xedeS\xac\x13\xc6\xa6\x99\x96S\xc9\xee-\xb4\xd6k\xef\x95\xe6B\xec%s\xd3\\\xbc.7:\xe68)\xa6\xce\x0cE\xe8:7\xc2M]\xad\xb9\xae\x9b\xabW?\xa5\xc8\x93\xf6C\x8c\xde{\xd9P;Y5\r\x83\xeb\xa8\xe2c\x8cc\x08\x19C\x8c!\"\"\"\"\xe2\xc6R\n\x12\x86\xe4\x80\x92t\x92z\x1e\x12@\xc08\x0c\xa3 \x8aa\x19\x88\xa1\x10\x06\x82(\x84\x10B\x08!\x84\x10B\x08!\xcc\x92\x1a\x12:k\x8b\xca\xa1\xea\x98\x01[\xe3J\xb7G\xf5\x1fd\xb4\xd0\xb6,\x99I[\x85\xb0\xa5qK\xb3\x06\xf1\x1f\r\xbdHC\xd5\xe4$\x8c\x06\xaa`\xa8\xbct\xea\xa0`pk\x9e\xf9\xd0\xc0\x1b\x9a\xf4\xff\xb5[[a \xa2a\xd4\xecU)\x0bn\x9d&)\t?T\xb6-\x0b\x1a\x8a\xa9i\x95\xd5\x12\xcd\x08\x91\x80\xa2=T\xfe\xbd\x1e\x13,\xa9M\xd1\xee\xbfF\xac\x1e\x15\x85\xa2\xf2\xef\xa2P\x06\x16\x02\x89\x86\xf2\x12/\xda\x8d\xb5'\xf9\x18\x027T^p\xb2\x8a\xf1N\x82\x08\n\xd7Zr\x06}\"6fa\x1b\x0eb"    
2025-03-05T12:51:58.613233Z TRACE reqwest::connect::verbose: d614d5d7 read: b"\x99Y\x13\xa1\x87\x1c*$\x07s\xb7\x99n\xb2T5X\xab\x95\r\xa5\\\x8f\xc4\xb5\xf9L\x07|\x96}h\xc9%~k\x86F\xd8A\x08\x1aV\xd1Z2x)\x98\x19\x98\x96\xf0\xa3\xe1\x97\xb4\x96\xdf\x92\xab'SQ\x95\xa09K\x9a\xd1.d8CV\x95\xb0\n \xa1\xc1\xa8\x06zL!\"\xe73J\x9d\x82\x9efV\xe9\x87\xc8\xe9\xb2\xd0\xd4b\x02)m\xb1\xeab\x0f\x91\xc5\xd7\xa3\xa9%\x816\x1a^S\xfe\xe4\xd0\x86|N\x04zzX\x8e\x97\xfd\x1e\xec\x8c\x10\x1c\xb4C\x0b\xb9!\xb2\xa8\x8a\x065,]\xa6\xa0\x9e\xa1jC\xde\xda\x96\x1d\xaawTj\x82[\x9fB\x85\x94\xa4/\xcf\xb5eY\x9dN\xcap\xbbJ\x03\x02\xc9Qc\x06\x05\xb3s\x1d\r\nbc\x0f=9\xbe\x13\x02R\x1aFEc\x97\x85\xef\xdaLHf\x86\x1f\"\xcb\xc9B\xd3b\x02X9'\x1e\x08`\xbd\x94\xed\xd5\x18\xf4\x05\xbd\xa4F\xc4\x1e\x82\xe7\tI \xc7(\xe2\x8d\xc3u\xa1\x9b\x01\xdc,\xf4\x81\x1d\xd9pMa\xf2\x0f\xb9\xb1\t\x92\xd5\x184\xd4\xa3\xf7\x85\xd4\xab\x88Pi\xf0\x87v\xbeS\xfbk}\xa6C\xe4:\xe8\xbe\x05N\xb9\xc0\xd5\xb4\x99\xd3R\xe7W\n\xcck\xfb\";XI\xc3\xc2\xc8\xd1\xea\x10\xb9,\"?\x13\xd3\xccRHo\x11\xc6J\xbd\xd5\x18\xba\xe5\x84\xe4-Mh\xa1x\xe9`:p\xe0\x99\x92\xc0\x19\x18&x\x8aM\xfa\x13\xd3\x98\xa9\xd7\xaf\xad\x1f\x91\x195u\xd4Y\xd3=7\x98\x1e\x10\xaaf\x1a\xe8\x8f\x9e\xd2Z\xddR(\xedb\x92\x85GM\x8b\xfbb\xfa\x94\xf066\x9d\xb70\xfd$\x87\xd4<(Hc\x1d\xc5\xe4\xfe\xcf\x1e\x8d\xb9\x99d\x9e5\xf5\x8b=\xdd\xcf\0\x93\xbez\x85\xa6|\x02\xd14\xa3@]\x05\x85\xcft\xc22P[\xa7\xb1\xe2O\x1b\x1b\xf2\x9f3%\x9f\x05\xa3\xc5\x04*\tN3\\\x92~\xd2/\xdaLC\xc1\x07\xe7\xf8\x16\xd2\x89\xf4\xc51\xd3F\xc7\x04wJI\xf3\xc2\x15\xb2\x86\xe4\xb6L\xc9e\x1e\x18Kn\xae)\xd3\xb8\x04\x88\xb5uL$\xa3\xc4\x80\xc9IC\xed\x92\x92t\xc9\xb4]\xb3#\x1d\x9c\x06\xbe\x0e\xd6\x94x\t\xd2\xa0\xa7\x89\x990\x04\x1b[.\xf4{\0\x9e\xc6\xd8\r\x99K\xb3\xfa\xa3F\x81bY\xf3H\xef\xa8f\x8b1\xbb\xf4\xf6}X\r\x03\x9b\x92\xb7\x9b\xe7\xde\rm\xc4:\xb8\x8d\x13\xc9A\x0c\xc9\xb9\xd6\xf4\xfav\xd0\xcc\xed\xee\x92\x98\x1c4V\x15\xc8\xa6\xc9X\xd3k.B?\xb5b\x0f!\xcb\x8cZ\x0e\xa2\xc5aA\xd0\xf2\x0f\x1av\xa9\xf2$\xc8 @\xf4t_B\xd3\xfd\xca\xe9\xf4\xde\x88\xe0\xd4^\x0e-[#\x07v\xdc\x01G\x1d\xec\xa8\x03\x1d;\xc81\x079\xe2`G\xc3\x01J\x11g\x191\xdc^\xc7\x02\x84\xe9\xa9\x12\xf1\xbd\xec\xa5\xaa\xa4<\xc5\xa93\xe9\xa5\xb6\x17\x98\x94)k\xc1&\xf6\xce\x14\xe8kr\x7f\x1d\xa7\xefD\xc3S\x11\x95\x07e\xf1\xc4\xf2\xfb\xa5\x90\x9c\x92k\x0cF-\x04#\x0c\xbfrJ\xa7\nF\xe5\x02$\xb28M\xf7H\xcag\xa5\xa89m\x87\x15\x9b\xb3J\xc8'R\x10wN;\xdc\xdam'2\xd0\r\x9dr\xe0\x02\x9d\x89\xc0Z:]x\xed\xc4\xcfo\xd0\x02\x19*\xf4H&\xc4\xa6N\x07\x9dn\x91?\x9e\x04`\x16\xf8\xb6Wc\x0e\xb4\x06^D\x01Q\x1bIM\xd32\x06\xbf\xc6\xce\xd0\x97\xd2\x94\xbb!qI\x89d\xc0\xd3#\x9b\xf4\r\xe8ug\xb6e\xb8\xc4\xc4SirF\x07\xe3\xc9\xd3?xgI\x0cb`~\xf2A\xe4k\xb9\xb4T\xb8\xf4\x02\xe8\x86ib\xda\xa2\xbbp7?f\x99\xdd.\x8eVX\xe7\xf3y\x9b}D\x85\x115\xab\x1a<\x1b\xeb\xb5\xec\x93\xba\x18\\y\x89\x12\x02]9Ui\xe5bP\xf1\x80a\x95t\xb5\xdc\xdc\xcbf\xea^\xa8\x0f\x88j\x06\xc0\x1c'\xe5\xf6\\\xad\r\x05\xcaU]\xe2n\x92\xd4\xad\x98e\x1a\xb4\xcb~\xc9\xea\tP,\xc8\xcf\x92\x08\xaa\xe5T\xda\x94\xaa\xdb\"!\xf7j\xe5\xa2 \xc6\x81\xaf\xaag(\xc9f:h\x1dG-\xc7\xe9;\xf5\x981\xa4\xe9\x99\x9b\x11\x03\xceh\x19\x94\xed\xf5X3A\x1f\x8be\xc6\\\xc5\x1f\x02\x0f\xaa\x86\xf7\nr?\xcd\xa7\x13\xf5\x88\\\xf4j\x08\x18$\r\xc3st(\xfa^a\xd8\x19U}&U\x13q\xe5#\xad\x9d\xd0\xd0V\xb6\xf3~Pb\x96e\x82\xa7\xae\xeb\xdb\xdd@V\xf1\x8c\x1e\r\x93oZ\x9f\xd1\x1b_\xeb*4w\x85\xbf\xff\x85\nK\xdaM=\x0c\xc9\x0f,\xc3\xa8M\x08\xa6$xB\xdb\x9e<\x81\xf3\x1c@\xb9\xd0\"I\x83\x14woPvG\x19\xf9\x0e\x8f\xb4\xc0p`%\x9e\xdc\xaf\r(HW0R\xc1\xe6\x9c\x8a\r\xf1g\t\xeb4\xfe\xd1\x06|\x88\\\xe8\xbb$\xfb\xb10*]\xb3i\x83:\xd0\"\x01s\x99D\x16\x81\xe8\x13\xa3x\xa1\"G\x02\x8b\xdb`\xc6#\x1b`\xf7\xb8\x8b\x0cp\x94\x0c \xbe\x13|I\x85\xbc\x96\xe3]P\x86\xae\x18!\xa0\xd6i\x9e\xd9\xf2\xb1\x80\xc9\xb1{f_(\x18g\x7f'\xbf\xd3\x82Cj1\x01\x84\x1b\x95\xb0Y7E\xfa\xa7@\x0e\x8c&8\xc5\xf4\x9f\x19H\x16b\x83>O\xff\x89!\xe9N\x0b\xd0&\xc2]'\xb6c'v\xca\x8a\x05eI\xd1\xecJ\xd7c\x0cJ\xee\x8c\x88bg\x10\x02\xd5?\xd48\x03'i\x83\xc3\x08$\xed\x9a\x1e\x05\xba\xa6\x84V\x803\n\x0b\x85|v\xb0LLZ0]3\x02\x050\xf0\xce\\'\xb5+\t"    
2025-03-05T12:51:58.613831Z TRACE reqwest::connect::verbose: d614d5d7 read: b"\xd454\xa0U\x9a\xa2oH\t:L\x10\x18\x02\xfa\x14Xz\\AjA\0\xc4\x89\x81@\xf0(\x16\x16hvH\x92\xb5i$\x04(\x13\x89\xe8'@IU`\xf6\xf7\x01j\x19\x02\x89\xe6\x81\x0b;\xb00\x99\x06\xda\xb80\xfa\xff\x9f\x1f@\x02'\x01\xd0b\x04RM\xe7]\x16\x02\x15\xaeE\xf7\xbb\t\xfc\xb2\x9f?d\x95-\x84|\xba5\xb2\xc0\x88\x9d\xd9\x96\xa4~$\xf8\0\xc9\x9d!\xd0\xde\x0b\xa1\x15\xcd\xf2\x88\x8f,?R\x8be!\xe5Pj\x02\xdc\x98\x91\xd1CY:U.w\xad\xae\xb2\xd0jR\xde\x18P\xe55\xb0W\xc2\xe0~K\xe2\xde\xa0\xc6\x85\tL\xc3\xde\x06s\xc2x\x19\xe3\x84s/;\x1b\x86`c;\xd1\xebt\x99\x9b\xc5Z\xce\xe8\xedm\xfd0\xc3\xfa\x1b?{\xde\x0e{\xf4\xd5'F{U\x12R\xd2\xf4\x92\xff\xc3\"U\x9fc\xe2\xf5P\x836^\xf0\xd3\x96\xfc[\xd0\rF8\xd7Re\x9b-\xa6\xd8t\xd1o>:U\xe6n\xcds\xd9\xc7\x12\x7f\x10k\xad\xa6nKC\x15,\x06v#:\xa4\x99\x87OF?\xed\x0f\xe2\xaf\xcb\x16\x1c\xc2\x88\xeb\x1a\xee9\xdd\x1f0\x10\xb1\n\x9f;\xc5J\xf8\x9em\xe1\xf6\x18\xa1\xb2\x07\xf8]\xf9-S\xb0\xeeQ`\xb6\xfc*K\x17\xd4~\x84\x8f\xa3\xe6J\x10}\xa4\xde\xe3\xc5\xdc\x8c=\x0f\xfb\x9b\xb3f-\xa1\xd5\xda\xd72\xf0e\xbc\x99\xf4\xd7\xa8\xfb-\xbf\x02\xe7\x88f\x12\xaf \xd4G\x95\\\xcd\xafC\xa1\xc7D\x89\x1f$\x9f\x088\xc5x\xc4\x93\x9e\xd8\x1d\xf1)\x0c\x8b\xe1C\x07\x890\xc92\x95\xbfT\xfc\xe3W\xb5\xf6\xaa\xb7\x04\xf4\xc2\xa2y\xe0\x8db\xa2^\x8a\x0b\x07{\xd6\xa2p\xa0\xb5dsJ>\xf2\x85\xda\t\\\xaf\x1dM\xa2\x0bC\\\x81\xb1]D6\x88\x17\xb1\xb3\xb4\x05\xc2\x1d\x06\x079s\xc8r\xcd\x9cb]\xafx\xb4\x9b\x86\xec\x1d6\x02\xec\xbcR\x88\x1f\xd8F|\xb9lW\x1a\xaaa\x8f\r\x11\x9dF\xc7^\xc9\xb1;\xcc\xd2\xed\xba\xa4\x99\xbbY^\x95\xca\x7f\x9c\xc6e\xe4\xba:\xc0\xab\xebDCe\xbe\x10]^i/G\x92\x05$\xd8&\x92'C\x93\x91\x1dJ\x80\\#\x19\xd0\xc4\x9f\xeb=\xfa?\xdd-9\x94\xcdy\xf4d(-:\xa1-h\x15\x7f\xe4\xcf\x18\x02V\xac\x1bk\x16\xc6\xb3*\x1c\x08}J\xbb\x98\xd9TI\xc7\xeb\xff.\xf1h\x1d8X\xb8\x88g\x91\x99\x0f\xab\xd2,#\xd4E\xc8\xcc\xec\xefN\xdc^\x1alK#\x9aX\r8\xaf\xd4\xc3\xdf2B\x05\x8f*\xc3&w\xfeFei;cezQ\x10\x89@J\xdf'V\xb0\xa4\xdd\xf9\x17\xb0\xdd\xcdY\xe2`\xa1\xfc\xdd\x10\xd6\x9a\xddc\x17\xbb\xb4\xca?\xfc\x19\xa0\xf2\x9c0\x91\xd8R\x1d\x9fo\x03\x11\x85\x1e\x88\xa7\xc7_\x81\xb5^\xc0\xab1\xd6\xb9\x9b\x89\xe8\xe3\xadk\x1a\x05\x1c\xaf\xa8Q\x8eFO\0Y\x9b\x12\xfb\\\x13z\x10\xc5KT\x12$\xfd.\x83\xb9.\xe4O\x84\xeb\xb9/\x05\xd5$\xbd\x0bT\xa0j\x12?\x8ek\xa2q\xdc>\xa1\xe1\xc1\xcd\xf3I\x11b\xa9g\x1b\xadBT\xd0\xf6R\xcb\x0fQ\xf4sZ\x1f\xb6\xa13\xbb\xc2F\xa9\xdd2\xc8>\xd6)G\xb5\x9f\xb1\xc1M\xc0\x0c\xe5\x19r<\nt\x8fG\xa5\x84\xbcw\xb5\xb0t\xa7f\x95K\x17\xb1=\x0ca\xb7=3BW\xb2B\x89k\xad>\x102\xee\xb0\xb3\xf6\r\x1a\0\x10\x16o\xe1\xe02\xc2G\xc1N\\2\x1b\xa1\xa3\x8f\xbf\x80:\xc4\xb1r\xe7\x10\x82G\xda\xef\x89\xc9\xbd\xfc\xb2\xda\xce\xc9\xa0\x14\x02;\x8b\x93q\xb1,\x11\x8e\xdc\x92\xf0\xc2D\xfa\x9c\x95\xf0\xfd\x10\xa3\xff\x07\xdd\x93\xbeM\x9f\xc9\x9c/v\xb4\xa1GP^\x85\x92\xe0\xda\x9eT\xcf\x9b=\x88E\x1ep\x91O\xc8o\x02\xc0\r\x86V|\\\x18\xab E/u|\xfb\x1a\x1b\x7fZ^\x9c\xb3\xbc\xc3\xbb\x04m\xb4B72\xb8\x15(\xb5/\xfd`\0\xffU\xaa\0\x9a\x9aA<4Pk\x92\xc2\x01\xb0\xd8\x99nff\x0c\x8bb\xf9\xb1\x91$P#\xf6KC\xb6e\x85\xdb\x96e\x19\x91\x05?\xce\x82X($\xae\x96d\xcb\x96\x15\xba\xb8\x86\xc4\x9d\x99\t!|\x04x\x03r\x03d\x18\xc3fef\x12\x0b\x11$$\xde$(~\x91`@b\x81A\xf1\x01X\xae\xe5{\x1f\xa4i\x96\\\x0f\x89<A:\xbb\xc15\x1cqi\xa4\xb6\xd9\xcb\xf0\x13Y]\x1a\xbeH\x9f\xbat\xac\x1c\x1e\x1el\xec\xf8\xc9\x963\x98\xfa\xb7\xc9\xb5 -\x97\xd1q$\xa6\x0b9-\xe3\xc7\x93\xacL\x86\x8fR\xc9BB\xe7&=M\x14\x0f\x92b\x7f\xce\x9b\x9e\xa3w\x85\xdc\x0e\x93q!\xe9\x15\xa3\x82\xe4\x8c\x99b\x7f!X\xca\x8f1\xc8\x8b)\x1d6$3\xcaPU9S\xf3\x9b?\xee\\n\x8d#>\xa3\xc9\xb3 \xa5\x99'\xe4c\xc5F\xf55\xa2\xaf\x11\x07*\xa9\xd6l,\x9bIIZ\xe9\x8f\"\xbd9\x87\xca\x89\x92\xe3-j\x97\xe7\xdd\xeeD\xdd\x98J1\xd3\xed#\x11\xa2Fo\xccW\xec\x1d\xde\x17\x14\x16 \x14\x10\x03P\xc8\td\xf0\x0f\x8aE\x05\xde\xb0p\x90@\x80\xc3\x021\x07\x84\x03\x7f\xe2!\xb0\0\x12\x0f\xa1\xe1\x02\x93\xf8\x07\x11\x16\x8a\x06\x0b\x1c\x18\",\x1c\x18\x18\x9e\x82\x84\x05\x05\x0f\x16\x18\x16\x0b\x89\x85\xf3\x02\xf8W\x0c \x03\xc4'\x1e\xa1\x80xX, \x14\x10\x0f\xcc\xd0\x08\x0c\xfe\x81\xa1\x1b\x18\x1a\\\x0f\xe1\xe0\xc0\xe1-\xb0\xe0 \xd1\0\x01B\x837$\x1a\x12\x11\x18x\x01A"    
2025-03-05T12:51:58.614327Z TRACE reqwest::connect::verbose: d614d5d7 read: b"\x02\x827\x0c!\x03\xc4\xe2\x1dPb\xe1\x82\x05 \x1a \x18\xbe\x99\x01\xa1\x80X\xbcCb\xe1\x82\x05\xa2\x01\"\xc2W\x80\xc0 \xf1`\xc1\xe1\xcd;p?\xd0\xc0>P\xf7@I` \xa8\xc0\x82b\xc1\x10J\x96V\xa0\xca\xaa\x12r\x10\x07g\0\x84\xe2\x15\x0f\x0b\xe7\xf3\x90`\t\x9e\xc1\x17\x16\nF4@` \x81\x06\x88\x0bX\x01\x0e\xbfx\xe8\x05\xc5b\xc1\x08\x85\t\xa8UY\x02\x04&\xc8\xa3`QF\x05\x8a\x06\x08$\\\xf0\x13\xf8 \xdb\x86\xef\xbc\x17Rc%\xc2\x8aT\xdf\x85\n1\x1f\xc7\\\x9f,eg\xccIK\x95\xfa\x1d\xc9\xd6\x07\x8d\xc6*\xb7\x1ae\xb8\t\r8P$\x1d$\x98\xc4;$.hX\x80;,x\x82\x15\x03HH\xb0\x03r\xce\xdfl<\xb6\xd3\x99\xa1\xa4\xc5\x90\x0c\x9a\xa5\xb7\xa3\xe8\xe5\xd9\xb2\x14\xb93\x86z\x89\x12+A\xf2\xe4$\xcf\xd3#\xe4\xa4\x9d\x9d\xc2\xc2AB\x04\xc5C_\xf0\x13\x04 \xa1\x02\xe7\0\xecp\xc5\x1ff<\x8e.\xcd\x92\x99!\x1d\xb5\xa6\xba\xf7\xb5+\x9av\xc5\xfb\x83\xfc)=\xe4\xc7\x95p \x129|\"}\x7f\x8a=\xa9\xacL\x88\0\x82A\x1a\x81/\xa8@\xc1\tHppx\xc5\x83D\x83\x03\t\x0b\x87w@\xc3\x03\xf6\x05\n\x1cxu\x92\xc9\x97\xa5\x9e\x06b\xd3\xabAZGBfx\xcfO'I\xbbb%\xe7p\x9a\x8d#Rl\xc9\x9cE*\xd9Ow\xed\xc7h\x1b\xdaUB\x03\x12T\x19C\x02\x1cxA\xf1\x0c\x0cL\x80\x847\x0b\x0e\xfe\x81YP4\x04v !\xd1\xb0ph\x08@)\xe5JJ_\xebP\xf9V\xaaU\xa4Q\xb64\xf8`i=\x018`@\xd5\xea]\x97c\xb2\xbcq\xa1\xef\xa2t\xac \rw$#\xb7\xfc$\xc9V\x1dy\xa0\xf8\xfe\n<\x81\x81\x0cH\xf0@\xf1\xd0\x10\xb8\0V?N\r7\xa3\x876\xb3\xe9\\!\x1de\xa5\xcdt&[\xa38\x8f[t\x82\xc9\xb4\xbaLJ\n\xe94\r\x9d6\xfc\xe7\x8c\xcc\"\xf9\x17\xc8\0+\x16\x0e\x0e\x0fL\xc1\x83\x87\x8f\xc0'\x1e4048 \x81\x87\xc0\t\x84\x02\xc2\xa0\x93\xf2V\x87M\xe9\xa8a\xda*H\xc3\x94B\xf8x\xbe\x854@0|\"\xc1\x14\xb8\x05\x0f\r\n\x02(\x1eB\xc3\xc2\xe1\xc1\x11\n\x19 \x14\xc0\x80\x07\"x\xe2\x15\x8a\x07G(\x90+\xb5\x06\x88E\xe2\xa1\x01B\x03\n\x88D\xc3\x82\xc3\x82\xbf\"\x01\x8b\xc4;\xa2\x01\xe2-\x88\xb0@`\xa0\x80\x188\xea\xdf\xf09C\x087\x97\xd8\x19\x89(YR\xb2|\xf4\x1b\xd1\0a\x16\x10\x18(d`~\x91xhp\x87\x05\x83P\xc8 \x03fpP,\x9c_\xf0\xc2!\xd1\xb0\xf0\xe0\x15\x88\x06\x88\x08\x8b\x05G( \xca\xc8RD\x03\xc4\x9b\x06\x07\x18x\xe1\xd0`\x01B\x01\xa1g\x88\x06\x08\xc57\x84\x07\x05\x04\0\x14\x0b\x07\t\x8a\x7f`\n\x9c\x05\x80h\x80x\x08<\xc1\xe2_\xb1p@`\xd0\0\xe1\xe0\xf0\nc\x18\xa1\xc0\xc0\xf0\x90h\x80p\x88\x80\x81\xa1\x81D\xc3\xc2\xc2\x82\x05\x85;\xbcA(L \x03\xc4\x1bE\xc3\xc2A\xc2\x03\x0e P\xc0\x04\x0cp\x80h\x80\xf8\x07\x06\xa6\0\x02\x03\x85\x0c\x10\x89G4@<\x03{\x03\x03B\x01A\x81/$\x1e$H\xf8\xa9K$\x1f\xa98&\xad\x97s\xc3\x1e\x82\xb5\x02\x0c\x1bw\x87\x8b\x8e\x87\x96\x8f\xc9\x90\x82d\x98\x14*rz\x8e\x92\xf7\xa2\x8f\\\xcey\x10Ad\xda2H\xab{DX\x89q|+\x1cf\xb6s\x10\xaa\xe7\xa6\x7f\x834\xcc,\xe1g\xd5i\xc5\x1c\xacU\xc4r\x14\x1am\x96\xf6\x18\xa4~^:\x83\xe5?\xb0\xac5\xf9G\xf3u\xa8\xe4.\x9d1\xa4b\xf8\xc8\x0c\x1b\xd4<u~\xf2s\xdc\x8d'6\xc6t\xcc!\x15\xa2Em\x88e\x06\xd3\xb2\x8f\xef1\xc6\xd8Q\xb73\x9d;H\xcc\x8a\x84\xbb:\x86\x7f\x1b\xdb\xb9\x1f\xccF\xfa\xcaT\x08&yr\x1dt\xd4\x81v\xfd\xdf5\xf6\xaf\x0e\x9d\xebV5\xa4=f\xc8@$\x85\\\xb2ywif&fojm$5\xda\x94\xc6\xf6\x1c2qRo\xe9\xcah\x94\xe6\xb6x\x1c:d\xc7\xa3\xc4$\x8f5\xbc\xedL\xdccI\t#\xd5\x18\x86\xdcj\xb1\r?.\xe1\xbd\x1efd\xf6\x99\xd8\x1bi\xe0\x16\xeaf\x92\xff\xc6\xde\x19\x8f\x9e#\xc6D\x86)\rE$T\x1f4J\xa2\x1a!wz\x8d9\x87\x8dC\xfc\xccd\xd6HG\xbc\xd09\xf6VG\xed\xda-F\xcf\x8f\xb8F\xd3\xd7\"\xdd1\xd2v!\xc8[\xe4K\x99\xf4a\xce0t\x03\x99\xd2\x18\xa4*eP\xff\xd1\xbe/\x80\xd6\x90\0\x02\x01J\xed\x9bC\x1d\x83\xc9\x94\xd1\xf4\xc8Hc(!\xc4R\x86\xf4\xe3p\x83;\xaeM5\r\xfd&s\x87\xf4\xe74\x1dw\x11s\xe4O\xc7 e\xd8\x19N\xcc\xdfHY^)\x0f\xff\x98\xe2\x8b\xbb\x89\xe7?NI\x7f\x9b\x88\x19Hc\xfbP\x7fU\x92\xd5\xd3\xc2L\x92\xe4h3\xca\xe2M\xd9\x8b4p\x18\xed\xf29$G\xd12\xf5{\x98\x1c\x12\x973Uy$>\xd6Dt\xef\xd2\x9f\x94\xb2[\x1f\x06K\x12A^\xb2F$+\xc3\xc9\x0c3\xc6\xec g1\xfah\x86\x18)\xb1\xa5+\x8dt\xe5\x85\xd8\xc6\x9a\xdc-\xbb#l\x9b\xc3F!\xa4\xf9K\xcb\x04\xc9\xcd7\r\xc7#Y\xfcT\xf3\x9f\xfdVq\x8bn\xb0R\x9aCB+\x83t\x902\xadJ%\x9a\x9e\x07\x97L\xb6R\x96A2LB\xda\xa6Y\xa4\xbb}\xb1\x0c\xd3["    

thread 'main' panicked at src/main.rs:46:38:
called `Result::unwrap()` on an `Err` value: reqwest::Error { kind: Decode, source: "there are extra bytes after body has been decompressed" }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
2025-03-05T12:51:58.614930Z TRACE reqwest::connect::verbose: d614d5d7 read: b"\x88\xbd\x96\x96\x0b\x121\xa4\xa9\x0e\xbf)[\x10\xf1-\x93\xed\x0fS\x1d\\\xeav\xa4:/BS\x8c\x18\xe4\x1c\xefJ\x8cg1\x8dW\xa4\x1c\xd8\xe4\xc6d\x96\x17&[\x96\x8f\x96C\x0c\xf1\xf5R\x19\x8b\xb4\xcbOy\xa4\x10s\xcc\t\xa9<[\xe6\xf4\t\x8bQRcH\x87\xc4\xa9\x06\x96k\x12\xdfRn>\rK\x91\r\xa3\xf4e\x91\xae4!\xe6\xc2qV\tPv\0\x84\x94;E\x90\x8d:\x9d#K\xf7\x8f\x94\x96H\xe5\x9b\xa7\x1c/\xc7\xa3l\xda\x12\"\xa4\x98\x92\x0b\xa9\x8a!4\xea\xb09&\xcd\x94\x82\xa6\x1b\x0fq\xd2>Lv\x0cR\xe1\x1aD\xd8\xa4)\xe7\x94}\xfa(\xdd\x1d\x94\x99J\xbc\x07\xe9\xf9\x06)\x92\xa3\xa4\xd7\xb4rq\xcd\xbe\x10\xb2B\x96\xda\tRu5\x11\xc3\xe6Gb\x11\xa2\xf9\xb9\xaf\xee\xa4\xddhk,\xf9&\x92y>\x94\x9b\xa8\xe4\xb0\xd9>m\xbf\x9e\xe4\x830\x8d\xa1H\xcbNH\x99\\\xe9\x9b,\xab\xc5\x0c\xbe%c\xae\xe9\x93 \xe5\xd6 St\x98V\xf2\xf8b\xf6,N\xe5g\xe9\xe4!Y\xe5\xa0d-L\xa3ee\x0f\x12\x0b\x8a\x84\xe2-@@\"\xf1\x0b\rP\xd5\x1c\xb9g\x06\x95cS\xff!i\xc9\xa2gt\xf7U\xd5\xdc\xe2l\x8a\x12\xfe1\x8e\xee|Sw\"-\xd1\xa2\xe3\x1c^\x8aS\xb3\x8c\xb7E\xdf$\x85\x86n\x93\x97d\"\xe6\xb0\xfe\xd7);z\xdc\xe6a\xa71\xc8R\x8dB\xc2-\x87\xcc\x92\xbc\x9e\x1b\xda^\xbc\x99\xdd\x14db\xdb\xa5q\x0e\xd2\xfa1\xf1\xdb\xe1y\xaf\xbds\xf8\xf0\xd0\x9eJ\xb9\xa5b\x85T\x90\x10\xda\xa2|\xd6\xcf\xd9\xb83\x9a\xdd[\xf8\xcc1D\x8a,iy\xa5\xa2E\n\x0f\x92[\xbec\x8f\xfc\xcc\xfe\x94\xe5\x99\xd8\x08\x92\x93^*\xc4\x9ci\xb9!e\xee\xfd\xbc\xb7\x13\x17o2b\x90\x9e\xdd\x90\xf3\"__)\xeeV\xa5f\x0c\xfa\xcf=\xa5\x97P\x87I\xecL3c\xef\xaa\xa8\xc3\x8c\xfe\xfd|KmGya67I\x8f\xb6\x84f \x95bIG\xb9\xd2\xed\xea\xd8\xc83\x8aW\x93\xaa\xb4\x12\x8fC*\xa9O\xe30\x1e\x9f%\x05\x87\xeb\xa972\xa6\x9b\x0cQ\xa4%\xc4I\xcf\xaf\xa9\xc5\xe72\xea\xd8\x8fCo\xcf\xe4\xa5\x90\xea\xf5\xc9\x86\x1d\xd5\x1d\x07\xb0\xf1\x80\n\x18@\xc79\xae\xea\x9e\xea\xc4oMe\x1c\xe9\xfc2\x114F\x89\xfa0\xa8n\x06\xb9\xf1IgJ\xe9\xee\x91\xce\xa9\"-7\xfc\xf7x\xa2\x8f=\xf6D\x8b4S\xe9\xd8#\x1d\xa2G\xa3\xb7u\x9b\xf1\t\xf7aW5r\xbb\xa6S\x85\x94f$\x8d\xc3\xa4\xf8\x99\xe4R\xd3K\xae\xb0R\x9e1\x994\xa4\xf7r\xa8M/\xcb\xd5\xf4[\x0f}\xbe?\xca\xbb&\xc6E\xea\x1e\x84\x88\xe97\xe8f\xd9\xce\x18\xef{H\\\xce\x92\xb1#}\x13\xa3\xd2\xa3\x89\xa7\xf9\xad%\xabXN\x19\x1d4J\x99\x87\xd0\xdb\x9d\x92\x86]F\xb95w\x8e!tF.Y\x15$\xc6C*\x9a\xe7\xeaH\xac\xac\x9eCC\x8e\re\xf2\x82M\xe6$\x92.Q\xc2\xa2K\xda\xf4\x98\xf3\xf5\xb9\x8dF\x83O)\x8fA\xe2N\xa3&\xd5g\\tW\xadT\xf7\xff\x93\x995%\x12\xa4*\x9d\x94x\xdf\x86\x03Mq3R\x0f\xf9C\xeb\xbeT\xc6\xd8A$\xad\xb8\xb7\x0f\xafsL\xb7\x99\x90\x8fe\xfaB\xa4.\x96\xb4\xd7Y\xcc\xd7\xbfz\xb3I\x1abd\xb8\x96\xf4\x1c\xd29\"\x99\xc3e\xed\\!\xc4+\xbb\xcc\xbf\x10)\xddT\xbfH\xfbh\xd4\xf9i\x87\xd8\xc94\xa7\xcd\x1c\xa3H\xa5\xa5TZ\x91\x8c\xacSY\x82\x071\rPv#\x02\x06\x08z\x942f\xb1M\xa5=\xde\xb4\xcfH|\n\x92\xc9\xc3c\x05\xf7V\xcb\xb0\x98!s\x0c\x13g!\r}\xa6bI\xdc\xab\xab\xe4\x8d\xe3jM|\xc6\xd2\xc1\x83\x84h\x0e\x11\xe7\xac;\xee\xe7{\x94\x94\xa6\xd6Ur3$\xbbs4\x8a\xebf9\x9b\xde;&\x8fQ:i:zH\x98Fh\xa0\x0ec>\x0b.)>M\xf0\x0c\xdaB\x9a\xec\x16\xa9\\\x1d\xed\xf9\xb1\xc9G\xc6i%\xd7\xe5\xca\x92\xd1m2l\x90\x9e\x1c\xa3r\xd7K\xf8\\O!\x95\xa7\x97~\xe0\xd28\x04\t1\x95\xd6\xfc\x985\xbc3\xf9\xbe\xc3\xe8\xb1g\"\xe5\x9a\xae\x17\xc9\x0fQ\"\xfc\xb8VvK\xcc\x95\"\x12=\xebBe0S!\x8e\x94?\x8e~,I7\x87~\x83\r\x1b_%\x9d\xca%\xa2\x8dd\xc8\x86\x94\xb0\xb7\xdd8\xa7J\x86\x8f2\xf3\xe4f\x96\x8e\x11\xa4\xe2L\xd25x\xd6#\r\x0e,\xbd\xb6m(\xb5\x95\xbe\x1e)\x8f\x19\x15\xf3W\xbd8\x06\xb6)\xd7h\xcc!>\xccd\xa4\x90,\xaf\xc8\xfa\xc9\x8d\x1d\xff\xe6h\xe9\x87X!6\xb5\xd4hHX\xac\x89\xb8\x97\xd3\x05\x0b=k\x1cL?\xc2B$&K\xa8\xdak\x99\xf7\x16{\x18\x1eu\x904\xc5d\xc1,L:M\x9a\x8ei$\xfbr\x88\xff\xfe\xbd\xc6\xd6\x9d\x8fT?c\x8f\xa1\xcf\xb2t\xe3\x91xMS\xd9\x91\xa7\x0c\xe11\xda\x10\xdd\xe8\"\xf9\x9d\xd2V(\x9fI\xf1\"g\x0f\xeb\xe1\x9bWZ\xb6\xa5b\x1a\xa9\x18\x1b\xb5\xe9\x0e\xaf\x1f[\xae\ns}=\x91V\xa6\xedB:S\x86\n\x8e\"\xfanlE\xdd,\xb2*}\x16%\xe3\x06\xa9\xe01*\x8b\xc3\x8d$\xc1rX\x9e\xb4i\x1a\x9eM\xed\x8f\xa4U\x9a\xae\x0e\xb9\xda\xcd\x8d{)\xcdY\x1a\xdaHhF\x93A6b\xb2\xa4\xb1\xf3\xbc}jt$\xffo\xfa]\x1bY\xbb\x86\x87\x9d"    

@yanns
Copy link

yanns commented Mar 5, 2025

Can someone check if those new tests make sense? #2581

@yanns
Copy link

yanns commented Mar 5, 2025

I could reproduce the issue here: #2582

@Andrey36652
Copy link
Contributor Author

In the meantime, I can provide the logs from reqwest:

@yanns your HTTP reponse contains data in 2 ZSTD frames. That's the reason why it crashes. In my PR I implied that the whole message is encoded contiguously (you can refer to conversations in this PR), that's the case with GZIP (usually? I don't know enough to state this 100%). So my code treats end of frame (from GZIP, ZSTD, etc) as the end of compressed body. And any additional bytes after "the end" are unexpected.

Python script to decompress data from your logs in streaming fashion. If you run it as it is, it will crash after decompressing first frame, because by default it's assumed that there is only one frame. But if you tweak the line like this decompressor = dctx.decompressobj(read_across_frames=True) then it will run successfully.

import zstandard as zstd

chunks = [
    b"(\xb5/\xfd`\0\xff=\xda\0Z\xa7\xe5D>`I\x93t0\x0ck\x1a\x12\xc0\xfa\x1ac\xc80\xfe\xf3Q#\x8b\xc8\xde=\xda\xde\xb4vlBd\x92\x89\x7f-b#\"T\xf5\xe7\xedg\x18z\xf4\xfd\niKRJ\x99\xa4$\xe6\x9b\xc2m:\x0ck\x05\xe6\x04_\x04\xed\x03.\x9b2b\x8b\xd9u\xeb\x14\xb7\xf1\xb6'\xf4\xb4\xa9\x1c\xd4|mQ\xae\xff\xa5\xad B\xab\xcd\xd9?\xf4N=\xe6\xb2\xfb7;AM\x87keL\xcb\xe8\x976R\r\xc1\xe6\xd47fT\xd4\xb9+j\xba\x159\x17'\xf5\xe8\x0e\x0f\x0f\xa8U\xf6\xcf\xb5\x88:f\xa7\xc5\xc9lin7KM\x91W\xb1k\xd5H\xab^I)\xd6\x1a\\\xa9\x19\x8c0[s\x9d\x90]\xf3\x1bj\xaa\x96\x16\\\xf1%2\xc0w\x12\xa8\xfc\xb2\xf0\xc2!\x1aL\xf3\xa0y\x06\xf38\rG\x12\x19\x90\x02<\xe0\0i\x10\xe1\t\xa6\xdaK\x0b\x9e\xe5=q\x12\xff\x86\xc2\xb3\xbc#Mck\xbb\xa2#\xe52*\x7f\xd9\xcc5YB\x9a\xce\x91\xfa\xef\x87\xa4\x85\x93\x86\r\xa0(\x0bo\xf8\x1d$Qa\xc1,\xcc\xe0\x86\x0b7\0\x17n\xc0i\x98\xc7y_\x18ITX@\x03\xb2|\xd3\0*\xc9\xc2\x91D\x85t\xd2Qp\xe7\xf2\x0c\xe6\x82\xa2\xa18\xac(\x0c\xe1\x1c|\xbc\xd30\x0c\x14\xdcG\xf3Pi0\x8b'q$Q!\x03\xf2pI\x9aWP`\x82f\0\x87\xc3\xf0h8\x0eC,\x0b\x8e\x87KC\xb14\x9a\x87\x0b\x05&h\x1e\x02F\xc30p|\x02\x13EQ\x81\t\x18\xcd\x1f\xff$\xef4\x0f\x1b\xc6\0G\xf3\xf0\x88\r>^B\x8cI\xa3x\x057\x0e\x1c\x9f\xc0#\xb1<\xe3\x93\xa6\xf9Gi,\xfc\x81\xb1\xf8\xa5\xf9\x1bn\x08\x8e\xe6\x1d\x0e\x05\x8a\x04.\xdf<\x07\\\x1a)\xe1\x9fO&\xe4\xf2\x14\x8e\xe5\x95\xe4\xe9\x86\x930\x04p,\xc9\xf1Xh\x92\x0bG\xf3\xf0#\x1c\xbf4\xdfJ\xe2\x1c\x0e;\x1c\n<Y48\x96",
    b"_^\xb14.H\xf0\x8a\xa5q,\xbfp\x87q\x8e\xc6\x02\x13\xc4cyx<\xcdC4\x15\x98\xc0B\xf3\x10\x1c\xbfp\x87\x1d8  \x81\xc4!\x91!\x81(x\x92\xf84\x98#\xa2y\x08\xfe\x88\xcc\xb1\xf0\x87\x19\x87\xc2\x0f\x13'i\x18\x82\x83\xd10\xf1x\x96o>\xc6\x04\x1e\x8f\xf3\nE\xc39\x9e\x85i\xe2\xc2\x1c\xce\xf3\x8b\x82\x19\x8a%i\x1e\xe7q\x1a\x0c\x80\xfcJ3\x04\x0c\xe3\x9bc\xc1\xa1\xc0\x81\x8d\xc7\xb1\xe0Ls\xc0\x84\xc1M\x04\xc4\xe1\x89\xa2\xf0\xf3\x8cCQ\x98\xe1,\x9e\xe4\xc2\x924\x83\xf1cI\x8e\x85\xbbi\x1cp\xe1Ca\x18?\x9c\x86\x1f\x02\x82\x8f'a$G\xf3\x8b\x87_9\x9a\x87@I\x9c\xe3\x17\x0e\x1c\n\x1c\xe7\x1b\x0f\x8e\xc8\x1c\x9e,\xfc\x88p\xf8\x0f\x85=\x81\x88x\x8e_<\x87\xf3\td\x9a\xf1G\x04\x1cp\x81\x85\x95\x08\x07\x088\xe0\x02\xc7/\x1c\xc0\xb0\0\x076\xcc\x85\x88\x17\0?\xcfx\xe5I\x1c\xe0\xe7\x19\x08\x86\x06\xe4Y\xbei\x1a\xee\xd0\xfc\xe30\x03Id\xc8P!C\x85\x83\xc2\x82\x07\x85\x97\xe6\x9f\x08\x1c@\xf0\x85\x9f\xe0<\xfe\x8f\x05\x0b\x0c\x13\x81\x82\x05\x86Q\x9cy\x1e\x96\x018\xc9+\x0c\xd3\t?<8\xfc\x10\x10\x8dF\xa1|\xa2\x80\x07py\x85\x92<\x0f\x0f\xafD<\x8e\x83\xa3$\xfc<t8\x1aFa\x1a4\x96\x85'/\xc1w7\xfc\r\x03\xddpd\x14\xe5\xc1\x83\xf3\x13\x98\xa0\x02\x134\x8a\x97 q\x9a\x7f\x94\x84\x01\t\x92\x87\x85a0\x18W,\x89\xa2\xbc\xe30M\x03\x0b\x0c\x13\xe1\x17\x0e\xfc\xf3\n\x04\x83\xf1w\x8e%9\x1e\xb2\x84\x08\x85\x1f\x08\x0b\x84\x87\xccpP\x94\x05\r\xc3\xc03\xf8aQ$\xceCFc\xf9w\x98\x81\x938\xcc\xe0\x1d\xeeCB\xa3\x01\xc9\xf2\0\x84\x10A\xd2<\xccP\xdeB\xf24\x0b\x16N\x94\x84\x91D\xc0\x12\x0e\x07\x08\x0b\"p\x80\xb0\xe0h\x9e\xc1h,\xcd\x7f\x03\r\xc7\xc6\xc2\x12\x9aoFc\xc2+\x9e<\r?\x11\xfc\x93\xc8P!\x03\xc2h<\x0c\x15\xe5\x1f\xa7q\xf0\xf0I\x12\x19\x90\x06Gd\x8e\x7f\xd8\x01i@\xbe\xa10\x04H\x02Y\x1ei@\x14\x85\x9d\x89\xa0(\x0b\x94oV\x90\x04\xf2\x0b3\x01i@\x9e%\xe1\xe6q\x16\xa6\xc1\xc3\x0e\x0b\x93<\xfc\x8dg@\x9e\x91<\xff0|\x16&y\x92%\x89\xef\xf0O\xa3\x93\xe6y\x18I \xdf4\x1eo4\xcf\xc3\xf1\xfc\xc3\xc1\x0f;\x1c\x14\x8ew\x92fi< \tdI\x98\x81\xa1\x01y\x88\x08\x07\x12\x19*D\x98\xa0\x92r\xe0\xb0\xfb\xf0@J\x89\x0c\x88\x03\x0b\x90\x06$\xa2y\x96\x06\xe3HB)@\r\xc8\xb34\x18\x06#\tD\x81\xe2Kr\0\0\xa9\x7f\xb8A\x12\x88\x8a\x8ay\x82.\xa9\x87\xb9\xda;76M\xa7\xcc\xe5\xd3\xb5\xa8_\x8ax\x0b\x0b\x93<\x10I\xe3\xceC$\x81\xc0\x86\xe1\xc2\x8f\x834 \xcf\xe0\x05\xc1\xd0\x80D4\x8c\xe2\x1fn\x10\x01?\x90\x91\xf0\x9e4\x10HBQ\x1aK\x03\xf2\x0f?\x0e\x92\xa8\x80<\xd0\xa7\x90r\x80\x16 \x0bh@\x9c\x86\x05\x07I K\xb5\xc5\xd8\xf9[\xfd\x19\x95\xdbL\x885\xbb\xa9\x96\x1c\x91s\x90\x19\xd2\x80\xc0\x04\xc1\xb0\x80\x06\xc4y\x94\x86\xf3\r\x82\xa1\x01q\x1eo@\xa6\x81@04 \xfc0D0\x041&C\x86\\\x84O\x99\xa6n\xed\xeb.%?z\x19#k&\xe7\x9b\xd0u\xd5\x913g\xfd\x9c[\x14\xdf\xcb\xb5m\xb3\x1b\xd2\\\xcf]\xc2\x15\xd3{\xea\xda\xf4{\xa1?\xd7\x89\xe0o\xaa\xb74\xe1r.Soz\x0f-\xf76\xb9\x8e\x9fXS\xcdb\xfe\xea\x97\x1dU3\xb5\xf2\\\xebj]\xaf\x02(0\xf8E\xf3\x0bO\x1c%y\x1e\x8eO\x1e\x8e\xe5\x9d\xe4/|\x1f\xdfH8\x14(\x98\xc1\xe1\xe0x,p\x03q<\xc0\x01\x178\x96\x7f\x92\xb7\xb0<\xfcd\xe1\xcf?\x9f\xf4\xb1\xc0\x85\x1b8\x92\xbf \x01#\xc1x\x12F\xf2\x8a\x85\xe3\x13\x87C\xc1\xf3$\x078\x9a\x87\xcf\x80\xe3I\x18\x8cs<\n\x05&X$\x0cF\xe3\xc1\xe14\xb8!\xc1\xf1,\xfeq\xbe\x17\xe6\x13\x07\xc7\xf9e\xe1$J\xc4\xe3\x1c\x0f\x01\xd3@\x1c\r&\xe2\x888\xc0\xa1@\xc1\x9d\x11\x0c#\x9a\x87\xe0qn \x0e>\xf2p\x98C\xb1$\x11M\xc3\xee4\x1f#s8\xaf\xc0\x85\x17\x07\x04\xf3\x1c\xaft\x83\x81\x10\xdc<N\xe2\x95\xe6\x85\xf3\xf3P\xc1\xfd,\xef\x0el\xf8\xfb\x95\xe7I\x94\xe3\x17\tFCqx\xf2\xfc\xe2Y\"\x9c\x03\0\x08\xa5#2\xc7\xd3`\x8e\x87\xcc8\x9c\xe4H\x96\xa4\xe1d\xd1\xe0H\x96\x85\x93\x07GD\x1f\x12\x1exp0\x98&\x1e\n\xeeC\x01\x14\x18\xb46\xd4\x11\xb1\x18\xdd\xcb\x87js\xa1\xd6\\\xc8\x9e\xa8\xb1\x94\xd4\xf97\x9a\x87\xa5\x05\xcb3\xd8\x01\x89x\x1a\x06\"\x03\xd2|+\t\\\x1eI \xcc\xb3\xbc\xe2I\x10\x0c\xc7/\xcc\xf1\x0b\x834 \x12$\x0f\xbf0\xcc\xc2,\x19\x10\xa4\x01q\x9co(\x10J\xeb!\x11 \x11 <\x1c\xc8!\xb6\xc7&\t\x0f\x07h\xe0\x02\x17\xc0\xa9\xf0\x12B\xe9H\xc0\x84\xa6\x16\x8f[\x16\x1a&\x01\xc7\x85\x9f\xe0\x8bmCV\xf1\xdd\xe5K\xfc\x92\xf1s\xe9X\xf2\x15\xa1j\xa6QW\xff)\xc8\x998\xa6T\xb6\xedu\xec\x85\x92\xee\xb1\xa0\x01b\xed\xe1\x80\xcb;\xcb\x05\xc6\x01w\x12_\xb8a\xe0X\xf8\x81E\xe5\x9f\xd2zmO\x05\xd7\xcb\xe7\x92&T\xb8\xf9)>u\xf7\x9d\xa0\xb3"    ,
    b"U\xd5\xb1[\xae\xf8\x9b\x8f\x9f&\xef\xfa|\x8e\x10o\xaf\x96T\xe2y8\"\x9aF_\xf8\t\x0c\x0e\x0b\xce\x0cv\xf9\xd3_)\xf1R\xa9\x1a\xdcL)i\xc6\x97:\x91z\xdf\xa4\\\xda\xd6X\xab\xa8\x98i:\x95:\x95&\xcd\x87\x90\xe7'\x15\xd1\xe2\xc4PC\xed\x88\0a\xe5\x8b\xe0\x0b\x16\x1a\xa6p8\xce7\x8a\x85ip<\xce\x1f\x80Q\xb0'\x8b\x06\xff\x9c\xb5\xc6\xaa9\xf4\xb9T;\xffA\xcdue\x99 \xaf\xf2\xd8\xccP\xa3g\xaa\xddv2\xf7\x97\x91\xa1&{\xe8\xd3\x11k}\xd1\x93&\x85\x8e\x05\x12\x10J\n\x05'i^Q\xf8\xc1\xf10yx\x05L\x9afp\x83ca\x1e\x87q\x0e\xf9c\xe8\xfdC1\xdd\xf7K\xb4Os\xa1\xb4\xb98\xaa\xeb\xa7\x94\xfbE\xcc\xcf1\x96\xafu\xd3\x1fi>\xbfOu\xe7\xda\xb1\xc4\x16!\xc5\x14\xcd\xf7[\xf0\xa5\x02\x13HP4\x8dfp\x03+\xa2\xe5\t\xbe\x98\xdbZgTH3>~\xb9\xad9\xb3E\x8e=\x95\xb6\xdf\xa7\xc8\xfa)\xdd}\x13\xaa\xa6\xd9\x10\xc6\xd4\xa8\xaf\xda}k\x88\xfd\x04&\xe0\xe6q\x9c\x06/\x14\x8dW\x80\x82Q\x98\x06P\x9d\xb9O(rz\x19\x1f\xe4\\\xe44\x17t.\xf5U\xf9:\xb6\x8c-f\xd4\xd6\xf2[\xaea\xbe\x079\xa3\xae\x86\x92\xa5\x96bcl5\xf4\x9eJ\n\x9a\xe7\xe1h\xbe\xc1\x0bg\x87\x85'KC\x82vs\xfb\x1c\\\xac6!T\x9d\xdf\x98f[\xb4\x12\xba\xb7\xd2Cm1\xd5m\xf0\x1b.m)\xb1\xe4v\x9b\xdb\x9a\xa62b\xb9j\xb5_z\xa8)\x96\xa4Y\x9a\x87\x18\0/\xcb'\x06h\xea\xbd\xd7V[\x05W\"\xd7\xce~\xa5\xf9\\C\xf9\xac\xee\xbe\xcb\xa5\xb5\x1b\xd7\xfdK\xaf3){\xe94j\xa2\xef\x98(1E\x8fS\x86\x0c\xac8M\x12\x91\x84\xe2\x1b\xa4\x01\x89x\x12G\x12\x88K\t%\x85\x1f\x87\x81@\x12HRH\x03\x02\x97$B\xf3\xcf\xf2\xc0\x84\xe7\xbfy\x1c\xe7\x1b\x08Yi\x9e\xc1\xf1\r\xf3<\x1c\x0e\x1e \x14`\xc2\x03\x0f\t\xfd2ZV\xef+_\x83\x9b\xfe\x94&{\xa6\xa9\x92Z\x8c\x96cp\xba\x18?\xe8Mw\xb9\x05?Y\xe2\xcd\xa8^\x13\xaaM\t\x17\xb2\xe5`[\xdf\x0e:\x96\x9a\x1d\xcc\xde\xd8\t\xdf\xd3\xdc\xd6\x01\xc9\xe0\xd2|\x85\x9e\xa7\x18\x9b\x99\xc3\xf7\x0f\xbbc.|N\xdd\xa5\x99\x9az\xf6r\xaf\x17b\t\xee3\x84\xbaiC\xb9\xd8o*}Mg\xa9%D\xcb\xd8j+9^\x8dv5\xd4\xe0n\xb6\xd6/\x13[\x9ai\xdd&z\xaau\xdd\xbd\x97\x96\xd2O\xe83zk.\xc8Rjr\xbd\x1c*\xb4\xdd\xee\xed.g\xed\xa5R\x91\x93y\xd4D1j\xc2u\xcc=\xf6\xc9\x9djh\x9f\xba\xcc\xb4Hs)\x83\xaf)^\x0eq\\\xd5\x96\xb7\xf4^\x9b\xee\xbd\xe6\xfa\x85r\xc1\x15\xe3[nU/\xd4\x90W\xdb\xceN\xcf\xf9\xde\xd2D\xbe\x9f-\xad\xe8>1\xfb\xb7\xd5\x9c\x99'Oo\xdb\xb9~5\x95r\x95\xedY?|\x87\xa2>l\x85\xafT\xe5\xb7\xc8\xe9Zkv3L\xd5U\xec\xfa\xb1\x14\xffmS\xeen\xf35s6\xa6\x9ap\xa9NW\x102\xc6\xfa\xa5\xb6\xbd\x9c\xdcK\xdd\xc4\xb9\xfa5U1\x96\x08-\x84\x902\x06\xaa\x82\xa3(\xbfH\x1c\xcfB\x91(\x19\x1aJ'\x90\x06+\x8d\xa1\x01QZ\xd5\x03\x02\x10\x10A\x04\xcf?\xe4\x92\\p\xe0ygI.<\x12\\C\x08\x1dm\xb1\x07\x15\x80\x8f\xab%U\xab^\xf3%\xedTkivL(\xb9\xa3J\xdb\x9b~\x9d\xa5\xd5\xc72\xa6\xb8\x99Z\xd2dM\xb5T\x87\x90w\xec\x87\xd6j\xd5`S\x94\xc8\xdb\xa6\x8aQ\xb3-\xe4\xa9\xab\x15D\xee\x93\xbf]\xd5\xaa\x90\xbfln\x9d\xdfL3\xfen\xaa\xc4\xcb\x95s\xe5\x92b\xb1}B\xafs{u2\xc64\x1b1\x95\xc8\xa9\xc7\x92S\xda\xd2\xa2\xf4\xd4\xc7\xe5\xd4\xa5\"\xdf\\\xcf+\xa3\x8a\xbe*E\xc7Rj\xea\xfa\x9e7c.\xe1B\x9d\x1d\x9bfw\xfb\x8co\xed\xaa\xb5\xcb\x12D\xcbWl\t>\xedl,\xbe|\x11j\xee\x8a/\xd7?\xd6e\xa5\x1aC*1\xe7Z\xf2GH\xa5d\xfe\xcd\x84\x92\xe6\x83.\xe6;U\x86\x10c\x0f6\xb5\xfd\xcd^\xbf\x95\xe8\xe3Ke\xd6d\xd5\x97*\xbeK\xc8\x1f\xa7\xa7\xfe\x9e\xa3J\x9d\xd1\xbbs\xbb5\x9d\x1f\xa7B\xee\xc1\xc7\xc9\x9b?U.\xa6\xd5\x95\x9f\x96\x93u\xd4\x8c\xcc=YR\xfc\x94G\xe6\x92\xfa\xfb\x87\xae\xbdN(\x1f\xa9\xceUK\x93\x9bs\xb9`Z\x0b\x15\xfb\xd4\xad\x1d\\\x0c\xdbg\xaf\xea\\\x8f5#l\xdb k\xd5U\xf6f\xac\xc1\x97\x89\xd3\xcbgN\x93YWF}\xd1\xdb\x8b\xaaKU\x13k\x8c!]M%r\xb7\xc9\xbb4\x17?\xce\xb8\x1c7ROjE\x8d\xd1\xad\xfb*\x97\xed\xd4fR\xab\xb9\xcaW6\xe7\xf8\xbf\x12\xf2\x15v\x18\x9c(\x8a\xa4{\x01L^\xb1\xf0\x0c\x18\x90\x8a%Y<\x8c\xe2\x0b\x7f\0\x08@a\0\x13$D\x10@\0 4\xf0\x80\x01\x07\x0e\r\x18$\x90\x05\x0b\xd6\x81\x84g\xb5\xf6\xbd\xc50;\xf2&CJy\xaeco\xbd\x85\xceG|\x04\xa3\xf1\x80\xa1\0\n\x0c\x18rZ\0\x07\x06\x88\0\xe1\xe1\x90\x10\xe1\xd8\xe5\xd2\x03\x83\xf5W\xef\x1b\xb6J\x04QgT\xec%|\n!F\x0c\xc5\xf6\x9d\xda+\xf4\\\xad\x9c\xcb\x95\xe6\x8a\xc8\x13\xa5\x84`SN1\xb5\xdaz\x1cUSz\\\x9b\x0f!M\x87\xde\xc9\x1c\xdf"    ,
    b"\x913\xe5\xd4\xdc\x951\xd4\xf9\x10\xdc\xdc\x864\xb9\xf7\xa5{b\xa7o\xdd7\xa7\xceU\xe3]\x19\x1d\xbe\xd4\xf44\xdd\x83\x9d\x9aX=}t\xeb\x1c\xe3\xa5\xfbJE\xe5R\xa5\xd8\xc9ki\xee\xf7&\xbbz\xf1\xad\xa5\xa8\xbd_\xdb\xfbq\xa5[\xf7r)\xa8\xd9\x1cu2\xd3G\xec\x8a\x98\xe3E\xec\xc1\xd4XU\xe5r\xee\xf4\xe5\x9a\xcc\x0ce\xafe\xad\xed\x90SH\x9f{\xaf\xc8\xd6R\x9c\x10\xa9M\xa6\xab\xd9\x8eu.\x8b\x1c\x957u\xebEw\xfa\xa0j\x8cU\xd3A\xf42\xad\xa4\xd9\x12r\xa9\x0b\x99U!\xec\x8d\xcc\x15jiu\xaa\x87\x9b,\xbafD\xea\xb3Ao_\xb8\x9e\xb6E\x8dy\xa9\\\xab\x9b\xeaM\xd3\xed~*\x8f\xac\xce\x92\x83\xaa5U\x1a\xa3\xcb\x85\xfd\xf2\xad\xd7\x8c0\xbb\x1c7\xa2}\x1bS1\xe3t]Mw\xc8\xd7/m\xac%\x87vmLl\x95\xad\\qq.+\xcd\x94P\xca\xe4\x8ei\x8ai%\xb4\x8e\xd0rN1\x99~'DK\xf3_\x84\xb9\x0e\xb7y3\x97\x10'\x85\xe0\xe2l\xe68\x99\xba\xa6\"\x16\x93\xb9k\xea \\\r\xe9B\x90\x9b\xbb\x97Pu\x13\xeej\xben0\x15{\xba`j\xb5|_{\xf5\xe0\xa6t\xc97\xd3j\x9a\xee\xb9%\xa3\xb8\xfccC\xcfW\xfc\xa4\x94\xa9\x97Q-\xce\x16\x95fc\xde\xf2\x1f\xa1\xd5\xfa\x1dT\x8f \x83o)\x95\xbb\xdeK\x18U\xd3\x91S\xa9\xdd\xcf]\xff;/r\xdd\xfa\x9c\x89Y\xd3\x13\xeaT\x91\xdf\xfa\xf4\xd6;\xb9\xd5\xec\xcdY>\xff\xce\xd4\xa0f\xf4_\xc9\x96\xdbU\x0c:`\xce!\xa2\x08\x1f#\xa4\xba}\xaa\xf58\xd9z\x9a\x1b\xdd\xb3\xf5\xf5k\xb5\xd4R\xe58\xae~K\xf5\xdafz\xaa\xc9+\xa6l\xc8\xfc\xb9!b\xefOE\xc6>y\xbb\xf3\xad\x87\xc9\xb4\xb5{\xfe\x1c'\xc7\x9e\xda\xb9tI;\xd9\xa9\xceV\xe4\x92v\xa3\xee\xc4\xc8\xd5?S\xda\x97p\x9b\xa6\xfec\xe9\x9e\xb1\xbf\xb7\x9eod\x8a\xdcr{\x97\xbb^\xe7\xfb\xd3d\x91;\xbf\xf1\xbf\xaa\xf7ZBL\x17\xf6sL\xd9\xff:\x95'M\xc8\xba\xb3\x9f\x9d\xb9\xd8\xeb%\x065E\x04\xd9\xbd\xd8\x1cc\x9a\xeb\xc1\x95\x1f\xd1k\xb8\x1e\xadnM\xa3/M\t\xe6Co\xf3!\xd5Lh\xa9l\xcd\xbd\xd8\r\xb2\xe7\x96y\xb9}\xf4\xe9e\xf4\xed|}\x9a\xeeqeS\x10\xba\xfe\xc6\x18b}\xef\x90{\x9a\xfa\xa9s\xc5\xa7\x89\x12b\xf5\x96{H\x19\xaa_\x10\xa5F}\xf9Z\xd2Dm\xa1D\xdf\xf6=\xc2\xa5\xde\xfakQ\xdb\x82\x8c4]UL\xa4\\BmE\x98:2\xb6N\xddK\xd4p3>\xd4\xf4\x049\xa3\xb7nj=}ki\xb12[)QD/\x1dL\x9akm\xccw\xa6\xdc\xa3\xa6qQ|\xbe\xd4\xaatI_\xc6\x944\xd7{O\xe4m\xbd\xc8b\xc3\xf8Xb\x996\xbe\xe4o\xcd\x96`\xcc\x7f\x10:\xb3\xe5\xa0\xad\x01\\\x8b\xe1j\xfa\x06c*\x8a\x9d\xceAM\xa7.\xa6\xae\xf5\xd6szI\xc1w\xae\xa2n&\xc56\xfd\xa3\xa6\x8a\x0e\xa52gN%\xa4\x086}\x14\x97s\xc5\xb7\xd9\xf4i6\xa6.cb}\xedVk\x87bb\xaa\x8fy\xb2\xa4\x9a\x0c\xa5M\xf7\xdc\xc7~\xb4\xfa?\xb9\xf7^%sk\x13\xb1\xd6|\xef\x98\xa9\xa1\xe7\xd0[\x83\xe9\x9b\xe2\xc7\x9e^\xd3\xb5\xbdl.i\xaa\xc8\x9e\x10zB\xf1QSk9\xb3\xe8\xacq\xa2\xe5\xce\xe4V3E\xd8\xd2ql\xbd\xbbVl\xd0\xe9\xaf\x15\xd9K\xef\xd6\xc9\x10\xd4lV\x9c\xe8\xb5V}\xd5\xd0n\xf2wJW\xe3\xf6\x91\xa5vw\xfaC\x9a\xcf\xd0eZ\xca\xa9\xde\xa8v\xb5m\xb0\xf1\xe2\xfcV\x9b\xde\xae\xf9jc.j\x04;>\x05W\xf5\xf2\x97b*\x8c\x9b\xaci\xe7r\xc9w#s\xb5\xbb\x16-\xe8\xd9\xd0;_C\x9a\x91\x13\xe7\xbb\xb7\x8a\x98\x11\x8a\xcb\xc5\x05\x13j\x94\xccj\x13\xf5j\xa6\xde\x97\xdd\x0f>\x06\x19R\xae\xde\xfb\x86\xe0J\xc9Z\xe4lU\xcd\x98:f\xfa\x85\x0c\x17\x84\xf15\xc5n#s\xcb\xe5\xc6\xe9zi6\xc7<[C\xea\xceZk\xbb\x16\xfbF\xaf2)\xdb|\xde\x9a\xfb/\xa5o\\k\x1d\xbd;\xb6\xfa\xf0\xb1\xb5\xa9\xdc8ckM\xb8\xca\xc9\xfe\xec\xb5\xad\x06\x8b1p\xd7(vj\xec\x8ce'}\xe9\xcf5{\xb5J\x05\xfb\xd9j\xa4\xa9\xa9\xba\xa7\x8f\xedeS\xac\x13\xc6\xa6\x99\x96S\xc9\xee-\xb4\xd6k\xef\x95\xe6B\xec%s\xd3\\\xbc.7:\xe68)\xa6\xce\x0cE\xe8:7\xc2M]\xad\xb9\xae\x9b\xabW?\xa5\xc8\x93\xf6C\x8c\xde{\xd9P;Y5\r\x83\xeb\xa8\xe2c\x8cc\x08\x19C\x8c!\"\"\"\"\xe2\xc6R\n\x12\x86\xe4\x80\x92t\x92z\x1e\x12@\xc08\x0c\xa3 \x8aa\x19\x88\xa1\x10\x06\x82(\x84\x10B\x08!\x84\x10B\x08!\xcc\x92\x1a\x12:k\x8b\xca\xa1\xea\x98\x01[\xe3J\xb7G\xf5\x1fd\xb4\xd0\xb6,\x99I[\x85\xb0\xa5qK\xb3\x06\xf1\x1f\r\xbdHC\xd5\xe4$\x8c\x06\xaa`\xa8\xbct\xea\xa0`pk\x9e\xf9\xd0\xc0\x1b\x9a\xf4\xff\xb5[[a \xa2a\xd4\xecU)\x0bn\x9d&)\t?T\xb6-\x0b\x1a\x8a\xa9i\x95\xd5\x12\xcd\x08\x91\x80\xa2=T\xfe\xbd\x1e\x13,\xa9M\xd1\xee\xbfF\xac\x1e\x15\x85\xa2\xf2\xef\xa2P\x06\x16\x02\x89\x86\xf2\x12/\xda\x8d\xb5'\xf9\x18\x027T^p\xb2\x8a\xf1N\x82\x08\n\xd7Zr\x06}\"6fa\x1b\x0eb"    ,
    b"\x99Y\x13\xa1\x87\x1c*$\x07s\xb7\x99n\xb2T5X\xab\x95\r\xa5\\\x8f\xc4\xb5\xf9L\x07|\x96}h\xc9%~k\x86F\xd8A\x08\x1aV\xd1Z2x)\x98\x19\x98\x96\xf0\xa3\xe1\x97\xb4\x96\xdf\x92\xab'SQ\x95\xa09K\x9a\xd1.d8CV\x95\xb0\n \xa1\xc1\xa8\x06zL!\"\xe73J\x9d\x82\x9efV\xe9\x87\xc8\xe9\xb2\xd0\xd4b\x02)m\xb1\xeab\x0f\x91\xc5\xd7\xa3\xa9%\x816\x1a^S\xfe\xe4\xd0\x86|N\x04zzX\x8e\x97\xfd\x1e\xec\x8c\x10\x1c\xb4C\x0b\xb9!\xb2\xa8\x8a\x065,]\xa6\xa0\x9e\xa1jC\xde\xda\x96\x1d\xaawTj\x82[\x9fB\x85\x94\xa4/\xcf\xb5eY\x9dN\xcap\xbbJ\x03\x02\xc9Qc\x06\x05\xb3s\x1d\r\nbc\x0f=9\xbe\x13\x02R\x1aFEc\x97\x85\xef\xdaLHf\x86\x1f\"\xcb\xc9B\xd3b\x02X9'\x1e\x08`\xbd\x94\xed\xd5\x18\xf4\x05\xbd\xa4F\xc4\x1e\x82\xe7\tI \xc7(\xe2\x8d\xc3u\xa1\x9b\x01\xdc,\xf4\x81\x1d\xd9pMa\xf2\x0f\xb9\xb1\t\x92\xd5\x184\xd4\xa3\xf7\x85\xd4\xab\x88Pi\xf0\x87v\xbeS\xfbk}\xa6C\xe4:\xe8\xbe\x05N\xb9\xc0\xd5\xb4\x99\xd3R\xe7W\n\xcck\xfb\";XI\xc3\xc2\xc8\xd1\xea\x10\xb9,\"?\x13\xd3\xccRHo\x11\xc6J\xbd\xd5\x18\xba\xe5\x84\xe4-Mh\xa1x\xe9`:p\xe0\x99\x92\xc0\x19\x18&x\x8aM\xfa\x13\xd3\x98\xa9\xd7\xaf\xad\x1f\x91\x195u\xd4Y\xd3=7\x98\x1e\x10\xaaf\x1a\xe8\x8f\x9e\xd2Z\xddR(\xedb\x92\x85GM\x8b\xfbb\xfa\x94\xf066\x9d\xb70\xfd$\x87\xd4<(Hc\x1d\xc5\xe4\xfe\xcf\x1e\x8d\xb9\x99d\x9e5\xf5\x8b=\xdd\xcf\0\x93\xbez\x85\xa6|\x02\xd14\xa3@]\x05\x85\xcft\xc22P[\xa7\xb1\xe2O\x1b\x1b\xf2\x9f3%\x9f\x05\xa3\xc5\x04*\tN3\\\x92~\xd2/\xdaLC\xc1\x07\xe7\xf8\x16\xd2\x89\xf4\xc51\xd3F\xc7\x04wJI\xf3\xc2\x15\xb2\x86\xe4\xb6L\xc9e\x1e\x18Kn\xae)\xd3\xb8\x04\x88\xb5uL$\xa3\xc4\x80\xc9IC\xed\x92\x92t\xc9\xb4]\xb3#\x1d\x9c\x06\xbe\x0e\xd6\x94x\t\xd2\xa0\xa7\x89\x990\x04\x1b[.\xf4{\0\x9e\xc6\xd8\r\x99K\xb3\xfa\xa3F\x81bY\xf3H\xef\xa8f\x8b1\xbb\xf4\xf6}X\r\x03\x9b\x92\xb7\x9b\xe7\xde\rm\xc4:\xb8\x8d\x13\xc9A\x0c\xc9\xb9\xd6\xf4\xfav\xd0\xcc\xed\xee\x92\x98\x1c4V\x15\xc8\xa6\xc9X\xd3k.B?\xb5b\x0f!\xcb\x8cZ\x0e\xa2\xc5aA\xd0\xf2\x0f\x1av\xa9\xf2$\xc8 @\xf4t_B\xd3\xfd\xca\xe9\xf4\xde\x88\xe0\xd4^\x0e-[#\x07v\xdc\x01G\x1d\xec\xa8\x03\x1d;\xc81\x079\xe2`G\xc3\x01J\x11g\x191\xdc^\xc7\x02\x84\xe9\xa9\x12\xf1\xbd\xec\xa5\xaa\xa4<\xc5\xa93\xe9\xa5\xb6\x17\x98\x94)k\xc1&\xf6\xce\x14\xe8kr\x7f\x1d\xa7\xefD\xc3S\x11\x95\x07e\xf1\xc4\xf2\xfb\xa5\x90\x9c\x92k\x0cF-\x04#\x0c\xbfrJ\xa7\nF\xe5\x02$\xb28M\xf7H\xcag\xa5\xa89m\x87\x15\x9b\xb3J\xc8'R\x10wN;\xdc\xdam'2\xd0\r\x9dr\xe0\x02\x9d\x89\xc0Z:]x\xed\xc4\xcfo\xd0\x02\x19*\xf4H&\xc4\xa6N\x07\x9dn\x91?\x9e\x04`\x16\xf8\xb6Wc\x0e\xb4\x06^D\x01Q\x1bIM\xd32\x06\xbf\xc6\xce\xd0\x97\xd2\x94\xbb!qI\x89d\xc0\xd3#\x9b\xf4\r\xe8ug\xb6e\xb8\xc4\xc4SirF\x07\xe3\xc9\xd3?xgI\x0cb`~\xf2A\xe4k\xb9\xb4T\xb8\xf4\x02\xe8\x86ib\xda\xa2\xbbp7?f\x99\xdd.\x8eVX\xe7\xf3y\x9b}D\x85\x115\xab\x1a<\x1b\xeb\xb5\xec\x93\xba\x18\\y\x89\x12\x02]9Ui\xe5bP\xf1\x80a\x95t\xb5\xdc\xdc\xcbf\xea^\xa8\x0f\x88j\x06\xc0\x1c'\xe5\xf6\\\xad\r\x05\xcaU]\xe2n\x92\xd4\xad\x98e\x1a\xb4\xcb~\xc9\xea\tP,\xc8\xcf\x92\x08\xaa\xe5T\xda\x94\xaa\xdb\"!\xf7j\xe5\xa2 \xc6\x81\xaf\xaag(\xc9f:h\x1dG-\xc7\xe9;\xf5\x981\xa4\xe9\x99\x9b\x11\x03\xceh\x19\x94\xed\xf5X3A\x1f\x8be\xc6\\\xc5\x1f\x02\x0f\xaa\x86\xf7\nr?\xcd\xa7\x13\xf5\x88\\\xf4j\x08\x18$\r\xc3st(\xfa^a\xd8\x19U}&U\x13q\xe5#\xad\x9d\xd0\xd0V\xb6\xf3~Pb\x96e\x82\xa7\xae\xeb\xdb\xdd@V\xf1\x8c\x1e\r\x93oZ\x9f\xd1\x1b_\xeb*4w\x85\xbf\xff\x85\nK\xdaM=\x0c\xc9\x0f,\xc3\xa8M\x08\xa6$xB\xdb\x9e<\x81\xf3\x1c@\xb9\xd0\"I\x83\x14woPvG\x19\xf9\x0e\x8f\xb4\xc0p`%\x9e\xdc\xaf\r(HW0R\xc1\xe6\x9c\x8a\r\xf1g\t\xeb4\xfe\xd1\x06|\x88\\\xe8\xbb$\xfb\xb10*]\xb3i\x83:\xd0\"\x01s\x99D\x16\x81\xe8\x13\xa3x\xa1\"G\x02\x8b\xdb`\xc6#\x1b`\xf7\xb8\x8b\x0cp\x94\x0c \xbe\x13|I\x85\xbc\x96\xe3]P\x86\xae\x18!\xa0\xd6i\x9e\xd9\xf2\xb1\x80\xc9\xb1{f_(\x18g\x7f'\xbf\xd3\x82Cj1\x01\x84\x1b\x95\xb0Y7E\xfa\xa7@\x0e\x8c&8\xc5\xf4\x9f\x19H\x16b\x83>O\xff\x89!\xe9N\x0b\xd0&\xc2]'\xb6c'v\xca\x8a\x05eI\xd1\xecJ\xd7c\x0cJ\xee\x8c\x88bg\x10\x02\xd5?\xd48\x03'i\x83\xc3\x08$\xed\x9a\x1e\x05\xba\xa6\x84V\x803\n\x0b\x85|v\xb0LLZ0]3\x02\x050\xf0\xce\\'\xb5+\t"    ,
    
    b"\xd454\xa0U\x9a\xa2oH\t:L\x10\x18\x02\xfa\x14Xz\\AjA\0\xc4\x89\x81@\xf0(\x16\x16hvH\x92\xb5i$\x04(\x13\x89\xe8'@IU`\xf6\xf7\x01j\x19\x02\x89\xe6\x81\x0b;\xb00\x99\x06\xda\xb80\xfa\xff\x9f\x1f@\x02'\x01\xd0b\x04RM\xe7]\x16\x02\x15\xaeE\xf7\xbb\t\xfc\xb2\x9f?d\x95-\x84|\xba5\xb2\xc0\x88\x9d\xd9\x96\xa4~$\xf8\0\xc9\x9d!\xd0\xde\x0b\xa1\x15\xcd\xf2\x88\x8f,?R\x8be!\xe5Pj\x02\xdc\x98\x91\xd1CY:U.w\xad\xae\xb2\xd0jR\xde\x18P\xe55\xb0W\xc2\xe0~K\xe2\xde\xa0\xc6\x85\tL\xc3\xde\x06s\xc2x\x19\xe3\x84s/;\x1b\x86`c;\xd1\xebt\x99\x9b\xc5Z\xce\xe8\xedm\xfd0\xc3\xfa\x1b?{\xde\x0e{\xf4\xd5'F{U\x12R\xd2\xf4\x92\xff\xc3\"U\x9fc\xe2\xf5P\x836^\xf0\xd3\x96\xfc[\xd0\rF8\xd7Re\x9b-\xa6\xd8t\xd1o>:U\xe6n\xcds\xd9\xc7\x12\x7f\x10k\xad\xa6nKC\x15,\x06v#:\xa4\x99\x87OF?\xed\x0f\xe2\xaf\xcb\x16\x1c\xc2\x88\xeb\x1a\xee9\xdd\x1f0\x10\xb1\n\x9f;\xc5J\xf8\x9em\xe1\xf6\x18\xa1\xb2\x07\xf8]\xf9-S\xb0\xeeQ`\xb6\xfc*K\x17\xd4~\x84\x8f\xa3\xe6J\x10}\xa4\xde\xe3\xc5\xdc\x8c=\x0f\xfb\x9b\xb3f-\xa1\xd5\xda\xd72\xf0e\xbc\x99\xf4\xd7\xa8\xfb-\xbf\x02\xe7\x88f\x12\xaf \xd4G\x95\\\xcd\xafC\xa1\xc7D\x89\x1f$\x9f\x088\xc5x\xc4\x93\x9e\xd8\x1d\xf1)\x0c\x8b\xe1C\x07\x890\xc92\x95\xbfT\xfc\xe3W\xb5\xf6\xaa\xb7\x04\xf4\xc2\xa2y\xe0\x8db\xa2^\x8a\x0b\x07{\xd6\xa2p\xa0\xb5dsJ>\xf2\x85\xda\t\\\xaf\x1dM\xa2\x0bC\\\x81\xb1]D6\x88\x17\xb1\xb3\xb4\x05\xc2\x1d\x06\x079s\xc8r\xcd\x9cb]\xafx\xb4\x9b\x86\xec\x1d6\x02\xec\xbcR\x88\x1f\xd8F|\xb9lW\x1a\xaaa\x8f\r\x11\x9dF\xc7^\xc9\xb1;\xcc\xd2\xed\xba\xa4\x99\xbbY^\x95\xca\x7f\x9c\xc6e\xe4\xba:\xc0\xab\xebDCe\xbe\x10]^i/G\x92\x05$\xd8&\x92'C\x93\x91\x1dJ\x80\\#\x19\xd0\xc4\x9f\xeb=\xfa?\xdd-9\x94\xcdy\xf4d(-:\xa1-h\x15\x7f\xe4\xcf\x18\x02V\xac\x1bk\x16\xc6\xb3*\x1c\x08}J\xbb\x98\xd9TI\xc7\xeb\xff.\xf1h\x1d8X\xb8\x88g\x91\x99\x0f\xab\xd2,#\xd4E\xc8\xcc\xec\xefN\xdc^\x1alK#\x9aX\r8\xaf\xd4\xc3\xdf2B\x05\x8f*\xc3&w\xfeFei;cezQ\x10\x89@J\xdf'V\xb0\xa4\xdd\xf9\x17\xb0\xdd\xcdY\xe2`\xa1\xfc\xdd\x10\xd6\x9a\xddc\x17\xbb\xb4\xca?\xfc\x19\xa0\xf2\x9c0\x91\xd8R\x1d\x9fo\x03\x11\x85\x1e\x88\xa7\xc7_\x81\xb5^\xc0\xab1\xd6\xb9\x9b\x89\xe8\xe3\xadk\x1a\x05\x1c\xaf\xa8Q\x8eFO\0Y\x9b\x12\xfb\\\x13z\x10\xc5KT\x12$\xfd.\x83\xb9.\xe4O\x84\xeb\xb9/\x05\xd5$\xbd\x0bT\xa0j\x12?\x8ek\xa2q\xdc>\xa1\xe1\xc1\xcd\xf3I\x11b\xa9g\x1b\xadBT\xd0\xf6R\xcb\x0fQ\xf4sZ\x1f\xb6\xa13\xbb\xc2F\xa9\xdd2\xc8>\xd6)G\xb5\x9f\xb1\xc1M\xc0\x0c\xe5\x19r<\nt\x8fG\xa5\x84\xbcw\xb5\xb0t\xa7f\x95K\x17\xb1=\x0ca\xb7=3BW\xb2B\x89k\xad>\x102\xee\xb0\xb3\xf6\r\x1a\0\x10\x16o\xe1\xe02\xc2G\xc1N\\2\x1b\xa1\xa3\x8f\xbf\x80:\xc4\xb1r\xe7\x10\x82G\xda\xef\x89\xc9\xbd\xfc\xb2\xda\xce\xc9\xa0\x14\x02;\x8b\x93q\xb1,\x11\x8e\xdc\x92\xf0\xc2D\xfa\x9c\x95\xf0\xfd\x10\xa3\xff\x07\xdd\x93\xbeM\x9f\xc9\x9c/v\xb4\xa1GP^\x85\x92\xe0\xda\x9eT\xcf\x9b=\x88E\x1ep\x91O\xc8o\x02\xc0\r\x86V|\\\x18\xab E/u|\xfb\x1a\x1b\x7fZ^\x9c\xb3\xbc\xc3\xbb\x04m\xb4B72\xb8\x15(\xb5/\xfd`\0\xffU\xaa\0\x9a\x9aA<4Pk\x92\xc2\x01\xb0\xd8\x99nff\x0c\x8bb\xf9\xb1\x91$P#\xf6KC\xb6e\x85\xdb\x96e\x19\x91\x05?\xce\x82X($\xae\x96d\xcb\x96\x15\xba\xb8\x86\xc4\x9d\x99\t!|\x04x\x03r\x03d\x18\xc3fef\x12\x0b\x11$$\xde$(~\x91`@b\x81A\xf1\x01X\xae\xe5{\x1f\xa4i\x96\\\x0f\x89<A:\xbb\xc15\x1cqi\xa4\xb6\xd9\xcb\xf0\x13Y]\x1a\xbeH\x9f\xbat\xac\x1c\x1e\x1el\xec\xf8\xc9\x963\x98\xfa\xb7\xc9\xb5 -\x97\xd1q$\xa6\x0b9-\xe3\xc7\x93\xacL\x86\x8fR\xc9BB\xe7&=M\x14\x0f\x92b\x7f\xce\x9b\x9e\xa3w\x85\xdc\x0e\x93q!\xe9\x15\xa3\x82\xe4\x8c\x99b\x7f!X\xca\x8f1\xc8\x8b)\x1d6$3\xcaPU9S\xf3\x9b?\xee\\n\x8d#>\xa3\xc9\xb3 \xa5\x99'\xe4c\xc5F\xf55\xa2\xaf\x11\x07*\xa9\xd6l,\x9bIIZ\xe9\x8f\"\xbd9\x87\xca\x89\x92\xe3-j\x97\xe7\xdd\xeeD\xdd\x98J1\xd3\xed#\x11\xa2Fo\xccW\xec\x1d\xde\x17\x14\x16 \x14\x10\x03P\xc8\td\xf0\x0f\x8aE\x05\xde\xb0p\x90@\x80\xc3\x021\x07\x84\x03\x7f\xe2!\xb0\0\x12\x0f\xa1\xe1\x02\x93\xf8\x07\x11\x16\x8a\x06\x0b\x1c\x18\",\x1c\x18\x18\x9e\x82\x84\x05\x05\x0f\x16\x18\x16\x0b\x89\x85\xf3\x02\xf8W\x0c \x03\xc4'\x1e\xa1\x80xX, \x14\x10\x0f\xcc\xd0\x08\x0c\xfe\x81\xa1\x1b\x18\x1a\\\x0f\xe1\xe0\xc0\xe1-\xb0\xe0 \xd1\0\x01B\x837$\x1a\x12\x11\x18x\x01A",
    # this byte string ^^^ contains the last part of ZSTD frame 1 and beginning of ZSTD frame 2 (search for b"(\xb5/\xfd" magic number here and you will see it)
    b"\x02\x827\x0c!\x03\xc4\xe2\x1dPb\xe1\x82\x05 \x1a \x18\xbe\x99\x01\xa1\x80X\xbcCb\xe1\x82\x05\xa2\x01\"\xc2W\x80\xc0 \xf1`\xc1\xe1\xcd;p?\xd0\xc0>P\xf7@I` \xa8\xc0\x82b\xc1\x10J\x96V\xa0\xca\xaa\x12r\x10\x07g\0\x84\xe2\x15\x0f\x0b\xe7\xf3\x90`\t\x9e\xc1\x17\x16\nF4@` \x81\x06\x88\x0bX\x01\x0e\xbfx\xe8\x05\xc5b\xc1\x08\x85\t\xa8UY\x02\x04&\xc8\xa3`QF\x05\x8a\x06\x08$\\\xf0\x13\xf8 \xdb\x86\xef\xbc\x17Rc%\xc2\x8aT\xdf\x85\n1\x1f\xc7\\\x9f,eg\xccIK\x95\xfa\x1d\xc9\xd6\x07\x8d\xc6*\xb7\x1ae\xb8\t\r8P$\x1d$\x98\xc4;$.hX\x80;,x\x82\x15\x03HH\xb0\x03r\xce\xdfl<\xb6\xd3\x99\xa1\xa4\xc5\x90\x0c\x9a\xa5\xb7\xa3\xe8\xe5\xd9\xb2\x14\xb93\x86z\x89\x12+A\xf2\xe4$\xcf\xd3#\xe4\xa4\x9d\x9d\xc2\xc2AB\x04\xc5C_\xf0\x13\x04 \xa1\x02\xe7\0\xecp\xc5\x1ff<\x8e.\xcd\x92\x99!\x1d\xb5\xa6\xba\xf7\xb5+\x9av\xc5\xfb\x83\xfc)=\xe4\xc7\x95p \x129|\"}\x7f\x8a=\xa9\xacL\x88\0\x82A\x1a\x81/\xa8@\xc1\tHppx\xc5\x83D\x83\x03\t\x0b\x87w@\xc3\x03\xf6\x05\n\x1cxu\x92\xc9\x97\xa5\x9e\x06b\xd3\xabAZGBfx\xcfO'I\xbbb%\xe7p\x9a\x8d#Rl\xc9\x9cE*\xd9Ow\xed\xc7h\x1b\xdaUB\x03\x12T\x19C\x02\x1cxA\xf1\x0c\x0cL\x80\x847\x0b\x0e\xfe\x81YP4\x04v !\xd1\xb0ph\x08@)\xe5JJ_\xebP\xf9V\xaaU\xa4Q\xb64\xf8`i=\x018`@\xd5\xea]\x97c\xb2\xbcq\xa1\xef\xa2t\xac \rw$#\xb7\xfc$\xc9V\x1dy\xa0\xf8\xfe\n<\x81\x81\x0cH\xf0@\xf1\xd0\x10\xb8\0V?N\r7\xa3\x876\xb3\xe9\\!\x1de\xa5\xcdt&[\xa38\x8f[t\x82\xc9\xb4\xbaLJ\n\xe94\r\x9d6\xfc\xe7\x8c\xcc\"\xf9\x17\xc8\0+\x16\x0e\x0e\x0fL\xc1\x83\x87\x8f\xc0'\x1e4048 \x81\x87\xc0\t\x84\x02\xc2\xa0\x93\xf2V\x87M\xe9\xa8a\xda*H\xc3\x94B\xf8x\xbe\x854@0|\"\xc1\x14\xb8\x05\x0f\r\n\x02(\x1eB\xc3\xc2\xe1\xc1\x11\n\x19 \x14\xc0\x80\x07\"x\xe2\x15\x8a\x07G(\x90+\xb5\x06\x88E\xe2\xa1\x01B\x03\n\x88D\xc3\x82\xc3\x82\xbf\"\x01\x8b\xc4;\xa2\x01\xe2-\x88\xb0@`\xa0\x80\x188\xea\xdf\xf09C\x087\x97\xd8\x19\x89(YR\xb2|\xf4\x1b\xd1\0a\x16\x10\x18(d`~\x91xhp\x87\x05\x83P\xc8 \x03fpP,\x9c_\xf0\xc2!\xd1\xb0\xf0\xe0\x15\x88\x06\x88\x08\x8b\x05G( \xca\xc8RD\x03\xc4\x9b\x06\x07\x18x\xe1\xd0`\x01B\x01\xa1g\x88\x06\x08\xc57\x84\x07\x05\x04\0\x14\x0b\x07\t\x8a\x7f`\n\x9c\x05\x80h\x80x\x08<\xc1\xe2_\xb1p@`\xd0\0\xe1\xe0\xf0\nc\x18\xa1\xc0\xc0\xf0\x90h\x80p\x88\x80\x81\xa1\x81D\xc3\xc2\xc2\x82\x05\x85;\xbcA(L \x03\xc4\x1bE\xc3\xc2A\xc2\x03\x0e P\xc0\x04\x0cp\x80h\x80\xf8\x07\x06\xa6\0\x02\x03\x85\x0c\x10\x89G4@<\x03{\x03\x03B\x01A\x81/$\x1e$H\xf8\xa9K$\x1f\xa98&\xad\x97s\xc3\x1e\x82\xb5\x02\x0c\x1bw\x87\x8b\x8e\x87\x96\x8f\xc9\x90\x82d\x98\x14*rz\x8e\x92\xf7\xa2\x8f\\\xcey\x10Ad\xda2H\xab{DX\x89q|+\x1cf\xb6s\x10\xaa\xe7\xa6\x7f\x834\xcc,\xe1g\xd5i\xc5\x1c\xacU\xc4r\x14\x1am\x96\xf6\x18\xa4~^:\x83\xe5?\xb0\xac5\xf9G\xf3u\xa8\xe4.\x9d1\xa4b\xf8\xc8\x0c\x1b\xd4<u~\xf2s\xdc\x8d'6\xc6t\xcc!\x15\xa2Em\x88e\x06\xd3\xb2\x8f\xef1\xc6\xd8Q\xb73\x9d;H\xcc\x8a\x84\xbb:\x86\x7f\x1b\xdb\xb9\x1f\xccF\xfa\xcaT\x08&yr\x1dt\xd4\x81v\xfd\xdf5\xf6\xaf\x0e\x9d\xebV5\xa4=f\xc8@$\x85\\\xb2ywif&fojm$5\xda\x94\xc6\xf6\x1c2qRo\xe9\xcah\x94\xe6\xb6x\x1c:d\xc7\xa3\xc4$\x8f5\xbc\xedL\xdccI\t#\xd5\x18\x86\xdcj\xb1\r?.\xe1\xbd\x1efd\xf6\x99\xd8\x1bi\xe0\x16\xeaf\x92\xff\xc6\xde\x19\x8f\x9e#\xc6D\x86)\rE$T\x1f4J\xa2\x1a!wz\x8d9\x87\x8dC\xfc\xccd\xd6HG\xbc\xd09\xf6VG\xed\xda-F\xcf\x8f\xb8F\xd3\xd7\"\xdd1\xd2v!\xc8[\xe4K\x99\xf4a\xce0t\x03\x99\xd2\x18\xa4*eP\xff\xd1\xbe/\x80\xd6\x90\0\x02\x01J\xed\x9bC\x1d\x83\xc9\x94\xd1\xf4\xc8Hc(!\xc4R\x86\xf4\xe3p\x83;\xaeM5\r\xfd&s\x87\xf4\xe74\x1dw\x11s\xe4O\xc7 e\xd8\x19N\xcc\xdfHY^)\x0f\xff\x98\xe2\x8b\xbb\x89\xe7?NI\x7f\x9b\x88\x19Hc\xfbP\x7fU\x92\xd5\xd3\xc2L\x92\xe4h3\xca\xe2M\xd9\x8b4p\x18\xed\xf29$G\xd12\xf5{\x98\x1c\x12\x973Uy$>\xd6Dt\xef\xd2\x9f\x94\xb2[\x1f\x06K\x12A^\xb2F$+\xc3\xc9\x0c3\xc6\xec g1\xfah\x86\x18)\xb1\xa5+\x8dt\xe5\x85\xd8\xc6\x9a\xdc-\xbb#l\x9b\xc3F!\xa4\xf9K\xcb\x04\xc9\xcd7\r\xc7#Y\xfcT\xf3\x9f\xfdVq\x8bn\xb0R\x9aCB+\x83t\x902\xadJ%\x9a\x9e\x07\x97L\xb6R\x96A2LB\xda\xa6Y\xa4\xbb}\xb1\x0c\xd3[",
    # --- at this point rust crashes ---
    b"\x88\xbd\x96\x96\x0b\x121\xa4\xa9\x0e\xbf)[\x10\xf1-\x93\xed\x0fS\x1d\\\xeav\xa4:/BS\x8c\x18\xe4\x1c\xefJ\x8cg1\x8dW\xa4\x1c\xd8\xe4\xc6d\x96\x17&[\x96\x8f\x96C\x0c\xf1\xf5R\x19\x8b\xb4\xcbOy\xa4\x10s\xcc\t\xa9<[\xe6\xf4\t\x8bQRcH\x87\xc4\xa9\x06\x96k\x12\xdfRn>\rK\x91\r\xa3\xf4e\x91\xae4!\xe6\xc2qV\tPv\0\x84\x94;E\x90\x8d:\x9d#K\xf7\x8f\x94\x96H\xe5\x9b\xa7\x1c/\xc7\xa3l\xda\x12\"\xa4\x98\x92\x0b\xa9\x8a!4\xea\xb09&\xcd\x94\x82\xa6\x1b\x0fq\xd2>Lv\x0cR\xe1\x1aD\xd8\xa4)\xe7\x94}\xfa(\xdd\x1d\x94\x99J\xbc\x07\xe9\xf9\x06)\x92\xa3\xa4\xd7\xb4rq\xcd\xbe\x10\xb2B\x96\xda\tRu5\x11\xc3\xe6Gb\x11\xa2\xf9\xb9\xaf\xee\xa4\xddhk,\xf9&\x92y>\x94\x9b\xa8\xe4\xb0\xd9>m\xbf\x9e\xe4\x830\x8d\xa1H\xcbNH\x99\\\xe9\x9b,\xab\xc5\x0c\xbe%c\xae\xe9\x93 \xe5\xd6 St\x98V\xf2\xf8b\xf6,N\xe5g\xe9\xe4!Y\xe5\xa0d-L\xa3ee\x0f\x12\x0b\x8a\x84\xe2-@@\"\xf1\x0b\rP\xd5\x1c\xb9g\x06\x95cS\xff!i\xc9\xa2gt\xf7U\xd5\xdc\xe2l\x8a\x12\xfe1\x8e\xee|Sw\"-\xd1\xa2\xe3\x1c^\x8aS\xb3\x8c\xb7E\xdf$\x85\x86n\x93\x97d\"\xe6\xb0\xfe\xd7);z\xdc\xe6a\xa71\xc8R\x8dB\xc2-\x87\xcc\x92\xbc\x9e\x1b\xda^\xbc\x99\xdd\x14db\xdb\xa5q\x0e\xd2\xfa1\xf1\xdb\xe1y\xaf\xbds\xf8\xf0\xd0\x9eJ\xb9\xa5b\x85T\x90\x10\xda\xa2|\xd6\xcf\xd9\xb83\x9a\xdd[\xf8\xcc1D\x8a,iy\xa5\xa2E\n\x0f\x92[\xbec\x8f\xfc\xcc\xfe\x94\xe5\x99\xd8\x08\x92\x93^*\xc4\x9ci\xb9!e\xee\xfd\xbc\xb7\x13\x17o2b\x90\x9e\xdd\x90\xf3\"__)\xeeV\xa5f\x0c\xfa\xcf=\xa5\x97P\x87I\xecL3c\xef\xaa\xa8\xc3\x8c\xfe\xfd|KmGya67I\x8f\xb6\x84f \x95bIG\xb9\xd2\xed\xea\xd8\xc83\x8aW\x93\xaa\xb4\x12\x8fC*\xa9O\xe30\x1e\x9f%\x05\x87\xeb\xa972\xa6\x9b\x0cQ\xa4%\xc4I\xcf\xaf\xa9\xc5\xe72\xea\xd8\x8fCo\xcf\xe4\xa5\x90\xea\xf5\xc9\x86\x1d\xd5\x1d\x07\xb0\xf1\x80\n\x18@\xc79\xae\xea\x9e\xea\xc4oMe\x1c\xe9\xfc2\x114F\x89\xfa0\xa8n\x06\xb9\xf1IgJ\xe9\xee\x91\xce\xa9\"-7\xfc\xf7x\xa2\x8f=\xf6D\x8b4S\xe9\xd8#\x1d\xa2G\xa3\xb7u\x9b\xf1\t\xf7aW5r\xbb\xa6S\x85\x94f$\x8d\xc3\xa4\xf8\x99\xe4R\xd3K\xae\xb0R\x9e1\x994\xa4\xf7r\xa8M/\xcb\xd5\xf4[\x0f}\xbe?\xca\xbb&\xc6E\xea\x1e\x84\x88\xe97\xe8f\xd9\xce\x18\xef{H\\\xce\x92\xb1#}\x13\xa3\xd2\xa3\x89\xa7\xf9\xad%\xabXN\x19\x1d4J\x99\x87\xd0\xdb\x9d\x92\x86]F\xb95w\x8e!tF.Y\x15$\xc6C*\x9a\xe7\xeaH\xac\xac\x9eCC\x8e\re\xf2\x82M\xe6$\x92.Q\xc2\xa2K\xda\xf4\x98\xf3\xf5\xb9\x8dF\x83O)\x8fA\xe2N\xa3&\xd5g\\tW\xadT\xf7\xff\x93\x995%\x12\xa4*\x9d\x94x\xdf\x86\x03Mq3R\x0f\xf9C\xeb\xbeT\xc6\xd8A$\xad\xb8\xb7\x0f\xafsL\xb7\x99\x90\x8fe\xfaB\xa4.\x96\xb4\xd7Y\xcc\xd7\xbfz\xb3I\x1abd\xb8\x96\xf4\x1c\xd29\"\x99\xc3e\xed\\!\xc4+\xbb\xcc\xbf\x10)\xddT\xbfH\xfbh\xd4\xf9i\x87\xd8\xc94\xa7\xcd\x1c\xa3H\xa5\xa5TZ\x91\x8c\xacSY\x82\x071\rPv#\x02\x06\x08z\x942f\xb1M\xa5=\xde\xb4\xcfH|\n\x92\xc9\xc3c\x05\xf7V\xcb\xb0\x98!s\x0c\x13g!\r}\xa6bI\xdc\xab\xab\xe4\x8d\xe3jM|\xc6\xd2\xc1\x83\x84h\x0e\x11\xe7\xac;\xee\xe7{\x94\x94\xa6\xd6Ur3$\xbbs4\x8a\xebf9\x9b\xde;&\x8fQ:i:zH\x98Fh\xa0\x0ec>\x0b.)>M\xf0\x0c\xdaB\x9a\xec\x16\xa9\\\x1d\xed\xf9\xb1\xc9G\xc6i%\xd7\xe5\xca\x92\xd1m2l\x90\x9e\x1c\xa3r\xd7K\xf8\\O!\x95\xa7\x97~\xe0\xd28\x04\t1\x95\xd6\xfc\x985\xbc3\xf9\xbe\xc3\xe8\xb1g\"\xe5\x9a\xae\x17\xc9\x0fQ\"\xfc\xb8VvK\xcc\x95\"\x12=\xebBe0S!\x8e\x94?\x8e~,I7\x87~\x83\r\x1b_%\x9d\xca%\xa2\x8dd\xc8\x86\x94\xb0\xb7\xdd8\xa7J\x86\x8f2\xf3\xe4f\x96\x8e\x11\xa4\xe2L\xd25x\xd6#\r\x0e,\xbd\xb6m(\xb5\x95\xbe\x1e)\x8f\x19\x15\xf3W\xbd8\x06\xb6)\xd7h\xcc!>\xccd\xa4\x90,\xaf\xc8\xfa\xc9\x8d\x1d\xff\xe6h\xe9\x87X!6\xb5\xd4hHX\xac\x89\xb8\x97\xd3\x05\x0b=k\x1cL?\xc2B$&K\xa8\xdak\x99\xf7\x16{\x18\x1eu\x904\xc5d\xc1,L:M\x9a\x8ei$\xfbr\x88\xff\xfe\xbd\xc6\xd6\x9d\x8fT?c\x8f\xa1\xcf\xb2t\xe3\x91xMS\xd9\x91\xa7\x0c\xe11\xda\x10\xdd\xe8\"\xf9\x9d\xd2V(\x9fI\xf1\"g\x0f\xeb\xe1\x9bWZ\xb6\xa5b\x1a\xa9\x18\x1b\xb5\xe9\x0e\xaf\x1f[\xae\ns}=\x91V\xa6\xedB:S\x86\n\x8e\"\xfanlE\xdd,\xb2*}\x16%\xe3\x06\xa9\xe01*\x8b\xc3\x8d$\xc1rX\x9e\xb4i\x1a\x9eM\xed\x8f\xa4U\x9a\xae\x0e\xb9\xda\xcd\x8d{)\xcdY\x1a\xdaHhF\x93A6b\xb2\xa4\xb1\xf3\xbc}jt$\xffo\xfa]\x1bY\xbb\x86\x87\x9d",
]

# Create a ZstdDecompressor object
dctx = zstd.ZstdDecompressor()

# Get a decompression object for streaming
decompressor = dctx.decompressobj()

# Process each chunk and print the intermediate output
for chunk in chunks:
    output = decompressor.decompress(chunk)
    print('Partially decoded data:', output, sep='')  # Print as bytes, or decode if it's text, e.g., output.decode('utf-8')

So essentially your tests should include ZSTD body with multiple frames. And we need some more robust feature as "the end of body" than just "end of frame" I guess, will need to dive in async-compression again. @seanmonstar what do you think?

@seanmonstar
Copy link
Owner

To clarify some terminology, this body includes 2 zstd messages (not to be confused with the Frame type in the Body trait). That's not typical. Most often, an HTTP body includes only 1 message, all encoded together.

Before this patch, reqwest would just silently drop the 2nd message. What do other clients do? Do they also simply decode the first one, and not actually give you the second one? This patch makes you alert to the possible dropped data.

@yanns
Copy link

yanns commented Mar 5, 2025

From the compressor handler, I see that the max block is 32M. So after this size, another zstd message is created I suppose

https://github.com/netty/netty/blob/4.1/codec/src/main/java/io/netty/handler/codec/compression/ZstdConstants.java#L40

@yanns
Copy link

yanns commented Mar 5, 2025

Before this patch, reqwest would just silently drop the 2nd message

Yes, that's true. I can confirm this behavior with reqwest "=0.12.9".

@yanns
Copy link

yanns commented Mar 5, 2025

Curl outputs the whole response. If I use -v, I can see the following outputs, maybe showing the different messages

[...]"name":"a* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Connection #0 to host api.europe-west1.gcp.ctdev.tech left intact
rticleNumberMax","value":"85563"},{"name":"matrixId","value":"A0E200000002EFX"},{"name":"baseId","value":"85563"},{"name":"designer","value":{"key":"dkny","label":"DKNY"}},{"name":"madeInItaly","value":{"key":"no","label":"no"}},{"name":"commonSize","value":{"key":"oneSize","label":"one Size"}},{"name":"size","value":"one size"},{"name":"color","value":{"key":"grey","label":{"de":"grau","en":"grey","it":"grigio"}}},{"name":"colorFreeDefinition","value":{"en":"light grey","de":"hellgrau"}},{"name":"style","value":{"key":"sporty","label":"sporty"}},{"name":"gender","value":{"key":"women","label":"Damen"}},{"name":"season","value":"A15"},{"name":"isOnStock","value":true}]}]}}}]}}}

@seanmonstar
Copy link
Owner

I'd suggest we move the rest of the debugging to the issue specifically about zstd, since it seems specific to that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants