Showing preview only (4,890K chars total). Download the full file or copy to clipboard to get everything.
Repository: cloudflare/quiche
Branch: master
Commit: b30f9e76c323
Files: 2129
Total size: 4.5 MB
Directory structure:
gitextract_lidjoc0r/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── deploy.yml
│ ├── nightly.yml
│ ├── semgrep.yml
│ └── stable.yml
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .semgrepignore
├── AGENTS.md
├── CODEOWNERS
├── COPYING
├── Cargo.toml
├── Dockerfile
├── Makefile
├── README.md
├── RELEASING.md
├── apps/
│ ├── Cargo.toml
│ ├── run_endpoint.sh
│ └── src/
│ ├── args.rs
│ ├── bin/
│ │ ├── cert.crt
│ │ ├── cert.key
│ │ ├── quiche-client.rs
│ │ └── quiche-server.rs
│ ├── client.rs
│ ├── common.rs
│ ├── lib.rs
│ └── sendto.rs
├── buffer-pool/
│ ├── Cargo.toml
│ └── src/
│ ├── buffer.rs
│ ├── lib.rs
│ └── raw_pool_buf_io.rs
├── catalog-info.yaml
├── clippy.toml
├── datagram-socket/
│ ├── Cargo.toml
│ └── src/
│ ├── datagram.rs
│ ├── lib.rs
│ ├── mmsg.rs
│ ├── shutdown.rs
│ └── socket_stats.rs
├── fuzz/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── Dockerfile
│ ├── README.md
│ ├── cert.crt
│ ├── cert.key
│ ├── corpus/
│ │ ├── packet_recv_client/
│ │ │ ├── 01905a0a6abda022ef390f8272d392487baf3b8a
│ │ │ ├── 0199b9983333b7bb304e3aa5de55152bc707de8e
│ │ │ ├── 021d1c03dbdf16b2967f2eb3f8fcc408d366d0c6
│ │ │ ├── 022373e9bc6cce473753b1583bc81d54de7d0a31
│ │ │ ├── 0239eed33e629a913e37eefd47fedc7e4cfea03d
│ │ │ ├── 038c48a44cb860a364ae218089c9f73d5cdac1a8
│ │ │ ├── 04892897c4d1136fd879c20e6c8d6a11cb82ce74
│ │ │ ├── 04b243ba99315207f644399b5219d497cb802753
│ │ │ ├── 051700e8299de9fd5e57d468f1adea2cf7a31bf7
│ │ │ ├── 064c3f19f8e0086987df24669849efd08a44c974
│ │ │ ├── 06d83d54a14ba6082115fbadd42da3380ffdcb48
│ │ │ ├── 0713395f10bbf2f0fb64c09fc52e385098fe93c5
│ │ │ ├── 0714251b1d9a0298fe55e30d7ac9478134c8f861
│ │ │ ├── 072dc03c6ed95b340b3c43bf3c8ef8fce3cfa9b0
│ │ │ ├── 074a556fe49e356f482237e7dada61ca88205d09
│ │ │ ├── 07d07581ce26c5ba9bdb1f4e6fa2ec9a83348e91
│ │ │ ├── 082cc66c7c6294af31752651a7f87e392c4a9fab
│ │ │ ├── 086c3c532cc57b40080ed3e8242ce25811fb8011
│ │ │ ├── 09912a472b3e6d0a90d3474feb4895585136c155
│ │ │ ├── 0ac93b43855c4e23ee69b64c563cb0608cda5b93
│ │ │ ├── 0b5c7c1f931b293a057e868003ce986a610f6245
│ │ │ ├── 0b76e6095d96ec5425d66f54aaee6ca3edb3106c
│ │ │ ├── 0bffa229b2cc0523d238129861f7f66440d3fcc4
│ │ │ ├── 0c16c1610609bcdce4483dd8bcd680c38102a2fa
│ │ │ ├── 0c3255d7ab80285a1bb3ddc7ab5dea1e0ab5243b
│ │ │ ├── 0e0c7b4d381390222f3318dbd63ed8cbec6bee38
│ │ │ ├── 0e53cbde5ee4dc62989675064051b78cd6af467c
│ │ │ ├── 0ea129c0a57004b9d7d70da907deb8e617ef60ad
│ │ │ ├── 0eb1d5e92532571b320de3e5675a3a6b97e8e482
│ │ │ ├── 0f4d4798761e3b22377802a4f65d671cc599f5bc
│ │ │ ├── 0faabedb63ad1c46c28c601a8dcf27d215e14e33
│ │ │ ├── 10948b00564e725e4834e3f2f766e4239b3be22b
│ │ │ ├── 10ea24e6f89005686215d32a39648de5a46699f1
│ │ │ ├── 112d9f04dd66d4674d626083936b434527bfa2e7
│ │ │ ├── 1164a88112b00734b19a72bb8721e12ed6c0904f
│ │ │ ├── 1178baac08fea335fbdccd078f5c0eb0cbfa7759
│ │ │ ├── 11eb5505d2a37ece4723d20b5f49e69ad5be7b5d
│ │ │ ├── 12c2883b5e426354896a53bcccad112e1c8e27d4
│ │ │ ├── 12e811a8c93ad16c33f43c75f9eff30e6f532f01
│ │ │ ├── 12ed9cdb706f1fc8023f150deb76edeaace07746
│ │ │ ├── 130771c55c2aa6e165256d05eecda8529a50c791
│ │ │ ├── 132938b659127774a49c7abfd74bd6ce22dae077
│ │ │ ├── 139d4ceb7b62d5a17a253c4f11c00e4379e826f0
│ │ │ ├── 13ffb76b6f8577ccda520595069ee1bcd83f4bb7
│ │ │ ├── 1448bf60cac50f08b4bb7c00c9cff75d2796da32
│ │ │ ├── 14edd00e8e5a413197d0dc94c5bfc87ed3a6a920
│ │ │ ├── 151016d482429d95e6c18bbf930bf9b066e9a745
│ │ │ ├── 1565b7e316fb01fc43409ab9a59d76749d9bb1d4
│ │ │ ├── 16f6e95298275a1ffdda61eef1d209cd49cb5561
│ │ │ ├── 1701716ae4ecbec023075a3ce4e315840a1e3ffd
│ │ │ ├── 1791da841f87975e5d09003e64cab6e1813d1b62
│ │ │ ├── 179888084a9ac4e5eefbabd250c42da7803d1978
│ │ │ ├── 18614824e237b5dcd28f1694109317b4e1dac385
│ │ │ ├── 18b5e108bd969838e021be86d9d6832ff9fa376c
│ │ │ ├── 1923d19a2d82a1902ae4235c69008c922554e6e8
│ │ │ ├── 19f977dde4dffd98e5490a8f19833d45a11a08f7
│ │ │ ├── 1a3dcced59b1502743b77dac4379139cb61ad207
│ │ │ ├── 1adb97b3e6f8c539fb1ca0a32f29ba086db47f3f
│ │ │ ├── 1c5f5c2de9af5c185c1b0d8afa8b9a4081da78bc
│ │ │ ├── 1c8dab6f780c42d70b646aceb6f4d1931fd95137
│ │ │ ├── 1c99623bd07f6af5960f6ccc11856497a09e0adb
│ │ │ ├── 1cb68fcdd34eb571a25aed75637b349695dc1a98
│ │ │ ├── 1d267f440f0ce42fa36b07ee03cc0aa990e5cb89
│ │ │ ├── 1d6a6ae3a2d5ede8b12074bf99cf443a37d2c970
│ │ │ ├── 1ea124da6e03992edc07a95750c89457d7c75beb
│ │ │ ├── 1f744aeed2ad33624f6a45f23a60e978699deac9
│ │ │ ├── 1f7d69b3ad95bb33ba2fd2f975edf9ff18fa9d29
│ │ │ ├── 1f92dbe72e316e940c32c1b860a755a92ffb8416
│ │ │ ├── 2161350c4760b5092725fad56c0b41ef704331ec
│ │ │ ├── 22fcba4c5a1f5cf61689dadf16c1f1e3c0c9d601
│ │ │ ├── 2319a9ff07efe83cbeff248ca20907bb845e1014
│ │ │ ├── 233b34589ef66395f61cab91278d605a96f88d07
│ │ │ ├── 2352b8c2d034df07e7e0b00f65cde71f6e91c503
│ │ │ ├── 237f322514ae68f84ee6630d308d986bf7d60ee0
│ │ │ ├── 23bb4316db8964e7330ab4fd82deafd4e6a48669
│ │ │ ├── 23bd31350b722e8a496d25401ac1d3f43c5c821a
│ │ │ ├── 243a32957cb00e6025012d3d3d4b5793348c0d7d
│ │ │ ├── 2491e2b14e5ecd106f14fef592e6ad320f6b969a
│ │ │ ├── 24bf12093aa42cd1cba5d426941a67f248daa5fe
│ │ │ ├── 250ec08178a581f81ba789ebbc88d5d8c6a6de1a
│ │ │ ├── 2510c8e07515a45b1f2e106012dd970a881606ff
│ │ │ ├── 257fb59968a453f6e6f507c20db0f246efdf11cc
│ │ │ ├── 25a594d8542489fb585db9c8003ab24ccd9094c9
│ │ │ ├── 26323e2f6572b8e8efaf6ff543799b8ce9234315
│ │ │ ├── 2632b586f6d6cafa2dd4f38f1071ad3b715e7bf0
│ │ │ ├── 26fba27f3bb2700f788898d6c33049f9fb6cd0d4
│ │ │ ├── 27967eeb349d7e414d39001f330fe7dcaf72b3b2
│ │ │ ├── 27f09f9305ac616d9ffc079ce92e2512c60ef4f9
│ │ │ ├── 2862788427f3f42456418e14e08f4db4bedd3af4
│ │ │ ├── 289aaa84f6e7bafc599465324c4431ea434f86c5
│ │ │ ├── 28a85fe6c681c6b70735c97546650dc51641a9a0
│ │ │ ├── 2932ceaf0508cce2952e029edc43c9107efe5719
│ │ │ ├── 29f236b8fc4be8efe1e435c36740fbcd6d9c068a
│ │ │ ├── 2aaba01dc73b66f39cbeb2fcc7c9d1fe48dc880d
│ │ │ ├── 2acfe911125dff3d198df20c1c8a655842ff1106
│ │ │ ├── 2b9fb59cf47913750f49968c5a7ab52594cc4a3f
│ │ │ ├── 2ba1d03de721c8d3392685cd7ced17902ef7d78f
│ │ │ ├── 2bd7e9587a651e9a12208da3780226d538e7f1f4
│ │ │ ├── 2bdc57181f24a8cb2a10bebc7de700c89ab4193f
│ │ │ ├── 2bf809711fe7ff3b06d578a99c2be1291d515dbc
│ │ │ ├── 2c756c7cc212ae40d27b3b7b536511b75e0e7c07
│ │ │ ├── 2ccb3583d8eb8a4ce31264ffff286f62a54363c9
│ │ │ ├── 2d97dc2b08dafff069139e3075effe7e65ac15ba
│ │ │ ├── 2daae60ef0ae84be5243a479bea196cd27a2c14a
│ │ │ ├── 2df92de4ab59e42d78fafd10f5fea1b8ccae4e2c
│ │ │ ├── 3019320fccdb549a075f885ab2e9b011c9d13759
│ │ │ ├── 3070697a94c90c09fb2a4892e3aeefcc81ca1374
│ │ │ ├── 31272322a2a4eeaf0c438241fe7c902062f13729
│ │ │ ├── 313f1a69c85079c85ab4c9fe98323769ccdab83b
│ │ │ ├── 318cf9cf36583b60abe1020e9a4da0812054e6cd
│ │ │ ├── 333a5ff4f244aa6630596b4be1f23be83056a191
│ │ │ ├── 34311a90e06f21ac8a13b41d680ecd3c2ac86580
│ │ │ ├── 34a5a6b5114b1afdebf6cc3f0f22799aaf312c75
│ │ │ ├── 363e59b20a733f42e686cff4782e3630d3e44a72
│ │ │ ├── 364d18d1127c2618f9c870817b667be27f05205d
│ │ │ ├── 36d852d0de2862cb65ec8f254f938660d3a64dd0
│ │ │ ├── 36fec4670290af8d7aae4686b7084d50c89aef76
│ │ │ ├── 36ffd42c063939382ed77134a877f16f4561f8a0
│ │ │ ├── 37ca7c1d8eada0b491363b1122dde916cae6772b
│ │ │ ├── 3854883375f0c24b614c9a005c99ff48664eabae
│ │ │ ├── 3954d4a721f2d7b05a6f1ada50a01ad870903f80
│ │ │ ├── 39a39128874b06e2918eabe882c62b2c1bbeee6f
│ │ │ ├── 3a30dc1703679bb07318e85822f45e4e85058ebe
│ │ │ ├── 3a331735f5acb42b03370f8146538fb5f97ac9ee
│ │ │ ├── 3a7885343257c4daad268f5b1934a826a1c53c68
│ │ │ ├── 3a7f8314649f4b1ea9ae10374c44516a1ed167de
│ │ │ ├── 3a98446abbafe1dafdf6467105e39b4b3ece3eef
│ │ │ ├── 3b5655ca459fcbbb2db48e4348124a5ccdfef60b
│ │ │ ├── 3b9ae8f8a25d444c59a1270247f430cf295fbe98
│ │ │ ├── 3bd830ee7c67481ae21d95d13ffc8793e5cb3742
│ │ │ ├── 3d755d85c8e1ee1025bdc5aa030bdc4a0c06a25f
│ │ │ ├── 3d963490b3fc0df50b73118e2e1a1bb4a09d61b4
│ │ │ ├── 3e023e5df0d59d64f42ab9f5ad89ecd2a0ab38b7
│ │ │ ├── 3e15c44885f6b5352840137a9b866c0485b46c24
│ │ │ ├── 3e98fdbcacb8694a2769befec5a4e2353ef43f5e
│ │ │ ├── 3eb0664a2174915191d7de004028be88425a704e
│ │ │ ├── 3f22510ec387b9d2eabf548d3769ee65e5d90f7f
│ │ │ ├── 3f3e6c7b1b7642726117c1d720e16ec5cc63e057
│ │ │ ├── 3fc71eb9ed715b1e0a587cf43814d61b109120d5
│ │ │ ├── 4133dd03167b37f7616c84180b7f5bdd399a5789
│ │ │ ├── 4176ba61305e3d6e0e1a5e8895e06246774d3a39
│ │ │ ├── 41a5277adc28f12e96c02a8d19db84ea4251dcac
│ │ │ ├── 425b3a47c660a8fb82bcf45fe7689b731b869dce
│ │ │ ├── 427e26ec1c22efe40396413fbfc15a4a57e522be
│ │ │ ├── 428d56e4bdcd603e9a420d42cd9d87fd3698ef0d
│ │ │ ├── 4312a2b3509e1013895e89ff38b92bf136146317
│ │ │ ├── 43a5b47e2cfdeec0975d10c7894d525c71f72fd5
│ │ │ ├── 43aaa60ac35dca0651a97c6e370a568a894d1ebe
│ │ │ ├── 43fb9c4b4e2cc9139f16d7495c097e9a14bd4323
│ │ │ ├── 4409be6323597e5ad119c320e96d172571706e44
│ │ │ ├── 4420078c856ffa81a5266890d920f5852ba23670
│ │ │ ├── 4478bff69659a907cea72df2a2059581d71b5163
│ │ │ ├── 44df162c0f57ce6926ea116a8d03eb88bbf12867
│ │ │ ├── 453f95038223f34fe2ab00d4a99405f34c051056
│ │ │ ├── 454b6816d7c7be75b50fcc5a7ad9fee74aaedadf
│ │ │ ├── 46dd4e51c9bf4981be2100dcd3962cad4c5a34d9
│ │ │ ├── 46e5b0e24d7c4cdd47d2c3fc815f4c3d8ef6549e
│ │ │ ├── 47b57f91b156c537e9c0801772ff6b71b8c01a8d
│ │ │ ├── 4815e512372763864e4b2a637e1f52953a194a62
│ │ │ ├── 4819d7fc9f7d485cfe09402dfc85d71005980934
│ │ │ ├── 4847fb92733d4372471b1c19bbad7adf542fc3a6
│ │ │ ├── 486b91de9bf4c00ea89977753240b9237403a4b4
│ │ │ ├── 48975beba3bd399b8420c72e4c63554b121717f3
│ │ │ ├── 4899c24e722e5ce2701f8bb257b977107861ad0f
│ │ │ ├── 4a47878960f0a8cf0f11b595554b242317907881
│ │ │ ├── 4b04f909eb2b5a2d652931368e0aab127bdc096e
│ │ │ ├── 4b1f89f6085c6b8a86ee4210437d42ebad291b58
│ │ │ ├── 4be34d939221673686dc9bc8cd4406c8e169e5f5
│ │ │ ├── 4c4d585f991be147b6991e22063cf897976e7c53
│ │ │ ├── 4c8722043db14aba165cf9ee96a1fb3cd79e30cf
│ │ │ ├── 4cb6cc60e5b9c3fb5d0361a6fa4f9a2a6813bd58
│ │ │ ├── 4cf2c561bd45b371818fa4709f1125f73cd20421
│ │ │ ├── 4df69786a0cf9134351d8e28ad2e62cda5edf7ea
│ │ │ ├── 4f57f215760851af8377252a1f25149d4ef391a7
│ │ │ ├── 4ffe16f9377a92ea7effb3f09c610a110cb8d88d
│ │ │ ├── 505a409a657bfe1e88db9dd45ec24990ba32e83d
│ │ │ ├── 50acdfa5a9ba98ea3639f58a6b5b70b1d2f4d98b
│ │ │ ├── 512c26c9a771ce001117d884072bc18833450bb0
│ │ │ ├── 51a7d17fccd96e36290bf75a8727e84fc11b0bcf
│ │ │ ├── 51e8452a4a8d4252aeb955c519e7f6bf30b31a38
│ │ │ ├── 52538a80094f7b62948fd31e68fd17a315d8dc91
│ │ │ ├── 52e7a46f8f6118dc072c0f69b9e7d3e02862266d
│ │ │ ├── 539bfee4d15704f2dde2b4e767e0d12f3be7969e
│ │ │ ├── 53a184b8fa7ec2c93fc82380a5995441486cd2bb
│ │ │ ├── 546075e141b57d05683780397c7388cb86bbbf1d
│ │ │ ├── 548fad2d8e2e9e6cdde15ba111213e9983c3781f
│ │ │ ├── 549fa83e9a251645e8ad1e34ac7ffe7a379b35ad
│ │ │ ├── 54f1f92da1c7d7d06afe5fbef91ea15bdb311ab2
│ │ │ ├── 55956fd04658b981f87fa7f5d68b254d32d30437
│ │ │ ├── 55dc960ac862bd745f80c71024024b0954efe879
│ │ │ ├── 56343aa68a264d37b9bc7f1d75f0b9a9bfa8ad87
│ │ │ ├── 568c683601554f4426f52c9e2af37a0c5223a881
│ │ │ ├── 56c9fcd9bf53e0a04c76186133b07344590bacaf
│ │ │ ├── 5710f6607b0839be1daf7bd853611faa526af24c
│ │ │ ├── 57287827583cbb5a52b5fd74b1af2a299ceadb44
│ │ │ ├── 5782818cb627dfea720cc11a98b72ded09bcd197
│ │ │ ├── 579ea4dee000c5062f57e769b6d0509bd5ea9d21
│ │ │ ├── 57fdea3953089efeeccd4f114815147890b40be8
│ │ │ ├── 5829e42f4deb080ee51e9b991f4ddfd84081417c
│ │ │ ├── 58521eec7cfdd2a2b33fb59833b3c35b40781c1e
│ │ │ ├── 58e31f7c387ec92c66494a71a51c234e62f160ac
│ │ │ ├── 590764888ca03f657abf35ef756dad69290a29fa
│ │ │ ├── 59620d617852697bd4b91e8f28002834d36080bf
│ │ │ ├── 596c9490c5e275f1b8175f2508fda624f9ac4af8
│ │ │ ├── 599c4d9beb25d997dc652ca08de64f126d1dbaea
│ │ │ ├── 59afcc295007393c0c3f0e62cdeb7545760da2e3
│ │ │ ├── 59b354e1be703f8532d12f9a57cdcb673f037dcc
│ │ │ ├── 59bb934d4bba9714911b103647bca9b6a7ba5a7a
│ │ │ ├── 59e08ccf08163edca4e45282d4311d6f3fa7a1cb
│ │ │ ├── 5a27f67d52060a627027576cca4c0b5e1948f72a
│ │ │ ├── 5a2897bb168033e2e96081d56d30d2274ec842d7
│ │ │ ├── 5a341b6ea702c26a57c07bdee8a5f032c4ed373c
│ │ │ ├── 5a5e36df29ab9652a2cc35311e808a364bcc7b5c
│ │ │ ├── 5ab54a202017fcc1c2d08527e10196a3683fd693
│ │ │ ├── 5abae4dad22e24661b67467637911232891f078a
│ │ │ ├── 5b1e6ffa30ed75a86c0c12874a19b5b10c2dd4b8
│ │ │ ├── 5b676be8976b86a7e443bc76f83c3ac887bb0f5d
│ │ │ ├── 5bde424d1c997f07c00198e8cc11780f126b374d
│ │ │ ├── 5d0fcde20a7f37968cc18eb90d0623157a554daf
│ │ │ ├── 5d1b5cea47c0e1dff9b3c925e64f9a7218651cd2
│ │ │ ├── 5d5797a823266e7a4c5e850b3874d1a340a24089
│ │ │ ├── 5d92f55db06f0542d8ab73cab91972311dbd366c
│ │ │ ├── 5e4ed18e295d2e4cb1872fb8dfcfef354c65f0b6
│ │ │ ├── 6034938b94e09057e236108f7c4d973135752431
│ │ │ ├── 6065ac948ae92b8a6350f5189ab836af8a880361
│ │ │ ├── 60d7a017fee32cc92fb5c5e42cd6e74b7c7d28a4
│ │ │ ├── 61d92fa8f9e818a9408a503f8a5b4d691741630d
│ │ │ ├── 61eaa8f3c923e8e13413385b17db4d2ea93ed81c
│ │ │ ├── 62ee95f7e4960e071e0f46ce4038744cc628f55c
│ │ │ ├── 6415f9d51ad26a3c9362c4275288569308c3905d
│ │ │ ├── 644246ad89628db7d5d08d251c2f3a57ef7cb9a6
│ │ │ ├── 64a05ca17e2d486ae226bb222e83e4fbfdeec88e
│ │ │ ├── 65100c526fa10704acd0915a1008489916add30f
│ │ │ ├── 65a747db306b4a23201b005ade0323a2030d05f9
│ │ │ ├── 65fb333567279e5a1b08f9ee045b542eec5a7646
│ │ │ ├── 6647676a7c148fc6b6fb5886c613caac62520abd
│ │ │ ├── 6670935deb9f0c917df25d711abb52b6ebc2c8d3
│ │ │ ├── 66acc313cf86ef521a4ef841c5d70166c8d9d2d8
│ │ │ ├── 66c029f9f0a53b169a3a8f8c92e191d83545270f
│ │ │ ├── 67670443cf53b879ebe921f3a3c379a370d1ce7c
│ │ │ ├── 67cfad932dcb42458a452d601c3639addb0dda55
│ │ │ ├── 683e4f35b0ef1914153d21bc43f740f3eac6c00a
│ │ │ ├── 686c06014abdbec94bfcb3402d91ac733047f390
│ │ │ ├── 68799aa6061f3f23786e498cc42f3f0aefa94231
│ │ │ ├── 68b70365a89e2318cedf758e659d6da508cc857d
│ │ │ ├── 68dcb6bfce4a84a58ea17326523b925fb371354e
│ │ │ ├── 69b94f50055f5a01c7962b7e6235b0cdcd5d748f
│ │ │ ├── 69cfca233d3670768d5ac85ba85b332e2f7ed0eb
│ │ │ ├── 6a54680515d8232857f8a4de58a754c30fccac2f
│ │ │ ├── 6a70eb1bddd5d98b66b5a1893c92a0e73a3b6860
│ │ │ ├── 6ad5b9659a5155bed9ac113d8e7deee52d62ae2e
│ │ │ ├── 6ae22a67d479d89209ee12334523d276069443e1
│ │ │ ├── 6bbe7e5d318ade2a13b9c9218d44ca1cf15167a2
│ │ │ ├── 6be8409d04d2ab33d1be468d49a0059710e026a1
│ │ │ ├── 6c81b50612306793631a68580fd5d34572f8d646
│ │ │ ├── 6d09033d9cabf4be617ebcd83cd8170e7f91720a
│ │ │ ├── 6e3efdddb78bdba7450bae245cc28b0042cc95c8
│ │ │ ├── 6e6dd7a40656f0c504f240a41a338a50a6c38576
│ │ │ ├── 6ef19f1ffb221eff0e257019309122d61bab986a
│ │ │ ├── 6f076f34bbed47962f214a8e8852c0eabe0e1758
│ │ │ ├── 6fa96a3d1e975082d8c56152d0fa7982373b83dd
│ │ │ ├── 6fbabed93b030d4b0516f2695a92359e9968cfbf
│ │ │ ├── 7036f4840552da6b9c8d5a904737334e62648cc9
│ │ │ ├── 7084c77693211dd27cce1a604873f5c92f9ca55f
│ │ │ ├── 70f80935a4b4f54bab5539b4ee024385b81118b6
│ │ │ ├── 71265deeff02c8085a3951cffa16f54fd572b5ae
│ │ │ ├── 71a1fc6f2ff0611dca7a41512f3ec6f7e72ba81e
│ │ │ ├── 72655ec6a57d64f433af32673fc8d63dadb66f72
│ │ │ ├── 732bbfe36d8c5a3618aa62d1328a9f134a7ca8fb
│ │ │ ├── 733f120852413aa814e1956fd867f7e0b5049323
│ │ │ ├── 73439e7485457a52d8a40f1128028c392ab2647b
│ │ │ ├── 734ef59a248356f3fdbae3d2d9120407b24922d3
│ │ │ ├── 736e9a66d196ef004702bc6ace3c2af3cdd4717d
│ │ │ ├── 738ebb29ab1a7ff184d5ab708ddedec1ba221ba9
│ │ │ ├── 73f3d7ec16d05afe7f994276e031110285b3f135
│ │ │ ├── 747d1d8fc239dadcfda4548323e19bfd92f6256e
│ │ │ ├── 7483e4ea345a1ff384d3f5cef1ac2b7213cb1a8b
│ │ │ ├── 74c0fccc29fd0359b83292bba0f6d11a0097c100
│ │ │ ├── 7517d0db9588cf80ec0c91f3dc7d83032ebf35c1
│ │ │ ├── 754878bf3a1ebbb1a3cedcb83af75f4ee0f65e49
│ │ │ ├── 765ed348c3e7f35a07b113610979293c490a64e6
│ │ │ ├── 76834875c666cf6b91abb021e98a4299ade5bd53
│ │ │ ├── 76ee2a1367fb162a838a3baefcd88566885d3867
│ │ │ ├── 772830437e7bfed10a74c23a515709e565accfc3
│ │ │ ├── 773b297817ea5921527a25da52ed2192a90beb71
│ │ │ ├── 77de8f2d03293718b26415515d8e70be1c2ef997
│ │ │ ├── 780dbc4c61cb0082bb74f95881938400b612948b
│ │ │ ├── 787bef1f01133454c80c267bded9d23a84b7b8a2
│ │ │ ├── 7989c75f8d1e89653002b9883a313177ddb17397
│ │ │ ├── 79d4058f7d077630675f557b5f66d74f0fd553c0
│ │ │ ├── 7a1faa155f51b4375db882fa0c7ce03017a253cb
│ │ │ ├── 7a2afc7781a37cd254f9b65c24c994dcfa9c1263
│ │ │ ├── 7aea4c88333ff5326158c3b7e43ee15c0c9a3b2e
│ │ │ ├── 7afc80aeb53628dba9fcb0b6f6b28d81381c8b1a
│ │ │ ├── 7b4c966bc3a6b445cd358ebe02e1b36055d5ead6
│ │ │ ├── 7cc44eb804c3b386d97e6bc5a567ec256a489c79
│ │ │ ├── 7cedc7cf62fbde16a894782d28c433df24bc2529
│ │ │ ├── 7e201c62e4c0049752934e7ccffa1678ed227d4e
│ │ │ ├── 7e4edf0b29910fa87b141d8e8b872141a8ba5eb1
│ │ │ ├── 7eaaf100319e5d501d3dba3a67b0f2501cba6b16
│ │ │ ├── 7ed7c1915d9cf819cd1d96b1e62e887ba499fc5f
│ │ │ ├── 7eefa731cc6944c3f6117822cfc429795063b09c
│ │ │ ├── 7f01ba3016a3bf587984c4e9d7b6ceb6ca30c6a1
│ │ │ ├── 7f60e3e06a02e51c4a6e2beb7e7a7c268f7fac07
│ │ │ ├── 7f8d4b9ca6f4d030a9cd90e07eadbfb9129f1a6e
│ │ │ ├── 7f8da76f6019b28800f5796221e923215ab8800a
│ │ │ ├── 7fabb36f5ddb4211b75270d6b3ef84cfdc12393a
│ │ │ ├── 809ced773e09c0e9cead6154a530c1629377e45c
│ │ │ ├── 81e36cc226769da1c8c9636e9a874276c9b08629
│ │ │ ├── 81f1288612bf91bb7df561f93df86114037a511d
│ │ │ ├── 821fef9f40f59a9acbb3e06f9f49bcdba85791b3
│ │ │ ├── 8220668e727165c01e984415f8221183f2f1e2a6
│ │ │ ├── 82c7ccb025c7c4c537ca69a937a709dc15d3870b
│ │ │ ├── 83166d02c98ea686bc8a75d2d2610e344b76e8c5
│ │ │ ├── 83823088e385e9b31ed4bfd84db7694c6ac75e6b
│ │ │ ├── 8448e852473fdd61c6256f83f14d2f07a8d0d15b
│ │ │ ├── 8478ef6a1a799d43fd125e6d47de83e4257f3ebf
│ │ │ ├── 847cf8319de92af321ba43cbe424e5fd5ae1f297
│ │ │ ├── 84f5b07339ad6cf96edd5b32cd440490585e4350
│ │ │ ├── 8525fcab8d84e20cad9ed32bab412219ccd74a1b
│ │ │ ├── 85459285c117e7d51a56790ee8fbe85d8f26a168
│ │ │ ├── 854a57aeddf6299c162eb0eb50f0dc218263e4af
│ │ │ ├── 859366bbd30ea84562c37faf4af3ba3b4bbed3a2
│ │ │ ├── 867c1616c3eb0531b5d282d8ce22fba1df87e9c2
│ │ │ ├── 87ea03f1797f44000af994ef155cc18e5d9124de
│ │ │ ├── 881e6d5b9cf7899fa5c6b190d659e5c1e20c25c5
│ │ │ ├── 8908a33e0f06fbae87f9cff15b968a0a0688d5d5
│ │ │ ├── 89aa9c4d5ac13985c5391da519a91018bf45f59c
│ │ │ ├── 89acfc070cea5162bc410afb5f771b8fff77a86d
│ │ │ ├── 8a1a52bf23c953620c66ffa3e0b3275baad77462
│ │ │ ├── 8ae5720cc88be7a7b1c973d284af4b7d8601f616
│ │ │ ├── 8b30697215dcc838bf99cd400402fd4ea4dd6665
│ │ │ ├── 8b6ce570667c4c7be2881c4cd16c0b65ad895256
│ │ │ ├── 8c5084438799846a173535d5bbcf96b9f44f6b64
│ │ │ ├── 8c72b837232707b527e469f91b689843a16606e7
│ │ │ ├── 8ce9fcfb6d981d5dce2dcc0f759fbf25d5e2a393
│ │ │ ├── 8d22b47604cf67a5bf34bae2b2a50a6edfd268c0
│ │ │ ├── 8dbc3f760c69d064c71aa539ae964e562c22867d
│ │ │ ├── 8e19ed5c48121c44691f3dfd08e6b93e597875e9
│ │ │ ├── 8e9774faccd71983c83a67dd04459f6ff68bde52
│ │ │ ├── 8fe06eb9f3c8cd5be235d857d5002420d4452349
│ │ │ ├── 9043db26234c001b9e17a3b54027d738846b85f5
│ │ │ ├── 91379bcb0f7670a5064195bb5e3d2d30d5f22781
│ │ │ ├── 91875cd979df03ffb5e8971f4162e4bf3f7472f8
│ │ │ ├── 93315008562da002a94d75ba7731b5b05a43d57e
│ │ │ ├── 9331ab5a89760874dfddc96e3f9abd6da916bcca
│ │ │ ├── 934c02db1df4356e679041badf3e2af90dabd63b
│ │ │ ├── 9392192d8ad4b4d3ab6f9938cfdb5288906b849e
│ │ │ ├── 93a2ddac81e6b949d793a9ab6c5e082f3a30f04d
│ │ │ ├── 93c4cb3f2193b404a2cd713434a5c4cc563151ba
│ │ │ ├── 93ccc352335191167ecff5573bedbee43f9832d5
│ │ │ ├── 93d47af5f2eba2dc4230855f8dc77ac1a6e144ee
│ │ │ ├── 94108451f94018cbaed1f4913759c9af14c6969f
│ │ │ ├── 9421693843d27aa21ff007b8b71e25cd1935ec0e
│ │ │ ├── 94a9a6343361ed009470e2835593058525a2f072
│ │ │ ├── 95025f82238a29a6ae080a12d959aeb726d5954e
│ │ │ ├── 95f0e91b9c57bff27a7a5c76915874f6b5fe1c80
│ │ │ ├── 9642a7bd104bb9a960a2d57ded01884a1ea84b4d
│ │ │ ├── 969d6c0c7a30925e1ea7613d2ca4e09d34300375
│ │ │ ├── 96f2a91788c81e2c1b3fd7e94a76807ba29a30fc
│ │ │ ├── 9702a14c7130ce1d6ff27d3b04e1b1d97de6f814
│ │ │ ├── 97c2398e81c6333849867e405a4b6de93714a896
│ │ │ ├── 9823ee93266d25cb71be86a265e9cf1fae926c42
│ │ │ ├── 985a10af3bc143c2e6286767ad947eee61187576
│ │ │ ├── 986aebee3677f08fdbf4581176998c0dd87bd844
│ │ │ ├── 987d52fb4cf857bb3e89e8c67c5e635b74335d06
│ │ │ ├── 98f39d24e575a191c9b11c7794c84011af954f8d
│ │ │ ├── 993bb1642c92359dffec946a3e1164580d2ceb41
│ │ │ ├── 99ffd4d993cb2735c23bf90be6ac933d54543b69
│ │ │ ├── 9b232b77fb0cfab45e7121aaff84f753bc4bc266
│ │ │ ├── 9cb7930612cd3e8dea253311738bc71d3870c598
│ │ │ ├── 9d25654e7fd9d53279846c06f879d2e41e9c4b3e
│ │ │ ├── 9da5df56b0ad5c443648c491562b9f897f0d8631
│ │ │ ├── 9df95cc5200e5e856b1148cc538e5dabfd8e0419
│ │ │ ├── 9e274418d86f267e9a4bf459aded615c27c589c6
│ │ │ ├── 9e3bd5d1b3e4150a8fcb98b13e084b6077b22120
│ │ │ ├── 9e6c98631fc5f747c926dd3d13baa8b80b78299a
│ │ │ ├── 9eb6f2a7c93900eb07e8ed0280f751eb34777bf3
│ │ │ ├── 9ebcf31b7d6d693c44d7bc0476660385c568be86
│ │ │ ├── 9f90e4a8b538c7adb359d3b5ba992d1f3f6d9528
│ │ │ ├── a02e52e9e9a8ac83f293715426f5b6ab763a352f
│ │ │ ├── a0ad8d8eeb79079f1b872fd1a88a10995f30a928
│ │ │ ├── a140a6232f3cb9226c265c53b1fef83cab645efb
│ │ │ ├── a20ed628e379f0f3def7bd9a7b4a4d49aea25e7a
│ │ │ ├── a2a96e13ae35d062033f472520e6cbae36f57781
│ │ │ ├── a2b6a1285ef7a9358b301dadba51471d13cabb53
│ │ │ ├── a317ec712245e1569aa28690ff19e1674f7c3335
│ │ │ ├── a33b399f12f4d5212a07df335429fd8ccfa6f635
│ │ │ ├── a38d0b76348af41c0f8643c8ab8ade8a6d6798e6
│ │ │ ├── a3edd853699b312701b618b9f973b2f92dd92b7a
│ │ │ ├── a3fad58f05c6bf8d23d243dad96c1bb541b75ea2
│ │ │ ├── a4a9ad9cbf03f5800fd171c2ffffd81009591b42
│ │ │ ├── a4f2c0e1925ce3d6893786d364e1b9a06ffadc04
│ │ │ ├── a53221c14b49b9fcf2951bf49b1e32b974f93b34
│ │ │ ├── a58d07ecdd996c48c967f35794da52bfdc9d9cc9
│ │ │ ├── a5ab8d7a8b7d53b1474e78c99f514f70da2d895a
│ │ │ ├── a61ade55f542deacfcfb946a5bc53819d615b008
│ │ │ ├── a65176ad784745e81ba4d85462fa977059290a87
│ │ │ ├── a69aee9cb505d840ec7962a9676ce91d615c066e
│ │ │ ├── a708f3d79e9396806e3ceff8fa0b5d3eb46a1fc3
│ │ │ ├── a74126abcdef01934de26324b4f1647ddbba34f5
│ │ │ ├── a7fab50188e302639710abc5750199df8dff80d9
│ │ │ ├── a8a9522dd4b2fc4c36a5f087c69350a826e5f305
│ │ │ ├── a8c14a4fb0aa6f15d64e3340dfd3f59e5004e0be
│ │ │ ├── a9244691122d53f1a4190b7117879ecc65d3c426
│ │ │ ├── a9e90c6ec7cd49cd3a1add137f933c1ba79adac4
│ │ │ ├── aaa1d866b084e9aada7d40b8ee764884f77adff3
│ │ │ ├── aab31150afd7a0b5ba80f4512eec29f12f39c346
│ │ │ ├── aae36396f6a55a43040f1574e50f495b0cb363e0
│ │ │ ├── ab33cfc6d11519cf4744aac4ba1a4c2abd677bfc
│ │ │ ├── ab3e8c13f2e3c85d17ed7947e8421fd7a62d85c7
│ │ │ ├── ab537eb8c433a559bf8efb34e87b41ad6e725314
│ │ │ ├── abb044385b74f700122d32ab4a64d4e28ff5a32a
│ │ │ ├── abf70ebcb93428c340eaa4c7240df5f79d4f302c
│ │ │ ├── ac40ed1be457ef187e140d6b6d90bbb971f3c2f1
│ │ │ ├── ac75433e415c6df2c8b2638098a5141d99da02a0
│ │ │ ├── ac9231da4082430afe8f4d40127814c613648d8e
│ │ │ ├── acda2d9d5b554b0f53adb144abb75d972282cf8c
│ │ │ ├── ae93c08c9d7c90e4813d0021ada85b962a562add
│ │ │ ├── af3b9bd27d7e5dcb95714c3530ce91b55a981fcf
│ │ │ ├── b0b46f92ed8ea957d824b9447b02e949f92e24d6
│ │ │ ├── b13513de1c9826bc3c7cc55362cb58087b75d8dc
│ │ │ ├── b14de216ecafefd04ecb73730da3312b8e15f6ef
│ │ │ ├── b1f3d1813d0facacdca7d5432f296dbfe1aaa859
│ │ │ ├── b2276f89583f7d7e5bd602fa87a9199acf768687
│ │ │ ├── b362bd32d7990933f382be1198e53ef7d4a97d27
│ │ │ ├── b39a9effd3f1cb044030c6af2b5dc6a54ba5ed97
│ │ │ ├── b3c3d160a1faee32c77b84efd141bc451c68aa33
│ │ │ ├── b3f79e287968cb8c26586f2c8d42be14ae40b8cf
│ │ │ ├── b41a9289be7e5215b00cce1a91aeae890da431c2
│ │ │ ├── b4ac86ac7dbbf0415a1e462582492684cb23743a
│ │ │ ├── b574ba06098c1afdea78675aaf1569a000f2835b
│ │ │ ├── b60a4f470e0e038fca64bbbd7116ab78fcd148f4
│ │ │ ├── b6d2a7bbdfd97ee8dfffdfb8d3edf8902a982ec6
│ │ │ ├── b7f743b36b59a994d2c806f5c64c470f575b51b2
│ │ │ ├── b88002381964743d7670b9c81f5511b3fc15da71
│ │ │ ├── b88d139b6562ed3f564b616e1a4bd7c1e65d8a97
│ │ │ ├── b8bcdcb212094ff70c464992a2c03febfdb4ecfd
│ │ │ ├── b90502b3d5538ed552c4e702cc6714f3aa97f926
│ │ │ ├── b943239ad9ef623a2d97cd8fbd001d756253e40b
│ │ │ ├── b9c0ae1ad5ba0c729cf327cc9d209b0e6d1285df
│ │ │ ├── bb0feeafe988ab44f047ccdc879026152918268b
│ │ │ ├── bb49ced094472766db0fbd2048b2644122a4a639
│ │ │ ├── bb75c608f1fe390f7816c33e50b3b4906af571e0
│ │ │ ├── bb899a8c6ed71c59b53901deba44a99d2b7eb886
│ │ │ ├── bb8f666b0355e60c5bcb897a04522229ebed317e
│ │ │ ├── bba5c5e181ef932e33315fc49ff1bb4d8e0f977e
│ │ │ ├── bc16699053f9ab73607dc50b9752e85a280f854e
│ │ │ ├── bc4c2c86309011b7f73611611f37da66317b5720
│ │ │ ├── bd2f72b2bef60ce1fd70800f843b7f1283625c6b
│ │ │ ├── bdb41a47e38dcb3c688b4f1829ba713d289f23b5
│ │ │ ├── be0f6b0f8cf4919efe3133b7f76f21fadffd0755
│ │ │ ├── be4efc357ca34e9db016986bf6169cf95d78e1be
│ │ │ ├── be59a17adc51a4d466ec7d57c539ef17cdb831fc
│ │ │ ├── beb284f1b5cc942e94f6877a19a4ed4848243528
│ │ │ ├── bec328eb38dd7331a5a009ad61e66916d2df091d
│ │ │ ├── becbaa09e52ed9ed0cb37a7d4df41d925ade8837
│ │ │ ├── bf1248afb100ce4226f3de45e651dfeff7a2cde1
│ │ │ ├── bf3159c322a1c15db6b80453cb45976e405ec42e
│ │ │ ├── bf9556af2c3585a3d3180c38f2150a6c18e64c5a
│ │ │ ├── bf9f6adc6668b3f0da401f6f4005ba703127be41
│ │ │ ├── bfbc1e675bccdd6ce0bd5fc2706705d58dd4a5e1
│ │ │ ├── c05d7d42ef461c9ead02bd4012be390ab3b92eb6
│ │ │ ├── c0e74fff7c2479d1b5f9d6a7df85d5f78da4a939
│ │ │ ├── c11332f3788e0c0236d4d627cb3e7856997819bc
│ │ │ ├── c14a57609a6a58060b81330332ad629a8d45cc3a
│ │ │ ├── c2a6d65b5645a525ef06ab4b466a7c8bb3bfee6e
│ │ │ ├── c2f5fd0faad5f816224666d35f047fcda1c8a224
│ │ │ ├── c31b9424aa17d0102618eb1608fab59f79f27e7d
│ │ │ ├── c3a2e62abbef20428b4cc687ac795a60057a0866
│ │ │ ├── c4ca15b14cf6c1246254a62ba8651e3b5a94b0a2
│ │ │ ├── c569a3a3dea044d635c62769aba7a1e76c1983f8
│ │ │ ├── c5d6b59970955ae03e3c56fd7c4150ceded8aaeb
│ │ │ ├── c6f22b7ad3778eb8ffe79bd79a71a7c28893ce8e
│ │ │ ├── c753c5fea0dbf5282e637ca24fcebf496fa4ce31
│ │ │ ├── c79e61953fbb910938759fdfb3ebda1d62b82499
│ │ │ ├── c7e01bbc2730038451db0eaaf8e530ce28668929
│ │ │ ├── c90459d77a383615949d2e808d4a3bd3d198dee4
│ │ │ ├── c96830151dda74af4973627ac0789755c8de9cd0
│ │ │ ├── c9793fba7622ca0db4bdf0dcdd2df5e3e24561a3
│ │ │ ├── c9840c279bc6b68a10b7959750b6d0f6d3f15339
│ │ │ ├── c9d47ee5ee3064a0e2972c9f212cdb2400da225f
│ │ │ ├── ca24779494866cc547770d0b2ec5a43c8a744271
│ │ │ ├── caaa071fe54304538f3207fbf66bc7c1b5d680a1
│ │ │ ├── cad7c5efc1e0ebc31d28d18cecc2cb382443c824
│ │ │ ├── cb360d503fde114d017d680a286499ff579be90a
│ │ │ ├── cb44f6116eb9631724e99fe30677e028a0b5568f
│ │ │ ├── cb602e102239c4c276c73a524e234a2c1da62017
│ │ │ ├── cc6f4756269c2b84d14bc9422d556c9ef72a5bf6
│ │ │ ├── ccba8877eb7f0b4e8bdc969242b3921abc1a776a
│ │ │ ├── cccdd183c934dbcfb8492a68e467b851a97896f8
│ │ │ ├── cd08699bed6c9d29a67289ab2305fafdb862c45f
│ │ │ ├── cd2644eccfaec7cf5f378bfdcadfdb92506dcf18
│ │ │ ├── cd62907dc6aee1f284043a6eb103723d1969bb89
│ │ │ ├── ce193ad70db095f95c56031da339f6e4b96400e1
│ │ │ ├── ce221813e299675c5af428b5649d79ee23ce6630
│ │ │ ├── ce90c152ace3aa251b342ac22eb1522c5ce70943
│ │ │ ├── cec3efa20e95f7af9b842ae24be68af28abf63a5
│ │ │ ├── ceea2a35b3d5416bd9d553e451af62d0579558aa
│ │ │ ├── cf58f5a7938675b1da395cd5009aacf0291e72ab
│ │ │ ├── cfb58e92be2e063dbd8687393031d00a30125832
│ │ │ ├── d011c59a517c0daa0143e1c766d8b87a41a7fa12
│ │ │ ├── d072decfa30d0371175e20ee38b05c9ccc7f68a9
│ │ │ ├── d0a8af1edc551c261131f21d23d58b9db266b940
│ │ │ ├── d0d5b0b2490054fdd6c1ea835c0161c071bb67f5
│ │ │ ├── d11bc46eace7717a3d134e7c5a8c468fd8eaff4d
│ │ │ ├── d2ac5aa56bf5882ef4b27d787150a82de4069be7
│ │ │ ├── d2ddbc3ef8d13cac2e4337a5852632e13f1bfb8d
│ │ │ ├── d339f3e0cae035f11e9f19fec80b9d29255ef2d8
│ │ │ ├── d34a4595e58bfd788a4b9cf02106e8e44fca9473
│ │ │ ├── d34bb927331b2dddd2f248a93f7b0f53cb177c54
│ │ │ ├── d3985a9e93af488c713e3a1feafc3e7fef2c980e
│ │ │ ├── d3f750d6b4d915fed75bc7ad88f3d82f23c27f50
│ │ │ ├── d4321f2ac05328ea41c9c1045c78e939af7cdacf
│ │ │ ├── d52bd0ec6d67f5184f7de68faac19b8b11a08960
│ │ │ ├── d5be7ec57e86f029397fc586937abb40078085c8
│ │ │ ├── d60a063085fa8dba51fe0640350cc78f4fe5c565
│ │ │ ├── d66e5cffb67f3d615d587ceccfe409d9442416e3
│ │ │ ├── d7c91a57314937a25b31615083bf5e10b74beb31
│ │ │ ├── d7dcf33f17a0b7d6cdb1d7103fdb31113ce69384
│ │ │ ├── d857f04d2b9d2073c2743fc24c16f8736d1ed68f
│ │ │ ├── d86e699921d8e49002b2e33ed2ea04369166da7c
│ │ │ ├── d8f6191df64ba8ef6e4759a74a73097f776e0c10
│ │ │ ├── d956cbf07fab7f42db456c2f50921e86554f9b23
│ │ │ ├── d9bce5edd0e21e629ff0ecc37ba9dbbb1f29bc2e
│ │ │ ├── d9d90bfa5136b6c318f92f94128fa3bde7e6ca27
│ │ │ ├── da80d7e083514f87ba838d74ad1b2c98b9fed419
│ │ │ ├── db3bb05bcfa7783a1dbd58dc240eda6d3a104dcd
│ │ │ ├── dbf5a58cf0cfbf387674323820191e9837860174
│ │ │ ├── dc92465d61984db69c690f80c539f9b119f9d09b
│ │ │ ├── dcacbb49d94a7729c8608b06e31bae8a4597e246
│ │ │ ├── dfb24d6ab7c1a92d0fb92a3cc5d111213607ed49
│ │ │ ├── e00cee8ed923fdc8105bd5c4418b396c5ea1f278
│ │ │ ├── e022d1c691a88cc2df83f7d9503e013899e53c3c
│ │ │ ├── e06fe8074578679152c8082d6b55e007f0c3c3c8
│ │ │ ├── e08d340c4870ed1431dfe162dbf931e10fc76430
│ │ │ ├── e106d00dd9c2a7a4dd721ea7a6d617e1e21a9ac1
│ │ │ ├── e10f916921ce8b476f91d145bda76fb23787e88d
│ │ │ ├── e14a2470a4f402d30293d7538fb84d76f3814196
│ │ │ ├── e1652830349ef5a8dc30eec097d22041cb015d40
│ │ │ ├── e1f51b9aaf0785fb395387b0d8e5733eb7c6008c
│ │ │ ├── e279d214fdbcb9d2c3b9f90062f14a9f39017d8a
│ │ │ ├── e34acc79f5941fa1ccaa101c1015ea815cd843af
│ │ │ ├── e3b38049b5277cd9596ee43c6953cc420c3782f1
│ │ │ ├── e3e2edba8a6be6320d7ff0b4a049d7cd75a75304
│ │ │ ├── e418c7b6b8d106a0ea681d381403fb6f00fd56e6
│ │ │ ├── e421bfaaabf1ab691fd3c13471119b925de71d19
│ │ │ ├── e4819d9c3bc01198929c67e156c95a62f7cabd0c
│ │ │ ├── e4c832c5f1412c790e0ebe0cb20d4a9489e149d1
│ │ │ ├── e5da9535bf401769ad78966c932fc919dcf36aec
│ │ │ ├── e5fa43484664374bdb153b0315aba7d7ef2ed464
│ │ │ ├── e744b1ecf5bd340d5522d4b608fc164d17308294
│ │ │ ├── e7aed65e670bbf348ed492549e7a28017d5cf225
│ │ │ ├── e84115eb6032a5cbf75bda5aef9d638a571e68ba
│ │ │ ├── ea7acc086c154c8cea8abe427f69f3a234797d15
│ │ │ ├── eaa374716efc258e63506cf13743241b64cbb731
│ │ │ ├── eaa9c5f0c68681e4402432fc6534dbb4e5695aee
│ │ │ ├── eac08e2c4c3a7d9e316a88c0be076eded430cbee
│ │ │ ├── ead5155a5d7cbca69077914d884add26b79b02b7
│ │ │ ├── eae3a4bfdcab18f828e69c3cefd8a56c71c7f4ee
│ │ │ ├── eaeca33ae6a5414285bb521349377907f9c2afbd
│ │ │ ├── ebca7eaa6948de95f9e57dad5a372fc869df968a
│ │ │ ├── ec4537c3b151fb9990b3c09f45dff6e271446152
│ │ │ ├── ece0a60dd2583742ac7ccfc24beae6a73f0a9c33
│ │ │ ├── ed67d1fee3af43b92e81a23882543ce3b4ec0ab8
│ │ │ ├── edd0a269b7594331cc714ea4dfeca4d8a6688d23
│ │ │ ├── ee6219f71819b65fa95222b93c2bddc82f1adcce
│ │ │ ├── eee7ecf446a291e3649faa04fa1adc9414cd3c81
│ │ │ ├── ef21118da751598d6ce8387c31f4fde8bfe44e60
│ │ │ ├── efb74dd14a3740edbf6d72823a5898049ab7e5eb
│ │ │ ├── f03afa505315ca288dd0b10f9f7e2d57f8bc6af7
│ │ │ ├── f07d5fc54ab668426f71ea031653863c66904f0a
│ │ │ ├── f0ad8c452f85505e4f1cfa69ec5a3693a75aa98b
│ │ │ ├── f0bc2466f4b1f0f083a52f7fe45d80474e813b34
│ │ │ ├── f118a3fcad3757ce22c34598bc851e77bfa7309b
│ │ │ ├── f1d2a13f4e94a883dfd70e20fb38687589400fad
│ │ │ ├── f1d826f53231b45009b900f3540e13ca94e8026b
│ │ │ ├── f201010c3e3dbbda51e1e456d59b42928d860793
│ │ │ ├── f21c96536c236331637e0a761cdbd5c3612731d6
│ │ │ ├── f22199c6f3773d4cf002c1b58b8cfb37a5beaadf
│ │ │ ├── f28b960b0a1d9b97eaab31ddc14775fc9ed99779
│ │ │ ├── f31b31b81d274cb4f96439fe749c7caed28b801d
│ │ │ ├── f39877f1fc7de9013e66fee2ff4997f68795e191
│ │ │ ├── f43845bdefe61e740268d5f2f48aec5b83676232
│ │ │ ├── f46167d1279494c15ce82a7990b3848dc8941cd6
│ │ │ ├── f461e6980d824985487dd963d161dc7d85863e03
│ │ │ ├── f496806a427f06deaa598979600d4c15291e8df5
│ │ │ ├── f4a01768090d97a8011fd742282fa5b06d0e85c8
│ │ │ ├── f66a35bea8c82002b28a6ffa8d4b7e4d2b4c7bfc
│ │ │ ├── f67706cffe897721ae0ed6e51fc624c6bf5aad99
│ │ │ ├── f75ef0494ca0f3ff61659b350279d36f07799c0f
│ │ │ ├── f83037182509e2adf47331588bac0ef1e01aead9
│ │ │ ├── f8353de5698e7ab6f0994665e1d9dd4daf2bfc78
│ │ │ ├── f85438f9737c03c3885abc5f94d964b427f894fe
│ │ │ ├── f8e4a10eba83c793ecab5bbbbe6312533e909007
│ │ │ ├── f95fc4e086e7e4582b777ad7ed4985e20fd76e1a
│ │ │ ├── f96b6cba4b62a13725fed9444f1c3e279cc8301b
│ │ │ ├── f98d1ff99f71404585fd5a3d6a9b422e6121e9ef
│ │ │ ├── f9c803b5d3417552d59c889b737b7d7ce7ad41ef
│ │ │ ├── fa25d549af9e6a4ed9f7b2090b692b1d74a32afe
│ │ │ ├── fa9f549dfccab858d07cef598db8235e3adf5cb3
│ │ │ ├── faafe2a7b5507fc44d2a687d969745e7d1247cde
│ │ │ ├── fba1635ad39cb6e3867ddf2bf508ca8b6600dfa2
│ │ │ ├── fc8a2cfddd6423d3d354875e6412c9c6236b4ac3
│ │ │ ├── fd118a2e92c8dd4e7f6e5a26fe7c286df3864d16
│ │ │ ├── fd1d17d11a0d9160f3494f3fa7e22ee4ba0c968f
│ │ │ ├── fd54567dce80d6a21fc95ff0e3602fad8267b73c
│ │ │ ├── fd563a383be0f7f20fba3817445fec8ae38e2b78
│ │ │ ├── fd6038ab758c718b24786626bd6d012e99bf2f61
│ │ │ ├── fd789be0f676cf6f23f699b761c92f4bb077c134
│ │ │ ├── fdb0adf079db060c927f6bf90d00489b6f584a38
│ │ │ ├── fe2b23f8be0734f9dc02a94a5984a6fe436c84ea
│ │ │ ├── fe7df2679b3f754104c0cffcbc878e62216b82c2
│ │ │ ├── fe8d3b3af9f58aedaa3c8b3a6ab85f500bc336a6
│ │ │ ├── fec61e48de8c26286a5e82576c3ea1cd44fa00ff
│ │ │ ├── fede864b3ab976286ee6f68c0e30a4e7d90e02b3
│ │ │ └── ff34dbdff43ca162f31d7a3919ebfe793a24c9cf
│ │ ├── packet_recv_server/
│ │ │ ├── 0013cd9e254b065d48e6ce7771b55201bd8d23e1
│ │ │ ├── 016477e7448388cde119cae9e8dc4c68c91a6fdf
│ │ │ ├── 0186e17c93baca5bbc432ffc934c259267de264d
│ │ │ ├── 01cd40944ade67741ad7563f1c92e8a7f8606794
│ │ │ ├── 021741ef68065a2338ff52e6f1485d5841aab611
│ │ │ ├── 02489298aeb96ff34c7d8d38223246f70c057890
│ │ │ ├── 028e6d048fa899630c4378c57478158fffdf4094
│ │ │ ├── 028f03b79d43b8a400c99231df85f2ea4f6d7772
│ │ │ ├── 02b2454721dbeb39e3e0729adfa15555ee2c2cb6
│ │ │ ├── 02e9f91bd8d346e657b7498883196dd923493c7d
│ │ │ ├── 030e1392a16a9771053dd34ca49bf92936cd5f8e
│ │ │ ├── 030ff39991ddfeee4bf173d67ad1e453ab1b1a32
│ │ │ ├── 03214b8fd3a238b47c630fa5aa8c2be623236bf9
│ │ │ ├── 0356795fac21e810748da96c8a50db49551204a9
│ │ │ ├── 04bf26c3d7a9a7884bf9b8b2df57a1b749991305
│ │ │ ├── 050227b7565fe0f375c191712b3e4dbe3deb5fed
│ │ │ ├── 058a55056aef705e6e95fa2f75daf07800de3ca6
│ │ │ ├── 0603fc61520c6513c6a0bb3bccbb7515f594caa9
│ │ │ ├── 06d9f4a5b5b33f9cf47444c8c28f76add12981d1
│ │ │ ├── 070d6670316e15c78a759e7aaaeb218184fef772
│ │ │ ├── 074a556fe49e356f482237e7dada61ca88205d09
│ │ │ ├── 0783df667caf30cd0e193cbd24ea41ea92bc8284
│ │ │ ├── 07f3432ad50d5053501394d9855ccc7a07fcd363
│ │ │ ├── 081ab247a79bb29dc252b3202b06dfbdaf45e20b
│ │ │ ├── 085a4034b571ea67b22c620976b2a83bfbdacfa6
│ │ │ ├── 08bcd58f3a4724ab06647d2ee3b91490de9250c7
│ │ │ ├── 0953d84043beb92d5042a1d06950a3dfff0e4f4a
│ │ │ ├── 0987e67e3c6351c62512d09cc549930ec6440ffc
│ │ │ ├── 099ce796cf393fc29659938312faf9c0f813a368
│ │ │ ├── 09f4cab5f83076033458c242fb1b47e7062e2223
│ │ │ ├── 0a164982e9286ea0fd8e0c761952908645f452dc
│ │ │ ├── 0a43d732effc661c7f1703b04f69a4be02c6e4d9
│ │ │ ├── 0b6d8fcf7cfbe0e5d23c7d0762e844305eb5fd06
│ │ │ ├── 0b78920df078fbb79d73f9bbe501717112c1e06c
│ │ │ ├── 0bfafd4302a5e07071edd5ce1b5c85c9bd3684c9
│ │ │ ├── 0c153acf0e57f342a684d0cd34d3d51e59080906
│ │ │ ├── 0c4387e5a588dc52fef733aeb70f01e8b2b37b80
│ │ │ ├── 0c6b2872e85d9a137f33ff0717c290e6dbb11e2b
│ │ │ ├── 0c977a38396b4943533ec24478ef8f32a48d920c
│ │ │ ├── 0ce69145a94539ed32ca4c46bd09e97ce14f6096
│ │ │ ├── 0d7bfc9851e279ed49724487a6a4f5a32632f2f7
│ │ │ ├── 0dba5cf601fe445790131d8bf773936e6f2e2570
│ │ │ ├── 0dbdf7dccfe92f037f592d9a42d23635e74511d7
│ │ │ ├── 0e1a34943d5f635c9cc5e71690952f5295e50c5e
│ │ │ ├── 0e49ff9db8977259783c18f9aafa6420af7afa42
│ │ │ ├── 0e788cd7fe9c8599f77ef2aebe4ed1a2642ca345
│ │ │ ├── 0e8067d190570ca94b6ce0252d8783c738c3c4d2
│ │ │ ├── 0eba3e1230474f81aedc3895ab9ea398655c380a
│ │ │ ├── 0ed1948874e2bec6f8ec27ad0dae149c31c49fcc
│ │ │ ├── 0f4d4798761e3b22377802a4f65d671cc599f5bc
│ │ │ ├── 0f8c3f4536b04982fddba495fdcbd0e0f3a1d7f1
│ │ │ ├── 0f8ef6ceeb4575960e48768d1922b8edf6e3fa32
│ │ │ ├── 100e11e18e90aef99bfddd387410cf2fa4818d5a
│ │ │ ├── 102de67398c19f4e6a005a8c449804649980bb0c
│ │ │ ├── 10419474c409fa2fd3722f442d9bb46da65345f9
│ │ │ ├── 10c31059672334441abfdeac680e4e2de4304a76
│ │ │ ├── 1169ac8565bd7fb55944f116844953320823d94f
│ │ │ ├── 11753bd6f2c47bf942a83e927d8423b4d980a0e3
│ │ │ ├── 11998dd3bcd4a4a4f491f24e63fafeb0cc91ccc7
│ │ │ ├── 11bdc99b0f63030ace38e71a575e2f142776c106
│ │ │ ├── 11ea4a6ae6f7514a942ab236b2f19b03d69ca38a
│ │ │ ├── 122c86de48fba44c550a8178e8d259012eedd6f3
│ │ │ ├── 127795387713509f6438f195606470a6e0a28593
│ │ │ ├── 133a068450f5e152c922fe15d77242f051be147b
│ │ │ ├── 13b90d438f847d5ec84404198ccd2c668d39caf6
│ │ │ ├── 13c4cd92c0ddeca05a3f1969ff6e635cbb48daa3
│ │ │ ├── 13d7aeb13fa900614ccac179c168bc367f77ed3a
│ │ │ ├── 13e0b3f79284872dd909137b79b9aab121e5aaf5
│ │ │ ├── 1473abd4c69e6b819c26c62e58da3cdcaf67d837
│ │ │ ├── 14a784c025fcbaacdf5b292d93d9c22148912a8d
│ │ │ ├── 164d31e4665dac4a7c50c7a898234268a59bdfe4
│ │ │ ├── 16be416073261e157ae4d6237bb2f7d2a7ea73ed
│ │ │ ├── 16ddbff019ea726453626bacea8448a330c9c4f2
│ │ │ ├── 17609db057519c56052a6b97e03467cd986c63d7
│ │ │ ├── 177c418dba6187a60d4432d4b7be87e4bb4e21b0
│ │ │ ├── 17f67a57e371c4103b610735c7d763330a00aeaf
│ │ │ ├── 1941e4f2daab1b2517e8228892a3410a37bd7e46
│ │ │ ├── 19f01f5f555f7d1bf9cfa057f093aa0d2ebaa1d8
│ │ │ ├── 1b5093d4d58c15b9ca1d2d0b39d15deb0701b678
│ │ │ ├── 1b5240f05a456f62196a6655a42112a31c87e3cb
│ │ │ ├── 1b9533a6cc09e74ff6f8b21db0bc74758356f5f5
│ │ │ ├── 1ba5118068e0cc65623997005da16e5b59e1c537
│ │ │ ├── 1d0998bf5f3294d54e2f0bed3b97dc50227fddf8
│ │ │ ├── 1d2c0d38caadde65b0f5c5d31d5ee8c82b990dbf
│ │ │ ├── 1d604d15131607245c7190fb47f68ef642928eda
│ │ │ ├── 1d795f29b3210c92b4998d15961095cec6c3daa8
│ │ │ ├── 1e0e54bfc9b4ed9292d6bcaee332871d1401c48a
│ │ │ ├── 1e240165ac06e426d72c96bf5b988ceeca2d0d64
│ │ │ ├── 1e46adbd6d1a371753fe9cb54531117a2bfe5dbb
│ │ │ ├── 1e929822d3d0af01e87bb6ece1f3cf55a1824eca
│ │ │ ├── 1ed7a963b9d0ab0be7b9cbbe9fc464d2197d9596
│ │ │ ├── 1f307ee9413c655e3f8f6eca2936610ecfaa4a62
│ │ │ ├── 203ad8c3d24ed2b95f1c54efca7219926cf2a4e8
│ │ │ ├── 2041e9871a0900c21d1cc7fef0b8f2849e39b61b
│ │ │ ├── 20afe24e09c20f3189feeccb6cf96d8f8d9b0c8f
│ │ │ ├── 20c66d1de2498367b54abc8b34835f0741008f8d
│ │ │ ├── 21669358d7c680879ff9364d1048904909c74cb9
│ │ │ ├── 21ab874329347c871cc50797eb1c3c9796d6292e
│ │ │ ├── 21add77b6c7cd3538fda81ad2bbd29f87a2620d5
│ │ │ ├── 22412656e02124c40f221ab6e4b86cb2231215b3
│ │ │ ├── 22aea63fac472d5a41ecb29bbd7aad87e09c2bed
│ │ │ ├── 230b827f7b146154efc74fbb499ef01b98421bba
│ │ │ ├── 239526fa9fb88552fd042d5cedade76ad87bf668
│ │ │ ├── 23ec706911a6c7ce8ef2f0815216017585c884fd
│ │ │ ├── 2416b12c35a58e5f6cf2bc0d33ad4119f8208714
│ │ │ ├── 24b39b83b851decd681c0cf32674165fe0d9a459
│ │ │ ├── 24d6a77a6733b19bf989312d68947e2f23175712
│ │ │ ├── 2525155115bdabf0ffc9ac52636cd96a48392ece
│ │ │ ├── 25a34c3926334064f5e408e685a3970dc29d4530
│ │ │ ├── 25ea286ad8f6bcbc8d84b6d39d797022ebdb8bd6
│ │ │ ├── 268cb5feaab4c2cffc58a8ce34f4e9ec1076d346
│ │ │ ├── 26c3633ff195ba92703a94255bdb71a5773941f9
│ │ │ ├── 26d3480758cdb45d4cba357a20a1dfc2790d2011
│ │ │ ├── 27231ca04108bf0abc8f938e0be23caa04138a16
│ │ │ ├── 27b43df0849b581ac289cc97a9eeea4627f6b536
│ │ │ ├── 2875ec3c850d5bfa533f03593741f3e8b02f8976
│ │ │ ├── 287bbdcd78dcf41eeba74c712aa64d1e72e59722
│ │ │ ├── 28a19e246af1ec41c7be5536c2f5ac5c6a983062
│ │ │ ├── 29251f8289ddd241bc10dcfbc86ed2798ee21ed7
│ │ │ ├── 2976ddb6d0b80a1a837ffddcaa166b0232f21365
│ │ │ ├── 29e6e350d5cf6d7485b833453b0933ae5e3312af
│ │ │ ├── 29ec07fa166761417d3f0cc90f257aba54913fe2
│ │ │ ├── 2a4d17aaa5b878324d4dada62078eb5bcd30390d
│ │ │ ├── 2a79f4b1fffda7f8f49a6381592eb8e69f310ffe
│ │ │ ├── 2b01ec9c9fa0b9629668859fa34f0d91696fe722
│ │ │ ├── 2b3062597e4f152fc18a4d9c921ffb5606df4abb
│ │ │ ├── 2b3c06aba8cc78835e762549ec820163359b6a88
│ │ │ ├── 2c8ba38156cdef21c8957962206fe55587e19eda
│ │ │ ├── 2d2ff2a416896e4bf56802e48f8b10ef92f2b0e5
│ │ │ ├── 2d567df1c44f25183d12c4d01fa643a53d7ab882
│ │ │ ├── 2db55391b534bf60bd1a7fe5e57b47e076bdd6fc
│ │ │ ├── 2de57a842c980af0a5a151abe5dc4b4a39fa4914
│ │ │ ├── 2e28a4dbc25c4c167a652aee4a0ee17f2df3d68e
│ │ │ ├── 2f2cd4041df50a1f1c1079d794120e319593d206
│ │ │ ├── 3002e6a38615dba6707d067201b266e97f570ce3
│ │ │ ├── 301b98f6226eb94900b3298e52ce836a2b5f9c7e
│ │ │ ├── 304ac5151bd929a2493c447929940ee3bbc82ac9
│ │ │ ├── 309f68f7f6d8bbfb1083c7af85cacac745963a0c
│ │ │ ├── 30ff90f65551a04e66647131a5be1b8c93460fa5
│ │ │ ├── 3148473f4151375c89a451957f5e642aced41a02
│ │ │ ├── 3198d0a3307252998190295f24ece2781410e22c
│ │ │ ├── 319c2ea89e984ac71a721c2627f8b5ce00057137
│ │ │ ├── 31f62ff813b3cf96a8892c8137eb8b27b6e8b218
│ │ │ ├── 3228ca6a52709e88f373d2addc51165da85eb3d0
│ │ │ ├── 32426ae8b9cedbe6a9446d1326af23a3c355b75d
│ │ │ ├── 332db572dc7cbd2709b77a72cbbb51c9ba364102
│ │ │ ├── 339d328ce6bf504dc97bb9ee6a69a26cda41c822
│ │ │ ├── 3537b90488fb5111ed11d64744cabd7c60095509
│ │ │ ├── 3573257015a88f25ae77de7f57e0df27427a9cf0
│ │ │ ├── 357aba0219f2776835e1477727773ef612d7eb48
│ │ │ ├── 36049973a1f4a75718cc31628f76a4d5758067fa
│ │ │ ├── 36100ee124a2a50372dd07ff5510988a714fd976
│ │ │ ├── 3614beb438b5f7ea8ea3ca0eb0427a96118e5fc8
│ │ │ ├── 3695de95c7fe216bb593b55d0698dd1d8db6187f
│ │ │ ├── 36d47029fdd453f2e67bfc853afb27a6eb0d3285
│ │ │ ├── 36dd7ae6d968c4f076c5c3a2e4636f8aafae2333
│ │ │ ├── 3740698a7c95b2dbb5c188bad6a4b2e6c707700d
│ │ │ ├── 379ac14a36f79271152bdb32d5ff97af15a3b927
│ │ │ ├── 379d07f6ec3d90d77087fecc52beca5d61d1e5eb
│ │ │ ├── 382b5b2a524662d5312aaebb292ec182ffeec9be
│ │ │ ├── 382be6f01d1d28596ab17d7f289eca9c1684c596
│ │ │ ├── 39662d0f04fe41cf60e4acc443ad008ed6171a44
│ │ │ ├── 39ca1b279e58a4929fe9a74be2007303392fca30
│ │ │ ├── 3a598f0941ecdae1f9f7cb684a3d8a62d5b4e20e
│ │ │ ├── 3ade7cb5c75cb09d1e88192837abad8752eec86b
│ │ │ ├── 3ba643b8551327e49fd92a84c4ec88b7f6f0dd44
│ │ │ ├── 3c6a9b72f07780aba7417fc869fe1d569b7d82ea
│ │ │ ├── 3c6f5979828b97cc53c9a56cb1e1db592b78e53b
│ │ │ ├── 3d9c1b9063e0fa0acb69e40f44cd6e9cb697c2d8
│ │ │ ├── 3ec526cd33988c6ca1bfb478dd41a825a2682099
│ │ │ ├── 4042b44ed3cad867be65b2b3abbad61aa1237fab
│ │ │ ├── 409bfb8018bc0745a5d175f20310e028339f1efa
│ │ │ ├── 40d296fc879e459abf043d95d3bc418171b3a940
│ │ │ ├── 4269debcccf2bf7fe5b2ccced25b050c3de4eb4a
│ │ │ ├── 427047772ab9443bc3dfb08f04f92078036a7921
│ │ │ ├── 42799da2a526c667849c9f80d2639ed18afb4655
│ │ │ ├── 428318a9161667858f1052893232d7b2b97413f5
│ │ │ ├── 428d56e4bdcd603e9a420d42cd9d87fd3698ef0d
│ │ │ ├── 42a8926d4aca7af9a89f7c9887dcc4a0b826a9ae
│ │ │ ├── 42b74fe1c2f685eaa75e5754a1e299a7f1bd4ff4
│ │ │ ├── 433b74a89d4326c00b6b94d429e955a42ad8e31c
│ │ │ ├── 43555b46cbad682b2ad2453e8a9c5e7f04c54d2e
│ │ │ ├── 4372b9927b399caa67c70c2013542e2f41cd1a65
│ │ │ ├── 43e24f6f8e7f1c57dd64341a0e7444d662444207
│ │ │ ├── 441197650f760dfb1d8b71a8051b8c18f250ee3b
│ │ │ ├── 441a15790e2db2a6fe37a3b7e81efdb3fb93c181
│ │ │ ├── 44611aeb2932decb94947ce84884a85f46cd1e81
│ │ │ ├── 449a14b52ddac6234f42f0a57afeaebb91e16f8a
│ │ │ ├── 452165df1d481a22844524d865860d95f114bbe0
│ │ │ ├── 452c8bcfc282943572edf9c501ab3a7db90d38a1
│ │ │ ├── 4574094cc40ae5857be7497c55337f0962ee36cb
│ │ │ ├── 46072e2f2903f313fb9cec9c2804b540cc9366ff
│ │ │ ├── 46766dd1c00f157d9cec6f572695f576e543c2e3
│ │ │ ├── 4699a81d6545fd3f1b6a6b0bd2fa37c151ccebee
│ │ │ ├── 46fc15ffaa27d219c79b4e04e1d3bed57ced6b20
│ │ │ ├── 485038440d0668c1aaa22297ea0cf2a8cd9b3c10
│ │ │ ├── 48575e19775bbdb4f205834177f43aa2aa7e0bf0
│ │ │ ├── 48965d15ed0cad583de8932b25ef8f4449781776
│ │ │ ├── 48b85790304e38684d3af8a8c224bd9a042f4d2e
│ │ │ ├── 499a2c4900331ff8524c82519b4896fd2ef61260
│ │ │ ├── 49c9110f2cc510cc9bf5622a72d8af93f9f490d3
│ │ │ ├── 49eb088df1c0213d0571cb3b4d4c10dfb8a17d22
│ │ │ ├── 4b16f20d875ee62437f98f764a60837ccad04d67
│ │ │ ├── 4b3424a592851f293ede2598a1383378ea1aec32
│ │ │ ├── 4b3c4c32c0afe69f9267d37aeb4ddb9f23d9f831
│ │ │ ├── 4b7ac14ee45f248670e5b60ea7f2ed11c9814de1
│ │ │ ├── 4b87a4c4ac4369436563699edae5fe05f5255ae4
│ │ │ ├── 4c07483a54322821ef37e901ef292abad8a0ac45
│ │ │ ├── 4c1f60820adea360d6744ec3015fc5a5b3cf44a9
│ │ │ ├── 4c8de2670b782581f6a488413441d3629d725d7b
│ │ │ ├── 4d3029550e26ab11c24ed9263253f24e1b80b09f
│ │ │ ├── 4d709845e543a05de79e6886284221c29def3582
│ │ │ ├── 4d90876734d6467078ce0a53bd32c5a266187147
│ │ │ ├── 4ddeb813ef78fdac7c97bddba228482fd25bc2e6
│ │ │ ├── 4deb3ce06076b5df297c47432b7958b548872013
│ │ │ ├── 4e00569ee13d131fd16100e72183447d514f6f4b
│ │ │ ├── 4e0902346bfe0e00d52f0136e358f486eb0c0b02
│ │ │ ├── 4e1ce8cc4c70384799b7f9d5ebdbd235f959e006
│ │ │ ├── 4e1d0daadbf7bac2b99437686261addc61fe5254
│ │ │ ├── 4e2448b98518be4a772271e80220b8b428595acc
│ │ │ ├── 4e336c8f3f71c4b1f28d7e735736e4bc9f43df72
│ │ │ ├── 4e7cb4229ea37c1668a501eaea91db8ef3c43791
│ │ │ ├── 4e993b0603ab8fe1f4c8d29da8431d95ca6c3084
│ │ │ ├── 4ec5709697ada3937dab609bef1d8a31b5ae23b8
│ │ │ ├── 4f142d24a348fb515ffc2780b8eaa0a516fdf127
│ │ │ ├── 4f4778e0733274b7c6ad682ddf14ea8c16f2ef0e
│ │ │ ├── 4fa058323a75ff8fc7cfd90ca541fee04c6cb2d7
│ │ │ ├── 504470cd8f7bf2dc8d7a0e5b003021e64516efac
│ │ │ ├── 50fe2ceb92af23261e875ed01826e741eba1a508
│ │ │ ├── 510180fc3d3a8787122a2a8e0eb77e19f8ded778
│ │ │ ├── 5101a4d44468e13c1a7082cf174905f1c502720b
│ │ │ ├── 513515d1099a377df9a322cc935a4eac64e3afe2
│ │ │ ├── 51e4c4e6fe9e7893e6fac8ddc3d9c721b584836f
│ │ │ ├── 520da703d89547179cf5d5005af301aedd48f0df
│ │ │ ├── 52538a80094f7b62948fd31e68fd17a315d8dc91
│ │ │ ├── 52dbd1356f67e9955d7c890513ce755c03e154e0
│ │ │ ├── 53990ce2d039990f315fdd12e7dbe935f4ae80b1
│ │ │ ├── 5456c85e0f9122c697b49af2a55e7be2e616d13c
│ │ │ ├── 5474ccf7a2a09b3e9ee76056a02ef805a6a8afad
│ │ │ ├── 54751d23220f4a9a2cb2af6d81a6c0b78efe29da
│ │ │ ├── 54a04e5bd46ecdf0c89d635c6699f792062c9c1f
│ │ │ ├── 54a8479e80b6e9f44ac94a3116f4d6a6698bc385
│ │ │ ├── 54b4b27f941530c8d99fa5acb1c4279a40ec89d1
│ │ │ ├── 54b8cf23f97a0a8653e76a77b6339978f29b2913
│ │ │ ├── 55211ab855e3324421c43de5ba1bd303835191f5
│ │ │ ├── 554adab66bd761d22e1f80688b0c1c94655f596d
│ │ │ ├── 556a567923dc545008d00b20e423161f7b77f844
│ │ │ ├── 556ab00ca2915a7ad40627ec3b677e1e0d69a8d4
│ │ │ ├── 5647912a2a730fef4bd72008bbd3ae8a4b4cea28
│ │ │ ├── 565d672522bf3bfa87303c8384c509f8e9008d16
│ │ │ ├── 569036e0286f21311ee642e55f1ab5cd56c3eef7
│ │ │ ├── 56fb9b0e0009a18c46cca42c83e80e90b67ca42a
│ │ │ ├── 579ff37ba7a2a0396cd49cd39339059fc1058ac1
│ │ │ ├── 57af1adf905bd626e4efcaf4206321e2854f31d1
│ │ │ ├── 57fc82b551066775c7f282c95e095aa2f021742e
│ │ │ ├── 581fe26978404a3f91480892cc6e0a93587f65b1
│ │ │ ├── 584deda9d567440f94450c96e2dfe3785f4a5b58
│ │ │ ├── 584e7cddfa65cff9e79016b6bd88c264cd5a3e81
│ │ │ ├── 58dd46c7b7e29ed161748cee396c6cd9b257ba1e
│ │ │ ├── 5920b65dd6ef91f2fccb47f4e14a530e642ee7ff
│ │ │ ├── 5a97272b7d8c6696d5467a81860a56442edc55ba
│ │ │ ├── 5b46ef96e0aeb6fb920debab2fda4d7e2e18a9d4
│ │ │ ├── 5b5b8a7d127cbfb7a81053b6d42937ca22d863fb
│ │ │ ├── 5b8cb089503bbbbb0f16fbb7b9a3d14c7f4e1dc9
│ │ │ ├── 5bb94cf0f6a09a3903174beb48a9f0f476deb432
│ │ │ ├── 5c7efe3ff1c48d0b31ad0240e8d2eef741e8ea00
│ │ │ ├── 5ca281e388239fa11ae5221405e4fd45b6664988
│ │ │ ├── 5d5a3d37a3961843713492135fc79e291b557320
│ │ │ ├── 5d80c559786de1d7146c050d427d71ba2dfe28c5
│ │ │ ├── 5da4538d235f8a8c407a6c778e34f9446921c94a
│ │ │ ├── 5e0a1885f82018ff61aed44a6bc0000776b317ff
│ │ │ ├── 5e0b67fb32bdc62a0ae6909655ec0ab606c7fda8
│ │ │ ├── 5e1da251e72e1d34a8c67880b95582886aaec63c
│ │ │ ├── 5ed232e400d7eda3669fb1303b2c903d185cf16d
│ │ │ ├── 5ee8a9469aea9d04f2952fb2ab16229bb25dd2e2
│ │ │ ├── 5fc8db6df5eaac951383c7d0d280c7ad7100948a
│ │ │ ├── 5fe852bb97f1f23d93356747a0c81dc19f23f7f2
│ │ │ ├── 6015bcdd476e7ad7d6abc91529518c2940536eae
│ │ │ ├── 60441bafdaffc96e85e7829b5c724832fb2016f1
│ │ │ ├── 610459f39b152746ab7fc908fd561d1c275916bc
│ │ │ ├── 61092787097b097f2810540fe9a6ccbfb2c21d3f
│ │ │ ├── 616af2c72952a0cbabe41b89c8d8ad7a65a6f910
│ │ │ ├── 61913c80f21dfb15af692a5a20d3a3559c42fdac
│ │ │ ├── 61b02d843ba15be565155e93240d17c90e89cfd3
│ │ │ ├── 62057f7f4b746ea55ffcd2a3492f6cc9f4737a76
│ │ │ ├── 628bd51c21da12f35f54d41238176b73bb96705e
│ │ │ ├── 62adca98f24a79e53293b1c2ec2b31b786e6d9dd
│ │ │ ├── 6304236c77813b82c40bcdd347b72e50b0c6124c
│ │ │ ├── 6324c808a0938ae2be8191ca127f2963fcb6a380
│ │ │ ├── 640a30b8dcbd912c4a5f08a09d22d2899d6bd1ad
│ │ │ ├── 643a358aad07a194304f73749bc7abf019386a71
│ │ │ ├── 649f29e6d309c56be143374da3fe4707d0acd2bc
│ │ │ ├── 64d866f85bb41e730ebf0430712cd3080b461901
│ │ │ ├── 65a4003601de2648fd5ddfc31272d5afc9ebbef3
│ │ │ ├── 660cb2f2bd9c2bd055fe347ff0db8a9088ef34cb
│ │ │ ├── 660f96e959e9606151d07da64b5aeb8089226385
│ │ │ ├── 6684f6de14114257b14c24d5aaea5392cf2e7ddb
│ │ │ ├── 67d8a7cf745fe96dd40461b53be47723918fc266
│ │ │ ├── 68d726a9e9dd4356b92ae1c44c444ab50f1247c4
│ │ │ ├── 697b3e53265ec7cb55374939f3d2fde8e7a062aa
│ │ │ ├── 6988ce7dc0962d217a67842bf1c25f3d1b9c27c6
│ │ │ ├── 69f747e052f19f282dcf958eb79463fa04052d00
│ │ │ ├── 6a0d2126620d2e7d8ef022508c912164edaf46d7
│ │ │ ├── 6a4c6b5bc1e053cd67e0b150a6a4006d08e700c6
│ │ │ ├── 6a8b66a1a641b009e9d31ba69a37c21de3a2a633
│ │ │ ├── 6ad29cd6fad098073489f0f285c2e932a133e6be
│ │ │ ├── 6b516c99b2ad2cdedb4657057e5a822135785b72
│ │ │ ├── 6bc069dc69e391e0844ab6c2f1eae9e71b52adef
│ │ │ ├── 6c4cc19e3cb2d3b7a4c42470ddb4743e1991c3bf
│ │ │ ├── 6cad14d6ba4ad224f24fc5af52f739306774467a
│ │ │ ├── 6caedf88b909a3687bed7e6f2de663eba117fad6
│ │ │ ├── 6cb4917ff7f98737b4689f76eaa73ba7202f9edf
│ │ │ ├── 6cd5f10b61707e5bf70ca7128c73f440d06198f6
│ │ │ ├── 6d09033d9cabf4be617ebcd83cd8170e7f91720a
│ │ │ ├── 6d7687261b3c078692025e736ad98e4c10786edf
│ │ │ ├── 6de782f76901615b5f826486792374a1d079c9f9
│ │ │ ├── 6e3c418de737bb95e359f12ab08d26944b66177b
│ │ │ ├── 6e6ee01efe2d52ea83543ff667d295a6822dee13
│ │ │ ├── 6ea5470e09fb6a7f940173ba39ce2435da079764
│ │ │ ├── 6efaabc057d7700101674d59d153eae693cad97d
│ │ │ ├── 6effb23ea176ed837ee37fef015335aef773770b
│ │ │ ├── 6f50acac9e00b8220e530af28dec14013af9a8ac
│ │ │ ├── 70668c6747e6239d25b0c3831f37b0eb6bf89f14
│ │ │ ├── 70ab7ec66a4833b7a8d845e2fb83397401ad880d
│ │ │ ├── 710ef688a36091e80e2f4e0a80ea58d97d0f8015
│ │ │ ├── 713a3a9aecb903c8787528d5a79250a4237386b7
│ │ │ ├── 7169a6a3b0f42d8789606d95ad8ef5542da8fa3c
│ │ │ ├── 716ebad71df39a15e6426ebee8fbeb807d5f120a
│ │ │ ├── 71c52f451d4f3cabd2ed1ae0e8a44d232ccbb98d
│ │ │ ├── 724689585f79bfce7227e9ff46b9c793628a41df
│ │ │ ├── 72796aa746723cd8eecbb6cd55a889c882a862f7
│ │ │ ├── 732d67a2a02087a80db9981c3bd7d4ea286be612
│ │ │ ├── 73711d3d171c8921c3275388c94ecef8b974c3af
│ │ │ ├── 7374ff896cf9e1e2180857e6568e04cbb0e42355
│ │ │ ├── 73d3830cad0da70a1e6723738bbf2bb05965b9d7
│ │ │ ├── 7403b6b2569af9b24cc27a434af590ad093eebc4
│ │ │ ├── 742ff2eb44c77eab9693d1f821441fb7a77b3417
│ │ │ ├── 74365c85a2d7853d329d7eb633baac8a760d4d0a
│ │ │ ├── 74a5d2bb67bce5fe703966e279cf8d43a314ce9f
│ │ │ ├── 74bbef64948e7326f88bc6e9694b20506397f318
│ │ │ ├── 74f48ea3c32889fb7167b4b565f1c21b36c822ec
│ │ │ ├── 758ba106d8862133b796fdc744b9c329a676f934
│ │ │ ├── 75b6ef00f7edce54f7cfaebe0e10bfdab5011c66
│ │ │ ├── 76837f99cfce3ead17613efc0bad395f25589b16
│ │ │ ├── 7719bfbb3f025293bb93bf60b165870032ea35e2
│ │ │ ├── 782f204620f8e221fd845c533714a19a7e46df2c
│ │ │ ├── 784365c00db3ddeeadef176ee94879c68b14b787
│ │ │ ├── 784b7574b9eedc3ca95b002dec48e340814895ae
│ │ │ ├── 787bef1f01133454c80c267bded9d23a84b7b8a2
│ │ │ ├── 78a41a9a37c7c4590e4bde6fd79b2fa70a38bdb7
│ │ │ ├── 78bd32491cd0ac520b77015ea30e5c75a8f84429
│ │ │ ├── 78dda6b7de17128e83981c402a22cd0e50be48a0
│ │ │ ├── 78e97a98d33c22761504388afcee0d08fcfb5ade
│ │ │ ├── 79182da8210a8fdbf2b68c917e4933649f909c7f
│ │ │ ├── 7a3c10f200169c23dbeb8dae5a30fc630609230d
│ │ │ ├── 7a4c5c1e2ce5b74bf3bfe8be97945324021653ac
│ │ │ ├── 7a6d5f1c07389c2aceeb656f71bed868f627bffd
│ │ │ ├── 7b3cb78c9025cb13d05ede3cc1452684e245c17e
│ │ │ ├── 7b7159c797fdfaf9dc74196fb89cb52f25a7adf4
│ │ │ ├── 7bb8b06810878b845db7df1b91dc6da3994977f2
│ │ │ ├── 7bc07e975e6c73145f5db8730f4ffa31ad59c91c
│ │ │ ├── 7bd946a7246a94596627cd6f52b32bcc66ad34d3
│ │ │ ├── 7cb8572bfd73f6eb28e71760109f9f42f6b85ddb
│ │ │ ├── 7d34f50cd9e7fa59648791f74f7d855e176841bc
│ │ │ ├── 7d777a28e2e746ee4b312e023359f77371d39e8b
│ │ │ ├── 7d79863c79498d40598a5e4702b0c0fbc7ea3522
│ │ │ ├── 7d82716fc549770ea238f33afcdf587a4a6ef094
│ │ │ ├── 7da7fff00496deee0597b96381d5e86530a3b6bd
│ │ │ ├── 7dd8f637aaac677acf60e447c616d316a34c3c7f
│ │ │ ├── 7ee593e5f8417c135df1a3528071a9a95ca1ef33
│ │ │ ├── 8042f6183191d50c517b19f2cca1e4dea4f233a6
│ │ │ ├── 8302aa9c3c919be795d8fa7e097e9b36b1a526b4
│ │ │ ├── 832395932e2077c4bcfbe321a0e69b96eed8eb56
│ │ │ ├── 8327f443cea100b3e3d7544a394f0aa97f7e67e9
│ │ │ ├── 83499305223354f109689e810ad6433353ab7b7e
│ │ │ ├── 834b65a2b430c361564247f14c07fd0417f4ec0e
│ │ │ ├── 83982e108c25bdfbe7bf9df120b01b017edc99fd
│ │ │ ├── 8530d96dbaab21b5cb89a9a4f3e5ecc24d34dd4a
│ │ │ ├── 858a0bb6cca360d648836af113493e5cb9c72e87
│ │ │ ├── 86260d35e3da20d5d963e9d97ec9fa07c3944f85
│ │ │ ├── 867de66c12050cab7f27ffcaed62d206ead86a07
│ │ │ ├── 86c2be25e3aa317e7fe258f937e5ecb24a56df7e
│ │ │ ├── 86f46800fcb248ee5491ca6e2ed0d5272089e097
│ │ │ ├── 876d3df1c7fbd3d7ab7060d8b21f5a24608f8834
│ │ │ ├── 87c142e6dbe2bf864e41a3fd30eebfeee462c859
│ │ │ ├── 87c427a3c18694295a1e1eb98a466cbfe5233bdc
│ │ │ ├── 8871a83f5ab7e11d7e6d5bc565bf7e16fac55e07
│ │ │ ├── 89465a62d788e0416ae5a18c432922ecc2f82586
│ │ │ ├── 89666efa3860d6b363032ebb08582c27c6bbf92e
│ │ │ ├── 8995ace4d2a585ae1cc09a0fe9df2086ccb35bbc
│ │ │ ├── 89cd4937308c9f227e8640d82443e7140903c40b
│ │ │ ├── 89d5a18c29c5fb4f302dd1a66f7d2dcddeb05bcb
│ │ │ ├── 89f94d31f2d07f381755b3eb056eaeae9330214b
│ │ │ ├── 8a388e1539969c89626324a745ff2dc9f04a7b5d
│ │ │ ├── 8b3240f1529d802f0d324dbeb763345268ca6bce
│ │ │ ├── 8b5df3dcd97d8b61f24e32d0c93d1cae1d2412c6
│ │ │ ├── 8c3b2998352c86b2c5a2d533505702b030a7a714
│ │ │ ├── 8c9fd3af435b774b2e29cbbc998ed13cc4cc9d30
│ │ │ ├── 8cdde7778317e44343bb62676a829f2344af0d4b
│ │ │ ├── 8dcccf9789de7940b8da2a4fb72cc3c0045f9e2f
│ │ │ ├── 8ed500417bc0759eac097c05452015682d95aefd
│ │ │ ├── 8f053af99d6f3a8bd9ab6f1b7c92ae716067621d
│ │ │ ├── 8f0762ac155915383ac3a4aa57ce505a6ba1ddda
│ │ │ ├── 8f381a9e72dfd509f8b954694209b995eeff44f9
│ │ │ ├── 90158b44f31d06842c84bc1c7a3d497c7299cdb1
│ │ │ ├── 915f6dffb84e2d22116a35f0a7548ff7f7ebb34e
│ │ │ ├── 9174de4e1244c842d3a525f3b6e0ad4dec6a6bbf
│ │ │ ├── 919a5121a02bd236524270348b80c8a9ef4f9016
│ │ │ ├── 91df26877302e61d6c9c74680d31819bf4734b5b
│ │ │ ├── 91f3907a9a2e338390369b85f2c08cb637efe490
│ │ │ ├── 923ae25cf6fb6c12bf387768ed9d322961b482d3
│ │ │ ├── 92bde2a68fe52cec6f408f4893b2839965ab7f26
│ │ │ ├── 94942fd41a45620f11445689c9c0e26875a8670c
│ │ │ ├── 94e45c086de1f26c3c508cd6f2769acd1ee01b1f
│ │ │ ├── 9504204421c79d86bf9ab74e0c2325108769dfcb
│ │ │ ├── 95954ab3b04f06b44fb1d9aa7111bb605e9d8f9a
│ │ │ ├── 95a1ecabb5341f7a71aa2287a8203671d46d78ea
│ │ │ ├── 95e1f321074fcb8dfe56f5a81a1410bdf519dd9a
│ │ │ ├── 96e56455926c351e30ae478806d41c24b3354e17
│ │ │ ├── 973e367691bd09020945af67212b2cfa33b49015
│ │ │ ├── 97b0457b9ebb10fa5556a22324d6e8cb95304bea
│ │ │ ├── 97c60a69a473b71aa20dcbdc2687f7a3e5292327
│ │ │ ├── 97d5d89ccaf2b5b903aeacc4153b2cc0dbf8d418
│ │ │ ├── 98860ae490b8bf793e02028d343e5b60847cf914
│ │ │ ├── 99171b75e79357f439de0d37e9f32587dc83bc7a
│ │ │ ├── 994b04cdb8796a09a443e1b61c2b681a5f2cf397
│ │ │ ├── 9962ffe3158e1ec1ca3765c58c0efb1533d6da21
│ │ │ ├── 99d80fc915cb7ba0872a430a7c7e6806e57bb404
│ │ │ ├── 99dd852825212afd117611496428a73afd4f8877
│ │ │ ├── 9a04367fb0bb38242ed10f7df6fe25d3170bacfe
│ │ │ ├── 9a14d12a2916cbdda3f7a76e499d8a19adc386d1
│ │ │ ├── 9a1a10e5564fa24cca6ac2695be5d59adf677059
│ │ │ ├── 9a305e54486dfd6afe111a0629cb937730a87904
│ │ │ ├── 9ad1c85642ce7d0282c216f3eb119bf09123c256
│ │ │ ├── 9ad44a7cc1ac94fef7251874ada4b735abea9258
│ │ │ ├── 9b4690aaa827ea250692cf2128aa800d6bccf62d
│ │ │ ├── 9b565f81f5b39e3ee3adbeb3a7eb4d045e800de7
│ │ │ ├── 9c89f04583870011cd40ef3cb91afeae135a6376
│ │ │ ├── 9ce87d3bc5c6c08ddb22ec2642ea0b51fab07dea
│ │ │ ├── 9cedbbc9560b4ee94f5b58034399f2df0b726a43
│ │ │ ├── 9d1c553021d84ea112a4c87d87c8820a1a53fb99
│ │ │ ├── 9dc566abf2c1de513225a2b41a180bdb54695a18
│ │ │ ├── 9e4e3dad9e8a70dbb9030fbe9abe728878f428b2
│ │ │ ├── 9ed2a017d9c247fbcffef78d503f547fb75ad03c
│ │ │ ├── a00f43061aedaa2fe0329c3b9d5480ac09bb2540
│ │ │ ├── a07153103605dad615da561e217a97ea2a41066b
│ │ │ ├── a163b3c5c76f8ffc778c797f8f39d04deda502bf
│ │ │ ├── a1bceb3f2471530ff4b223513a6492952a91b560
│ │ │ ├── a1de2762e5677ed7e8d15649ddc34c0234c83631
│ │ │ ├── a1eaa0d342c788a63684201a0c04e717c231518d
│ │ │ ├── a1f2de7419b6b1835e385a1c577d7c9b0e91a070
│ │ │ ├── a2217b454980304d34aeb4330be660d404591a07
│ │ │ ├── a287954e6e5b27a39605ec546cae0465cb46a153
│ │ │ ├── a2c076551da52dd4f649aa895cd8932111e9e63d
│ │ │ ├── a2e0383d97e50c42b11a2bed5d6b15451d700169
│ │ │ ├── a39c710f8869c2c7a500567add7377b73ec38ced
│ │ │ ├── a3ea7b6bb647d7e090ce2f5d0765c181a9939bc9
│ │ │ ├── a4282544294e425888399a2ea2764171313d4974
│ │ │ ├── a4977e949113ffcaa120bf5c2c15cbe3f814281f
│ │ │ ├── a49a50ddb59e79ee314d3ff287cc5ad2fc30053d
│ │ │ ├── a4f9c60cf2848daa71ac376a77f06f2283995c6b
│ │ │ ├── a50a8cf2901172f9aff84f90dee2b1a7996c217c
│ │ │ ├── a538313afb2c5c2b31587b019784140e03a3e4c4
│ │ │ ├── a5b8d2524b9a87fee6d807eb4e5d0e8094df3e6a
│ │ │ ├── a5e4f0b8eb4cb8e35873b6ed0a6fbf19f24b4c8b
│ │ │ ├── a5ffeb5367ee3ca15fe331307a552aa992eab14c
│ │ │ ├── a643885583858b65956d4c079e9729aa0badc2eb
│ │ │ ├── a65699c36349e4a348ac3676b2cd40ab3831d7bd
│ │ │ ├── a6cdc437ed07145956b0acc22e3f807ff193b166
│ │ │ ├── a6d2fdb9e0b8b54224041af5f4d6cec6bb495864
│ │ │ ├── a797d99563354de82a0363fccb81d8d1f8c6db3d
│ │ │ ├── a7ad073edbb9716ea35c6ba35a2f2dd713176b5c
│ │ │ ├── a7b91921bd13b5e10ab78df3ffe0c7c10cc24335
│ │ │ ├── a7da30cfa275e806276170b06a2639e7f3056eb4
│ │ │ ├── a8124c3e10583c041a3a4ed57f01847a63b7a602
│ │ │ ├── a81a6e988c4ee8b13dfc4c138c10d0d691696436
│ │ │ ├── a83adb85ea3c8ec19632d1e32ecc4f29bd03a83d
│ │ │ ├── a88dcdeb8677ac47ab41100ee3cafbf761304f50
│ │ │ ├── a8e3f7728e3d2e68777f9644059d77bdec734f96
│ │ │ ├── a9c25546080c9e3f21444b9bb85307237575397f
│ │ │ ├── a9d6656c96286a8e57760ce7b3f531813f768fdf
│ │ │ ├── a9f96f0d3de3a8b3527c88cb7032b15d21dfa529
│ │ │ ├── aa321af63767617d7eadcb848632419ec1337eca
│ │ │ ├── aae23e0506d5ca1f366ddd73363596def41a317d
│ │ │ ├── aafd6890588360d13a880c648ed3f99a0b00c947
│ │ │ ├── ab06a492895bca9a17b4247176a9816cb77c42ea
│ │ │ ├── abab9ef901874017084bd70731e94a81f38266fd
│ │ │ ├── abe5d3f6ad1ea48451769ccd97dfd54417dca246
│ │ │ ├── ac6f976a02f772a5b77383c045345a53407a5a2a
│ │ │ ├── ac9231da4082430afe8f4d40127814c613648d8e
│ │ │ ├── acb9292a6206e1509d50ec609c1f7336680ef085
│ │ │ ├── acf0a1444aa952d5d1d4d93e527b4d99dedb6ae4
│ │ │ ├── ad69cfd3840f3d4f63521f7d8c4d1dbd86ee73aa
│ │ │ ├── adcc6b9ee1c4fa4e55073aaf24e083c79625607f
│ │ │ ├── ade3414dceaa05fe553d3eb58f5638facacf1f37
│ │ │ ├── ae4b98d274e95e80e9033735e1b789c9e646c76f
│ │ │ ├── af1e878b381a6158f8484871a781417a385c483a
│ │ │ ├── af35c68d54bdc3dfbd31d5a261c54eb1ebe0ff13
│ │ │ ├── afc962563a90cc808cc0723955668c21c30a1558
│ │ │ ├── b0195a042e9d44af095b49c72973e28e6f882ff2
│ │ │ ├── b0305bbb4d23d04f342138f14950504d3382565a
│ │ │ ├── b033b6a1c628fbf57f7951efa06932b15a973677
│ │ │ ├── b03447d4aecb11bd1e393f94a07cd165ca6c2eeb
│ │ │ ├── b069320688cf4c2afd5026b9fb9699f4c05e29e0
│ │ │ ├── b07ee0407f08af27d04616e8720253d66ceff1ba
│ │ │ ├── b0c5a61cfad8e318f58b1c7e225ed4bc0f9f1664
│ │ │ ├── b1d734b380455bb03636c28ed76dbe22c0e5e7b8
│ │ │ ├── b1ee1439d260ef21725d1583bc60752962366bf9
│ │ │ ├── b35535ff7253075d1326ddf6c76a361f589ce2ac
│ │ │ ├── b4225bb3a7997b6294c86bd33000b8d003bcbdcd
│ │ │ ├── b55362f5beff62935c5ab1e1b63751cf6274b27c
│ │ │ ├── b57f7e45ae6e34d70fd9f4cafe268a1dfcb3366a
│ │ │ ├── b5861f0021541911ba8f4468f333d17c4a093cab
│ │ │ ├── b5c72b3fefed4019f8230b6f41ffeb1e53bcd0a8
│ │ │ ├── b61d9623355d9366eaac9b2f813356cbad186c53
│ │ │ ├── b65427d16947c747930f8c41254c8f82b208b809
│ │ │ ├── b76a04044258bf2be2200ef51befb15a1546c24e
│ │ │ ├── b7ef68da623fe7eb82b37c5174504a0785d220ea
│ │ │ ├── b867a8b4c6a61ac3990ad24cac37a7bab2658d01
│ │ │ ├── b8a7576b0a129f9bea5b0753649b6d2dba23821a
│ │ │ ├── b90a8ce827c794ffcff57b4cfe1f5abf400b11a2
│ │ │ ├── b9283cf754909676119de6e9d7068fca693ee2f5
│ │ │ ├── b9f81fdb3dff6c5f2e3372a751b9d85762da4de3
│ │ │ ├── ba589daf9dc57cde31e624bc71d0ec7c30aaa1c1
│ │ │ ├── ba9b7c993c7288fbf92e15e722249013821ddc0f
│ │ │ ├── bb6f738cee8b2dc602d50a0fcc1130ab9b9c4779
│ │ │ ├── bbd1d16d37130687e0d0c00f88c1f280a9d81285
│ │ │ ├── bc2af85cf2aca92b13eeb42b15170ba9b48c96d4
│ │ │ ├── bc2c18b6c258e4fcdccf8c1ac2fdfda1d4eb8cc4
│ │ │ ├── bc6b2ab18f638e24dfc3f151c7ac092061fd6bb3
│ │ │ ├── bcb62a7698719c210a4b1408f88a04677640a941
│ │ │ ├── bcde3f1434fd198b79c19fe195b47411bd8a932f
│ │ │ ├── bd4d2fc6f65249369eeeaa331d574687c7c8af66
│ │ │ ├── bd83a91a4c5113fdf79b3a081db43aca4baabb73
│ │ │ ├── bed35f66df858e54f500fa0ada906ce811eef63d
│ │ │ ├── bf4a53e81d3b4ba898ee46b4f0ba56bbf37fc24d
│ │ │ ├── bfdd00b14bb8b8c1dfec5afc957d0329489b9d14
│ │ │ ├── c0134a0ba73737ba4d1b352a75a424581487e23a
│ │ │ ├── c0d3e263af320900f7469663843616f87f1e89a0
│ │ │ ├── c12bac8db964d6c557675883e0438b932c149e47
│ │ │ ├── c1e930f8e14b29e898e2b25b80414b834da9c625
│ │ │ ├── c214ed0d8ce473aef4149f3dd6fb4a7c56b07652
│ │ │ ├── c246e86848bdcdb7e6efd53ff829e7461241beab
│ │ │ ├── c28630654de51674777dc02a034685c63e08e3fe
│ │ │ ├── c2ad5674c5ceea9394b352524c84d29e1e50c1d4
│ │ │ ├── c3b57de029f4d72fb7c237c9b76d945f333714ae
│ │ │ ├── c3d0c5be5991a61b137f68e795c800204165a61b
│ │ │ ├── c3e59bfd7526560925725f87234e14bf439a3148
│ │ │ ├── c430d42780616d03117204505c8c9b5249544e41
│ │ │ ├── c5687472935b7d2c620b9813b3071c6680daad33
│ │ │ ├── c59a2872ffd5765130f91a347edc7947aaee368e
│ │ │ ├── c5a7ad6338653009789688ecb424aa5173061654
│ │ │ ├── c60ed14853f958bc523969146aa3e5470aee539e
│ │ │ ├── c63b86ae5e26785524f119b3217ff64612abd695
│ │ │ ├── c6644d36a23fa6e0ccfb11407b564f28aa3bafac
│ │ │ ├── c69b9df749bdac989741911a659c231b7e2870bd
│ │ │ ├── c6a51ac5a63c8bfec69afd60d16c6a75018fdd5e
│ │ │ ├── c6bdb3d2d27e42f2ce1e7644eaa2339f015a566c
│ │ │ ├── c6c848cc77c91d752f79877fddc66e2ea2d5b65b
│ │ │ ├── c71f0c06f1dea80e10953caea132249132966727
│ │ │ ├── c72a780057ce4884a0c07b9b2c167d94dc27e70f
│ │ │ ├── c7e6186b70acf4faa3d5b378bbeebae41a7612d0
│ │ │ ├── c7f913833d93a3a3d5b9e558a91eb267763ec831
│ │ │ ├── c814ee430fd7b3c97e55d47fb8ee6d1e046ba18e
│ │ │ ├── c861985fdcf33fc72a8fa8020c9d5a890746913f
│ │ │ ├── c8fa263ad320cdea6757674446114d8a72765190
│ │ │ ├── c9449fcbc8e2f2385f100bbc393abb2926ed0217
│ │ │ ├── c955448a816b09a29951b149487a184094303bc6
│ │ │ ├── c9c96737a071acb05311fc970bce5babd05c15ea
│ │ │ ├── c9f383eb5a63a954b08e44337c594a88f92f3c84
│ │ │ ├── ca057e187fb8f41e11d80c197bb7b7122e8417f2
│ │ │ ├── cb6e8baa59bd32880d5040dcbe3a3814fefd0b48
│ │ │ ├── cc210b9903feefc7d3947846fff6815484bbee71
│ │ │ ├── cc62e45dfa60e400e8372059e5c32137cab88718
│ │ │ ├── cc9a83aa084653f8e6458cc7dbaea5993540498c
│ │ │ ├── ccfa6efac0df663ad75e535a071aac3d293017fa
│ │ │ ├── cd0f63406664178f5a0c09bcbcf099c88794e574
│ │ │ ├── cde994a19d023ea80e1e16b5c559ecced969d365
│ │ │ ├── ce2d7982406015fab472e6027b37679225c90d05
│ │ │ ├── ce48a2779374d032cc9345fcb07824fefbef8380
│ │ │ ├── cf4a455242308955025435aa9280a00b6ca40765
│ │ │ ├── cf641a0532c2af2670baf32e253db36b52def6e5
│ │ │ ├── cfb98836ef2bdd88f0fd0aad80b049b5b1ede18e
│ │ │ ├── cfd31d004a77ff443fac05132f3ef2cd23dfac30
│ │ │ ├── d0cde1f5672d15a8f1e6fc3536fff9ff16517317
│ │ │ ├── d0d5b0b2490054fdd6c1ea835c0161c071bb67f5
│ │ │ ├── d0ee069c3e7c67ad5883e4f3af33d0bcffe07176
│ │ │ ├── d12d5348234d9cd937ea04c0727ac04cf8e2a744
│ │ │ ├── d1ca5e4c68c5924cfba166defdaa25d6c9639dc1
│ │ │ ├── d1eefc2add53c1bbfee0f516e8f886ee15dbd27c
│ │ │ ├── d207a565a3cf77471549bbb5e7d9a3509e22dbd6
│ │ │ ├── d25f5caac7cf287e64c33789b313c5bf63c1b566
│ │ │ ├── d28d214148e2eec1517be925e0ddddfde112191f
│ │ │ ├── d2df1d23a50cf688ed218d4d18e2b6f169dead9e
│ │ │ ├── d31e368c5e992c173842b84e20d0eef266079a0e
│ │ │ ├── d35d82b76fd5194004654ba71a57469119721193
│ │ │ ├── d35f23ea7873242aececb567ecbe87f3c974ccb0
│ │ │ ├── d36a79d6dd1e28c127acb971bf4343b2437d1012
│ │ │ ├── d3e23c6a2d605cffc13e36248a678e9b663fba9b
│ │ │ ├── d3f3e7339e9f2e2310e822c8f1fe7a240ed981c8
│ │ │ ├── d42531630546640e1fd59dcdbdac9a4a0917f455
│ │ │ ├── d473186592829ef6ee6b886cf171b7b5ec400a41
│ │ │ ├── d4b171c62a463ed9c22397359f71034b68d80c7a
│ │ │ ├── d51ab63c4e1438f6863b3b6cbee513ad6c3d1186
│ │ │ ├── d51b779809ba509d6e9711710a44ce4d5989453b
│ │ │ ├── d550c829f4edc1c532c48b1138975f04ca1d9847
│ │ │ ├── d5c40744bd9274c746eaf830a5dbdf4923ab6124
│ │ │ ├── d602c1032b68d34355844505961383e56b59b428
│ │ │ ├── d675177e33486a72314b91a8dbda8a1cc5500215
│ │ │ ├── d693ed33f7391624ecddea5b9d5297eb8172d87b
│ │ │ ├── d6c36f3a561882ecf556105a644a5503d28653fc
│ │ │ ├── d7455388adc6fa641674211192a8677fea839bc5
│ │ │ ├── d79003e0c97a96f32b0d8c3b3b02ebcaaa94d926
│ │ │ ├── d7da694b051c7401429d0b05216001fb6f50fd05
│ │ │ ├── d7dcf33f17a0b7d6cdb1d7103fdb31113ce69384
│ │ │ ├── d829dfa177d92b2a4e72f3927aadacc0a7889309
│ │ │ ├── d85b07669900fa4f6d04dda3756821a9f73ee351
│ │ │ ├── d91ad057d2e696fee7ac60cc6a1d4e8c33df37db
│ │ │ ├── db2b2cbb9042a2be3a220853d7231db7f6d2a72b
│ │ │ ├── dbc10649b4263e1054b74e3e243f4da0e8649626
│ │ │ ├── dbf5a58cf0cfbf387674323820191e9837860174
│ │ │ ├── dc15fc0e96a718b8c569452cf3ea744117542107
│ │ │ ├── dc5755b294860eda3f0b9c5ef548d0d80affd971
│ │ │ ├── dc65b2dbc07b1faa23cc57e8abc7348b2afc0cba
│ │ │ ├── dc9eb518c0f1a5ad7bc4ed658739555b3850dc07
│ │ │ ├── dd42b5397cd6cd964eafcfad67e577a62d930835
│ │ │ ├── de5ad016a4f4c7605fe3a31b6799d6b4d062cd18
│ │ │ ├── dee366079ca87ce4af37f112fd789a947a10d786
│ │ │ ├── dfaf950682973447259d35d9796014dafa34d749
│ │ │ ├── dfd93a24ffbc74eab4561403dbaa570d4ca0b5af
│ │ │ ├── dffcc9c104760ca4091ad597fe84f7e896a06c40
│ │ │ ├── e00e957f04bd17f52f0acb5ba76012d9bc20d911
│ │ │ ├── e099ff0285922304c1d1f11cd51b87e2acb5d9c8
│ │ │ ├── e0ae581b872911a72bb91e4e4d8ce9b65ef60651
│ │ │ ├── e15d95e020ace2a0a200d2f5f4083a298e2f8031
│ │ │ ├── e1a2ecab1f671045f254f11a726b450bff9ca72a
│ │ │ ├── e1cfff1fc909ce6860d44dbcb432bdc1882add93
│ │ │ ├── e1d90d4d6bb403712cd0909c3ff05b57b99280dc
│ │ │ ├── e1ddeeb549e65e9461b2aba3ad7292922292310c
│ │ │ ├── e2c5bf492112fed70178d878c649de2e441b0383
│ │ │ ├── e2d171228f00a0118e682aab755b58c10e762b7c
│ │ │ ├── e35505f8abc3b8f46bd2f962028946cab3e167b9
│ │ │ ├── e3c2ca5ac45ae36805c13fd2f9c111cdb44e19be
│ │ │ ├── e411f4d03b841b7d429570481824082f8343de8e
│ │ │ ├── e4c724897a0c0cbae41b73c7008c3b81771bd01e
│ │ │ ├── e4c73e432a7118869d0aa54a794927259bd11dae
│ │ │ ├── e5241093bb38e06353a8ae7f825505d949dedcb3
│ │ │ ├── e57d2995b61ad6b64b48e7819337bc924fe0c684
│ │ │ ├── e5cd9c83c06e3600ae4dd03ab0b39a54dcfc9d60
│ │ │ ├── e668c73812f05e82f8d1e098dce5e9ce7dbc6ce5
│ │ │ ├── e6cf6422973e2804bbd0640fbb6f28d87152dbb2
│ │ │ ├── e72fb0bfbbfbb9ff88745120a6753c0c9a5cf6ce
│ │ │ ├── e78e3037fb557880f370b3ab4b7577d4ad116e7b
│ │ │ ├── e7ba35f0ca34a3611adb868a9ed41414a70bf69b
│ │ │ ├── e7e3e184d1a9ed5ccdd3b2e49b94bf249533831c
│ │ │ ├── e80886275a1657601292c73799f26ae8ba50e365
│ │ │ ├── e98fe00d74ae8b0f1784f9046f31dba6a78c6e11
│ │ │ ├── e9b427cb96e9c8de51ce3731102731e5c67bc646
│ │ │ ├── e9dbcc05ccb465d614bab397e754e3a4af57e43b
│ │ │ ├── e9fe71ca4ccb92478da9ef7fc3b8a081481f363f
│ │ │ ├── ea1454d71fd5d970785306a40442536ad8ee563f
│ │ │ ├── ea2d00523510eb3de7b4e31629d4d5e0e10a92c5
│ │ │ ├── ea6ef46e1115fdd657e7d90d2498f7b7d66c04ef
│ │ │ ├── ea996c0d3ef2fa5790d383a2ab808e6a7a891845
│ │ │ ├── eaf0ddb358a1daccd620e1e149eea0ce88d27be9
│ │ │ ├── eb2519d195c987a1548749066fcf5e5f3ca9e772
│ │ │ ├── eb2d65f245fd7ed52333b4c4047581f663232d9c
│ │ │ ├── eb7227bd0675ea9d2210d22c51d14916045e618d
│ │ │ ├── eba756583f4026932e9ec9f14a0ea54cc1783b62
│ │ │ ├── ebbfa63e30ebf32e6ec01be747382055cac27fd3
│ │ │ ├── ec09122ea0558493333b0a1aa9b0eb16e3d0dd91
│ │ │ ├── ec09442322ca39b964b5d7d87a1a7e2e2d454ba3
│ │ │ ├── ec0e984d256dc84a4a7bfe790da47ab325ed1f17
│ │ │ ├── ed19adc6258c25b9e16391be684b2008f8d3f888
│ │ │ ├── ed68bc25000b9788c7ffb1132eb0f9dd5beff197
│ │ │ ├── ed85634a3587605bb3abed6bcfb0a9736a30155e
│ │ │ ├── ed8f83ac6708d4bb38bb0757392abfe137e1280b
│ │ │ ├── ed9b852084414f046645f7fd7138b9a302455735
│ │ │ ├── edc26b03cf5369135232c760750d0920679c362c
│ │ │ ├── ee2e4b5ce371f834d99a9772f45f4bd4135a06a7
│ │ │ ├── ee30286f6fd7edf123884d9a71997e36ec8aaf57
│ │ │ ├── eedfd8642e8034be230363cd8f9909e59518df1c
│ │ │ ├── eef877d043ad2c1d9a7c7a419b42f7d5ec8cabde
│ │ │ ├── ef1ff3c82e1f2d070009f14907e0aaba9933806d
│ │ │ ├── efb76c8ef8472afdb11b96178f77cebfb982d775
│ │ │ ├── efc78be0737897709371c521fd871c81da623c5f
│ │ │ ├── effc0e6a61de731b57eb080d48c6c79a4731226f
│ │ │ ├── f002f49de0ee5e8f7b7a8e854930677883f164f9
│ │ │ ├── f07d5fc54ab668426f71ea031653863c66904f0a
│ │ │ ├── f07eafb9d5bf9fb41588ec8cc19ca6d0d92087e7
│ │ │ ├── f1c2ee421c5f0fe0867322f692579ac1f5a4a719
│ │ │ ├── f204f01574682154694e2a97a5b280f800afceab
│ │ │ ├── f36ad7feced116b48dbafc4e2ea0012878e31f91
│ │ │ ├── f59d5126d120b4b9182f548aeac3daa050c3c25d
│ │ │ ├── f5a1386744cec74d1c7269945b8744ebb4293f91
│ │ │ ├── f5d1a7d6e842479f9ba48144aa7162705525487e
│ │ │ ├── f605050ea0109569f1dd1437b8eedd588173ab8a
│ │ │ ├── f6972f45e7b749fcb37a022dbd524eba74812eee
│ │ │ ├── f776b40b36747a780adbf9c0fd60f6d4ac3fdf7f
│ │ │ ├── fa303aac3336a71232faffaf517be334e163ace1
│ │ │ ├── fa4767259bba8c814f79c8ffc760dcb36ea04c4f
│ │ │ ├── faa2f323b3cd6fa944e484add07f3f39a31b98b0
│ │ │ ├── fae17a8ca331aad4863eeecfeee128d250af297d
│ │ │ ├── faea000bb28b552173fc166977180a52497e780a
│ │ │ ├── fb565d7671272c0afe27ada3b55919b677f7147d
│ │ │ ├── fb591bfa64343d7a52a5042e8c6b021285751401
│ │ │ ├── fc49d5669e33143a5674d21d025299da6b761035
│ │ │ ├── fc82c2ba9d8368d088925a86752da9b692fe17fa
│ │ │ ├── fcebf49a9559f7ede232c213e19ba4089d8d64ea
│ │ │ ├── fcf1344223eb3096471118b9fa863111ec17ae1a
│ │ │ ├── fd053af58404f23949f68f587b8eb6ad2b2b394e
│ │ │ ├── fd541997d54cda61dd0cf569be1e927a793b3547
│ │ │ ├── fd5a6345bc66a38d2dd7405ac4877ad954b30d4c
│ │ │ ├── fd93f7b3cf08a59d9a914d9247dca4ac933407d2
│ │ │ ├── fda064c16d5bbfece0071b9e2eab71f385b4f3c3
│ │ │ ├── fdf16bc5c082ab609990d5a8f9aca2e08d2f7528
│ │ │ ├── fe5ab636a528f4fa9b998684c4172c9938e0dd81
│ │ │ ├── fead5f4748928ca7f3f3e120253b7c549fac0459
│ │ │ ├── fec2acae6e3c73a70027e5dbd1739d1f77a58c27
│ │ │ ├── ff4e63b6898b5c9e7752638dc0647f4d18e924ba
│ │ │ ├── ff6a74fd5dc2267c636069043c8061ffd232202c
│ │ │ └── ffcf4452b358150dfebafecd20e96a89a5b791ac
│ │ ├── packets_posths_server/
│ │ │ ├── 9ae37e3fd9484306d9bec3629ab2626773fd3595
│ │ │ └── aa10c505e8e369f8bd9989a8d4023b507764ec26
│ │ ├── packets_recv_server/
│ │ │ ├── 9ae37e3fd9484306d9bec3629ab2626773fd3595
│ │ │ └── aa10c505e8e369f8bd9989a8d4023b507764ec26
│ │ └── qpack_decode/
│ │ ├── 00e1dbf37fba13a1966a1a7fbb4e4399270a877f
│ │ ├── 01002d32df06a05df4206fa05b380b4c2ebb0e48
│ │ ├── 025236fc56883ff6b68ace3005ee11a1439c00e2
│ │ ├── 025bf8f19916dc472e90986459fba78b794b271a
│ │ ├── 02e2930b646acee961d317c3bb01838c702bf586
│ │ ├── 0301b4611e7628b333c322191d67bc98dd40b771
│ │ ├── 032a1cb2fcd288debaf3756cf02cc8e9d365ae77
│ │ ├── 0389b46ef8babfb1a5a543f7430c66e4ef38da69
│ │ ├── 03da02bdb5382901c3081c7628d0fe0d3ed08480
│ │ ├── 0469160ea0cc47c6b50c01cd5d039f76774a0b3d
│ │ ├── 04db33a4cfc5c48511177dd2149962b3f87e32f4
│ │ ├── 05e5a9f40a49ed6e519faf8c98665f6945a76e85
│ │ ├── 0678a8571fbef7d23cfd6b7f9c290faec65d9a6a
│ │ ├── 070becf9ffe01b38516c4e92113b18f805954db8
│ │ ├── 0762d385762fa70fea091e04b25a37218dd85d21
│ │ ├── 0769c7bc1c230bd061b0d7b799ddedf9e3879b29
│ │ ├── 08a583c0fc6609ebc4f993732f6ffd8b06214b4c
│ │ ├── 0a4ac0799cff23132e6686143495c1ad68495792
│ │ ├── 0a710b2b1235e97561f628b66ab92ecbe32edae9
│ │ ├── 0abdfd09fd12576ea913addfe91b0eee23c010e1
│ │ ├── 0b163753986ab8121b1e9cec3cafef819e760c8e
│ │ ├── 0b1d24f9344ed20c543462e704ec5da4ba3cad9b
│ │ ├── 0c35e199f7952f5df3c34ca9293a68eb72620c36
│ │ ├── 0c55df3c612d22fb13e991cafc0bf2cf41f37ec3
│ │ ├── 0cc7e11374be386fdf0d436c1c1cd59a8134aba7
│ │ ├── 0d5c215a9ac8cb323e6ecb95c8e7fdd846c15246
│ │ ├── 0dac12e8e8c72e3edef646918249c1343b695112
│ │ ├── 0e193d05e77da73a2e2fb4863d0bc87ba401d109
│ │ ├── 0ebf87e99f2585f844687adbe4a8b8153d2f88c3
│ │ ├── 10434db07979882ad35f2100e1b5359781cfb995
│ │ ├── 11fe182aaee18d0f3c116134ecec55a29ff3b2e0
│ │ ├── 1256f042c18db040bb768fe235c460449da5a8b2
│ │ ├── 12ba1b4bfda1124a8363e328c7f92193127b3d45
│ │ ├── 131f91d526dd5804dd8f87200467408757ef5fe8
│ │ ├── 13397261a996f329edf9dc405491afb9dc1754ac
│ │ ├── 136e62e529dcdb80d2956cbf89c0b8d36bfecc96
│ │ ├── 13f4bf3f5c8ad3bdd600f935613e1f953647c1ab
│ │ ├── 145fb971177b418075853fe53ef7c7c61e6125c7
│ │ ├── 1466c9a547be8a5cdb9a66eb97c2955c0aed79e3
│ │ ├── 1535300c7581bc65e5dcd660ff68ffe2a3061117
│ │ ├── 16256f2eed8fa6295df6579c1f13cc19ca3ed103
│ │ ├── 16cd5a44f52703a9a049a91522e2c7f7c22fd195
│ │ ├── 1708e3c33398a5ce728134c261f7d4b82727f415
│ │ ├── 17d6fdc9d91f517d76ef4742446386a0f06e2559
│ │ ├── 17fa28cbecb3876d02fc74d7a1ce2db92a67b0e2
│ │ ├── 180a5ecd0cb6814e8c6ad86a24e878aed6e52736
│ │ ├── 18eea3b493b082490165d372eafba9e495bff3a2
│ │ ├── 1919c86bd47f75f3d67bdf536017858fb51a0f31
│ │ ├── 191e6f0e8b11f7b5fc279d9dcfde3fa8d4d9c92a
│ │ ├── 1c1ff349da4110b6cd43fde3a4c8ebdbe3fba4a4
│ │ ├── 1cb53efeab8cb7153d77118db868580a991ee913
│ │ ├── 1cb8dfcd5bd58feff7cd4b8090b6f9ff287c1ad3
│ │ ├── 1cc1a4a09897a4943b359c6bbe686dbaaaac2109
│ │ ├── 1d3f9ca0d7add4aeffa79e35d6ef649fa7c46c72
│ │ ├── 1d76cef839ee530ef9221cd33c439649de627947
│ │ ├── 1e07554d871857d402da21228e5da62ffa31c5e0
│ │ ├── 1e4048ffc3fcaf1e716476a7ba772763c9cc90d9
│ │ ├── 1e986bf3f6b3318962bf42b657756dc520c15117
│ │ ├── 1f3769acc9b82a9c4cdc0ce7ad7a3c659cb9a2d8
│ │ ├── 20039c606835fb25e808073cd978263fa7687366
│ │ ├── 201342cdddb3b8c686fb502664ac91617a4aef89
│ │ ├── 20c6a49a1636af8568f2e0873d4b76d8e59c164f
│ │ ├── 213e374bf2669c82e5ed6a1451b491d3d7d3e341
│ │ ├── 2237d9980aa11a18a106aa6e8eab124833a6d6f6
│ │ ├── 22382d03dab1e043b56926f94ba5bf1a75280b9b
│ │ ├── 23b5f31a247edf77fb3064ac694ce18e74ac0c5c
│ │ ├── 272fe3549b8e8d0e84bfbc32ff32593165bce833
│ │ ├── 2788fe8df7b1c0743115f5b357eaab515cd38c59
│ │ ├── 27e9edabbd020c9a29cb58d6dd6a7c2e8f0c7740
│ │ ├── 2872ecc7d880bc6089418d12044e5724d0ed1418
│ │ ├── 291912a79d5fcd55e47f6e4fbac6c82a697fb249
│ │ ├── 2a2c417327054b4bbc033005d0f048ccb1f023b1
│ │ ├── 2bbecaa186302b609e2f499bc0146b4904b369df
│ │ ├── 2c96a099e1ea29c7ceca94b643c6a24a69d46dcc
│ │ ├── 2d18ca1f8611ac974c8b79082efad8e07ee1c70f
│ │ ├── 2d576960b9a1974f01df7d1008d7b95224269ce8
│ │ ├── 2d87fdbd3ef527247e30ef65d7789c6017e0ddc8
│ │ ├── 2d92a1deb1df02a146bbfaf50d5ae7156943939e
│ │ ├── 2e359dfc8bcdc849f9bdf8b1b5ba1707b960533f
│ │ ├── 2ee3d4e203e814867e484c8379f8103d2531bf20
│ │ ├── 2fcc837fdcf19093fc07481e105d0e106c603f02
│ │ ├── 30396103dc8015aa6999f898b3a3519ccac6379d
│ │ ├── 3130e6e549eb6bf75bfdf15f6f0e2a9a490821d0
│ │ ├── 318edab5378d4d506bea461b58afea23e7e27fbb
│ │ ├── 31ea2d281fd0e7db70cc9c5f4b916708d7e9392c
│ │ ├── 323456136961397da3c0429a6492bd1f9190757a
│ │ ├── 33cb2f19271cb89447ae2bca2e73e4c4350451e6
│ │ ├── 3400cabf81d7839890cb2045f9b64eff662c9330
│ │ ├── 344b2f5d30042047fc35e9930861308286b94931
│ │ ├── 34a6020581f22d630cee11c9c83f834974382ab6
│ │ ├── 34e860df1b12607e474efb526c4047956c073453
│ │ ├── 351ebcc9797063b4f3fe80b7c117621acec912ea
│ │ ├── 35578193b2fd4de2e6859ebac57eaf672fe9f0ff
│ │ ├── 37b7e167db697587b5661c569ac38ffb5f498e41
│ │ ├── 387ccfa5fde4b1745411686efe0f388c7cb0a910
│ │ ├── 39412207a2044393327d87cbaabddde289f4d434
│ │ ├── 394e904bdbf878f7a1a5bf67888fb21755a8b591
│ │ ├── 398a92c55381d8f396aaf1e484034dad6a2fdd18
│ │ ├── 39d903c7174460e9d7a08630522a8a3eca44a8cd
│ │ ├── 3b2fd4c127c54578e31a151052e23bbdc035fb9d
│ │ ├── 3b351c9b1b7ee7c6a3a88001c18557b91f977a31
│ │ ├── 3bf87a855d6e3a3109a546c4105aa9d7a728f95d
│ │ ├── 3cac8dc8cf74e0547c8f1ca13976c1fd659c6e7e
│ │ ├── 3d2d01a661aa7d23989b113fad1835f983d857ea
│ │ ├── 3d51838381a7525f07566aa8d9aa4fef3a549abf
│ │ ├── 3ea1c723d11312471784f6d027b08c1ed2aa8bb5
│ │ ├── 3ec4374d0fcbf1470a616b58478c64e9d2750988
│ │ ├── 3f26bf019f07d4df95145e61127528bda535981d
│ │ ├── 3f4bf38ee41bc3c86809c2884de76b8195418e2e
│ │ ├── 3f693531cb2db43368b909cf5cad8bf7b89920da
│ │ ├── 3fa5bfd93317ad25772680071d5ac3259cd2384f
│ │ ├── 3fc3e1d986713a39fd7a522ca03cc840be9ce5e8
│ │ ├── 40d92f230c5257a383424d5db622e0fb88274911
│ │ ├── 417a31b64daf2a5b24cdfa2ccdbbfb729dafbb70
│ │ ├── 42592f46c0878b59afae781c81cb9cadb935731e
│ │ ├── 434233ebede6c984ab2acc096a19f1a343277142
│ │ ├── 43c719b85086792d2c7afa710aba553728e57dd3
│ │ ├── 441aa70137780d404a8202d665bd3cb6d572053f
│ │ ├── 44b33774470d8f7fbc227e1c5ffa90add6c6a0f1
│ │ ├── 45187832dae51e95536168a4d2493f59c3f89765
│ │ ├── 453ea3a491331d7bd3d63603a80546a14ab2fae8
│ │ ├── 4553744bbcc4a0cd9bbb49055c60b03d26d6500a
│ │ ├── 45f7e450c2cc406fc9fc70c0f61c15bc80581482
│ │ ├── 4776eabfe1d9ec687982caa8f2f4e64d17481228
│ │ ├── 487da629861a85e37c66b8e2a607189a0c24947d
│ │ ├── 498caa67e761196bfa8e2f34d1cfb2eb775bb92a
│ │ ├── 4a150c7fe6a697dc5703953e6d8cb6e103f0130c
│ │ ├── 4a4d329659e1c831db7a1522dd6b0dab0c719ff5
│ │ ├── 4b12f06f88334c62a540bb83a5ad65d92c1159e6
│ │ ├── 4bf9dc9638a574b7025c0e560af75cf3796edd6f
│ │ ├── 4c049d69dd09f60b2a4aa3749fd64f98bb21c1b7
│ │ ├── 4c3825785fe9499871fc638e97cbde71db9c5adc
│ │ ├── 4d3b8a3c50cb37f29ee87dcd3116413107277b84
│ │ ├── 4e075f8dfebcbc252e56d6b199f4dfd581d3b29a
│ │ ├── 4e67b9aefeac229de82e36d3d319eddcb5ce954c
│ │ ├── 4e89d07595d0d026f098412d393addf315e05435
│ │ ├── 4ecf3f2899ca16a1a303f3bf1b62059dbce667b4
│ │ ├── 4f22bdc21c99d851cf5ff30558332f658ee46f65
│ │ ├── 4f7e760cd98486e9dcdd3315a05778d9a7f20c13
│ │ ├── 4fbec485b09eba1377acc3af638827b7eac3ae36
│ │ ├── 50c4509efda8dcbea0e0eec77b59aa624e176d94
│ │ ├── 50df183b80223dde85dd784425447f922e0c6f11
│ │ ├── 50e92b58f5e32890e23eccf4ff5346d8b4fbb06c
│ │ ├── 513fe619ebedb3ca136f4fa257f639a48358cba6
│ │ ├── 514d2e48c16c3e1192eecb4673d987ab54c21531
│ │ ├── 51b514f0a18f88f7a1cd4d8df74e05a50fef9218
│ │ ├── 520fdcaf9aea71a8369b70c9d7f3206565c91ab6
│ │ ├── 5221da6006fcd6bd357ce19a0fbcef895cb0d6d0
│ │ ├── 526de4e1097375983dadc85a08f327047649ded4
│ │ ├── 53683cb0c2b09d029e1c791d29e5d011a7834f33
│ │ ├── 54009614f8e5896556131bfc2e9676c12d69a11a
│ │ ├── 54145cf4a9842dc0bdc581bab8b0ae510ebc812d
│ │ ├── 541bb4db914646ca8bfa3e4548101d77abafec9c
│ │ ├── 544e66740e4a7ce0e1bab7217d2528d2e6d9b811
│ │ ├── 54ab00f2dd152cc91284c707735587709b168e6b
│ │ ├── 54c65adb6cb5a0d154adfbbd3dbe86cb174eea73
│ │ ├── 55853b07b347fa93cea917b98d17027e726fedf5
│ │ ├── 55c38e9253befc318a7196921cc0092689c17537
│ │ ├── 587769c92dd937366fd2ead23e769c393f0a6fdc
│ │ ├── 58fbb611237c8c0fae4ba801b5de12304f91b15c
│ │ ├── 5b1047c5201637a55f95889e2ac707abd5dfa825
│ │ ├── 5b39839df2fc9ff8a2ab8abd3e4af70627470c15
│ │ ├── 5b80147a403edce1bcef86fb078f06e5a245e562
│ │ ├── 5b8a0b61912fcc0d9a3bdbf2959b8421e80e07b5
│ │ ├── 5c41c5cd2b66d690404746bd14329bba14d67a9b
│ │ ├── 5d2a48fe11717909a4e16acf943262f10473485d
│ │ ├── 5df91c5df959d8ec3ac4da0636526c9a572bb769
│ │ ├── 5e37509ce51787d029472017487a5b21d23e0ece
│ │ ├── 5e7bd00a6f0c996622aab0d05c4f5d2f8751dfb4
│ │ ├── 5f30aa17b1df55f7fbc481390db3b9325afb3c7e
│ │ ├── 6123af566cad0b86fe22a983b6702f1ca4da0157
│ │ ├── 61448054bf7a5baa7c2f6444929794a1ec91ba46
│ │ ├── 6146e8e16f7e4182e92410337d3c06d2b929e68f
│ │ ├── 61d1b92af498d4b8348aebed35272086bc13f12b
│ │ ├── 61d4217f9116300ee6a26b640c2ff2bbe9cd4a36
│ │ ├── 61eb4bcb9f234c00bd5231b36a143c2bef3f512a
│ │ ├── 6276cb5e7bcbc59b3c56a0037dbd3ab3abc4c2f8
│ │ ├── 63428686d0bc012b6d89e316b7843586c5c731a2
│ │ ├── 635338698fe1aa79910a83d5a214126050def1d7
│ │ ├── 639777406e879d6ba483c85bafa806670db74fea
│ │ ├── 647e242902e268b0435254c784787528dcec8b22
│ │ ├── 64876959aa79fecd468bc09c6b173bcd268bcf9a
│ │ ├── 64a1bede71641692664d69d4f95adc35953f733f
│ │ ├── 64e23500ef73356d3180bab4b60a4efb2f2ade9a
│ │ ├── 64f4c0a2c65b2307e28486e212d8061ced9f0d21
│ │ ├── 65c0591f541af77e010716ce5553ae615785be3d
│ │ ├── 663f5765df1e7de8a9bb911547c108f621c1b4eb
│ │ ├── 669436d423138023429e78aaabff715d271e8e03
│ │ ├── 6704a715b05fb5f7fcfc314d9df7a4ad40654064
│ │ ├── 67144008ef9873b0c988da51c78e27c02d6c3aab
│ │ ├── 674fde94ec12e5f77a86d83a1f62d3c7e529a348
│ │ ├── 67c79aa9f258162a8b6170896b4aee82e81402a2
│ │ ├── 6957a1f97efb299d8f3ca4ef216cca94a811b5f1
│ │ ├── 69cb9f1123f723454d3cd0f914cf763405aac326
│ │ ├── 6a17b064d1de71f8d705c4269c42f8a5fb4cbe26
│ │ ├── 6abda42115d3c9dc45890121afb3d9f688959ff4
│ │ ├── 6b3f2a340e51d0c20c1585bbf66e72aa6f50e0c4
│ │ ├── 6c8f26698182d8ad63f897e92cf8863459d728ca
│ │ ├── 6c9900af6a18167f810ad97fffd98ebca1b40715
│ │ ├── 6cb208ccdc982010795407a2e96651e468fad313
│ │ ├── 6df942147545885d2000e61e612689a867ec8117
│ │ ├── 6e57784e75db443ae9419f08c82aa84ffe1b4b46
│ │ ├── 6eeb3a6ee692ce9c62353a0075fde63e929a3370
│ │ ├── 6f11b8ca94a9ce3be66fce0a4fc3670ef7827c7c
│ │ ├── 6f7935259db0461330fa3c3d0dd409be6bfea31d
│ │ ├── 70486e9ebfed27a3a97dd49fda41b9ee289b8a5d
│ │ ├── 70c9156a6d37c9f56a8c44a47ec9ed456b822dc8
│ │ ├── 7156a274b7c05d2e00b67426352f1e39125cb3c2
│ │ ├── 717fd94b003a8b72c2ea42e2f67cfbe2281da118
│ │ ├── 71882a70d208769cea3b1cf20a00bebd3fd4fb92
│ │ ├── 7190700d24d8d33d1a5b6e56c4af965a8a944541
│ │ ├── 71b16f91f576a675d2a9f262df187d5346ba31c7
│ │ ├── 726f88ee6fd3afaae3142811b2301e0bb78104e4
│ │ ├── 732baab0b0315575da7c5ff3f31d08eb8ebba8b2
│ │ ├── 736ec334b327f40b0834454303b19e7615dff1e3
│ │ ├── 73b875e881b5588e9119fa83f3c23c7019414547
│ │ ├── 73cdd545cb9f0e7e357673a625ca10993758f404
│ │ ├── 74f85de06629b9e866398c154ca87952fd990948
│ │ ├── 756952f980bfd880a05f9973718edda98dada4d8
│ │ ├── 75e80ec43df21fc8fa2fe49078d70d4cc392e52f
│ │ ├── 767a165d98f9ead608cecb9abc1ba663bffb0a8b
│ │ ├── 770d14f61b435a0ca1b53db60bb85c4051c61469
│ │ ├── 770fe083b0716f6042bb3d24a624e1f5901f9bd8
│ │ ├── 774b97959a4a8c108ff85d0750b93be51e5b6787
│ │ ├── 7754a75544d8fb96c08f94894e0120f3b29d4d06
│ │ ├── 77619ed6abbbbfa3cc01283a4c6917c5006b8838
│ │ ├── 7811e3571625618f5c923197c3533632f281e2d9
│ │ ├── 785f8c9d8025cc5d65840af5ccff5c7e08c8c855
│ │ ├── 78f4f8cbfdf5ddd20b879e0e71e761a802e7299e
│ │ ├── 7908d80330140fd7b15ef9ac4d2cd4b7b75addc6
│ │ ├── 79d667ed0657468d439109cb4bc7e2955103bd90
│ │ ├── 79dd6da9ca78fafb9e993b144d613db012f6176a
│ │ ├── 79f264b6ae306418a23e02acdaee2ce8f8653ceb
│ │ ├── 7a939d3971804e3750decfc05458f72444c908d4
│ │ ├── 7b5235bc7684f131d3b91588be3b5279b9a2d023
│ │ ├── 7b5bd73b2098b787b5659457cc4e0b084f762b9b
│ │ ├── 7ba99e1d77bf3c9fea760a6d0a4f6c40451c43a2
│ │ ├── 7bde08642b72f7ee94ca4411d004097185d0591f
│ │ ├── 7ca39c208df28742239a1fb24d98be1ad9104da5
│ │ ├── 7ed7943400658ed3503632443baff0bc87eb0426
│ │ ├── 7f53dae8c4bb8ece4c4c0060c2af873341e32c9b
│ │ ├── 7fcb35f23a8754a3f9e58c8cb429c1067e9967db
│ │ ├── 7fd3d98bad8f3a2e785ecc0ef0f6967be57452f2
│ │ ├── 8037ed27ea86fabc8c2108c35069770d85340ac3
│ │ ├── 803cee12c08d6b4b9c3cde4ffdfaba068b2cdee4
│ │ ├── 80f04d8d74bb90b1a29785323add44827892b71d
│ │ ├── 810a06d12925ae06b2d54ea5407023adce355c32
│ │ ├── 810e527c5df951c81e5ac41f986855000ac4d9c1
│ │ ├── 82139e0529b6e9cc080047f555fafb8091abf769
│ │ ├── 8252fd8d4745ab1875a02090581fb3a3d51abe78
│ │ ├── 8307740678fb45cf707ae035b0c749eafeddc6e3
│ │ ├── 83490f0a81a95963b203d7c7827c82e3b03c8e6e
│ │ ├── 838e134aedf8bb9cdcc31332487cf1af5351a05f
│ │ ├── 839bca8d8341b43bb34e8f34dfe9b5c5bda2d2c4
│ │ ├── 8422365f8c77ae80c4310627949a4a84ac4f8ed0
│ │ ├── 84229838b0142b3adf6258004d070648fdbac25a
│ │ ├── 858416dc22c6c02c59065cbde2faba3d09729add
│ │ ├── 85e53271e14006f0265921d02d4d736cdc580b0b
│ │ ├── 85ef8f0a14dedd893e5a4f2bf6f9331dd432bec7
│ │ ├── 8692df3a004ad5fe96fe069d73258fbf5b090ce5
│ │ ├── 869989fb0161c02968c6bd7bbf56dae9fb3e77b0
│ │ ├── 86c1a83d4e198ca6723093ddf12a3949aaf85544
│ │ ├── 86e1b600bb9f8e83720c6a526f3bc479506fe109
│ │ ├── 87a882b0ae341d53a545f20032cee1eab3e62eea
│ │ ├── 88959fad3562f1ee0c03710772f9ba3ce9999139
│ │ ├── 891163a5f443198c9578eee25ab7d291a2f62b59
│ │ ├── 89fb0a482852ab23d939463c8200a5a7f9dd6ff2
│ │ ├── 8a21554ccbb758bf272c44ed2bfb245122766ea2
│ │ ├── 8a53c3c035cbc134bb974c43be0f76dcb5b44c5c
│ │ ├── 8b8edf8bcbebd1c9c62d9336118b8b44ac6a4209
│ │ ├── 907d35be9c8bdd3f63dff0c05e06da40fe8f51c7
│ │ ├── 90ce68b6646e84c9f116340784ab3ad5ff624687
│ │ ├── 925603a8a43cfaf6facd87625e7a669af2551620
│ │ ├── 934d273830e2a7a5c07f38e59239e6758dddfc44
│ │ ├── 945ae4d631071140021ac173601aef8db262d0d5
│ │ ├── 95295d3777556ef727f606b8e791ec8ef400b713
│ │ ├── 95e1c34fcc230143378464a20b4e85ec6c37aee5
│ │ ├── 95ed069cd723680afda0c3d2904acf069c9064f8
│ │ ├── 9656eec3092f2163ad358c7eec031fdf30820dea
│ │ ├── 9713162d3cecbc5394629d9623f8d737c3be7a33
│ │ ├── 98309f3321933b656469c0358c4b3745911a1d02
│ │ ├── 98d472be5d086d7db6f91897fac83d000be85862
│ │ ├── 996ad2eaa07feee97f7ec53082f923dd0850bb1c
│ │ ├── 99e185a0c52940df6cbf59365812ca8b06a1cad1
│ │ ├── 99fa17357ade9d48e2dc7ab099e34264e0d8da60
│ │ ├── 9a9e1d6e7b350bc7c3ba7a9cc13a562ada0312b0
│ │ ├── 9ace90df3b05ddf7ae5a23af482fc072659b3114
│ │ ├── 9b0f4da82f1d8e0efe3fd602941dddbc5eee3d08
│ │ ├── 9b7c3ec6265973493d02ba2b98e3ebdf5ba6323d
│ │ ├── 9c24367ab94cda9d22ca3464016ee4b743e2308d
│ │ ├── 9c3c634ff44887ede4f9b028a3ac209c7d4ea26c
│ │ ├── 9df0df441a54bdf165c2ce4643fbd15aae1fa463
│ │ ├── 9f33ead21ba43e84ec1a570dd4e709664f8eda7c
│ │ ├── 9f90953020cb5c3e6eb8bab12623561bd400a5b3
│ │ ├── 9f934df7c406b1f9bfa339130306ccc002747eac
│ │ ├── 9fa727784ecae3d419f51dedc744ac7e9130d455
│ │ ├── 9ff1234ffe8936933291568ac21530bdc9ee89bb
│ │ ├── a0722448a80d3043f686ad771fc2d3fb26b99fc7
│ │ ├── a17182f7987c4470d61c96a22849420f681f6957
│ │ ├── a2298a53038fb2611208efaa56db6bf58ccb940c
│ │ ├── a238788d5c7c9477537e53d3d2a6147d0301658d
│ │ ├── a3b8a177534f9fb5f239bd30dd66c29d987bcfb1
│ │ ├── a57d22930153ede06a12b1e906790f6eae0730df
│ │ ├── a583f000d8b6aaf894a7b9527cba2e04593c0aa3
│ │ ├── a596bfabd7d402c6933beb0b3282da03de745b29
│ │ ├── a67555fd82d1d5587f41a3fa8447e36be09eaac5
│ │ ├── a6caac2b0aa0c607c04c465bb282ec11aa389cb1
│ │ ├── a7bd4d4065760d9150f3a8f9962416d7ee4a680e
│ │ ├── a7dd39fb46714cc10f5b008b6f52b82c9fb3b05c
│ │ ├── a831a38b10f3b62523c01a96532a578ec387e3bf
│ │ ├── a90f069fe132c7393fe450ba13389e51065c5455
│ │ ├── a977773c687ba711cffdf643d5cdc3d3933da2a6
│ │ ├── a991657ddc958c4e15e6a6bdd54515c17dad0244
│ │ ├── a995595ca2fce5c7678c6b611b2de4bb57f49c83
│ │ ├── a9a61e835552cf56620ec2f22cd76989dbeb4ddb
│ │ ├── a9dc080ef6cc2d253624a06e7cb782108eba8e16
│ │ ├── aa9a0dc28cc3a999d9cf88e96cff15bba05e351c
│ │ ├── ab58556d4c125dfe5b04329b075ce4a5c977d577
│ │ ├── ac2badead582d585c777a24374cc75ee0db07dbb
│ │ ├── ae80c54c939ef06fdf396beafe5e6ed05c1a1d04
│ │ ├── afc4f31eabafd766dff98160bc5f61d7d43be915
│ │ ├── b01836131ee3e9976a3e3d019c721997614ffb67
│ │ ├── b09fb2197744b96c8c894f30540298b9081ab2e6
│ │ ├── b0de7fc0f0a12e637a923ec311d3ba65fee56ec1
│ │ ├── b1311f7125e322381da006ae3991ef928b1c12c2
│ │ ├── b1d09cdd023a54e2c8f72543aa708a3475616f4c
│ │ ├── b263d01e7377741208d47f336b55c1de3483b92b
│ │ ├── b38399105f4443a12dba47d418dc78ccbd24109d
│ │ ├── b41a01d7b99accec5c5a6ce7576aca382cf75119
│ │ ├── b4adebf3bcdd142c18f42f9b0459c0cea1f0c467
│ │ ├── b57f34aaab6de1aab5122a61ed8f846bbf6c5642
│ │ ├── b5fec54532c025742fb93ce25fddf10ba3f08f4d
│ │ ├── b7192eb614717661fa79c26d0f77afd4e6c54fa9
│ │ ├── b7a1a4bc4a093456dc2c899317ecc5e86f65f694
│ │ ├── b8ae903b8170bc36cc86faae9f1a51ec7fe2ab67
│ │ ├── b8f08a794900413cd882d0d5ff73da15be3fa33b
│ │ ├── bab08480ac09fca88d50a3a6ebd9369789436df7
│ │ ├── bae73a3a1dfcd41675ec68a4e2e00c08cb9d103f
│ │ ├── bb37646472a1001140900a18c1cbe31dad54cff8
│ │ ├── bb5ed80add79653c6661542d671bcce98d3889d4
│ │ ├── bbf125e3d33bda159f9f9b4e318dd705eb908be4
│ │ ├── bc99521495d07c760b178be214dbe76c785c04e1
│ │ ├── bd2d52f89d69b32d09f184083426967ad9f381d8
│ │ ├── bd2e9f42f6a2699407a79222c720838a4793b995
│ │ ├── bd325815b5404905ca0fdd7f47f28c44f0faa0bc
│ │ ├── bdd67d8ea81d71c006ce01965def97baac9b8b30
│ │ ├── be369ae091d1dd411891012d33e39e5caa74c254
│ │ ├── be634c53b3cea35e47f187f7c42b93f8c9d8cca3
│ │ ├── bf0b4be468118ff162c33029675d56668211b462
│ │ ├── bf50fda7e279d4ba9d6a05d93901a6bbe15ea947
│ │ ├── bf6d8aa8e500d7a9073f85828c07ba251275916b
│ │ ├── bfdf1777f0f8441d701e7b43393c54a312febf2d
│ │ ├── c009fd7d1befae57f93864e16bb9b5bcfa6ae9f5
│ │ ├── c05bd3beca3e67327fbb170b3b805b3172d3826b
│ │ ├── c077e58eecf841678475e04619f6bd11e9c3b68c
│ │ ├── c139f15ee43ad0fd83264c075e402e0226c95bdc
│ │ ├── c1a25b34c0e99d81ee6026178aa0807cd4bf6ba1
│ │ ├── c266faa97ba32e1a949c0e34642b693ceb6b0c3e
│ │ ├── c29957a6ea93068d69e5b295b449e32e39f9d3bd
│ │ ├── c2f2b439a801150d252ac21ad3f37ceeff6749ee
│ │ ├── c33d203581354863b8637c4af392aed515156cd3
│ │ ├── c346659b93d44e967540e0104fef951063c9b4c8
│ │ ├── c358aaee2cbbe11ac133f251d7996cbe4aa0b502
│ │ ├── c36ce5443dc6a46f8829f8a296564473df9bcd5b
│ │ ├── c3bc9d59140ddc24678e90b639f4e5cb2208e11e
│ │ ├── c3e0960a53074031f799c73884bb36cc4ca3bff8
│ │ ├── c4085c74bc372c61cfa049de76938f59ae15026d
│ │ ├── c47497efd7175919cf755e3239683f59af8f014b
│ │ ├── c51858d7ccecc8e2fc1b6f96bb3de4922fd65676
│ │ ├── c59561ed0839eb1ade4a0873971f0a601457cb93
│ │ ├── c6b03fd971cc246316081f75c98db16f47bbde69
│ │ ├── c7b6a8b7b1f6a2a25674d7055edbde59ae3a04e6
│ │ ├── c7ffc92484397091002cc90572bb6e431528e1c3
│ │ ├── c8232da719422a3a91332975d029bba394c2668e
│ │ ├── c8f320b08909a1eaa9507db5c3c467de6982dcf1
│ │ ├── c8fba6512d0951bccaced5c037cf0d8bf0c559ce
│ │ ├── c96e20caeaffb2669411bf5fc456e7efb726d2e1
│ │ ├── ca79f9188a547b6aebf8a2d30cd9ed4d4f641a16
│ │ ├── cac72d01baea345dc2adddcb637e262284e34ad1
│ │ ├── cad0b1635aedffeb5aabaa57769a38ca53ca879a
│ │ ├── cad8c3a1bfe13c857a7594cd46590c7bb8b5d761
│ │ ├── cb47bf784ed81081edf093a7e6ddd84d9f36ddd1
│ │ ├── cbc59de1d39d7bc9825c50e39fc1260fa1fcef18
│ │ ├── cc0c53f907a24cb99096052e35ffd2a8ba930550
│ │ ├── cc15b68f5bb7954e4e1ab8b403759ed76d58a43a
│ │ ├── cc2afa2d6ff0c064a8dd1be4b3f313a118fce2bc
│ │ ├── cc9bbac1d63fe528712481c84712ff067dff7bc6
│ │ ├── ccbf675ea1b6b0fe7b7656db8c6564018a4885d1
│ │ ├── cd456f9eb610baf01f292886a55917f2d9b9a07d
│ │ ├── cde3efd84ea714407f3850f3f3fbb5cac1d145f4
│ │ ├── ce2fd5e03c9528492e2df1b05cd219121049f68f
│ │ ├── ce7fec2b645d91b42a118c6f3038dec18f5fe2f5
│ │ ├── ce84bb8af3e64c1a4b88df6c7325bcc6f2340d78
│ │ ├── ceaaf5646221e485b7f78ba9089a8179c0b1f499
│ │ ├── cef28e3f8aafca1f3d532519e3280921404e39eb
│ │ ├── cf8f891bbf62c528c48856605cb3ecfcafc8259c
│ │ ├── cfa2cce42084f2ecca8e9e7f7df1e91caff5f549
│ │ ├── d26a49dfcef3f397df180a5873098096a96a62b1
│ │ ├── d2bf954d5e479da3158934f60b9d0eee56f846a3
│ │ ├── d3265c153ebf636f745e1ec4b89b93d4c57c4aaa
│ │ ├── d344cfd756bfadd10263656c4f65e03eb80ce08f
│ │ ├── d39b4596bbc735d529c1bf4fa597c53b52edab2e
│ │ ├── d4163fa91f294e540c438a208fa981ea7c246828
│ │ ├── d42428711dc6c18ec63bfa1ba1f7b576895b37cd
│ │ ├── d469311897f8e44826c7344e8c994b3257a5c25c
│ │ ├── d4aef02693ee834a8e05782b17442fc919997a9a
│ │ ├── d4ef7999eeb79ec5baa709ccf52830c2cc0d1c40
│ │ ├── d56de425875a70a8feb53dddde2a0d0017adcb1a
│ │ ├── d5eb1d2078f1ffbc37a1841eaf544b32975343c5
│ │ ├── d5fd2f38b42d61ce829870ba3bc5bf120067a64c
│ │ ├── d6583c31e97445fc24728efc159e30805e3db442
│ │ ├── d6639c48db5279063ec045bdbd7a033961f4d3b8
│ │ ├── d67ef4494e303987b9746154bbf2f9f48c3ab0d9
│ │ ├── d6f7c1b1e2ddeb6ad6ca5f9043acdde9421cefdd
│ │ ├── d74aeb5306c728e421f0667a2cc1eb003279333d
│ │ ├── d765b66b30db695b6362c135a1aa7f0221e39385
│ │ ├── d81a6d8023a09c85e7c55c0668b6651021850f40
│ │ ├── d921a2733ab14769d6a730440d766b446338a949
│ │ ├── dacafe3e43b51aff60900a9e780ee5ad8f6256ea
│ │ ├── db15c6757498972a5095be15a1a67024530fec59
│ │ ├── db30e7150bbfdce48a17f330978fa25f5ffc07c9
│ │ ├── dd4e13456d579bcdc7dbb13c15ab237b37e647fa
│ │ ├── ddc593402905f34066a2397990860a8d1d79fbfb
│ │ ├── df1fbec132a37395d23e7022ae97cccccb2d19b8
│ │ ├── dfdd62c4a1a966409489343f008e997eff0d35b7
│ │ ├── e09b387b4d73f3d6210e54177b71b4dd90ac5ff3
│ │ ├── e0d13777e1110531eee8c85a26f3b554aeb3b816
│ │ ├── e17eab18eb549ebb980d25cc2bf6390c6547bd69
│ │ ├── e21cad876865b763b03ed9a9398e2cbaee5931ed
│ │ ├── e2c6bc6a83f09b487dcc62f94aa2005237e93d59
│ │ ├── e2e0322e22b3e621ed80fd300a33901a86234949
│ │ ├── e2f464dc8c5062fc5eb5d68ee6483f54728c06f2
│ │ ├── e2f67c31fabafb2a8635756c05c2b82ea813ee1d
│ │ ├── e35c504c2e07f3bd1c0e71cd3b5570905da613eb
│ │ ├── e40b4982094ed34ee8d6a342bfca2db8f364b653
│ │ ├── e4c9196fb5ada9e11480ee92447c2ca0a2e7000a
│ │ ├── e54f73d58b1baee0e200fd6531cc5f9cb62999b1
│ │ ├── e5b268f1f179d5559924c80b45d5c8e964aa2bd4
│ │ ├── e68bd0afc1ec1d7f0abcab3cb52ea7a4fa455da1
│ │ ├── e69685a5b746a2f429c8da00c86c6900bc266678
│ │ ├── e6ba63f71848498ba2d2165d0e83ea90b1307746
│ │ ├── e7330e699efa1badbd015f27e5cba40daa3c3957
│ │ ├── e8072b2c7f808ad4cf8a051fc3923438b5353e28
│ │ ├── e8e939013952191152cb459becfafbc19b6c8ca3
│ │ ├── e92cead9c2e0461125338180ad72cb048d92adaa
│ │ ├── ea00676eb8cfe00e6e358a5992a0fcb1a0061241
│ │ ├── ea063927210c7b1ac95c4cbdeaec39e905aa5911
│ │ ├── ea842236c6f3c6aebe7d2df698bed3b0e749c50e
│ │ ├── eb8898b76241ea1810edde7c476090ecceefc7c0
│ │ ├── ec4f16c29fbacb3f0fb575b3e87dfbcb3fbde121
│ │ ├── ec95ac8245955dd02c67ed21c02209a021a4433c
│ │ ├── eca33fa4bedade7da020430994c8b33a272b58e7
│ │ ├── ed2df9ea022534f34643df21d7024e580a739805
│ │ ├── ed618592cfae30dc2af0d13d5cbb039e9b8716fb
│ │ ├── ee5303f6a1f7e4fe433dc518f54bd4944c1bccca
│ │ ├── eee447edc79fea1ca7c7d34e463261cda4ba339e
│ │ ├── ef731a9dc1237c1e41b373dd41cbac57d86966f2
│ │ ├── efa658c2c4cb09149b1dad8d9f700b845b34e109
│ │ ├── eff79b2f6159c8a54c5718af9e57f731b99dfc82
│ │ ├── f1bd3d45165423ca91df80d5ab617842c17673c0
│ │ ├── f1bdd52c9ceb9dd7849283ec27fd9e3295a7e350
│ │ ├── f26b2e4af42c6f443221eab1e852d0e357086e16
│ │ ├── f34f464e2136cdb2c42ddb33d415ed0ab0559d21
│ │ ├── f37c87ed1174080a3144f74ea3ba5f51c8a10235
│ │ ├── f3a557fcc5716ae116b98c50c55b5de5aebc6039
│ │ ├── f3f24aee46a0c212e456eff9d62503efbe7b8230
│ │ ├── f46b49159352b4ebff3a4f5fd715c3482485b537
│ │ ├── f57f2f1b0092f02aa2f6f90740496e4e095a42b7
│ │ ├── f637fc68c117d4e9c14051ecc0af04d37522f539
│ │ ├── f66c62ca5c31e7077c87fde74391853e9d898744
│ │ ├── f747571b74d6302fbc0b4fcc813668912f22b57c
│ │ ├── f77786dfa7307e2cbf078f7d26e7f5fc5375f08c
│ │ ├── f7fcd15a0b5fe39838ddcb66866d67a1a56e719a
│ │ ├── f81464810d2cde5ed21e362b3f3944eea8ff95ab
│ │ ├── f81f37237d7bb010dc6c8fe5a3757ccc6ce5a350
│ │ ├── f86962aca14a0e7462055e8e62437fc999883dae
│ │ ├── f9d10dd5e88e39156b95e270c7b2f63948bec23b
│ │ ├── fab0345ed27f30cb3010581c8ebd0f25d1bf4bd8
│ │ ├── fb1ab873e8b8fec6b406be385506dea4322703de
│ │ ├── fb44042bceaf617e5d1e0217d838eb9c4863794b
│ │ ├── fb69c1b5ba063c14140f319fc055cda00d30db04
│ │ ├── fd45ccc063d1e656f8cfc48e4bb0835f07db81c1
│ │ ├── fea7e1ab6c991aebb27b0e60dd9f63e372463eeb
│ │ ├── ff6a56fcc80558f1638fd95a97b39e13c9b6d651
│ │ ├── ffbb2739d0ac218aff813098c8637ab1de307ba2
│ │ └── ffee973b1628dd4c8fd9257ebcdc37f87d6ad372
│ ├── mayhem/
│ │ ├── packet_recv_client/
│ │ │ └── Mayhemfile
│ │ ├── packet_recv_server/
│ │ │ └── Mayhemfile
│ │ ├── packets_posths_server/
│ │ │ └── Mayhemfile
│ │ ├── packets_recv_server/
│ │ │ └── Mayhemfile
│ │ └── qpack_decode/
│ │ └── Mayhemfile
│ └── src/
│ ├── lib.rs
│ ├── packet_recv_client.rs
│ ├── packet_recv_server.rs
│ ├── packets_posths_server.rs
│ ├── packets_recv_server.rs
│ └── qpack_decode.rs
├── h3i/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── examples/
│ │ ├── content_length_mismatch.rs
│ │ └── stream_limit.rs
│ └── src/
│ ├── actions/
│ │ ├── h3.rs
│ │ └── mod.rs
│ ├── client/
│ │ ├── async_client.rs
│ │ ├── connection_summary.rs
│ │ ├── mod.rs
│ │ └── sync_client.rs
│ ├── config.rs
│ ├── frame.rs
│ ├── frame_parser.rs
│ ├── lib.rs
│ ├── main.rs
│ ├── prompts/
│ │ ├── h3/
│ │ │ ├── errors.rs
│ │ │ ├── headers.rs
│ │ │ ├── mod.rs
│ │ │ ├── priority.rs
│ │ │ ├── settings.rs
│ │ │ ├── stream.rs
│ │ │ └── wait.rs
│ │ └── mod.rs
│ └── recordreplay/
│ ├── mod.rs
│ └── qlog.rs
├── netlog/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── constants.rs
│ ├── h2.rs
│ ├── h3.rs
│ ├── http.rs
│ ├── lib.rs
│ └── quic.rs
├── octets/
│ ├── Cargo.toml
│ └── src/
│ ├── huffman_table.rs
│ └── lib.rs
├── qlog/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── events/
│ │ ├── http3.rs
│ │ ├── mod.rs
│ │ └── quic.rs
│ ├── lib.rs
│ ├── reader.rs
│ ├── streamer.rs
│ └── testing/
│ ├── event_tests.rs
│ ├── mod.rs
│ └── trace_tests.rs
├── qlog-dancer/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── index.html
│ ├── qlog-dancer-ui.js
│ ├── qlog-dancer.css
│ └── src/
│ ├── config.rs
│ ├── datastore.rs
│ ├── lib.rs
│ ├── main.rs
│ ├── plots/
│ │ ├── colors.rs
│ │ ├── congestion_control.rs
│ │ ├── conn_flow_control.rs
│ │ ├── conn_overview.rs
│ │ ├── minmax.rs
│ │ ├── mod.rs
│ │ ├── packet_received.rs
│ │ ├── packet_sent.rs
│ │ ├── pending.rs
│ │ ├── rtt.rs
│ │ ├── stream_multiplex.rs
│ │ └── stream_sparks.rs
│ ├── reports/
│ │ ├── events.rs
│ │ ├── html.rs
│ │ ├── mod.rs
│ │ └── text.rs
│ ├── request_stub.rs
│ ├── seriesstore.rs
│ ├── trackers/
│ │ ├── mod.rs
│ │ ├── stream_buffer_tracker.rs
│ │ └── stream_max_tracker.rs
│ ├── web.rs
│ └── wirefilter.rs
├── quiche/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── examples/
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cert-big.crt
│ │ ├── cert.crt
│ │ ├── cert.key
│ │ ├── client.c
│ │ ├── client.rs
│ │ ├── gen-certs.sh
│ │ ├── http3-client.c
│ │ ├── http3-client.rs
│ │ ├── http3-server.c
│ │ ├── http3-server.rs
│ │ ├── qpack-decode.rs
│ │ ├── qpack-encode.rs
│ │ ├── rootca.crt
│ │ ├── server.c
│ │ └── server.rs
│ ├── include/
│ │ └── quiche.h
│ └── src/
│ ├── buffers.rs
│ ├── build.rs
│ ├── cid.rs
│ ├── crypto/
│ │ ├── boringssl.rs
│ │ ├── mod.rs
│ │ └── openssl_quictls.rs
│ ├── dgram.rs
│ ├── error.rs
│ ├── ffi.rs
│ ├── flowcontrol.rs
│ ├── frame.rs
│ ├── h3/
│ │ ├── AGENTS.md
│ │ ├── ffi.rs
│ │ ├── frame.rs
│ │ ├── mod.rs
│ │ ├── qpack/
│ │ │ ├── decoder.rs
│ │ │ ├── encoder.rs
│ │ │ ├── mod.rs
│ │ │ └── static_table.rs
│ │ └── stream.rs
│ ├── lib.rs
│ ├── minmax.rs
│ ├── packet.rs
│ ├── path.rs
│ ├── pmtud.rs
│ ├── rand.rs
│ ├── range_buf.rs
│ ├── ranges.rs
│ ├── recovery/
│ │ ├── AGENTS.md
│ │ ├── bandwidth.rs
│ │ ├── bytes_in_flight.rs
│ │ ├── congestion/
│ │ │ ├── cubic.rs
│ │ │ ├── delivery_rate.rs
│ │ │ ├── hystart.rs
│ │ │ ├── mod.rs
│ │ │ ├── prr.rs
│ │ │ ├── recovery.rs
│ │ │ ├── reno.rs
│ │ │ └── test_sender.rs
│ │ ├── gcongestion/
│ │ │ ├── bbr/
│ │ │ │ ├── bandwidth_sampler.rs
│ │ │ │ └── windowed_filter.rs
│ │ │ ├── bbr.rs
│ │ │ ├── bbr2/
│ │ │ │ ├── drain.rs
│ │ │ │ ├── mode.rs
│ │ │ │ ├── network_model.rs
│ │ │ │ ├── probe_bw.rs
│ │ │ │ ├── probe_rtt.rs
│ │ │ │ └── startup.rs
│ │ │ ├── bbr2.rs
│ │ │ ├── mod.rs
│ │ │ ├── pacer.rs
│ │ │ └── recovery.rs
│ │ ├── mod.rs
│ │ └── rtt.rs
│ ├── stream/
│ │ ├── mod.rs
│ │ ├── recv_buf.rs
│ │ └── send_buf.rs
│ ├── test_utils.rs
│ ├── tests.rs
│ ├── tls/
│ │ ├── boringssl.rs
│ │ ├── mod.rs
│ │ └── openssl_quictls.rs
│ └── transport_params.rs
├── rustfmt.toml
├── task-killswitch/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── tokio-quiche/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── docs/
│ │ ├── arch.drawio
│ │ └── worker.excalidraw
│ ├── examples/
│ │ ├── README.md
│ │ ├── async_http3_server/
│ │ │ ├── args.rs
│ │ │ ├── body.rs
│ │ │ ├── main.rs
│ │ │ └── server.rs
│ │ ├── cert.crt
│ │ └── cert.key
│ ├── src/
│ │ ├── buf_factory.rs
│ │ ├── http3/
│ │ │ ├── driver/
│ │ │ │ ├── AGENTS.md
│ │ │ │ ├── client.rs
│ │ │ │ ├── connection.rs
│ │ │ │ ├── datagram.rs
│ │ │ │ ├── hooks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── server.rs
│ │ │ │ ├── streams.rs
│ │ │ │ ├── test_utils.rs
│ │ │ │ └── tests.rs
│ │ │ ├── mod.rs
│ │ │ ├── settings.rs
│ │ │ └── stats.rs
│ │ ├── lib.rs
│ │ ├── metrics/
│ │ │ ├── labels.rs
│ │ │ ├── mod.rs
│ │ │ └── tokio_task.rs
│ │ ├── quic/
│ │ │ ├── AGENTS.md
│ │ │ ├── addr_validation_token.rs
│ │ │ ├── connection/
│ │ │ │ ├── error.rs
│ │ │ │ ├── id.rs
│ │ │ │ ├── map.rs
│ │ │ │ └── mod.rs
│ │ │ ├── hooks.rs
│ │ │ ├── io/
│ │ │ │ ├── connection_stage.rs
│ │ │ │ ├── gso.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── utilization_estimator.rs
│ │ │ │ └── worker.rs
│ │ │ ├── mod.rs
│ │ │ ├── raw.rs
│ │ │ └── router/
│ │ │ ├── acceptor.rs
│ │ │ ├── connector.rs
│ │ │ └── mod.rs
│ │ ├── result.rs
│ │ ├── settings/
│ │ │ ├── config.rs
│ │ │ ├── hooks.rs
│ │ │ ├── mod.rs
│ │ │ ├── quic.rs
│ │ │ └── tls.rs
│ │ └── socket/
│ │ ├── capabilities.rs
│ │ ├── connected.rs
│ │ ├── listener.rs
│ │ └── mod.rs
│ └── tests/
│ ├── fixtures/
│ │ ├── h3i_fixtures.rs
│ │ └── mod.rs
│ ├── integration_tests/
│ │ ├── async_callbacks.rs
│ │ ├── connection_close.rs
│ │ ├── headers.rs
│ │ ├── migration.rs
│ │ ├── mod.rs
│ │ ├── stream_limit.rs
│ │ ├── timeouts.rs
│ │ └── zero_rtt.rs
│ └── main.rs
└── tools/
├── android/
│ └── build_android_ndk19.sh
├── gen_fuzz_seeds.sh
└── http3_test/
├── Cargo.toml
├── README.md
├── src/
│ ├── lib.rs
│ └── runner.rs
└── tests/
└── httpbin_tests.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: cargo
directory: "/"
schedule:
interval: daily
time: "13:00"
open-pull-requests-limit: 10
ignore:
- dependency-name: env_logger
versions:
- ">= 0.7.a, < 0.8"
- dependency-name: mio
versions:
- ">= 0.7.a, < 0.8"
- dependency-name: ring
versions:
- ">= 0.15.a, < 0.16"
- dependency-name: ring
versions:
- ">= 0.16.a, < 0.17"
- dependency-name: url
versions:
- ">= 2.a, < 3"
- package-ecosystem: cargo
directory: "/tools/apps"
schedule:
interval: daily
time: "13:00"
open-pull-requests-limit: 10
ignore:
- dependency-name: env_logger
versions:
- ">= 0.7.a, < 0.8"
- dependency-name: env_logger
versions:
- ">= 0.8.a, < 0.9"
- dependency-name: mio
versions:
- ">= 0.7.a, < 0.8"
- dependency-name: url
versions:
- ">= 2.a, < 3"
- package-ecosystem: cargo
directory: "/tools/qlog"
schedule:
interval: daily
time: "13:00"
open-pull-requests-limit: 10
- package-ecosystem: cargo
directory: "/fuzz"
schedule:
interval: daily
time: "13:00"
open-pull-requests-limit: 10
================================================
FILE: .github/workflows/deploy.yml
================================================
on:
push:
branches:
- master
name: Deploy
env:
RUSTDOCFLAGS: "--cfg docsrs"
jobs:
docs:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@nightly
- name: Install qlog-dancer dependencies
run: |
sudo apt-get update
sudo apt-get install libexpat1-dev libfreetype6-dev libfontconfig1-dev
- name: Run cargo doc
run: cargo doc --no-deps --all-features
- name: Deploy to GitHub Pages
uses: crazy-max/ghaction-github-pages@v3
with:
target_branch: gh-pages
build_dir: target/doc
fqdn: docs.quic.tech
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Build Docker images
run: make docker-build
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Publish Docker images
run: make docker-publish
================================================
FILE: .github/workflows/nightly.yml
================================================
on: [push, pull_request]
name: Nightly
permissions:
contents: read
pull-requests: write
env:
FEATURES: "async,ffi,qlog"
RUSTFLAGS: "-D warnings"
RUSTDOCFLAGS: "--cfg docsrs"
RUSTTOOLCHAIN: "nightly"
concurrency:
group: ${{ github.ref }}-nightly
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
quiche_nightly:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
- name: Install qlog-dancer dependencies
run: |
sudo apt-get update
sudo apt-get install libexpat1-dev libfreetype6-dev libfontconfig1-dev
- name: Run cargo test
run: cargo test --verbose --all-targets --features=boringssl-boring-crate,${{ env.FEATURES }}
# Need to run doc tests separately.
# (https://github.com/rust-lang/cargo/issues/6669)
- name: Run cargo doc test
run: cargo test --verbose --doc --features=boringssl-boring-crate,${{ env.FEATURES }}
# NOTE: this is disabled as it fails when building changes that bump
# version of local crates (e.g. when doing a `qlog` release) that have not
# been published yet, and we couldn't find a workaround.
#
# - name: Run cargo package
# run: cargo package --verbose --workspace --exclude=quiche_apps --allow-dirty
- name: Run cargo doc
run: cargo doc --no-deps --all-features --document-private-items
- name: Build C examples
run: |
sudo apt-get install libev-dev uthash-dev
make -C quiche/examples
fuzz:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
- name: Install cargo-fuzz
run: cargo install cargo-fuzz
- name: Run cargo fuzz for packet_recv_client
run: cargo fuzz run packet_recv_client -- -runs=1
- name: Run cargo fuzz for packet_recv_server
run: cargo fuzz run packet_recv_server -- -runs=1
- name: Run cargo fuzz for qpack_decode
run: cargo fuzz run qpack_decode -- -runs=1
http3_test_nightly:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
- name: Run cargo test
run: cargo test --no-run --verbose --manifest-path=tools/http3_test/Cargo.toml
fmt:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
components: rustfmt
- name: Run cargo fmt - quiche
run: cargo fmt -- --check
- name: Run cargo fmt - http3_test
run: cargo fmt --manifest-path=tools/http3_test/Cargo.toml -- --check
- name: Run cargo fmt - fuzz
run: cargo fmt --manifest-path=fuzz/Cargo.toml -- --check
================================================
FILE: .github/workflows/semgrep.yml
================================================
on:
pull_request: {}
workflow_dispatch: {}
push:
branches:
- main
- master
schedule:
- cron: '0 0 * * *'
name: Semgrep config
permissions:
contents: read
pull-requests: write
concurrency:
group: ${{ github.ref }}-semgrep
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
semgrep:
name: semgrep/ci
runs-on: ubuntu-latest
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
SEMGREP_URL: https://cloudflare.semgrep.dev
SEMGREP_APP_URL: https://cloudflare.semgrep.dev
SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version
container:
image: semgrep/semgrep
steps:
- uses: actions/checkout@v4
- run: semgrep ci
================================================
FILE: .github/workflows/stable.yml
================================================
on: [push, pull_request]
name: Stable
permissions:
contents: read
pull-requests: write
env:
DEFAULT_OPTIONS: "--features=async,ffi,qlog --workspace"
NO_BORING_OPTIONS: "--features=ffi,qlog --workspace --exclude h3i --exclude tokio-quiche"
RUSTFLAGS: "-D warnings"
RUSTTOOLCHAIN: "stable"
concurrency:
group: ${{ github.ref }}-stable
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
quiche:
runs-on: ubuntu-latest
strategy:
matrix:
tls-feature:
- "" # default, boringssl-vendored
- "boringssl-boring-crate"
- "openssl"
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
components: clippy
- name: Install qlog-dancer dependencies
run: |
sudo apt-get update
sudo apt-get install libexpat1-dev libfreetype6-dev libfontconfig1-dev
- name: Unused dependency check
if: ${{ matrix.tls-feature == '' }}
uses: bnjbvr/cargo-machete@main
- name: Build OpenSSL
if: ${{ matrix.tls-feature == 'openssl' }}
run: |
git clone https://github.com/quictls/openssl
cd openssl
./Configure --prefix="$PWD/install"
make -j"$(nproc)"
make install -j"$(nproc)"
echo "PKG_CONFIG_PATH=$PWD" >> "$GITHUB_ENV"
echo "LD_LIBRARY_PATH=$PWD" >> "$GITHUB_ENV"
- name: Run cargo test
if: ${{ matrix.tls-feature == 'boringssl-boring-crate' }}
run: cargo test --verbose --all-targets --features=${{ matrix.tls-feature }} ${{ env.DEFAULT_OPTIONS }}
# tokio-quiche requires the `boring` crate, so don't run its tests when
# building without it.
- name: Run cargo test
if: ${{ matrix.tls-feature != 'boringssl-boring-crate' }}
run: cargo test --verbose --all-targets --features=${{ matrix.tls-feature }} ${{ env.NO_BORING_OPTIONS }}
# Need to run doc tests separately.
# (https://github.com/rust-lang/cargo/issues/6669)
- name: Run cargo doc test
if: ${{ matrix.tls-feature == 'boringssl-boring-crate' }}
run: cargo test --verbose --doc --features=${{ matrix.tls-feature }} ${{ env.DEFAULT_OPTIONS }}
# Need to run doc tests separately.
# (https://github.com/rust-lang/cargo/issues/6669)
#
# tokio-quiche requires the `boring` crate, so don't run its tests when
# building without it.
- name: Run cargo doc test
if: ${{ matrix.tls-feature != 'boringssl-boring-crate' }}
run: cargo test --verbose --doc --features=${{ matrix.tls-feature }} ${{ env.NO_BORING_OPTIONS }}
# NOTE: this is disabled as it fails when building changes that bump
# version of local crates (e.g. when doing a `qlog` release) that have not
# been published yet, and we couldn't find a workaround.
#
# - name: Run cargo package
# run: cargo package --verbose --workspace --exclude=quiche_apps --allow-dirty
- name: Run cargo clippy
run: cargo clippy --features=${{ matrix.tls-feature }} ${{ env.DEFAULT_OPTIONS }} -- -D warnings
- name: Run cargo clippy on examples
run: cargo clippy --examples --features=${{ matrix.tls-feature }} ${{ env.DEFAULT_OPTIONS }} -- -D warnings
- name: Run cargo doc
run: cargo doc --no-deps --all-features --document-private-items
- name: Build C examples
run: |
sudo apt-get install libev-dev uthash-dev
make -C quiche/examples
quiche_macos:
strategy:
matrix:
target:
- "macos-15-intel" # Intel (x86_64)
- "macos-latest" # Apple Silicon (M1)
runs-on: ${{ matrix.target }}
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
- name: Run cargo test
run: cargo test --verbose --all-targets ${{ env.DEFAULT_OPTIONS }}
- name: Build C examples
run: |
brew install libev uthash
make -C quiche/examples
quiche_ios:
runs-on: macos-latest
strategy:
matrix:
target: ["x86_64-apple-ios", "aarch64-apple-ios"]
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
env:
IPHONEOS_DEPLOYMENT_TARGET: "10.0"
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
targets: ${{ matrix.target }}
- name: Remove cdylib from iOS build
run: |
sed -i -e 's/, "cdylib"//g' quiche/Cargo.toml
- name: Run cargo build
run: cargo build --target=${{ matrix.target }} --verbose
quiche_windows:
runs-on: windows-2022
strategy:
matrix:
target: ["x86_64-pc-windows-msvc", "i686-pc-windows-msvc", "x86_64-pc-windows-gnu", "i686-pc-windows-gnu"]
include:
- target: "i686-pc-windows-gnu"
cflags: "-mlong-double-64" # bindgen detects that Rust doesn't support 80-bit long double
env:
CFLAGS: ${{ matrix.cflags }}
CXXFLAGS: ${{ matrix.cflags }}
BINDGEN_EXTRA_CLANG_ARGS: ${{ matrix.cflags }}
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
targets: ${{ matrix.target }}
- name: Set up MinGW for 64 bit
if: matrix.target == 'x86_64-pc-windows-gnu'
uses: bwoodsend/setup-winlibs-action@v1.10
with:
tag: 12.2.0-16.0.0-10.0.0-msvcrt-r5
- name: Set up MinGW for 32 bit
if: matrix.target == 'i686-pc-windows-gnu'
uses: bwoodsend/setup-winlibs-action@v1.10
with:
architecture: i686
tag: 12.2.0-16.0.0-10.0.0-msvcrt-r5
- name: Install dependencies
uses: crazy-max/ghaction-chocolatey@v3
with:
args: install nasm
- name: Run cargo build
if: endsWith(matrix.target, '-gnu')
run: cargo build --target=${{ matrix.target }} --verbose --all-targets ${{ env.DEFAULT_OPTIONS }} --exclude qlog-dancer --features=boringssl-boring-crate
- name: Run cargo test
if: endsWith(matrix.target, '-msvc')
run: cargo test --target=${{ matrix.target }} --verbose --all-targets ${{ env.DEFAULT_OPTIONS }} --exclude qlog-dancer --features=boringssl-boring-crate
quiche_multiarch:
runs-on: ubuntu-latest
strategy:
matrix:
target: ["aarch64-unknown-linux-gnu","armv7-unknown-linux-gnueabihf","i686-unknown-linux-gnu"]
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
- name: Install cargo-binstall
uses: cargo-bins/cargo-binstall@main
- name: Install cross
run: cargo-binstall -y cross
- name: Run cargo test using cross
run: cross test --target=${{ matrix.target }} --verbose --all-targets ${{ env.NO_BORING_OPTIONS }} --exclude qlog-dancer
http3_test:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
components: clippy
- name: Run cargo test
run: cargo test --no-run --verbose --manifest-path=tools/http3_test/Cargo.toml
- name: Run cargo clippy
run: cargo clippy --manifest-path=tools/http3_test/Cargo.toml -- -D warnings
docker:
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Build Docker images
run: make docker-build
android_ndk_lts:
runs-on: ubuntu-latest
env:
API_LEVEL: "21"
strategy:
matrix:
target: ["aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android","i686-linux-android"]
include:
- target: "aarch64-linux-android"
arch: "arm64-v8a"
- target: "armv7-linux-androideabi"
arch: "armeabi-v7a"
- target: "x86_64-linux-android"
arch: "x86_64"
- target: "i686-linux-android"
arch: "x86"
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install stable toolchain for the target
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUSTTOOLCHAIN }}
targets: ${{ matrix.target }}
- name: Install cargo-ndk
run: cargo install cargo-ndk
- name: Run cargo ndk
run: cargo ndk --manifest-path quiche/Cargo.toml --target ${{ matrix.arch }} --platform ${{ env.API_LEVEL }} -- build --verbose --features ffi
================================================
FILE: .gitignore
================================================
**/target
**/*.rs.bk
**/Cargo.lock
**/*.*qlog
================================================
FILE: .gitlab-ci.yml
================================================
test-job1:
stage: test
script:
- echo "This job tests nothing"
================================================
FILE: .gitmodules
================================================
[submodule "boringssl"]
path = quiche/deps/boringssl
url = https://github.com/google/boringssl.git
ignore = dirty
================================================
FILE: .semgrepignore
================================================
/apps/
/fuzz/
/quiche/examples/
/tokio-quiche/examples/
================================================
FILE: AGENTS.md
================================================
# PROJECT KNOWLEDGE BASE
**Generated:** 2026-02-20
**Commit:** 89d1850f
**Branch:** master
## OVERVIEW
Cloudflare's QUIC and HTTP/3 implementation in Rust. Workspace of 11 crates: core `quiche` protocol library, `tokio-quiche` async integration, CLI tools (`apps`, `h3i`), logging/analysis (`qlog`, `qlog-dancer`, `netlog`), and supporting primitives (`octets`, `buffer-pool`, `datagram-socket`, `task-killswitch`).
## STRUCTURE
```
quiche/ # Core QUIC+H3 library (C FFI, BoringSSL submodule)
tokio-quiche/ # Async tokio wrapper (server/client drivers)
apps/ # CLI binaries: quiche-client, quiche-server
h3i/ # HTTP/3 interactive testing/debugging tool
qlog/ # qlog event schema (RFC draft)
qlog-dancer/ # qlog/netlog visualization (native + wasm)
netlog/ # Chrome netlog parser
octets/ # Zero-copy byte buffer primitives
buffer-pool/ # Sharded lock-free buffer pool
datagram-socket/ # UDP socket abstraction (sendmmsg/recvmmsg)
task-killswitch/ # Async task cancellation primitive
fuzz/ # Fuzz targets (excluded from workspace)
tools/ # Android build tooling, http3_test harness
```
## DEPENDENCY GRAPH
```
octets buffer-pool task-killswitch qlog netlog (Layer 0: no workspace deps)
| | | | |
v v | v v
quiche datagram-socket | qlog-dancer (Layer 1)
| \ | |
v \ v v
tokio-quiche <----------+ (Layer 2: depends on most)
| |
v v
h3i apps (Layer 3: end-user tools)
```
## WHERE TO LOOK
| Task | Location | Notes |
|------|----------|-------|
| QUIC connection logic | `quiche/src/lib.rs` | 9k lines, core `Connection` struct |
| HTTP/3 protocol | `quiche/src/h3/mod.rs` | Own `Error`/`Result` types |
| Congestion control | `quiche/src/recovery/` | Two impls: `congestion/` (legacy) + `gcongestion/` (BBR2) |
| TLS/crypto backends | `quiche/src/tls/`, `quiche/src/crypto/` | BoringSSL + OpenSSL, cfg-gated |
| C FFI | `quiche/src/ffi.rs` + `quiche/include/quiche.h` | Behind `ffi` feature |
| Async server/client | `tokio-quiche/src/` | `ApplicationOverQuic` trait is the extension point |
| H3 async driver | `tokio-quiche/src/http3/driver/` | `DriverHooks` sealed trait, channels |
| QUIC IO worker | `tokio-quiche/src/quic/io/worker.rs` | Connection FSM, GSO/GRO |
| Packet routing | `tokio-quiche/src/quic/router/` | Demux by DCID |
| Test infra | `quiche/src/test_utils.rs` | `Pipe` struct for in-memory QUIC pairs |
| Config cascade | `tokio-quiche/src/settings/` → `quiche::Config` | `ConnectionParams` → `quiche::Config` → `h3::Config` |
## CODE MAP
| Symbol | Type | Location | Role |
|--------|------|----------|------|
| `Connection` | struct | `quiche/src/lib.rs` | Core QUIC connection |
| `Config` | struct | `quiche/src/lib.rs` | Transport configuration |
| `h3::Connection` | struct | `quiche/src/h3/mod.rs` | HTTP/3 over QUIC |
| `ApplicationOverQuic` | trait | `tokio-quiche/src/quic/` | Async app lifecycle hook |
| `H3Driver<H>` | struct | `tokio-quiche/src/http3/driver/` | Generic H3 driver |
| `IoWorker<Tx,M,S>` | struct | `tokio-quiche/src/quic/io/worker.rs` | Per-connection IO loop |
| `Pipe` | struct | `quiche/src/test_utils.rs` | In-memory test connection pair |
| `BufFactory` | trait | `quiche/src/range_buf.rs` | Zero-copy buffer creation |
| `Recovery` | enum | `quiche/src/recovery/mod.rs` | CC dispatch via enum_dispatch |
| `RecoveryOps` | trait | `quiche/src/recovery/mod.rs` | 40+ method CC interface |
## CONVENTIONS
- **Line width 82** (`rustfmt.toml`), comments 80. Nightly rustfmt required.
- **One `use` per item** (`imports_granularity = "Item"`, vertical layout).
- **`pub(crate)`** for cross-module internals; `pub` only for true public API.
- **BSD-2-Clause copyright header** on every `.rs` file.
- **`#[macro_use] extern crate log`** (legacy style, no `use log::*`).
- **Domain abbreviations**: `cid`, `scid`/`dcid`, `pkt`, `dgram`, `bidi`/`uni`, `rtt`.
- **`mod.rs` pattern** for submodules (not inline `foo/` + `foo.rs`).
- **Debug symbols in release** (`profile.release.debug = true`).
- **`#![warn(missing_docs)]`** -- public items must be documented.
## ANTI-PATTERNS (THIS PROJECT)
- **Do not use `any` types or type assertions** -- this is Rust; no equivalent concern, but `unsafe` is restricted to FFI boundaries (`tls/`, `crypto/`, `ffi.rs`, `gso.rs`).
- **Do not add clippy `#[allow]` without justification** -- 33 existing overrides all have documented reasons.
- **Cognitive complexity lint disabled** (`clippy.toml: 100`) -- complex functions accepted for protocol code, but don't add new ones casually.
- **Two `Acked` types exist** in `recovery/congestion` and `recovery/gcongestion` -- not unified, don't create a third.
- **`connection_not_present()` returns `TlsFail`** in tokio-quiche driver -- misleading sentinel, don't propagate this pattern.
- **`Error::Done` used as success signal** in H3 driver write path -- non-obvious, don't replicate.
- **`transmute` of `Instant`** in `gso.rs` -- fragile, platform-dependent, don't extend.
## FEATURE FLAGS
```
quiche: default=boringssl-vendored | boringssl-boring-crate | openssl
qlog, gcongestion, internal, ffi, fuzzing, sfv, custom-client-dcid
tokio-quiche: fuzzing, quiche_internal, gcongestion, zero-copy, rpk
(hardcodes: quiche/boringssl-boring-crate + quiche/qlog)
h3i: async (enables tokio-quiche dependency)
```
## COMMANDS
```bash
# Dev
cargo build # build workspace (vendored BoringSSL)
cargo test --all-targets --features=async,ffi,qlog --workspace # full test suite
cargo test --doc --features=async,ffi,qlog --workspace # doc tests (separate!)
# Lint
cargo clippy --features=boringssl-vendored --workspace -- -D warnings
cargo +nightly fmt -- --check
# Fuzz
cargo fuzz run packet_recv_client -- -runs=1
# Docker
make docker-build # quiche-base + quiche-qns images
```
## NOTES
- **Git submodules required**: `git submodule update --init --recursive` for BoringSSL.
- **MSRV 1.85**: `rust-version` field in Cargo.toml.
- **Doc tests are separate**: `cargo test --all-targets` does NOT run doc tests (cargo#6669).
- **`QUICHE_BSSL_PATH`**: env var to skip vendored BoringSSL build (use pre-built).
- **`RUSTFLAGS="-D warnings"`**: CI enforces; all warnings are errors.
- **Cargo.lock is gitignored** (library project).
- **Dual CI**: GitHub Actions (real) + GitLab CI (no-op stub).
- **`cargo package` disabled**: commented out due to unpublished local crate version issues.
================================================
FILE: CODEOWNERS
================================================
* @cloudflare/protocols
================================================
FILE: COPYING
================================================
Copyright (C) 2018-2019, Cloudflare, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
"apps",
"buffer-pool",
"datagram-socket",
"h3i",
"netlog",
"octets",
"qlog",
"qlog-dancer",
"quiche",
"task-killswitch",
"tokio-quiche",
]
exclude = ["fuzz", "tools/http3_test"]
resolver = "2"
[workspace.package]
edition = "2021"
repository = "https://github.com/cloudflare/quiche"
license = "BSD-2-Clause"
readme = "README.md"
keywords = ["quic", "http3"]
categories = ["network-programming"]
[workspace.metadata.release]
pre-release-commit-message = "{{crate_name}}: release {{version}}"
consolidate-commits = false
tag-prefix = "{{crate_name}}-"
tag-name = "{{prefix}}{{version}}"
tag-message = "{{crate_name}} {{version}}"
publish = false
[workspace.dependencies]
anyhow = { version = "1" }
assert_matches = { version = "1" }
boring = { version = "4.3" }
buffer-pool = { version = "0.2.1", path = "./buffer-pool" }
crossbeam = { version = "0.8.1", default-features = false }
dashmap = { version = "6" }
datagram-socket = { version = "0.7.0", path = "./datagram-socket" }
env_logger = "0.11"
foundations = { version = ">=4,<6", default-features = false }
futures = { version = "0.3" }
futures-util = { version = "0.3", default-features = false }
h3i = { version = "0.6", path = "./h3i" }
ipnetwork = { version = "0.20" }
libc = { version = "0.2.76", default-features = false }
log = { version = "0.4.20" }
mio = { version = "1" }
nix = { version = "0.30.1", features = ["net", "uio", "socket"] }
netlog = { version = "0.1", path="./netlog" }
octets = { version = "0.3.5", path = "./octets" }
parking_lot = { version = "0.12.1", default-features = false }
pin-project = { version = "1.0.12" }
qlog = { version = "0.16.0", path = "./qlog" }
quiche = { version = "0.26.1", path = "./quiche" }
regex = { version = "1.4.2" }
ring = { version = "0.17.8" }
rstest = { version = "0.26.1" }
serde = { version = "1" }
serde_json = { version = "1" }
serde_with = { version = "~3.17", default-features = false }
slog-scope = { version = "4.0" }
slog-stdlog = { version = "4.1.1" }
smallvec = { version = "1.10", default-features = false }
task-killswitch = { version = "0.2.1", path = "./task-killswitch" }
thiserror = { version = "2" }
tokio = { version = "1.44", default-features = false }
tokio-quiche = { version = "0.16.1", path = "./tokio-quiche" }
tokio-stream = { version = "0.1" }
tokio-util = { version = "0.7.13" }
triomphe = { version = "0.1" }
url = { version = "2" }
[profile.bench]
debug = true
[profile.release]
debug = true
================================================
FILE: Dockerfile
================================================
FROM rust:1.85 AS build
WORKDIR /build
COPY Cargo.toml ./
COPY apps/ ./apps/
COPY buffer-pool ./buffer-pool/
COPY datagram-socket/ ./datagram-socket/
COPY h3i/ ./h3i/
COPY netlog/ ./netlog/
COPY octets/ ./octets/
COPY qlog/ ./qlog/
COPY qlog-dancer/ ./qlog-dancer/
COPY quiche/ ./quiche/
COPY task-killswitch ./task-killswitch/
COPY tokio-quiche ./tokio-quiche/
RUN apt-get update && apt-get install -y cmake && rm -rf /var/lib/apt/lists/*
RUN cargo build --release --manifest-path apps/Cargo.toml
##
## quiche-base: quiche image for apps
##
FROM debian:latest AS quiche-base
RUN apt-get update && apt-get install -y ca-certificates && \
rm -rf /var/lib/apt/lists/*
COPY --from=build \
/build/target/release/quiche-client \
/build/target/release/quiche-server \
/usr/local/bin/
ENV PATH="/usr/local/bin/:${PATH}"
ENV RUST_LOG=info
##
## quiche-qns: quiche image for quic-interop-runner
## https://github.com/marten-seemann/quic-network-simulator
## https://github.com/marten-seemann/quic-interop-runner
##
FROM martenseemann/quic-network-simulator-endpoint:latest AS quiche-qns
WORKDIR /quiche
RUN apt-get update && apt-get install -y wait-for-it && rm -rf /var/lib/apt/lists/*
COPY --from=build \
/build/target/release/quiche-client \
/build/target/release/quiche-server \
/build/apps/run_endpoint.sh \
./
ENV RUST_LOG=trace
ENTRYPOINT [ "./run_endpoint.sh" ]
================================================
FILE: Makefile
================================================
DOCKER = docker
BASE_REPO = cloudflare/quiche
BASE_TAG = latest
QNS_REPO = cloudflare/quiche-qns
QNS_TAG = latest
FUZZ_REPO = cloudflare.mayhem.security:5000/protocols/quiche-libfuzzer
FUZZ_TAG = latest
docker-build: docker-base docker-qns
# build quiche-apps only
.PHONY: build-apps
build-apps:
cargo build --package=quiche_apps
# build base image
.PHONY: docker-base
docker-base: Dockerfile
$(DOCKER) build --target quiche-base -t $(BASE_REPO):$(BASE_TAG) .
# build qns image
.PHONY: docker-qns
docker-qns: Dockerfile apps/run_endpoint.sh
$(DOCKER) build --target quiche-qns -t $(QNS_REPO):$(QNS_TAG) .
.PHONY: docker-publish
docker-publish:
$(DOCKER) push $(BASE_REPO):$(BASE_TAG)
$(DOCKER) push $(QNS_REPO):$(QNS_TAG)
# build fuzzers
.PHONY: build-fuzz
build-fuzz:
cargo +nightly fuzz build --release --debug-assertions packet_recv_client
cargo +nightly fuzz build --release --debug-assertions packet_recv_server
cargo +nightly fuzz build --release --debug-assertions packets_recv_server
cargo +nightly fuzz build --release --debug-assertions packets_posths_server
cargo +nightly fuzz build --release --debug-assertions qpack_decode
# build fuzzing image
.PHONY: docker-fuzz
docker-fuzz:
$(DOCKER) build -f fuzz/Dockerfile --target quiche-libfuzzer --tag $(FUZZ_REPO):$(FUZZ_TAG) .
.PHONY: docker-fuzz-publish
docker-fuzz-publish:
$(DOCKER) push $(FUZZ_REPO):$(FUZZ_TAG)
.PHONY: clean
clean:
@for id in `$(DOCKER) images -q $(BASE_REPO)` `$(DOCKER) images -q $(QNS_REPO)` `$(DOCKER) images -q $(FUZZ_REPO)`; do \
echo ">> Removing $$id"; \
$(DOCKER) rmi -f $$id; \
done
================================================
FILE: README.md
================================================

[](https://crates.io/crates/quiche)
[](https://docs.rs/quiche)
[](https://opensource.org/licenses/BSD-2-Clause)

[quiche] is an implementation of the QUIC transport protocol and HTTP/3 as
specified by the [IETF]. It provides a low level API for processing QUIC packets
and handling connection state. The application is responsible for providing I/O
(e.g. sockets handling) as well as an event loop with support for timers.
For more information on how quiche came about and some insights into its design
you can read a [post] on Cloudflare's blog that goes into some more detail.
[quiche]: https://docs.quic.tech/quiche/
[ietf]: https://quicwg.org/
[post]: https://blog.cloudflare.com/enjoy-a-slice-of-quic-and-rust/
Who uses quiche?
----------------
### Cloudflare
quiche powers Cloudflare edge network's [HTTP/3 support][cloudflare-http3]. The
[cloudflare-quic.com](https://cloudflare-quic.com) website can be used for
testing and experimentation.
### Android
Android's DNS resolver uses quiche to [implement DNS over HTTP/3][android-http3].
### curl
quiche can be [integrated into curl][curl-http3] to provide support for HTTP/3.
[cloudflare-http3]: https://blog.cloudflare.com/http3-the-past-present-and-future/
[android-http3]: https://security.googleblog.com/2022/07/dns-over-http3-in-android.html
[curl-http3]: https://github.com/curl/curl/blob/master/docs/HTTP3.md#quiche-version
Getting Started
---------------
### Command-line apps
Before diving into the quiche API, here are a few examples on how to use the
quiche tools provided as part of the [quiche-apps](apps/) crate. These are not
suitable for production environments; see [disclaimers and
notes](#disclaimers-and-notes).
After cloning the project according to the command mentioned in the [building](#building) section, the client can be run as follows:
```bash
$ cargo run --bin quiche-client -- https://cloudflare-quic.com/
```
while the server can be run as follows:
```bash
$ cargo run --bin quiche-server -- --cert apps/src/bin/cert.crt --key apps/src/bin/cert.key
```
(note that the certificate provided is self-signed and should not be used in
production)
Use the `--help` command-line flag to get a more detailed description of each
tool's options.
### Configuring connections
The first step in establishing a QUIC connection using quiche is creating a
[`Config`] object:
```rust
let mut config = quiche::Config::new(quiche::PROTOCOL_VERSION)?;
config.set_application_protos(&[b"example-proto"]);
// Additional configuration specific to application and use case...
```
The [`Config`] object controls important aspects of the QUIC connection such
as QUIC version, ALPN IDs, flow control, congestion control, idle timeout
and other properties or features.
QUIC is a general-purpose transport protocol and there are several
configuration properties where there is no reasonable default value. For
example, the permitted number of concurrent streams of any particular type
is dependent on the application running over QUIC, and other use-case
specific concerns.
quiche defaults several properties to zero, applications most likely need
to set these to something else to satisfy their needs using the following:
- [`set_initial_max_streams_bidi()`]
- [`set_initial_max_streams_uni()`]
- [`set_initial_max_data()`]
- [`set_initial_max_stream_data_bidi_local()`]
- [`set_initial_max_stream_data_bidi_remote()`]
- [`set_initial_max_stream_data_uni()`]
[`Config`] also holds TLS configuration. This can be changed by mutators on
the an existing object, or by constructing a TLS context manually and
creating a configuration using [`with_boring_ssl_ctx_builder()`].
A configuration object can be shared among multiple connections.
### Connection setup
On the client-side the [`connect()`] utility function can be used to create
a new connection, while [`accept()`] is for servers:
```rust
// Client connection.
let conn = quiche::connect(Some(&server_name), &scid, local, peer, &mut config)?;
// Server connection.
let conn = quiche::accept(&scid, None, local, peer, &mut config)?;
```
### Handling incoming packets
Using the connection's [`recv()`] method the application can process
incoming packets that belong to that connection from the network:
```rust
let to = socket.local_addr().unwrap();
loop {
let (read, from) = socket.recv_from(&mut buf).unwrap();
let recv_info = quiche::RecvInfo { from, to };
let read = match conn.recv(&mut buf[..read], recv_info) {
Ok(v) => v,
Err(e) => {
// An error occurred, handle it.
break;
},
};
}
```
### Generating outgoing packets
Outgoing packet are generated using the connection's [`send()`] method
instead:
```rust
loop {
let (write, send_info) = match conn.send(&mut out) {
Ok(v) => v,
Err(quiche::Error::Done) => {
// Done writing.
break;
},
Err(e) => {
// An error occurred, handle it.
break;
},
};
socket.send_to(&out[..write], &send_info.to).unwrap();
}
```
When packets are sent, the application is responsible for maintaining a
timer to react to time-based connection events. The timer expiration can be
obtained using the connection's [`timeout()`] method.
```rust
let timeout = conn.timeout();
```
The application is responsible for providing a timer implementation, which
can be specific to the operating system or networking framework used. When
a timer expires, the connection's [`on_timeout()`] method should be called,
after which additional packets might need to be sent on the network:
```rust
// Timeout expired, handle it.
conn.on_timeout();
// Send more packets as needed after timeout.
loop {
let (write, send_info) = match conn.send(&mut out) {
Ok(v) => v,
Err(quiche::Error::Done) => {
// Done writing.
break;
},
Err(e) => {
// An error occurred, handle it.
break;
},
};
socket.send_to(&out[..write], &send_info.to).unwrap();
}
```
#### Pacing
It is recommended that applications [pace] sending of outgoing packets to
avoid creating packet bursts that could cause short-term congestion and
losses in the network.
quiche exposes pacing hints for outgoing packets through the [`at`] field
of the [`SendInfo`] structure that is returned by the [`send()`] method.
This field represents the time when a specific packet should be sent into
the network.
Applications can use these hints by artificially delaying the sending of
packets through platform-specific mechanisms (such as the [`SO_TXTIME`]
socket option on Linux), or custom methods (for example by using user-space
timers).
[pace]: https://datatracker.ietf.org/doc/html/rfc9002#section-7.7
[`SO_TXTIME`]: https://man7.org/linux/man-pages/man8/tc-etf.8.html
### Sending and receiving stream data
After some back and forth, the connection will complete its handshake and
will be ready for sending or receiving application data.
Data can be sent on a stream by using the [`stream_send()`] method:
```rust
if conn.is_established() {
// Handshake completed, send some data on stream 0.
conn.stream_send(0, b"hello", true)?;
}
```
The application can check whether there are any readable streams by using
the connection's [`readable()`] method, which returns an iterator over all
the streams that have outstanding data to read.
The [`stream_recv()`] method can then be used to retrieve the application
data from the readable stream:
```rust
if conn.is_established() {
// Iterate over readable streams.
for stream_id in conn.readable() {
// Stream is readable, read until there's no more data.
while let Ok((read, fin)) = conn.stream_recv(stream_id, &mut buf) {
println!("Got {} bytes on stream {}", read, stream_id);
}
}
}
```
### HTTP/3
The quiche [HTTP/3 module] provides a high level API for sending and
receiving HTTP requests and responses on top of the QUIC transport protocol.
[`Config`]: https://docs.quic.tech/quiche/struct.Config.html
[`set_initial_max_streams_bidi()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_streams_bidi
[`set_initial_max_streams_uni()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_streams_uni
[`set_initial_max_data()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_data
[`set_initial_max_stream_data_bidi_local()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_stream_data_bidi_local
[`set_initial_max_stream_data_bidi_remote()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_stream_data_bidi_remote
[`set_initial_max_stream_data_uni()`]: https://docs.rs/quiche/latest/quiche/struct.Config.html#method.set_initial_max_stream_data_uni
[`with_boring_ssl_ctx_builder()`]: https://docs.quic.tech/quiche/struct.Config.html#method.with_boring_ssl_ctx_builder
[`connect()`]: https://docs.quic.tech/quiche/fn.connect.html
[`accept()`]: https://docs.quic.tech/quiche/fn.accept.html
[`recv()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.recv
[`send()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.send
[`timeout()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.timeout
[`on_timeout()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.on_timeout
[`stream_send()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.stream_send
[`readable()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.readable
[`stream_recv()`]: https://docs.quic.tech/quiche/struct.Connection.html#method.stream_recv
[HTTP/3 module]: https://docs.quic.tech/quiche/h3/index.html
Have a look at the [quiche/examples/] directory for more complete examples on
how to use the quiche API, including examples on how to use quiche in C/C++
applications (see below for more information).
[examples/]: quiche/examples/
Calling quiche from C/C++
-------------------------
quiche exposes a [thin C API] on top of the Rust API that can be used to more
easily integrate quiche into C/C++ applications (as well as in other languages
that allow calling C APIs via some form of FFI). The C API follows the same
design of the Rust one, modulo the constraints imposed by the C language itself.
When running ``cargo build``, a static library called ``libquiche.a`` will be
built automatically alongside the Rust one. This is fully stand-alone and can
be linked directly into C/C++ applications.
Note that in order to enable the FFI API, the ``ffi`` feature must be enabled (it
is disabled by default), by passing ``--features ffi`` to ``cargo``.
[thin C API]: https://github.com/cloudflare/quiche/blob/master/quiche/include/quiche.h
Building
--------
quiche requires Rust 1.85 or later to build. The latest stable Rust release can
be installed using [rustup](https://rustup.rs/).
Once the Rust build environment is setup, the quiche source code can be fetched
using git:
```bash
$ git clone --recursive https://github.com/cloudflare/quiche
```
and then built using cargo:
```bash
$ cargo build --examples
```
cargo can also be used to run the testsuite:
```bash
$ cargo test
```
Note that [BoringSSL], which is used to implement QUIC's cryptographic handshake
based on TLS, needs to be built and linked to quiche. This is done automatically
when building quiche using cargo, but requires the `cmake` command to be
available during the build process. On Windows you also need
[NASM](https://www.nasm.us/). The [official BoringSSL
documentation](https://github.com/google/boringssl/blob/master/BUILDING.md) has
more details.
In alternative you can use your own custom build of BoringSSL by configuring
the BoringSSL directory with the ``QUICHE_BSSL_PATH`` environment variable:
```bash
$ QUICHE_BSSL_PATH="/path/to/boringssl" cargo build --examples
```
Alternatively you can use [OpenSSL/quictls]. To enable quiche to use this vendor
the ``openssl`` feature can be added to the ``--feature`` list. Be aware that
``0-RTT`` is not supported if this vendor is used.
[BoringSSL]: https://boringssl.googlesource.com/boringssl/
[OpenSSL/quictls]: https://github.com/quictls/openssl
### Building for Android
Building quiche for Android (NDK version 19 or higher, 21 recommended), can be
done using [cargo-ndk] (v2.0 or later).
First the [Android NDK] needs to be installed, either using Android Studio or
directly, and the `ANDROID_NDK_HOME` environment variable needs to be set to the
NDK installation path, e.g.:
```bash
$ export ANDROID_NDK_HOME=/usr/local/share/android-ndk
```
Then the Rust toolchain for the Android architectures needed can be installed as
follows:
```bash
$ rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
```
Note that the minimum API level is 21 for all target architectures.
[cargo-ndk] (v2.0 or later) also needs to be installed:
```bash
$ cargo install cargo-ndk
```
Finally the quiche library can be built using the following procedure. Note that
the `-t <architecture>` and `-p <NDK version>` options are mandatory.
```bash
$ cargo ndk -t arm64-v8a -p 21 -- build --features ffi
```
See [build_android_ndk19.sh] for more information.
[Android NDK]: https://developer.android.com/ndk
[cargo-ndk]: https://docs.rs/crate/cargo-ndk
[build_android_ndk19.sh]: https://github.com/cloudflare/quiche/blob/master/tools/android/build_android_ndk19.sh
### Building for iOS
To build quiche for iOS, you need the following:
- Install Xcode command-line tools. You can install them with Xcode or with the
following command:
```bash
$ xcode-select --install
```
- Install the Rust toolchain for iOS architectures:
```bash
$ rustup target add aarch64-apple-ios x86_64-apple-ios
```
- Install `cargo-lipo`:
```bash
$ cargo install cargo-lipo
```
To build libquiche, run the following command:
```bash
$ cargo lipo --features ffi
```
or
```bash
$ cargo lipo --features ffi --release
```
iOS build is tested in Xcode 10.1 and Xcode 11.2.
### Building Docker images
In order to build the Docker images, simply run the following command:
```bash
$ make docker-build
```
You can find the quiche Docker images on the following Docker Hub repositories:
- [cloudflare/quiche](https://hub.docker.com/repository/docker/cloudflare/quiche)
- [cloudflare/quiche-qns](https://hub.docker.com/repository/docker/cloudflare/quiche-qns)
The `latest` tag will be updated whenever quiche master branch updates.
**cloudflare/quiche**
Provides a server and client installed in /usr/local/bin.
**cloudflare/quiche-qns**
Provides the script to test quiche within the [quic-interop-runner](https://github.com/marten-seemann/quic-interop-runner).
Disclaimers and Notes
---------
⚠️ This repository includes a number of client and server example
applications that are provided to demonstrate simple usage of the quiche library
API. They are not intended to be used in production environments; no
performance, security or reliability guarantees are provided.
Copyright
---------
Copyright (C) 2018-2019, Cloudflare, Inc.
See [COPYING] for the license.
[COPYING]: https://github.com/cloudflare/quiche/tree/master/COPYING
================================================
FILE: RELEASING.md
================================================
Releasing
=========
This document describes the process for cutting releases of the crates in this
repository.
Major, Minor and Patch releases
-------------------------------
Before cutting a release it's important to decide whether a major or minor
release needs to be created. This is important because creating major
(incompatible) releases requires work in the dependent projects, while minor
releases don't, so we should avoid creating unnecessary work for users by using
the correct release type.
All crates in this repository currently use pre-1.0 version numbers, meaning
that bumping the minor component (the `Y` in `X.Y.Z`) is equivalent to doing a
major release, while bumping the patch component (`Z`) is equivalent to a minor
release.
In order to determine whether a major or minor release is necessary, the
[cargo-semver-checks](https://crates.io/crates/cargo-semver-checks) tool can be
used to detect API-breaking changes:
```
$ cargo semver-checks -p <crate>
```
However sometimes a major release needs to be cut even if semver-checks doesn't
detect an API change, for example in case of major behaviour changes in the
crate that might affect applications using it.
Checking dependencies
---------------------
It's also important to ensure the crate to be released can be built outside of
the repository, meaning that all required dependencies have also been released
and published already, otherwise there is a risk of cutting a release that can't
then be published to crates.io:
```
$ cargo package -p <crate>
```
Creating a release
------------------
A release can now be created using the `cargo release` command:
```
$ git checkout -b release-x.y.z
$ cargo release --no-push --no-publish --no-tag -x <patch|minor> -p <crate>
```
The `release-x.y.z` branch can then be pushed to GitHub and a pull request
opened.
Note that because GitHub will rebase the release commit on merging the PR, we
use the `--no-tag` option to avoid tagging the release at this point. The tag
should only be created once the release PR is merged as follows:
```
$ git tag <crate>-<version>
```
e.g. `git tag tokio-quiche-0.6.0`.
For historical reasons, releases of quiche itself do not have the name of the
crate in the tag (so would only be `0.6.0` in the example above).
Publishing the release
----------------------
Finally, the new release needs to be published to crates.io:
```
$ cargo publish -p <crate>
```
It's good practice to check that the release then gets successfully published on
[crates.io](https://crates.io/) and that the documentation is correctly built
and published to [docs.rs](https://docs.rs) (this might take a few minutes), in
case bad changes slipped through the process and caused the crate to not be
published correctly.
Release notes
-------------
We currently only provide release notes for the quiche crate itself, via GitHub
releases https://github.com/cloudflare/quiche/releases
Release notes should not use the raw list of git commits, as that usually
includes a number of commits that don't really need to appear in the notes as
they are not useful for users to know (e.g. internal refactoring, test fixes,
warnings/clippy/formatting fixes, ...), and commit messages alone aren't
necessarily understandble by users of quiche anyway.
Only the more important *user visible* changes should be listed, with a brief
description of the change and potentially links to docs.rs (e.g. for new APIs).
Additionally, breaking changes and security fixes should be clearly marked as
such as they are generally the ones that most require users' attention (see e.g.
[this one](https://github.com/cloudflare/quiche/releases/tag/0.24.0) for breaking
changes, and [this one](https://github.com/cloudflare/quiche/releases/tag/0.24.4)
for security fixes, or look for "breaking changes" and "security" in the list
of releases linked above).
It's especially important to note what changes an application might need to do
in case of breaking changes, so that users can more easily take action.
The emoji in the release name is optional, but it's the only thing close to
"fun" when doing a release. You can pick one randomly or one that is related
in one way or another to the contents of the release.
Don't forget to pick the appropriate tag for the release in the dropdown menu,
as well as marking the new release as the latest one.
================================================
FILE: apps/Cargo.toml
================================================
[package]
name = "quiche_apps"
version = "0.1.0"
authors = ["Lucas Pardue <lucaspardue.24.7@gmail.com>"]
edition = { workspace = true }
repository = { workspace = true }
license = { workspace = true }
keywords = { workspace = true }
categories = { workspace = true }
publish = false
[features]
# Enable quiche's fuzzing mode.
fuzzing = ["quiche/fuzzing"]
# Enable qlog support.
qlog = ["quiche/qlog"]
# Use BoringSSL provided by the boring crate.
boringssl-boring-crate = ["quiche/boringssl-boring-crate"]
# Enable sfv support.
sfv = ["quiche/sfv"]
default = ["qlog", "sfv"]
[dependencies]
docopt = "1"
env_logger = { workspace = true }
libc = { workspace = true }
log = { workspace = true }
mio = { workspace = true, features = ["net", "os-poll"] }
nix = { workspace = true, features = ["net", "socket", "uio"] }
octets = { workspace = true }
quiche = { workspace = true }
ring = { workspace = true }
url = { workspace = true }
[lib]
crate-type = ["lib"]
================================================
FILE: apps/run_endpoint.sh
================================================
#!/bin/bash
set -e
# Set up the routing needed for the simulation
/setup.sh
# The following variables are available for use:
# - ROLE contains the role of this execution context, client or server
# - SERVER_PARAMS contains user-supplied command line parameters
# - CLIENT_PARAMS contains user-supplied command line parameters
QUICHE_DIR=/quiche
WWW_DIR=/www
DOWNLOAD_DIR=/downloads
QUICHE_CLIENT=quiche-client
QUICHE_SERVER=quiche-server
QUICHE_CLIENT_OPT="--no-verify --dump-responses ${DOWNLOAD_DIR} --wire-version 1 --max-active-cids 8"
# interop container has tso off. need to disable gso as well.
QUICHE_SERVER_OPT_COMMON="--listen [::]:443 --root $WWW_DIR --cert /certs/cert.pem --key /certs/priv.key --enable-active-migration --max-active-cids 8 --disable-gso --disable-pacing"
QUICHE_SERVER_OPT="$QUICHE_SERVER_OPT_COMMON --no-retry "
LOG_DIR=/logs
LOG=$LOG_DIR/log.txt
check_testcase () {
case $1 in
handshake | multiconnect | http3 )
echo "supported"
;;
transfer )
echo "supported"
;;
chacha20 )
if [ "$ROLE" == "client" ]; then
# We don't support selecting a cipher on the client-side.
echo "unsupported"
exit 127
elif [ "$ROLE" == "server" ]; then
echo "supported"
fi
;;
resumption )
echo "supported"
QUICHE_CLIENT_OPT="$QUICHE_CLIENT_OPT --session-file=session.bin"
;;
zerortt )
if [ "$ROLE" == "client" ]; then
echo "supported"
QUICHE_CLIENT_OPT="$QUICHE_CLIENT_OPT --session-file=session.bin --early-data"
elif [ "$ROLE" == "server" ]; then
echo "supported"
QUICHE_SERVER_OPT="$QUICHE_SERVER_OPT --early-data"
fi
;;
retry )
echo "supported"
QUICHE_SERVER_OPT="$QUICHE_SERVER_OPT_COMMON"
;;
*)
echo "unsupported"
exit 127
;;
esac
}
run_quiche_client_tests () {
case $1 in
multiconnect )
for req in $REQUESTS
do
$QUICHE_DIR/$QUICHE_CLIENT $QUICHE_CLIENT_OPT \
$CLIENT_PARAMS $req >> $LOG 2>&1
done
;;
resumption | zerortt )
REQS=($REQUESTS)
# Run first request in 1-RTT to establish session.
FIRST_REQUEST=${REQS[0]}
$QUICHE_DIR/$QUICHE_CLIENT $QUICHE_CLIENT_OPT \
$CLIENT_PARAMS $FIRST_REQUEST >> $LOG 2>&1
# Run remaining requests in resumed connection.
REMAINING_REQUESTS=${REQS[@]:1}
$QUICHE_DIR/$QUICHE_CLIENT $QUICHE_CLIENT_OPT \
$CLIENT_PARAMS $REMAINING_REQUESTS >& $LOG 2>&1
;;
*)
$QUICHE_DIR/$QUICHE_CLIENT $QUICHE_CLIENT_OPT \
$CLIENT_PARAMS $REQUESTS >& $LOG
;;
esac
}
run_quiche_server_tests() {
$QUICHE_DIR/$QUICHE_SERVER $SERVER_PARAMS $QUICHE_SERVER_OPT >& $LOG
}
# Update config based on test case
check_testcase $TESTCASE
# Create quiche log directory
mkdir -p $LOG_DIR
if [ "$ROLE" == "client" ]; then
# Wait for the simulator to start up.
wait-for-it sim:57832 -s -t 30
echo "## Starting quiche client..."
echo "## Client params: $CLIENT_PARAMS"
echo "## Requests: $REQUESTS"
echo "## Test case: $TESTCASE"
run_quiche_client_tests $TESTCASE
elif [ "$ROLE" == "server" ]; then
echo "## Starting quiche server..."
echo "## Server params: $SERVER_PARAMS"
echo "## Test case: $TESTCASE"
run_quiche_server_tests
fi
================================================
FILE: apps/src/args.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use super::common::alpns;
use std::time::Duration;
pub trait Args {
fn with_docopt(docopt: &docopt::Docopt) -> Self;
}
/// Contains commons arguments for creating a quiche QUIC connection.
pub struct CommonArgs {
pub alpns: Vec<&'static [u8]>,
pub max_data: u64,
pub max_window: u64,
pub max_stream_data: u64,
pub max_stream_window: u64,
pub max_streams_bidi: u64,
pub max_streams_uni: u64,
pub idle_timeout: u64,
pub early_data: bool,
pub dump_packet_path: Option<String>,
pub no_grease: bool,
pub cc_algorithm: String,
pub disable_hystart: bool,
pub dgrams_enabled: bool,
pub dgram_count: u64,
pub dgram_data: String,
pub max_active_cids: u64,
pub enable_active_migration: bool,
pub max_field_section_size: Option<u64>,
pub qpack_max_table_capacity: Option<u64>,
pub qpack_blocked_streams: Option<u64>,
pub initial_rtt: Duration,
pub initial_cwnd_packets: u64,
}
/// Creates a new `CommonArgs` structure using the provided [`Docopt`].
///
/// The `Docopt` usage String needs to include the following:
///
/// --http-version VERSION HTTP version to use.
/// --max-data BYTES Connection-wide flow control limit.
/// --max-window BYTES Connection-wide max receiver window.
/// --max-stream-data BYTES Per-stream flow control limit.
/// --max-stream-window BYTES Per-stream max receiver window.
/// --max-streams-bidi STREAMS Number of allowed concurrent streams.
/// --max-streams-uni STREAMS Number of allowed concurrent streams.
/// --dump-packets PATH Dump the incoming packets in PATH.
/// --no-grease Don't send GREASE.
/// --cc-algorithm NAME Set a congestion control algorithm.
/// --disable-hystart Disable HyStart++.
/// --dgram-proto PROTO DATAGRAM application protocol.
/// --dgram-count COUNT Number of DATAGRAMs to send.
/// --dgram-data DATA DATAGRAM data to send.
/// --max-active-cids NUM Maximum number of active Connection IDs.
/// --enable-active-migration Enable active connection migration.
/// --max-field-section-size BYTES Max size of uncompressed field section.
/// --qpack-max-table-capacity BYTES Max capacity of dynamic QPACK decoding.
/// --qpack-blocked-streams STREAMS Limit of blocked streams while decoding.
/// --initial-cwnd-packets Size of initial congestion window, in packets.
///
/// [`Docopt`]: https://docs.rs/docopt/1.1.0/docopt/
impl Args for CommonArgs {
fn with_docopt(docopt: &docopt::Docopt) -> Self {
let args = docopt.parse().unwrap_or_else(|e| e.exit());
let http_version = args.get_str("--http-version");
let dgram_proto = args.get_str("--dgram-proto");
let (alpns, dgrams_enabled) = match (http_version, dgram_proto) {
("HTTP/0.9", "none") => (alpns::HTTP_09.to_vec(), false),
("HTTP/0.9", _) => {
panic!("Unsupported HTTP version and DATAGRAM protocol.")
},
("HTTP/3", "none") => (alpns::HTTP_3.to_vec(), false),
("HTTP/3", "oneway") => (alpns::HTTP_3.to_vec(), true),
("all", "none") => (
[alpns::HTTP_3.as_slice(), &alpns::HTTP_09]
.concat()
.to_vec(),
false,
),
(..) => panic!("Unsupported HTTP version and DATAGRAM protocol."),
};
let dgram_count = args.get_str("--dgram-count");
let dgram_count = dgram_count.parse::<u64>().unwrap();
let dgram_data = args.get_str("--dgram-data").to_string();
let max_data = args.get_str("--max-data");
let max_data = max_data.parse::<u64>().unwrap();
let max_window = args.get_str("--max-window");
let max_window = max_window.parse::<u64>().unwrap();
let max_stream_data = args.get_str("--max-stream-data");
let max_stream_data = max_stream_data.parse::<u64>().unwrap();
let max_stream_window = args.get_str("--max-stream-window");
let max_stream_window = max_stream_window.parse::<u64>().unwrap();
let max_streams_bidi = args.get_str("--max-streams-bidi");
let max_streams_bidi = max_streams_bidi.parse::<u64>().unwrap();
let max_streams_uni = args.get_str("--max-streams-uni");
let max_streams_uni = max_streams_uni.parse::<u64>().unwrap();
let idle_timeout = args.get_str("--idle-timeout");
let idle_timeout = idle_timeout.parse::<u64>().unwrap();
let early_data = args.get_bool("--early-data");
let dump_packet_path = if !args.get_str("--dump-packets").is_empty() {
Some(args.get_str("--dump-packets").to_string())
} else {
None
};
let no_grease = args.get_bool("--no-grease");
let cc_algorithm = args.get_str("--cc-algorithm");
let disable_hystart = args.get_bool("--disable-hystart");
let max_active_cids = args.get_str("--max-active-cids");
let max_active_cids = max_active_cids.parse::<u64>().unwrap();
let enable_active_migration = args.get_bool("--enable-active-migration");
let max_field_section_size =
if !args.get_str("--max-field-section-size").is_empty() {
Some(
args.get_str("--max-field-section-size")
.parse::<u64>()
.unwrap(),
)
} else {
None
};
let qpack_max_table_capacity =
if !args.get_str("--qpack-max-table-capacity").is_empty() {
Some(
args.get_str("--qpack-max-table-capacity")
.parse::<u64>()
.unwrap(),
)
} else {
None
};
let qpack_blocked_streams =
if !args.get_str("--qpack-blocked-streams").is_empty() {
Some(
args.get_str("--qpack-blocked-streams")
.parse::<u64>()
.unwrap(),
)
} else {
None
};
let initial_rtt_millis =
args.get_str("--initial-rtt").parse::<u64>().unwrap();
let initial_rtt = Duration::from_millis(initial_rtt_millis);
let initial_cwnd_packets = args
.get_str("--initial-cwnd-packets")
.parse::<u64>()
.unwrap();
CommonArgs {
alpns,
max_data,
max_window,
max_stream_data,
max_stream_window,
max_streams_bidi,
max_streams_uni,
idle_timeout,
early_data,
dump_packet_path,
no_grease,
cc_algorithm: cc_algorithm.to_string(),
disable_hystart,
dgrams_enabled,
dgram_count,
dgram_data,
max_active_cids,
enable_active_migration,
max_field_section_size,
qpack_max_table_capacity,
qpack_blocked_streams,
initial_rtt,
initial_cwnd_packets,
}
}
}
impl Default for CommonArgs {
fn default() -> Self {
CommonArgs {
alpns: alpns::HTTP_3.to_vec(),
max_data: 10000000,
max_window: 25165824,
max_stream_data: 1000000,
max_stream_window: 16777216,
max_streams_bidi: 100,
max_streams_uni: 100,
idle_timeout: 30000,
early_data: false,
dump_packet_path: None,
no_grease: false,
cc_algorithm: "cubic".to_string(),
disable_hystart: false,
dgrams_enabled: false,
dgram_count: 0,
dgram_data: "quack".to_string(),
max_active_cids: 2,
enable_active_migration: false,
max_field_section_size: None,
qpack_max_table_capacity: None,
qpack_blocked_streams: None,
initial_rtt: Duration::from_millis(333),
initial_cwnd_packets: 10,
}
}
}
pub const CLIENT_USAGE: &str = "Usage:
quiche-client [options] URL...
quiche-client -h | --help
Options:
--method METHOD Use the given HTTP request method [default: GET].
--body FILE Send the given file as request body.
--max-data BYTES Connection-wide flow control limit [default: 10000000].
--max-window BYTES Connection-wide max receiver window [default: 25165824].
--max-stream-data BYTES Per-stream flow control limit [default: 1000000].
--max-stream-window BYTES Per-stream max receiver window [default: 16777216].
--max-streams-bidi STREAMS Number of allowed concurrent streams [default: 100].
--max-streams-uni STREAMS Number of allowed concurrent streams [default: 100].
--idle-timeout TIMEOUT Idle timeout in milliseconds [default: 30000].
--wire-version VERSION The version number to send to the server [default: babababa].
--http-version VERSION HTTP version to use [default: all].
--early-data Enable sending early data.
--dgram-proto PROTO DATAGRAM application protocol to use [default: none].
--dgram-count COUNT Number of DATAGRAMs to send [default: 0].
--dgram-data DATA Data to send for certain types of DATAGRAM application protocol [default: quack].
--dump-packets PATH Dump the incoming packets as files in the given directory.
--dump-responses PATH Dump response payload as files in the given directory.
--dump-json Dump response headers and payload to stdout in JSON format.
--max-json-payload BYTES Per-response payload limit when dumping JSON [default: 10000].
--connect-to ADDRESS Override the server's address.
--no-verify Don't verify server's certificate.
--trust-origin-ca-pem <file> Path to the pem file of the origin's CA, if not publicly trusted.
--no-grease Don't send GREASE.
--cc-algorithm NAME Specify which congestion control algorithm to use [default: cubic].
--disable-hystart Disable HyStart++.
--max-active-cids NUM The maximum number of active Connection IDs we can support [default: 2].
--enable-active-migration Enable active connection migration.
--perform-migration Perform connection migration on another source port.
-H --header HEADER ... Add a request header.
-n --requests REQUESTS Send the given number of identical requests [default: 1].
--send-priority-update Send HTTP/3 priority updates if the query string params 'u' or 'i' are present in URLs
--max-field-section-size BYTES Max size of uncompressed field section. Default is unlimited.
--qpack-max-table-capacity BYTES Max capacity of dynamic QPACK decoding.. Any value other that 0 is currently unsupported.
--qpack-blocked-streams STREAMS Limit of blocked streams while decoding. Any value other that 0 is currently unsupported.
--session-file PATH File used to cache a TLS session for resumption.
--source-port PORT Source port to use when connecting to the server [default: 0].
--initial-rtt MILLIS The initial RTT in milliseconds [default: 333].
--initial-cwnd-packets PACKETS The initial congestion window size in terms of packet count [default: 10].
-h --help Show this screen.
";
/// Application-specific arguments that compliment the `CommonArgs`.
pub struct ClientArgs {
pub version: u32,
pub dump_response_path: Option<String>,
pub dump_json: Option<usize>,
pub urls: Vec<url::Url>,
pub reqs_cardinal: u64,
pub req_headers: Vec<String>,
pub no_verify: bool,
pub trust_origin_ca_pem: Option<String>,
pub body: Option<Vec<u8>>,
pub method: String,
pub connect_to: Option<String>,
pub session_file: Option<String>,
pub source_port: u16,
pub perform_migration: bool,
pub send_priority_update: bool,
}
impl Args for ClientArgs {
fn with_docopt(docopt: &docopt::Docopt) -> Self {
let args = docopt.parse().unwrap_or_else(|e| e.exit());
let version = args.get_str("--wire-version");
let version = u32::from_str_radix(version, 16).unwrap();
let dump_response_path = if !args.get_str("--dump-responses").is_empty() {
Some(args.get_str("--dump-responses").to_string())
} else {
None
};
let dump_json = args.get_bool("--dump-json");
let dump_json = if dump_json {
let max_payload = args.get_str("--max-json-payload");
let max_payload = max_payload.parse::<usize>().unwrap();
Some(max_payload)
} else {
None
};
// URLs (can be multiple).
let urls: Vec<url::Url> = args
.get_vec("URL")
.into_iter()
.map(|x| url::Url::parse(x).unwrap())
.collect();
// Request headers (can be multiple).
let req_headers = args
.get_vec("--header")
.into_iter()
.map(|x| x.to_string())
.collect();
let reqs_cardinal = args.get_str("--requests");
let reqs_cardinal = reqs_cardinal.parse::<u64>().unwrap();
let no_verify = args.get_bool("--no-verify");
let trust_origin_ca_pem = args.get_str("--trust-origin-ca-pem");
let trust_origin_ca_pem = if !trust_origin_ca_pem.is_empty() {
Some(trust_origin_ca_pem.to_string())
} else {
None
};
let body = if args.get_bool("--body") {
std::fs::read(args.get_str("--body")).ok()
} else {
None
};
let method = args.get_str("--method").to_string();
let connect_to = if args.get_bool("--connect-to") {
Some(args.get_str("--connect-to").to_string())
} else {
None
};
let session_file = if args.get_bool("--session-file") {
Some(args.get_str("--session-file").to_string())
} else {
None
};
let source_port = args.get_str("--source-port");
let source_port = source_port.parse::<u16>().unwrap();
let perform_migration = args.get_bool("--perform-migration");
let send_priority_update = args.get_bool("--send-priority-update");
ClientArgs {
version,
dump_response_path,
dump_json,
urls,
reqs_cardinal,
req_headers,
no_verify,
trust_origin_ca_pem,
body,
method,
connect_to,
session_file,
source_port,
perform_migration,
send_priority_update,
}
}
}
impl Default for ClientArgs {
fn default() -> Self {
ClientArgs {
version: 0xbabababa,
dump_response_path: None,
dump_json: None,
urls: vec![],
req_headers: vec![],
reqs_cardinal: 1,
no_verify: false,
trust_origin_ca_pem: None,
body: None,
method: "GET".to_string(),
connect_to: None,
session_file: None,
source_port: 0,
perform_migration: false,
send_priority_update: false,
}
}
}
pub const SERVER_USAGE: &str = "Usage:
quiche-server [options]
quiche-server -h | --help
Options:
--listen <addr> Listen on the given IP:port [default: 127.0.0.1:4433]
--cert <file> TLS certificate path [default: src/bin/cert.crt]
--key <file> TLS certificate key path [default: src/bin/cert.key]
--root <dir> Root directory [default: src/bin/root/]
--index <name> The file that will be used as index [default: index.html].
--name <str> Name of the server [default: quic.tech]
--max-data BYTES Connection-wide flow control limit [default: 10000000].
--max-window BYTES Connection-wide max receiver window [default: 25165824].
--max-stream-data BYTES Per-stream flow control limit [default: 1000000].
--max-stream-window BYTES Per-stream max receiver window [default: 16777216].
--max-streams-bidi STREAMS Number of allowed concurrent streams [default: 100].
--max-streams-uni STREAMS Number of allowed concurrent streams [default: 100].
--idle-timeout TIMEOUT Idle timeout in milliseconds [default: 30000].
--dump-packets PATH Dump the incoming packets as files in the given directory.
--early-data Enable receiving early data.
--no-retry Disable stateless retry.
--no-grease Don't send GREASE.
--http-version VERSION HTTP version to use [default: all].
--dgram-proto PROTO DATAGRAM application protocol to use [default: none].
--dgram-count COUNT Number of DATAGRAMs to send [default: 0].
--dgram-data DATA Data to send for certain types of DATAGRAM application protocol [default: brrr].
--cc-algorithm NAME Specify which congestion control algorithm to use [default: cubic].
--disable-hystart Disable HyStart++.
--max-active-cids NUM The maximum number of active Connection IDs we can support [default: 2].
--enable-active-migration Enable active connection migration.
--max-field-section-size BYTES Max size of uncompressed HTTP/3 field section. Default is unlimited.
--qpack-max-table-capacity BYTES Max capacity of QPACK dynamic table decoding. Any value other that 0 is currently unsupported.
--qpack-blocked-streams STREAMS Limit of streams that can be blocked while decoding. Any value other that 0 is currently unsupported.
--disable-gso Disable GSO (linux only).
--disable-pacing Disable pacing (linux only).
--initial-rtt MILLIS The initial RTT in milliseconds [default: 333].
--initial-cwnd-packets PACKETS The initial congestion window size in terms of packet count [default: 10].
-h --help Show this screen.
";
// Application-specific arguments that compliment the `CommonArgs`.
pub struct ServerArgs {
pub listen: String,
pub no_retry: bool,
pub root: String,
pub index: String,
pub cert: String,
pub key: String,
pub disable_gso: bool,
pub disable_pacing: bool,
pub enable_pmtud: bool,
}
impl Args for ServerArgs {
fn with_docopt(docopt: &docopt::Docopt) -> Self {
let args = docopt.parse().unwrap_or_else(|e| e.exit());
let listen = args.get_str("--listen").to_string();
let no_retry = args.get_bool("--no-retry");
let root = args.get_str("--root").to_string();
let index = args.get_str("--index").to_string();
let cert = args.get_str("--cert").to_string();
let key = args.get_str("--key").to_string();
let disable_gso = args.get_bool("--disable-gso");
let disable_pacing = args.get_bool("--disable-pacing");
let enable_pmtud = args.get_bool("--enable-pmtud");
ServerArgs {
listen,
no_retry,
root,
index,
cert,
key,
disable_gso,
disable_pacing,
enable_pmtud,
}
}
}
================================================
FILE: apps/src/bin/cert.crt
================================================
-----BEGIN CERTIFICATE-----
MIIDkzCCAnugAwIBAgIUaj26Dyzr2W9R8juKm2pNyrtati0wDQYJKoZIhvcNAQEL
BQAwWTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJcXVpYy50ZWNoMB4X
DTE4MDkzMDIyMTE0OFoXDTE5MDkzMDIyMTE0OFowWTELMAkGA1UEBhMCQVUxEzAR
BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
IEx0ZDESMBAGA1UEAwwJcXVpYy50ZWNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAqrS30fnkI6Q+5SKsBXkIwnhO61x/Wgt0zo5P+0yTAZDYVYtEhRlf
mJ3esEleO1nq5MtM3d+6aVBJlwtTi8pBOzVfJklnxd07N3rKh3HZbGHybjhJFGT9
U4sUrcKcCpSKJaEu7IQsQQs1Hh0B67MeqJG3F7OcYCF3OXC11WK3CtDDKcLcsa2x
+WImzsPfayzEjQ4ELTVDP73oQGR6D3HaWauKES4JjI9CMn8EJRCcxjwet+c4U3kQ
g2z5KDbooBfCfrzmX3/EpMf/RaASaUtZF3kgfDT648dICWUoiparo1V73pg2vDe5
RsAp4n1A7VCY48VvGEz9Qgcp8QFztpFJnwIDAQABo1MwUTAdBgNVHQ4EFgQUFOlS
IeYH/41CN5BP/8w8F3e/fkYwHwYDVR0jBBgwFoAUFOlSIeYH/41CN5BP/8w8F3e/
fkYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAZa7XK3My4Jpe
SLz0BAj44QtghGdg98QFR3iZEnn0XC09HrkhbjaR8Ma3dn0QyMDRuPLLNl5j3VWu
rDqngENbuJJBPGkCTzozFfMU6MZzGLK1ljIiGzkMXVEaamSj7GDJ2eR2i2cBugiM
Yv7N/e8FbSMRBXoYVPjukoA8QwDJhS/oN47vt0+VsTi5wah9d3t0RCruAe/4TETo
jPxjbEGTQ71dmU66xPZMrnqlGCNa4kN2alCDNfSg1yRp4j10zSmK0jHEHOuiHliW
/Zc+aLEFcVB1QHmIyvcBIhKiuDbfbkWrqSiel6nLScIvhJaJOrGzQYBfjeZ4TO0m
IHJUojcgZA==
-----END CERTIFICATE-----
================================================
FILE: apps/src/bin/cert.key
================================================
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqtLfR+eQjpD7l
IqwFeQjCeE7rXH9aC3TOjk/7TJMBkNhVi0SFGV+Ynd6wSV47Werky0zd37ppUEmX
C1OLykE7NV8mSWfF3Ts3esqHcdlsYfJuOEkUZP1TixStwpwKlIoloS7shCxBCzUe
HQHrsx6okbcXs5xgIXc5cLXVYrcK0MMpwtyxrbH5YibOw99rLMSNDgQtNUM/vehA
ZHoPcdpZq4oRLgmMj0IyfwQlEJzGPB635zhTeRCDbPkoNuigF8J+vOZff8Skx/9F
oBJpS1kXeSB8NPrjx0gJZSiKlqujVXvemDa8N7lGwCnifUDtUJjjxW8YTP1CBynx
AXO2kUmfAgMBAAECggEAdWR0KT1NS8luy0qtu9HBWWM8+pSQq87HFClADZRaYDBI
5YMxqsqJOD4Q33CFEhHC/HZmtQpfen8RLINIgBCmDV6lwYGnkKWUTJHv53c+y08M
Vgn1D8Zng+VYYio7/vapjjkrONGoUU6wx7WxFXMHuWsD25PUDTPWdrTxBv6s3A0X
Le7UtuCdo/xNY4YS6S64SfiEPsBddj1NhoiwOHkXekpNRoAwnizjngubEkiznScu
gwKCW4nPV8y4CoIYyncGayrKieg03llgRngFiGJKpKeyL2UkX07Fqb2tXuJ36+RA
9DrluEkYWZCjOS+aaQu+NwxCkUV5pq+HcXQmF5VX+QKBgQDTrgF4sKwcIjm+k3Fp
bqhMS5stuSQJVn85fCIeQLq3u5DRq9n+UOvq6GvdEXz0SiupLfkXx/pDwiOux2sn
CcwMaPqWbFE4mSsCFCBkL/PvXSzH2zYesHOplztvcV+gexAjmoCikMBCcM00QpN1
GScUmQGTk/7BKJYGnVchJOXbfQKBgQDOcoZryCDxUPsg2ZMwkrnpcM+fSTT1gcgf
I3gbGohagiXVTDU4+S7I7WmsJv+lBUJCWRG0p8JJZb0NsgnrGyOfCKL59xAV5PyT
xSXMIi2+OH+fQXblII76GqWCs7A7NxtEU2geSy4ePPzSS4G81FN2oeV1OxZ9a6fk
6cFIzmqsSwKBgQDIBQlg6NiI8RJNcXdeH/EpvtuQNfzGUhR/1jtLCPEmgjcS2Odx
Nzflzd92knrXP2rIPye7//wMoNsk4UzwI4LLSztWfl21NI5+NVRyNxmyWgHhi9M0
5pk0bDH+WUv6Ea8rZWgdtNfnMD3HHw3FPZI/FWF2+QZlsRsqfuyA5iPI5QKBgQCu
D7F2Po5H6FdUIx4O3icRw6PKURbtyDbKykUB1SUR6pmrdU2Kc84WatWl6Fuy7vQm
rKJZBviwma8EVRA3wfIOrGF9D+noC+FJVffAXTDkKQ6xX6i3FvR1uvHBeW8k/hln
SkuG/ywrIpCnXjJM21hjtayZYvBbXuF4B/6HPEKEcQKBgQC+DVoOVjsoyd9udTcp
1v2xvwRVvU/OrPOLXwac1IbTgmb5FJYd8EZI0hdxJhialoTK3OONk04uxdn5tlAB
QwKBmkXZEr9EIreMp18gbzmDGalx8UcS0j+nIZvmpZXWsIimAKDGEwFc8w+NAN5a
X5UkSGjM6dnJocH0sLI7hXuVJw==
-----END PRIVATE KEY-----
================================================
FILE: apps/src/bin/quiche-client.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use quiche_apps::args::*;
use quiche_apps::common::*;
use quiche_apps::client::*;
fn main() {
env_logger::builder().format_timestamp_nanos().init();
// Parse CLI parameters.
let docopt = docopt::Docopt::new(CLIENT_USAGE).unwrap();
let conn_args = CommonArgs::with_docopt(&docopt);
let args = ClientArgs::with_docopt(&docopt);
match connect(args, conn_args, stdout_sink) {
Err(ClientError::HandshakeFail) => std::process::exit(-1),
Err(ClientError::HttpFail) => std::process::exit(-2),
Err(ClientError::Other(e)) => panic!("{}", e),
Ok(_) => (),
}
}
================================================
FILE: apps/src/bin/quiche-server.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#[macro_use]
extern crate log;
use std::io;
use std::net;
use std::io::prelude::*;
use std::collections::HashMap;
use std::convert::TryFrom;
use std::rc::Rc;
use std::cell::RefCell;
use ring::rand::*;
use quiche_apps::args::*;
use quiche_apps::common::*;
use quiche_apps::sendto::*;
const MAX_BUF_SIZE: usize = 65507;
const MAX_DATAGRAM_SIZE: usize = 1350;
fn main() {
let mut buf = [0; MAX_BUF_SIZE];
let mut out = [0; MAX_BUF_SIZE];
let mut pacing = false;
env_logger::builder().format_timestamp_nanos().init();
// Parse CLI parameters.
let docopt = docopt::Docopt::new(SERVER_USAGE).unwrap();
let conn_args = CommonArgs::with_docopt(&docopt);
let args = ServerArgs::with_docopt(&docopt);
// Setup the event loop.
let mut poll = mio::Poll::new().unwrap();
let mut events = mio::Events::with_capacity(1024);
// Create the UDP listening socket, and register it with the event loop.
let mut socket =
mio::net::UdpSocket::bind(args.listen.parse().unwrap()).unwrap();
// Set SO_TXTIME socket option on the listening UDP socket for pacing
// outgoing packets.
if !args.disable_pacing {
match set_txtime_sockopt(&socket) {
Ok(_) => {
pacing = true;
debug!("successfully set SO_TXTIME socket option");
},
Err(e) => debug!("setsockopt failed {e:?}"),
};
}
info!("listening on {:}", socket.local_addr().unwrap());
poll.registry()
.register(&mut socket, mio::Token(0), mio::Interest::READABLE)
.unwrap();
let max_datagram_size = MAX_DATAGRAM_SIZE;
let enable_gso = if args.disable_gso {
false
} else {
detect_gso(&socket, max_datagram_size)
};
trace!("GSO detected: {enable_gso}");
// Create the configuration for the QUIC connections.
let mut config = quiche::Config::new(quiche::PROTOCOL_VERSION).unwrap();
config.load_cert_chain_from_pem_file(&args.cert).unwrap();
config.load_priv_key_from_pem_file(&args.key).unwrap();
config.set_application_protos(&conn_args.alpns).unwrap();
config.discover_pmtu(args.enable_pmtud);
config.set_initial_rtt(conn_args.initial_rtt);
config.set_max_idle_timeout(conn_args.idle_timeout);
config.set_max_recv_udp_payload_size(max_datagram_size);
config.set_max_send_udp_payload_size(max_datagram_size);
config.set_initial_max_data(conn_args.max_data);
config.set_initial_max_stream_data_bidi_local(conn_args.max_stream_data);
config.set_initial_max_stream_data_bidi_remote(conn_args.max_stream_data);
config.set_initial_max_stream_data_uni(conn_args.max_stream_data);
config.set_initial_max_streams_bidi(conn_args.max_streams_bidi);
config.set_initial_max_streams_uni(conn_args.max_streams_uni);
config.set_disable_active_migration(!conn_args.enable_active_migration);
config.set_active_connection_id_limit(conn_args.max_active_cids);
config.set_initial_congestion_window_packets(
usize::try_from(conn_args.initial_cwnd_packets).unwrap(),
);
config.set_max_connection_window(conn_args.max_window);
config.set_max_stream_window(conn_args.max_stream_window);
config.enable_pacing(pacing);
let mut keylog = None;
if let Some(keylog_path) = std::env::var_os("SSLKEYLOGFILE") {
let file = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(keylog_path)
.unwrap();
keylog = Some(file);
config.log_keys();
}
if conn_args.early_data {
config.enable_early_data();
}
if conn_args.no_grease {
config.grease(false);
}
config
.set_cc_algorithm_name(&conn_args.cc_algorithm)
.unwrap();
if conn_args.disable_hystart {
config.enable_hystart(false);
}
if conn_args.dgrams_enabled {
config.enable_dgram(true, 1000, 1000);
}
let rng = SystemRandom::new();
let conn_id_seed =
ring::hmac::Key::generate(ring::hmac::HMAC_SHA256, &rng).unwrap();
let mut next_client_id = 0;
let mut clients_ids = ClientIdMap::new();
let mut clients = ClientMap::new();
let mut pkt_count = 0;
let mut continue_write = false;
let local_addr = socket.local_addr().unwrap();
loop {
// Find the shorter timeout from all the active connections.
//
// TODO: use event loop that properly supports timers
let timeout = match continue_write {
true => Some(std::time::Duration::from_secs(0)),
false => clients.values().filter_map(|c| c.conn.timeout()).min(),
};
let mut poll_res = poll.poll(&mut events, timeout);
while let Err(e) = poll_res.as_ref() {
if e.kind() == std::io::ErrorKind::Interrupted {
trace!("mio poll() call failed, retrying: {e:?}");
poll_res = poll.poll(&mut events, timeout);
} else {
panic!("mio poll() call failed fatally: {e:?}");
}
}
// Read incoming UDP packets from the socket and feed them to quiche,
// until there are no more packets to read.
'read: loop {
// If the event loop reported no events, it means that the timeout
// has expired, so handle it without attempting to read packets. We
// will then proceed with the send loop.
if events.is_empty() && !continue_write {
trace!("timed out");
clients.values_mut().for_each(|c| c.conn.on_timeout());
break 'read;
}
let (len, from) = match socket.recv_from(&mut buf) {
Ok(v) => v,
Err(e) => {
// There are no more UDP packets to read, so end the read
// loop.
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!("recv() would block");
break 'read;
}
panic!("recv() failed: {e:?}");
},
};
trace!("got {len} bytes from {from} to {local_addr}");
let pkt_buf = &mut buf[..len];
if let Some(target_path) = conn_args.dump_packet_path.as_ref() {
let path = format!("{target_path}/{pkt_count}.pkt");
if let Ok(f) = std::fs::File::create(path) {
let mut f = std::io::BufWriter::new(f);
f.write_all(pkt_buf).ok();
}
}
pkt_count += 1;
// Parse the QUIC packet's header.
let hdr = match quiche::Header::from_slice(
pkt_buf,
quiche::MAX_CONN_ID_LEN,
) {
Ok(v) => v,
Err(e) => {
error!("Parsing packet header failed: {e:?}");
continue 'read;
},
};
trace!("got packet {hdr:?}");
let conn_id = if !cfg!(feature = "fuzzing") {
let conn_id = ring::hmac::sign(&conn_id_seed, &hdr.dcid);
let conn_id = &conn_id.as_ref()[..quiche::MAX_CONN_ID_LEN];
conn_id.to_vec().into()
} else {
// When fuzzing use an all zero connection ID.
[0; quiche::MAX_CONN_ID_LEN].to_vec().into()
};
// Lookup a connection based on the packet's connection ID. If there
// is no connection matching, create a new one.
let client = if !clients_ids.contains_key(&hdr.dcid) &&
!clients_ids.contains_key(&conn_id)
{
if hdr.ty != quiche::Type::Initial {
error!("Packet is not Initial");
continue 'read;
}
if !quiche::version_is_supported(hdr.version) {
warn!("Doing version negotiation");
let len =
quiche::negotiate_version(&hdr.scid, &hdr.dcid, &mut out)
.unwrap();
let out = &out[..len];
if let Err(e) = socket.send_to(out, from) {
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!("send() would block");
break;
}
panic!("send() failed: {e:?}");
}
continue 'read;
}
let mut scid = [0; quiche::MAX_CONN_ID_LEN];
scid.copy_from_slice(&conn_id);
let mut odcid = None;
if !args.no_retry {
// Token is always present in Initial packets.
let token = hdr.token.as_ref().unwrap();
// Do stateless retry if the client didn't send a token.
if token.is_empty() {
warn!("Doing stateless retry");
let scid = quiche::ConnectionId::from_ref(&scid);
let new_token = mint_token(&hdr, &from);
let len = quiche::retry(
&hdr.scid,
&hdr.dcid,
&scid,
&new_token,
hdr.version,
&mut out,
)
.unwrap();
let out = &out[..len];
if let Err(e) = socket.send_to(out, from) {
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!("send() would block");
break;
}
panic!("send() failed: {e:?}");
}
continue 'read;
}
odcid = validate_token(&from, token);
// The token was not valid, meaning the retry failed, so
// drop the packet.
if odcid.is_none() {
error!("Invalid address validation token");
continue;
}
if scid.len() != hdr.dcid.len() {
error!("Invalid destination connection ID");
continue 'read;
}
// Reuse the source connection ID we sent in the Retry
// packet, instead of changing it again.
scid.copy_from_slice(&hdr.dcid);
}
let scid = quiche::ConnectionId::from_vec(scid.to_vec());
debug!("New connection: dcid={:?} scid={:?}", hdr.dcid, scid);
#[allow(unused_mut)]
let mut conn = quiche::accept(
&scid,
odcid.as_ref(),
local_addr,
from,
&mut config,
)
.unwrap();
if let Some(keylog) = &mut keylog {
if let Ok(keylog) = keylog.try_clone() {
conn.set_keylog(Box::new(keylog));
}
}
// Only bother with qlog if the user specified it.
#[cfg(feature = "qlog")]
{
if let Some(dir) = std::env::var_os("QLOGDIR") {
let id = format!("{:?}", &scid);
let writer = make_qlog_writer(&dir, "server", &id);
conn.set_qlog(
std::boxed::Box::new(writer),
"quiche-server qlog".to_string(),
format!("{} id={}", "quiche-server qlog", id),
);
}
}
let client_id = next_client_id;
let client = Client {
conn,
http_conn: None,
client_id,
partial_requests: HashMap::new(),
partial_responses: HashMap::new(),
app_proto_selected: false,
max_datagram_size,
loss_rate: 0.0,
max_send_burst: MAX_BUF_SIZE,
};
clients.insert(client_id, client);
clients_ids.insert(scid.clone(), client_id);
next_client_id += 1;
clients.get_mut(&client_id).unwrap()
} else {
let cid = match clients_ids.get(&hdr.dcid) {
Some(v) => v,
None => clients_ids.get(&conn_id).unwrap(),
};
clients.get_mut(cid).unwrap()
};
let recv_info = quiche::RecvInfo {
to: local_addr,
from,
};
// Process potentially coalesced packets.
let read = match client.conn.recv(pkt_buf, recv_info) {
Ok(v) => v,
Err(e) => {
error!("{} recv failed: {:?}", client.conn.trace_id(), e);
continue 'read;
},
};
trace!("{} processed {} bytes", client.conn.trace_id(), read);
// Create a new application protocol session as soon as the QUIC
// connection is established.
if !client.app_proto_selected &&
(client.conn.is_in_early_data() ||
client.conn.is_established())
{
// At this stage the ALPN negotiation succeeded and selected a
// single application protocol name. We'll use this to construct
// the correct type of HttpConn but `application_proto()`
// returns a slice, so we have to convert it to a str in order
// to compare to our lists of protocols. We `unwrap()` because
// we need the value and if something fails at this stage, there
// is not much anyone can do to recover.
let app_proto = client.conn.application_proto();
#[allow(clippy::box_default)]
if alpns::HTTP_09.contains(&app_proto) {
client.http_conn = Some(Box::<Http09Conn>::default());
client.app_proto_selected = true;
} else if alpns::HTTP_3.contains(&app_proto) {
let dgram_sender = if conn_args.dgrams_enabled {
Some(Http3DgramSender::new(
conn_args.dgram_count,
conn_args.dgram_data.clone(),
1,
))
} else {
None
};
client.http_conn = match Http3Conn::with_conn(
&mut client.conn,
conn_args.max_field_section_size,
conn_args.qpack_max_table_capacity,
conn_args.qpack_blocked_streams,
dgram_sender,
Rc::new(RefCell::new(stdout_sink)),
) {
Ok(v) => Some(v),
Err(e) => {
trace!("{} {}", client.conn.trace_id(), e);
None
},
};
client.app_proto_selected = true;
}
// Update max_datagram_size after connection established.
client.max_datagram_size =
client.conn.max_send_udp_payload_size();
}
if let Some(http_conn) = client.http_conn.as_mut() {
let conn = &mut client.conn;
let partial_responses = &mut client.partial_responses;
// Visit all writable response streams to send any remaining HTTP
// content.
for stream_id in writable_response_streams(conn) {
http_conn.handle_writable(conn, partial_responses, stream_id);
}
if http_conn
.handle_requests(
conn,
&mut client.partial_requests,
partial_responses,
&args.root,
&args.index,
&mut buf,
)
.is_err()
{
continue 'read;
}
}
handle_path_events(client);
// See whether source Connection IDs have been retired.
while let Some(retired_scid) = client.conn.retired_scid_next() {
info!("Retiring source CID {retired_scid:?}");
clients_ids.remove(&retired_scid);
}
// Provides as many CIDs as possible.
while client.conn.scids_left() > 0 {
let (scid, reset_token) = generate_cid_and_reset_token(&rng);
if client.conn.new_scid(&scid, reset_token, false).is_err() {
break;
}
clients_ids.insert(scid, client.client_id);
}
}
// Generate outgoing QUIC packets for all active connections and send
// them on the UDP socket, until quiche reports that there are no more
// packets to be sent.
continue_write = false;
for client in clients.values_mut() {
// Reduce max_send_burst by 25% if loss is increasing more than 0.1%.
let loss_rate =
client.conn.stats().lost as f64 / client.conn.stats().sent as f64;
if loss_rate > client.loss_rate + 0.001 {
client.max_send_burst = client.max_send_burst / 4 * 3;
// Minimum bound of 10xMSS.
client.max_send_burst =
client.max_send_burst.max(client.max_datagram_size * 10);
client.loss_rate = loss_rate;
}
let max_send_burst =
client.conn.send_quantum().min(client.max_send_burst) /
client.max_datagram_size *
client.max_datagram_size;
let mut total_write = 0;
let mut dst_info = None;
while total_write < max_send_burst {
let (write, send_info) = match client
.conn
.send(&mut out[total_write..max_send_burst])
{
Ok(v) => v,
Err(quiche::Error::Done) => {
trace!("{} done writing", client.conn.trace_id());
break;
},
Err(e) => {
error!("{} send failed: {:?}", client.conn.trace_id(), e);
client.conn.close(false, 0x1, b"fail").ok();
break;
},
};
total_write += write;
// Use the first packet time to send, not the last.
let _ = dst_info.get_or_insert(send_info);
if write < client.max_datagram_size {
continue_write = true;
break;
}
}
if total_write == 0 || dst_info.is_none() {
continue;
}
if let Err(e) = send_to(
&socket,
&out[..total_write],
&dst_info.unwrap(),
client.max_datagram_size,
pacing,
enable_gso,
) {
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!("send() would block");
break;
}
panic!("send_to() failed: {e:?}");
}
trace!(
"{} written {total_write} bytes with {dst_info:?}",
client.conn.trace_id()
);
if total_write >= max_send_burst {
trace!("{} pause writing", client.conn.trace_id(),);
continue_write = true;
break;
}
}
// Garbage collect closed connections.
clients.retain(|_, ref mut c| {
trace!("Collecting garbage");
if c.conn.is_closed() {
info!(
"{} connection collected {:?} {:?}",
c.conn.trace_id(),
c.conn.stats(),
c.conn.path_stats().collect::<Vec<quiche::PathStats>>()
);
for id in c.conn.source_ids() {
let id_owned = id.clone().into_owned();
clients_ids.remove(&id_owned);
}
}
!c.conn.is_closed()
});
}
}
/// Generate a stateless retry token.
///
/// The token includes the static string `"quiche"` followed by the IP address
/// of the client and by the original destination connection ID generated by the
/// client.
///
/// Note that this function is only an example and doesn't do any cryptographic
/// authenticate of the token. *It should not be used in production system*.
fn mint_token(hdr: &quiche::Header, src: &net::SocketAddr) -> Vec<u8> {
let mut token = Vec::new();
token.extend_from_slice(b"quiche");
let addr = match src.ip() {
std::net::IpAddr::V4(a) => a.octets().to_vec(),
std::net::IpAddr::V6(a) => a.octets().to_vec(),
};
token.extend_from_slice(&addr);
token.extend_from_slice(&hdr.dcid);
token
}
/// Validates a stateless retry token.
///
/// This checks that the ticket includes the `"quiche"` static string, and that
/// the client IP address matches the address stored in the ticket.
///
/// Note that this function is only an example and doesn't do any cryptographic
/// authenticate of the token. *It should not be used in production system*.
fn validate_token<'a>(
src: &net::SocketAddr, token: &'a [u8],
) -> Option<quiche::ConnectionId<'a>> {
if token.len() < 6 {
return None;
}
if &token[..6] != b"quiche" {
return None;
}
let token = &token[6..];
let addr = match src.ip() {
std::net::IpAddr::V4(a) => a.octets().to_vec(),
std::net::IpAddr::V6(a) => a.octets().to_vec(),
};
if token.len() < addr.len() || &token[..addr.len()] != addr.as_slice() {
return None;
}
Some(quiche::ConnectionId::from_ref(&token[addr.len()..]))
}
fn handle_path_events(client: &mut Client) {
while let Some(qe) = client.conn.path_event_next() {
match qe {
quiche::PathEvent::New(local_addr, peer_addr) => {
info!(
"{} Seen new path ({}, {})",
client.conn.trace_id(),
local_addr,
peer_addr
);
// Directly probe the new path.
client
.conn
.probe_path(local_addr, peer_addr)
.expect("cannot probe");
},
quiche::PathEvent::Validated(local_addr, peer_addr) => {
info!(
"{} Path ({}, {}) is now validated",
client.conn.trace_id(),
local_addr,
peer_addr
);
},
quiche::PathEvent::FailedValidation(local_addr, peer_addr) => {
info!(
"{} Path ({}, {}) failed validation",
client.conn.trace_id(),
local_addr,
peer_addr
);
},
quiche::PathEvent::Closed(local_addr, peer_addr) => {
info!(
"{} Path ({}, {}) is now closed and unusable",
client.conn.trace_id(),
local_addr,
peer_addr
);
},
quiche::PathEvent::ReusedSourceConnectionId(cid_seq, old, new) => {
info!(
"{} Peer reused cid seq {} (initially {:?}) on {:?}",
client.conn.trace_id(),
cid_seq,
old,
new
);
},
quiche::PathEvent::PeerMigrated(local_addr, peer_addr) => {
info!(
"{} Connection migrated to ({}, {})",
client.conn.trace_id(),
local_addr,
peer_addr
);
},
}
}
}
/// Set SO_TXTIME socket option.
///
/// This socket option is set to send to kernel the outgoing UDP
/// packet transmission time in the sendmsg syscall.
///
/// Note that this socket option is set only on linux platforms.
#[cfg(target_os = "linux")]
fn set_txtime_sockopt(sock: &mio::net::UdpSocket) -> io::Result<()> {
use nix::sys::socket::setsockopt;
use nix::sys::socket::sockopt::TxTime;
use std::os::unix::io::AsFd;
let config = nix::libc::sock_txtime {
clockid: libc::CLOCK_MONOTONIC,
flags: 0,
};
setsockopt(&sock.as_fd(), TxTime, &config)?;
Ok(())
}
#[cfg(not(target_os = "linux"))]
fn set_txtime_sockopt(_: &mio::net::UdpSocket) -> io::Result<()> {
use std::io::Error;
Err(Error::other("Not supported on this platform"))
}
================================================
FILE: apps/src/client.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use crate::args::*;
use crate::common::*;
use std::io::prelude::*;
use std::rc::Rc;
use std::cell::RefCell;
use ring::rand::*;
const MAX_DATAGRAM_SIZE: usize = 1350;
#[derive(Debug)]
pub enum ClientError {
HandshakeFail,
HttpFail,
Other(String),
}
pub fn connect(
args: ClientArgs, conn_args: CommonArgs,
output_sink: impl FnMut(String) + 'static,
) -> Result<(), ClientError> {
let mut buf = [0; 65535];
let mut out = [0; MAX_DATAGRAM_SIZE];
let output_sink =
Rc::new(RefCell::new(output_sink)) as Rc<RefCell<dyn FnMut(_)>>;
// Setup the event loop.
let mut poll = mio::Poll::new().unwrap();
let mut events = mio::Events::with_capacity(1024);
// We'll only connect to the first server provided in URL list.
let connect_url = &args.urls[0];
// Resolve server address.
let peer_addr = if let Some(addr) = &args.connect_to {
addr.parse().expect("--connect-to is expected to be a string containing an IPv4 or IPv6 address with a port. E.g. 192.0.2.0:443")
} else {
*connect_url.socket_addrs(|| None).unwrap().first().unwrap()
};
// Bind to INADDR_ANY or IN6ADDR_ANY depending on the IP family of the
// server address. This is needed on macOS and BSD variants that don't
// support binding to IN6ADDR_ANY for both v4 and v6.
let bind_addr = match peer_addr {
std::net::SocketAddr::V4(_) => format!("0.0.0.0:{}", args.source_port),
std::net::SocketAddr::V6(_) => format!("[::]:{}", args.source_port),
};
// Create the UDP socket backing the QUIC connection, and register it with
// the event loop.
let mut socket =
mio::net::UdpSocket::bind(bind_addr.parse().unwrap()).unwrap();
poll.registry()
.register(&mut socket, mio::Token(0), mio::Interest::READABLE)
.unwrap();
let migrate_socket = if args.perform_migration {
let mut socket =
mio::net::UdpSocket::bind(bind_addr.parse().unwrap()).unwrap();
poll.registry()
.register(&mut socket, mio::Token(1), mio::Interest::READABLE)
.unwrap();
Some(socket)
} else {
None
};
// Create the configuration for the QUIC connection.
let mut config = quiche::Config::new(args.version).unwrap();
if let Some(ref trust_origin_ca_pem) = args.trust_origin_ca_pem {
config
.load_verify_locations_from_file(trust_origin_ca_pem)
.map_err(|e| {
ClientError::Other(format!("error loading origin CA file : {e}"))
})?;
} else {
config.verify_peer(!args.no_verify);
}
config.set_application_protos(&conn_args.alpns).unwrap();
config.set_initial_rtt(conn_args.initial_rtt);
config.set_max_idle_timeout(conn_args.idle_timeout);
config.set_max_recv_udp_payload_size(MAX_DATAGRAM_SIZE);
config.set_max_send_udp_payload_size(MAX_DATAGRAM_SIZE);
config.set_initial_max_data(conn_args.max_data);
config.set_initial_max_stream_data_bidi_local(conn_args.max_stream_data);
config.set_initial_max_stream_data_bidi_remote(conn_args.max_stream_data);
config.set_initial_max_stream_data_uni(conn_args.max_stream_data);
config.set_initial_max_streams_bidi(conn_args.max_streams_bidi);
config.set_initial_max_streams_uni(conn_args.max_streams_uni);
config.set_disable_active_migration(!conn_args.enable_active_migration);
config.set_active_connection_id_limit(conn_args.max_active_cids);
config.set_max_connection_window(conn_args.max_window);
config.set_max_stream_window(conn_args.max_stream_window);
let mut keylog = None;
if let Some(keylog_path) = std::env::var_os("SSLKEYLOGFILE") {
let file = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(keylog_path)
.unwrap();
keylog = Some(file);
config.log_keys();
}
if conn_args.no_grease {
config.grease(false);
}
if conn_args.early_data {
config.enable_early_data();
}
config
.set_cc_algorithm_name(&conn_args.cc_algorithm)
.unwrap();
if conn_args.disable_hystart {
config.enable_hystart(false);
}
if conn_args.dgrams_enabled {
config.enable_dgram(true, 1000, 1000);
}
let mut http_conn: Option<Box<dyn HttpConn>> = None;
let mut app_proto_selected = false;
// Generate a random source connection ID for the connection.
let rng = SystemRandom::new();
let scid = if !cfg!(feature = "fuzzing") {
let mut conn_id = [0; quiche::MAX_CONN_ID_LEN];
rng.fill(&mut conn_id[..]).unwrap();
conn_id.to_vec()
} else {
// When fuzzing use an all zero connection ID.
[0; quiche::MAX_CONN_ID_LEN].to_vec()
};
let scid = quiche::ConnectionId::from_ref(&scid);
let local_addr = socket.local_addr().unwrap();
// Create a QUIC connection and initiate handshake.
let mut conn = quiche::connect(
connect_url.domain(),
&scid,
local_addr,
peer_addr,
&mut config,
)
.unwrap();
if let Some(keylog) = &mut keylog {
if let Ok(keylog) = keylog.try_clone() {
conn.set_keylog(Box::new(keylog));
}
}
// Only bother with qlog if the user specified it.
#[cfg(feature = "qlog")]
{
if let Some(dir) = std::env::var_os("QLOGDIR") {
let id = format!("{scid:?}");
let writer = make_qlog_writer(&dir, "client", &id);
conn.set_qlog(
std::boxed::Box::new(writer),
"quiche-client qlog".to_string(),
format!("{} id={}", "quiche-client qlog", id),
);
}
}
if let Some(session_file) = &args.session_file {
if let Ok(session) = std::fs::read(session_file) {
conn.set_session(&session).ok();
}
}
info!(
"connecting to {:} from {:} with scid {:?}",
peer_addr,
socket.local_addr().unwrap(),
scid,
);
let (write, send_info) = conn.send(&mut out).expect("initial send failed");
while let Err(e) = socket.send_to(&out[..write], send_info.to) {
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!(
"{} -> {}: send() would block",
socket.local_addr().unwrap(),
send_info.to
);
continue;
}
return Err(ClientError::Other(format!("send() failed: {e:?}")));
}
trace!("written {write}");
let app_data_start = std::time::Instant::now();
let mut pkt_count = 0;
let mut scid_sent = false;
let mut new_path_probed = false;
let mut migrated = false;
loop {
if !conn.is_in_early_data() || app_proto_selected {
poll.poll(&mut events, conn.timeout()).unwrap();
}
// If the event loop reported no events, it means that the timeout
// has expired, so handle it without attempting to read packets. We
// will then proceed with the send loop.
if events.is_empty() {
trace!("timed out");
conn.on_timeout();
}
// Read incoming UDP packets from the socket and feed them to quiche,
// until there are no more packets to read.
for event in &events {
let socket = match event.token() {
mio::Token(0) => &socket,
mio::Token(1) => migrate_socket.as_ref().unwrap(),
_ => unreachable!(),
};
let local_addr = socket.local_addr().unwrap();
'read: loop {
let (len, from) = match socket.recv_from(&mut buf) {
Ok(v) => v,
Err(e) => {
// There are no more UDP packets to read on this socket.
// Process subsequent events.
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!("{local_addr}: recv() would block");
break 'read;
}
return Err(ClientError::Other(format!(
"{local_addr}: recv() failed: {e:?}"
)));
},
};
trace!("got {len} bytes from {from} to {local_addr}");
if let Some(target_path) = conn_args.dump_packet_path.as_ref() {
let path = format!("{target_path}/{pkt_count}.pkt");
if let Ok(f) = std::fs::File::create(path) {
let mut f = std::io::BufWriter::new(f);
f.write_all(&buf[..len]).ok();
}
}
pkt_count += 1;
let recv_info = quiche::RecvInfo {
to: local_addr,
from,
};
// Process potentially coalesced packets.
let read = match conn.recv(&mut buf[..len], recv_info) {
Ok(v) => v,
Err(e) => {
error!("{local_addr}: recv failed: {e:?}");
continue 'read;
},
};
trace!("{local_addr}: processed {read} bytes");
}
}
trace!("done reading");
if conn.is_closed() {
info!(
"connection closed, {:?} {:?}",
conn.stats(),
conn.path_stats().collect::<Vec<quiche::PathStats>>()
);
if !conn.is_established() {
error!(
"connection timed out after {:?}",
app_data_start.elapsed(),
);
return Err(ClientError::HandshakeFail);
}
if let Some(session_file) = &args.session_file {
if let Some(session) = conn.session() {
std::fs::write(session_file, session).ok();
}
}
if let Some(h_conn) = http_conn {
if h_conn.report_incomplete(&app_data_start) {
return Err(ClientError::HttpFail);
}
}
break;
}
// Create a new application protocol session once the QUIC connection is
// established.
if (conn.is_established() || conn.is_in_early_data()) &&
(!args.perform_migration || migrated) &&
!app_proto_selected
{
// At this stage the ALPN negotiation succeeded and selected a
// single application protocol name. We'll use this to construct
// the correct type of HttpConn but `application_proto()`
// returns a slice, so we have to convert it to a str in order
// to compare to our lists of protocols. We `unwrap()` because
// we need the value and if something fails at this stage, there
// is not much anyone can do to recover.
let app_proto = conn.application_proto();
if alpns::HTTP_09.contains(&app_proto) {
http_conn = Some(Http09Conn::with_urls(
&args.urls,
args.reqs_cardinal,
Rc::clone(&output_sink),
));
app_proto_selected = true;
} else if alpns::HTTP_3.contains(&app_proto) {
let dgram_sender = if conn_args.dgrams_enabled {
Some(Http3DgramSender::new(
conn_args.dgram_count,
conn_args.dgram_data.clone(),
0,
))
} else {
None
};
http_conn = Some(Http3Conn::with_urls(
&mut conn,
&args.urls,
args.reqs_cardinal,
&args.req_headers,
&args.body,
&args.method,
args.send_priority_update,
conn_args.max_field_section_size,
conn_args.qpack_max_table_capacity,
conn_args.qpack_blocked_streams,
args.dump_json,
dgram_sender,
Rc::clone(&output_sink),
));
app_proto_selected = true;
}
}
// If we have an HTTP connection, first issue the requests then
// process received data.
if let Some(h_conn) = http_conn.as_mut() {
h_conn.send_requests(&mut conn, &args.dump_response_path);
h_conn.handle_responses(&mut conn, &mut buf, &app_data_start);
}
// Handle path events.
while let Some(qe) = conn.path_event_next() {
match qe {
quiche::PathEvent::New(..) => unreachable!(),
quiche::PathEvent::Validated(local_addr, peer_addr) => {
info!("Path ({local_addr}, {peer_addr}) is now validated");
conn.migrate(local_addr, peer_addr).unwrap();
migrated = true;
},
quiche::PathEvent::FailedValidation(local_addr, peer_addr) => {
info!("Path ({local_addr}, {peer_addr}) failed validation");
},
quiche::PathEvent::Closed(local_addr, peer_addr) => {
info!(
"Path ({local_addr}, {peer_addr}) is now closed and unusable"
);
},
quiche::PathEvent::ReusedSourceConnectionId(
cid_seq,
old,
new,
) => {
info!(
"Peer reused cid seq {cid_seq} (initially {old:?}) on {new:?}"
);
},
quiche::PathEvent::PeerMigrated(..) => unreachable!(),
}
}
// See whether source Connection IDs have been retired.
while let Some(retired_scid) = conn.retired_scid_next() {
info!("Retiring source CID {retired_scid:?}");
}
// Provides as many CIDs as possible.
while conn.scids_left() > 0 {
let (scid, reset_token) = generate_cid_and_reset_token(&rng);
if conn.new_scid(&scid, reset_token, false).is_err() {
break;
}
scid_sent = true;
}
if args.perform_migration &&
!new_path_probed &&
scid_sent &&
conn.available_dcids() > 0
{
let additional_local_addr =
migrate_socket.as_ref().unwrap().local_addr().unwrap();
conn.probe_path(additional_local_addr, peer_addr).unwrap();
new_path_probed = true;
}
// Generate outgoing QUIC packets and send them on the UDP socket, until
// quiche reports that there are no more packets to be sent.
let mut sockets = vec![&socket];
if let Some(migrate_socket) = migrate_socket.as_ref() {
sockets.push(migrate_socket);
}
for socket in sockets {
let local_addr = socket.local_addr().unwrap();
for peer_addr in conn.paths_iter(local_addr) {
loop {
let (write, send_info) = match conn.send_on_path(
&mut out,
Some(local_addr),
Some(peer_addr),
) {
Ok(v) => v,
Err(quiche::Error::Done) => {
trace!("{local_addr} -> {peer_addr}: done writing");
break;
},
Err(e) => {
error!(
"{local_addr} -> {peer_addr}: send failed: {e:?}"
);
conn.close(false, 0x1, b"fail").ok();
break;
},
};
if let Err(e) = socket.send_to(&out[..write], send_info.to) {
if e.kind() == std::io::ErrorKind::WouldBlock {
trace!(
"{} -> {}: send() would block",
local_addr,
send_info.to
);
break;
}
return Err(ClientError::Other(format!(
"{} -> {}: send() failed: {:?}",
local_addr, send_info.to, e
)));
}
trace!(
"written {write} bytes from {local_addr} to {}",
send_info.to
);
}
}
}
if conn.is_closed() {
info!(
"connection closed, {:?} {:?}",
conn.stats(),
conn.path_stats().collect::<Vec<quiche::PathStats>>()
);
if !conn.is_established() {
error!(
"connection timed out after {:?}",
app_data_start.elapsed(),
);
return Err(ClientError::HandshakeFail);
}
if let Some(session_file) = &args.session_file {
if let Some(session) = conn.session() {
std::fs::write(session_file, session).ok();
}
}
if let Some(h_conn) = http_conn {
if h_conn.report_incomplete(&app_data_start) {
return Err(ClientError::HttpFail);
}
}
break;
}
}
Ok(())
}
================================================
FILE: apps/src/common.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//! Quiche application utilities.
//!
//! This module provides some utility functions that are common to quiche
//! applications.
use std::io::prelude::*;
use std::collections::HashMap;
#[cfg(feature = "sfv")]
use std::convert::TryFrom;
use std::fmt::Write as _;
use std::rc::Rc;
use std::cell::RefCell;
use std::path;
use ring::rand::SecureRandom;
use quiche::ConnectionId;
use quiche::h3::NameValue;
use quiche::h3::Priority;
pub fn stdout_sink(out: String) {
print!("{out}");
}
const H3_MESSAGE_ERROR: u64 = 0x10E;
/// ALPN helpers.
///
/// This module contains constants and functions for working with ALPN.
pub mod alpns {
pub const HTTP_09: [&[u8]; 2] = [b"hq-interop", b"http/0.9"];
pub const HTTP_3: [&[u8]; 1] = [b"h3"];
}
pub struct PartialRequest {
pub req: Vec<u8>,
}
pub struct PartialResponse {
pub headers: Option<Vec<quiche::h3::Header>>,
pub priority: Option<quiche::h3::Priority>,
pub body: Vec<u8>,
pub written: usize,
}
pub type ClientId = u64;
pub struct Client {
pub conn: quiche::Connection,
pub http_conn: Option<Box<dyn HttpConn>>,
pub client_id: ClientId,
pub app_proto_selected: bool,
pub partial_requests: std::collections::HashMap<u64, PartialRequest>,
pub partial_responses: std::collections::HashMap<u64, PartialResponse>,
pub max_datagram_size: usize,
pub loss_rate: f64,
pub max_send_burst: usize,
}
pub type ClientIdMap = HashMap<ConnectionId<'static>, ClientId>;
pub type ClientMap = HashMap<ClientId, Client>;
/// Makes a buffered writer for a resource with a target URL.
///
/// The file will have the same name as the resource's last path segment value.
/// Multiple requests for the same URL are indicated by the value of `cardinal`,
/// any value "N" greater than 1, will cause ".N" to be appended to the
/// filename.
fn make_resource_writer(
url: &url::Url, target_path: &Option<String>, cardinal: u64,
) -> Option<std::io::BufWriter<std::fs::File>> {
if let Some(tp) = target_path {
let resource =
url.path_segments().map(|c| c.collect::<Vec<_>>()).unwrap();
let mut path = format!("{}/{}", tp, resource.iter().last().unwrap());
if cardinal > 1 {
path = format!("{path}.{cardinal}");
}
match std::fs::File::create(&path) {
Ok(f) => return Some(std::io::BufWriter::new(f)),
Err(e) => panic!(
"Error creating file for {url}, attempted path was {path}: {e}"
),
}
}
None
}
fn autoindex(path: path::PathBuf, index: &str) -> path::PathBuf {
if let Some(path_str) = path.to_str() {
if path_str.ends_with('/') {
let path_str = format!("{path_str}{index}");
return path::PathBuf::from(&path_str);
}
}
path
}
/// Makes a buffered writer for a qlog.
pub fn make_qlog_writer(
dir: &std::ffi::OsStr, role: &str, id: &str,
) -> std::io::BufWriter<std::fs::File> {
let mut path = std::path::PathBuf::from(dir);
let filename = format!("{role}-{id}.sqlog");
path.push(filename);
match std::fs::File::create(&path) {
Ok(f) => std::io::BufWriter::new(f),
Err(e) =>
panic!("Error creating qlog file attempted path was {path:?}: {e}"),
}
}
fn dump_json(reqs: &[Http3Request], output_sink: &mut dyn FnMut(String)) {
let mut out = String::new();
writeln!(out, "{{").unwrap();
writeln!(out, " \"entries\": [").unwrap();
let mut reqs = reqs.iter().peekable();
while let Some(req) = reqs.next() {
writeln!(out, " {{").unwrap();
writeln!(out, " \"request\":{{").unwrap();
writeln!(out, " \"headers\":[").unwrap();
let mut req_hdrs = req.hdrs.iter().peekable();
while let Some(h) = req_hdrs.next() {
writeln!(out, " {{").unwrap();
writeln!(
out,
" \"name\": \"{}\",",
std::str::from_utf8(h.name()).unwrap()
)
.unwrap();
writeln!(
out,
" \"value\": \"{}\"",
std::str::from_utf8(h.value()).unwrap().replace('"', "\\\"")
)
.unwrap();
if req_hdrs.peek().is_some() {
writeln!(out, " }},").unwrap();
} else {
writeln!(out, " }}").unwrap();
}
}
writeln!(out, " ]}},").unwrap();
writeln!(out, " \"response\":{{").unwrap();
writeln!(out, " \"headers\":[").unwrap();
let mut response_hdrs = req.response_hdrs.iter().peekable();
while let Some(h) = response_hdrs.next() {
writeln!(out, " {{").unwrap();
writeln!(
out,
" \"name\": \"{}\",",
std::str::from_utf8(h.name()).unwrap()
)
.unwrap();
writeln!(
out,
" \"value\": \"{}\"",
std::str::from_utf8(h.value()).unwrap().replace('"', "\\\"")
)
.unwrap();
if response_hdrs.peek().is_some() {
writeln!(out, " }},").unwrap();
} else {
writeln!(out, " }}").unwrap();
}
}
writeln!(out, " ],").unwrap();
writeln!(out, " \"body\": {:?}", req.response_body).unwrap();
writeln!(out, " }}").unwrap();
if reqs.peek().is_some() {
writeln!(out, "}},").unwrap();
} else {
writeln!(out, "}}").unwrap();
}
}
writeln!(out, "]").unwrap();
writeln!(out, "}}").unwrap();
output_sink(out);
}
pub fn hdrs_to_strings(hdrs: &[quiche::h3::Header]) -> Vec<(String, String)> {
hdrs.iter()
.map(|h| {
let name = String::from_utf8_lossy(h.name()).to_string();
let value = String::from_utf8_lossy(h.value()).to_string();
(name, value)
})
.collect()
}
/// Generate a new pair of Source Connection ID and reset token.
pub fn generate_cid_and_reset_token<T: SecureRandom>(
rng: &T,
) -> (quiche::ConnectionId<'static>, u128) {
let mut scid = [0; quiche::MAX_CONN_ID_LEN];
rng.fill(&mut scid).unwrap();
let scid = scid.to_vec().into();
let mut reset_token = [0; 16];
rng.fill(&mut reset_token).unwrap();
let reset_token = u128::from_be_bytes(reset_token);
(scid, reset_token)
}
/// Construct a priority field value from quiche apps custom query string.
pub fn priority_field_value_from_query_string(url: &url::Url) -> Option<String> {
let mut priority = "".to_string();
for param in url.query_pairs() {
if param.0 == "u" {
write!(priority, "{}={},", param.0, param.1).ok();
}
if param.0 == "i" && param.1 == "1" {
priority.push_str("i,");
}
}
if !priority.is_empty() {
// remove trailing comma
priority.pop();
Some(priority)
} else {
None
}
}
/// Construct a Priority from quiche apps custom query string.
pub fn priority_from_query_string(url: &url::Url) -> Option<Priority> {
let mut urgency = None;
let mut incremental = None;
for param in url.query_pairs() {
if param.0 == "u" {
urgency = Some(param.1.parse::<u8>().unwrap());
}
if param.0 == "i" && param.1 == "1" {
incremental = Some(true);
}
}
match (urgency, incremental) {
(Some(u), Some(i)) => Some(Priority::new(u, i)),
(Some(u), None) => Some(Priority::new(u, false)),
(None, Some(i)) => Some(Priority::new(3, i)),
(None, None) => None,
}
}
fn send_h3_dgram(
conn: &mut quiche::Connection, flow_id: u64, dgram_content: &[u8],
) -> quiche::Result<()> {
info!(
"sending HTTP/3 DATAGRAM on flow_id={flow_id} with data {dgram_content:?}"
);
let len = octets::varint_len(flow_id) + dgram_content.len();
let mut d = vec![0; len];
let mut b = octets::OctetsMut::with_slice(&mut d);
b.put_varint(flow_id)
.map_err(|_| quiche::Error::BufferTooShort)?;
b.put_bytes(dgram_content)
.map_err(|_| quiche::Error::BufferTooShort)?;
conn.dgram_send(&d)
}
pub trait HttpConn {
fn send_requests(
&mut self, conn: &mut quiche::Connection, target_path: &Option<String>,
);
fn handle_responses(
&mut self, conn: &mut quiche::Connection, buf: &mut [u8],
req_start: &std::time::Instant,
);
fn report_incomplete(&self, start: &std::time::Instant) -> bool;
fn handle_requests(
&mut self, conn: &mut quiche::Connection,
partial_requests: &mut HashMap<u64, PartialRequest>,
partial_responses: &mut HashMap<u64, PartialResponse>, root: &str,
index: &str, buf: &mut [u8],
) -> quiche::h3::Result<()>;
fn handle_writable(
&mut self, conn: &mut quiche::Connection,
partial_responses: &mut HashMap<u64, PartialResponse>, stream_id: u64,
);
}
pub fn writable_response_streams(
conn: &quiche::Connection,
) -> impl Iterator<Item = u64> {
conn.writable().filter(|id| id % 4 == 0)
}
/// Represents an HTTP/0.9 formatted request.
pub struct Http09Request {
url: url::Url,
cardinal: u64,
request_line: String,
stream_id: Option<u64>,
response_writer: Option<std::io::BufWriter<std::fs::File>>,
}
/// Represents an HTTP/3 formatted request.
struct Http3Request {
url: url::Url,
cardinal: u64,
stream_id: Option<u64>,
hdrs: Vec<quiche::h3::Header>,
priority: Option<Priority>,
response_hdrs: Vec<quiche::h3::Header>,
response_body: Vec<u8>,
response_body_max: usize,
response_writer: Option<std::io::BufWriter<std::fs::File>>,
}
type Http3ResponseBuilderResult = std::result::Result<
(Vec<quiche::h3::Header>, Vec<u8>, Vec<u8>),
(u64, String),
>;
pub struct Http09Conn {
stream_id: u64,
reqs_sent: usize,
reqs_complete: usize,
reqs: Vec<Http09Request>,
output_sink: Rc<RefCell<dyn FnMut(String)>>,
}
impl Default for Http09Conn {
fn default() -> Self {
Http09Conn {
stream_id: Default::default(),
reqs_sent: Default::default(),
reqs_complete: Default::default(),
reqs: Default::default(),
output_sink: Rc::new(RefCell::new(stdout_sink)),
}
}
}
impl Http09Conn {
pub fn with_urls(
urls: &[url::Url], reqs_cardinal: u64,
output_sink: Rc<RefCell<dyn FnMut(String)>>,
) -> Box<dyn HttpConn> {
let mut reqs = Vec::new();
for url in urls {
for i in 1..=reqs_cardinal {
let request_line = format!("GET {}\r\n", url.path());
reqs.push(Http09Request {
url: url.clone(),
cardinal: i,
request_line,
stream_id: None,
response_writer: None,
});
}
}
let h_conn = Http09Conn {
stream_id: 0,
reqs_sent: 0,
reqs_complete: 0,
reqs,
output_sink,
};
Box::new(h_conn)
}
}
impl HttpConn for Http09Conn {
fn send_requests(
&mut self, conn: &mut quiche::Connection, target_path: &Option<String>,
) {
let mut reqs_done = 0;
for req in self.reqs.iter_mut().skip(self.reqs_sent) {
match conn.stream_send(
self.stream_id,
req.request_line.as_bytes(),
true,
) {
Ok(v) => v,
Err(quiche::Error::StreamLimit) => {
debug!("not enough stream credits, retry later...");
break;
},
Err(e) => {
error!("failed to send request {e:?}");
break;
},
};
debug!("sending HTTP request {:?}", req.request_line);
req.stream_id = Some(self.stream_id);
req.response_writer =
make_resource_writer(&req.url, target_path, req.cardinal);
self.stream_id += 4;
reqs_done += 1;
}
self.reqs_sent += reqs_done;
}
fn handle_responses(
&mut self, conn: &mut quiche::Connection, buf: &mut [u8],
req_start: &std::time::Instant,
) {
// Process all readable streams.
for s in conn.readable() {
while let Ok((read, fin)) = conn.stream_recv(s, buf) {
trace!("received {read} bytes");
let stream_buf = &buf[..read];
trace!(
"stream {} has {} bytes (fin? {})",
s,
stream_buf.len(),
fin
);
let req = self
.reqs
.iter_mut()
.find(|r| r.stream_id == Some(s))
.unwrap();
match &mut req.response_writer {
Some(rw) => {
rw.write_all(&buf[..read]).ok();
},
None => {
self.output_sink.borrow_mut()(unsafe {
String::from_utf8_unchecked(stream_buf.to_vec())
});
},
}
// The server reported that it has no more data to send on
// a client-initiated
// bidirectional stream, which means
// we got the full response. If all responses are received
// then close the connection.
if &s % 4 == 0 && fin {
self.reqs_complete += 1;
let reqs_count = self.reqs.len();
debug!(
"{}/{} responses received",
self.reqs_complete, reqs_count
);
if self.reqs_complete == reqs_count {
info!(
"{}/{} response(s) received in {:?}, closing...",
self.reqs_complete,
reqs_count,
req_start.elapsed()
);
match conn.close(true, 0x00, b"kthxbye") {
// Already closed.
Ok(_) | Err(quiche::Error::Done) => (),
Err(e) => panic!("error closing conn: {e:?}"),
}
break;
}
}
}
}
}
fn report_incomplete(&self, start: &std::time::Instant) -> bool {
if self.reqs_complete != self.reqs.len() {
error!(
"connection timed out after {:?} and only completed {}/{} requests",
start.elapsed(),
self.reqs_complete,
self.reqs.len()
);
return true;
}
false
}
fn handle_requests(
&mut self, conn: &mut quiche::Connection,
partial_requests: &mut HashMap<u64, PartialRequest>,
partial_responses: &mut HashMap<u64, PartialResponse>, root: &str,
index: &str, buf: &mut [u8],
) -> quiche::h3::Result<()> {
// Process all readable streams.
for s in conn.readable() {
while let Ok((read, fin)) = conn.stream_recv(s, buf) {
trace!("{} received {} bytes", conn.trace_id(), read);
let stream_buf = &buf[..read];
trace!(
"{} stream {} has {} bytes (fin? {})",
conn.trace_id(),
s,
stream_buf.len(),
fin
);
let stream_buf =
if let Some(partial) = partial_requests.get_mut(&s) {
partial.req.extend_from_slice(stream_buf);
if !partial.req.ends_with(b"\r\n") {
return Ok(());
}
&partial.req
} else {
if !stream_buf.ends_with(b"\r\n") {
let request = PartialRequest {
req: stream_buf.to_vec(),
};
partial_requests.insert(s, request);
return Ok(());
}
stream_buf
};
if stream_buf.starts_with(b"GET ") {
let uri = &stream_buf[4..stream_buf.len() - 2];
let uri = String::from_utf8(uri.to_vec()).unwrap();
let uri = String::from(uri.lines().next().unwrap());
let uri = path::Path::new(&uri);
let mut path = path::PathBuf::from(root);
partial_requests.remove(&s);
for c in uri.components() {
if let path::Component::Normal(v) = c {
path.push(v)
}
}
path = autoindex(path, index);
info!(
"{} got GET request for {:?} on stream {}",
conn.trace_id(),
path,
s
);
let body = std::fs::read(path.as_path())
.unwrap_or_else(|_| b"Not Found!\r\n".to_vec());
info!(
"{} sending response of size {} on stream {}",
conn.trace_id(),
body.len(),
s
);
let written = match conn.stream_send(s, &body, true) {
Ok(v) => v,
Err(quiche::Error::Done) => 0,
Err(e) => {
error!(
"{} stream send failed {:?}",
conn.trace_id(),
e
);
return Err(From::from(e));
},
};
if written < body.len() {
let response = PartialResponse {
headers: None,
priority: None,
body,
written,
};
partial_responses.insert(s, response);
}
}
}
}
Ok(())
}
fn handle_writable(
&mut self, conn: &mut quiche::Connection,
partial_responses: &mut HashMap<u64, PartialResponse>, stream_id: u64,
) {
let stream_cap = conn.stream_capacity(stream_id);
debug!(
"{} response stream {} is writable with capacity {:?}",
conn.trace_id(),
stream_id,
stream_cap,
);
if !partial_responses.contains_key(&stream_id) {
return;
}
let resp = partial_responses.get_mut(&stream_id).unwrap();
let body = &resp.body[resp.written..];
let written = match conn.stream_send(stream_id, body, true) {
Ok(v) => v,
Err(quiche::Error::Done) => 0,
Err(e) => {
partial_responses.remove(&stream_id);
error!("{} stream send failed {:?}", conn.trace_id(), e);
return;
},
};
resp.written += written;
if resp.written == resp.body.len() {
partial_responses.remove(&stream_id);
}
}
}
pub struct Http3DgramSender {
dgram_count: u64,
pub dgram_content: String,
pub flow_id: u64,
pub dgrams_sent: u64,
}
impl Http3DgramSender {
pub fn new(dgram_count: u64, dgram_content: String, flow_id: u64) -> Self {
Self {
dgram_count,
dgram_content,
flow_id,
dgrams_sent: 0,
}
}
}
fn make_h3_config(
max_field_section_size: Option<u64>, qpack_max_table_capacity: Option<u64>,
qpack_blocked_streams: Option<u64>,
) -> quiche::h3::Config {
let mut config = quiche::h3::Config::new().unwrap();
if let Some(v) = max_field_section_size {
config.set_max_field_section_size(v);
}
if let Some(v) = qpack_max_table_capacity {
// quiche doesn't support dynamic QPACK, so clamp to 0 for now.
config.set_qpack_max_table_capacity(v.clamp(0, 0));
}
if let Some(v) = qpack_blocked_streams {
// quiche doesn't support dynamic QPACK, so clamp to 0 for now.
config.set_qpack_blocked_streams(v.clamp(0, 0));
}
config
}
pub struct Http3Conn {
h3_conn: quiche::h3::Connection,
reqs_hdrs_sent: usize,
reqs_complete: usize,
largest_processed_request: u64,
reqs: Vec<Http3Request>,
body: Option<Vec<u8>>,
sent_body_bytes: HashMap<u64, usize>,
dump_json: bool,
dgram_sender: Option<Http3DgramSender>,
output_sink: Rc<RefCell<dyn FnMut(String)>>,
}
impl Http3Conn {
#[allow(clippy::too_many_arguments)]
pub fn with_urls(
conn: &mut quiche::Connection, urls: &[url::Url], reqs_cardinal: u64,
req_headers: &[String], body: &Option<Vec<u8>>, method: &str,
send_priority_update: bool, max_field_section_size: Option<u64>,
qpack_max_table_capacity: Option<u64>,
qpack_blocked_streams: Option<u64>, dump_json: Option<usize>,
dgram_sender: Option<Http3DgramSender>,
output_sink: Rc<RefCell<dyn FnMut(String)>>,
) -> Box<dyn HttpConn> {
let mut reqs = Vec::new();
for url in urls {
for i in 1..=reqs_cardinal {
let authority = match url.port() {
Some(port) => format!("{}:{}", url.host_str().unwrap(), port),
None => url.host_str().unwrap().to_string(),
};
let mut hdrs = vec![
quiche::h3::Header::new(b":method", method.as_bytes()),
quiche::h3::Header::new(b":scheme", url.scheme().as_bytes()),
quiche::h3::Header::new(b":authority", authority.as_bytes()),
quiche::h3::Header::new(
b":path",
url[url::Position::BeforePath..].as_bytes(),
),
quiche::h3::Header::new(b"user-agent", b"quiche"),
];
let priority = if send_priority_update {
priority_from_query_string(url)
} else {
None
};
// Add custom headers to the request.
for header in req_headers {
let header_split: Vec<&str> =
header.splitn(2, ": ").collect();
if header_split.len() != 2 {
panic!("malformed header provided - \"{header}\"");
}
hdrs.push(quiche::h3::Header::new(
header_split[0].as_bytes(),
header_split[1].as_bytes(),
));
}
if body.is_some() {
hdrs.push(quiche::h3::Header::new(
b"content-length",
body.as_ref().unwrap().len().to_string().as_bytes(),
));
}
reqs.push(Http3Request {
url: url.clone(),
cardinal: i,
hdrs,
priority,
response_hdrs: Vec::new(),
response_body: Vec::new(),
response_body_max: dump_json.unwrap_or_default(),
stream_id: None,
response_writer: None,
});
}
}
let h_conn = Http3Conn {
h3_conn: quiche::h3::Connection::with_transport(
conn,
&make_h3_config(
max_field_section_size,
qpack_max_table_capacity,
qpack_blocked_streams,
),
).expect("Unable to create HTTP/3 connection, check the server's uni stream limit and window size"),
reqs_hdrs_sent: 0,
reqs_complete: 0,
largest_processed_request: 0,
reqs,
body: body.as_ref().map(|b| b.to_vec()),
sent_body_bytes: HashMap::new(),
dump_json: dump_json.is_some(),
dgram_sender,
output_sink,
};
Box::new(h_conn)
}
pub fn with_conn(
conn: &mut quiche::Connection, max_field_section_size: Option<u64>,
qpack_max_table_capacity: Option<u64>,
qpack_blocked_streams: Option<u64>,
dgram_sender: Option<Http3DgramSender>,
output_sink: Rc<RefCell<dyn FnMut(String)>>,
) -> std::result::Result<Box<dyn HttpConn>, String> {
let h3_conn = quiche::h3::Connection::with_transport(
conn,
&make_h3_config(
max_field_section_size,
qpack_max_table_capacity,
qpack_blocked_streams,
),
).map_err(|_| "Unable to create HTTP/3 connection, check the client's uni stream limit and window size")?;
let h_conn = Http3Conn {
h3_conn,
reqs_hdrs_sent: 0,
reqs_complete: 0,
largest_processed_request: 0,
reqs: Vec::new(),
body: None,
sent_body_bytes: HashMap::new(),
dump_json: false,
dgram_sender,
output_sink,
};
Ok(Box::new(h_conn))
}
/// Builds an HTTP/3 response given a request.
fn build_h3_response(
root: &str, index: &str, request: &[quiche::h3::Header],
) -> Http3ResponseBuilderResult {
let mut file_path = path::PathBuf::from(root);
let mut scheme = None;
let mut authority = None;
let mut host = None;
let mut path = None;
let mut method = None;
let mut priority = vec![];
// Parse some of the request headers.
for hdr in request {
match hdr.name() {
b":scheme" => {
if scheme.is_some() {
return Err((
H3_MESSAGE_ERROR,
":scheme cannot be duplicated".to_string(),
));
}
scheme = Some(std::str::from_utf8(hdr.value()).unwrap());
},
b":authority" => {
if authority.is_some() {
return Err((
H3_MESSAGE_ERROR,
":authority cannot be duplicated".to_string(),
));
}
authority = Some(std::str::from_utf8(hdr.value()).unwrap());
},
b":path" => {
if path.is_some() {
return Err((
H3_MESSAGE_ERROR,
":path cannot be duplicated".to_string(),
));
}
path = Some(std::str::from_utf8(hdr.value()).unwrap())
},
b":method" => {
if method.is_some() {
return Err((
H3_MESSAGE_ERROR,
":method cannot be duplicated".to_string(),
));
}
method = Some(std::str::from_utf8(hdr.value()).unwrap())
},
b":protocol" => {
return Err((
H3_MESSAGE_ERROR,
":protocol not supported".to_string(),
));
},
b"priority" => priority = hdr.value().to_vec(),
b"host" => host = Some(std::str::from_utf8(hdr.value()).unwrap()),
_ => (),
}
}
let decided_method = match method {
Some(method) => {
match method {
"" =>
return Err((
H3_MESSAGE_ERROR,
":method value cannot be empty".to_string(),
)),
"CONNECT" => {
// not allowed
let headers = vec![
quiche::h3::Header::new(
b":status",
"405".to_string().as_bytes(),
),
quiche::h3::Header::new(b"server", b"quiche"),
];
return Ok((headers, b"".to_vec(), Default::default()));
},
_ => method,
}
},
None =>
return Err((
H3_MESSAGE_ERROR,
":method cannot be missing".to_string(),
)),
};
let decided_scheme = match scheme {
Some(scheme) => {
if scheme != "http" && scheme != "https" {
let headers = vec![
quiche::h3::Header::new(
b":status",
"400".to_string().as_bytes(),
),
quiche::h3::Header::new(b"server", b"quiche"),
];
return Ok((
headers,
b"Invalid scheme".to_vec(),
Default::default(),
));
}
scheme
},
None =>
return Err((
H3_MESSAGE_ERROR,
":scheme cannot be missing".to_string(),
)),
};
let decided_host = match (authority, host) {
(None, Some("")) =>
return Err((
H3_MESSAGE_ERROR,
"host value cannot be empty".to_string(),
)),
(Some(""), None) =>
return Err((
H3_MESSAGE_ERROR,
":authority value cannot be empty".to_string(),
)),
(Some(""), Some("")) =>
return Err((
H3_MESSAGE_ERROR,
":authority and host value cannot be empty".to_string(),
)),
(None, None) =>
return Err((
H3_MESSAGE_ERROR,
":authority and host missing".to_string(),
)),
// Any other combo, prefer :authority
(..) => authority.unwrap(),
};
let decided_path = match path {
Some("") =>
return Err((
H3_MESSAGE_ERROR,
":path value cannot be empty".to_string(),
)),
None =>
return Err((
H3_MESSAGE_ERROR,
":path cannot be missing".to_string(),
)),
Some(path) => path,
};
let url = format!("{decided_scheme}://{decided_host}{decided_path}");
let url = url::Url::parse(&url).unwrap();
let pathbuf = path::PathBuf::from(url.path());
let pathbuf = autoindex(pathbuf, index);
// Priority query string takes precedence over the header.
// So replace the header with one built here.
let query_priority = priority_field_value_from_query_string(&url);
if let Some(p) = query_priority {
priority = p.as_bytes().to_vec();
}
let (status, body) = match decided_method {
"GET" => {
const STREAM_BYTES_PREFIX: &str = "/stream-bytes/";
const STREAM_BYTES_FILL: u8 = 0x57;
if let Some(suffix) = url.path().strip_prefix(STREAM_BYTES_PREFIX)
{
let n = suffix.parse::<usize>().unwrap_or(0);
(200, vec![STREAM_BYTES_FILL; n])
} else {
for c in pathbuf.components() {
if let path::Component::Normal(v) = c {
file_path.push(v)
}
}
match std::fs::read(file_path.as_path()) {
Ok(data) => (200, data),
Err(_) => (404, b"Not Found!".to_vec()),
}
}
},
_ => (405, Vec::new()),
};
let headers = vec![
quiche::h3::Header::new(b":status", status.to_string().as_bytes()),
quiche::h3::Header::new(b"server", b"quiche"),
quiche::h3::Header::new(
b"content-length",
body.len().to_string().as_bytes(),
),
];
Ok((headers, body, priority))
}
}
impl HttpConn for Http3Conn {
fn send_requests(
&mut self, conn: &mut quiche::Connection, target_path: &Option<String>,
) {
let mut reqs_done = 0;
// First send headers.
for req in self.reqs.iter_mut().skip(self.reqs_hdrs_sent) {
let s = match self.h3_conn.send_request(
conn,
&req.hdrs,
self.body.is_none(),
) {
Ok(v) => v,
Err(quiche::h3::Error::TransportError(
quiche::Error::StreamLimit,
)) => {
debug!("not enough stream credits, retry later...");
break;
},
Err(quiche::h3::Error::StreamBlocked) => {
debug!("stream is blocked, retry later...");
break;
},
Err(e) => {
error!("failed to send request {e:?}");
break;
},
};
debug!("Sent HTTP request {:?}", &req.hdrs);
if let Some(priority) = &req.priority {
// If sending the priority fails, don't try again.
self.h3_conn
.send_priority_update_for_request(conn, s, priority)
.ok();
}
req.stream_id = Some(s);
req.response_writer =
make_resource_writer(&req.url, target_path, req.cardinal);
self.sent_body_bytes.insert(s, 0);
reqs_done += 1;
}
self.reqs_hdrs_sent += reqs_done;
// Then send any remaining body.
if let Some(body) = &self.body {
for (stream_id, sent_bytes) in self.sent_body_bytes.iter_mut() {
if *sent_bytes == body.len() {
continue;
}
// Always try to send all remaining bytes, so always set fin to
// true.
let sent = match self.h3_conn.send_body(
conn,
*stream_id,
&body[*sent_bytes..],
true,
) {
Ok(v) => v,
Err(quiche::h3::Error::Done) => 0,
Err(e) => {
error!("failed to send request body {e:?}");
continue;
},
};
*sent_bytes += sent;
}
}
// And finally any DATAGRAMS.
if let Some(ds) = self.dgram_sender.as_mut() {
let mut dgrams_done = 0;
for _ in ds.dgrams_sent..ds.dgram_count {
match send_h3_dgram(conn, ds.flow_id, ds.dgram_content.as_bytes())
{
Ok(v) => v,
Err(e) => {
error!("failed to send dgram {e:?}");
break;
},
}
dgrams_done += 1;
}
ds.dgrams_sent += dgrams_done;
}
}
fn handle_responses(
&mut self, conn: &mut quiche::Connection, buf: &mut [u8],
req_start: &std::time::Instant,
) {
loop {
match self.h3_conn.poll(conn) {
Ok((stream_id, quiche::h3::Event::Headers { list, .. })) => {
debug!(
"got response headers {:?} on stream id {}",
hdrs_to_strings(&list),
stream_id
);
let req = self
.reqs
.iter_mut()
.find(|r| r.stream_id == Some(stream_id))
.unwrap();
req.response_hdrs = list;
},
Ok((stream_id, quiche::h3::Event::Data)) => {
while let Ok(read) =
self.h3_conn.recv_body(conn, stream_id, buf)
{
debug!(
"got {read} bytes of response data on stream {stream_id}"
);
let req = self
.reqs
.iter_mut()
.find(|r| r.stream_id == Some(stream_id))
.unwrap();
let len = std::cmp::min(
read,
req.response_body_max - req.response_body.len(),
);
req.response_body.extend_from_slice(&buf[..len]);
match &mut req.response_writer {
Some(rw) => {
rw.write_all(&buf[..read]).ok();
},
None =>
if !self.dump_json {
self.output_sink.borrow_mut()(unsafe {
String::from_utf8_unchecked(
buf[..read].to_vec(),
)
});
},
}
}
},
Ok((_stream_id, quiche::h3::Event::Finished)) => {
self.reqs_complete += 1;
let reqs_count = self.reqs.len();
debug!(
"{}/{} responses received",
self.reqs_complete, reqs_count
);
if self.reqs_complete == reqs_count {
info!(
"{}/{} response(s) received in {:?}, closing...",
self.reqs_complete,
reqs_count,
req_start.elapsed()
);
if self.dump_json {
dump_json(
&self.reqs,
&mut *self.output_sink.borrow_mut(),
);
}
match conn.close(true, 0x100, b"kthxbye") {
// Already closed.
Ok(_) | Err(quiche::Error::Done) => (),
Err(e) => panic!("error closing conn: {e:?}"),
}
break;
}
},
Ok((_stream_id, quiche::h3::Event::Reset(e))) => {
error!("request was reset by peer with {e}, closing...");
match conn.close(true, 0x100, b"kthxbye") {
// Already closed.
Ok(_) | Err(quiche::Error::Done) => (),
Err(e) => panic!("error closing conn: {e:?}"),
}
break;
},
Ok((
prioritized_element_id,
quiche::h3::Event::PriorityUpdate,
)) => {
info!(
"{} PRIORITY_UPDATE triggered for element ID={}",
conn.trace_id(),
prioritized_element_id
);
},
Ok((goaway_id, quiche::h3::Event::GoAway)) => {
info!(
"{} got GOAWAY with ID {} ",
conn.trace_id(),
goaway_id
);
},
Err(quiche::h3::Error::Done) => {
break;
},
Err(e) => {
error!("HTTP/3 processing failed: {e:?}");
break;
},
}
}
// Process datagram-related events.
while let Ok(len) = conn.dgram_recv(buf) {
let mut b = octets::Octets::with_slice(buf);
if let Ok(flow_id) = b.get_varint() {
info!(
"Received DATAGRAM flow_id={} len={} data={:?}",
flow_id,
len,
buf[b.off()..len].to_vec()
);
}
}
}
fn report_incomplete(&self, start: &std::time::Instant) -> bool {
if self.reqs_complete != self.reqs.len() {
error!(
"connection timed out after {:?} and only completed {}/{} requests",
start.elapsed(),
self.reqs_complete,
self.reqs.len()
);
if self.dump_json {
dump_json(&self.reqs, &mut *self.output_sink.borrow_mut());
}
return true;
}
false
}
fn handle_requests(
&mut self, conn: &mut quiche::Connection,
_partial_requests: &mut HashMap<u64, PartialRequest>,
partial_responses: &mut HashMap<u64, PartialResponse>, root: &str,
index: &str, buf: &mut [u8],
) -> quiche::h3::Result<()> {
// Process HTTP stream-related events.
//
// This loops over any and all received HTTP requests and sends just the
// HTTP response headers.
loop {
match self.h3_conn.poll(conn) {
Ok((stream_id, quiche::h3::Event::Headers { list, .. })) => {
info!(
"{} got request {:?} on stream id {}",
conn.trace_id(),
hdrs_to_strings(&list),
stream_id
);
self.largest_processed_request =
std::cmp::max(self.largest_processed_request, stream_id);
// We decide the response based on headers alone, so
// stop reading the request stream so that any body
// is ignored and pointless Data events are not
// generated.
conn.stream_shutdown(stream_id, quiche::Shutdown::Read, 0)
.unwrap();
let (mut headers, body, mut priority) =
match Http3Conn::build_h3_response(root, index, &list) {
Ok(v) => v,
Err((error_code, _)) => {
conn.stream_shutdown(
stream_id,
quiche::Shutdown::Write,
error_code,
)
.unwrap();
continue;
},
};
match self.h3_conn.take_last_priority_update(stream_id) {
Ok(v) => {
priority = v;
},
Err(quiche::h3::Error::Done) => (),
Err(e) => error!(
"{} error taking PRIORITY_UPDATE {}",
conn.trace_id(),
e
),
}
if !priority.is_empty() {
headers.push(quiche::h3::Header::new(
b"priority",
priority.as_slice(),
));
}
#[cfg(feature = "sfv")]
let priority =
quiche::h3::Priority::try_from(priority.as_slice())
.unwrap_or_default();
#[cfg(not(feature = "sfv"))]
let priority = quiche::h3::Priority::default();
info!(
"{} prioritizing response on stream {} as {:?}",
conn.trace_id(),
stream_id,
priority
);
match self.h3_conn.send_response_with_priority(
conn, stream_id, &headers, &priority, false,
) {
Ok(v) => v,
Err(quiche::h3::Error::StreamBlocked) => {
let response = PartialResponse {
headers: Some(headers),
priority: Some(priority),
body,
written: 0,
};
partial_responses.insert(stream_id, response);
continue;
},
Err(e) => {
error!(
"{} stream send failed {:?}",
conn.trace_id(),
e
);
break;
},
}
let response = PartialResponse {
headers: None,
priority: None,
body,
written: 0,
};
partial_responses.insert(stream_id, response);
},
Ok((stream_id, quiche::h3::Event::Data)) => {
info!(
"{} got data on stream id {}",
conn.trace_id(),
stream_id
);
},
Ok((_stream_id, quiche::h3::Event::Finished)) => (),
Ok((_stream_id, quiche::h3::Event::Reset { .. })) => (),
Ok((
prioritized_element_id,
quiche::h3::Event::PriorityUpdate,
)) => {
info!(
"{} PRIORITY_UPDATE triggered for element ID={}",
conn.trace_id(),
prioritized_element_id
);
},
Ok((goaway_id, quiche::h3::Event::GoAway)) => {
trace!(
"{} got GOAWAY with ID {} ",
conn.trace_id(),
goaway_id
);
self.h3_conn
.send_goaway(conn, self.largest_processed_request)?;
},
Err(quiche::h3::Error::Done) => {
break;
},
Err(e) => {
error!("{} HTTP/3 error {:?}", conn.trace_id(), e);
return Err(e);
},
}
}
// Visit all writable response streams to send HTTP content.
for stream_id in writable_response_streams(conn) {
self.handle_writable(conn, partial_responses, stream_id);
}
// Process datagram-related events.
while let Ok(len) = conn.dgram_recv(buf) {
let mut b = octets::Octets::with_slice(buf);
if let Ok(flow_id) = b.get_varint() {
info!(
"Received DATAGRAM flow_id={} len={} data={:?}",
flow_id,
len,
buf[b.off()..len].to_vec()
);
}
}
if let Some(ds) = self.dgram_sender.as_mut() {
let mut dgrams_done = 0;
for _ in ds.dgrams_sent..ds.dgram_count {
match send_h3_dgram(conn, ds.flow_id, ds.dgram_content.as_bytes())
{
Ok(v) => v,
Err(e) => {
error!("failed to send dgram {e:?}");
break;
},
}
dgrams_done += 1;
}
ds.dgrams_sent += dgrams_done;
}
Ok(())
}
fn handle_writable(
&mut self, conn: &mut quiche::Connection,
partial_responses: &mut HashMap<u64, PartialResponse>, stream_id: u64,
) {
let stream_cap = conn.stream_capacity(stream_id);
debug!(
"{} response stream {} is writable with capacity {:?}",
conn.trace_id(),
stream_id,
stream_cap,
);
if !partial_responses.contains_key(&stream_id) {
return;
}
let resp = partial_responses.get_mut(&stream_id).unwrap();
if let (Some(headers), Some(priority)) = (&resp.headers, &resp.priority) {
match self.h3_conn.send_response_with_priority(
conn, stream_id, headers, priority, false,
) {
Ok(_) => (),
Err(quiche::h3::Error::StreamBlocked) => {
return;
},
Err(e) => {
error!("{} stream send failed {:?}", conn.trace_id(), e);
return;
},
}
}
resp.headers = None;
resp.priority = None;
let body = &resp.body[resp.written..];
let written = match self.h3_conn.send_body(conn, stream_id, body, true) {
Ok(v) => v,
Err(quiche::h3::Error::Done) => 0,
Err(e) => {
partial_responses.remove(&stream_id);
error!("{} stream send failed {:?}", conn.trace_id(), e);
return;
},
};
resp.written += written;
if resp.written == resp.body.len() {
partial_responses.remove(&stream_id);
}
}
}
================================================
FILE: apps/src/lib.rs
================================================
// Copyright (C) 2020, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#[macro_use]
extern crate log;
pub mod args;
pub mod client;
pub mod common;
pub mod sendto;
================================================
FILE: apps/src/sendto.rs
================================================
// Copyright (C) 2021, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use std::cmp;
use std::io;
/// For Linux, try to detect GSO is available.
#[cfg(target_os = "linux")]
pub fn detect_gso(socket: &mio::net::UdpSocket, segment_size: usize) -> bool {
use nix::sys::socket::setsockopt;
use nix::sys::socket::sockopt::UdpGsoSegment;
use std::os::unix::io::AsFd;
setsockopt(&socket.as_fd(), UdpGsoSegment, &(segment_size as i32)).is_ok()
}
/// For non-Linux, there is no GSO support.
#[cfg(not(target_os = "linux"))]
pub fn detect_gso(_socket: &mio::net::UdpSocket, _segment_size: usize) -> bool {
false
}
/// Send packets using sendmsg() with GSO.
#[cfg(target_os = "linux")]
fn send_to_gso_pacing(
socket: &mio::net::UdpSocket, buf: &[u8], send_info: &quiche::SendInfo,
segment_size: usize,
) -> io::Result<usize> {
use nix::sys::socket::sendmsg;
use nix::sys::socket::ControlMessage;
use nix::sys::socket::MsgFlags;
use nix::sys::socket::SockaddrStorage;
use std::io::IoSlice;
use std::os::unix::io::AsRawFd;
let iov = [IoSlice::new(buf)];
let segment_size = segment_size as u16;
let dst = SockaddrStorage::from(send_info.to);
let sockfd = socket.as_raw_fd();
// GSO option.
let cmsg_gso = ControlMessage::UdpGsoSegments(&segment_size);
// Pacing option.
let send_time = std_time_to_u64(&send_info.at);
let cmsg_txtime = ControlMessage::TxTime(&send_time);
match sendmsg(
sockfd,
&iov,
&[cmsg_gso, cmsg_txtime],
MsgFlags::empty(),
Some(&dst),
) {
Ok(v) => Ok(v),
Err(e) => Err(e.into()),
}
}
/// For non-Linux platforms.
#[cfg(not(target_os = "linux"))]
fn send_to_gso_pacing(
_socket: &mio::net::UdpSocket, _buf: &[u8], _send_info: &quiche::SendInfo,
_segment_size: usize,
) -> io::Result<usize> {
panic!("send_to_gso() should not be called on non-linux platforms");
}
/// A wrapper function of send_to().
///
/// When GSO and SO_TXTIME are enabled, send packets using send_to_gso().
/// Otherwise, send packets using socket.send_to().
pub fn send_to(
socket: &mio::net::UdpSocket, buf: &[u8], send_info: &quiche::SendInfo,
segment_size: usize, pacing: bool, enable_gso: bool,
) -> io::Result<usize> {
if pacing && enable_gso {
match send_to_gso_pacing(socket, buf, send_info, segment_size) {
Ok(v) => {
return Ok(v);
},
Err(e) => {
return Err(e);
},
}
}
let mut off = 0;
let mut left = buf.len();
let mut written = 0;
while left > 0 {
let pkt_len = cmp::min(left, segment_size);
match socket.send_to(&buf[off..off + pkt_len], send_info.to) {
Ok(v) => {
written += v;
},
Err(e) => return Err(e),
}
off += pkt_len;
left -= pkt_len;
}
Ok(written)
}
#[cfg(target_os = "linux")]
fn std_time_to_u64(time: &std::time::Instant) -> u64 {
const NANOS_PER_SEC: u64 = 1_000_000_000;
const INSTANT_ZERO: std::time::Instant =
unsafe { std::mem::transmute(std::time::UNIX_EPOCH) };
let raw_time = time.duration_since(INSTANT_ZERO);
let sec = raw_time.as_secs();
let nsec = raw_time.subsec_nanos();
sec * NANOS_PER_SEC + nsec as u64
}
================================================
FILE: buffer-pool/Cargo.toml
================================================
[package]
name = "buffer-pool"
version = "0.2.1"
repository = { workspace = true }
edition = { workspace = true }
license = { workspace = true }
keywords = { workspace = true }
categories = { workspace = true }
description = "Pooled in-memory buffers"
[dependencies]
crossbeam = { workspace = true, features = ["alloc"] }
foundations = { workspace = true, default-features = false, features = [
"metrics",
] }
================================================
FILE: buffer-pool/src/buffer.rs
================================================
// Copyright (C) 2025, Cloudflare, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use std::ops::Deref;
use std::ops::DerefMut;
use crate::buffer_pool::consume_buffer_total_bytes;
use crate::Reuse;
/// A convinience wrapper around Vec that allows to "consume" data from the
/// front *without* shifting.
///
/// This is not unlike `VecDeque` but more ergonomic
/// for the operations we require. Conceptually `VecDeque` is two slices, and
/// this is one slice. Also there is no `set_len` for `VecDeque`, so it has to
/// be converted to `Vec` and then back again.
#[derive(Default, Debug)]
pub struct ConsumeBuffer {
inner: Vec<u8>,
head: usize,
}
impl Deref for ConsumeBuffer {
type Target = [u8];
fn deref(&self) -> &Self::Target {
&self.inner[self.head..]
}
}
impl DerefMut for ConsumeBuffer {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner[self.head..]
}
}
impl Reuse for ConsumeBuffer {
fn reuse(&mut self, val: usize) -> bool {
let old_capacity = self.inner.capacity();
self.inner.clear();
self.inner.shrink_to(val);
self.update_metrics_after_resize(old_capacity);
self.head = 0;
self.inner.capacity() > 0
}
fn capacity(&self) -> usize {
self.inner.capacity()
}
}
impl Drop for ConsumeBuffer {
fn drop(&mut self) {
consume_buffer_total_bytes().dec_by(self.inner.capacity() as u64);
}
}
impl ConsumeBuffer {
pub fn from_vec(inner: Vec<u8>) -> Self {
consume_buffer_total_bytes().inc_by(inner.capacity() as u64);
ConsumeBuffer { inner, head: 0 }
}
pub fn into_vec(mut self) -> Vec<u8> {
// As ConsumeBuffer has a Drop impl we have use `take` to get at the inner
// vec out instead of being able to move it out directly. This also means
// we need to update the metrics by hand as the buffer is no longer owned
// by us.
let mut inner = std::mem::take(&mut self.inner);
consume_buffer_total_bytes().dec_by(inner.capacity() as u64);
inner.drain(0..self.head);
inner
}
pub fn pop_front(&mut self, count: usize) {
assert!(self.head + count <= self.inner.len());
self.head += count;
}
pub fn expand(&mut self, count: usize) {
let old_capacity = self.inner.capacity();
self.inner.reserve_exact(count);
self.update_metrics_after_resize(old_capacity);
// SAFETY: u8 is always initialized and we reserved the capacity.
unsafe { self.inner.set_len(count) };
}
pub fn truncate(&mut self, count: usize) {
self.inner.truncate(self.head + count);
}
pub fn add_prefix(&mut self, prefix: &[u8]) -> bool {
if self.head < prefix.len() {
return false;
}
self.head -= prefix.len();
self.inner[self.head..self.head + prefix.len()].copy_from_slice(prefix);
true
}
fn update_metrics_after_resize(&mut self, old_capacity: usize) {
let new_capacity = self.inner.capacity();
if new_capacity < old_capacity {
consume_buffer_total_bytes()
.dec_by((old_capacity - new_capacity) as u64);
} else if new_capacity > old_capacity {
consume_buffer_total_bytes()
.inc_by((new_capacity - old_capacity) as u64);
}
}
}
impl<'a> Extend<&'a u8> for ConsumeBuffer {
fn extend<T: IntoIterator<Item = &'a u8>>(&mut self, iter: T) {
let old_capacity = self.inner.capacity();
self.inner.extend(iter);
self.update_metrics_after_resize(old_capacity);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metrics() {
{
let mut buf = ConsumeBuffer::default();
assert_eq!(buf.inner.capacity(), 0);
assert_eq!(consume_buffer_total_bytes().get(), 0);
buf.extend(&[0, 1, 2, 3, 4]);
assert_eq!(
consume_buffer_total_bytes().get(),
buf.inner.capacity() as u64
);
}
// drop buf
assert_eq!(consume_buffer_total_bytes().get(), 0);
let mut buf_a = ConsumeBuffer::from_vec(vec![0, 1, 2, 3, 4]);
let buf_b = ConsumeBuffer::from_vec(vec![5, 6, 7]);
assert_eq!(
consume_buffer_total_bytes().get(),
(buf_a.inner.capacity() + buf_b.inner.capacity()) as u64
);
buf_a.expand(100000);
assert_eq!(
gitextract_lidjoc0r/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── deploy.yml
│ ├── nightly.yml
│ ├── semgrep.yml
│ └── stable.yml
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .semgrepignore
├── AGENTS.md
├── CODEOWNERS
├── COPYING
├── Cargo.toml
├── Dockerfile
├── Makefile
├── README.md
├── RELEASING.md
├── apps/
│ ├── Cargo.toml
│ ├── run_endpoint.sh
│ └── src/
│ ├── args.rs
│ ├── bin/
│ │ ├── cert.crt
│ │ ├── cert.key
│ │ ├── quiche-client.rs
│ │ └── quiche-server.rs
│ ├── client.rs
│ ├── common.rs
│ ├── lib.rs
│ └── sendto.rs
├── buffer-pool/
│ ├── Cargo.toml
│ └── src/
│ ├── buffer.rs
│ ├── lib.rs
│ └── raw_pool_buf_io.rs
├── catalog-info.yaml
├── clippy.toml
├── datagram-socket/
│ ├── Cargo.toml
│ └── src/
│ ├── datagram.rs
│ ├── lib.rs
│ ├── mmsg.rs
│ ├── shutdown.rs
│ └── socket_stats.rs
├── fuzz/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── Dockerfile
│ ├── README.md
│ ├── cert.crt
│ ├── cert.key
│ ├── corpus/
│ │ ├── packet_recv_client/
│ │ │ ├── 01905a0a6abda022ef390f8272d392487baf3b8a
│ │ │ ├── 0199b9983333b7bb304e3aa5de55152bc707de8e
│ │ │ ├── 021d1c03dbdf16b2967f2eb3f8fcc408d366d0c6
│ │ │ ├── 022373e9bc6cce473753b1583bc81d54de7d0a31
│ │ │ ├── 0239eed33e629a913e37eefd47fedc7e4cfea03d
│ │ │ ├── 038c48a44cb860a364ae218089c9f73d5cdac1a8
│ │ │ ├── 04892897c4d1136fd879c20e6c8d6a11cb82ce74
│ │ │ ├── 04b243ba99315207f644399b5219d497cb802753
│ │ │ ├── 051700e8299de9fd5e57d468f1adea2cf7a31bf7
│ │ │ ├── 064c3f19f8e0086987df24669849efd08a44c974
│ │ │ ├── 06d83d54a14ba6082115fbadd42da3380ffdcb48
│ │ │ ├── 0713395f10bbf2f0fb64c09fc52e385098fe93c5
│ │ │ ├── 0714251b1d9a0298fe55e30d7ac9478134c8f861
│ │ │ ├── 072dc03c6ed95b340b3c43bf3c8ef8fce3cfa9b0
│ │ │ ├── 074a556fe49e356f482237e7dada61ca88205d09
│ │ │ ├── 07d07581ce26c5ba9bdb1f4e6fa2ec9a83348e91
│ │ │ ├── 082cc66c7c6294af31752651a7f87e392c4a9fab
│ │ │ ├── 086c3c532cc57b40080ed3e8242ce25811fb8011
│ │ │ ├── 09912a472b3e6d0a90d3474feb4895585136c155
│ │ │ ├── 0ac93b43855c4e23ee69b64c563cb0608cda5b93
│ │ │ ├── 0b5c7c1f931b293a057e868003ce986a610f6245
│ │ │ ├── 0b76e6095d96ec5425d66f54aaee6ca3edb3106c
│ │ │ ├── 0bffa229b2cc0523d238129861f7f66440d3fcc4
│ │ │ ├── 0c16c1610609bcdce4483dd8bcd680c38102a2fa
│ │ │ ├── 0c3255d7ab80285a1bb3ddc7ab5dea1e0ab5243b
│ │ │ ├── 0e0c7b4d381390222f3318dbd63ed8cbec6bee38
│ │ │ ├── 0e53cbde5ee4dc62989675064051b78cd6af467c
│ │ │ ├── 0ea129c0a57004b9d7d70da907deb8e617ef60ad
│ │ │ ├── 0eb1d5e92532571b320de3e5675a3a6b97e8e482
│ │ │ ├── 0f4d4798761e3b22377802a4f65d671cc599f5bc
│ │ │ ├── 0faabedb63ad1c46c28c601a8dcf27d215e14e33
│ │ │ ├── 10948b00564e725e4834e3f2f766e4239b3be22b
│ │ │ ├── 10ea24e6f89005686215d32a39648de5a46699f1
│ │ │ ├── 112d9f04dd66d4674d626083936b434527bfa2e7
│ │ │ ├── 1164a88112b00734b19a72bb8721e12ed6c0904f
│ │ │ ├── 1178baac08fea335fbdccd078f5c0eb0cbfa7759
│ │ │ ├── 11eb5505d2a37ece4723d20b5f49e69ad5be7b5d
│ │ │ ├── 12c2883b5e426354896a53bcccad112e1c8e27d4
│ │ │ ├── 12e811a8c93ad16c33f43c75f9eff30e6f532f01
│ │ │ ├── 12ed9cdb706f1fc8023f150deb76edeaace07746
│ │ │ ├── 130771c55c2aa6e165256d05eecda8529a50c791
│ │ │ ├── 132938b659127774a49c7abfd74bd6ce22dae077
│ │ │ ├── 139d4ceb7b62d5a17a253c4f11c00e4379e826f0
│ │ │ ├── 13ffb76b6f8577ccda520595069ee1bcd83f4bb7
│ │ │ ├── 1448bf60cac50f08b4bb7c00c9cff75d2796da32
│ │ │ ├── 14edd00e8e5a413197d0dc94c5bfc87ed3a6a920
│ │ │ ├── 151016d482429d95e6c18bbf930bf9b066e9a745
│ │ │ ├── 1565b7e316fb01fc43409ab9a59d76749d9bb1d4
│ │ │ ├── 16f6e95298275a1ffdda61eef1d209cd49cb5561
│ │ │ ├── 1701716ae4ecbec023075a3ce4e315840a1e3ffd
│ │ │ ├── 1791da841f87975e5d09003e64cab6e1813d1b62
│ │ │ ├── 179888084a9ac4e5eefbabd250c42da7803d1978
│ │ │ ├── 18614824e237b5dcd28f1694109317b4e1dac385
│ │ │ ├── 18b5e108bd969838e021be86d9d6832ff9fa376c
│ │ │ ├── 1923d19a2d82a1902ae4235c69008c922554e6e8
│ │ │ ├── 19f977dde4dffd98e5490a8f19833d45a11a08f7
│ │ │ ├── 1a3dcced59b1502743b77dac4379139cb61ad207
│ │ │ ├── 1adb97b3e6f8c539fb1ca0a32f29ba086db47f3f
│ │ │ ├── 1c5f5c2de9af5c185c1b0d8afa8b9a4081da78bc
│ │ │ ├── 1c8dab6f780c42d70b646aceb6f4d1931fd95137
│ │ │ ├── 1c99623bd07f6af5960f6ccc11856497a09e0adb
│ │ │ ├── 1cb68fcdd34eb571a25aed75637b349695dc1a98
│ │ │ ├── 1d267f440f0ce42fa36b07ee03cc0aa990e5cb89
│ │ │ ├── 1d6a6ae3a2d5ede8b12074bf99cf443a37d2c970
│ │ │ ├── 1ea124da6e03992edc07a95750c89457d7c75beb
│ │ │ ├── 1f744aeed2ad33624f6a45f23a60e978699deac9
│ │ │ ├── 1f7d69b3ad95bb33ba2fd2f975edf9ff18fa9d29
│ │ │ ├── 1f92dbe72e316e940c32c1b860a755a92ffb8416
│ │ │ ├── 2161350c4760b5092725fad56c0b41ef704331ec
│ │ │ ├── 22fcba4c5a1f5cf61689dadf16c1f1e3c0c9d601
│ │ │ ├── 2319a9ff07efe83cbeff248ca20907bb845e1014
│ │ │ ├── 233b34589ef66395f61cab91278d605a96f88d07
│ │ │ ├── 2352b8c2d034df07e7e0b00f65cde71f6e91c503
│ │ │ ├── 237f322514ae68f84ee6630d308d986bf7d60ee0
│ │ │ ├── 23bb4316db8964e7330ab4fd82deafd4e6a48669
│ │ │ ├── 23bd31350b722e8a496d25401ac1d3f43c5c821a
│ │ │ ├── 243a32957cb00e6025012d3d3d4b5793348c0d7d
│ │ │ ├── 2491e2b14e5ecd106f14fef592e6ad320f6b969a
│ │ │ ├── 24bf12093aa42cd1cba5d426941a67f248daa5fe
│ │ │ ├── 250ec08178a581f81ba789ebbc88d5d8c6a6de1a
│ │ │ ├── 2510c8e07515a45b1f2e106012dd970a881606ff
│ │ │ ├── 257fb59968a453f6e6f507c20db0f246efdf11cc
│ │ │ ├── 25a594d8542489fb585db9c8003ab24ccd9094c9
│ │ │ ├── 26323e2f6572b8e8efaf6ff543799b8ce9234315
│ │ │ ├── 2632b586f6d6cafa2dd4f38f1071ad3b715e7bf0
│ │ │ ├── 26fba27f3bb2700f788898d6c33049f9fb6cd0d4
│ │ │ ├── 27967eeb349d7e414d39001f330fe7dcaf72b3b2
│ │ │ ├── 27f09f9305ac616d9ffc079ce92e2512c60ef4f9
│ │ │ ├── 2862788427f3f42456418e14e08f4db4bedd3af4
│ │ │ ├── 289aaa84f6e7bafc599465324c4431ea434f86c5
│ │ │ ├── 28a85fe6c681c6b70735c97546650dc51641a9a0
│ │ │ ├── 2932ceaf0508cce2952e029edc43c9107efe5719
│ │ │ ├── 29f236b8fc4be8efe1e435c36740fbcd6d9c068a
│ │ │ ├── 2aaba01dc73b66f39cbeb2fcc7c9d1fe48dc880d
│ │ │ ├── 2acfe911125dff3d198df20c1c8a655842ff1106
│ │ │ ├── 2b9fb59cf47913750f49968c5a7ab52594cc4a3f
│ │ │ ├── 2ba1d03de721c8d3392685cd7ced17902ef7d78f
│ │ │ ├── 2bd7e9587a651e9a12208da3780226d538e7f1f4
│ │ │ ├── 2bdc57181f24a8cb2a10bebc7de700c89ab4193f
│ │ │ ├── 2bf809711fe7ff3b06d578a99c2be1291d515dbc
│ │ │ ├── 2c756c7cc212ae40d27b3b7b536511b75e0e7c07
│ │ │ ├── 2ccb3583d8eb8a4ce31264ffff286f62a54363c9
│ │ │ ├── 2d97dc2b08dafff069139e3075effe7e65ac15ba
│ │ │ ├── 2daae60ef0ae84be5243a479bea196cd27a2c14a
│ │ │ ├── 2df92de4ab59e42d78fafd10f5fea1b8ccae4e2c
│ │ │ ├── 3019320fccdb549a075f885ab2e9b011c9d13759
│ │ │ ├── 3070697a94c90c09fb2a4892e3aeefcc81ca1374
│ │ │ ├── 31272322a2a4eeaf0c438241fe7c902062f13729
│ │ │ ├── 313f1a69c85079c85ab4c9fe98323769ccdab83b
│ │ │ ├── 318cf9cf36583b60abe1020e9a4da0812054e6cd
│ │ │ ├── 333a5ff4f244aa6630596b4be1f23be83056a191
│ │ │ ├── 34311a90e06f21ac8a13b41d680ecd3c2ac86580
│ │ │ ├── 34a5a6b5114b1afdebf6cc3f0f22799aaf312c75
│ │ │ ├── 363e59b20a733f42e686cff4782e3630d3e44a72
│ │ │ ├── 364d18d1127c2618f9c870817b667be27f05205d
│ │ │ ├── 36d852d0de2862cb65ec8f254f938660d3a64dd0
│ │ │ ├── 36fec4670290af8d7aae4686b7084d50c89aef76
│ │ │ ├── 36ffd42c063939382ed77134a877f16f4561f8a0
│ │ │ ├── 37ca7c1d8eada0b491363b1122dde916cae6772b
│ │ │ ├── 3854883375f0c24b614c9a005c99ff48664eabae
│ │ │ ├── 3954d4a721f2d7b05a6f1ada50a01ad870903f80
│ │ │ ├── 39a39128874b06e2918eabe882c62b2c1bbeee6f
│ │ │ ├── 3a30dc1703679bb07318e85822f45e4e85058ebe
│ │ │ ├── 3a331735f5acb42b03370f8146538fb5f97ac9ee
│ │ │ ├── 3a7885343257c4daad268f5b1934a826a1c53c68
│ │ │ ├── 3a7f8314649f4b1ea9ae10374c44516a1ed167de
│ │ │ ├── 3a98446abbafe1dafdf6467105e39b4b3ece3eef
│ │ │ ├── 3b5655ca459fcbbb2db48e4348124a5ccdfef60b
│ │ │ ├── 3b9ae8f8a25d444c59a1270247f430cf295fbe98
│ │ │ ├── 3bd830ee7c67481ae21d95d13ffc8793e5cb3742
│ │ │ ├── 3d755d85c8e1ee1025bdc5aa030bdc4a0c06a25f
│ │ │ ├── 3d963490b3fc0df50b73118e2e1a1bb4a09d61b4
│ │ │ ├── 3e023e5df0d59d64f42ab9f5ad89ecd2a0ab38b7
│ │ │ ├── 3e15c44885f6b5352840137a9b866c0485b46c24
│ │ │ ├── 3e98fdbcacb8694a2769befec5a4e2353ef43f5e
│ │ │ ├── 3eb0664a2174915191d7de004028be88425a704e
│ │ │ ├── 3f22510ec387b9d2eabf548d3769ee65e5d90f7f
│ │ │ ├── 3f3e6c7b1b7642726117c1d720e16ec5cc63e057
│ │ │ ├── 3fc71eb9ed715b1e0a587cf43814d61b109120d5
│ │ │ ├── 4133dd03167b37f7616c84180b7f5bdd399a5789
│ │ │ ├── 4176ba61305e3d6e0e1a5e8895e06246774d3a39
│ │ │ ├── 41a5277adc28f12e96c02a8d19db84ea4251dcac
│ │ │ ├── 425b3a47c660a8fb82bcf45fe7689b731b869dce
│ │ │ ├── 427e26ec1c22efe40396413fbfc15a4a57e522be
│ │ │ ├── 428d56e4bdcd603e9a420d42cd9d87fd3698ef0d
│ │ │ ├── 4312a2b3509e1013895e89ff38b92bf136146317
│ │ │ ├── 43a5b47e2cfdeec0975d10c7894d525c71f72fd5
│ │ │ ├── 43aaa60ac35dca0651a97c6e370a568a894d1ebe
│ │ │ ├── 43fb9c4b4e2cc9139f16d7495c097e9a14bd4323
│ │ │ ├── 4409be6323597e5ad119c320e96d172571706e44
│ │ │ ├── 4420078c856ffa81a5266890d920f5852ba23670
│ │ │ ├── 4478bff69659a907cea72df2a2059581d71b5163
│ │ │ ├── 44df162c0f57ce6926ea116a8d03eb88bbf12867
│ │ │ ├── 453f95038223f34fe2ab00d4a99405f34c051056
│ │ │ ├── 454b6816d7c7be75b50fcc5a7ad9fee74aaedadf
│ │ │ ├── 46dd4e51c9bf4981be2100dcd3962cad4c5a34d9
│ │ │ ├── 46e5b0e24d7c4cdd47d2c3fc815f4c3d8ef6549e
│ │ │ ├── 47b57f91b156c537e9c0801772ff6b71b8c01a8d
│ │ │ ├── 4815e512372763864e4b2a637e1f52953a194a62
│ │ │ ├── 4819d7fc9f7d485cfe09402dfc85d71005980934
│ │ │ ├── 4847fb92733d4372471b1c19bbad7adf542fc3a6
│ │ │ ├── 486b91de9bf4c00ea89977753240b9237403a4b4
│ │ │ ├── 48975beba3bd399b8420c72e4c63554b121717f3
│ │ │ ├── 4899c24e722e5ce2701f8bb257b977107861ad0f
│ │ │ ├── 4a47878960f0a8cf0f11b595554b242317907881
│ │ │ ├── 4b04f909eb2b5a2d652931368e0aab127bdc096e
│ │ │ ├── 4b1f89f6085c6b8a86ee4210437d42ebad291b58
│ │ │ ├── 4be34d939221673686dc9bc8cd4406c8e169e5f5
│ │ │ ├── 4c4d585f991be147b6991e22063cf897976e7c53
│ │ │ ├── 4c8722043db14aba165cf9ee96a1fb3cd79e30cf
│ │ │ ├── 4cb6cc60e5b9c3fb5d0361a6fa4f9a2a6813bd58
│ │ │ ├── 4cf2c561bd45b371818fa4709f1125f73cd20421
│ │ │ ├── 4df69786a0cf9134351d8e28ad2e62cda5edf7ea
│ │ │ ├── 4f57f215760851af8377252a1f25149d4ef391a7
│ │ │ ├── 4ffe16f9377a92ea7effb3f09c610a110cb8d88d
│ │ │ ├── 505a409a657bfe1e88db9dd45ec24990ba32e83d
│ │ │ ├── 50acdfa5a9ba98ea3639f58a6b5b70b1d2f4d98b
│ │ │ ├── 512c26c9a771ce001117d884072bc18833450bb0
│ │ │ ├── 51a7d17fccd96e36290bf75a8727e84fc11b0bcf
│ │ │ ├── 51e8452a4a8d4252aeb955c519e7f6bf30b31a38
│ │ │ ├── 52538a80094f7b62948fd31e68fd17a315d8dc91
│ │ │ ├── 52e7a46f8f6118dc072c0f69b9e7d3e02862266d
│ │ │ ├── 539bfee4d15704f2dde2b4e767e0d12f3be7969e
│ │ │ ├── 53a184b8fa7ec2c93fc82380a5995441486cd2bb
│ │ │ ├── 546075e141b57d05683780397c7388cb86bbbf1d
│ │ │ ├── 548fad2d8e2e9e6cdde15ba111213e9983c3781f
│ │ │ ├── 549fa83e9a251645e8ad1e34ac7ffe7a379b35ad
│ │ │ ├── 54f1f92da1c7d7d06afe5fbef91ea15bdb311ab2
│ │ │ ├── 55956fd04658b981f87fa7f5d68b254d32d30437
│ │ │ ├── 55dc960ac862bd745f80c71024024b0954efe879
│ │ │ ├── 56343aa68a264d37b9bc7f1d75f0b9a9bfa8ad87
│ │ │ ├── 568c683601554f4426f52c9e2af37a0c5223a881
│ │ │ ├── 56c9fcd9bf53e0a04c76186133b07344590bacaf
│ │ │ ├── 5710f6607b0839be1daf7bd853611faa526af24c
│ │ │ ├── 57287827583cbb5a52b5fd74b1af2a299ceadb44
│ │ │ ├── 5782818cb627dfea720cc11a98b72ded09bcd197
│ │ │ ├── 579ea4dee000c5062f57e769b6d0509bd5ea9d21
│ │ │ ├── 57fdea3953089efeeccd4f114815147890b40be8
│ │ │ ├── 5829e42f4deb080ee51e9b991f4ddfd84081417c
│ │ │ ├── 58521eec7cfdd2a2b33fb59833b3c35b40781c1e
│ │ │ ├── 58e31f7c387ec92c66494a71a51c234e62f160ac
│ │ │ ├── 590764888ca03f657abf35ef756dad69290a29fa
│ │ │ ├── 59620d617852697bd4b91e8f28002834d36080bf
│ │ │ ├── 596c9490c5e275f1b8175f2508fda624f9ac4af8
│ │ │ ├── 599c4d9beb25d997dc652ca08de64f126d1dbaea
│ │ │ ├── 59afcc295007393c0c3f0e62cdeb7545760da2e3
│ │ │ ├── 59b354e1be703f8532d12f9a57cdcb673f037dcc
│ │ │ ├── 59bb934d4bba9714911b103647bca9b6a7ba5a7a
│ │ │ ├── 59e08ccf08163edca4e45282d4311d6f3fa7a1cb
│ │ │ ├── 5a27f67d52060a627027576cca4c0b5e1948f72a
│ │ │ ├── 5a2897bb168033e2e96081d56d30d2274ec842d7
│ │ │ ├── 5a341b6ea702c26a57c07bdee8a5f032c4ed373c
│ │ │ ├── 5a5e36df29ab9652a2cc35311e808a364bcc7b5c
│ │ │ ├── 5ab54a202017fcc1c2d08527e10196a3683fd693
│ │ │ ├── 5abae4dad22e24661b67467637911232891f078a
│ │ │ ├── 5b1e6ffa30ed75a86c0c12874a19b5b10c2dd4b8
│ │ │ ├── 5b676be8976b86a7e443bc76f83c3ac887bb0f5d
│ │ │ ├── 5bde424d1c997f07c00198e8cc11780f126b374d
│ │ │ ├── 5d0fcde20a7f37968cc18eb90d0623157a554daf
│ │ │ ├── 5d1b5cea47c0e1dff9b3c925e64f9a7218651cd2
│ │ │ ├── 5d5797a823266e7a4c5e850b3874d1a340a24089
│ │ │ ├── 5d92f55db06f0542d8ab73cab91972311dbd366c
│ │ │ ├── 5e4ed18e295d2e4cb1872fb8dfcfef354c65f0b6
│ │ │ ├── 6034938b94e09057e236108f7c4d973135752431
│ │ │ ├── 6065ac948ae92b8a6350f5189ab836af8a880361
│ │ │ ├── 60d7a017fee32cc92fb5c5e42cd6e74b7c7d28a4
│ │ │ ├── 61d92fa8f9e818a9408a503f8a5b4d691741630d
│ │ │ ├── 61eaa8f3c923e8e13413385b17db4d2ea93ed81c
│ │ │ ├── 62ee95f7e4960e071e0f46ce4038744cc628f55c
│ │ │ ├── 6415f9d51ad26a3c9362c4275288569308c3905d
│ │ │ ├── 644246ad89628db7d5d08d251c2f3a57ef7cb9a6
│ │ │ ├── 64a05ca17e2d486ae226bb222e83e4fbfdeec88e
│ │ │ ├── 65100c526fa10704acd0915a1008489916add30f
│ │ │ ├── 65a747db306b4a23201b005ade0323a2030d05f9
│ │ │ ├── 65fb333567279e5a1b08f9ee045b542eec5a7646
│ │ │ ├── 6647676a7c148fc6b6fb5886c613caac62520abd
│ │ │ ├── 6670935deb9f0c917df25d711abb52b6ebc2c8d3
│ │ │ ├── 66acc313cf86ef521a4ef841c5d70166c8d9d2d8
│ │ │ ├── 66c029f9f0a53b169a3a8f8c92e191d83545270f
│ │ │ ├── 67670443cf53b879ebe921f3a3c379a370d1ce7c
│ │ │ ├── 67cfad932dcb42458a452d601c3639addb0dda55
│ │ │ ├── 683e4f35b0ef1914153d21bc43f740f3eac6c00a
│ │ │ ├── 686c06014abdbec94bfcb3402d91ac733047f390
│ │ │ ├── 68799aa6061f3f23786e498cc42f3f0aefa94231
│ │ │ ├── 68b70365a89e2318cedf758e659d6da508cc857d
│ │ │ ├── 68dcb6bfce4a84a58ea17326523b925fb371354e
│ │ │ ├── 69b94f50055f5a01c7962b7e6235b0cdcd5d748f
│ │ │ ├── 69cfca233d3670768d5ac85ba85b332e2f7ed0eb
│ │ │ ├── 6a54680515d8232857f8a4de58a754c30fccac2f
│ │ │ ├── 6a70eb1bddd5d98b66b5a1893c92a0e73a3b6860
│ │ │ ├── 6ad5b9659a5155bed9ac113d8e7deee52d62ae2e
│ │ │ ├── 6ae22a67d479d89209ee12334523d276069443e1
│ │ │ ├── 6bbe7e5d318ade2a13b9c9218d44ca1cf15167a2
│ │ │ ├── 6be8409d04d2ab33d1be468d49a0059710e026a1
│ │ │ ├── 6c81b50612306793631a68580fd5d34572f8d646
│ │ │ ├── 6d09033d9cabf4be617ebcd83cd8170e7f91720a
│ │ │ ├── 6e3efdddb78bdba7450bae245cc28b0042cc95c8
│ │ │ ├── 6e6dd7a40656f0c504f240a41a338a50a6c38576
│ │ │ ├── 6ef19f1ffb221eff0e257019309122d61bab986a
│ │ │ ├── 6f076f34bbed47962f214a8e8852c0eabe0e1758
│ │ │ ├── 6fa96a3d1e975082d8c56152d0fa7982373b83dd
│ │ │ ├── 6fbabed93b030d4b0516f2695a92359e9968cfbf
│ │ │ ├── 7036f4840552da6b9c8d5a904737334e62648cc9
│ │ │ ├── 7084c77693211dd27cce1a604873f5c92f9ca55f
│ │ │ ├── 70f80935a4b4f54bab5539b4ee024385b81118b6
│ │ │ ├── 71265deeff02c8085a3951cffa16f54fd572b5ae
│ │ │ ├── 71a1fc6f2ff0611dca7a41512f3ec6f7e72ba81e
│ │ │ ├── 72655ec6a57d64f433af32673fc8d63dadb66f72
│ │ │ ├── 732bbfe36d8c5a3618aa62d1328a9f134a7ca8fb
│ │ │ ├── 733f120852413aa814e1956fd867f7e0b5049323
│ │ │ ├── 73439e7485457a52d8a40f1128028c392ab2647b
│ │ │ ├── 734ef59a248356f3fdbae3d2d9120407b24922d3
│ │ │ ├── 736e9a66d196ef004702bc6ace3c2af3cdd4717d
│ │ │ ├── 738ebb29ab1a7ff184d5ab708ddedec1ba221ba9
│ │ │ ├── 73f3d7ec16d05afe7f994276e031110285b3f135
│ │ │ ├── 747d1d8fc239dadcfda4548323e19bfd92f6256e
│ │ │ ├── 7483e4ea345a1ff384d3f5cef1ac2b7213cb1a8b
│ │ │ ├── 74c0fccc29fd0359b83292bba0f6d11a0097c100
│ │ │ ├── 7517d0db9588cf80ec0c91f3dc7d83032ebf35c1
│ │ │ ├── 754878bf3a1ebbb1a3cedcb83af75f4ee0f65e49
│ │ │ ├── 765ed348c3e7f35a07b113610979293c490a64e6
│ │ │ ├── 76834875c666cf6b91abb021e98a4299ade5bd53
│ │ │ ├── 76ee2a1367fb162a838a3baefcd88566885d3867
│ │ │ ├── 772830437e7bfed10a74c23a515709e565accfc3
│ │ │ ├── 773b297817ea5921527a25da52ed2192a90beb71
│ │ │ ├── 77de8f2d03293718b26415515d8e70be1c2ef997
│ │ │ ├── 780dbc4c61cb0082bb74f95881938400b612948b
│ │ │ ├── 787bef1f01133454c80c267bded9d23a84b7b8a2
│ │ │ ├── 7989c75f8d1e89653002b9883a313177ddb17397
│ │ │ ├── 79d4058f7d077630675f557b5f66d74f0fd553c0
│ │ │ ├── 7a1faa155f51b4375db882fa0c7ce03017a253cb
│ │ │ ├── 7a2afc7781a37cd254f9b65c24c994dcfa9c1263
│ │ │ ├── 7aea4c88333ff5326158c3b7e43ee15c0c9a3b2e
│ │ │ ├── 7afc80aeb53628dba9fcb0b6f6b28d81381c8b1a
│ │ │ ├── 7b4c966bc3a6b445cd358ebe02e1b36055d5ead6
│ │ │ ├── 7cc44eb804c3b386d97e6bc5a567ec256a489c79
│ │ │ ├── 7cedc7cf62fbde16a894782d28c433df24bc2529
│ │ │ ├── 7e201c62e4c0049752934e7ccffa1678ed227d4e
│ │ │ ├── 7e4edf0b29910fa87b141d8e8b872141a8ba5eb1
│ │ │ ├── 7eaaf100319e5d501d3dba3a67b0f2501cba6b16
│ │ │ ├── 7ed7c1915d9cf819cd1d96b1e62e887ba499fc5f
│ │ │ ├── 7eefa731cc6944c3f6117822cfc429795063b09c
│ │ │ ├── 7f01ba3016a3bf587984c4e9d7b6ceb6ca30c6a1
│ │ │ ├── 7f60e3e06a02e51c4a6e2beb7e7a7c268f7fac07
│ │ │ ├── 7f8d4b9ca6f4d030a9cd90e07eadbfb9129f1a6e
│ │ │ ├── 7f8da76f6019b28800f5796221e923215ab8800a
│ │ │ ├── 7fabb36f5ddb4211b75270d6b3ef84cfdc12393a
│ │ │ ├── 809ced773e09c0e9cead6154a530c1629377e45c
│ │ │ ├── 81e36cc226769da1c8c9636e9a874276c9b08629
│ │ │ ├── 81f1288612bf91bb7df561f93df86114037a511d
│ │ │ ├── 821fef9f40f59a9acbb3e06f9f49bcdba85791b3
│ │ │ ├── 8220668e727165c01e984415f8221183f2f1e2a6
│ │ │ ├── 82c7ccb025c7c4c537ca69a937a709dc15d3870b
│ │ │ ├── 83166d02c98ea686bc8a75d2d2610e344b76e8c5
│ │ │ ├── 83823088e385e9b31ed4bfd84db7694c6ac75e6b
│ │ │ ├── 8448e852473fdd61c6256f83f14d2f07a8d0d15b
│ │ │ ├── 8478ef6a1a799d43fd125e6d47de83e4257f3ebf
│ │ │ ├── 847cf8319de92af321ba43cbe424e5fd5ae1f297
│ │ │ ├── 84f5b07339ad6cf96edd5b32cd440490585e4350
│ │ │ ├── 8525fcab8d84e20cad9ed32bab412219ccd74a1b
│ │ │ ├── 85459285c117e7d51a56790ee8fbe85d8f26a168
│ │ │ ├── 854a57aeddf6299c162eb0eb50f0dc218263e4af
│ │ │ ├── 859366bbd30ea84562c37faf4af3ba3b4bbed3a2
│ │ │ ├── 867c1616c3eb0531b5d282d8ce22fba1df87e9c2
│ │ │ ├── 87ea03f1797f44000af994ef155cc18e5d9124de
│ │ │ ├── 881e6d5b9cf7899fa5c6b190d659e5c1e20c25c5
│ │ │ ├── 8908a33e0f06fbae87f9cff15b968a0a0688d5d5
│ │ │ ├── 89aa9c4d5ac13985c5391da519a91018bf45f59c
│ │ │ ├── 89acfc070cea5162bc410afb5f771b8fff77a86d
│ │ │ ├── 8a1a52bf23c953620c66ffa3e0b3275baad77462
│ │ │ ├── 8ae5720cc88be7a7b1c973d284af4b7d8601f616
│ │ │ ├── 8b30697215dcc838bf99cd400402fd4ea4dd6665
│ │ │ ├── 8b6ce570667c4c7be2881c4cd16c0b65ad895256
│ │ │ ├── 8c5084438799846a173535d5bbcf96b9f44f6b64
│ │ │ ├── 8c72b837232707b527e469f91b689843a16606e7
│ │ │ ├── 8ce9fcfb6d981d5dce2dcc0f759fbf25d5e2a393
│ │ │ ├── 8d22b47604cf67a5bf34bae2b2a50a6edfd268c0
│ │ │ ├── 8dbc3f760c69d064c71aa539ae964e562c22867d
│ │ │ ├── 8e19ed5c48121c44691f3dfd08e6b93e597875e9
│ │ │ ├── 8e9774faccd71983c83a67dd04459f6ff68bde52
│ │ │ ├── 8fe06eb9f3c8cd5be235d857d5002420d4452349
│ │ │ ├── 9043db26234c001b9e17a3b54027d738846b85f5
│ │ │ ├── 91379bcb0f7670a5064195bb5e3d2d30d5f22781
│ │ │ ├── 91875cd979df03ffb5e8971f4162e4bf3f7472f8
│ │ │ ├── 93315008562da002a94d75ba7731b5b05a43d57e
│ │ │ ├── 9331ab5a89760874dfddc96e3f9abd6da916bcca
│ │ │ ├── 934c02db1df4356e679041badf3e2af90dabd63b
│ │ │ ├── 9392192d8ad4b4d3ab6f9938cfdb5288906b849e
│ │ │ ├── 93a2ddac81e6b949d793a9ab6c5e082f3a30f04d
│ │ │ ├── 93c4cb3f2193b404a2cd713434a5c4cc563151ba
│ │ │ ├── 93ccc352335191167ecff5573bedbee43f9832d5
│ │ │ ├── 93d47af5f2eba2dc4230855f8dc77ac1a6e144ee
│ │ │ ├── 94108451f94018cbaed1f4913759c9af14c6969f
│ │ │ ├── 9421693843d27aa21ff007b8b71e25cd1935ec0e
│ │ │ ├── 94a9a6343361ed009470e2835593058525a2f072
│ │ │ ├── 95025f82238a29a6ae080a12d959aeb726d5954e
│ │ │ ├── 95f0e91b9c57bff27a7a5c76915874f6b5fe1c80
│ │ │ ├── 9642a7bd104bb9a960a2d57ded01884a1ea84b4d
│ │ │ ├── 969d6c0c7a30925e1ea7613d2ca4e09d34300375
│ │ │ ├── 96f2a91788c81e2c1b3fd7e94a76807ba29a30fc
│ │ │ ├── 9702a14c7130ce1d6ff27d3b04e1b1d97de6f814
│ │ │ ├── 97c2398e81c6333849867e405a4b6de93714a896
│ │ │ ├── 9823ee93266d25cb71be86a265e9cf1fae926c42
│ │ │ ├── 985a10af3bc143c2e6286767ad947eee61187576
│ │ │ ├── 986aebee3677f08fdbf4581176998c0dd87bd844
│ │ │ ├── 987d52fb4cf857bb3e89e8c67c5e635b74335d06
│ │ │ ├── 98f39d24e575a191c9b11c7794c84011af954f8d
│ │ │ ├── 993bb1642c92359dffec946a3e1164580d2ceb41
│ │ │ ├── 99ffd4d993cb2735c23bf90be6ac933d54543b69
│ │ │ ├── 9b232b77fb0cfab45e7121aaff84f753bc4bc266
│ │ │ ├── 9cb7930612cd3e8dea253311738bc71d3870c598
│ │ │ ├── 9d25654e7fd9d53279846c06f879d2e41e9c4b3e
│ │ │ ├── 9da5df56b0ad5c443648c491562b9f897f0d8631
│ │ │ ├── 9df95cc5200e5e856b1148cc538e5dabfd8e0419
│ │ │ ├── 9e274418d86f267e9a4bf459aded615c27c589c6
│ │ │ ├── 9e3bd5d1b3e4150a8fcb98b13e084b6077b22120
│ │ │ ├── 9e6c98631fc5f747c926dd3d13baa8b80b78299a
│ │ │ ├── 9eb6f2a7c93900eb07e8ed0280f751eb34777bf3
│ │ │ ├── 9ebcf31b7d6d693c44d7bc0476660385c568be86
│ │ │ ├── 9f90e4a8b538c7adb359d3b5ba992d1f3f6d9528
│ │ │ ├── a02e52e9e9a8ac83f293715426f5b6ab763a352f
│ │ │ ├── a0ad8d8eeb79079f1b872fd1a88a10995f30a928
│ │ │ ├── a140a6232f3cb9226c265c53b1fef83cab645efb
│ │ │ ├── a20ed628e379f0f3def7bd9a7b4a4d49aea25e7a
│ │ │ ├── a2a96e13ae35d062033f472520e6cbae36f57781
│ │ │ ├── a2b6a1285ef7a9358b301dadba51471d13cabb53
│ │ │ ├── a317ec712245e1569aa28690ff19e1674f7c3335
│ │ │ ├── a33b399f12f4d5212a07df335429fd8ccfa6f635
│ │ │ ├── a38d0b76348af41c0f8643c8ab8ade8a6d6798e6
│ │ │ ├── a3edd853699b312701b618b9f973b2f92dd92b7a
│ │ │ ├── a3fad58f05c6bf8d23d243dad96c1bb541b75ea2
│ │ │ ├── a4a9ad9cbf03f5800fd171c2ffffd81009591b42
│ │ │ ├── a4f2c0e1925ce3d6893786d364e1b9a06ffadc04
│ │ │ ├── a53221c14b49b9fcf2951bf49b1e32b974f93b34
│ │ │ ├── a58d07ecdd996c48c967f35794da52bfdc9d9cc9
│ │ │ ├── a5ab8d7a8b7d53b1474e78c99f514f70da2d895a
│ │ │ ├── a61ade55f542deacfcfb946a5bc53819d615b008
│ │ │ ├── a65176ad784745e81ba4d85462fa977059290a87
│ │ │ ├── a69aee9cb505d840ec7962a9676ce91d615c066e
│ │ │ ├── a708f3d79e9396806e3ceff8fa0b5d3eb46a1fc3
│ │ │ ├── a74126abcdef01934de26324b4f1647ddbba34f5
│ │ │ ├── a7fab50188e302639710abc5750199df8dff80d9
│ │ │ ├── a8a9522dd4b2fc4c36a5f087c69350a826e5f305
│ │ │ ├── a8c14a4fb0aa6f15d64e3340dfd3f59e5004e0be
│ │ │ ├── a9244691122d53f1a4190b7117879ecc65d3c426
│ │ │ ├── a9e90c6ec7cd49cd3a1add137f933c1ba79adac4
│ │ │ ├── aaa1d866b084e9aada7d40b8ee764884f77adff3
│ │ │ ├── aab31150afd7a0b5ba80f4512eec29f12f39c346
│ │ │ ├── aae36396f6a55a43040f1574e50f495b0cb363e0
│ │ │ ├── ab33cfc6d11519cf4744aac4ba1a4c2abd677bfc
│ │ │ ├── ab3e8c13f2e3c85d17ed7947e8421fd7a62d85c7
│ │ │ ├── ab537eb8c433a559bf8efb34e87b41ad6e725314
│ │ │ ├── abb044385b74f700122d32ab4a64d4e28ff5a32a
│ │ │ ├── abf70ebcb93428c340eaa4c7240df5f79d4f302c
│ │ │ ├── ac40ed1be457ef187e140d6b6d90bbb971f3c2f1
│ │ │ ├── ac75433e415c6df2c8b2638098a5141d99da02a0
│ │ │ ├── ac9231da4082430afe8f4d40127814c613648d8e
│ │ │ ├── acda2d9d5b554b0f53adb144abb75d972282cf8c
│ │ │ ├── ae93c08c9d7c90e4813d0021ada85b962a562add
│ │ │ ├── af3b9bd27d7e5dcb95714c3530ce91b55a981fcf
│ │ │ ├── b0b46f92ed8ea957d824b9447b02e949f92e24d6
│ │ │ ├── b13513de1c9826bc3c7cc55362cb58087b75d8dc
│ │ │ ├── b14de216ecafefd04ecb73730da3312b8e15f6ef
│ │ │ ├── b1f3d1813d0facacdca7d5432f296dbfe1aaa859
│ │ │ ├── b2276f89583f7d7e5bd602fa87a9199acf768687
│ │ │ ├── b362bd32d7990933f382be1198e53ef7d4a97d27
│ │ │ ├── b39a9effd3f1cb044030c6af2b5dc6a54ba5ed97
│ │ │ ├── b3c3d160a1faee32c77b84efd141bc451c68aa33
│ │ │ ├── b3f79e287968cb8c26586f2c8d42be14ae40b8cf
│ │ │ ├── b41a9289be7e5215b00cce1a91aeae890da431c2
│ │ │ ├── b4ac86ac7dbbf0415a1e462582492684cb23743a
│ │ │ ├── b574ba06098c1afdea78675aaf1569a000f2835b
│ │ │ ├── b60a4f470e0e038fca64bbbd7116ab78fcd148f4
│ │ │ ├── b6d2a7bbdfd97ee8dfffdfb8d3edf8902a982ec6
│ │ │ ├── b7f743b36b59a994d2c806f5c64c470f575b51b2
│ │ │ ├── b88002381964743d7670b9c81f5511b3fc15da71
│ │ │ ├── b88d139b6562ed3f564b616e1a4bd7c1e65d8a97
│ │ │ ├── b8bcdcb212094ff70c464992a2c03febfdb4ecfd
│ │ │ ├── b90502b3d5538ed552c4e702cc6714f3aa97f926
│ │ │ ├── b943239ad9ef623a2d97cd8fbd001d756253e40b
│ │ │ ├── b9c0ae1ad5ba0c729cf327cc9d209b0e6d1285df
│ │ │ ├── bb0feeafe988ab44f047ccdc879026152918268b
│ │ │ ├── bb49ced094472766db0fbd2048b2644122a4a639
│ │ │ ├── bb75c608f1fe390f7816c33e50b3b4906af571e0
│ │ │ ├── bb899a8c6ed71c59b53901deba44a99d2b7eb886
│ │ │ ├── bb8f666b0355e60c5bcb897a04522229ebed317e
│ │ │ ├── bba5c5e181ef932e33315fc49ff1bb4d8e0f977e
│ │ │ ├── bc16699053f9ab73607dc50b9752e85a280f854e
│ │ │ ├── bc4c2c86309011b7f73611611f37da66317b5720
│ │ │ ├── bd2f72b2bef60ce1fd70800f843b7f1283625c6b
│ │ │ ├── bdb41a47e38dcb3c688b4f1829ba713d289f23b5
│ │ │ ├── be0f6b0f8cf4919efe3133b7f76f21fadffd0755
│ │ │ ├── be4efc357ca34e9db016986bf6169cf95d78e1be
│ │ │ ├── be59a17adc51a4d466ec7d57c539ef17cdb831fc
│ │ │ ├── beb284f1b5cc942e94f6877a19a4ed4848243528
│ │ │ ├── bec328eb38dd7331a5a009ad61e66916d2df091d
│ │ │ ├── becbaa09e52ed9ed0cb37a7d4df41d925ade8837
│ │ │ ├── bf1248afb100ce4226f3de45e651dfeff7a2cde1
│ │ │ ├── bf3159c322a1c15db6b80453cb45976e405ec42e
│ │ │ ├── bf9556af2c3585a3d3180c38f2150a6c18e64c5a
│ │ │ ├── bf9f6adc6668b3f0da401f6f4005ba703127be41
│ │ │ ├── bfbc1e675bccdd6ce0bd5fc2706705d58dd4a5e1
│ │ │ ├── c05d7d42ef461c9ead02bd4012be390ab3b92eb6
│ │ │ ├── c0e74fff7c2479d1b5f9d6a7df85d5f78da4a939
│ │ │ ├── c11332f3788e0c0236d4d627cb3e7856997819bc
│ │ │ ├── c14a57609a6a58060b81330332ad629a8d45cc3a
│ │ │ ├── c2a6d65b5645a525ef06ab4b466a7c8bb3bfee6e
│ │ │ ├── c2f5fd0faad5f816224666d35f047fcda1c8a224
│ │ │ ├── c31b9424aa17d0102618eb1608fab59f79f27e7d
│ │ │ ├── c3a2e62abbef20428b4cc687ac795a60057a0866
│ │ │ ├── c4ca15b14cf6c1246254a62ba8651e3b5a94b0a2
│ │ │ ├── c569a3a3dea044d635c62769aba7a1e76c1983f8
│ │ │ ├── c5d6b59970955ae03e3c56fd7c4150ceded8aaeb
│ │ │ ├── c6f22b7ad3778eb8ffe79bd79a71a7c28893ce8e
│ │ │ ├── c753c5fea0dbf5282e637ca24fcebf496fa4ce31
│ │ │ ├── c79e61953fbb910938759fdfb3ebda1d62b82499
│ │ │ ├── c7e01bbc2730038451db0eaaf8e530ce28668929
│ │ │ ├── c90459d77a383615949d2e808d4a3bd3d198dee4
│ │ │ ├── c96830151dda74af4973627ac0789755c8de9cd0
│ │ │ ├── c9793fba7622ca0db4bdf0dcdd2df5e3e24561a3
│ │ │ ├── c9840c279bc6b68a10b7959750b6d0f6d3f15339
│ │ │ ├── c9d47ee5ee3064a0e2972c9f212cdb2400da225f
│ │ │ ├── ca24779494866cc547770d0b2ec5a43c8a744271
│ │ │ ├── caaa071fe54304538f3207fbf66bc7c1b5d680a1
│ │ │ ├── cad7c5efc1e0ebc31d28d18cecc2cb382443c824
│ │ │ ├── cb360d503fde114d017d680a286499ff579be90a
│ │ │ ├── cb44f6116eb9631724e99fe30677e028a0b5568f
│ │ │ ├── cb602e102239c4c276c73a524e234a2c1da62017
│ │ │ ├── cc6f4756269c2b84d14bc9422d556c9ef72a5bf6
│ │ │ ├── ccba8877eb7f0b4e8bdc969242b3921abc1a776a
│ │ │ ├── cccdd183c934dbcfb8492a68e467b851a97896f8
│ │ │ ├── cd08699bed6c9d29a67289ab2305fafdb862c45f
│ │ │ ├── cd2644eccfaec7cf5f378bfdcadfdb92506dcf18
│ │ │ ├── cd62907dc6aee1f284043a6eb103723d1969bb89
│ │ │ ├── ce193ad70db095f95c56031da339f6e4b96400e1
│ │ │ ├── ce221813e299675c5af428b5649d79ee23ce6630
│ │ │ ├── ce90c152ace3aa251b342ac22eb1522c5ce70943
│ │ │ ├── cec3efa20e95f7af9b842ae24be68af28abf63a5
│ │ │ ├── ceea2a35b3d5416bd9d553e451af62d0579558aa
│ │ │ ├── cf58f5a7938675b1da395cd5009aacf0291e72ab
│ │ │ ├── cfb58e92be2e063dbd8687393031d00a30125832
│ │ │ ├── d011c59a517c0daa0143e1c766d8b87a41a7fa12
│ │ │ ├── d072decfa30d0371175e20ee38b05c9ccc7f68a9
│ │ │ ├── d0a8af1edc551c261131f21d23d58b9db266b940
│ │ │ ├── d0d5b0b2490054fdd6c1ea835c0161c071bb67f5
│ │ │ ├── d11bc46eace7717a3d134e7c5a8c468fd8eaff4d
│ │ │ ├── d2ac5aa56bf5882ef4b27d787150a82de4069be7
│ │ │ ├── d2ddbc3ef8d13cac2e4337a5852632e13f1bfb8d
│ │ │ ├── d339f3e0cae035f11e9f19fec80b9d29255ef2d8
│ │ │ ├── d34a4595e58bfd788a4b9cf02106e8e44fca9473
│ │ │ ├── d34bb927331b2dddd2f248a93f7b0f53cb177c54
│ │ │ ├── d3985a9e93af488c713e3a1feafc3e7fef2c980e
│ │ │ ├── d3f750d6b4d915fed75bc7ad88f3d82f23c27f50
│ │ │ ├── d4321f2ac05328ea41c9c1045c78e939af7cdacf
│ │ │ ├── d52bd0ec6d67f5184f7de68faac19b8b11a08960
│ │ │ ├── d5be7ec57e86f029397fc586937abb40078085c8
│ │ │ ├── d60a063085fa8dba51fe0640350cc78f4fe5c565
│ │ │ ├── d66e5cffb67f3d615d587ceccfe409d9442416e3
│ │ │ ├── d7c91a57314937a25b31615083bf5e10b74beb31
│ │ │ ├── d7dcf33f17a0b7d6cdb1d7103fdb31113ce69384
│ │ │ ├── d857f04d2b9d2073c2743fc24c16f8736d1ed68f
│ │ │ ├── d86e699921d8e49002b2e33ed2ea04369166da7c
│ │ │ ├── d8f6191df64ba8ef6e4759a74a73097f776e0c10
│ │ │ ├── d956cbf07fab7f42db456c2f50921e86554f9b23
│ │ │ ├── d9bce5edd0e21e629ff0ecc37ba9dbbb1f29bc2e
│ │ │ ├── d9d90bfa5136b6c318f92f94128fa3bde7e6ca27
│ │ │ ├── da80d7e083514f87ba838d74ad1b2c98b9fed419
│ │ │ ├── db3bb05bcfa7783a1dbd58dc240eda6d3a104dcd
│ │ │ ├── dbf5a58cf0cfbf387674323820191e9837860174
│ │ │ ├── dc92465d61984db69c690f80c539f9b119f9d09b
│ │ │ ├── dcacbb49d94a7729c8608b06e31bae8a4597e246
│ │ │ ├── dfb24d6ab7c1a92d0fb92a3cc5d111213607ed49
│ │ │ ├── e00cee8ed923fdc8105bd5c4418b396c5ea1f278
│ │ │ ├── e022d1c691a88cc2df83f7d9503e013899e53c3c
│ │ │ ├── e06fe8074578679152c8082d6b55e007f0c3c3c8
│ │ │ ├── e08d340c4870ed1431dfe162dbf931e10fc76430
│ │ │ ├── e106d00dd9c2a7a4dd721ea7a6d617e1e21a9ac1
│ │ │ ├── e10f916921ce8b476f91d145bda76fb23787e88d
│ │ │ ├── e14a2470a4f402d30293d7538fb84d76f3814196
│ │ │ ├── e1652830349ef5a8dc30eec097d22041cb015d40
│ │ │ ├── e1f51b9aaf0785fb395387b0d8e5733eb7c6008c
│ │ │ ├── e279d214fdbcb9d2c3b9f90062f14a9f39017d8a
│ │ │ ├── e34acc79f5941fa1ccaa101c1015ea815cd843af
│ │ │ ├── e3b38049b5277cd9596ee43c6953cc420c3782f1
│ │ │ ├── e3e2edba8a6be6320d7ff0b4a049d7cd75a75304
│ │ │ ├── e418c7b6b8d106a0ea681d381403fb6f00fd56e6
│ │ │ ├── e421bfaaabf1ab691fd3c13471119b925de71d19
│ │ │ ├── e4819d9c3bc01198929c67e156c95a62f7cabd0c
│ │ │ ├── e4c832c5f1412c790e0ebe0cb20d4a9489e149d1
│ │ │ ├── e5da9535bf401769ad78966c932fc919dcf36aec
│ │ │ ├── e5fa43484664374bdb153b0315aba7d7ef2ed464
│ │ │ ├── e744b1ecf5bd340d5522d4b608fc164d17308294
│ │ │ ├── e7aed65e670bbf348ed492549e7a28017d5cf225
│ │ │ ├── e84115eb6032a5cbf75bda5aef9d638a571e68ba
│ │ │ ├── ea7acc086c154c8cea8abe427f69f3a234797d15
│ │ │ ├── eaa374716efc258e63506cf13743241b64cbb731
│ │ │ ├── eaa9c5f0c68681e4402432fc6534dbb4e5695aee
│ │ │ ├── eac08e2c4c3a7d9e316a88c0be076eded430cbee
│ │ │ ├── ead5155a5d7cbca69077914d884add26b79b02b7
│ │ │ ├── eae3a4bfdcab18f828e69c3cefd8a56c71c7f4ee
│ │ │ ├── eaeca33ae6a5414285bb521349377907f9c2afbd
│ │ │ ├── ebca7eaa6948de95f9e57dad5a372fc869df968a
│ │ │ ├── ec4537c3b151fb9990b3c09f45dff6e271446152
│ │ │ ├── ece0a60dd2583742ac7ccfc24beae6a73f0a9c33
│ │ │ ├── ed67d1fee3af43b92e81a23882543ce3b4ec0ab8
│ │ │ ├── edd0a269b7594331cc714ea4dfeca4d8a6688d23
│ │ │ ├── ee6219f71819b65fa95222b93c2bddc82f1adcce
│ │ │ ├── eee7ecf446a291e3649faa04fa1adc9414cd3c81
│ │ │ ├── ef21118da751598d6ce8387c31f4fde8bfe44e60
│ │ │ ├── efb74dd14a3740edbf6d72823a5898049ab7e5eb
│ │ │ ├── f03afa505315ca288dd0b10f9f7e2d57f8bc6af7
│ │ │ ├── f07d5fc54ab668426f71ea031653863c66904f0a
│ │ │ ├── f0ad8c452f85505e4f1cfa69ec5a3693a75aa98b
│ │ │ ├── f0bc2466f4b1f0f083a52f7fe45d80474e813b34
│ │ │ ├── f118a3fcad3757ce22c34598bc851e77bfa7309b
│ │ │ ├── f1d2a13f4e94a883dfd70e20fb38687589400fad
│ │ │ ├── f1d826f53231b45009b900f3540e13ca94e8026b
│ │ │ ├── f201010c3e3dbbda51e1e456d59b42928d860793
│ │ │ ├── f21c96536c236331637e0a761cdbd5c3612731d6
│ │ │ ├── f22199c6f3773d4cf002c1b58b8cfb37a5beaadf
│ │ │ ├── f28b960b0a1d9b97eaab31ddc14775fc9ed99779
│ │ │ ├── f31b31b81d274cb4f96439fe749c7caed28b801d
│ │ │ ├── f39877f1fc7de9013e66fee2ff4997f68795e191
│ │ │ ├── f43845bdefe61e740268d5f2f48aec5b83676232
│ │ │ ├── f46167d1279494c15ce82a7990b3848dc8941cd6
│ │ │ ├── f461e6980d824985487dd963d161dc7d85863e03
│ │ │ ├── f496806a427f06deaa598979600d4c15291e8df5
│ │ │ ├── f4a01768090d97a8011fd742282fa5b06d0e85c8
│ │ │ ├── f66a35bea8c82002b28a6ffa8d4b7e4d2b4c7bfc
│ │ │ ├── f67706cffe897721ae0ed6e51fc624c6bf5aad99
│ │ │ ├── f75ef0494ca0f3ff61659b350279d36f07799c0f
│ │ │ ├── f83037182509e2adf47331588bac0ef1e01aead9
│ │ │ ├── f8353de5698e7ab6f0994665e1d9dd4daf2bfc78
│ │ │ ├── f85438f9737c03c3885abc5f94d964b427f894fe
│ │ │ ├── f8e4a10eba83c793ecab5bbbbe6312533e909007
│ │ │ ├── f95fc4e086e7e4582b777ad7ed4985e20fd76e1a
│ │ │ ├── f96b6cba4b62a13725fed9444f1c3e279cc8301b
│ │ │ ├── f98d1ff99f71404585fd5a3d6a9b422e6121e9ef
│ │ │ ├── f9c803b5d3417552d59c889b737b7d7ce7ad41ef
│ │ │ ├── fa25d549af9e6a4ed9f7b2090b692b1d74a32afe
│ │ │ ├── fa9f549dfccab858d07cef598db8235e3adf5cb3
│ │ │ ├── faafe2a7b5507fc44d2a687d969745e7d1247cde
│ │ │ ├── fba1635ad39cb6e3867ddf2bf508ca8b6600dfa2
│ │ │ ├── fc8a2cfddd6423d3d354875e6412c9c6236b4ac3
│ │ │ ├── fd118a2e92c8dd4e7f6e5a26fe7c286df3864d16
│ │ │ ├── fd1d17d11a0d9160f3494f3fa7e22ee4ba0c968f
│ │ │ ├── fd54567dce80d6a21fc95ff0e3602fad8267b73c
│ │ │ ├── fd563a383be0f7f20fba3817445fec8ae38e2b78
│ │ │ ├── fd6038ab758c718b24786626bd6d012e99bf2f61
│ │ │ ├── fd789be0f676cf6f23f699b761c92f4bb077c134
│ │ │ ├── fdb0adf079db060c927f6bf90d00489b6f584a38
│ │ │ ├── fe2b23f8be0734f9dc02a94a5984a6fe436c84ea
│ │ │ ├── fe7df2679b3f754104c0cffcbc878e62216b82c2
│ │ │ ├── fe8d3b3af9f58aedaa3c8b3a6ab85f500bc336a6
│ │ │ ├── fec61e48de8c26286a5e82576c3ea1cd44fa00ff
│ │ │ ├── fede864b3ab976286ee6f68c0e30a4e7d90e02b3
│ │ │ └── ff34dbdff43ca162f31d7a3919ebfe793a24c9cf
│ │ ├── packet_recv_server/
│ │ │ ├── 0013cd9e254b065d48e6ce7771b55201bd8d23e1
│ │ │ ├── 016477e7448388cde119cae9e8dc4c68c91a6fdf
│ │ │ ├── 0186e17c93baca5bbc432ffc934c259267de264d
│ │ │ ├── 01cd40944ade67741ad7563f1c92e8a7f8606794
│ │ │ ├── 021741ef68065a2338ff52e6f1485d5841aab611
│ │ │ ├── 02489298aeb96ff34c7d8d38223246f70c057890
│ │ │ ├── 028e6d048fa899630c4378c57478158fffdf4094
│ │ │ ├── 028f03b79d43b8a400c99231df85f2ea4f6d7772
│ │ │ ├── 02b2454721dbeb39e3e0729adfa15555ee2c2cb6
│ │ │ ├── 02e9f91bd8d346e657b7498883196dd923493c7d
│ │ │ ├── 030e1392a16a9771053dd34ca49bf92936cd5f8e
│ │ │ ├── 030ff39991ddfeee4bf173d67ad1e453ab1b1a32
│ │ │ ├── 03214b8fd3a238b47c630fa5aa8c2be623236bf9
│ │ │ ├── 0356795fac21e810748da96c8a50db49551204a9
│ │ │ ├── 04bf26c3d7a9a7884bf9b8b2df57a1b749991305
│ │ │ ├── 050227b7565fe0f375c191712b3e4dbe3deb5fed
│ │ │ ├── 058a55056aef705e6e95fa2f75daf07800de3ca6
│ │ │ ├── 0603fc61520c6513c6a0bb3bccbb7515f594caa9
│ │ │ ├── 06d9f4a5b5b33f9cf47444c8c28f76add12981d1
│ │ │ ├── 070d6670316e15c78a759e7aaaeb218184fef772
│ │ │ ├── 074a556fe49e356f482237e7dada61ca88205d09
│ │ │ ├── 0783df667caf30cd0e193cbd24ea41ea92bc8284
│ │ │ ├── 07f3432ad50d5053501394d9855ccc7a07fcd363
│ │ │ ├── 081ab247a79bb29dc252b3202b06dfbdaf45e20b
│ │ │ ├── 085a4034b571ea67b22c620976b2a83bfbdacfa6
│ │ │ ├── 08bcd58f3a4724ab06647d2ee3b91490de9250c7
│ │ │ ├── 0953d84043beb92d5042a1d06950a3dfff0e4f4a
│ │ │ ├── 0987e67e3c6351c62512d09cc549930ec6440ffc
│ │ │ ├── 099ce796cf393fc29659938312faf9c0f813a368
│ │ │ ├── 09f4cab5f83076033458c242fb1b47e7062e2223
│ │ │ ├── 0a164982e9286ea0fd8e0c761952908645f452dc
│ │ │ ├── 0a43d732effc661c7f1703b04f69a4be02c6e4d9
│ │ │ ├── 0b6d8fcf7cfbe0e5d23c7d0762e844305eb5fd06
│ │ │ ├── 0b78920df078fbb79d73f9bbe501717112c1e06c
│ │ │ ├── 0bfafd4302a5e07071edd5ce1b5c85c9bd3684c9
│ │ │ ├── 0c153acf0e57f342a684d0cd34d3d51e59080906
│ │ │ ├── 0c4387e5a588dc52fef733aeb70f01e8b2b37b80
│ │ │ ├── 0c6b2872e85d9a137f33ff0717c290e6dbb11e2b
│ │ │ ├── 0c977a38396b4943533ec24478ef8f32a48d920c
│ │ │ ├── 0ce69145a94539ed32ca4c46bd09e97ce14f6096
│ │ │ ├── 0d7bfc9851e279ed49724487a6a4f5a32632f2f7
│ │ │ ├── 0dba5cf601fe445790131d8bf773936e6f2e2570
│ │ │ ├── 0dbdf7dccfe92f037f592d9a42d23635e74511d7
│ │ │ ├── 0e1a34943d5f635c9cc5e71690952f5295e50c5e
│ │ │ ├── 0e49ff9db8977259783c18f9aafa6420af7afa42
│ │ │ ├── 0e788cd7fe9c8599f77ef2aebe4ed1a2642ca345
│ │ │ ├── 0e8067d190570ca94b6ce0252d8783c738c3c4d2
│ │ │ ├── 0eba3e1230474f81aedc3895ab9ea398655c380a
│ │ │ ├── 0ed1948874e2bec6f8ec27ad0dae149c31c49fcc
│ │ │ ├── 0f4d4798761e3b22377802a4f65d671cc599f5bc
│ │ │ ├── 0f8c3f4536b04982fddba495fdcbd0e0f3a1d7f1
│ │ │ ├── 0f8ef6ceeb4575960e48768d1922b8edf6e3fa32
│ │ │ ├── 100e11e18e90aef99bfddd387410cf2fa4818d5a
│ │ │ ├── 102de67398c19f4e6a005a8c449804649980bb0c
│ │ │ ├── 10419474c409fa2fd3722f442d9bb46da65345f9
│ │ │ ├── 10c31059672334441abfdeac680e4e2de4304a76
│ │ │ ├── 1169ac8565bd7fb55944f116844953320823d94f
│ │ │ ├── 11753bd6f2c47bf942a83e927d8423b4d980a0e3
│ │ │ ├── 11998dd3bcd4a4a4f491f24e63fafeb0cc91ccc7
│ │ │ ├── 11bdc99b0f63030ace38e71a575e2f142776c106
│ │ │ ├── 11ea4a6ae6f7514a942ab236b2f19b03d69ca38a
│ │ │ ├── 122c86de48fba44c550a8178e8d259012eedd6f3
│ │ │ ├── 127795387713509f6438f195606470a6e0a28593
│ │ │ ├── 133a068450f5e152c922fe15d77242f051be147b
│ │ │ ├── 13b90d438f847d5ec84404198ccd2c668d39caf6
│ │ │ ├── 13c4cd92c0ddeca05a3f1969ff6e635cbb48daa3
│ │ │ ├── 13d7aeb13fa900614ccac179c168bc367f77ed3a
│ │ │ ├── 13e0b3f79284872dd909137b79b9aab121e5aaf5
│ │ │ ├── 1473abd4c69e6b819c26c62e58da3cdcaf67d837
│ │ │ ├── 14a784c025fcbaacdf5b292d93d9c22148912a8d
│ │ │ ├── 164d31e4665dac4a7c50c7a898234268a59bdfe4
│ │ │ ├── 16be416073261e157ae4d6237bb2f7d2a7ea73ed
│ │ │ ├── 16ddbff019ea726453626bacea8448a330c9c4f2
│ │ │ ├── 17609db057519c56052a6b97e03467cd986c63d7
│ │ │ ├── 177c418dba6187a60d4432d4b7be87e4bb4e21b0
│ │ │ ├── 17f67a57e371c4103b610735c7d763330a00aeaf
│ │ │ ├── 1941e4f2daab1b2517e8228892a3410a37bd7e46
│ │ │ ├── 19f01f5f555f7d1bf9cfa057f093aa0d2ebaa1d8
│ │ │ ├── 1b5093d4d58c15b9ca1d2d0b39d15deb0701b678
│ │ │ ├── 1b5240f05a456f62196a6655a42112a31c87e3cb
│ │ │ ├── 1b9533a6cc09e74ff6f8b21db0bc74758356f5f5
│ │ │ ├── 1ba5118068e0cc65623997005da16e5b59e1c537
│ │ │ ├── 1d0998bf5f3294d54e2f0bed3b97dc50227fddf8
│ │ │ ├── 1d2c0d38caadde65b0f5c5d31d5ee8c82b990dbf
│ │ │ ├── 1d604d15131607245c7190fb47f68ef642928eda
│ │ │ ├── 1d795f29b3210c92b4998d15961095cec6c3daa8
│ │ │ ├── 1e0e54bfc9b4ed9292d6bcaee332871d1401c48a
│ │ │ ├── 1e240165ac06e426d72c96bf5b988ceeca2d0d64
│ │ │ ├── 1e46adbd6d1a371753fe9cb54531117a2bfe5dbb
│ │ │ ├── 1e929822d3d0af01e87bb6ece1f3cf55a1824eca
│ │ │ ├── 1ed7a963b9d0ab0be7b9cbbe9fc464d2197d9596
│ │ │ ├── 1f307ee9413c655e3f8f6eca2936610ecfaa4a62
│ │ │ ├── 203ad8c3d24ed2b95f1c54efca7219926cf2a4e8
│ │ │ ├── 2041e9871a0900c21d1cc7fef0b8f2849e39b61b
│ │ │ ├── 20afe24e09c20f3189feeccb6cf96d8f8d9b0c8f
│ │ │ ├── 20c66d1de2498367b54abc8b34835f0741008f8d
│ │ │ ├── 21669358d7c680879ff9364d1048904909c74cb9
│ │ │ ├── 21ab874329347c871cc50797eb1c3c9796d6292e
│ │ │ ├── 21add77b6c7cd3538fda81ad2bbd29f87a2620d5
│ │ │ ├── 22412656e02124c40f221ab6e4b86cb2231215b3
│ │ │ ├── 22aea63fac472d5a41ecb29bbd7aad87e09c2bed
│ │ │ ├── 230b827f7b146154efc74fbb499ef01b98421bba
│ │ │ ├── 239526fa9fb88552fd042d5cedade76ad87bf668
│ │ │ ├── 23ec706911a6c7ce8ef2f0815216017585c884fd
│ │ │ ├── 2416b12c35a58e5f6cf2bc0d33ad4119f8208714
│ │ │ ├── 24b39b83b851decd681c0cf32674165fe0d9a459
│ │ │ ├── 24d6a77a6733b19bf989312d68947e2f23175712
│ │ │ ├── 2525155115bdabf0ffc9ac52636cd96a48392ece
│ │ │ ├── 25a34c3926334064f5e408e685a3970dc29d4530
│ │ │ ├── 25ea286ad8f6bcbc8d84b6d39d797022ebdb8bd6
│ │ │ ├── 268cb5feaab4c2cffc58a8ce34f4e9ec1076d346
│ │ │ ├── 26c3633ff195ba92703a94255bdb71a5773941f9
│ │ │ ├── 26d3480758cdb45d4cba357a20a1dfc2790d2011
│ │ │ ├── 27231ca04108bf0abc8f938e0be23caa04138a16
│ │ │ ├── 27b43df0849b581ac289cc97a9eeea4627f6b536
│ │ │ ├── 2875ec3c850d5bfa533f03593741f3e8b02f8976
│ │ │ ├── 287bbdcd78dcf41eeba74c712aa64d1e72e59722
│ │ │ ├── 28a19e246af1ec41c7be5536c2f5ac5c6a983062
│ │ │ ├── 29251f8289ddd241bc10dcfbc86ed2798ee21ed7
│ │ │ ├── 2976ddb6d0b80a1a837ffddcaa166b0232f21365
│ │ │ ├── 29e6e350d5cf6d7485b833453b0933ae5e3312af
│ │ │ ├── 29ec07fa166761417d3f0cc90f257aba54913fe2
│ │ │ ├── 2a4d17aaa5b878324d4dada62078eb5bcd30390d
│ │ │ ├── 2a79f4b1fffda7f8f49a6381592eb8e69f310ffe
│ │ │ ├── 2b01ec9c9fa0b9629668859fa34f0d91696fe722
│ │ │ ├── 2b3062597e4f152fc18a4d9c921ffb5606df4abb
│ │ │ ├── 2b3c06aba8cc78835e762549ec820163359b6a88
│ │ │ ├── 2c8ba38156cdef21c8957962206fe55587e19eda
│ │ │ ├── 2d2ff2a416896e4bf56802e48f8b10ef92f2b0e5
│ │ │ ├── 2d567df1c44f25183d12c4d01fa643a53d7ab882
│ │ │ ├── 2db55391b534bf60bd1a7fe5e57b47e076bdd6fc
│ │ │ ├── 2de57a842c980af0a5a151abe5dc4b4a39fa4914
│ │ │ ├── 2e28a4dbc25c4c167a652aee4a0ee17f2df3d68e
│ │ │ ├── 2f2cd4041df50a1f1c1079d794120e319593d206
│ │ │ ├── 3002e6a38615dba6707d067201b266e97f570ce3
│ │ │ ├── 301b98f6226eb94900b3298e52ce836a2b5f9c7e
│ │ │ ├── 304ac5151bd929a2493c447929940ee3bbc82ac9
│ │ │ ├── 309f68f7f6d8bbfb1083c7af85cacac745963a0c
│ │ │ ├── 30ff90f65551a04e66647131a5be1b8c93460fa5
│ │ │ ├── 3148473f4151375c89a451957f5e642aced41a02
│ │ │ ├── 3198d0a3307252998190295f24ece2781410e22c
│ │ │ ├── 319c2ea89e984ac71a721c2627f8b5ce00057137
│ │ │ ├── 31f62ff813b3cf96a8892c8137eb8b27b6e8b218
│ │ │ ├── 3228ca6a52709e88f373d2addc51165da85eb3d0
│ │ │ ├── 32426ae8b9cedbe6a9446d1326af23a3c355b75d
│ │ │ ├── 332db572dc7cbd2709b77a72cbbb51c9ba364102
│ │ │ ├── 339d328ce6bf504dc97bb9ee6a69a26cda41c822
│ │ │ ├── 3537b90488fb5111ed11d64744cabd7c60095509
│ │ │ ├── 3573257015a88f25ae77de7f57e0df27427a9cf0
│ │ │ ├── 357aba0219f2776835e1477727773ef612d7eb48
│ │ │ ├── 36049973a1f4a75718cc31628f76a4d5758067fa
│ │ │ ├── 36100ee124a2a50372dd07ff5510988a714fd976
│ │ │ ├── 3614beb438b5f7ea8ea3ca0eb0427a96118e5fc8
│ │ │ ├── 3695de95c7fe216bb593b55d0698dd1d8db6187f
│ │ │ ├── 36d47029fdd453f2e67bfc853afb27a6eb0d3285
│ │ │ ├── 36dd7ae6d968c4f076c5c3a2e4636f8aafae2333
│ │ │ ├── 3740698a7c95b2dbb5c188bad6a4b2e6c707700d
│ │ │ ├── 379ac14a36f79271152bdb32d5ff97af15a3b927
│ │ │ ├── 379d07f6ec3d90d77087fecc52beca5d61d1e5eb
│ │ │ ├── 382b5b2a524662d5312aaebb292ec182ffeec9be
│ │ │ ├── 382be6f01d1d28596ab17d7f289eca9c1684c596
│ │ │ ├── 39662d0f04fe41cf60e4acc443ad008ed6171a44
│ │ │ ├── 39ca1b279e58a4929fe9a74be2007303392fca30
│ │ │ ├── 3a598f0941ecdae1f9f7cb684a3d8a62d5b4e20e
│ │ │ ├── 3ade7cb5c75cb09d1e88192837abad8752eec86b
│ │ │ ├── 3ba643b8551327e49fd92a84c4ec88b7f6f0dd44
│ │ │ ├── 3c6a9b72f07780aba7417fc869fe1d569b7d82ea
│ │ │ ├── 3c6f5979828b97cc53c9a56cb1e1db592b78e53b
│ │ │ ├── 3d9c1b9063e0fa0acb69e40f44cd6e9cb697c2d8
│ │ │ ├── 3ec526cd33988c6ca1bfb478dd41a825a2682099
│ │ │ ├── 4042b44ed3cad867be65b2b3abbad61aa1237fab
│ │ │ ├── 409bfb8018bc0745a5d175f20310e028339f1efa
│ │ │ ├── 40d296fc879e459abf043d95d3bc418171b3a940
│ │ │ ├── 4269debcccf2bf7fe5b2ccced25b050c3de4eb4a
│ │ │ ├── 427047772ab9443bc3dfb08f04f92078036a7921
│ │ │ ├── 42799da2a526c667849c9f80d2639ed18afb4655
│ │ │ ├── 428318a9161667858f1052893232d7b2b97413f5
│ │ │ ├── 428d56e4bdcd603e9a420d42cd9d87fd3698ef0d
│ │ │ ├── 42a8926d4aca7af9a89f7c9887dcc4a0b826a9ae
│ │ │ ├── 42b74fe1c2f685eaa75e5754a1e299a7f1bd4ff4
│ │ │ ├── 433b74a89d4326c00b6b94d429e955a42ad8e31c
│ │ │ ├── 43555b46cbad682b2ad2453e8a9c5e7f04c54d2e
│ │ │ ├── 4372b9927b399caa67c70c2013542e2f41cd1a65
│ │ │ ├── 43e24f6f8e7f1c57dd64341a0e7444d662444207
│ │ │ ├── 441197650f760dfb1d8b71a8051b8c18f250ee3b
│ │ │ ├── 441a15790e2db2a6fe37a3b7e81efdb3fb93c181
│ │ │ ├── 44611aeb2932decb94947ce84884a85f46cd1e81
│ │ │ ├── 449a14b52ddac6234f42f0a57afeaebb91e16f8a
│ │ │ ├── 452165df1d481a22844524d865860d95f114bbe0
│ │ │ ├── 452c8bcfc282943572edf9c501ab3a7db90d38a1
│ │ │ ├── 4574094cc40ae5857be7497c55337f0962ee36cb
│ │ │ ├── 46072e2f2903f313fb9cec9c2804b540cc9366ff
│ │ │ ├── 46766dd1c00f157d9cec6f572695f576e543c2e3
│ │ │ ├── 4699a81d6545fd3f1b6a6b0bd2fa37c151ccebee
│ │ │ ├── 46fc15ffaa27d219c79b4e04e1d3bed57ced6b20
│ │ │ ├── 485038440d0668c1aaa22297ea0cf2a8cd9b3c10
│ │ │ ├── 48575e19775bbdb4f205834177f43aa2aa7e0bf0
│ │ │ ├── 48965d15ed0cad583de8932b25ef8f4449781776
│ │ │ ├── 48b85790304e38684d3af8a8c224bd9a042f4d2e
│ │ │ ├── 499a2c4900331ff8524c82519b4896fd2ef61260
│ │ │ ├── 49c9110f2cc510cc9bf5622a72d8af93f9f490d3
│ │ │ ├── 49eb088df1c0213d0571cb3b4d4c10dfb8a17d22
│ │ │ ├── 4b16f20d875ee62437f98f764a60837ccad04d67
│ │ │ ├── 4b3424a592851f293ede2598a1383378ea1aec32
│ │ │ ├── 4b3c4c32c0afe69f9267d37aeb4ddb9f23d9f831
│ │ │ ├── 4b7ac14ee45f248670e5b60ea7f2ed11c9814de1
│ │ │ ├── 4b87a4c4ac4369436563699edae5fe05f5255ae4
│ │ │ ├── 4c07483a54322821ef37e901ef292abad8a0ac45
│ │ │ ├── 4c1f60820adea360d6744ec3015fc5a5b3cf44a9
│ │ │ ├── 4c8de2670b782581f6a488413441d3629d725d7b
│ │ │ ├── 4d3029550e26ab11c24ed9263253f24e1b80b09f
│ │ │ ├── 4d709845e543a05de79e6886284221c29def3582
│ │ │ ├── 4d90876734d6467078ce0a53bd32c5a266187147
│ │ │ ├── 4ddeb813ef78fdac7c97bddba228482fd25bc2e6
│ │ │ ├── 4deb3ce06076b5df297c47432b7958b548872013
│ │ │ ├── 4e00569ee13d131fd16100e72183447d514f6f4b
│ │ │ ├── 4e0902346bfe0e00d52f0136e358f486eb0c0b02
│ │ │ ├── 4e1ce8cc4c70384799b7f9d5ebdbd235f959e006
│ │ │ ├── 4e1d0daadbf7bac2b99437686261addc61fe5254
│ │ │ ├── 4e2448b98518be4a772271e80220b8b428595acc
│ │ │ ├── 4e336c8f3f71c4b1f28d7e735736e4bc9f43df72
│ │ │ ├── 4e7cb4229ea37c1668a501eaea91db8ef3c43791
│ │ │ ├── 4e993b0603ab8fe1f4c8d29da8431d95ca6c3084
│ │ │ ├── 4ec5709697ada3937dab609bef1d8a31b5ae23b8
│ │ │ ├── 4f142d24a348fb515ffc2780b8eaa0a516fdf127
│ │ │ ├── 4f4778e0733274b7c6ad682ddf14ea8c16f2ef0e
│ │ │ ├── 4fa058323a75ff8fc7cfd90ca541fee04c6cb2d7
│ │ │ ├── 504470cd8f7bf2dc8d7a0e5b003021e64516efac
│ │ │ ├── 50fe2ceb92af23261e875ed01826e741eba1a508
│ │ │ ├── 510180fc3d3a8787122a2a8e0eb77e19f8ded778
│ │ │ ├── 5101a4d44468e13c1a7082cf174905f1c502720b
│ │ │ ├── 513515d1099a377df9a322cc935a4eac64e3afe2
│ │ │ ├── 51e4c4e6fe9e7893e6fac8ddc3d9c721b584836f
│ │ │ ├── 520da703d89547179cf5d5005af301aedd48f0df
│ │ │ ├── 52538a80094f7b62948fd31e68fd17a315d8dc91
│ │ │ ├── 52dbd1356f67e9955d7c890513ce755c03e154e0
│ │ │ ├── 53990ce2d039990f315fdd12e7dbe935f4ae80b1
│ │ │ ├── 5456c85e0f9122c697b49af2a55e7be2e616d13c
│ │ │ ├── 5474ccf7a2a09b3e9ee76056a02ef805a6a8afad
│ │ │ ├── 54751d23220f4a9a2cb2af6d81a6c0b78efe29da
│ │ │ ├── 54a04e5bd46ecdf0c89d635c6699f792062c9c1f
│ │ │ ├── 54a8479e80b6e9f44ac94a3116f4d6a6698bc385
│ │ │ ├── 54b4b27f941530c8d99fa5acb1c4279a40ec89d1
│ │ │ ├── 54b8cf23f97a0a8653e76a77b6339978f29b2913
│ │ │ ├── 55211ab855e3324421c43de5ba1bd303835191f5
│ │ │ ├── 554adab66bd761d22e1f80688b0c1c94655f596d
│ │ │ ├── 556a567923dc545008d00b20e423161f7b77f844
│ │ │ ├── 556ab00ca2915a7ad40627ec3b677e1e0d69a8d4
│ │ │ ├── 5647912a2a730fef4bd72008bbd3ae8a4b4cea28
│ │ │ ├── 565d672522bf3bfa87303c8384c509f8e9008d16
│ │ │ ├── 569036e0286f21311ee642e55f1ab5cd56c3eef7
│ │ │ ├── 56fb9b0e0009a18c46cca42c83e80e90b67ca42a
│ │ │ ├── 579ff37ba7a2a0396cd49cd39339059fc1058ac1
│ │ │ ├── 57af1adf905bd626e4efcaf4206321e2854f31d1
│ │ │ ├── 57fc82b551066775c7f282c95e095aa2f021742e
│ │ │ ├── 581fe26978404a3f91480892cc6e0a93587f65b1
│ │ │ ├── 584deda9d567440f94450c96e2dfe3785f4a5b58
│ │ │ ├── 584e7cddfa65cff9e79016b6bd88c264cd5a3e81
│ │ │ ├── 58dd46c7b7e29ed161748cee396c6cd9b257ba1e
│ │ │ ├── 5920b65dd6ef91f2fccb47f4e14a530e642ee7ff
│ │ │ ├── 5a97272b7d8c6696d5467a81860a56442edc55ba
│ │ │ ├── 5b46ef96e0aeb6fb920debab2fda4d7e2e18a9d4
│ │ │ ├── 5b5b8a7d127cbfb7a81053b6d42937ca22d863fb
│ │ │ ├── 5b8cb089503bbbbb0f16fbb7b9a3d14c7f4e1dc9
│ │ │ ├── 5bb94cf0f6a09a3903174beb48a9f0f476deb432
│ │ │ ├── 5c7efe3ff1c48d0b31ad0240e8d2eef741e8ea00
│ │ │ ├── 5ca281e388239fa11ae5221405e4fd45b6664988
│ │ │ ├── 5d5a3d37a3961843713492135fc79e291b557320
│ │ │ ├── 5d80c559786de1d7146c050d427d71ba2dfe28c5
│ │ │ ├── 5da4538d235f8a8c407a6c778e34f9446921c94a
│ │ │ ├── 5e0a1885f82018ff61aed44a6bc0000776b317ff
│ │ │ ├── 5e0b67fb32bdc62a0ae6909655ec0ab606c7fda8
│ │ │ ├── 5e1da251e72e1d34a8c67880b95582886aaec63c
│ │ │ ├── 5ed232e400d7eda3669fb1303b2c903d185cf16d
│ │ │ ├── 5ee8a9469aea9d04f2952fb2ab16229bb25dd2e2
│ │ │ ├── 5fc8db6df5eaac951383c7d0d280c7ad7100948a
│ │ │ ├── 5fe852bb97f1f23d93356747a0c81dc19f23f7f2
│ │ │ ├── 6015bcdd476e7ad7d6abc91529518c2940536eae
│ │ │ ├── 60441bafdaffc96e85e7829b5c724832fb2016f1
│ │ │ ├── 610459f39b152746ab7fc908fd561d1c275916bc
│ │ │ ├── 61092787097b097f2810540fe9a6ccbfb2c21d3f
│ │ │ ├── 616af2c72952a0cbabe41b89c8d8ad7a65a6f910
│ │ │ ├── 61913c80f21dfb15af692a5a20d3a3559c42fdac
│ │ │ ├── 61b02d843ba15be565155e93240d17c90e89cfd3
│ │ │ ├── 62057f7f4b746ea55ffcd2a3492f6cc9f4737a76
│ │ │ ├── 628bd51c21da12f35f54d41238176b73bb96705e
│ │ │ ├── 62adca98f24a79e53293b1c2ec2b31b786e6d9dd
│ │ │ ├── 6304236c77813b82c40bcdd347b72e50b0c6124c
│ │ │ ├── 6324c808a0938ae2be8191ca127f2963fcb6a380
│ │ │ ├── 640a30b8dcbd912c4a5f08a09d22d2899d6bd1ad
│ │ │ ├── 643a358aad07a194304f73749bc7abf019386a71
│ │ │ ├── 649f29e6d309c56be143374da3fe4707d0acd2bc
│ │ │ ├── 64d866f85bb41e730ebf0430712cd3080b461901
│ │ │ ├── 65a4003601de2648fd5ddfc31272d5afc9ebbef3
│ │ │ ├── 660cb2f2bd9c2bd055fe347ff0db8a9088ef34cb
│ │ │ ├── 660f96e959e9606151d07da64b5aeb8089226385
│ │ │ ├── 6684f6de14114257b14c24d5aaea5392cf2e7ddb
│ │ │ ├── 67d8a7cf745fe96dd40461b53be47723918fc266
│ │ │ ├── 68d726a9e9dd4356b92ae1c44c444ab50f1247c4
│ │ │ ├── 697b3e53265ec7cb55374939f3d2fde8e7a062aa
│ │ │ ├── 6988ce7dc0962d217a67842bf1c25f3d1b9c27c6
│ │ │ ├── 69f747e052f19f282dcf958eb79463fa04052d00
│ │ │ ├── 6a0d2126620d2e7d8ef022508c912164edaf46d7
│ │ │ ├── 6a4c6b5bc1e053cd67e0b150a6a4006d08e700c6
│ │ │ ├── 6a8b66a1a641b009e9d31ba69a37c21de3a2a633
│ │ │ ├── 6ad29cd6fad098073489f0f285c2e932a133e6be
│ │ │ ├── 6b516c99b2ad2cdedb4657057e5a822135785b72
│ │ │ ├── 6bc069dc69e391e0844ab6c2f1eae9e71b52adef
│ │ │ ├── 6c4cc19e3cb2d3b7a4c42470ddb4743e1991c3bf
│ │ │ ├── 6cad14d6ba4ad224f24fc5af52f739306774467a
│ │ │ ├── 6caedf88b909a3687bed7e6f2de663eba117fad6
│ │ │ ├── 6cb4917ff7f98737b4689f76eaa73ba7202f9edf
│ │ │ ├── 6cd5f10b61707e5bf70ca7128c73f440d06198f6
│ │ │ ├── 6d09033d9cabf4be617ebcd83cd8170e7f91720a
│ │ │ ├── 6d7687261b3c078692025e736ad98e4c10786edf
│ │ │ ├── 6de782f76901615b5f826486792374a1d079c9f9
│ │ │ ├── 6e3c418de737bb95e359f12ab08d26944b66177b
│ │ │ ├── 6e6ee01efe2d52ea83543ff667d295a6822dee13
│ │ │ ├── 6ea5470e09fb6a7f940173ba39ce2435da079764
│ │ │ ├── 6efaabc057d7700101674d59d153eae693cad97d
│ │ │ ├── 6effb23ea176ed837ee37fef015335aef773770b
│ │ │ ├── 6f50acac9e00b8220e530af28dec14013af9a8ac
│ │ │ ├── 70668c6747e6239d25b0c3831f37b0eb6bf89f14
│ │ │ ├── 70ab7ec66a4833b7a8d845e2fb83397401ad880d
│ │ │ ├── 710ef688a36091e80e2f4e0a80ea58d97d0f8015
│ │ │ ├── 713a3a9aecb903c8787528d5a79250a4237386b7
│ │ │ ├── 7169a6a3b0f42d8789606d95ad8ef5542da8fa3c
│ │ │ ├── 716ebad71df39a15e6426ebee8fbeb807d5f120a
│ │ │ ├── 71c52f451d4f3cabd2ed1ae0e8a44d232ccbb98d
│ │ │ ├── 724689585f79bfce7227e9ff46b9c793628a41df
│ │ │ ├── 72796aa746723cd8eecbb6cd55a889c882a862f7
│ │ │ ├── 732d67a2a02087a80db9981c3bd7d4ea286be612
│ │ │ ├── 73711d3d171c8921c3275388c94ecef8b974c3af
│ │ │ ├── 7374ff896cf9e1e2180857e6568e04cbb0e42355
│ │ │ ├── 73d3830cad0da70a1e6723738bbf2bb05965b9d7
│ │ │ ├── 7403b6b2569af9b24cc27a434af590ad093eebc4
│ │ │ ├── 742ff2eb44c77eab9693d1f821441fb7a77b3417
│ │ │ ├── 74365c85a2d7853d329d7eb633baac8a760d4d0a
│ │ │ ├── 74a5d2bb67bce5fe703966e279cf8d43a314ce9f
│ │ │ ├── 74bbef64948e7326f88bc6e9694b20506397f318
│ │ │ ├── 74f48ea3c32889fb7167b4b565f1c21b36c822ec
│ │ │ ├── 758ba106d8862133b796fdc744b9c329a676f934
│ │ │ ├── 75b6ef00f7edce54f7cfaebe0e10bfdab5011c66
│ │ │ ├── 76837f99cfce3ead17613efc0bad395f25589b16
│ │ │ ├── 7719bfbb3f025293bb93bf60b165870032ea35e2
│ │ │ ├── 782f204620f8e221fd845c533714a19a7e46df2c
│ │ │ ├── 784365c00db3ddeeadef176ee94879c68b14b787
│ │ │ ├── 784b7574b9eedc3ca95b002dec48e340814895ae
│ │ │ ├── 787bef1f01133454c80c267bded9d23a84b7b8a2
│ │ │ ├── 78a41a9a37c7c4590e4bde6fd79b2fa70a38bdb7
│ │ │ ├── 78bd32491cd0ac520b77015ea30e5c75a8f84429
│ │ │ ├── 78dda6b7de17128e83981c402a22cd0e50be48a0
│ │ │ ├── 78e97a98d33c22761504388afcee0d08fcfb5ade
│ │ │ ├── 79182da8210a8fdbf2b68c917e4933649f909c7f
│ │ │ ├── 7a3c10f200169c23dbeb8dae5a30fc630609230d
│ │ │ ├── 7a4c5c1e2ce5b74bf3bfe8be97945324021653ac
│ │ │ ├── 7a6d5f1c07389c2aceeb656f71bed868f627bffd
│ │ │ ├── 7b3cb78c9025cb13d05ede3cc1452684e245c17e
│ │ │ ├── 7b7159c797fdfaf9dc74196fb89cb52f25a7adf4
│ │ │ ├── 7bb8b06810878b845db7df1b91dc6da3994977f2
│ │ │ ├── 7bc07e975e6c73145f5db8730f4ffa31ad59c91c
│ │ │ ├── 7bd946a7246a94596627cd6f52b32bcc66ad34d3
│ │ │ ├── 7cb8572bfd73f6eb28e71760109f9f42f6b85ddb
│ │ │ ├── 7d34f50cd9e7fa59648791f74f7d855e176841bc
│ │ │ ├── 7d777a28e2e746ee4b312e023359f77371d39e8b
│ │ │ ├── 7d79863c79498d40598a5e4702b0c0fbc7ea3522
│ │ │ ├── 7d82716fc549770ea238f33afcdf587a4a6ef094
│ │ │ ├── 7da7fff00496deee0597b96381d5e86530a3b6bd
│ │ │ ├── 7dd8f637aaac677acf60e447c616d316a34c3c7f
│ │ │ ├── 7ee593e5f8417c135df1a3528071a9a95ca1ef33
│ │ │ ├── 8042f6183191d50c517b19f2cca1e4dea4f233a6
│ │ │ ├── 8302aa9c3c919be795d8fa7e097e9b36b1a526b4
│ │ │ ├── 832395932e2077c4bcfbe321a0e69b96eed8eb56
│ │ │ ├── 8327f443cea100b3e3d7544a394f0aa97f7e67e9
│ │ │ ├── 83499305223354f109689e810ad6433353ab7b7e
│ │ │ ├── 834b65a2b430c361564247f14c07fd0417f4ec0e
│ │ │ ├── 83982e108c25bdfbe7bf9df120b01b017edc99fd
│ │ │ ├── 8530d96dbaab21b5cb89a9a4f3e5ecc24d34dd4a
│ │ │ ├── 858a0bb6cca360d648836af113493e5cb9c72e87
│ │ │ ├── 86260d35e3da20d5d963e9d97ec9fa07c3944f85
│ │ │ ├── 867de66c12050cab7f27ffcaed62d206ead86a07
│ │ │ ├── 86c2be25e3aa317e7fe258f937e5ecb24a56df7e
│ │ │ ├── 86f46800fcb248ee5491ca6e2ed0d5272089e097
│ │ │ ├── 876d3df1c7fbd3d7ab7060d8b21f5a24608f8834
│ │ │ ├── 87c142e6dbe2bf864e41a3fd30eebfeee462c859
│ │ │ ├── 87c427a3c18694295a1e1eb98a466cbfe5233bdc
│ │ │ ├── 8871a83f5ab7e11d7e6d5bc565bf7e16fac55e07
│ │ │ ├── 89465a62d788e0416ae5a18c432922ecc2f82586
│ │ │ ├── 89666efa3860d6b363032ebb08582c27c6bbf92e
│ │ │ ├── 8995ace4d2a585ae1cc09a0fe9df2086ccb35bbc
│ │ │ ├── 89cd4937308c9f227e8640d82443e7140903c40b
│ │ │ ├── 89d5a18c29c5fb4f302dd1a66f7d2dcddeb05bcb
│ │ │ ├── 89f94d31f2d07f381755b3eb056eaeae9330214b
│ │ │ ├── 8a388e1539969c89626324a745ff2dc9f04a7b5d
│ │ │ ├── 8b3240f1529d802f0d324dbeb763345268ca6bce
│ │ │ ├── 8b5df3dcd97d8b61f24e32d0c93d1cae1d2412c6
│ │ │ ├── 8c3b2998352c86b2c5a2d533505702b030a7a714
│ │ │ ├── 8c9fd3af435b774b2e29cbbc998ed13cc4cc9d30
│ │ │ ├── 8cdde7778317e44343bb62676a829f2344af0d4b
│ │ │ ├── 8dcccf9789de7940b8da2a4fb72cc3c0045f9e2f
│ │ │ ├── 8ed500417bc0759eac097c05452015682d95aefd
│ │ │ ├── 8f053af99d6f3a8bd9ab6f1b7c92ae716067621d
│ │ │ ├── 8f0762ac155915383ac3a4aa57ce505a6ba1ddda
│ │ │ ├── 8f381a9e72dfd509f8b954694209b995eeff44f9
│ │ │ ├── 90158b44f31d06842c84bc1c7a3d497c7299cdb1
│ │ │ ├── 915f6dffb84e2d22116a35f0a7548ff7f7ebb34e
│ │ │ ├── 9174de4e1244c842d3a525f3b6e0ad4dec6a6bbf
│ │ │ ├── 919a5121a02bd236524270348b80c8a9ef4f9016
│ │ │ ├── 91df26877302e61d6c9c74680d31819bf4734b5b
│ │ │ ├── 91f3907a9a2e338390369b85f2c08cb637efe490
│ │ │ ├── 923ae25cf6fb6c12bf387768ed9d322961b482d3
│ │ │ ├── 92bde2a68fe52cec6f408f4893b2839965ab7f26
│ │ │ ├── 94942fd41a45620f11445689c9c0e26875a8670c
│ │ │ ├── 94e45c086de1f26c3c508cd6f2769acd1ee01b1f
│ │ │ ├── 9504204421c79d86bf9ab74e0c2325108769dfcb
│ │ │ ├── 95954ab3b04f06b44fb1d9aa7111bb605e9d8f9a
│ │ │ ├── 95a1ecabb5341f7a71aa2287a8203671d46d78ea
│ │ │ ├── 95e1f321074fcb8dfe56f5a81a1410bdf519dd9a
│ │ │ ├── 96e56455926c351e30ae478806d41c24b3354e17
│ │ │ ├── 973e367691bd09020945af67212b2cfa33b49015
│ │ │ ├── 97b0457b9ebb10fa5556a22324d6e8cb95304bea
│ │ │ ├── 97c60a69a473b71aa20dcbdc2687f7a3e5292327
│ │ │ ├── 97d5d89ccaf2b5b903aeacc4153b2cc0dbf8d418
│ │ │ ├── 98860ae490b8bf793e02028d343e5b60847cf914
│ │ │ ├── 99171b75e79357f439de0d37e9f32587dc83bc7a
│ │ │ ├── 994b04cdb8796a09a443e1b61c2b681a5f2cf397
│ │ │ ├── 9962ffe3158e1ec1ca3765c58c0efb1533d6da21
│ │ │ ├── 99d80fc915cb7ba0872a430a7c7e6806e57bb404
│ │ │ ├── 99dd852825212afd117611496428a73afd4f8877
│ │ │ ├── 9a04367fb0bb38242ed10f7df6fe25d3170bacfe
│ │ │ ├── 9a14d12a2916cbdda3f7a76e499d8a19adc386d1
│ │ │ ├── 9a1a10e5564fa24cca6ac2695be5d59adf677059
│ │ │ ├── 9a305e54486dfd6afe111a0629cb937730a87904
│ │ │ ├── 9ad1c85642ce7d0282c216f3eb119bf09123c256
│ │ │ ├── 9ad44a7cc1ac94fef7251874ada4b735abea9258
│ │ │ ├── 9b4690aaa827ea250692cf2128aa800d6bccf62d
│ │ │ ├── 9b565f81f5b39e3ee3adbeb3a7eb4d045e800de7
│ │ │ ├── 9c89f04583870011cd40ef3cb91afeae135a6376
│ │ │ ├── 9ce87d3bc5c6c08ddb22ec2642ea0b51fab07dea
│ │ │ ├── 9cedbbc9560b4ee94f5b58034399f2df0b726a43
│ │ │ ├── 9d1c553021d84ea112a4c87d87c8820a1a53fb99
│ │ │ ├── 9dc566abf2c1de513225a2b41a180bdb54695a18
│ │ │ ├── 9e4e3dad9e8a70dbb9030fbe9abe728878f428b2
│ │ │ ├── 9ed2a017d9c247fbcffef78d503f547fb75ad03c
│ │ │ ├── a00f43061aedaa2fe0329c3b9d5480ac09bb2540
│ │ │ ├── a07153103605dad615da561e217a97ea2a41066b
│ │ │ ├── a163b3c5c76f8ffc778c797f8f39d04deda502bf
│ │ │ ├── a1bceb3f2471530ff4b223513a6492952a91b560
│ │ │ ├── a1de2762e5677ed7e8d15649ddc34c0234c83631
│ │ │ ├── a1eaa0d342c788a63684201a0c04e717c231518d
│ │ │ ├── a1f2de7419b6b1835e385a1c577d7c9b0e91a070
│ │ │ ├── a2217b454980304d34aeb4330be660d404591a07
│ │ │ ├── a287954e6e5b27a39605ec546cae0465cb46a153
│ │ │ ├── a2c076551da52dd4f649aa895cd8932111e9e63d
│ │ │ ├── a2e0383d97e50c42b11a2bed5d6b15451d700169
│ │ │ ├── a39c710f8869c2c7a500567add7377b73ec38ced
│ │ │ ├── a3ea7b6bb647d7e090ce2f5d0765c181a9939bc9
│ │ │ ├── a4282544294e425888399a2ea2764171313d4974
│ │ │ ├── a4977e949113ffcaa120bf5c2c15cbe3f814281f
│ │ │ ├── a49a50ddb59e79ee314d3ff287cc5ad2fc30053d
│ │ │ ├── a4f9c60cf2848daa71ac376a77f06f2283995c6b
│ │ │ ├── a50a8cf2901172f9aff84f90dee2b1a7996c217c
│ │ │ ├── a538313afb2c5c2b31587b019784140e03a3e4c4
│ │ │ ├── a5b8d2524b9a87fee6d807eb4e5d0e8094df3e6a
│ │ │ ├── a5e4f0b8eb4cb8e35873b6ed0a6fbf19f24b4c8b
│ │ │ ├── a5ffeb5367ee3ca15fe331307a552aa992eab14c
│ │ │ ├── a643885583858b65956d4c079e9729aa0badc2eb
│ │ │ ├── a65699c36349e4a348ac3676b2cd40ab3831d7bd
│ │ │ ├── a6cdc437ed07145956b0acc22e3f807ff193b166
│ │ │ ├── a6d2fdb9e0b8b54224041af5f4d6cec6bb495864
│ │ │ ├── a797d99563354de82a0363fccb81d8d1f8c6db3d
│ │ │ ├── a7ad073edbb9716ea35c6ba35a2f2dd713176b5c
│ │ │ ├── a7b91921bd13b5e10ab78df3ffe0c7c10cc24335
│ │ │ ├── a7da30cfa275e806276170b06a2639e7f3056eb4
│ │ │ ├── a8124c3e10583c041a3a4ed57f01847a63b7a602
│ │ │ ├── a81a6e988c4ee8b13dfc4c138c10d0d691696436
│ │ │ ├── a83adb85ea3c8ec19632d1e32ecc4f29bd03a83d
│ │ │ ├── a88dcdeb8677ac47ab41100ee3cafbf761304f50
│ │ │ ├── a8e3f7728e3d2e68777f9644059d77bdec734f96
│ │ │ ├── a9c25546080c9e3f21444b9bb85307237575397f
│ │ │ ├── a9d6656c96286a8e57760ce7b3f531813f768fdf
│ │ │ ├── a9f96f0d3de3a8b3527c88cb7032b15d21dfa529
│ │ │ ├── aa321af63767617d7eadcb848632419ec1337eca
│ │ │ ├── aae23e0506d5ca1f366ddd73363596def41a317d
│ │ │ ├── aafd6890588360d13a880c648ed3f99a0b00c947
│ │ │ ├── ab06a492895bca9a17b4247176a9816cb77c42ea
│ │ │ ├── abab9ef901874017084bd70731e94a81f38266fd
│ │ │ ├── abe5d3f6ad1ea48451769ccd97dfd54417dca246
│ │ │ ├── ac6f976a02f772a5b77383c045345a53407a5a2a
│ │ │ ├── ac9231da4082430afe8f4d40127814c613648d8e
│ │ │ ├── acb9292a6206e1509d50ec609c1f7336680ef085
│ │ │ ├── acf0a1444aa952d5d1d4d93e527b4d99dedb6ae4
│ │ │ ├── ad69cfd3840f3d4f63521f7d8c4d1dbd86ee73aa
│ │ │ ├── adcc6b9ee1c4fa4e55073aaf24e083c79625607f
│ │ │ ├── ade3414dceaa05fe553d3eb58f5638facacf1f37
│ │ │ ├── ae4b98d274e95e80e9033735e1b789c9e646c76f
│ │ │ ├── af1e878b381a6158f8484871a781417a385c483a
│ │ │ ├── af35c68d54bdc3dfbd31d5a261c54eb1ebe0ff13
│ │ │ ├── afc962563a90cc808cc0723955668c21c30a1558
│ │ │ ├── b0195a042e9d44af095b49c72973e28e6f882ff2
│ │ │ ├── b0305bbb4d23d04f342138f14950504d3382565a
│ │ │ ├── b033b6a1c628fbf57f7951efa06932b15a973677
│ │ │ ├── b03447d4aecb11bd1e393f94a07cd165ca6c2eeb
│ │ │ ├── b069320688cf4c2afd5026b9fb9699f4c05e29e0
│ │ │ ├── b07ee0407f08af27d04616e8720253d66ceff1ba
│ │ │ ├── b0c5a61cfad8e318f58b1c7e225ed4bc0f9f1664
│ │ │ ├── b1d734b380455bb03636c28ed76dbe22c0e5e7b8
│ │ │ ├── b1ee1439d260ef21725d1583bc60752962366bf9
│ │ │ ├── b35535ff7253075d1326ddf6c76a361f589ce2ac
│ │ │ ├── b4225bb3a7997b6294c86bd33000b8d003bcbdcd
│ │ │ ├── b55362f5beff62935c5ab1e1b63751cf6274b27c
│ │ │ ├── b57f7e45ae6e34d70fd9f4cafe268a1dfcb3366a
│ │ │ ├── b5861f0021541911ba8f4468f333d17c4a093cab
│ │ │ ├── b5c72b3fefed4019f8230b6f41ffeb1e53bcd0a8
│ │ │ ├── b61d9623355d9366eaac9b2f813356cbad186c53
│ │ │ ├── b65427d16947c747930f8c41254c8f82b208b809
│ │ │ ├── b76a04044258bf2be2200ef51befb15a1546c24e
│ │ │ ├── b7ef68da623fe7eb82b37c5174504a0785d220ea
│ │ │ ├── b867a8b4c6a61ac3990ad24cac37a7bab2658d01
│ │ │ ├── b8a7576b0a129f9bea5b0753649b6d2dba23821a
│ │ │ ├── b90a8ce827c794ffcff57b4cfe1f5abf400b11a2
│ │ │ ├── b9283cf754909676119de6e9d7068fca693ee2f5
│ │ │ ├── b9f81fdb3dff6c5f2e3372a751b9d85762da4de3
│ │ │ ├── ba589daf9dc57cde31e624bc71d0ec7c30aaa1c1
│ │ │ ├── ba9b7c993c7288fbf92e15e722249013821ddc0f
│ │ │ ├── bb6f738cee8b2dc602d50a0fcc1130ab9b9c4779
│ │ │ ├── bbd1d16d37130687e0d0c00f88c1f280a9d81285
│ │ │ ├── bc2af85cf2aca92b13eeb42b15170ba9b48c96d4
│ │ │ ├── bc2c18b6c258e4fcdccf8c1ac2fdfda1d4eb8cc4
│ │ │ ├── bc6b2ab18f638e24dfc3f151c7ac092061fd6bb3
│ │ │ ├── bcb62a7698719c210a4b1408f88a04677640a941
│ │ │ ├── bcde3f1434fd198b79c19fe195b47411bd8a932f
│ │ │ ├── bd4d2fc6f65249369eeeaa331d574687c7c8af66
│ │ │ ├── bd83a91a4c5113fdf79b3a081db43aca4baabb73
│ │ │ ├── bed35f66df858e54f500fa0ada906ce811eef63d
│ │ │ ├── bf4a53e81d3b4ba898ee46b4f0ba56bbf37fc24d
│ │ │ ├── bfdd00b14bb8b8c1dfec5afc957d0329489b9d14
│ │ │ ├── c0134a0ba73737ba4d1b352a75a424581487e23a
│ │ │ ├── c0d3e263af320900f7469663843616f87f1e89a0
│ │ │ ├── c12bac8db964d6c557675883e0438b932c149e47
│ │ │ ├── c1e930f8e14b29e898e2b25b80414b834da9c625
│ │ │ ├── c214ed0d8ce473aef4149f3dd6fb4a7c56b07652
│ │ │ ├── c246e86848bdcdb7e6efd53ff829e7461241beab
│ │ │ ├── c28630654de51674777dc02a034685c63e08e3fe
│ │ │ ├── c2ad5674c5ceea9394b352524c84d29e1e50c1d4
│ │ │ ├── c3b57de029f4d72fb7c237c9b76d945f333714ae
│ │ │ ├── c3d0c5be5991a61b137f68e795c800204165a61b
│ │ │ ├── c3e59bfd7526560925725f87234e14bf439a3148
│ │ │ ├── c430d42780616d03117204505c8c9b5249544e41
│ │ │ ├── c5687472935b7d2c620b9813b3071c6680daad33
│ │ │ ├── c59a2872ffd5765130f91a347edc7947aaee368e
│ │ │ ├── c5a7ad6338653009789688ecb424aa5173061654
│ │ │ ├── c60ed14853f958bc523969146aa3e5470aee539e
│ │ │ ├── c63b86ae5e26785524f119b3217ff64612abd695
│ │ │ ├── c6644d36a23fa6e0ccfb11407b564f28aa3bafac
│ │ │ ├── c69b9df749bdac989741911a659c231b7e2870bd
│ │ │ ├── c6a51ac5a63c8bfec69afd60d16c6a75018fdd5e
│ │ │ ├── c6bdb3d2d27e42f2ce1e7644eaa2339f015a566c
│ │ │ ├── c6c848cc77c91d752f79877fddc66e2ea2d5b65b
│ │ │ ├── c71f0c06f1dea80e10953caea132249132966727
│ │ │ ├── c72a780057ce4884a0c07b9b2c167d94dc27e70f
│ │ │ ├── c7e6186b70acf4faa3d5b378bbeebae41a7612d0
│ │ │ ├── c7f913833d93a3a3d5b9e558a91eb267763ec831
│ │ │ ├── c814ee430fd7b3c97e55d47fb8ee6d1e046ba18e
│ │ │ ├── c861985fdcf33fc72a8fa8020c9d5a890746913f
│ │ │ ├── c8fa263ad320cdea6757674446114d8a72765190
│ │ │ ├── c9449fcbc8e2f2385f100bbc393abb2926ed0217
│ │ │ ├── c955448a816b09a29951b149487a184094303bc6
│ │ │ ├── c9c96737a071acb05311fc970bce5babd05c15ea
│ │ │ ├── c9f383eb5a63a954b08e44337c594a88f92f3c84
│ │ │ ├── ca057e187fb8f41e11d80c197bb7b7122e8417f2
│ │ │ ├── cb6e8baa59bd32880d5040dcbe3a3814fefd0b48
│ │ │ ├── cc210b9903feefc7d3947846fff6815484bbee71
│ │ │ ├── cc62e45dfa60e400e8372059e5c32137cab88718
│ │ │ ├── cc9a83aa084653f8e6458cc7dbaea5993540498c
│ │ │ ├── ccfa6efac0df663ad75e535a071aac3d293017fa
│ │ │ ├── cd0f63406664178f5a0c09bcbcf099c88794e574
│ │ │ ├── cde994a19d023ea80e1e16b5c559ecced969d365
│ │ │ ├── ce2d7982406015fab472e6027b37679225c90d05
│ │ │ ├── ce48a2779374d032cc9345fcb07824fefbef8380
│ │ │ ├── cf4a455242308955025435aa9280a00b6ca40765
│ │ │ ├── cf641a0532c2af2670baf32e253db36b52def6e5
│ │ │ ├── cfb98836ef2bdd88f0fd0aad80b049b5b1ede18e
│ │ │ ├── cfd31d004a77ff443fac05132f3ef2cd23dfac30
│ │ │ ├── d0cde1f5672d15a8f1e6fc3536fff9ff16517317
│ │ │ ├── d0d5b0b2490054fdd6c1ea835c0161c071bb67f5
│ │ │ ├── d0ee069c3e7c67ad5883e4f3af33d0bcffe07176
│ │ │ ├── d12d5348234d9cd937ea04c0727ac04cf8e2a744
│ │ │ ├── d1ca5e4c68c5924cfba166defdaa25d6c9639dc1
│ │ │ ├── d1eefc2add53c1bbfee0f516e8f886ee15dbd27c
│ │ │ ├── d207a565a3cf77471549bbb5e7d9a3509e22dbd6
│ │ │ ├── d25f5caac7cf287e64c33789b313c5bf63c1b566
│ │ │ ├── d28d214148e2eec1517be925e0ddddfde112191f
│ │ │ ├── d2df1d23a50cf688ed218d4d18e2b6f169dead9e
│ │ │ ├── d31e368c5e992c173842b84e20d0eef266079a0e
│ │ │ ├── d35d82b76fd5194004654ba71a57469119721193
│ │ │ ├── d35f23ea7873242aececb567ecbe87f3c974ccb0
│ │ │ ├── d36a79d6dd1e28c127acb971bf4343b2437d1012
│ │ │ ├── d3e23c6a2d605cffc13e36248a678e9b663fba9b
│ │ │ ├── d3f3e7339e9f2e2310e822c8f1fe7a240ed981c8
│ │ │ ├── d42531630546640e1fd59dcdbdac9a4a0917f455
│ │ │ ├── d473186592829ef6ee6b886cf171b7b5ec400a41
│ │ │ ├── d4b171c62a463ed9c22397359f71034b68d80c7a
│ │ │ ├── d51ab63c4e1438f6863b3b6cbee513ad6c3d1186
│ │ │ ├── d51b779809ba509d6e9711710a44ce4d5989453b
│ │ │ ├── d550c829f4edc1c532c48b1138975f04ca1d9847
│ │ │ ├── d5c40744bd9274c746eaf830a5dbdf4923ab6124
│ │ │ ├── d602c1032b68d34355844505961383e56b59b428
│ │ │ ├── d675177e33486a72314b91a8dbda8a1cc5500215
│ │ │ ├── d693ed33f7391624ecddea5b9d5297eb8172d87b
│ │ │ ├── d6c36f3a561882ecf556105a644a5503d28653fc
│ │ │ ├── d7455388adc6fa641674211192a8677fea839bc5
│ │ │ ├── d79003e0c97a96f32b0d8c3b3b02ebcaaa94d926
│ │ │ ├── d7da694b051c7401429d0b05216001fb6f50fd05
│ │ │ ├── d7dcf33f17a0b7d6cdb1d7103fdb31113ce69384
│ │ │ ├── d829dfa177d92b2a4e72f3927aadacc0a7889309
│ │ │ ├── d85b07669900fa4f6d04dda3756821a9f73ee351
│ │ │ ├── d91ad057d2e696fee7ac60cc6a1d4e8c33df37db
│ │ │ ├── db2b2cbb9042a2be3a220853d7231db7f6d2a72b
│ │ │ ├── dbc10649b4263e1054b74e3e243f4da0e8649626
│ │ │ ├── dbf5a58cf0cfbf387674323820191e9837860174
│ │ │ ├── dc15fc0e96a718b8c569452cf3ea744117542107
│ │ │ ├── dc5755b294860eda3f0b9c5ef548d0d80affd971
│ │ │ ├── dc65b2dbc07b1faa23cc57e8abc7348b2afc0cba
│ │ │ ├── dc9eb518c0f1a5ad7bc4ed658739555b3850dc07
│ │ │ ├── dd42b5397cd6cd964eafcfad67e577a62d930835
│ │ │ ├── de5ad016a4f4c7605fe3a31b6799d6b4d062cd18
│ │ │ ├── dee366079ca87ce4af37f112fd789a947a10d786
│ │ │ ├── dfaf950682973447259d35d9796014dafa34d749
│ │ │ ├── dfd93a24ffbc74eab4561403dbaa570d4ca0b5af
│ │ │ ├── dffcc9c104760ca4091ad597fe84f7e896a06c40
│ │ │ ├── e00e957f04bd17f52f0acb5ba76012d9bc20d911
│ │ │ ├── e099ff0285922304c1d1f11cd51b87e2acb5d9c8
│ │ │ ├── e0ae581b872911a72bb91e4e4d8ce9b65ef60651
│ │ │ ├── e15d95e020ace2a0a200d2f5f4083a298e2f8031
│ │ │ ├── e1a2ecab1f671045f254f11a726b450bff9ca72a
│ │ │ ├── e1cfff1fc909ce6860d44dbcb432bdc1882add93
│ │ │ ├── e1d90d4d6bb403712cd0909c3ff05b57b99280dc
│ │ │ ├── e1ddeeb549e65e9461b2aba3ad7292922292310c
│ │ │ ├── e2c5bf492112fed70178d878c649de2e441b0383
│ │ │ ├── e2d171228f00a0118e682aab755b58c10e762b7c
│ │ │ ├── e35505f8abc3b8f46bd2f962028946cab3e167b9
│ │ │ ├── e3c2ca5ac45ae36805c13fd2f9c111cdb44e19be
│ │ │ ├── e411f4d03b841b7d429570481824082f8343de8e
│ │ │ ├── e4c724897a0c0cbae41b73c7008c3b81771bd01e
│ │ │ ├── e4c73e432a7118869d0aa54a794927259bd11dae
│ │ │ ├── e5241093bb38e06353a8ae7f825505d949dedcb3
│ │ │ ├── e57d2995b61ad6b64b48e7819337bc924fe0c684
│ │ │ ├── e5cd9c83c06e3600ae4dd03ab0b39a54dcfc9d60
│ │ │ ├── e668c73812f05e82f8d1e098dce5e9ce7dbc6ce5
│ │ │ ├── e6cf6422973e2804bbd0640fbb6f28d87152dbb2
│ │ │ ├── e72fb0bfbbfbb9ff88745120a6753c0c9a5cf6ce
│ │ │ ├── e78e3037fb557880f370b3ab4b7577d4ad116e7b
│ │ │ ├── e7ba35f0ca34a3611adb868a9ed41414a70bf69b
│ │ │ ├── e7e3e184d1a9ed5ccdd3b2e49b94bf249533831c
│ │ │ ├── e80886275a1657601292c73799f26ae8ba50e365
│ │ │ ├── e98fe00d74ae8b0f1784f9046f31dba6a78c6e11
│ │ │ ├── e9b427cb96e9c8de51ce3731102731e5c67bc646
│ │ │ ├── e9dbcc05ccb465d614bab397e754e3a4af57e43b
│ │ │ ├── e9fe71ca4ccb92478da9ef7fc3b8a081481f363f
│ │ │ ├── ea1454d71fd5d970785306a40442536ad8ee563f
│ │ │ ├── ea2d00523510eb3de7b4e31629d4d5e0e10a92c5
│ │ │ ├── ea6ef46e1115fdd657e7d90d2498f7b7d66c04ef
│ │ │ ├── ea996c0d3ef2fa5790d383a2ab808e6a7a891845
│ │ │ ├── eaf0ddb358a1daccd620e1e149eea0ce88d27be9
│ │ │ ├── eb2519d195c987a1548749066fcf5e5f3ca9e772
│ │ │ ├── eb2d65f245fd7ed52333b4c4047581f663232d9c
│ │ │ ├── eb7227bd0675ea9d2210d22c51d14916045e618d
│ │ │ ├── eba756583f4026932e9ec9f14a0ea54cc1783b62
│ │ │ ├── ebbfa63e30ebf32e6ec01be747382055cac27fd3
│ │ │ ├── ec09122ea0558493333b0a1aa9b0eb16e3d0dd91
│ │ │ ├── ec09442322ca39b964b5d7d87a1a7e2e2d454ba3
│ │ │ ├── ec0e984d256dc84a4a7bfe790da47ab325ed1f17
│ │ │ ├── ed19adc6258c25b9e16391be684b2008f8d3f888
│ │ │ ├── ed68bc25000b9788c7ffb1132eb0f9dd5beff197
│ │ │ ├── ed85634a3587605bb3abed6bcfb0a9736a30155e
│ │ │ ├── ed8f83ac6708d4bb38bb0757392abfe137e1280b
│ │ │ ├── ed9b852084414f046645f7fd7138b9a302455735
│ │ │ ├── edc26b03cf5369135232c760750d0920679c362c
│ │ │ ├── ee2e4b5ce371f834d99a9772f45f4bd4135a06a7
│ │ │ ├── ee30286f6fd7edf123884d9a71997e36ec8aaf57
│ │ │ ├── eedfd8642e8034be230363cd8f9909e59518df1c
│ │ │ ├── eef877d043ad2c1d9a7c7a419b42f7d5ec8cabde
│ │ │ ├── ef1ff3c82e1f2d070009f14907e0aaba9933806d
│ │ │ ├── efb76c8ef8472afdb11b96178f77cebfb982d775
│ │ │ ├── efc78be0737897709371c521fd871c81da623c5f
│ │ │ ├── effc0e6a61de731b57eb080d48c6c79a4731226f
│ │ │ ├── f002f49de0ee5e8f7b7a8e854930677883f164f9
│ │ │ ├── f07d5fc54ab668426f71ea031653863c66904f0a
│ │ │ ├── f07eafb9d5bf9fb41588ec8cc19ca6d0d92087e7
│ │ │ ├── f1c2ee421c5f0fe0867322f692579ac1f5a4a719
│ │ │ ├── f204f01574682154694e2a97a5b280f800afceab
│ │ │ ├── f36ad7feced116b48dbafc4e2ea0012878e31f91
│ │ │ ├── f59d5126d120b4b9182f548aeac3daa050c3c25d
│ │ │ ├── f5a1386744cec74d1c7269945b8744ebb4293f91
│ │ │ ├── f5d1a7d6e842479f9ba48144aa7162705525487e
│ │ │ ├── f605050ea0109569f1dd1437b8eedd588173ab8a
│ │ │ ├── f6972f45e7b749fcb37a022dbd524eba74812eee
│ │ │ ├── f776b40b36747a780adbf9c0fd60f6d4ac3fdf7f
│ │ │ ├── fa303aac3336a71232faffaf517be334e163ace1
│ │ │ ├── fa4767259bba8c814f79c8ffc760dcb36ea04c4f
│ │ │ ├── faa2f323b3cd6fa944e484add07f3f39a31b98b0
│ │ │ ├── fae17a8ca331aad4863eeecfeee128d250af297d
│ │ │ ├── faea000bb28b552173fc166977180a52497e780a
│ │ │ ├── fb565d7671272c0afe27ada3b55919b677f7147d
│ │ │ ├── fb591bfa64343d7a52a5042e8c6b021285751401
│ │ │ ├── fc49d5669e33143a5674d21d025299da6b761035
│ │ │ ├── fc82c2ba9d8368d088925a86752da9b692fe17fa
│ │ │ ├── fcebf49a9559f7ede232c213e19ba4089d8d64ea
│ │ │ ├── fcf1344223eb3096471118b9fa863111ec17ae1a
│ │ │ ├── fd053af58404f23949f68f587b8eb6ad2b2b394e
│ │ │ ├── fd541997d54cda61dd0cf569be1e927a793b3547
│ │ │ ├── fd5a6345bc66a38d2dd7405ac4877ad954b30d4c
│ │ │ ├── fd93f7b3cf08a59d9a914d9247dca4ac933407d2
│ │ │ ├── fda064c16d5bbfece0071b9e2eab71f385b4f3c3
│ │ │ ├── fdf16bc5c082ab609990d5a8f9aca2e08d2f7528
│ │ │ ├── fe5ab636a528f4fa9b998684c4172c9938e0dd81
│ │ │ ├── fead5f4748928ca7f3f3e120253b7c549fac0459
│ │ │ ├── fec2acae6e3c73a70027e5dbd1739d1f77a58c27
│ │ │ ├── ff4e63b6898b5c9e7752638dc0647f4d18e924ba
│ │ │ ├── ff6a74fd5dc2267c636069043c8061ffd232202c
│ │ │ └── ffcf4452b358150dfebafecd20e96a89a5b791ac
│ │ ├── packets_posths_server/
│ │ │ ├── 9ae37e3fd9484306d9bec3629ab2626773fd3595
│ │ │ └── aa10c505e8e369f8bd9989a8d4023b507764ec26
│ │ ├── packets_recv_server/
│ │ │ ├── 9ae37e3fd9484306d9bec3629ab2626773fd3595
│ │ │ └── aa10c505e8e369f8bd9989a8d4023b507764ec26
│ │ └── qpack_decode/
│ │ ├── 00e1dbf37fba13a1966a1a7fbb4e4399270a877f
│ │ ├── 01002d32df06a05df4206fa05b380b4c2ebb0e48
│ │ ├── 025236fc56883ff6b68ace3005ee11a1439c00e2
│ │ ├── 025bf8f19916dc472e90986459fba78b794b271a
│ │ ├── 02e2930b646acee961d317c3bb01838c702bf586
│ │ ├── 0301b4611e7628b333c322191d67bc98dd40b771
│ │ ├── 032a1cb2fcd288debaf3756cf02cc8e9d365ae77
│ │ ├── 0389b46ef8babfb1a5a543f7430c66e4ef38da69
│ │ ├── 03da02bdb5382901c3081c7628d0fe0d3ed08480
│ │ ├── 0469160ea0cc47c6b50c01cd5d039f76774a0b3d
│ │ ├── 04db33a4cfc5c48511177dd2149962b3f87e32f4
│ │ ├── 05e5a9f40a49ed6e519faf8c98665f6945a76e85
│ │ ├── 0678a8571fbef7d23cfd6b7f9c290faec65d9a6a
│ │ ├── 070becf9ffe01b38516c4e92113b18f805954db8
│ │ ├── 0762d385762fa70fea091e04b25a37218dd85d21
│ │ ├── 0769c7bc1c230bd061b0d7b799ddedf9e3879b29
│ │ ├── 08a583c0fc6609ebc4f993732f6ffd8b06214b4c
│ │ ├── 0a4ac0799cff23132e6686143495c1ad68495792
│ │ ├── 0a710b2b1235e97561f628b66ab92ecbe32edae9
│ │ ├── 0abdfd09fd12576ea913addfe91b0eee23c010e1
│ │ ├── 0b163753986ab8121b1e9cec3cafef819e760c8e
│ │ ├── 0b1d24f9344ed20c543462e704ec5da4ba3cad9b
│ │ ├── 0c35e199f7952f5df3c34ca9293a68eb72620c36
│ │ ├── 0c55df3c612d22fb13e991cafc0bf2cf41f37ec3
│ │ ├── 0cc7e11374be386fdf0d436c1c1cd59a8134aba7
│ │ ├── 0d5c215a9ac8cb323e6ecb95c8e7fdd846c15246
│ │ ├── 0dac12e8e8c72e3edef646918249c1343b695112
│ │ ├── 0e193d05e77da73a2e2fb4863d0bc87ba401d109
│ │ ├── 0ebf87e99f2585f844687adbe4a8b8153d2f88c3
│ │ ├── 10434db07979882ad35f2100e1b5359781cfb995
│ │ ├── 11fe182aaee18d0f3c116134ecec55a29ff3b2e0
│ │ ├── 1256f042c18db040bb768fe235c460449da5a8b2
│ │ ├── 12ba1b4bfda1124a8363e328c7f92193127b3d45
│ │ ├── 131f91d526dd5804dd8f87200467408757ef5fe8
│ │ ├── 13397261a996f329edf9dc405491afb9dc1754ac
│ │ ├── 136e62e529dcdb80d2956cbf89c0b8d36bfecc96
│ │ ├── 13f4bf3f5c8ad3bdd600f935613e1f953647c1ab
│ │ ├── 145fb971177b418075853fe53ef7c7c61e6125c7
│ │ ├── 1466c9a547be8a5cdb9a66eb97c2955c0aed79e3
│ │ ├── 1535300c7581bc65e5dcd660ff68ffe2a3061117
│ │ ├── 16256f2eed8fa6295df6579c1f13cc19ca3ed103
│ │ ├── 16cd5a44f52703a9a049a91522e2c7f7c22fd195
│ │ ├── 1708e3c33398a5ce728134c261f7d4b82727f415
│ │ ├── 17d6fdc9d91f517d76ef4742446386a0f06e2559
│ │ ├── 17fa28cbecb3876d02fc74d7a1ce2db92a67b0e2
│ │ ├── 180a5ecd0cb6814e8c6ad86a24e878aed6e52736
│ │ ├── 18eea3b493b082490165d372eafba9e495bff3a2
│ │ ├── 1919c86bd47f75f3d67bdf536017858fb51a0f31
│ │ ├── 191e6f0e8b11f7b5fc279d9dcfde3fa8d4d9c92a
│ │ ├── 1c1ff349da4110b6cd43fde3a4c8ebdbe3fba4a4
│ │ ├── 1cb53efeab8cb7153d77118db868580a991ee913
│ │ ├── 1cb8dfcd5bd58feff7cd4b8090b6f9ff287c1ad3
│ │ ├── 1cc1a4a09897a4943b359c6bbe686dbaaaac2109
│ │ ├── 1d3f9ca0d7add4aeffa79e35d6ef649fa7c46c72
│ │ ├── 1d76cef839ee530ef9221cd33c439649de627947
│ │ ├── 1e07554d871857d402da21228e5da62ffa31c5e0
│ │ ├── 1e4048ffc3fcaf1e716476a7ba772763c9cc90d9
│ │ ├── 1e986bf3f6b3318962bf42b657756dc520c15117
│ │ ├── 1f3769acc9b82a9c4cdc0ce7ad7a3c659cb9a2d8
│ │ ├── 20039c606835fb25e808073cd978263fa7687366
│ │ ├── 201342cdddb3b8c686fb502664ac91617a4aef89
│ │ ├── 20c6a49a1636af8568f2e0873d4b76d8e59c164f
│ │ ├── 213e374bf2669c82e5ed6a1451b491d3d7d3e341
│ │ ├── 2237d9980aa11a18a106aa6e8eab124833a6d6f6
│ │ ├── 22382d03dab1e043b56926f94ba5bf1a75280b9b
│ │ ├── 23b5f31a247edf77fb3064ac694ce18e74ac0c5c
│ │ ├── 272fe3549b8e8d0e84bfbc32ff32593165bce833
│ │ ├── 2788fe8df7b1c0743115f5b357eaab515cd38c59
│ │ ├── 27e9edabbd020c9a29cb58d6dd6a7c2e8f0c7740
│ │ ├── 2872ecc7d880bc6089418d12044e5724d0ed1418
│ │ ├── 291912a79d5fcd55e47f6e4fbac6c82a697fb249
│ │ ├── 2a2c417327054b4bbc033005d0f048ccb1f023b1
│ │ ├── 2bbecaa186302b609e2f499bc0146b4904b369df
│ │ ├── 2c96a099e1ea29c7ceca94b643c6a24a69d46dcc
│ │ ├── 2d18ca1f8611ac974c8b79082efad8e07ee1c70f
│ │ ├── 2d576960b9a1974f01df7d1008d7b95224269ce8
│ │ ├── 2d87fdbd3ef527247e30ef65d7789c6017e0ddc8
│ │ ├── 2d92a1deb1df02a146bbfaf50d5ae7156943939e
│ │ ├── 2e359dfc8bcdc849f9bdf8b1b5ba1707b960533f
│ │ ├── 2ee3d4e203e814867e484c8379f8103d2531bf20
│ │ ├── 2fcc837fdcf19093fc07481e105d0e106c603f02
│ │ ├── 30396103dc8015aa6999f898b3a3519ccac6379d
│ │ ├── 3130e6e549eb6bf75bfdf15f6f0e2a9a490821d0
│ │ ├── 318edab5378d4d506bea461b58afea23e7e27fbb
│ │ ├── 31ea2d281fd0e7db70cc9c5f4b916708d7e9392c
│ │ ├── 323456136961397da3c0429a6492bd1f9190757a
│ │ ├── 33cb2f19271cb89447ae2bca2e73e4c4350451e6
│ │ ├── 3400cabf81d7839890cb2045f9b64eff662c9330
│ │ ├── 344b2f5d30042047fc35e9930861308286b94931
│ │ ├── 34a6020581f22d630cee11c9c83f834974382ab6
│ │ ├── 34e860df1b12607e474efb526c4047956c073453
│ │ ├── 351ebcc9797063b4f3fe80b7c117621acec912ea
│ │ ├── 35578193b2fd4de2e6859ebac57eaf672fe9f0ff
│ │ ├── 37b7e167db697587b5661c569ac38ffb5f498e41
│ │ ├── 387ccfa5fde4b1745411686efe0f388c7cb0a910
│ │ ├── 39412207a2044393327d87cbaabddde289f4d434
│ │ ├── 394e904bdbf878f7a1a5bf67888fb21755a8b591
│ │ ├── 398a92c55381d8f396aaf1e484034dad6a2fdd18
│ │ ├── 39d903c7174460e9d7a08630522a8a3eca44a8cd
│ │ ├── 3b2fd4c127c54578e31a151052e23bbdc035fb9d
│ │ ├── 3b351c9b1b7ee7c6a3a88001c18557b91f977a31
│ │ ├── 3bf87a855d6e3a3109a546c4105aa9d7a728f95d
│ │ ├── 3cac8dc8cf74e0547c8f1ca13976c1fd659c6e7e
│ │ ├── 3d2d01a661aa7d23989b113fad1835f983d857ea
│ │ ├── 3d51838381a7525f07566aa8d9aa4fef3a549abf
│ │ ├── 3ea1c723d11312471784f6d027b08c1ed2aa8bb5
│ │ ├── 3ec4374d0fcbf1470a616b58478c64e9d2750988
│ │ ├── 3f26bf019f07d4df95145e61127528bda535981d
│ │ ├── 3f4bf38ee41bc3c86809c2884de76b8195418e2e
│ │ ├── 3f693531cb2db43368b909cf5cad8bf7b89920da
│ │ ├── 3fa5bfd93317ad25772680071d5ac3259cd2384f
│ │ ├── 3fc3e1d986713a39fd7a522ca03cc840be9ce5e8
│ │ ├── 40d92f230c5257a383424d5db622e0fb88274911
│ │ ├── 417a31b64daf2a5b24cdfa2ccdbbfb729dafbb70
│ │ ├── 42592f46c0878b59afae781c81cb9cadb935731e
│ │ ├── 434233ebede6c984ab2acc096a19f1a343277142
│ │ ├── 43c719b85086792d2c7afa710aba553728e57dd3
│ │ ├── 441aa70137780d404a8202d665bd3cb6d572053f
│ │ ├── 44b33774470d8f7fbc227e1c5ffa90add6c6a0f1
│ │ ├── 45187832dae51e95536168a4d2493f59c3f89765
│ │ ├── 453ea3a491331d7bd3d63603a80546a14ab2fae8
│ │ ├── 4553744bbcc4a0cd9bbb49055c60b03d26d6500a
│ │ ├── 45f7e450c2cc406fc9fc70c0f61c15bc80581482
│ │ ├── 4776eabfe1d9ec687982caa8f2f4e64d17481228
│ │ ├── 487da629861a85e37c66b8e2a607189a0c24947d
│ │ ├── 498caa67e761196bfa8e2f34d1cfb2eb775bb92a
│ │ ├── 4a150c7fe6a697dc5703953e6d8cb6e103f0130c
│ │ ├── 4a4d329659e1c831db7a1522dd6b0dab0c719ff5
│ │ ├── 4b12f06f88334c62a540bb83a5ad65d92c1159e6
│ │ ├── 4bf9dc9638a574b7025c0e560af75cf3796edd6f
│ │ ├── 4c049d69dd09f60b2a4aa3749fd64f98bb21c1b7
│ │ ├── 4c3825785fe9499871fc638e97cbde71db9c5adc
│ │ ├── 4d3b8a3c50cb37f29ee87dcd3116413107277b84
│ │ ├── 4e075f8dfebcbc252e56d6b199f4dfd581d3b29a
│ │ ├── 4e67b9aefeac229de82e36d3d319eddcb5ce954c
│ │ ├── 4e89d07595d0d026f098412d393addf315e05435
│ │ ├── 4ecf3f2899ca16a1a303f3bf1b62059dbce667b4
│ │ ├── 4f22bdc21c99d851cf5ff30558332f658ee46f65
│ │ ├── 4f7e760cd98486e9dcdd3315a05778d9a7f20c13
│ │ ├── 4fbec485b09eba1377acc3af638827b7eac3ae36
│ │ ├── 50c4509efda8dcbea0e0eec77b59aa624e176d94
│ │ ├── 50df183b80223dde85dd784425447f922e0c6f11
│ │ ├── 50e92b58f5e32890e23eccf4ff5346d8b4fbb06c
│ │ ├── 513fe619ebedb3ca136f4fa257f639a48358cba6
│ │ ├── 514d2e48c16c3e1192eecb4673d987ab54c21531
│ │ ├── 51b514f0a18f88f7a1cd4d8df74e05a50fef9218
│ │ ├── 520fdcaf9aea71a8369b70c9d7f3206565c91ab6
│ │ ├── 5221da6006fcd6bd357ce19a0fbcef895cb0d6d0
│ │ ├── 526de4e1097375983dadc85a08f327047649ded4
│ │ ├── 53683cb0c2b09d029e1c791d29e5d011a7834f33
│ │ ├── 54009614f8e5896556131bfc2e9676c12d69a11a
│ │ ├── 54145cf4a9842dc0bdc581bab8b0ae510ebc812d
│ │ ├── 541bb4db914646ca8bfa3e4548101d77abafec9c
│ │ ├── 544e66740e4a7ce0e1bab7217d2528d2e6d9b811
│ │ ├── 54ab00f2dd152cc91284c707735587709b168e6b
│ │ ├── 54c65adb6cb5a0d154adfbbd3dbe86cb174eea73
│ │ ├── 55853b07b347fa93cea917b98d17027e726fedf5
│ │ ├── 55c38e9253befc318a7196921cc0092689c17537
│ │ ├── 587769c92dd937366fd2ead23e769c393f0a6fdc
│ │ ├── 58fbb611237c8c0fae4ba801b5de12304f91b15c
│ │ ├── 5b1047c5201637a55f95889e2ac707abd5dfa825
│ │ ├── 5b39839df2fc9ff8a2ab8abd3e4af70627470c15
│ │ ├── 5b80147a403edce1bcef86fb078f06e5a245e562
│ │ ├── 5b8a0b61912fcc0d9a3bdbf2959b8421e80e07b5
│ │ ├── 5c41c5cd2b66d690404746bd14329bba14d67a9b
│ │ ├── 5d2a48fe11717909a4e16acf943262f10473485d
│ │ ├── 5df91c5df959d8ec3ac4da0636526c9a572bb769
│ │ ├── 5e37509ce51787d029472017487a5b21d23e0ece
│ │ ├── 5e7bd00a6f0c996622aab0d05c4f5d2f8751dfb4
│ │ ├── 5f30aa17b1df55f7fbc481390db3b9325afb3c7e
│ │ ├── 6123af566cad0b86fe22a983b6702f1ca4da0157
│ │ ├── 61448054bf7a5baa7c2f6444929794a1ec91ba46
│ │ ├── 6146e8e16f7e4182e92410337d3c06d2b929e68f
│ │ ├── 61d1b92af498d4b8348aebed35272086bc13f12b
│ │ ├── 61d4217f9116300ee6a26b640c2ff2bbe9cd4a36
│ │ ├── 61eb4bcb9f234c00bd5231b36a143c2bef3f512a
│ │ ├── 6276cb5e7bcbc59b3c56a0037dbd3ab3abc4c2f8
│ │ ├── 63428686d0bc012b6d89e316b7843586c5c731a2
│ │ ├── 635338698fe1aa79910a83d5a214126050def1d7
│ │ ├── 639777406e879d6ba483c85bafa806670db74fea
│ │ ├── 647e242902e268b0435254c784787528dcec8b22
│ │ ├── 64876959aa79fecd468bc09c6b173bcd268bcf9a
│ │ ├── 64a1bede71641692664d69d4f95adc35953f733f
│ │ ├── 64e23500ef73356d3180bab4b60a4efb2f2ade9a
│ │ ├── 64f4c0a2c65b2307e28486e212d8061ced9f0d21
│ │ ├── 65c0591f541af77e010716ce5553ae615785be3d
│ │ ├── 663f5765df1e7de8a9bb911547c108f621c1b4eb
│ │ ├── 669436d423138023429e78aaabff715d271e8e03
│ │ ├── 6704a715b05fb5f7fcfc314d9df7a4ad40654064
│ │ ├── 67144008ef9873b0c988da51c78e27c02d6c3aab
│ │ ├── 674fde94ec12e5f77a86d83a1f62d3c7e529a348
│ │ ├── 67c79aa9f258162a8b6170896b4aee82e81402a2
│ │ ├── 6957a1f97efb299d8f3ca4ef216cca94a811b5f1
│ │ ├── 69cb9f1123f723454d3cd0f914cf763405aac326
│ │ ├── 6a17b064d1de71f8d705c4269c42f8a5fb4cbe26
│ │ ├── 6abda42115d3c9dc45890121afb3d9f688959ff4
│ │ ├── 6b3f2a340e51d0c20c1585bbf66e72aa6f50e0c4
│ │ ├── 6c8f26698182d8ad63f897e92cf8863459d728ca
│ │ ├── 6c9900af6a18167f810ad97fffd98ebca1b40715
│ │ ├── 6cb208ccdc982010795407a2e96651e468fad313
│ │ ├── 6df942147545885d2000e61e612689a867ec8117
│ │ ├── 6e57784e75db443ae9419f08c82aa84ffe1b4b46
│ │ ├── 6eeb3a6ee692ce9c62353a0075fde63e929a3370
│ │ ├── 6f11b8ca94a9ce3be66fce0a4fc3670ef7827c7c
│ │ ├── 6f7935259db0461330fa3c3d0dd409be6bfea31d
│ │ ├── 70486e9ebfed27a3a97dd49fda41b9ee289b8a5d
│ │ ├── 70c9156a6d37c9f56a8c44a47ec9ed456b822dc8
│ │ ├── 7156a274b7c05d2e00b67426352f1e39125cb3c2
│ │ ├── 717fd94b003a8b72c2ea42e2f67cfbe2281da118
│ │ ├── 71882a70d208769cea3b1cf20a00bebd3fd4fb92
│ │ ├── 7190700d24d8d33d1a5b6e56c4af965a8a944541
│ │ ├── 71b16f91f576a675d2a9f262df187d5346ba31c7
│ │ ├── 726f88ee6fd3afaae3142811b2301e0bb78104e4
│ │ ├── 732baab0b0315575da7c5ff3f31d08eb8ebba8b2
│ │ ├── 736ec334b327f40b0834454303b19e7615dff1e3
│ │ ├── 73b875e881b5588e9119fa83f3c23c7019414547
│ │ ├── 73cdd545cb9f0e7e357673a625ca10993758f404
│ │ ├── 74f85de06629b9e866398c154ca87952fd990948
│ │ ├── 756952f980bfd880a05f9973718edda98dada4d8
│ │ ├── 75e80ec43df21fc8fa2fe49078d70d4cc392e52f
│ │ ├── 767a165d98f9ead608cecb9abc1ba663bffb0a8b
│ │ ├── 770d14f61b435a0ca1b53db60bb85c4051c61469
│ │ ├── 770fe083b0716f6042bb3d24a624e1f5901f9bd8
│ │ ├── 774b97959a4a8c108ff85d0750b93be51e5b6787
│ │ ├── 7754a75544d8fb96c08f94894e0120f3b29d4d06
│ │ ├── 77619ed6abbbbfa3cc01283a4c6917c5006b8838
│ │ ├── 7811e3571625618f5c923197c3533632f281e2d9
│ │ ├── 785f8c9d8025cc5d65840af5ccff5c7e08c8c855
│ │ ├── 78f4f8cbfdf5ddd20b879e0e71e761a802e7299e
│ │ ├── 7908d80330140fd7b15ef9ac4d2cd4b7b75addc6
│ │ ├── 79d667ed0657468d439109cb4bc7e2955103bd90
│ │ ├── 79dd6da9ca78fafb9e993b144d613db012f6176a
│ │ ├── 79f264b6ae306418a23e02acdaee2ce8f8653ceb
│ │ ├── 7a939d3971804e3750decfc05458f72444c908d4
│ │ ├── 7b5235bc7684f131d3b91588be3b5279b9a2d023
│ │ ├── 7b5bd73b2098b787b5659457cc4e0b084f762b9b
│ │ ├── 7ba99e1d77bf3c9fea760a6d0a4f6c40451c43a2
│ │ ├── 7bde08642b72f7ee94ca4411d004097185d0591f
│ │ ├── 7ca39c208df28742239a1fb24d98be1ad9104da5
│ │ ├── 7ed7943400658ed3503632443baff0bc87eb0426
│ │ ├── 7f53dae8c4bb8ece4c4c0060c2af873341e32c9b
│ │ ├── 7fcb35f23a8754a3f9e58c8cb429c1067e9967db
│ │ ├── 7fd3d98bad8f3a2e785ecc0ef0f6967be57452f2
│ │ ├── 8037ed27ea86fabc8c2108c35069770d85340ac3
│ │ ├── 803cee12c08d6b4b9c3cde4ffdfaba068b2cdee4
│ │ ├── 80f04d8d74bb90b1a29785323add44827892b71d
│ │ ├── 810a06d12925ae06b2d54ea5407023adce355c32
│ │ ├── 810e527c5df951c81e5ac41f986855000ac4d9c1
│ │ ├── 82139e0529b6e9cc080047f555fafb8091abf769
│ │ ├── 8252fd8d4745ab1875a02090581fb3a3d51abe78
│ │ ├── 8307740678fb45cf707ae035b0c749eafeddc6e3
│ │ ├── 83490f0a81a95963b203d7c7827c82e3b03c8e6e
│ │ ├── 838e134aedf8bb9cdcc31332487cf1af5351a05f
│ │ ├── 839bca8d8341b43bb34e8f34dfe9b5c5bda2d2c4
│ │ ├── 8422365f8c77ae80c4310627949a4a84ac4f8ed0
│ │ ├── 84229838b0142b3adf6258004d070648fdbac25a
│ │ ├── 858416dc22c6c02c59065cbde2faba3d09729add
│ │ ├── 85e53271e14006f0265921d02d4d736cdc580b0b
│ │ ├── 85ef8f0a14dedd893e5a4f2bf6f9331dd432bec7
│ │ ├── 8692df3a004ad5fe96fe069d73258fbf5b090ce5
│ │ ├── 869989fb0161c02968c6bd7bbf56dae9fb3e77b0
│ │ ├── 86c1a83d4e198ca6723093ddf12a3949aaf85544
│ │ ├── 86e1b600bb9f8e83720c6a526f3bc479506fe109
│ │ ├── 87a882b0ae341d53a545f20032cee1eab3e62eea
│ │ ├── 88959fad3562f1ee0c03710772f9ba3ce9999139
│ │ ├── 891163a5f443198c9578eee25ab7d291a2f62b59
│ │ ├── 89fb0a482852ab23d939463c8200a5a7f9dd6ff2
│ │ ├── 8a21554ccbb758bf272c44ed2bfb245122766ea2
│ │ ├── 8a53c3c035cbc134bb974c43be0f76dcb5b44c5c
│ │ ├── 8b8edf8bcbebd1c9c62d9336118b8b44ac6a4209
│ │ ├── 907d35be9c8bdd3f63dff0c05e06da40fe8f51c7
│ │ ├── 90ce68b6646e84c9f116340784ab3ad5ff624687
│ │ ├── 925603a8a43cfaf6facd87625e7a669af2551620
│ │ ├── 934d273830e2a7a5c07f38e59239e6758dddfc44
│ │ ├── 945ae4d631071140021ac173601aef8db262d0d5
│ │ ├── 95295d3777556ef727f606b8e791ec8ef400b713
│ │ ├── 95e1c34fcc230143378464a20b4e85ec6c37aee5
│ │ ├── 95ed069cd723680afda0c3d2904acf069c9064f8
│ │ ├── 9656eec3092f2163ad358c7eec031fdf30820dea
│ │ ├── 9713162d3cecbc5394629d9623f8d737c3be7a33
│ │ ├── 98309f3321933b656469c0358c4b3745911a1d02
│ │ ├── 98d472be5d086d7db6f91897fac83d000be85862
│ │ ├── 996ad2eaa07feee97f7ec53082f923dd0850bb1c
│ │ ├── 99e185a0c52940df6cbf59365812ca8b06a1cad1
│ │ ├── 99fa17357ade9d48e2dc7ab099e34264e0d8da60
│ │ ├── 9a9e1d6e7b350bc7c3ba7a9cc13a562ada0312b0
│ │ ├── 9ace90df3b05ddf7ae5a23af482fc072659b3114
│ │ ├── 9b0f4da82f1d8e0efe3fd602941dddbc5eee3d08
│ │ ├── 9b7c3ec6265973493d02ba2b98e3ebdf5ba6323d
│ │ ├── 9c24367ab94cda9d22ca3464016ee4b743e2308d
│ │ ├── 9c3c634ff44887ede4f9b028a3ac209c7d4ea26c
│ │ ├── 9df0df441a54bdf165c2ce4643fbd15aae1fa463
│ │ ├── 9f33ead21ba43e84ec1a570dd4e709664f8eda7c
│ │ ├── 9f90953020cb5c3e6eb8bab12623561bd400a5b3
│ │ ├── 9f934df7c406b1f9bfa339130306ccc002747eac
│ │ ├── 9fa727784ecae3d419f51dedc744ac7e9130d455
│ │ ├── 9ff1234ffe8936933291568ac21530bdc9ee89bb
│ │ ├── a0722448a80d3043f686ad771fc2d3fb26b99fc7
│ │ ├── a17182f7987c4470d61c96a22849420f681f6957
│ │ ├── a2298a53038fb2611208efaa56db6bf58ccb940c
│ │ ├── a238788d5c7c9477537e53d3d2a6147d0301658d
│ │ ├── a3b8a177534f9fb5f239bd30dd66c29d987bcfb1
│ │ ├── a57d22930153ede06a12b1e906790f6eae0730df
│ │ ├── a583f000d8b6aaf894a7b9527cba2e04593c0aa3
│ │ ├── a596bfabd7d402c6933beb0b3282da03de745b29
│ │ ├── a67555fd82d1d5587f41a3fa8447e36be09eaac5
│ │ ├── a6caac2b0aa0c607c04c465bb282ec11aa389cb1
│ │ ├── a7bd4d4065760d9150f3a8f9962416d7ee4a680e
│ │ ├── a7dd39fb46714cc10f5b008b6f52b82c9fb3b05c
│ │ ├── a831a38b10f3b62523c01a96532a578ec387e3bf
│ │ ├── a90f069fe132c7393fe450ba13389e51065c5455
│ │ ├── a977773c687ba711cffdf643d5cdc3d3933da2a6
│ │ ├── a991657ddc958c4e15e6a6bdd54515c17dad0244
│ │ ├── a995595ca2fce5c7678c6b611b2de4bb57f49c83
│ │ ├── a9a61e835552cf56620ec2f22cd76989dbeb4ddb
│ │ ├── a9dc080ef6cc2d253624a06e7cb782108eba8e16
│ │ ├── aa9a0dc28cc3a999d9cf88e96cff15bba05e351c
│ │ ├── ab58556d4c125dfe5b04329b075ce4a5c977d577
│ │ ├── ac2badead582d585c777a24374cc75ee0db07dbb
│ │ ├── ae80c54c939ef06fdf396beafe5e6ed05c1a1d04
│ │ ├── afc4f31eabafd766dff98160bc5f61d7d43be915
│ │ ├── b01836131ee3e9976a3e3d019c721997614ffb67
│ │ ├── b09fb2197744b96c8c894f30540298b9081ab2e6
│ │ ├── b0de7fc0f0a12e637a923ec311d3ba65fee56ec1
│ │ ├── b1311f7125e322381da006ae3991ef928b1c12c2
│ │ ├── b1d09cdd023a54e2c8f72543aa708a3475616f4c
│ │ ├── b263d01e7377741208d47f336b55c1de3483b92b
│ │ ├── b38399105f4443a12dba47d418dc78ccbd24109d
│ │ ├── b41a01d7b99accec5c5a6ce7576aca382cf75119
│ │ ├── b4adebf3bcdd142c18f42f9b0459c0cea1f0c467
│ │ ├── b57f34aaab6de1aab5122a61ed8f846bbf6c5642
│ │ ├── b5fec54532c025742fb93ce25fddf10ba3f08f4d
│ │ ├── b7192eb614717661fa79c26d0f77afd4e6c54fa9
│ │ ├── b7a1a4bc4a093456dc2c899317ecc5e86f65f694
│ │ ├── b8ae903b8170bc36cc86faae9f1a51ec7fe2ab67
│ │ ├── b8f08a794900413cd882d0d5ff73da15be3fa33b
│ │ ├── bab08480ac09fca88d50a3a6ebd9369789436df7
│ │ ├── bae73a3a1dfcd41675ec68a4e2e00c08cb9d103f
│ │ ├── bb37646472a1001140900a18c1cbe31dad54cff8
│ │ ├── bb5ed80add79653c6661542d671bcce98d3889d4
│ │ ├── bbf125e3d33bda159f9f9b4e318dd705eb908be4
│ │ ├── bc99521495d07c760b178be214dbe76c785c04e1
│ │ ├── bd2d52f89d69b32d09f184083426967ad9f381d8
│ │ ├── bd2e9f42f6a2699407a79222c720838a4793b995
│ │ ├── bd325815b5404905ca0fdd7f47f28c44f0faa0bc
│ │ ├── bdd67d8ea81d71c006ce01965def97baac9b8b30
│ │ ├── be369ae091d1dd411891012d33e39e5caa74c254
│ │ ├── be634c53b3cea35e47f187f7c42b93f8c9d8cca3
│ │ ├── bf0b4be468118ff162c33029675d56668211b462
│ │ ├── bf50fda7e279d4ba9d6a05d93901a6bbe15ea947
│ │ ├── bf6d8aa8e500d7a9073f85828c07ba251275916b
│ │ ├── bfdf1777f0f8441d701e7b43393c54a312febf2d
│ │ ├── c009fd7d1befae57f93864e16bb9b5bcfa6ae9f5
│ │ ├── c05bd3beca3e67327fbb170b3b805b3172d3826b
│ │ ├── c077e58eecf841678475e04619f6bd11e9c3b68c
│ │ ├── c139f15ee43ad0fd83264c075e402e0226c95bdc
│ │ ├── c1a25b34c0e99d81ee6026178aa0807cd4bf6ba1
│ │ ├── c266faa97ba32e1a949c0e34642b693ceb6b0c3e
│ │ ├── c29957a6ea93068d69e5b295b449e32e39f9d3bd
│ │ ├── c2f2b439a801150d252ac21ad3f37ceeff6749ee
│ │ ├── c33d203581354863b8637c4af392aed515156cd3
│ │ ├── c346659b93d44e967540e0104fef951063c9b4c8
│ │ ├── c358aaee2cbbe11ac133f251d7996cbe4aa0b502
│ │ ├── c36ce5443dc6a46f8829f8a296564473df9bcd5b
│ │ ├── c3bc9d59140ddc24678e90b639f4e5cb2208e11e
│ │ ├── c3e0960a53074031f799c73884bb36cc4ca3bff8
│ │ ├── c4085c74bc372c61cfa049de76938f59ae15026d
│ │ ├── c47497efd7175919cf755e3239683f59af8f014b
│ │ ├── c51858d7ccecc8e2fc1b6f96bb3de4922fd65676
│ │ ├── c59561ed0839eb1ade4a0873971f0a601457cb93
│ │ ├── c6b03fd971cc246316081f75c98db16f47bbde69
│ │ ├── c7b6a8b7b1f6a2a25674d7055edbde59ae3a04e6
│ │ ├── c7ffc92484397091002cc90572bb6e431528e1c3
│ │ ├── c8232da719422a3a91332975d029bba394c2668e
│ │ ├── c8f320b08909a1eaa9507db5c3c467de6982dcf1
│ │ ├── c8fba6512d0951bccaced5c037cf0d8bf0c559ce
│ │ ├── c96e20caeaffb2669411bf5fc456e7efb726d2e1
│ │ ├── ca79f9188a547b6aebf8a2d30cd9ed4d4f641a16
│ │ ├── cac72d01baea345dc2adddcb637e262284e34ad1
│ │ ├── cad0b1635aedffeb5aabaa57769a38ca53ca879a
│ │ ├── cad8c3a1bfe13c857a7594cd46590c7bb8b5d761
│ │ ├── cb47bf784ed81081edf093a7e6ddd84d9f36ddd1
│ │ ├── cbc59de1d39d7bc9825c50e39fc1260fa1fcef18
│ │ ├── cc0c53f907a24cb99096052e35ffd2a8ba930550
│ │ ├── cc15b68f5bb7954e4e1ab8b403759ed76d58a43a
│ │ ├── cc2afa2d6ff0c064a8dd1be4b3f313a118fce2bc
│ │ ├── cc9bbac1d63fe528712481c84712ff067dff7bc6
│ │ ├── ccbf675ea1b6b0fe7b7656db8c6564018a4885d1
│ │ ├── cd456f9eb610baf01f292886a55917f2d9b9a07d
│ │ ├── cde3efd84ea714407f3850f3f3fbb5cac1d145f4
│ │ ├── ce2fd5e03c9528492e2df1b05cd219121049f68f
│ │ ├── ce7fec2b645d91b42a118c6f3038dec18f5fe2f5
│ │ ├── ce84bb8af3e64c1a4b88df6c7325bcc6f2340d78
│ │ ├── ceaaf5646221e485b7f78ba9089a8179c0b1f499
│ │ ├── cef28e3f8aafca1f3d532519e3280921404e39eb
│ │ ├── cf8f891bbf62c528c48856605cb3ecfcafc8259c
│ │ ├── cfa2cce42084f2ecca8e9e7f7df1e91caff5f549
│ │ ├── d26a49dfcef3f397df180a5873098096a96a62b1
│ │ ├── d2bf954d5e479da3158934f60b9d0eee56f846a3
│ │ ├── d3265c153ebf636f745e1ec4b89b93d4c57c4aaa
│ │ ├── d344cfd756bfadd10263656c4f65e03eb80ce08f
│ │ ├── d39b4596bbc735d529c1bf4fa597c53b52edab2e
│ │ ├── d4163fa91f294e540c438a208fa981ea7c246828
│ │ ├── d42428711dc6c18ec63bfa1ba1f7b576895b37cd
│ │ ├── d469311897f8e44826c7344e8c994b3257a5c25c
│ │ ├── d4aef02693ee834a8e05782b17442fc919997a9a
│ │ ├── d4ef7999eeb79ec5baa709ccf52830c2cc0d1c40
│ │ ├── d56de425875a70a8feb53dddde2a0d0017adcb1a
│ │ ├── d5eb1d2078f1ffbc37a1841eaf544b32975343c5
│ │ ├── d5fd2f38b42d61ce829870ba3bc5bf120067a64c
│ │ ├── d6583c31e97445fc24728efc159e30805e3db442
│ │ ├── d6639c48db5279063ec045bdbd7a033961f4d3b8
│ │ ├── d67ef4494e303987b9746154bbf2f9f48c3ab0d9
│ │ ├── d6f7c1b1e2ddeb6ad6ca5f9043acdde9421cefdd
│ │ ├── d74aeb5306c728e421f0667a2cc1eb003279333d
│ │ ├── d765b66b30db695b6362c135a1aa7f0221e39385
│ │ ├── d81a6d8023a09c85e7c55c0668b6651021850f40
│ │ ├── d921a2733ab14769d6a730440d766b446338a949
│ │ ├── dacafe3e43b51aff60900a9e780ee5ad8f6256ea
│ │ ├── db15c6757498972a5095be15a1a67024530fec59
│ │ ├── db30e7150bbfdce48a17f330978fa25f5ffc07c9
│ │ ├── dd4e13456d579bcdc7dbb13c15ab237b37e647fa
│ │ ├── ddc593402905f34066a2397990860a8d1d79fbfb
│ │ ├── df1fbec132a37395d23e7022ae97cccccb2d19b8
│ │ ├── dfdd62c4a1a966409489343f008e997eff0d35b7
│ │ ├── e09b387b4d73f3d6210e54177b71b4dd90ac5ff3
│ │ ├── e0d13777e1110531eee8c85a26f3b554aeb3b816
│ │ ├── e17eab18eb549ebb980d25cc2bf6390c6547bd69
│ │ ├── e21cad876865b763b03ed9a9398e2cbaee5931ed
│ │ ├── e2c6bc6a83f09b487dcc62f94aa2005237e93d59
│ │ ├── e2e0322e22b3e621ed80fd300a33901a86234949
│ │ ├── e2f464dc8c5062fc5eb5d68ee6483f54728c06f2
│ │ ├── e2f67c31fabafb2a8635756c05c2b82ea813ee1d
│ │ ├── e35c504c2e07f3bd1c0e71cd3b5570905da613eb
│ │ ├── e40b4982094ed34ee8d6a342bfca2db8f364b653
│ │ ├── e4c9196fb5ada9e11480ee92447c2ca0a2e7000a
│ │ ├── e54f73d58b1baee0e200fd6531cc5f9cb62999b1
│ │ ├── e5b268f1f179d5559924c80b45d5c8e964aa2bd4
│ │ ├── e68bd0afc1ec1d7f0abcab3cb52ea7a4fa455da1
│ │ ├── e69685a5b746a2f429c8da00c86c6900bc266678
│ │ ├── e6ba63f71848498ba2d2165d0e83ea90b1307746
│ │ ├── e7330e699efa1badbd015f27e5cba40daa3c3957
│ │ ├── e8072b2c7f808ad4cf8a051fc3923438b5353e28
│ │ ├── e8e939013952191152cb459becfafbc19b6c8ca3
│ │ ├── e92cead9c2e0461125338180ad72cb048d92adaa
│ │ ├── ea00676eb8cfe00e6e358a5992a0fcb1a0061241
│ │ ├── ea063927210c7b1ac95c4cbdeaec39e905aa5911
│ │ ├── ea842236c6f3c6aebe7d2df698bed3b0e749c50e
│ │ ├── eb8898b76241ea1810edde7c476090ecceefc7c0
│ │ ├── ec4f16c29fbacb3f0fb575b3e87dfbcb3fbde121
│ │ ├── ec95ac8245955dd02c67ed21c02209a021a4433c
│ │ ├── eca33fa4bedade7da020430994c8b33a272b58e7
│ │ ├── ed2df9ea022534f34643df21d7024e580a739805
│ │ ├── ed618592cfae30dc2af0d13d5cbb039e9b8716fb
│ │ ├── ee5303f6a1f7e4fe433dc518f54bd4944c1bccca
│ │ ├── eee447edc79fea1ca7c7d34e463261cda4ba339e
│ │ ├── ef731a9dc1237c1e41b373dd41cbac57d86966f2
│ │ ├── efa658c2c4cb09149b1dad8d9f700b845b34e109
│ │ ├── eff79b2f6159c8a54c5718af9e57f731b99dfc82
│ │ ├── f1bd3d45165423ca91df80d5ab617842c17673c0
│ │ ├── f1bdd52c9ceb9dd7849283ec27fd9e3295a7e350
│ │ ├── f26b2e4af42c6f443221eab1e852d0e357086e16
│ │ ├── f34f464e2136cdb2c42ddb33d415ed0ab0559d21
│ │ ├── f37c87ed1174080a3144f74ea3ba5f51c8a10235
│ │ ├── f3a557fcc5716ae116b98c50c55b5de5aebc6039
│ │ ├── f3f24aee46a0c212e456eff9d62503efbe7b8230
│ │ ├── f46b49159352b4ebff3a4f5fd715c3482485b537
│ │ ├── f57f2f1b0092f02aa2f6f90740496e4e095a42b7
│ │ ├── f637fc68c117d4e9c14051ecc0af04d37522f539
│ │ ├── f66c62ca5c31e7077c87fde74391853e9d898744
│ │ ├── f747571b74d6302fbc0b4fcc813668912f22b57c
│ │ ├── f77786dfa7307e2cbf078f7d26e7f5fc5375f08c
│ │ ├── f7fcd15a0b5fe39838ddcb66866d67a1a56e719a
│ │ ├── f81464810d2cde5ed21e362b3f3944eea8ff95ab
│ │ ├── f81f37237d7bb010dc6c8fe5a3757ccc6ce5a350
│ │ ├── f86962aca14a0e7462055e8e62437fc999883dae
│ │ ├── f9d10dd5e88e39156b95e270c7b2f63948bec23b
│ │ ├── fab0345ed27f30cb3010581c8ebd0f25d1bf4bd8
│ │ ├── fb1ab873e8b8fec6b406be385506dea4322703de
│ │ ├── fb44042bceaf617e5d1e0217d838eb9c4863794b
│ │ ├── fb69c1b5ba063c14140f319fc055cda00d30db04
│ │ ├── fd45ccc063d1e656f8cfc48e4bb0835f07db81c1
│ │ ├── fea7e1ab6c991aebb27b0e60dd9f63e372463eeb
│ │ ├── ff6a56fcc80558f1638fd95a97b39e13c9b6d651
│ │ ├── ffbb2739d0ac218aff813098c8637ab1de307ba2
│ │ └── ffee973b1628dd4c8fd9257ebcdc37f87d6ad372
│ ├── mayhem/
│ │ ├── packet_recv_client/
│ │ │ └── Mayhemfile
│ │ ├── packet_recv_server/
│ │ │ └── Mayhemfile
│ │ ├── packets_posths_server/
│ │ │ └── Mayhemfile
│ │ ├── packets_recv_server/
│ │ │ └── Mayhemfile
│ │ └── qpack_decode/
│ │ └── Mayhemfile
│ └── src/
│ ├── lib.rs
│ ├── packet_recv_client.rs
│ ├── packet_recv_server.rs
│ ├── packets_posths_server.rs
│ ├── packets_recv_server.rs
│ └── qpack_decode.rs
├── h3i/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── examples/
│ │ ├── content_length_mismatch.rs
│ │ └── stream_limit.rs
│ └── src/
│ ├── actions/
│ │ ├── h3.rs
│ │ └── mod.rs
│ ├── client/
│ │ ├── async_client.rs
│ │ ├── connection_summary.rs
│ │ ├── mod.rs
│ │ └── sync_client.rs
│ ├── config.rs
│ ├── frame.rs
│ ├── frame_parser.rs
│ ├── lib.rs
│ ├── main.rs
│ ├── prompts/
│ │ ├── h3/
│ │ │ ├── errors.rs
│ │ │ ├── headers.rs
│ │ │ ├── mod.rs
│ │ │ ├── priority.rs
│ │ │ ├── settings.rs
│ │ │ ├── stream.rs
│ │ │ └── wait.rs
│ │ └── mod.rs
│ └── recordreplay/
│ ├── mod.rs
│ └── qlog.rs
├── netlog/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── constants.rs
│ ├── h2.rs
│ ├── h3.rs
│ ├── http.rs
│ ├── lib.rs
│ └── quic.rs
├── octets/
│ ├── Cargo.toml
│ └── src/
│ ├── huffman_table.rs
│ └── lib.rs
├── qlog/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── events/
│ │ ├── http3.rs
│ │ ├── mod.rs
│ │ └── quic.rs
│ ├── lib.rs
│ ├── reader.rs
│ ├── streamer.rs
│ └── testing/
│ ├── event_tests.rs
│ ├── mod.rs
│ └── trace_tests.rs
├── qlog-dancer/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── index.html
│ ├── qlog-dancer-ui.js
│ ├── qlog-dancer.css
│ └── src/
│ ├── config.rs
│ ├── datastore.rs
│ ├── lib.rs
│ ├── main.rs
│ ├── plots/
│ │ ├── colors.rs
│ │ ├── congestion_control.rs
│ │ ├── conn_flow_control.rs
│ │ ├── conn_overview.rs
│ │ ├── minmax.rs
│ │ ├── mod.rs
│ │ ├── packet_received.rs
│ │ ├── packet_sent.rs
│ │ ├── pending.rs
│ │ ├── rtt.rs
│ │ ├── stream_multiplex.rs
│ │ └── stream_sparks.rs
│ ├── reports/
│ │ ├── events.rs
│ │ ├── html.rs
│ │ ├── mod.rs
│ │ └── text.rs
│ ├── request_stub.rs
│ ├── seriesstore.rs
│ ├── trackers/
│ │ ├── mod.rs
│ │ ├── stream_buffer_tracker.rs
│ │ └── stream_max_tracker.rs
│ ├── web.rs
│ └── wirefilter.rs
├── quiche/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── examples/
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cert-big.crt
│ │ ├── cert.crt
│ │ ├── cert.key
│ │ ├── client.c
│ │ ├── client.rs
│ │ ├── gen-certs.sh
│ │ ├── http3-client.c
│ │ ├── http3-client.rs
│ │ ├── http3-server.c
│ │ ├── http3-server.rs
│ │ ├── qpack-decode.rs
│ │ ├── qpack-encode.rs
│ │ ├── rootca.crt
│ │ ├── server.c
│ │ └── server.rs
│ ├── include/
│ │ └── quiche.h
│ └── src/
│ ├── buffers.rs
│ ├── build.rs
│ ├── cid.rs
│ ├── crypto/
│ │ ├── boringssl.rs
│ │ ├── mod.rs
│ │ └── openssl_quictls.rs
│ ├── dgram.rs
│ ├── error.rs
│ ├── ffi.rs
│ ├── flowcontrol.rs
│ ├── frame.rs
│ ├── h3/
│ │ ├── AGENTS.md
│ │ ├── ffi.rs
│ │ ├── frame.rs
│ │ ├── mod.rs
│ │ ├── qpack/
│ │ │ ├── decoder.rs
│ │ │ ├── encoder.rs
│ │ │ ├── mod.rs
│ │ │ └── static_table.rs
│ │ └── stream.rs
│ ├── lib.rs
│ ├── minmax.rs
│ ├── packet.rs
│ ├── path.rs
│ ├── pmtud.rs
│ ├── rand.rs
│ ├── range_buf.rs
│ ├── ranges.rs
│ ├── recovery/
│ │ ├── AGENTS.md
│ │ ├── bandwidth.rs
│ │ ├── bytes_in_flight.rs
│ │ ├── congestion/
│ │ │ ├── cubic.rs
│ │ │ ├── delivery_rate.rs
│ │ │ ├── hystart.rs
│ │ │ ├── mod.rs
│ │ │ ├── prr.rs
│ │ │ ├── recovery.rs
│ │ │ ├── reno.rs
│ │ │ └── test_sender.rs
│ │ ├── gcongestion/
│ │ │ ├── bbr/
│ │ │ │ ├── bandwidth_sampler.rs
│ │ │ │ └── windowed_filter.rs
│ │ │ ├── bbr.rs
│ │ │ ├── bbr2/
│ │ │ │ ├── drain.rs
│ │ │ │ ├── mode.rs
│ │ │ │ ├── network_model.rs
│ │ │ │ ├── probe_bw.rs
│ │ │ │ ├── probe_rtt.rs
│ │ │ │ └── startup.rs
│ │ │ ├── bbr2.rs
│ │ │ ├── mod.rs
│ │ │ ├── pacer.rs
│ │ │ └── recovery.rs
│ │ ├── mod.rs
│ │ └── rtt.rs
│ ├── stream/
│ │ ├── mod.rs
│ │ ├── recv_buf.rs
│ │ └── send_buf.rs
│ ├── test_utils.rs
│ ├── tests.rs
│ ├── tls/
│ │ ├── boringssl.rs
│ │ ├── mod.rs
│ │ └── openssl_quictls.rs
│ └── transport_params.rs
├── rustfmt.toml
├── task-killswitch/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── tokio-quiche/
│ ├── AGENTS.md
│ ├── Cargo.toml
│ ├── README.md
│ ├── docs/
│ │ ├── arch.drawio
│ │ └── worker.excalidraw
│ ├── examples/
│ │ ├── README.md
│ │ ├── async_http3_server/
│ │ │ ├── args.rs
│ │ │ ├── body.rs
│ │ │ ├── main.rs
│ │ │ └── server.rs
│ │ ├── cert.crt
│ │ └── cert.key
│ ├── src/
│ │ ├── buf_factory.rs
│ │ ├── http3/
│ │ │ ├── driver/
│ │ │ │ ├── AGENTS.md
│ │ │ │ ├── client.rs
│ │ │ │ ├── connection.rs
│ │ │ │ ├── datagram.rs
│ │ │ │ ├── hooks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── server.rs
│ │ │ │ ├── streams.rs
│ │ │ │ ├── test_utils.rs
│ │ │ │ └── tests.rs
│ │ │ ├── mod.rs
│ │ │ ├── settings.rs
│ │ │ └── stats.rs
│ │ ├── lib.rs
│ │ ├── metrics/
│ │ │ ├── labels.rs
│ │ │ ├── mod.rs
│ │ │ └── tokio_task.rs
│ │ ├── quic/
│ │ │ ├── AGENTS.md
│ │ │ ├── addr_validation_token.rs
│ │ │ ├── connection/
│ │ │ │ ├── error.rs
│ │ │ │ ├── id.rs
│ │ │ │ ├── map.rs
│ │ │ │ └── mod.rs
│ │ │ ├── hooks.rs
│ │ │ ├── io/
│ │ │ │ ├── connection_stage.rs
│ │ │ │ ├── gso.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── utilization_estimator.rs
│ │ │ │ └── worker.rs
│ │ │ ├── mod.rs
│ │ │ ├── raw.rs
│ │ │ └── router/
│ │ │ ├── acceptor.rs
│ │ │ ├── connector.rs
│ │ │ └── mod.rs
│ │ ├── result.rs
│ │ ├── settings/
│ │ │ ├── config.rs
│ │ │ ├── hooks.rs
│ │ │ ├── mod.rs
│ │ │ ├── quic.rs
│ │ │ └── tls.rs
│ │ └── socket/
│ │ ├── capabilities.rs
│ │ ├── connected.rs
│ │ ├── listener.rs
│ │ └── mod.rs
│ └── tests/
│ ├── fixtures/
│ │ ├── h3i_fixtures.rs
│ │ └── mod.rs
│ ├── integration_tests/
│ │ ├── async_callbacks.rs
│ │ ├── connection_close.rs
│ │ ├── headers.rs
│ │ ├── migration.rs
│ │ ├── mod.rs
│ │ ├── stream_limit.rs
│ │ ├── timeouts.rs
│ │ └── zero_rtt.rs
│ └── main.rs
└── tools/
├── android/
│ └── build_android_ndk19.sh
├── gen_fuzz_seeds.sh
└── http3_test/
├── Cargo.toml
├── README.md
├── src/
│ ├── lib.rs
│ └── runner.rs
└── tests/
└── httpbin_tests.rs
Showing preview only (445K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5348 symbols across 207 files)
FILE: apps/src/args.rs
type Args (line 30) | pub trait Args {
method with_docopt (line 31) | fn with_docopt(docopt: &docopt::Docopt) -> Self;
method with_docopt (line 88) | fn with_docopt(docopt: &docopt::Docopt) -> Self {
method with_docopt (line 325) | fn with_docopt(docopt: &docopt::Docopt) -> Self {
method with_docopt (line 495) | fn with_docopt(docopt: &docopt::Docopt) -> Self {
type CommonArgs (line 35) | pub struct CommonArgs {
method default (line 230) | fn default() -> Self {
constant CLIENT_USAGE (line 259) | pub const CLIENT_USAGE: &str = "Usage:
type ClientArgs (line 306) | pub struct ClientArgs {
method default (line 420) | fn default() -> Self {
constant SERVER_USAGE (line 441) | pub const SERVER_USAGE: &str = "Usage:
type ServerArgs (line 482) | pub struct ServerArgs {
FILE: apps/src/bin/quiche-client.rs
function main (line 33) | fn main() {
FILE: apps/src/bin/quiche-server.rs
constant MAX_BUF_SIZE (line 52) | const MAX_BUF_SIZE: usize = 65507;
constant MAX_DATAGRAM_SIZE (line 54) | const MAX_DATAGRAM_SIZE: usize = 1350;
function main (line 56) | fn main() {
function mint_token (line 655) | fn mint_token(hdr: &quiche::Header, src: &net::SocketAddr) -> Vec<u8> {
function validate_token (line 678) | fn validate_token<'a>(
function handle_path_events (line 703) | fn handle_path_events(client: &mut Client) {
function set_txtime_sockopt (line 777) | fn set_txtime_sockopt(sock: &mio::net::UdpSocket) -> io::Result<()> {
function set_txtime_sockopt (line 793) | fn set_txtime_sockopt(_: &mio::net::UdpSocket) -> io::Result<()> {
FILE: apps/src/client.rs
constant MAX_DATAGRAM_SIZE (line 38) | const MAX_DATAGRAM_SIZE: usize = 1350;
type ClientError (line 41) | pub enum ClientError {
function connect (line 47) | pub fn connect(
FILE: apps/src/common.rs
function stdout_sink (line 54) | pub fn stdout_sink(out: String) {
constant H3_MESSAGE_ERROR (line 58) | const H3_MESSAGE_ERROR: u64 = 0x10E;
constant HTTP_09 (line 64) | pub const HTTP_09: [&[u8]; 2] = [b"hq-interop", b"http/0.9"];
constant HTTP_3 (line 65) | pub const HTTP_3: [&[u8]; 1] = [b"h3"];
type PartialRequest (line 68) | pub struct PartialRequest {
type PartialResponse (line 72) | pub struct PartialResponse {
type ClientId (line 81) | pub type ClientId = u64;
type Client (line 83) | pub struct Client {
type ClientIdMap (line 103) | pub type ClientIdMap = HashMap<ConnectionId<'static>, ClientId>;
type ClientMap (line 104) | pub type ClientMap = HashMap<ClientId, Client>;
function make_resource_writer (line 112) | fn make_resource_writer(
function autoindex (line 137) | fn autoindex(path: path::PathBuf, index: &str) -> path::PathBuf {
function make_qlog_writer (line 149) | pub fn make_qlog_writer(
function dump_json (line 164) | fn dump_json(reqs: &[Http3Request], output_sink: &mut dyn FnMut(String)) {
function hdrs_to_strings (line 241) | pub fn hdrs_to_strings(hdrs: &[quiche::h3::Header]) -> Vec<(String, Stri...
function generate_cid_and_reset_token (line 253) | pub fn generate_cid_and_reset_token<T: SecureRandom>(
function priority_field_value_from_query_string (line 266) | pub fn priority_field_value_from_query_string(url: &url::Url) -> Option<...
function priority_from_query_string (line 289) | pub fn priority_from_query_string(url: &url::Url) -> Option<Priority> {
function send_h3_dgram (line 313) | fn send_h3_dgram(
type HttpConn (line 332) | pub trait HttpConn {
method send_requests (line 333) | fn send_requests(
method handle_responses (line 337) | fn handle_responses(
method report_incomplete (line 342) | fn report_incomplete(&self, start: &std::time::Instant) -> bool;
method handle_requests (line 344) | fn handle_requests(
method handle_writable (line 351) | fn handle_writable(
method send_requests (line 442) | fn send_requests(
method handle_responses (line 480) | fn handle_responses(
method report_incomplete (line 552) | fn report_incomplete(&self, start: &std::time::Instant) -> bool {
method handle_requests (line 567) | fn handle_requests(
method handle_writable (line 676) | fn handle_writable(
method send_requests (line 1134) | fn send_requests(
method handle_responses (line 1235) | fn handle_responses(
method report_incomplete (line 1387) | fn report_incomplete(&self, start: &std::time::Instant) -> bool {
method handle_requests (line 1406) | fn handle_requests(
method handle_writable (line 1611) | fn handle_writable(
function writable_response_streams (line 357) | pub fn writable_response_streams(
type Http09Request (line 364) | pub struct Http09Request {
type Http3Request (line 373) | struct Http3Request {
type Http3ResponseBuilderResult (line 385) | type Http3ResponseBuilderResult = std::result::Result<
type Http09Conn (line 390) | pub struct Http09Conn {
method with_urls (line 411) | pub fn with_urls(
method default (line 399) | fn default() -> Self {
type Http3DgramSender (line 717) | pub struct Http3DgramSender {
method new (line 725) | pub fn new(dgram_count: u64, dgram_content: String, flow_id: u64) -> S...
function make_h3_config (line 735) | fn make_h3_config(
type Http3Conn (line 758) | pub struct Http3Conn {
method with_urls (line 773) | pub fn with_urls(
method with_conn (line 867) | pub fn with_conn(
method build_h3_response (line 900) | fn build_h3_response(
FILE: apps/src/sendto.rs
function detect_gso (line 33) | pub fn detect_gso(socket: &mio::net::UdpSocket, segment_size: usize) -> ...
function detect_gso (line 43) | pub fn detect_gso(_socket: &mio::net::UdpSocket, _segment_size: usize) -...
function send_to_gso_pacing (line 49) | fn send_to_gso_pacing(
function send_to_gso_pacing (line 86) | fn send_to_gso_pacing(
function send_to (line 97) | pub fn send_to(
function std_time_to_u64 (line 134) | fn std_time_to_u64(time: &std::time::Instant) -> u64 {
FILE: buffer-pool/src/buffer.rs
type ConsumeBuffer (line 41) | pub struct ConsumeBuffer {
method from_vec (line 82) | pub fn from_vec(inner: Vec<u8>) -> Self {
method into_vec (line 87) | pub fn into_vec(mut self) -> Vec<u8> {
method pop_front (line 98) | pub fn pop_front(&mut self, count: usize) {
method expand (line 103) | pub fn expand(&mut self, count: usize) {
method truncate (line 111) | pub fn truncate(&mut self, count: usize) {
method add_prefix (line 115) | pub fn add_prefix(&mut self, prefix: &[u8]) -> bool {
method update_metrics_after_resize (line 126) | fn update_metrics_after_resize(&mut self, old_capacity: usize) {
method extend (line 139) | fn extend<T: IntoIterator<Item = &'a u8>>(&mut self, iter: T) {
type Target (line 47) | type Target = [u8];
method deref (line 49) | fn deref(&self) -> &Self::Target {
method deref_mut (line 55) | fn deref_mut(&mut self) -> &mut Self::Target {
method reuse (line 61) | fn reuse(&mut self, val: usize) -> bool {
method capacity (line 70) | fn capacity(&self) -> usize {
method drop (line 76) | fn drop(&mut self) {
function test_metrics (line 151) | fn test_metrics() {
FILE: buffer-pool/src/lib.rs
function pool_idle_count (line 47) | pub fn pool_idle_count(name: &'static str) -> Gauge;
function pool_idle_bytes (line 49) | pub fn pool_idle_bytes(name: &'static str) -> Gauge;
function pool_active_count (line 51) | pub fn pool_active_count(name: &'static str) -> Gauge;
function consume_buffer_total_bytes (line 56) | pub fn consume_buffer_total_bytes() -> Gauge;
type Pool (line 61) | pub struct Pool<const S: usize, T: 'static> {
type QueueShard (line 69) | struct QueueShard<T> {
function new (line 84) | const fn new(trim: usize, max: usize, name: &'static str) -> Self {
type Pooled (line 97) | pub struct Pooled<T: Default + Reuse + 'static> {
function new (line 103) | fn new(inner: T, shard: &'static QueueShard<T>) -> Self {
function into_inner (line 108) | pub fn into_inner(mut self) -> T {
method drop (line 114) | fn drop(&mut self) {
function get (line 168) | pub fn get(&'static self) -> Pooled<T> {
function get_empty (line 188) | pub fn get_empty(&'static self) -> Pooled<T> {
function get_with (line 196) | pub fn get_with(&'static self, f: impl Fn(&mut T)) -> Pooled<T> {
function from_owned (line 202) | pub fn from_owned(&'static self, inner: T) -> Pooled<T> {
function with_slice (line 211) | pub fn with_slice(&'static self, v: &'a [u8]) -> Pooled<T> {
type Target (line 219) | type Target = T;
method deref (line 221) | fn deref(&self) -> &Self::Target {
method deref_mut (line 227) | fn deref_mut(&mut self) -> &mut Self::Target {
type Reuse (line 235) | pub trait Reuse {
method reuse (line 236) | fn reuse(&mut self, trim: usize) -> bool;
method capacity (line 240) | fn capacity(&self) -> usize;
method reuse (line 244) | fn reuse(&mut self, trim: usize) -> bool {
method capacity (line 250) | fn capacity(&self) -> usize {
method reuse (line 256) | fn reuse(&mut self, val: usize) -> bool {
method capacity (line 262) | fn capacity(&self) -> usize {
function test_sharding (line 272) | fn test_sharding() {
function test_creation (line 440) | fn test_creation() {
FILE: buffer-pool/src/raw_pool_buf_io.rs
type PooledBuf (line 34) | pub type PooledBuf = Pooled<ConsumeBuffer>;
type RawPoolBufIo (line 37) | pub trait RawPoolBufIo: Send {
method poll_send_reserve (line 38) | fn poll_send_reserve(&mut self, cx: &mut Context) -> Poll<io::Result<(...
method send_buf (line 40) | fn send_buf(&mut self, buf: PooledBuf, fin: bool) -> io::Result<()>;
method poll_recv_buf (line 42) | fn poll_recv_buf(&mut self, cx: &mut Context) -> Poll<io::Result<Poole...
type RawPoolBufDatagramIo (line 45) | pub trait RawPoolBufDatagramIo: Send {
method poll_send_datagrams (line 46) | fn poll_send_datagrams(
method poll_recv_dgram (line 50) | fn poll_recv_dgram(
method poll_recv_datagrams (line 54) | fn poll_recv_datagrams(
FILE: datagram-socket/src/datagram.rs
constant MAX_DATAGRAM_SIZE (line 61) | pub const MAX_DATAGRAM_SIZE: usize = 1500;
type DatagramSocketWithStats (line 63) | pub trait DatagramSocketWithStats: DatagramSocket {}
type DatagramSocket (line 77) | pub trait DatagramSocket:
method as_raw_io (line 81) | fn as_raw_io(&self) -> Option<BorrowedFd<'_>>;
method into_fd (line 84) | fn into_fd(self) -> Option<OwnedFd>;
method as_buf_io (line 86) | fn as_buf_io(&mut self) -> Option<&mut dyn RawPoolBufDatagramIo> {
method as_raw_io (line 535) | fn as_raw_io(&self) -> Option<BorrowedFd<'_>> {
method into_fd (line 540) | fn into_fd(self) -> Option<OwnedFd> {
method as_raw_io (line 598) | fn as_raw_io(&self) -> Option<BorrowedFd<'_>> {
method into_fd (line 603) | fn into_fd(self) -> Option<OwnedFd> {
method as_raw_io (line 638) | fn as_raw_io(&self) -> Option<BorrowedFd<'_>> {
method into_fd (line 642) | fn into_fd(self) -> Option<OwnedFd> {
type DatagramSocketSend (line 92) | pub trait DatagramSocketSend: Sync {
method poll_send (line 111) | fn poll_send(&self, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<u...
method poll_send_to (line 135) | fn poll_send_to(
method poll_send_many (line 158) | fn poll_send_many(
method as_udp_socket (line 185) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method peer_addr (line 191) | fn peer_addr(&self) -> Option<SocketAddr> {
method poll_send (line 413) | fn poll_send(&self, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<u...
method poll_send_to (line 418) | fn poll_send_to(
method poll_send_many (line 425) | fn poll_send_many(
method as_udp_socket (line 432) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method peer_addr (line 437) | fn peer_addr(&self) -> Option<SocketAddr> {
method poll_send (line 547) | fn poll_send(&self, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<u...
method poll_send_to (line 552) | fn poll_send_to(
method poll_send_many (line 560) | fn poll_send_many(
method as_udp_socket (line 566) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method peer_addr (line 570) | fn peer_addr(&self) -> Option<SocketAddr> {
method poll_send (line 650) | fn poll_send(&self, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<u...
method poll_send_to (line 655) | fn poll_send_to(
method poll_send_many (line 666) | fn poll_send_many(
method poll_send (line 763) | fn poll_send(&self, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<u...
method poll_send_to (line 768) | fn poll_send_to(
method poll_send_many (line 780) | fn poll_send_many(
method as_udp_socket (line 787) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method peer_addr (line 792) | fn peer_addr(&self) -> Option<SocketAddr> {
type DatagramSocketSendExt (line 203) | pub trait DatagramSocketSendExt: DatagramSocketSend {
method send (line 206) | fn send(&self, buf: &[u8]) -> impl Future<Output = io::Result<usize>> {
method send_to (line 212) | fn send_to(
method send_many (line 221) | fn send_many(
method try_send (line 227) | fn try_send(&self, buf: &[u8]) -> io::Result<usize> {
method try_send_many (line 235) | fn try_send_many(&self, bufs: &[ReadBuf<'_>]) -> io::Result<usize> {
type DatagramSocketRecv (line 246) | pub trait DatagramSocketRecv: Send {
method poll_recv (line 265) | fn poll_recv(
method poll_recv_from (line 287) | fn poll_recv_from(
method poll_recv_many (line 314) | fn poll_recv_many(
method as_udp_socket (line 336) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method poll_recv (line 444) | fn poll_recv(
method poll_recv_from (line 451) | fn poll_recv_from(
method poll_recv_many (line 458) | fn poll_recv_many(
method as_udp_socket (line 465) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method poll_recv (line 577) | fn poll_recv(
method poll_recv_many (line 585) | fn poll_recv_many(
method as_udp_socket (line 591) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method poll_recv (line 610) | fn poll_recv(
method poll_recv_from (line 617) | fn poll_recv_from(
method poll_recv_many (line 625) | fn poll_recv_many(
method as_udp_socket (line 631) | fn as_udp_socket(&self) -> Option<&UdpSocket> {
method poll_recv (line 676) | fn poll_recv(
method poll_recv_many (line 684) | fn poll_recv_many(
method poll_recv (line 694) | fn poll_recv(
method poll_recv_many (line 702) | fn poll_recv_many(
type DatagramSocketRecvExt (line 348) | pub trait DatagramSocketRecvExt: DatagramSocketRecv {
method recv (line 351) | fn recv(
method recv_from (line 365) | fn recv_from(
method recv_many (line 381) | fn recv_many(
type AsDatagramSocketSend (line 395) | pub trait AsDatagramSocketSend {
method as_datagram_socket_send (line 398) | fn as_datagram_socket_send(&self) -> &Self::AsSend;
type AsSend (line 474) | type AsSend = T;
method as_datagram_socket_send (line 476) | fn as_datagram_socket_send(&self) -> &Self::AsSend {
type AsSend (line 485) | type AsSend = T;
method as_datagram_socket_send (line 487) | fn as_datagram_socket_send(&self) -> &Self::AsSend {
type AsSend (line 496) | type AsSend = T;
method as_datagram_socket_send (line 498) | fn as_datagram_socket_send(&self) -> &Self::AsSend {
type AsDatagramSocketRecv (line 404) | pub trait AsDatagramSocketRecv {
method as_datagram_socket_recv (line 407) | fn as_datagram_socket_recv(&mut self) -> &mut Self::AsRecv;
method as_shared_datagram_socket_recv (line 408) | fn as_shared_datagram_socket_recv(&self) -> &Self::AsRecv;
type AsRecv (line 507) | type AsRecv = T;
method as_datagram_socket_recv (line 509) | fn as_datagram_socket_recv(&mut self) -> &mut Self::AsRecv {
method as_shared_datagram_socket_recv (line 513) | fn as_shared_datagram_socket_recv(&self) -> &Self::AsRecv {
type AsRecv (line 522) | type AsRecv = T;
method as_datagram_socket_recv (line 524) | fn as_datagram_socket_recv(&mut self) -> &mut Self::AsRecv {
method as_shared_datagram_socket_recv (line 528) | fn as_shared_datagram_socket_recv(&self) -> &Self::AsRecv {
function into_owned_fd (line 712) | fn into_owned_fd<F: IntoRawFd>(into_fd: F) -> OwnedFd {
type MaybeConnectedSocket (line 736) | pub struct MaybeConnectedSocket<T> {
function new (line 742) | pub fn new(inner: T) -> Self {
function inner (line 751) | pub fn inner(&self) -> &T {
function into_inner (line 756) | pub fn into_inner(self) -> T {
FILE: datagram-socket/src/lib.rs
function is_nonblocking (line 47) | pub fn is_nonblocking(fd: &impl AsRawFd) -> std::io::Result<bool> {
function is_nonblocking (line 62) | pub fn is_nonblocking(_fd: &impl AsRawFd) -> std::io::Result<bool> {
FILE: datagram-socket/src/mmsg.rs
constant MAX_MMSG (line 37) | const MAX_MMSG: usize = 16;
function recvmmsg (line 39) | pub fn recvmmsg(fd: BorrowedFd, bufs: &mut [ReadBuf<'_>]) -> io::Result<...
function sendmmsg (line 105) | pub fn sendmmsg(fd: BorrowedFd, bufs: &[ReadBuf<'_>]) -> io::Result<usiz...
function recvmmsg (line 208) | async fn recvmmsg() -> io::Result<()> {
function sendmmsg (line 240) | async fn sendmmsg() -> io::Result<()> {
FILE: datagram-socket/src/shutdown.rs
type ShutdownConnection (line 39) | pub trait ShutdownConnection {
method poll_shutdown (line 71) | fn poll_shutdown(&mut self, cx: &mut Context) -> Poll<io::Result<()>>;
method poll_shutdown (line 76) | fn poll_shutdown(&mut self, _cx: &mut Context) -> Poll<io::Result<()>> {
method poll_shutdown (line 84) | fn poll_shutdown(&mut self, _cx: &mut Context) -> Poll<io::Result<()>> {
method poll_shutdown (line 91) | fn poll_shutdown(&mut self, _cx: &mut Context) -> Poll<io::Result<()>> {
type ShutdownConnectionExt (line 103) | pub trait ShutdownConnectionExt: ShutdownConnection {
method shutdown_connection (line 105) | fn shutdown_connection(&mut self) -> impl Future<Output = io::Result<(...
FILE: datagram-socket/src/socket_stats.rs
type AsSocketStats (line 39) | pub trait AsSocketStats {
method as_socket_stats (line 40) | fn as_socket_stats(&self) -> SocketStats;
method as_quic_stats (line 42) | fn as_quic_stats(&self) -> Option<&Arc<QuicAuditStats>> {
type SocketStats (line 48) | pub struct SocketStats {
type StartupExit (line 74) | pub struct StartupExit {
type StartupExitReason (line 82) | pub enum StartupExitReason {
type BoxError (line 96) | type BoxError = Box<dyn std::error::Error + Send + Sync>;
type QuicAuditStats (line 99) | pub struct QuicAuditStats {
method new (line 132) | pub fn new(quic_connection_id: Vec<u8>) -> Self {
method recvd_conn_close_transport_error_code (line 150) | pub fn recvd_conn_close_transport_error_code(&self) -> i64 {
method sent_conn_close_transport_error_code (line 156) | pub fn sent_conn_close_transport_error_code(&self) -> i64 {
method recvd_conn_close_application_error_code (line 162) | pub fn recvd_conn_close_application_error_code(&self) -> i64 {
method sent_conn_close_application_error_code (line 168) | pub fn sent_conn_close_application_error_code(&self) -> i64 {
method set_recvd_conn_close_transport_error_code (line 174) | pub fn set_recvd_conn_close_transport_error_code(
method set_sent_conn_close_transport_error_code (line 182) | pub fn set_sent_conn_close_transport_error_code(
method set_recvd_conn_close_application_error_code (line 190) | pub fn set_recvd_conn_close_application_error_code(
method set_sent_conn_close_application_error_code (line 198) | pub fn set_sent_conn_close_application_error_code(
method transport_handshake_duration_us (line 206) | pub fn transport_handshake_duration_us(&self) -> i64 {
method set_transport_handshake_start (line 211) | pub fn set_transport_handshake_start(&self, start_time: SystemTime) {
method set_transport_handshake_duration (line 216) | pub fn set_transport_handshake_duration(&self, duration: Duration) {
method transport_handshake_start (line 223) | pub fn transport_handshake_start(&self) -> Arc<RwLock<Option<SystemTim...
method connection_close_reason (line 228) | pub fn connection_close_reason(
method set_connection_close_reason (line 235) | pub fn set_connection_close_reason(&self, error: BoxError) {
method set_max_bandwidth (line 240) | pub fn set_max_bandwidth(&self, max_bandwidth: u64) {
method max_bandwidth (line 245) | pub fn max_bandwidth(&self) -> u64 {
method set_max_loss_pct (line 250) | pub fn set_max_loss_pct(&self, max_loss_pct: u8) {
method max_loss_pct (line 255) | pub fn max_loss_pct(&self) -> u8 {
method set_initial_so_mark_data (line 261) | pub fn set_initial_so_mark_data(&self, value: Option<[u8; 4]>) {
method initial_so_mark_data (line 269) | pub fn initial_so_mark_data(&self) -> Option<&[u8; 4]> {
type StreamClosureKind (line 275) | pub enum StreamClosureKind {
FILE: fuzz/src/lib.rs
type PktsData (line 6) | pub struct PktsData<'a> {
type PktIterator (line 10) | pub struct PktIterator<'a> {
type Item (line 16) | type Item = &'a [u8];
method next (line 18) | fn next(&mut self) -> Option<Self::Item> {
function iter (line 38) | pub fn iter(&self) -> PktIterator<'_> {
function reset_rand_for_fuzzing (line 46) | pub fn reset_rand_for_fuzzing() {
function get_cert_path (line 61) | pub fn get_cert_path() -> (String, String) {
function server_process (line 90) | pub fn server_process(
FILE: h3i/examples/content_length_mismatch.rs
constant STREAM_ID (line 14) | const STREAM_ID: u64 = 0;
function main (line 19) | fn main() {
function encode_header_block (line 88) | fn encode_header_block(
FILE: h3i/examples/stream_limit.rs
function main (line 12) | fn main() {
FILE: h3i/src/actions/h3.rs
type ExpectedStreamSendResult (line 49) | pub enum ExpectedStreamSendResult {
type Action (line 66) | pub enum Action {
method from (line 162) | fn from(value: WaitType) -> Self {
type WaitType (line 134) | pub enum WaitType {
type StreamEvent (line 173) | pub struct StreamEvent {
type RequiredStreamsQuota (line 182) | pub struct RequiredStreamsQuota {
type StreamEventType (line 193) | pub enum StreamEventType {
type WaitingFor (line 204) | pub(crate) struct WaitingFor {
method is_empty (line 210) | pub(crate) fn is_empty(&self) -> bool {
method add_wait (line 215) | pub(crate) fn add_wait(&mut self, stream_event: &StreamEvent) {
method set_required_stream_quota (line 222) | pub(crate) fn set_required_stream_quota(
method check_can_open_num_streams (line 230) | pub(crate) fn check_can_open_num_streams(
method remove_wait (line 252) | pub(crate) fn remove_wait(&mut self, stream_event: StreamEvent) {
method clear_waits_on_stream (line 264) | pub(crate) fn clear_waits_on_stream(&mut self, stream_id: u64) {
function send_headers_frame (line 276) | pub fn send_headers_frame(
function send_headers_frame_with_expected_result (line 293) | pub fn send_headers_frame_with_expected_result(
function send_headers_frame_literal (line 313) | pub fn send_headers_frame_literal(
function send_headers_frame_literal_with_expected_result (line 332) | pub fn send_headers_frame_literal_with_expected_result(
FILE: h3i/src/client/async_client.rs
function connect (line 78) | pub async fn connect(
function create_config (line 118) | fn create_config(args: &H3iConfig) -> QuicSettings {
type BuildingConnectionSummary (line 159) | pub struct BuildingConnectionSummary {
method new (line 166) | fn new(
type Output (line 185) | type Output = ConnectionSummary;
method poll (line 187) | fn poll(
type H3iDriver (line 226) | pub struct H3iDriver {
method new (line 238) | fn new(
method should_fire (line 265) | fn should_fire(&self) -> bool {
method register_waits (line 270) | fn register_waits(&mut self) {
method stream_parsers_mut (line 305) | fn stream_parsers_mut(&mut self) -> &mut StreamParserMap {
method handle_response_frame (line 309) | fn handle_response_frame(
method on_conn_established (line 319) | fn on_conn_established(
method should_act (line 326) | fn should_act(&self) -> bool {
method process_reads (line 332) | fn process_reads(&mut self, qconn: &mut QuicheConnection) -> QuicResult<...
method process_writes (line 350) | fn process_writes(&mut self, qconn: &mut QuicheConnection) -> QuicResult...
method wait_for_data (line 403) | async fn wait_for_data(
method buffer (line 432) | fn buffer(&mut self) -> &mut [u8] {
method on_conn_close (line 436) | fn on_conn_close<M: Metrics>(
type ConnectionRecord (line 455) | pub enum ConnectionRecord {
FILE: h3i/src/client/connection_summary.rs
constant MAX_SERIALIZED_BUFFER_LEN (line 46) | pub const MAX_SERIALIZED_BUFFER_LEN: usize = 16384;
type ConnectionSummary (line 58) | pub struct ConnectionSummary {
method serialize (line 69) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type StreamMap (line 97) | pub struct StreamMap {
method from (line 106) | fn from(value: T) -> Self {
method all_frames (line 135) | pub fn all_frames(&self) -> Vec<H3iFrame> {
method stream (line 162) | pub fn stream(&self, stream_id: u64) -> Vec<H3iFrame> {
method received_frame (line 187) | pub fn received_frame(&self, frame: &H3iFrame) -> bool {
method received_frame_on_stream (line 208) | pub fn received_frame_on_stream(
method is_empty (line 237) | pub fn is_empty(&self) -> bool {
method headers_on_stream (line 262) | pub fn headers_on_stream(&self, stream_id: u64) -> Vec<EnrichedHeaders> {
method all_close_trigger_frames_seen (line 271) | pub fn all_close_trigger_frames_seen(&self) -> bool {
method missing_close_trigger_frames (line 281) | pub fn missing_close_trigger_frames(&self) -> Option<Vec<CloseTriggerF...
method new (line 288) | pub(crate) fn new(close_trigger_frames: Option<CloseTriggerFrames>) ->...
method insert (line 295) | pub(crate) fn insert(&mut self, stream_id: u64, frame: H3iFrame) {
method close_due_to_trigger_frames (line 309) | pub(crate) fn close_due_to_trigger_frames(
type CloseTriggerFrames (line 333) | pub struct CloseTriggerFrames {
method new (line 343) | pub fn new(frames: Vec<CloseTriggerFrame>) -> Self {
method new_with_connection_close (line 354) | pub fn new_with_connection_close(
method receive_frame (line 363) | fn receive_frame(&mut self, stream_id: u64, frame: &H3iFrame) {
method saw_all_trigger_frames (line 372) | fn saw_all_trigger_frames(&self) -> bool {
method missing_triggers (line 376) | fn missing_triggers(&self) -> Vec<CloseTriggerFrame> {
method from (line 382) | fn from(value: Vec<CloseTriggerFrame>) -> Self {
type ConnectionCloseDetails (line 389) | pub struct ConnectionCloseDetails {
method fmt (line 399) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method new (line 410) | pub fn new<F: quiche::BufFactory>(qconn: &quiche::Connection<F>) -> Se...
method peer_error (line 421) | pub fn peer_error(&self) -> Option<&ConnectionError> {
method local_error (line 426) | pub fn local_error(&self) -> Option<&ConnectionError> {
method no_err (line 432) | pub fn no_err(&self) -> bool {
method serialize (line 438) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type SerializablePathStats (line 464) | pub struct SerializablePathStats<'a>(&'a quiche::PathStats);
method serialize (line 467) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type SerializableStats (line 500) | pub struct SerializableStats<'a>(&'a quiche::Stats);
method serialize (line 503) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type SerializableConnectionError (line 546) | pub struct SerializableConnectionError<'a>(&'a quiche::ConnectionError);
method serialize (line 549) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
function h3i_frame (line 571) | fn h3i_frame() -> H3iFrame {
function close_trigger_frame (line 576) | fn close_trigger_frame() {
function trigger_frame_missing (line 589) | fn trigger_frame_missing() {
function stream_map_data (line 604) | fn stream_map_data() -> Vec<H3iFrame> {
function test_stream_map_trigger_frames_with_none (line 617) | fn test_stream_map_trigger_frames_with_none() {
function test_stream_map_trigger_frames (line 623) | fn test_stream_map_trigger_frames() {
FILE: h3i/src/client/mod.rs
constant MAX_DATAGRAM_SIZE (line 69) | const MAX_DATAGRAM_SIZE: usize = 1350;
constant QUIC_VERSION (line 70) | const QUIC_VERSION: u32 = 1;
function handle_qlog (line 72) | fn handle_qlog(
type ClientError (line 89) | pub enum ClientError {
type Client (line 98) | pub(crate) trait Client {
method stream_parsers_mut (line 100) | fn stream_parsers_mut(&mut self) -> &mut StreamParserMap;
method handle_response_frame (line 104) | fn handle_response_frame(&mut self, stream_id: u64, frame: H3iFrame);
type StreamParserMap (line 107) | pub(crate) type StreamParserMap = HashMap<u64, FrameParser>;
function validate_stream_send_result (line 109) | fn validate_stream_send_result(
function execute_action (line 151) | pub(crate) fn execute_action<F: quiche::BufFactory>(
function parse_streams (line 369) | pub(crate) fn parse_streams<F: quiche::BufFactory, C: Client>(
function handle_fin (line 475) | fn handle_fin(
function handle_response_frame (line 489) | fn handle_response_frame<C: Client>(
type ParsedArgs (line 548) | pub(crate) struct ParsedArgs<'a> {
function parse_args (line 554) | pub(crate) fn parse_args(args: &Config) -> ParsedArgs<'_> {
function resolve_socket_addrs (line 571) | fn resolve_socket_addrs(args: &Config) -> (SocketAddr, SocketAddr) {
FILE: h3i/src/client/sync_client.rs
type SyncClient (line 59) | struct SyncClient {
method new (line 65) | fn new(close_trigger_frames: Option<CloseTriggerFrames>) -> Self {
method stream_parsers_mut (line 74) | fn stream_parsers_mut(&mut self) -> &mut StreamParserMap {
method handle_response_frame (line 78) | fn handle_response_frame(&mut self, stream_id: u64, frame: H3iFrame) {
function create_config (line 83) | fn create_config(args: &Config, should_log_keys: bool) -> quiche::Config {
function connect (line 137) | pub fn connect(
function connect_with_early_data (line 147) | pub fn connect_with_early_data(
function check_duration_and_do_actions (line 503) | fn check_duration_and_do_actions(
function generate_cid_and_reset_token (line 549) | pub fn generate_cid_and_reset_token() -> (quiche::ConnectionId<'static>,...
function handle_actions (line 563) | fn handle_actions<'a, I>(
FILE: h3i/src/config.rs
type Config (line 32) | pub struct Config {
method new (line 78) | pub fn new() -> Self {
method with_host_port (line 82) | pub fn with_host_port(mut self, host_port: String) -> Self {
method omit_sni (line 87) | pub fn omit_sni(mut self) -> Self {
method with_connect_to (line 92) | pub fn with_connect_to(mut self, connect_to: String) -> Self {
method with_source_port (line 97) | pub fn with_source_port(mut self, port: u32) -> Self {
method verify_peer (line 102) | pub fn verify_peer(mut self, verify_peer: bool) -> Self {
method with_idle_timeout (line 107) | pub fn with_idle_timeout(mut self, idle_timeout: u64) -> Self {
method with_max_data (line 112) | pub fn with_max_data(mut self, max_data: u64) -> Self {
method with_max_stream_data_bidi_local (line 117) | pub fn with_max_stream_data_bidi_local(
method with_max_stream_data_bidi_remote (line 124) | pub fn with_max_stream_data_bidi_remote(
method with_max_stream_data_uni (line 131) | pub fn with_max_stream_data_uni(mut self, max_stream_data_uni: u64) ->...
method with_max_streams_bidi (line 136) | pub fn with_max_streams_bidi(mut self, max_streams_bidi: u64) -> Self {
method with_max_streams_uni (line 141) | pub fn with_max_streams_uni(mut self, max_streams_uni: u64) -> Self {
method with_max_window (line 146) | pub fn with_max_window(mut self, max_window: u64) -> Self {
method with_max_stream_window (line 151) | pub fn with_max_stream_window(mut self, max_stream_window: u64) -> Self {
method enable_dgram (line 156) | pub fn enable_dgram(mut self, enable_dgram: bool) -> Self {
method with_dgram_recv_queue_len (line 161) | pub fn with_dgram_recv_queue_len(
method with_dgram_send_queue_len (line 168) | pub fn with_dgram_send_queue_len(
method build (line 175) | pub fn build(self) -> Result<Self, io::Error> {
method default (line 208) | fn default() -> Self {
FILE: h3i/src/frame.rs
type BoxError (line 48) | pub type BoxError = Box<dyn Error + Send + Sync + 'static>;
type H3iFrame (line 53) | pub enum H3iFrame {
method to_enriched_headers (line 66) | pub fn to_enriched_headers(&self) -> Option<EnrichedHeaders> {
method from (line 102) | fn from(value: QFrame) -> Self {
method from (line 108) | fn from(value: Vec<Header>) -> Self {
method serialize (line 76) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type HeaderMap (line 113) | pub type HeaderMap = MultiMap<Vec<u8>, Vec<u8>>;
type EnrichedHeaders (line 117) | pub struct EnrichedHeaders {
method headers (line 155) | pub fn headers(&self) -> &[Header] {
method header_map (line 193) | pub fn header_map(&self) -> &HeaderMap {
method status_code (line 210) | pub fn status_code(&self) -> Option<&Vec<u8>> {
method from (line 230) | fn from(headers: Vec<Header>) -> Self {
type Error (line 247) | type Error = BoxError;
method try_from (line 249) | fn try_from(value: QFrame) -> Result<Self, Self::Error> {
type SerializableHeader (line 125) | pub struct SerializableHeader<'a>(&'a Header);
method serialize (line 128) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
method serialize (line 216) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
method fmt (line 264) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type ResetStream (line 274) | pub struct ResetStream {
function frame_name (line 281) | fn frame_name(frame: &QFrame) -> &'static str {
type SerializableQFrame (line 297) | pub struct SerializableQFrame<'a>(&'a QFrame);
method serialize (line 300) | fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
type CustomEquivalenceHandler (line 450) | type CustomEquivalenceHandler =
type Comparator (line 454) | enum Comparator {
method serialize (line 469) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
type CloseTriggerFrame (line 489) | pub struct CloseTriggerFrame {
method new (line 513) | pub fn new(stream_id: u64, frame: impl Into<H3iFrame>) -> Self {
method new_with_comparator (line 526) | pub fn new_with_comparator<F>(stream_id: u64, comparator_fn: F) -> Self
method stream_id (line 536) | pub(crate) fn stream_id(&self) -> u64 {
method is_equivalent (line 540) | pub(crate) fn is_equivalent(&self, other: &H3iFrame) -> bool {
method fmt (line 573) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method eq (line 588) | fn eq(&self, other: &Self) -> bool {
function test_header_equivalence (line 603) | fn test_header_equivalence() {
function test_header_non_equivalence (line 619) | fn test_header_non_equivalence() {
function test_rst_stream_equivalence (line 635) | fn test_rst_stream_equivalence() {
function test_frame_equivalence (line 651) | fn test_frame_equivalence() {
function test_comparator (line 668) | fn test_comparator() {
FILE: h3i/src/frame_parser.rs
constant MAX_STREAM_STATE_SIZE (line 37) | const MAX_STREAM_STATE_SIZE: usize = 2_000_000;
type FrameState (line 40) | enum FrameState {
type InterruptCause (line 49) | pub enum InterruptCause {
type FrameParseResult (line 56) | pub enum FrameParseResult {
type FrameParser (line 78) | pub(crate) struct FrameParser {
method new (line 91) | pub(crate) fn new(stream_id: u64) -> Self {
method try_parse_frame (line 118) | pub(crate) fn try_parse_frame<F: quiche::BufFactory>(
method frame_incomplete (line 204) | fn frame_incomplete(&self) -> bool {
method try_fill_buffer (line 208) | fn try_fill_buffer<F: quiche::BufFactory>(
method try_consume_varint (line 225) | fn try_consume_varint(&mut self) -> Result<u64> {
method state_buffer_complete (line 239) | fn state_buffer_complete(&self) -> bool {
method state_transition (line 243) | fn state_transition(
method set_frame_type (line 261) | fn set_frame_type(&mut self, ty: u64) -> Result<()> {
method set_frame_len (line 268) | fn set_frame_len(&mut self, len: u64) -> Result<()> {
method build_h3i_frame (line 275) | fn build_h3i_frame(&mut self) -> Result<H3iFrame> {
method fmt (line 296) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method default (line 307) | fn default() -> Self {
function session (line 326) | fn session() -> Result<Session> {
function simple_case (line 334) | fn simple_case() {
function type_precedes_split (line 353) | fn type_precedes_split() {
function type_multiple_bytes (line 376) | fn type_multiple_bytes() {
function type_multiple_buffers (line 399) | fn type_multiple_buffers() {
function type_multiple_buffers_precedes_split (line 427) | fn type_multiple_buffers_precedes_split() {
function len_precedes_split (line 455) | fn len_precedes_split() {
function len_multiple_bytes (line 479) | fn len_multiple_bytes() {
function len_multiple_buffers (line 504) | fn len_multiple_buffers() {
function len_multiple_buffers_precedes_split (line 531) | fn len_multiple_buffers_precedes_split() {
function no_val (line 558) | fn no_val() {
function val_multiple_buffers (line 590) | fn val_multiple_buffers() {
function val_doesnt_extend_to_buffer_end (line 614) | fn val_doesnt_extend_to_buffer_end() {
function multiple_frames_in_buffer (line 638) | fn multiple_frames_in_buffer() {
function multiple_frames_multiple_buffers (line 669) | fn multiple_frames_multiple_buffers() {
function multiple_frames_nonzero_stream (line 717) | fn multiple_frames_nonzero_stream() {
function interrupted (line 756) | fn interrupted() {
function stream_reset (line 771) | fn stream_reset() {
FILE: h3i/src/lib.rs
constant HTTP3_CONTROL_STREAM_TYPE_ID (line 176) | pub const HTTP3_CONTROL_STREAM_TYPE_ID: u64 = 0x0;
constant HTTP3_PUSH_STREAM_TYPE_ID (line 181) | pub const HTTP3_PUSH_STREAM_TYPE_ID: u64 = 0x1;
constant QPACK_ENCODER_STREAM_TYPE_ID (line 186) | pub const QPACK_ENCODER_STREAM_TYPE_ID: u64 = 0x2;
constant QPACK_DECODER_STREAM_TYPE_ID (line 191) | pub const QPACK_DECODER_STREAM_TYPE_ID: u64 = 0x3;
type StreamIdAllocator (line 194) | struct StreamIdAllocator {
method take_next_id (line 199) | pub fn take_next_id(&mut self) -> u64 {
method peek_next_id (line 206) | pub fn peek_next_id(&mut self) -> u64 {
function encode_header_block_literal (line 215) | fn encode_header_block_literal(
function encode_header_block (line 247) | fn encode_header_block(
function fake_packet_header (line 266) | fn fake_packet_header() -> PacketHeader {
function fake_packet_sent (line 273) | fn fake_packet_sent(frames: Option<SmallVec<[QuicFrame; 1]>>) -> EventDa...
FILE: h3i/src/main.rs
function main (line 48) | fn main() -> Result<(), ClientError> {
type Config (line 91) | struct Config {
function config_from_clap (line 98) | fn config_from_clap() -> std::result::Result<Config, String> {
function async_client (line 346) | fn async_client(
function sync_client (line 369) | fn sync_client(
function read_qlog (line 376) | fn read_qlog(filename: &str, host_override: Option<&str>) -> Vec<Action> {
function prompt_frames (line 400) | fn prompt_frames(config: &Config) -> Vec<Action> {
function make_qlog_writer (line 433) | pub fn make_qlog_writer() -> std::io::BufWriter<std::fs::File> {
function make_streamer (line 452) | pub fn make_streamer(
FILE: h3i/src/prompts/h3/errors.rs
constant NO_ERROR (line 39) | pub const NO_ERROR: &str = "NO_ERROR";
constant INTERNAL_ERROR (line 40) | pub const INTERNAL_ERROR: &str = "INTERNAL_ERROR";
constant CONNECTION_REFUSED (line 41) | pub const CONNECTION_REFUSED: &str = "CONNECTION_REFUSED";
constant FLOW_CONTROL_ERROR (line 42) | pub const FLOW_CONTROL_ERROR: &str = "FLOW_CONTROL_ERROR";
constant STREAM_LIMIT_ERROR (line 43) | pub const STREAM_LIMIT_ERROR: &str = "STREAM_LIMIT_ERROR";
constant STREAM_STATE_ERROR (line 44) | pub const STREAM_STATE_ERROR: &str = "STREAM_STATE_ERROR";
constant FINAL_SIZE_ERROR (line 45) | pub const FINAL_SIZE_ERROR: &str = "FINAL_SIZE_ERROR";
constant FRAME_ENCODING_ERROR (line 46) | pub const FRAME_ENCODING_ERROR: &str = "FRAME_ENCODING_ERROR";
constant TRANSPORT_PARAMETER_ERROR (line 47) | pub const TRANSPORT_PARAMETER_ERROR: &str = "TRANSPORT_PARAMETER_ERROR";
constant CONNECTION_ID_LIMIT_ERROR (line 48) | pub const CONNECTION_ID_LIMIT_ERROR: &str = "CONNECTION_ID_LIMIT_ERROR";
constant PROTOCOL_VIOLATION (line 49) | pub const PROTOCOL_VIOLATION: &str = "PROTOCOL_VIOLATION";
constant INVALID_TOKEN (line 50) | pub const INVALID_TOKEN: &str = "INVALID_TOKEN";
constant APPLICATION_ERROR (line 51) | pub const APPLICATION_ERROR: &str = "APPLICATION_ERROR";
constant CRYPTO_BUFFER_EXCEEDED (line 52) | pub const CRYPTO_BUFFER_EXCEEDED: &str = "CRYPTO_BUFFER_EXCEEDED";
constant KEY_UPDATE_ERROR (line 53) | pub const KEY_UPDATE_ERROR: &str = "KEY_UPDATE_ERROR";
constant AEAD_LIMIT_REACHED (line 54) | pub const AEAD_LIMIT_REACHED: &str = "AEAD_LIMIT_REACHED";
constant NO_VIABLE_PATH (line 55) | pub const NO_VIABLE_PATH: &str = "NO_VIABLE_PATH";
constant VERSION_NEGOTIATION_ERROR (line 56) | pub const VERSION_NEGOTIATION_ERROR: &str = "VERSION_NEGOTIATION_ERROR";
constant H3_DATAGRAM_ERROR (line 58) | pub const H3_DATAGRAM_ERROR: &str = "H3_DATAGRAM_ERROR";
constant H3_NO_ERROR (line 59) | pub const H3_NO_ERROR: &str = "H3_NO_ERROR";
constant H3_GENERAL_PROTOCOL_ERROR (line 60) | pub const H3_GENERAL_PROTOCOL_ERROR: &str = "H3_GENERAL_PROTOCOL_ERROR";
constant H3_INTERNAL_ERROR (line 61) | pub const H3_INTERNAL_ERROR: &str = "H3_INTERNAL_ERROR";
constant H3_STREAM_CREATION_ERROR (line 62) | pub const H3_STREAM_CREATION_ERROR: &str = "H3_STREAM_CREATION_ERROR";
constant H3_CLOSED_CRITICAL_STREAM (line 63) | pub const H3_CLOSED_CRITICAL_STREAM: &str = "H3_CLOSED_CRITICAL_STREAM";
constant H3_FRAME_UNEXPECTED (line 64) | pub const H3_FRAME_UNEXPECTED: &str = "H3_FRAME_UNEXPECTED";
constant H3_FRAME_ERROR (line 65) | pub const H3_FRAME_ERROR: &str = "H3_FRAME_ERROR";
constant H3_EXCESSIVE_LOAD (line 66) | pub const H3_EXCESSIVE_LOAD: &str = "H3_EXCESSIVE_LOAD";
constant H3_ID_ERROR (line 67) | pub const H3_ID_ERROR: &str = "H3_ID_ERROR";
constant H3_SETTINGS_ERROR (line 68) | pub const H3_SETTINGS_ERROR: &str = "H3_SETTINGS_ERROR";
constant H3_MISSING_SETTINGS (line 69) | pub const H3_MISSING_SETTINGS: &str = "H3_MISSING_SETTINGS";
constant H3_REQUEST_REJECTED (line 70) | pub const H3_REQUEST_REJECTED: &str = "H3_REQUEST_REJECTED";
constant H3_REQUEST_CANCELLED (line 71) | pub const H3_REQUEST_CANCELLED: &str = "H3_REQUEST_CANCELLED";
constant H3_REQUEST_INCOMPLETE (line 72) | pub const H3_REQUEST_INCOMPLETE: &str = "H3_REQUEST_INCOMPLETE";
constant H3_MESSAGE_ERROR (line 73) | pub const H3_MESSAGE_ERROR: &str = "H3_MESSAGE_ERROR";
constant H3_CONNECT_ERROR (line 74) | pub const H3_CONNECT_ERROR: &str = "H3_CONNECT_ERROR";
constant H3_VERSION_FALLBACK (line 75) | pub const H3_VERSION_FALLBACK: &str = "H3_VERSION_FALLBACK";
constant QPACK_DECOMPRESSION_FAILED (line 76) | pub const QPACK_DECOMPRESSION_FAILED: &str = "QPACK_DECOMPRESSION_FAILED";
constant QPACK_ENCODER_STREAM_ERROR (line 77) | pub const QPACK_ENCODER_STREAM_ERROR: &str = "QPACK_ENCODER_STREAM_ERROR";
constant QPACK_DECODER_STREAM_ERROR (line 78) | pub const QPACK_DECODER_STREAM_ERROR: &str = "QPACK_DECODER_STREAM_ERROR";
constant TRANSPORT (line 80) | pub const TRANSPORT: &str = "transport";
constant APPLICATION (line 81) | pub const APPLICATION: &str = "application";
function prompt_transport_or_app_error (line 84) | pub fn prompt_transport_or_app_error() -> InquireResult<(ErrorSpace, u64...
function prompt_transport_or_app (line 158) | fn prompt_transport_or_app() -> InquireResult<String> {
function validate_transport_error_code (line 166) | fn validate_transport_error_code(
function transport_error_code_suggestor (line 196) | fn transport_error_code_suggestor(
function validate_h3_error_code (line 223) | fn validate_h3_error_code(id: &str) -> SuggestionResult<Validation> {
function h3_error_code_suggestor (line 254) | fn h3_error_code_suggestor(val: &str) -> SuggestionResult<Vec<String>> {
FILE: h3i/src/prompts/h3/headers.rs
function prompt_headers (line 50) | pub fn prompt_headers(
function prompt_push_promise (line 99) | pub fn prompt_push_promise() -> InquireResult<Action> {
function pseudo_headers (line 125) | fn pseudo_headers(host_port: &str) -> InquireResult<Vec<quiche::h3::Head...
function headers_read_loop (line 153) | fn headers_read_loop() -> InquireResult<Vec<quiche::h3::Header>> {
function method_suggester (line 176) | fn method_suggester(val: &str) -> SuggestionResult<Vec<String>> {
function validate_stream_id (line 182) | fn validate_stream_id(id: &str) -> SuggestionResult<Validation> {
FILE: h3i/src/prompts/h3/mod.rs
type Error (line 54) | pub enum Error {
method from (line 60) | fn from(_err: octets::BufferTooShortError) -> Self {
type Result (line 68) | pub type Result<T> = std::result::Result<T, Error>;
type SuggestionResult (line 73) | type SuggestionResult<T> = std::result::Result<T, CustomUserError>;
type PromptedFrame (line 76) | pub type PromptedFrame = (u64, quiche::h3::frame::Frame);
constant HEADERS (line 81) | const HEADERS: &str = "headers";
constant HEADERS_NO_PSEUDO (line 82) | const HEADERS_NO_PSEUDO: &str = "headers_no_pseudo";
constant HEADERS_LITERAL (line 83) | const HEADERS_LITERAL: &str = "headers_literal";
constant HEADERS_NO_PSEUDO_LITERAL (line 84) | const HEADERS_NO_PSEUDO_LITERAL: &str = "headers_no_pseudo_literal";
constant DATA (line 85) | const DATA: &str = "data";
constant SETTINGS (line 86) | const SETTINGS: &str = "settings";
constant PUSH_PROMISE (line 87) | const PUSH_PROMISE: &str = "push_promise";
constant CANCEL_PUSH (line 88) | const CANCEL_PUSH: &str = "cancel_push";
constant GOAWAY (line 89) | const GOAWAY: &str = "goaway";
constant MAX_PUSH_ID (line 90) | const MAX_PUSH_ID: &str = "max_push_id";
constant PRIORITY_UPDATE (line 91) | const PRIORITY_UPDATE: &str = "priority_update";
constant GREASE (line 92) | const GREASE: &str = "grease";
constant EXTENSION (line 93) | const EXTENSION: &str = "extension_frame";
constant OPEN_UNI_STREAM (line 94) | const OPEN_UNI_STREAM: &str = "open_uni_stream";
constant RESET_STREAM (line 95) | const RESET_STREAM: &str = "reset_stream";
constant STOP_SENDING (line 96) | const STOP_SENDING: &str = "stop_sending";
constant CONNECTION_CLOSE (line 97) | const CONNECTION_CLOSE: &str = "connection_close";
constant STREAM_BYTES (line 98) | const STREAM_BYTES: &str = "stream_bytes";
constant DATAGRAM_QUARTER_STREAM_ID (line 99) | const DATAGRAM_QUARTER_STREAM_ID: &str = "datagram_quarter_stream_id";
constant DATAGRAM_RAW_PAYLOAD (line 100) | const DATAGRAM_RAW_PAYLOAD: &str = "datagram_raw_payload";
constant COMMIT (line 102) | const COMMIT: &str = "commit";
constant FLUSH_PACKETS (line 103) | const FLUSH_PACKETS: &str = "flush_packets";
constant WAIT (line 104) | const WAIT: &str = "wait";
constant QUIT (line 105) | const QUIT: &str = "quit";
constant YES (line 107) | const YES: &str = "Yes";
constant NO (line 108) | const NO: &str = "No";
constant ESC_TO_RET (line 110) | const ESC_TO_RET: &str = "ESC to return to actions";
constant STREAM_ID_PROMPT (line 111) | const STREAM_ID_PROMPT: &str = "stream ID:";
constant EMPTY_PICKS (line 112) | const EMPTY_PICKS: &str = "empty picks next available ID";
constant AUTO_PICK (line 113) | const AUTO_PICK: &str = "autopick StreamID";
constant PUSH_ID_PROMPT (line 114) | const PUSH_ID_PROMPT: &str = "push ID:";
type PromptOutcome (line 116) | enum PromptOutcome {
type Prompter (line 124) | pub struct Prompter {
method with_config (line 132) | pub fn with_config(config: &Config) -> Self {
method handle_action (line 142) | fn handle_action(&mut self, action: &str) -> PromptOutcome {
method prompt (line 206) | pub fn prompt(&mut self) -> Vec<Action> {
function handle_action_loop_error (line 233) | fn handle_action_loop_error(err: InquireError) -> bool {
function prompt_action (line 245) | fn prompt_action() -> InquireResult<String> {
function action_suggester (line 256) | fn action_suggester(val: &str) -> SuggestionResult<Vec<String>> {
function squish_suggester (line 288) | fn squish_suggester(
function validate_varint (line 300) | fn validate_varint(id: &str) -> SuggestionResult<Validation> {
function prompt_stream_id (line 317) | fn prompt_stream_id() -> InquireResult<u64> {
function prompt_control_stream_id (line 321) | fn prompt_control_stream_id() -> InquireResult<u64> {
function prompt_varint (line 332) | fn prompt_varint(str: &str) -> InquireResult<u64> {
function control_stream_suggestor (line 343) | fn control_stream_suggestor(val: &str) -> SuggestionResult<Vec<String>> {
function prompt_data (line 349) | fn prompt_data() -> InquireResult<Action> {
function prompt_max_push_id (line 368) | fn prompt_max_push_id() -> InquireResult<Action> {
function prompt_cancel_push (line 384) | fn prompt_cancel_push() -> InquireResult<Action> {
function prompt_goaway (line 400) | fn prompt_goaway() -> InquireResult<Action> {
function prompt_grease (line 416) | fn prompt_grease() -> InquireResult<Action> {
function prompt_extension (line 438) | fn prompt_extension() -> InquireResult<Action> {
function prompt_connection_close (line 461) | pub fn prompt_connection_close() -> InquireResult<Action> {
function prompt_stream_bytes (line 477) | pub fn prompt_stream_bytes() -> InquireResult<Action> {
function prompt_send_datagram (line 490) | pub fn prompt_send_datagram(with_quarter_stream: bool) -> InquireResult<...
function validate_wait_period (line 512) | fn validate_wait_period(period: &str) -> SuggestionResult<Validation> {
function prompt_yes_no (line 532) | fn prompt_yes_no(msg: &str) -> InquireResult<bool> {
FILE: h3i/src/prompts/h3/priority.rs
constant REQUEST (line 37) | const REQUEST: &str = "request";
constant PUSH (line 38) | const PUSH: &str = "push";
function prompt_priority (line 40) | pub fn prompt_priority() -> InquireResult<Action> {
function prompt_request_or_push (line 72) | fn prompt_request_or_push() -> InquireResult<String> {
FILE: h3i/src/prompts/h3/settings.rs
constant QPACK_MAX_TABLE_CAPACITY (line 39) | const QPACK_MAX_TABLE_CAPACITY: &str = "QPACK_MAX_TABLE_CAPACITY";
constant MAX_FIELD_SECTION_SIZE (line 40) | const MAX_FIELD_SECTION_SIZE: &str = "MAX_FIELD_SECTION_SIZE";
constant QPACK_BLOCKED_STREAMS (line 41) | const QPACK_BLOCKED_STREAMS: &str = "QPACK_BLOCKED_STREAMS";
constant ENABLE_CONNECT_PROTOCOL (line 42) | const ENABLE_CONNECT_PROTOCOL: &str = "ENABLE_CONNECT_PROTOCOL";
constant H3_DATAGRAM (line 43) | const H3_DATAGRAM: &str = "H3_DATAGRAM";
type RawSettings (line 45) | type RawSettings = Vec<(u64, u64)>;
function prompt_settings (line 47) | pub fn prompt_settings() -> InquireResult<Action> {
function settings_read_loop (line 72) | fn settings_read_loop() -> RawSettings {
function validate_setting_type (line 118) | fn validate_setting_type(id: &str) -> SuggestionResult<Validation> {
function settings_type_suggestor (line 133) | fn settings_type_suggestor(val: &str) -> SuggestionResult<Vec<String>> {
FILE: h3i/src/prompts/h3/stream.rs
constant CONTROL_STREAM (line 44) | const CONTROL_STREAM: &str = "Control Stream";
constant PUSH_STREAM (line 45) | const PUSH_STREAM: &str = "Push Stream";
constant QPACK_ENCODER (line 46) | const QPACK_ENCODER: &str = "QPACK Encoder Stream";
constant QPACK_DECODER (line 47) | const QPACK_DECODER: &str = "QPACK Decoder Stream";
function validate_stream_id (line 49) | fn validate_stream_id(id: &str) -> SuggestionResult<Validation> {
function autopick_stream_id (line 57) | pub fn autopick_stream_id(
function prompt_open_uni_stream (line 77) | pub fn prompt_open_uni_stream(
function validate_stream_type (line 104) | fn validate_stream_type(id: &str) -> SuggestionResult<Validation> {
function stream_type_suggestor (line 115) | fn stream_type_suggestor(val: &str) -> SuggestionResult<Vec<String>> {
function prompt_fin_stream (line 121) | pub fn prompt_fin_stream() -> InquireResult<bool> {
function prompt_reset_stream (line 125) | pub fn prompt_reset_stream() -> InquireResult<Action> {
function prompt_stop_sending (line 134) | pub fn prompt_stop_sending() -> InquireResult<Action> {
function prompt_close_stream (line 143) | fn prompt_close_stream() -> InquireResult<(u64, u64)> {
FILE: h3i/src/prompts/h3/wait.rs
constant DURATION (line 43) | const DURATION: &str = "duration";
constant HEADERS (line 44) | const HEADERS: &str = "headers";
constant DATA (line 45) | const DATA: &str = "data";
constant FINISHED (line 46) | const FINISHED: &str = "stream finished";
function prompt_wait (line 48) | pub fn prompt_wait() -> InquireResult<Action> {
function wait_type_suggestor (line 68) | fn wait_type_suggestor(val: &str) -> SuggestionResult<Vec<String>> {
function wait_type_validator (line 74) | fn wait_type_validator(wait_type: &str) -> SuggestionResult<Validation> {
function prompt_stream_wait (line 83) | fn prompt_stream_wait(stream_wait_type: &str) -> InquireResult<WaitType> {
function prompt_wait_period (line 105) | pub fn prompt_wait_period() -> InquireResult<WaitType> {
FILE: h3i/src/recordreplay/qlog.rs
type QlogEvent (line 62) | pub enum QlogEvent {
type QlogEvents (line 71) | pub type QlogEvents = Vec<QlogEvent>;
method from (line 83) | fn from(action: &Action) -> Self {
type H3Actions (line 74) | pub struct H3Actions(pub Vec<Action>);
method from (line 370) | fn from(event: JsonEvent) -> Self {
method from (line 391) | fn from(ps: &PacketSent) -> Self {
type H3FrameCreatedEx (line 77) | pub struct H3FrameCreatedEx {
function actions_from_qlog (line 333) | pub fn actions_from_qlog(event: Event, host_override: Option<&str>) -> H...
function map_header (line 474) | fn map_header(
method from (line 492) | fn from(value: H3FrameCreatedEx) -> Self {
function from_qlog_stream_type_set (line 615) | fn from_qlog_stream_type_set(
function parse_ex_data (line 642) | fn parse_ex_data(ex_data: &ExData) -> bool {
constant NOW (line 661) | const NOW: f64 = 123.0;
constant H3I_WAIT (line 662) | const H3I_WAIT: &str = "h3i:wait";
function ser_duration_wait (line 665) | fn ser_duration_wait() {
function deser_duration_wait (line 683) | fn deser_duration_wait() {
function ser_stream_wait (line 701) | fn ser_stream_wait() {
function deser_stream_wait (line 719) | fn deser_stream_wait() {
function deser_http_headers_to_action (line 737) | fn deser_http_headers_to_action() {
function deser_http_headers_host_overrid_to_action (line 764) | fn deser_http_headers_host_overrid_to_action() {
function deser_http_headers_literal_to_action (line 791) | fn deser_http_headers_literal_to_action() {
FILE: netlog/src/constants.rs
type ClientInfo (line 32) | pub struct ClientInfo {
type Constants (line 44) | pub struct Constants {
method populate_id_keyed (line 106) | pub fn populate_id_keyed(&mut self) {
type ConstantsLine (line 101) | pub struct ConstantsLine {
FILE: netlog/src/h2.rs
type Event (line 36) | pub enum Event {
type Http2SessionParams (line 66) | pub struct Http2SessionParams {
type Http2SessionEvent (line 72) | pub struct Http2SessionEvent {
type Http2SessionInitializedParams (line 77) | pub struct Http2SessionInitializedParams {
type Http2SessionInitializedEvent (line 83) | pub struct Http2SessionInitializedEvent {
constant H2_SEND_SETTINGS_PATTERN (line 88) | pub const H2_SEND_SETTINGS_PATTERN: &str = r"^\[id:(\d+) \(\w+\) value:(...
type Http2SessionSendSettingsParams (line 90) | pub struct Http2SessionSendSettingsParams {
type Http2SessionSendSettingsEvent (line 95) | pub struct Http2SessionSendSettingsEvent {
constant H2_RECV_SETTING_PATTERN (line 100) | pub const H2_RECV_SETTING_PATTERN: &str = r"^(\d+) \(\w+\)";
type Http2SessionRecvSettingParams (line 102) | pub struct Http2SessionRecvSettingParams {
type Http2SessionRecvSettingEvent (line 108) | pub struct Http2SessionRecvSettingEvent {
type Http2SessionSendHeadersParams (line 113) | pub struct Http2SessionSendHeadersParams {
type Http2SessionSendHeadersEvent (line 128) | pub struct Http2SessionSendHeadersEvent {
type Http2SessionSendDataParams (line 133) | pub struct Http2SessionSendDataParams {
type Http2SessionSendDataEvent (line 140) | pub struct Http2SessionSendDataEvent {
type Http2SessionRecvHeadersParams (line 145) | pub struct Http2SessionRecvHeadersParams {
type Http2SessionRecvHeadersEvent (line 152) | pub struct Http2SessionRecvHeadersEvent {
type Http2SessionRecvDataParams (line 157) | pub struct Http2SessionRecvDataParams {
type Http2SessionRecvDataEvent (line 164) | pub struct Http2SessionRecvDataEvent {
type Http2SessionUpdateRecvWindowParams (line 169) | pub struct Http2SessionUpdateRecvWindowParams {
type Http2SessionUpdateRecvWindowEvent (line 175) | pub struct Http2SessionUpdateRecvWindowEvent {
type Http2SessionUpdateSendWindowParams (line 180) | pub struct Http2SessionUpdateSendWindowParams {
type Http2SessionUpdateSendWindowEvent (line 186) | pub struct Http2SessionUpdateSendWindowEvent {
type Http2SessionUpdateStreamsSendWindowSizeParams (line 191) | pub struct Http2SessionUpdateStreamsSendWindowSizeParams {
type Http2SessionUpdateStreamsSendWindowSizeEvent (line 196) | pub struct Http2SessionUpdateStreamsSendWindowSizeEvent {
type Http2SessionSendWindowUpdateParams (line 201) | pub struct Http2SessionSendWindowUpdateParams {
type Http2SessionSendWindowUpdateEvent (line 207) | pub struct Http2SessionSendWindowUpdateEvent {
type Http2SessionRecvWindowUpdateParams (line 212) | pub struct Http2SessionRecvWindowUpdateParams {
type Http2SessionRecvWindowUpdateEvent (line 218) | pub struct Http2SessionRecvWindowUpdateEvent {
type Http2StreamUpdateSendWindowParams (line 223) | pub struct Http2StreamUpdateSendWindowParams {
type Http2StreamUpdateSendWindowEvent (line 229) | pub struct Http2StreamUpdateSendWindowEvent {
type Http2StreamUpdateRecvWindowParams (line 234) | pub struct Http2StreamUpdateRecvWindowParams {
type Http2StreamUpdateRecvWindowEvent (line 241) | pub struct Http2StreamUpdateRecvWindowEvent {
type Http2StreamStalledByStreamSendWindowParams (line 246) | pub struct Http2StreamStalledByStreamSendWindowParams {
type Http2StreamStalledByStreamSendWindowEvent (line 251) | pub struct Http2StreamStalledByStreamSendWindowEvent {
type Http2SessionPingParams (line 256) | pub struct Http2SessionPingParams {
type Http2SessionPingEvent (line 264) | pub struct Http2SessionPingEvent {
type Http2SessionSendRstStreamParams (line 269) | pub struct Http2SessionSendRstStreamParams {
type Http2SessionSendRstStreamEvent (line 276) | pub struct Http2SessionSendRstStreamEvent {
type Http2SessionRecvRstStreamParams (line 281) | pub struct Http2SessionRecvRstStreamParams {
type Http2SessionRecvRstStreamEvent (line 287) | pub struct Http2SessionRecvRstStreamEvent {
type Http2SessionRecvGoawayParams (line 292) | pub struct Http2SessionRecvGoawayParams {
type Http2SessionRecvGoawayEvent (line 299) | pub struct Http2SessionRecvGoawayEvent {
type Http2SessionCloseParams (line 304) | pub struct Http2SessionCloseParams {
type Http2SessionCloseEvent (line 310) | pub struct Http2SessionCloseEvent {
type Htt2SessionStalledMaxStreamsParams (line 315) | pub struct Htt2SessionStalledMaxStreamsParams {
type Htt2SessionStalledMaxStreamsEvent (line 322) | pub struct Htt2SessionStalledMaxStreamsEvent {
constant H2_HEADER_TABLE_SIZE (line 326) | const H2_HEADER_TABLE_SIZE: u16 = 0x01;
constant H2_ENABLE_PUSH (line 327) | const H2_ENABLE_PUSH: u16 = 0x02;
constant H2_MAX_CONCURRENT_STREAMS (line 328) | const H2_MAX_CONCURRENT_STREAMS: u16 = 0x03;
constant H2_INITIAL_WINDOW_SIZE (line 329) | const H2_INITIAL_WINDOW_SIZE: u16 = 0x04;
constant H2_MAX_FRAME_SIZE (line 330) | const H2_MAX_FRAME_SIZE: u16 = 0x05;
constant H2_MAX_HEADER_LIST_SIZE (line 331) | const H2_MAX_HEADER_LIST_SIZE: u16 = 0x06;
constant H2_ENABLE_CONNECT_PROTOCOL (line 332) | const H2_ENABLE_CONNECT_PROTOCOL: u16 = 0x08;
constant H2_NO_RFC7540_PRIORITIES (line 333) | const H2_NO_RFC7540_PRIORITIES: u16 = 0x09;
constant H2_TLS_RENEG_PERMITTED (line 334) | const H2_TLS_RENEG_PERMITTED: u16 = 0x10;
constant H2_ENABLE_METADATA (line 335) | const H2_ENABLE_METADATA: u16 = 0x4d44;
constant H2_DEFAULT_WINDOW_SIZE (line 337) | pub const H2_DEFAULT_WINDOW_SIZE: u32 = 65535;
type Http2Settings (line 340) | pub struct Http2Settings {
method set_from_wire (line 354) | pub fn set_from_wire(&mut self, id: u16, value: u32) {
type Error (line 376) | type Error = String;
method try_from (line 378) | fn try_from(settings: &[String]) -> Result<Self, Self::Error> {
function parse_event (line 419) | pub fn parse_event(
FILE: netlog/src/h3.rs
type Event (line 33) | pub enum Event {
type PrioritizedElementType (line 43) | pub enum PrioritizedElementType {
type Http3PriorityUpdateSentParams (line 50) | pub struct Http3PriorityUpdateSentParams {
type Http3PriorityUpdateSentEvent (line 58) | pub struct Http3PriorityUpdateSentEvent {
type Http3HeadersSentParams (line 63) | pub struct Http3HeadersSentParams {
type Http3HeadersSentEvent (line 69) | pub struct Http3HeadersSentEvent {
type Http3DataSentParams (line 74) | pub struct Http3DataSentParams {
type Http3DataSentEvent (line 80) | pub struct Http3DataSentEvent {
type Http3HeadersReceivedParams (line 85) | pub struct Http3HeadersReceivedParams {
type Http3HeadersReceivedEvent (line 91) | pub struct Http3HeadersReceivedEvent {
type Http3HeadersDecodedParams (line 96) | pub struct Http3HeadersDecodedParams {
type Http3HeadersDecodedEvent (line 102) | pub struct Http3HeadersDecodedEvent {
type Http3DataFrameReceivedParams (line 107) | pub struct Http3DataFrameReceivedParams {
type Http3DataFrameReceivedEvent (line 113) | pub struct Http3DataFrameReceivedEvent {
function parse_event (line 118) | pub fn parse_event(
FILE: netlog/src/http.rs
type Event (line 35) | pub enum Event {
type HttpTransactionSendRequestHeadersParams (line 49) | pub struct HttpTransactionSendRequestHeadersParams {
type HttpTransactionSendRequestHeadersEvent (line 54) | pub struct HttpTransactionSendRequestHeadersEvent {
type HttpTransactionHttp2SendRequestHeadersParams (line 59) | pub struct HttpTransactionHttp2SendRequestHeadersParams {
type HttpTransactionHttp2SendRequestHeadersEvent (line 64) | pub struct HttpTransactionHttp2SendRequestHeadersEvent {
type HttpTransactionQuicSendRequestHeadersParams (line 69) | pub struct HttpTransactionQuicSendRequestHeadersParams {
type HttpTransactionQuicSendRequestHeadersEvent (line 78) | pub struct HttpTransactionQuicSendRequestHeadersEvent {
type HttpTransactionReadResponseHeadersParams (line 83) | pub struct HttpTransactionReadResponseHeadersParams {
type HttpTransactionReadResponseHeadersEvent (line 88) | pub struct HttpTransactionReadResponseHeadersEvent {
type HttpStreamJobBoundToRequestParams (line 93) | pub struct HttpStreamJobBoundToRequestParams {
type HttpStreamRequestBoundToJobEvent (line 98) | pub struct HttpStreamRequestBoundToJobEvent {
type HttpStreamRequestBoundToJobParams (line 103) | pub struct HttpStreamRequestBoundToJobParams {
type HttpStreamJobBoundToRequestEvent (line 108) | pub struct HttpStreamJobBoundToRequestEvent {
type HttpStreamRequestBoundToQuicSessionEvent (line 113) | pub struct HttpStreamRequestBoundToQuicSessionEvent {
type HttpStreamRequestBoundToQuicSessionParams (line 118) | pub struct HttpStreamRequestBoundToQuicSessionParams {
function headers_to_map (line 122) | pub fn headers_to_map(hdrs: &[String]) -> BTreeMap<String, String> {
function parse_event (line 147) | pub fn parse_event(
FILE: netlog/src/lib.rs
type EventSource (line 128) | pub struct EventSource {
type EventHeader (line 139) | pub struct EventHeader {
method populate_strings (line 156) | pub fn populate_strings(&mut self, constants: &constants::Constants) {
type SourceDependency (line 164) | pub struct SourceDependency {
type Event (line 172) | pub enum Event {
function read_netlog_constants (line 180) | pub fn read_netlog_constants<R: BufRead>(
function read_netlog_record (line 209) | pub fn read_netlog_record<R: BufRead>(reader: &mut R) -> Option<Vec<u8>> {
function parse_event (line 239) | pub fn parse_event(event_hdr: &EventHeader, event: &[u8]) -> Option<Even...
FILE: netlog/src/quic.rs
type Event (line 33) | pub enum Event {
type QuicSessionParams (line 55) | pub struct QuicSessionParams {
type QuicSessionEvent (line 66) | pub struct QuicSessionEvent {
type QuicSessionTransportParametersSentParams (line 71) | pub struct QuicSessionTransportParametersSentParams {
type QuicSessionTransportParametersSentEvent (line 76) | pub struct QuicSessionTransportParametersSentEvent {
type QuicSessionTransportParametersReceivedParams (line 81) | pub struct QuicSessionTransportParametersReceivedParams {
type QuicSessionTransportParametersReceivedEvent (line 86) | pub struct QuicSessionTransportParametersReceivedEvent {
type TransportParameters (line 93) | pub struct TransportParameters {
method from (line 115) | fn from(value: String) -> Self {
method from (line 186) | fn from(value: QuicSessionTransportParametersReceivedParams) -> Self {
method from (line 192) | fn from(value: QuicSessionTransportParametersSentParams) -> Self {
type QuicSessionUnauthenticatedPacketHeaderReceivedParams (line 198) | pub struct QuicSessionUnauthenticatedPacketHeaderReceivedParams {
type QuicSessionUnauthenticatedPacketHeaderReceived (line 206) | pub struct QuicSessionUnauthenticatedPacketHeaderReceived {
type QuicSessionPacketSentParams (line 211) | pub struct QuicSessionPacketSentParams {
type QuicSessionPacketSent (line 219) | pub struct QuicSessionPacketSent {
type QuicSessionAckFrameSentParams (line 224) | pub struct QuicSessionAckFrameSentParams {
type QuicSessionAckFrameSent (line 233) | pub struct QuicSessionAckFrameSent {
type QuicSessionAckFrameReceivedParams (line 238) | pub struct QuicSessionAckFrameReceivedParams {
type QuicSessionAckFrameReceived (line 247) | pub struct QuicSessionAckFrameReceived {
type QuicSessionStreamFrameReceivedParams (line 252) | pub struct QuicSessionStreamFrameReceivedParams {
type QuicSessionStreamFrameReceivedEvent (line 260) | pub struct QuicSessionStreamFrameReceivedEvent {
type QuicSessionStopSendingFrameSentParams (line 265) | pub struct QuicSessionStopSendingFrameSentParams {
type QuicSessionStopSendingFrameSentEvent (line 271) | pub struct QuicSessionStopSendingFrameSentEvent {
type QuicSessionRstStreamFrameSentParams (line 276) | pub struct QuicSessionRstStreamFrameSentParams {
type QuicSessionRstStreamFrameSentEvent (line 283) | pub struct QuicSessionRstStreamFrameSentEvent {
type QuicSessionRstStreamFrameReceivedParams (line 288) | pub struct QuicSessionRstStreamFrameReceivedParams {
type QuicSessionRstStreamFrameReceivedEvent (line 295) | pub struct QuicSessionRstStreamFrameReceivedEvent {
type QuicSessionBlockedFrameReceivedParams (line 300) | pub struct QuicSessionBlockedFrameReceivedParams {
type QuicSessionBlockedFrameReceivedEvent (line 305) | pub struct QuicSessionBlockedFrameReceivedEvent {
type QuicSessionWindowUpdateFrameSentParams (line 310) | pub struct QuicSessionWindowUpdateFrameSentParams {
type QuicSessionWindowUpdateFrameSentEvent (line 316) | pub struct QuicSessionWindowUpdateFrameSentEvent {
type QuicSessionClosedParams (line 321) | pub struct QuicSessionClosedParams {
type QuicSessionClosedEvent (line 328) | pub struct QuicSessionClosedEvent {
function parse_event (line 333) | pub fn parse_event(
FILE: octets/src/lib.rs
constant MAX_VAR_INT (line 32) | pub const MAX_VAR_INT: u64 = 4_611_686_018_427_387_903;
type Result (line 38) | pub type Result<T> = std::result::Result<T, BufferTooShortError>;
type BufferTooShortError (line 44) | pub struct BufferTooShortError;
method fmt (line 47) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
method source (line 53) | fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
type Octets (line 135) | pub struct Octets<'a> {
function with_slice (line 145) | pub fn with_slice(buf: &'a [u8]) -> Self {
function get_u8 (line 151) | pub fn get_u8(&mut self) -> Result<u8> {
function peek_u8 (line 157) | pub fn peek_u8(&mut self) -> Result<u8> {
function get_u16 (line 163) | pub fn get_u16(&mut self) -> Result<u16> {
function get_u24 (line 169) | pub fn get_u24(&mut self) -> Result<u32> {
function get_u32 (line 175) | pub fn get_u32(&mut self) -> Result<u32> {
function get_u64 (line 181) | pub fn get_u64(&mut self) -> Result<u64> {
function get_varint (line 187) | pub fn get_varint(&mut self) -> Result<u64> {
function get_bytes (line 213) | pub fn get_bytes(&mut self, len: usize) -> Result<Octets<'a>> {
function get_bytes_with_u8_length (line 230) | pub fn get_bytes_with_u8_length(&mut self) -> Result<Octets<'a>> {
function get_bytes_with_u16_length (line 238) | pub fn get_bytes_with_u16_length(&mut self) -> Result<Octets<'a>> {
function get_bytes_with_varint_length (line 246) | pub fn get_bytes_with_varint_length(&mut self) -> Result<Octets<'a>> {
function get_huffman_decoded (line 255) | pub fn get_huffman_decoded(&mut self) -> Result<Vec<u8>> {
function peek_bytes (line 296) | pub fn peek_bytes(&self, len: usize) -> Result<Octets<'a>> {
function rewind (line 310) | pub fn rewind(&mut self, len: usize) -> Result<()> {
function slice (line 321) | pub fn slice(&self, len: usize) -> Result<&'a [u8]> {
function slice_last (line 330) | pub fn slice_last(&self, len: usize) -> Result<&'a [u8]> {
function skip (line 340) | pub fn skip(&mut self, skip: usize) -> Result<()> {
function cap (line 351) | pub fn cap(&self) -> usize {
function len (line 356) | pub fn len(&self) -> usize {
function is_empty (line 361) | pub fn is_empty(&self) -> bool {
function off (line 366) | pub fn off(&self) -> usize {
function buf (line 371) | pub fn buf(&self) -> &'a [u8] {
function to_vec (line 376) | pub fn to_vec(&self) -> Vec<u8> {
function as_ref (line 382) | fn as_ref(&self) -> &[u8] {
type OctetsMut (line 391) | pub struct OctetsMut<'a> {
function with_slice (line 401) | pub fn with_slice(buf: &'a mut [u8]) -> Self {
function get_u8 (line 407) | pub fn get_u8(&mut self) -> Result<u8> {
function peek_u8 (line 413) | pub fn peek_u8(&mut self) -> Result<u8> {
function put_u8 (line 419) | pub fn put_u8(&mut self, v: u8) -> Result<&mut [u8]> {
function get_u16 (line 425) | pub fn get_u16(&mut self) -> Result<u16> {
function put_u16 (line 431) | pub fn put_u16(&mut self, v: u16) -> Result<&mut [u8]> {
function get_u24 (line 437) | pub fn get_u24(&mut self) -> Result<u32> {
function put_u24 (line 443) | pub fn put_u24(&mut self, v: u32) -> Result<&mut [u8]> {
function get_u32 (line 449) | pub fn get_u32(&mut self) -> Result<u32> {
function put_u32 (line 455) | pub fn put_u32(&mut self, v: u32) -> Result<&mut [u8]> {
function get_u64 (line 461) | pub fn get_u64(&mut self) -> Result<u64> {
function put_u64 (line 467) | pub fn put_u64(&mut self, v: u64) -> Result<&mut [u8]> {
function get_varint (line 473) | pub fn get_varint(&mut self) -> Result<u64> {
function put_varint (line 499) | pub fn put_varint(&mut self, v: u64) -> Result<&mut [u8]> {
function put_varint_with_len (line 505) | pub fn put_varint_with_len(
function get_bytes (line 541) | pub fn get_bytes(&mut self, len: usize) -> Result<Octets<'_>> {
function get_bytes_mut (line 558) | pub fn get_bytes_mut(&mut self, len: usize) -> Result<OctetsMut<'_>> {
function get_bytes_with_u8_length (line 575) | pub fn get_bytes_with_u8_length(&mut self) -> Result<Octets<'_>> {
function get_bytes_with_u16_length (line 583) | pub fn get_bytes_with_u16_length(&mut self) -> Result<Octets<'_>> {
function get_bytes_with_varint_length (line 591) | pub fn get_bytes_with_varint_length(&mut self) -> Result<Octets<'_>> {
function peek_bytes (line 598) | pub fn peek_bytes(&mut self, len: usize) -> Result<Octets<'_>> {
function peek_bytes_mut (line 613) | pub fn peek_bytes_mut(&mut self, len: usize) -> Result<OctetsMut<'_>> {
function put_bytes (line 627) | pub fn put_bytes(&mut self, v: &[u8]) -> Result<()> {
function put_huffman_encoded (line 649) | pub fn put_huffman_encoded<const LOWER_CASE: bool>(
function rewind (line 708) | pub fn rewind(&mut self, len: usize) -> Result<()> {
function split_at (line 719) | pub fn split_at(
function slice (line 736) | pub fn slice(&'a mut self, len: usize) -> Result<&'a mut [u8]> {
function slice_last (line 745) | pub fn slice_last(&'a mut self, len: usize) -> Result<&'a mut [u8]> {
function skip (line 755) | pub fn skip(&mut self, skip: usize) -> Result<()> {
function cap (line 766) | pub fn cap(&self) -> usize {
function len (line 771) | pub fn len(&self) -> usize {
function is_empty (line 776) | pub fn is_empty(&self) -> bool {
function off (line 781) | pub fn off(&self) -> usize {
function buf (line 786) | pub fn buf(&self) -> &[u8] {
function to_vec (line 791) | pub fn to_vec(&self) -> Vec<u8> {
function as_ref (line 797) | fn as_ref(&self) -> &[u8] {
function as_mut (line 803) | fn as_mut(&mut self) -> &mut [u8] {
function varint_len (line 810) | pub const fn varint_len(v: u64) -> usize {
function varint_parse_len (line 825) | pub const fn varint_parse_len(first: u8) -> usize {
function huffman_encoding_len (line 839) | pub fn huffman_encoding_len<const LOWER_CASE: bool>(src: &[u8]) -> Resul...
function peek_invalid_fails_to_compile (line 876) | pub fn peek_invalid_fails_to_compile(b: &mut Octets) -> Result<u8> {
function put_invalid_fails_to_compile (line 880) | pub fn put_invalid_fails_to_compile<'a>(
function get_u (line 892) | fn get_u() {
function get_u_mut (line 929) | fn get_u_mut() {
function peek_u (line 966) | fn peek_u() {
function peek_u_mut (line 987) | fn peek_u_mut() {
function get_bytes (line 1008) | fn get_bytes() {
function get_bytes_mut (line 1034) | fn get_bytes_mut() {
function peek_bytes (line 1060) | fn peek_bytes() {
function peek_bytes_mut (line 1078) | fn peek_bytes_mut() {
function get_varint (line 1096) | fn get_varint() {
function get_varint_mut (line 1129) | fn get_varint_mut() {
function invalid_huffman (line 1163) | fn invalid_huffman() {
function put_varint (line 1183) | fn put_varint() {
function varint_too_large (line 1237) | fn varint_too_large() {
function put_u (line 1244) | fn put_u() {
function put_bytes (line 1282) | fn put_bytes() {
function rewind (line 1303) | fn rewind() {
function rewind_mut (line 1328) | fn rewind_mut() {
function split (line 1353) | fn split() {
function split_at (line 1379) | fn split_at() {
function slice (line 1422) | fn slice() {
function slice_mut (line 1452) | fn slice_mut() {
function slice_last (line 1482) | fn slice_last() {
function slice_last_mut (line 1523) | fn slice_last_mut() {
FILE: qlog-dancer/qlog-dancer-ui.js
constant OVERVIEW_CANVAS (line 32) | const OVERVIEW_CANVAS = "overview_canvas";
constant CC_CANVAS (line 33) | const CC_CANVAS = "cc_canvas";
constant RTT_CANVAS (line 34) | const RTT_CANVAS = "rtt_canvas";
constant FLOW_CONTROL_CANVAS (line 35) | const FLOW_CONTROL_CANVAS = "flow_control_canvas";
constant PKT_RX_CANVAS (line 36) | const PKT_RX_CANVAS = "pkt-rx-canvas";
constant PKT_TX_CANVAS (line 37) | const PKT_TX_CANVAS = "pkt-tx-canvas";
constant PKT_TX_COUNTS_CANVAS (line 38) | const PKT_TX_COUNTS_CANVAS = "pkt-tx-counts-canvas";
constant PKT_TX_DELTA_CANVAS (line 39) | const PKT_TX_DELTA_CANVAS = "pkt-tx-delta-canvas";
constant PKT_TX_PACING_CANVAS (line 40) | const PKT_TX_PACING_CANVAS = "pkt-tx-pacing-canvas";
constant STREAM_MULTIPLEX_CANVAS (line 41) | const STREAM_MULTIPLEX_CANVAS = "stream-multiplex-canvas";
constant STREAM_ABS_DL_CANVAS (line 42) | const STREAM_ABS_DL_CANVAS = "abs_dl_canvas";
constant STREAM_REL_DL_CANVAS (line 43) | const STREAM_REL_DL_CANVAS = "rel_dl_canvas"
constant STREAM_ABS_UL_CANVAS (line 44) | const STREAM_ABS_UL_CANVAS = "abs_ul_canvas"
constant STREAM_REL_UL_CANVAS (line 45) | const STREAM_REL_UL_CANVAS = "rel_ul_canvas"
constant PENDING_CANVAS (line 46) | const PENDING_CANVAS = "pending_canvas"
function setupDarkmode (line 66) | function setupDarkmode() {
function setupCanvas (line 80) | function setupCanvas(div_id, canvas_id) {
function loadLog (line 105) | async function loadLog(event) {
function toggleElem (line 152) | function toggleElem(e) {
function toggleLegend (line 162) | function toggleLegend(event) {
function redrawByCanvasId (line 175) | function redrawByCanvasId(canvas_id) {
function drawOverview (line 213) | function drawOverview(resize) {
function drawFlowControl (line 232) | function drawFlowControl(resize) {
function drawPacketReceived (line 244) | function drawPacketReceived(resize) {
function drawPacketSent (line 256) | function drawPacketSent(resize) {
function drawStreamMultiplex (line 278) | function drawStreamMultiplex(resize) {
function drawSparks (line 297) | function drawSparks(resize) {
function drawPending (line 315) | function drawPending(resize) {
function toggleOverview (line 333) | function toggleOverview() {
function toggleFlowControl (line 344) | function toggleFlowControl() {
function togglePacketReceived (line 355) | function togglePacketReceived() {
function togglePacketSent (line 366) | function togglePacketSent() {
function toggleStreamMultiplex (line 377) | function toggleStreamMultiplex() {
function togglePending (line 388) | function togglePending() {
function toggleSparks (line 399) | function toggleSparks() {
function toggleEventList (line 417) | function toggleEventList() {
function render_events_table (line 428) | function render_events_table() {
function populate_event_table (line 454) | function populate_event_table() {
function setupTable (line 462) | function setupTable() {
function findCanvasIdInDiv (line 470) | function findCanvasIdInDiv(event) {
function resetZoom (line 491) | function resetZoom(event) {
function setupCanvasResizer (line 530) | function setupCanvasResizer(canvas_id) {
function canvasToPlotCoords (line 583) | function canvasToPlotCoords(canvasX, canvasY, chartBounds, plotRanges) {
function setupCanvasInteraction (line 601) | function setupCanvasInteraction(canvasId) {
function updateTooltip (line 709) | function updateTooltip(event, plotCoords, tooltip) {
function hideTooltip (line 744) | function hideTooltip(tooltip) {
FILE: qlog-dancer/src/config.rs
type AppConfig (line 42) | pub struct AppConfig {
method colors (line 80) | pub fn colors(dark_mode: bool) -> PlotColors {
method from_clap (line 88) | pub fn from_clap() -> std::result::Result<Self, String> {
FILE: qlog-dancer/src/datastore.rs
type ParseResult (line 69) | pub type ParseResult<T> = Result<T, serde_json::Error>;
type PacketInfoStub (line 71) | pub struct PacketInfoStub {
type StreamAccess (line 81) | pub struct StreamAccess {
type PrintStatsConfig (line 87) | pub struct PrintStatsConfig {
type RequestAtServerDeltas (line 97) | pub struct RequestAtServerDeltas {
type RequestAtClientDeltas (line 105) | pub struct RequestAtClientDeltas {
type RequestActor (line 116) | pub enum RequestActor {
method from (line 123) | fn from(value: VantagePoint) -> Self {
type VantagePoint (line 132) | pub enum VantagePoint {
type StreamDatapoint (line 139) | pub struct StreamDatapoint {
type ApplicationProto (line 145) | pub enum ApplicationProto {
method fmt (line 152) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 158) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type QuicSessionClose (line 169) | pub struct QuicSessionClose {
type H2SessionClose (line 185) | pub struct H2SessionClose {
type QuicStreamStopSending (line 199) | pub struct QuicStreamStopSending {
method fmt (line 205) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type QuicStreamReset (line 216) | pub struct QuicStreamReset {
method fmt (line 223) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type H2StreamReset (line 235) | pub struct H2StreamReset {
method fmt (line 241) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Datastore (line 247) | pub struct Datastore {
method consume_netlog_event (line 382) | pub fn consume_netlog_event(
method consume_netlog_quic (line 410) | fn consume_netlog_quic(
method consume_netlog_h3 (line 687) | fn consume_netlog_h3(
method consume_netlog_h2 (line 802) | fn consume_netlog_h2(
method consume_qlog_event (line 1090) | pub fn consume_qlog_event(
method with_qlog_events (line 1136) | pub fn with_qlog_events(
method finalize (line 1161) | pub fn finalize(&mut self) {
method hydrate_http_requests (line 1172) | pub fn hydrate_http_requests(&mut self) {
method consume_qlog_transport_parameters_set (line 1179) | fn consume_qlog_transport_parameters_set(
method consume_qlog_packet_received (line 1225) | fn consume_qlog_packet_received(
method consume_qlog_packet_sent (line 1356) | fn consume_qlog_packet_sent(
method consume_qlog_stream_data_moved (line 1456) | fn consume_qlog_stream_data_moved(
method consume_qlog_metrics_updated (line 1485) | fn consume_qlog_metrics_updated(
method consume_qlog_congestion_state_updated (line 1535) | fn consume_qlog_congestion_state_updated(
method get_or_insert_http_req (line 1549) | fn get_or_insert_http_req(&mut self, stream_id: u64) -> &mut HttpReque...
method consume_qlog_h3_frame_created_client (line 1559) | fn consume_qlog_h3_frame_created_client(
method consume_qlog_h3_frame_created_server (line 1598) | fn consume_qlog_h3_frame_created_server(
method consume_qlog_h3_frame_parsed_client (line 1628) | fn consume_qlog_h3_frame_parsed_client(
method consume_qlog_h3_frame_parsed_server (line 1665) | fn consume_qlog_h3_frame_parsed_server(
method with_sqlog_reader_events (line 1706) | pub fn with_sqlog_reader_events(
function is_bidi (line 377) | fn is_bidi(stream_id: u64) -> bool {
type NetlogSession (line 1743) | pub struct NetlogSession {
method fmt (line 1754) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type RequestDiscovery (line 1763) | pub struct RequestDiscovery {
type StreamBind (line 1768) | pub struct StreamBind {
type RequestDiscoveryMap (line 1774) | pub type RequestDiscoveryMap = BTreeMap<i64, RequestDiscovery>;
type StreamBindingMap (line 1775) | pub type StreamBindingMap = BTreeMap<i64, StreamBind>;
type ReqOverH3 (line 1778) | pub struct ReqOverH3 {
type RequestOverH3Map (line 1785) | pub type RequestOverH3Map = BTreeMap<i64, Vec<ReqOverH3>>;
function with_netlog_reader (line 1787) | pub fn with_netlog_reader<R: std::io::BufRead>(
FILE: qlog-dancer/src/lib.rs
type QlogPointu64 (line 46) | pub type QlogPointu64 = (f64, u64);
type QlogPointRtt (line 47) | pub type QlogPointRtt = (f64, f32);
type PacketType (line 50) | pub enum PacketType {
method from_qlog_packet_type (line 61) | pub fn from_qlog_packet_type(ty: &qlog::events::quic::PacketType) -> S...
method from_netlog_packet_header (line 75) | pub fn from_netlog_packet_header(
method from_netlog_encryption_level (line 95) | pub fn from_netlog_encryption_level(encryption_level: &str) -> Self {
type SerializationFormat (line 111) | pub enum SerializationFormat {
method from_file_extension (line 119) | pub fn from_file_extension(extension: &str) -> Self {
type VantagePointTypeShim (line 129) | pub struct VantagePointTypeShim {
method fmt (line 142) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
method default (line 134) | fn default() -> Self {
type LogFileDetails (line 147) | pub struct LogFileDetails {
type RawLogEvents (line 154) | pub enum RawLogEvents {
type LogFileData (line 160) | pub struct LogFileData {
type LogFileParseResult (line 165) | pub struct LogFileParseResult {
function parse_log_file (line 170) | pub fn parse_log_file(
function read_qlog_from_file (line 283) | pub fn read_qlog_from_file<P: AsRef<Path>>(
function qlog_seq_reader (line 294) | pub fn qlog_seq_reader(
function netlog_with_reader (line 321) | pub fn netlog_with_reader<R: std::io::BufRead>(
function stringify_last (line 357) | pub fn stringify_last<T>(src: &[T]) -> String
function push_interp (line 370) | fn push_interp<X: Clone, Y: Clone>(collection: &mut Vec<(X, Y)>, value: ...
function create_file_recursive (line 381) | fn create_file_recursive(filename: &str) -> std::io::Result<File> {
function category_and_type_from_name (line 390) | pub fn category_and_type_from_name(name: &str) -> (String, String) {
function category_and_type_from_event (line 404) | pub fn category_and_type_from_event<T: Serialize>(ev: &T) -> (String, St...
FILE: qlog-dancer/src/main.rs
function main (line 57) | fn main() {
function run (line 63) | fn run() -> i32 {
FILE: qlog-dancer/src/plots/colors.rs
constant FOREST_GREEN (line 31) | pub const FOREST_GREEN: RGBColor = RGBColor(15, 122, 27);
constant PURPLE (line 32) | pub const PURPLE: RGBColor = RGBColor(54, 2, 89);
constant TAUPE (line 33) | pub const TAUPE: RGBColor = RGBColor(133, 104, 3);
constant MID_GREY (line 34) | pub const MID_GREY: RGBColor = RGBColor(172, 172, 172);
constant ORANGE (line 35) | pub const ORANGE: RGBColor = RGBColor(201, 93, 4);
constant MUSTARD (line 36) | pub const MUSTARD: RGBColor = RGBColor(158, 150, 2);
constant SOFT_PINK (line 37) | pub const SOFT_PINK: RGBColor = RGBColor(158, 82, 94);
constant BROWN (line 38) | pub const BROWN: RGBColor = RGBColor(74, 38, 2);
constant BLUEY_BLACK (line 39) | pub const BLUEY_BLACK: RGBColor = RGBColor(23, 32, 42);
constant BLUEY_GREY (line 40) | pub const BLUEY_GREY: RGBColor = RGBColor(128, 139, 150);
constant TEAL (line 41) | pub const TEAL: RGBColor = RGBColor(0, 128, 128);
type ColorCycle (line 47) | pub struct ColorCycle {
method next_color (line 54) | pub fn next_color(&mut self) -> RGBColor {
method reset (line 65) | pub fn reset(&mut self) {
method default (line 71) | fn default() -> Self {
type PlotColors (line 184) | pub struct PlotColors {
method default (line 193) | fn default() -> Self {
constant LIGHT_MODE (line 198) | pub const LIGHT_MODE: PlotColors = PlotColors {
constant DARK_MODE (line 206) | pub const DARK_MODE: PlotColors = PlotColors {
FILE: qlog-dancer/src/plots/congestion_control.rs
function draw_congestion_plot (line 41) | pub fn draw_congestion_plot<'a, DB: DrawingBackend + 'a>(
function plot_cc_plot (line 95) | pub fn plot_cc_plot<'a>(
function draw_cc_updates (line 120) | fn draw_cc_updates<DB: DrawingBackend>(
function draw_bytes_in_flight (line 174) | fn draw_bytes_in_flight<DB: DrawingBackend>(
function draw_cwnd (line 184) | fn draw_cwnd<DB: DrawingBackend>(
function draw_ssthresh (line 194) | fn draw_ssthresh<DB: DrawingBackend>(
function cc_state_to_color (line 205) | fn cc_state_to_color(cc_state: &str) -> RGBColor {
FILE: qlog-dancer/src/plots/conn_flow_control.rs
constant Y_WIGGLE (line 40) | const Y_WIGGLE: f64 = 1.2;
type XYMinMax (line 42) | struct XYMinMax {
method init (line 49) | fn init(params: &PlotParameters, ss: &SeriesStore, ds: &Datastore) -> ...
method y_range (line 64) | fn y_range(&self) -> std::ops::Range<u64> {
method y_max (line 68) | fn y_max(ss: &SeriesStore, proto: &ApplicationProto) -> u64 {
function blocked_lines (line 83) | fn blocked_lines<DB: DrawingBackend>(
function received_data (line 101) | fn received_data<DB: DrawingBackend>(
function window_updates (line 119) | fn window_updates<DB: DrawingBackend>(
function draw_series (line 160) | fn draw_series<'a, DB: DrawingBackend + 'a>(
function plot_conn_flow_control_canvas (line 191) | pub fn plot_conn_flow_control_canvas<'a>(
function plot_conn_flow_control (line 225) | pub fn plot_conn_flow_control(
FILE: qlog-dancer/src/plots/conn_overview.rs
type XYMinMax (line 46) | struct XYMinMax {
method init (line 53) | fn init(params: &PlotParameters, ss: &SeriesStore, y_max: u64) -> Self {
method y_range (line 64) | fn y_range(&self) -> std::ops::Range<u64> {
type OverviewChartOutputType (line 70) | pub enum OverviewChartOutputType {
method from (line 85) | fn from(val: OverviewChartOutputType) -> Self {
function draw_sent_max_data (line 109) | fn draw_sent_max_data<DB: DrawingBackend>(
function draw_cumulative_sent_max_data (line 124) | fn draw_cumulative_sent_max_data<DB: DrawingBackend>(
function draw_sent_max_stream_data (line 139) | fn draw_sent_max_stream_data<DB: DrawingBackend>(
function draw_buffer_reads (line 155) | fn draw_buffer_reads<DB: DrawingBackend>(
function draw_cumulative_buffer_reads (line 171) | fn draw_cumulative_buffer_reads<DB: DrawingBackend>(
function draw_buffer_writes (line 186) | fn draw_buffer_writes<DB: DrawingBackend>(
function draw_cumulative_buffer_writes (line 202) | fn draw_cumulative_buffer_writes<DB: DrawingBackend>(
function draw_buffer_dropped (line 215) | fn draw_buffer_dropped<DB: DrawingBackend>(
function draw_cumulative_buffer_dropped (line 231) | fn draw_cumulative_buffer_dropped<DB: DrawingBackend>(
function draw_sent_stream_data (line 244) | fn draw_sent_stream_data<DB: DrawingBackend>(
function draw_received_max_data (line 260) | fn draw_received_max_data<DB: DrawingBackend>(
function draw_cumulative_received_stream_max_data (line 275) | fn draw_cumulative_received_stream_max_data<DB: DrawingBackend>(
function draw_main_plot (line 291) | fn draw_main_plot<'a, DB: DrawingBackend + 'a>(
function draw_stream_send_plot (line 344) | fn draw_stream_send_plot<'a, DB: DrawingBackend + 'a>(
function draw_stream_recv_plot (line 394) | fn draw_stream_recv_plot<'a, DB: DrawingBackend + 'a>(
function plot_connection_overview (line 443) | pub fn plot_connection_overview(
function plot_main_plot (line 518) | pub fn plot_main_plot<'a>(
FILE: qlog-dancer/src/plots/minmax.rs
type XMinMax (line 28) | pub struct XMinMax {
method new (line 34) | pub fn new(min: f64, max: f64, start: Option<f64>, end: Option<f64>) -...
method range (line 48) | pub fn range(&self) -> std::ops::Range<f64> {
type XYMinMax (line 53) | pub struct XYMinMax<Y> {
function init (line 59) | pub fn init(
FILE: qlog-dancer/src/plots/mod.rs
type ChartOutputType (line 38) | pub enum ChartOutputType {
type ChartConfig (line 51) | struct ChartConfig {
method chart_name (line 65) | pub fn chart_name(&self) -> String {
method chart_filepath (line 136) | pub fn chart_filepath(&self) -> String {
method init_chart_dir (line 147) | fn init_chart_dir(&self) {
method canvas_id (line 163) | fn canvas_id(&self) -> Option<String> {
function make_chart_bitmap_area (line 172) | pub fn make_chart_bitmap_area(
function make_chart_canvas_area (line 182) | pub fn make_chart_canvas_area(
function make_chart_config (line 192) | fn make_chart_config(
function chart_title_style (line 211) | pub fn chart_title_style(color: &RGBColor) -> TextStyle<'_> {
function chart_subtitle_style (line 215) | pub fn chart_subtitle_style(color: &RGBColor) -> TextStyle<'_> {
function chart_label_style (line 219) | pub fn chart_label_style(color: &RGBColor) -> TextStyle<'_> {
function draw_mesh (line 223) | fn draw_mesh<XT, YT, X, Y, DB: DrawingBackend>(
type ClampParams (line 254) | pub struct ClampParams {
type ChartSize (line 261) | pub struct ChartSize {
type ChartMargin (line 267) | pub struct ChartMargin {
type AreaMargin (line 275) | pub struct AreaMargin {
type PlotParameters (line 280) | pub struct PlotParameters {
function draw_line (line 292) | fn draw_line<DB: DrawingBackend>(
FILE: qlog-dancer/src/plots/packet_received.rs
function plot_packet_received (line 35) | pub fn plot_packet_received(
FILE: qlog-dancer/src/plots/packet_sent.rs
type XYMinMax (line 40) | struct XYMinMax {
method init (line 47) | fn init(params: &PlotParameters, ss: &SeriesStore, y_max: u64) -> Self {
method y_range (line 58) | fn y_range(&self) -> std::ops::Range<u64> {
constant Y_WIGGLE (line 63) | const Y_WIGGLE: f64 = 1.1;
function draw_packet_sent_received_plot (line 65) | pub fn draw_packet_sent_received_plot<'a, DB: DrawingBackend + 'a>(
function draw_packet_sent_lost_delivered_count_plot (line 162) | pub fn draw_packet_sent_lost_delivered_count_plot<'a, DB: DrawingBackend...
function draw_delta_plot (line 235) | fn draw_delta_plot<'a, DB: DrawingBackend + 'a>(
function draw_pacing_rate_plot (line 297) | fn draw_pacing_rate_plot<'a, DB: DrawingBackend + 'a>(
function plot_packet_sent (line 372) | pub fn plot_packet_sent(
function plot_packet_sent_plot_canvas (line 409) | pub fn plot_packet_sent_plot_canvas<'a>(
function plot_packet_sent_lost_delivered_count_plot (line 420) | pub fn plot_packet_sent_lost_delivered_count_plot<'a>(
function plot_packet_sent_delta_plot_canvas (line 431) | pub fn plot_packet_sent_delta_plot_canvas<'a>(
function plot_packet_sent_pacing_rate_plot_canvas (line 442) | pub fn plot_packet_sent_pacing_rate_plot_canvas<'a>(
FILE: qlog-dancer/src/plots/pending.rs
type PendingPlotParams (line 42) | pub struct PendingPlotParams {
type PendingStack (line 49) | struct PendingStack {
function plot_pending (line 55) | pub fn plot_pending(
FILE: qlog-dancer/src/plots/rtt.rs
function draw_rtt_series (line 39) | fn draw_rtt_series<DB: DrawingBackend>(
function draw_min_rtt (line 52) | fn draw_min_rtt<DB: DrawingBackend>(
function draw_latest_rtt (line 59) | fn draw_latest_rtt<DB: DrawingBackend>(
function draw_smoothed_rtt (line 66) | fn draw_smoothed_rtt<DB: DrawingBackend>(
function draw_rtt_plot (line 73) | pub fn draw_rtt_plot<'a, DB: DrawingBackend + 'a>(
function plot_rtt_plot (line 119) | pub fn plot_rtt_plot<'a>(
FILE: qlog-dancer/src/plots/stream_multiplex.rs
type MultiplexPlotsParams (line 40) | pub struct MultiplexPlotsParams {
method default (line 54) | fn default() -> Self {
function plot_stream_multiplexing (line 70) | pub fn plot_stream_multiplexing(
FILE: qlog-dancer/src/plots/stream_sparks.rs
type TransmissionType (line 53) | pub enum TransmissionType {
type SparkPlotsParams (line 59) | pub struct SparkPlotsParams {
method default (line 76) | fn default() -> Self {
type SparkCaption (line 96) | enum SparkCaption {
method request_at_client_from_stub (line 132) | fn request_at_client_from_stub(
method request_at_server_from_stub (line 223) | fn request_at_server_from_stub(
method from_data_store (line 306) | fn from_data_store(ds: &Datastore, stream_id: u64) -> Option<Self> {
method draw (line 333) | fn draw<DB: DrawingBackend>(
function plot_legend (line 515) | fn plot_legend<DB: DrawingBackend>(
function plot_sparks (line 609) | pub fn plot_sparks(
function draw_mesh (line 1131) | fn draw_mesh<XT, YT, X, Y, DB: DrawingBackend>(
function draw_captions (line 1149) | fn draw_captions<DB: DrawingBackend>(
function draw_stream_frames_line (line 1196) | fn draw_stream_frames_line<DB: DrawingBackend>(
function draw_buffered_data_line (line 1216) | fn draw_buffered_data_line<DB: DrawingBackend>(
function draw_stream_max_line (line 1245) | fn draw_stream_max_line<DB: DrawingBackend>(
function draw_request_timing_lines (line 1273) | fn draw_request_timing_lines<DB: DrawingBackend>(
FILE: qlog-dancer/src/reports/events.rs
type PrintableEvent (line 74) | struct PrintableEvent {
function frames_to_string (line 82) | pub fn frames_to_string(frames: &[QuicFrame]) -> String {
function http_frame_to_string (line 188) | fn http_frame_to_string(frame: &Http3Frame) -> String {
function sqlog_event_list (line 238) | pub fn sqlog_event_list(
FILE: qlog-dancer/src/reports/html.rs
constant HTML_INCLUDES (line 43) | const HTML_INCLUDES: &str = r#"
constant TABLE_INIT_SCRIPT (line 52) | const TABLE_INIT_SCRIPT: &str = r#"
constant REQUEST_TABLE_INIT_SCRIPT (line 77) | const REQUEST_TABLE_INIT_SCRIPT: &str = r#"
constant SESSIONS_STYLES (line 105) | const SESSIONS_STYLES: &str = r#"
function inject_table_id_class (line 127) | fn inject_table_id_class(
function overview (line 145) | pub fn overview(log_file: &LogFileParseResult, config: &AppConfig) {
function closures (line 204) | pub fn closures(log_file: &LogFileParseResult, config: &AppConfig) {
function requests (line 288) | pub fn requests(log_file: &LogFileParseResult, config: &AppConfig) {
function event_list_html_from_sqlog (line 397) | pub fn event_list_html_from_sqlog(events: &[qlog::reader::Event]) -> Str...
function event_list (line 409) | pub fn event_list(log_file: &LogFileParseResult, config: &AppConfig) {
function table_cell_value (line 453) | fn table_cell_value(cell: &HtmlElement) -> Option<String> {
type H2ClosureTableDecorator (line 471) | struct H2ClosureTableDecorator {
method visit_element_mut (line 476) | fn visit_element_mut(&mut self, e: &mut HtmlElement) -> bool {
type QUICClosureTableDecorator (line 523) | struct QUICClosureTableDecorator {
method visit_element_mut (line 528) | fn visit_element_mut(&mut self, e: &mut HtmlElement) -> bool {
type RequestTableDecorator (line 575) | struct RequestTableDecorator {
method visit_element_mut (line 580) | fn visit_element_mut(&mut self, e: &mut HtmlElement) -> bool {
FILE: qlog-dancer/src/reports/mod.rs
function report (line 35) | pub fn report(log_file: &LogFileParseResult, config: &AppConfig) {
FILE: qlog-dancer/src/reports/text.rs
function request_timing_table (line 45) | pub fn request_timing_table(
function print_stats (line 94) | pub fn print_stats(data_store: &Datastore, config: &PrintStatsConfig) {
function print_sent_packet_stats (line 125) | fn print_sent_packet_stats(data_store: &Datastore) {
function print_rx_max_data_frames (line 146) | fn print_rx_max_data_frames(data_store: &Datastore) {
function print_tx_max_data_frames (line 163) | fn print_tx_max_data_frames(data_store: &Datastore) {
function print_rx_max_stream_data_frames (line 173) | fn print_rx_max_stream_data_frames(data_store: &Datastore) {
function print_tx_max_stream_data_frames (line 194) | fn print_tx_max_stream_data_frames(data_store: &Datastore) {
function print_tx_reset_stream_frames (line 215) | fn print_tx_reset_stream_frames(data_store: &Datastore) {
function print_rx_reset_stream_frames (line 232) | fn print_rx_reset_stream_frames(data_store: &Datastore) {
function print_local_stream_buffer_reads (line 249) | fn print_local_stream_buffer_reads(data_store: &Datastore) {
function print_local_stream_buffer_writes (line 269) | fn print_local_stream_buffer_writes(data_store: &Datastore) {
function print_local_stream_buffer_dropped (line 293) | fn print_local_stream_buffer_dropped(data_store: &Datastore) {
function print_tx_stream_frames (line 317) | fn print_tx_stream_frames(data_store: &Datastore) {
function print_flow_control (line 349) | pub fn print_flow_control(data: &[LogFileData]) {
function print_packet_loss (line 387) | pub fn print_packet_loss(data: &[LogFileData]) {
FILE: qlog-dancer/src/request_stub.rs
constant CLIENT_CONTENT_LENGTH (line 39) | pub const CLIENT_CONTENT_LENGTH: &str = "Request Content-Length";
constant CLIENT_TRANSFERRED (line 40) | pub const CLIENT_TRANSFERRED: &str = "Request Transferred";
constant UPLOAD_TIME (line 41) | pub const UPLOAD_TIME: &str = "Upload duration (ms)";
constant UPLOAD_RATE (line 42) | pub const UPLOAD_RATE: &str = "Upload rate (Mbps)";
constant SERVER_RX_HDR_TX_HDR (line 43) | pub const SERVER_RX_HDR_TX_HDR: &str = "Server Rx Hdr, Tx Hdr";
constant SERVER_TX_HDR_TX_FIRST_HDR (line 44) | pub const SERVER_TX_HDR_TX_FIRST_HDR: &str = "Server Tx Hdr, Tx First Hdr";
constant SERVER_TX_HDR_TX_LAST_HDR (line 45) | pub const SERVER_TX_HDR_TX_LAST_HDR: &str = "Server Tx Hdr, Tx Last Hdr";
constant SERVER_TX_FIRST_DATA_TX_LAST_DATA (line 46) | pub const SERVER_TX_FIRST_DATA_TX_LAST_DATA: &str =
constant CLIENT_PRI (line 49) | pub const CLIENT_PRI: &str = "Client Priority Header";
constant SERVER_PRI (line 50) | pub const SERVER_PRI: &str = "Server Priority Header";
constant MAX_PATH_LENGTH (line 52) | const MAX_PATH_LENGTH: usize = 80;
type NaOption (line 55) | pub struct NaOption<T> {
function new (line 60) | pub fn new(value: Option<T>) -> Self {
method fmt (line 66) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type HttpRequestStub (line 75) | pub struct HttpRequestStub {
method client_deltas (line 151) | fn client_deltas(&self) -> ClientDeltaStrings {
method server_deltas (line 167) | fn server_deltas(&self) -> (String, String, String, String) {
constant LENGTH (line 190) | const LENGTH: usize = 28;
method fields (line 192) | fn fields(&self) -> Vec<Cow<'_, str>> {
method headers (line 290) | fn headers() -> Vec<Cow<'static, str>> {
method set_request_info_from_netlog (line 334) | pub fn set_request_info_from_netlog(&mut self, hdrs: &[String]) {
method set_response_info_from_netlog (line 346) | pub fn set_response_info_from_netlog(&mut self, hdrs: &[String]) {
method set_request_info_from_qlog (line 356) | pub fn set_request_info_from_qlog(&mut self, hdrs: &[HttpHeader]) {
method set_response_info_from_qlog (line 365) | pub fn set_response_info_from_qlog(&mut self, hdrs: &[HttpHeader]) {
method maybe_megabits_per_second (line 373) | fn maybe_megabits_per_second(
method calculate_upload_download_rate (line 398) | pub fn calculate_upload_download_rate(&mut self) {
method maybe_time_delta (line 436) | fn maybe_time_delta(start: Option<f64>, end: Option<f64>) -> NaOption<...
method calculate_deltas (line 444) | pub fn calculate_deltas(&mut self) {
type ClientDeltaStrings (line 124) | struct ClientDeltaStrings {
method default (line 135) | fn default() -> Self {
function find_header_value (line 327) | pub fn find_header_value(hdrs: &[HttpHeader], name: &str) -> Option<Stri...
FILE: qlog-dancer/src/seriesstore.rs
type SeriesStore (line 38) | pub struct SeriesStore {
method from_datastore (line 126) | pub fn from_datastore(data_store: &Datastore) -> Self {
method update_sent_x_axis_max (line 134) | fn update_sent_x_axis_max(&mut self, x: f64) {
method update_received_x_axis_max (line 138) | fn update_received_x_axis_max(&mut self, x: f64) {
method update_congestion_y_axis_max (line 142) | fn update_congestion_y_axis_max(&mut self, y: u64) {
method update_stream_send_y_axis_max (line 146) | fn update_stream_send_y_axis_max(&mut self, y: u64) {
method update_stream_recv_y_axis_max (line 150) | fn update_stream_recv_y_axis_max(&mut self, y: u64) {
method update_rtt_y_axis_max (line 154) | fn update_rtt_y_axis_max(&mut self, y: f32) {
method cwnd (line 158) | fn cwnd(&mut self, data_store: &Datastore) {
method bif (line 167) | fn bif(&mut self, data_store: &Datastore) {
method min_rtt (line 176) | fn min_rtt(&mut self, data_store: &Datastore) {
method latest_rtt (line 185) | fn latest_rtt(&mut self, data_store: &Datastore) {
method pacing_rate (line 194) | fn pacing_rate(&mut self, data_store: &Datastore) {
method delivery_rate (line 203) | fn delivery_rate(&mut self, data_store: &Datastore) {
method send_rate (line 212) | fn send_rate(&mut self, data_store: &Datastore) {
method ack_rate (line 221) | fn ack_rate(&mut self, data_store: &Datastore) {
method ssthresh (line 230) | fn ssthresh(&mut self, data_store: &Datastore) {
method smoothed_rtt (line 239) | fn smoothed_rtt(&mut self, data_store: &Datastore) {
method sent_max_data (line 248) | fn sent_max_data(&mut self, data_store: &Datastore) {
method sum_sent_stream_max_data (line 257) | fn sum_sent_stream_max_data(&mut self, data_store: &Datastore) {
method packet_sent (line 266) | fn packet_sent(&mut self, data_store: &Datastore) {
method packet_recv (line 334) | fn packet_recv(&mut self, data_store: &Datastore) {
method missing_packets (line 349) | fn missing_packets(&mut self, data_store: &Datastore) {
method sent_stream_max_data (line 368) | fn sent_stream_max_data(&mut self, data_store: &Datastore) {
method received_stream_max_data (line 385) | fn received_stream_max_data(&mut self, data_store: &Datastore) {
method stream_buffer_reads (line 402) | fn stream_buffer_reads(&mut self, data_store: &Datastore) {
method sum_stream_buffer_reads (line 420) | fn sum_stream_buffer_reads(&mut self, data_store: &Datastore) {
method stream_buffer_writes (line 426) | fn stream_buffer_writes(&mut self, data_store: &Datastore) {
method sum_stream_buffer_writes (line 445) | fn sum_stream_buffer_writes(&mut self, data_store: &Datastore) {
method stream_buffer_dropped (line 457) | fn stream_buffer_dropped(&mut self, data_store: &Datastore) {
method sum_stream_buffer_dropped (line 476) | fn sum_stream_buffer_dropped(&mut self, data_store: &Datastore) {
method sent_stream_frames (line 488) | fn sent_stream_frames(&mut self, data_store: &Datastore) {
method received_stream_frames (line 514) | fn received_stream_frames(&mut self, data_store: &Datastore) {
method received_data_frames (line 532) | fn received_data_frames(&mut self, data_store: &Datastore) {
method sent_data_frames (line 564) | fn sent_data_frames(&mut self, data_store: &Datastore) {
method initial_h2_fc_value (line 599) | fn initial_h2_fc_value(stream_id: u32, data_store: &Datastore) -> u32 {
method h2_fc_balanced (line 613) | fn h2_fc_balanced(&mut self, data_store: &Datastore) {
method h2_fc_absolute (line 645) | fn h2_fc_absolute(&mut self, data_store: &Datastore) {
method netlog_quic_client_side_window_updates (line 678) | fn netlog_quic_client_side_window_updates(&mut self, data_store: &Data...
method netlog_h2_stream_received_connection_cumulative (line 692) | fn netlog_h2_stream_received_connection_cumulative(
method netlog_quic_stream_received_connection_cumulative (line 703) | fn netlog_quic_stream_received_connection_cumulative(
method received_max_data (line 715) | fn received_max_data(&mut self, data_store: &Datastore) {
method sum_received_stream_max_data (line 721) | fn sum_received_stream_max_data(&mut self, data_store: &Datastore) {
method populate_series_values (line 727) | fn populate_series_values(&mut self, data_store: &Datastore) {
FILE: qlog-dancer/src/trackers/stream_buffer_tracker.rs
type StreamBufferTracker (line 35) | pub struct StreamBufferTracker {
method new (line 50) | pub fn new() -> Self {
method update (line 56) | pub fn update(
method get_stream_max (line 81) | pub fn get_stream_max(&self, stream_id: u64) -> Option<u64> {
method current_sum (line 85) | pub fn current_sum(&self) -> u64 {
function test_tracker_empty (line 95) | fn test_tracker_empty() {
function test_tracker_single_stream_in_order (line 104) | fn test_tracker_single_stream_in_order() {
function test_tracker_out_of_order_events (line 135) | fn test_tracker_out_of_order_events() {
function test_tracker_multiple_streams (line 181) | fn test_tracker_multiple_streams() {
function test_tracker_duplicate_values (line 231) | fn test_tracker_duplicate_values() {
function test_tracker_running_sum_correctness (line 262) | fn test_tracker_running_sum_correctness() {
function test_tracker_preserves_stream_access (line 305) | fn test_tracker_preserves_stream_access() {
FILE: qlog-dancer/src/trackers/stream_max_tracker.rs
type StreamMaxTracker (line 33) | pub struct StreamMaxTracker {
method new (line 48) | pub fn new() -> Self {
method update (line 53) | pub fn update(
method get_stream_max (line 78) | pub fn get_stream_max(&self, stream_id: u64) -> Option<u64> {
method current_sum (line 82) | pub fn current_sum(&self) -> u64 {
function test_tracker_empty (line 92) | fn test_tracker_empty() {
function test_tracker_single_stream_in_order (line 101) | fn test_tracker_single_stream_in_order() {
function test_tracker_out_of_order_events (line 118) | fn test_tracker_out_of_order_events() {
function test_tracker_multiple_streams (line 140) | fn test_tracker_multiple_streams() {
function test_tracker_duplicate_values (line 162) | fn test_tracker_duplicate_values() {
function test_tracker_running_sum_correctness (line 179) | fn test_tracker_running_sum_correctness() {
function test_tracker_complex_interleaving (line 194) | fn test_tracker_complex_interleaving() {
function test_tracker_init_value (line 219) | fn test_tracker_init_value() {
FILE: qlog-dancer/src/web.rs
constant AREA_MARGIN (line 70) | const AREA_MARGIN: AreaMargin = AreaMargin { x: 50, y: 100 };
constant CHART_MARGIN (line 71) | const CHART_MARGIN: ChartMargin = ChartMargin {
constant CHART_MARGIN_TIGHT (line 77) | const CHART_MARGIN_TIGHT: ChartMargin = ChartMargin {
type Pointu64 (line 85) | pub struct Pointu64 {
type ChartBounds (line 91) | pub struct ChartBounds {
type PlotRanges (line 99) | pub struct PlotRanges<T, U> {
type ChartInfo (line 107) | pub struct ChartInfo<T, U> {
function with_f32_u64 (line 113) | pub fn with_f32_u64(
function with_f32_f32 (line 142) | pub fn with_f32_f32(
function with_u64_f32 (line 171) | pub fn with_u64_f32(
function into (line 206) | fn into(self) -> JsValue {
function new_qlog_dancer (line 216) | pub fn new_qlog_dancer(display_name: &str) -> QlogDancerWeb {
type QlogDancerWeb (line 244) | pub struct QlogDancerWeb {
method process_chunk (line 266) | pub fn process_chunk(&mut self, chunk: &[u8]) {
method read_stream (line 303) | pub async fn read_stream(&mut self, readable: web_sys::ReadableStream) {
method try_read_event (line 316) | pub fn try_read_event(&mut self, buf: &[u8]) -> Result<(), String> {
method total_packets_sent (line 341) | pub fn total_packets_sent(&self) -> usize {
method populate_datastore (line 351) | pub fn populate_datastore(&mut self) {
method populate_seriesstore (line 374) | pub fn populate_seriesstore(&mut self) {
method get_chart_info (line 379) | pub fn get_chart_info(&self, canvas_id: &str) -> JsValue {
method draw_connection_overview (line 405) | pub fn draw_connection_overview(
method draw_cc_plot (line 440) | pub fn draw_cc_plot(
method draw_rtt_plot (line 474) | pub fn draw_rtt_plot(
method draw_flow_control (line 506) | pub fn draw_flow_control(&mut self, canvas_id: &str, display_legend: b...
method draw_sparks (line 545) | pub fn draw_sparks(
method draw_packet_received (line 588) | pub fn draw_packet_received(
method draw_pending (line 627) | pub fn draw_pending(&mut self, canvas_id: &str) {
method draw_packet_sent_plot (line 659) | pub fn draw_packet_sent_plot(
method draw_packet_sent_lost_delivered_count_plot (line 697) | pub fn draw_packet_sent_lost_delivered_count_plot(
method draw_packet_sent_delta_plot (line 732) | pub fn draw_packet_sent_delta_plot(
method draw_packet_sent_pacing_plot (line 769) | pub fn draw_packet_sent_pacing_plot(
method draw_stream_multiplexing (line 807) | pub fn draw_stream_multiplexing(&mut self, canvas_id: &str) {
method populate_event_table (line 834) | pub fn populate_event_table(&self, event_div_id: &str) {
method packet_sent (line 847) | pub fn packet_sent(&self) -> Vec<Pointu64> {
FILE: qlog-dancer/src/wirefilter.rs
function stream_ids (line 38) | fn stream_ids(event: &Event) -> TypedArray<'_, i64> {
function filter_sqlog_events (line 90) | pub fn filter_sqlog_events(mut events: Vec<Event>, filter: &str) -> Vec<...
function stream_frame (line 178) | fn stream_frame(stream_id: u64) -> QuicFrame {
function events (line 193) | fn events() -> Vec<Event> {
function test_stream_id_filter_no_match (line 291) | fn test_stream_id_filter_no_match() {
function test_stream_id_filter_stream0 (line 301) | fn test_stream_id_filter_stream0() {
function test_stream_id_filter_stream1 (line 334) | fn test_stream_id_filter_stream1() {
function test_stream_id_filter_stream0_and_stream3 (line 397) | fn test_stream_id_filter_stream0_and_stream3() {
FILE: qlog/src/events/http3.rs
type Initiator (line 34) | pub enum Initiator {
type StreamType (line 41) | pub enum StreamType {
type PushDecision (line 54) | pub enum PushDecision {
type PriorityTargetStreamType (line 61) | pub enum PriorityTargetStreamType {
type Http3EventType (line 68) | pub enum Http3EventType {
type HttpHeader (line 82) | pub struct HttpHeader {
type Setting (line 91) | pub struct Setting {
type Http3FrameTypeName (line 99) | pub enum Http3FrameTypeName {
type Http3Frame (line 120) | pub enum Http3Frame {
method default (line 167) | fn default() -> Self {
type ParametersSet (line 177) | pub struct ParametersSet {
type ParametersRestored (line 193) | pub struct ParametersRestored {
type StreamTypeSet (line 204) | pub struct StreamTypeSet {
type PriorityUpdatedTrigger (line 214) | pub enum PriorityUpdatedTrigger {
type PriorityUpdatedReason (line 222) | pub enum PriorityUpdatedReason {
type PriorityUpdated (line 231) | pub struct PriorityUpdated {
type FrameCreated (line 242) | pub struct FrameCreated {
type FrameParsed (line 252) | pub struct FrameParsed {
type DatagramCreated (line 262) | pub struct DatagramCreated {
type DatagramParsed (line 270) | pub struct DatagramParsed {
type PushResolved (line 278) | pub struct PushResolved {
FILE: qlog/src/events/mod.rs
type ExData (line 37) | pub type ExData = BTreeMap<String, serde_json::Value>;
constant LOGLEVEL_URI (line 39) | pub const LOGLEVEL_URI: &str = "urn:ietf:params:qlog:events:loglevel-13";
constant QUIC_URI (line 41) | pub const QUIC_URI: &str = "urn:ietf:params:qlog:events:quic-12";
constant HTTP3_URI (line 42) | pub const HTTP3_URI: &str = "urn:ietf:params:qlog:events:http3-12";
type EventType (line 46) | pub enum EventType {
method from (line 303) | fn from(event_data: &EventData) -> Self {
type TimeFormat (line 59) | pub enum TimeFormat {
type Event (line 67) | pub struct Event {
method with_time (line 103) | pub fn with_time(time: f64, data: EventData) -> Self {
method with_time_ex (line 108) | pub fn with_time_ex(time: f64, data: EventData, ex_data: ExData) -> Se...
method eq (line 134) | fn eq(&self, other: &Event) -> bool {
type JsonEvent (line 145) | pub struct JsonEvent {
type EventImportance (line 166) | pub enum EventImportance {
method is_contained_in (line 175) | pub fn is_contained_in(&self, other: &EventImportance) -> bool {
method from (line 192) | fn from(ty: EventType) -> Self {
type Eventable (line 296) | pub trait Eventable {
method importance (line 123) | fn importance(&self) -> EventImportance {
method set_time (line 127) | fn set_time(&mut self, time: f64) {
method importance (line 156) | fn importance(&self) -> EventImportance {
method set_time (line 160) | fn set_time(&mut self, time: f64) {
method importance (line 297) | fn importance(&self) -> EventImportance;
method set_time (line 299) | fn set_time(&mut self, time: f64);
type DataRecipient (line 423) | pub enum DataRecipient {
type RawInfo (line 433) | pub struct RawInfo {
type EventData (line 444) | pub enum EventData {
method contains_quic_frames (line 619) | pub fn contains_quic_frames(&self) -> Option<usize> {
type LogLevelEventType (line 642) | pub enum LogLevelEventType {
type ConnectionClosedEventError (line 652) | pub enum ConnectionClosedEventError {
type ConnectionClosedFrameError (line 659) | pub enum ConnectionClosedFrameError {
type ApplicationError (line 667) | pub enum ApplicationError {
type CryptoError (line 691) | pub enum CryptoError {
type TupleEndpointInfo (line 697) | pub struct TupleEndpointInfo {
FILE: qlog/src/events/quic.rs
type PacketType (line 47) | pub enum PacketType {
type PacketHeader (line 66) | pub struct PacketHeader {
method new (line 90) | pub fn new(
method with_type (line 134) | pub fn with_type(
type PacketNumberSpace (line 157) | pub enum PacketNumberSpace {
type StreamType (line 165) | pub enum StreamType {
type StreamTrigger (line 172) | pub enum StreamTrigger {
type StreamState (line 179) | pub enum StreamState {
type ErrorSpace (line 201) | pub enum ErrorSpace {
type TransportError (line 208) | pub enum TransportError {
type QuicEventType (line 231) | pub enum QuicEventType {
type TransportInitiator (line 276) | pub enum TransportInitiator {
type ConnectionState (line 283) | pub enum ConnectionState {
type ConnectionClosedTrigger (line 297) | pub enum ConnectionClosedTrigger {
type ServerListening (line 309) | pub struct ServerListening {
type ConnectionStarted (line 320) | pub struct ConnectionStarted {
type ConnectionClosed (line 327) | pub struct ConnectionClosed {
type ConnectionIdUpdated (line 342) | pub struct ConnectionIdUpdated {
type SpinBitUpdated (line 351) | pub struct SpinBitUpdated {
type ConnectionStateUpdated (line 357) | pub struct ConnectionStateUpdated {
type TupleAssigned (line 364) | pub struct TupleAssigned {
type MtuUpdated (line 372) | pub struct MtuUpdated {
type PacketSentTrigger (line 380) | pub enum PacketSentTrigger {
type PacketReceivedTrigger (line 390) | pub enum PacketReceivedTrigger {
type PacketDroppedTrigger (line 396) | pub enum PacketDroppedTrigger {
type PacketBufferedTrigger (line 408) | pub enum PacketBufferedTrigger {
type AckedRanges (line 415) | pub enum AckedRanges {
type QuicFrameTypeName (line 422) | pub enum QuicFrameTypeName {
type QuicFrame (line 457) | pub enum QuicFrame {
type PreferredAddress (line 595) | pub struct PreferredAddress {
type AlpnIdentifier (line 608) | pub struct AlpnIdentifier {
type QuicVersionInformation (line 615) | pub struct QuicVersionInformation {
type AlpnInformation (line 623) | pub struct AlpnInformation {
type ParametersSet (line 631) | pub struct ParametersSet {
type UnknownTransportParameter (line 666) | pub struct UnknownTransportParameter {
type ParametersRestored (line 673) | pub struct ParametersRestored {
type Ecn (line 692) | pub enum Ecn {
type UdpDatagramsReceived (line 705) | pub struct UdpDatagramsReceived {
type UdpDatagramsSent (line 714) | pub struct UdpDatagramsSent {
type UdpDatagramDropped (line 723) | pub struct UdpDatagramDropped {
type PacketReceived (line 729) | pub struct PacketReceived {
type PacketSent (line 748) | pub struct PacketSent {
type PacketDropped (line 770) | pub struct PacketDropped {
type PacketBuffered (line 783) | pub struct PacketBuffered {
type PacketsAcked (line 794) | pub struct PacketsAcked {
type StreamStateUpdated (line 801) | pub struct StreamStateUpdated {
type FramesProcessed (line 813) | pub struct FramesProcessed {
type DataMovedAdditionalInfo (line 821) | pub enum DataMovedAdditionalInfo {
type StreamDataMoved (line 828) | pub struct StreamDataMoved {
type DatagramDataMoved (line 839) | pub struct DatagramDataMoved {
type BlockedState (line 847) | pub enum BlockedState {
type BlockedReason (line 856) | pub enum BlockedReason {
type ConnectionDataBlockedUpdated (line 869) | pub struct ConnectionDataBlockedUpdated {
type StreamDataBlockedUpdated (line 877) | pub struct StreamDataBlockedUpdated {
type DatagramDataBlockedUpdated (line 886) | pub struct DatagramDataBlockedUpdated {
type MigrationState (line 894) | pub enum MigrationState {
type MigrationStateUpdated (line 907) | pub struct MigrationStateUpdated {
type CongestionStateUpdatedTrigger (line 919) | pub enum CongestionStateUpdatedTrigger {
type TimerType (line 928) | pub enum TimerType {
type PacketLostTrigger (line 941) | pub enum PacketLostTrigger {
type TimerEventType (line 951) | pub enum TimerEventType {
type RecoveryParametersSet (line 961) | pub struct RecoveryParametersSet {
type RecoveryMetricsUpdated (line 976) | pub struct RecoveryMetricsUpdated {
type CongestionStateUpdated (line 1003) | pub struct CongestionStateUpdated {
type TimerUpdated (line 1012) | pub struct TimerUpdated {
type PacketLost (line 1022) | pub struct PacketLost {
type MarkedForRetransmit (line 1033) | pub struct MarkedForRetransmit {
type EcnState (line 1039) | pub enum EcnState {
type EcnStateUpdated (line 1049) | pub struct EcnStateUpdated {
type KeyType (line 1056) | pub enum KeyType {
type KeyUpdateOrRetiredTrigger (line 1077) | pub enum KeyUpdateOrRetiredTrigger {
type KeyUpdated (line 1085) | pub struct KeyUpdated {
type KeyDiscarded (line 1098) | pub struct KeyDiscarded {
FILE: qlog/src/lib.rs
type Error (line 401) | pub enum Error {
method fmt (line 417) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
method source (line 423) | fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
method from (line 429) | fn from(err: std::io::Error) -> Self {
constant QLOGFILE_URI (line 434) | pub const QLOGFILE_URI: &str = "urn:ietf:params:qlog:file:contained";
constant QLOGFILESEQ_URI (line 435) | pub const QLOGFILESEQ_URI: &str = "urn:ietf:params:qlog:file:sequential";
type Bytes (line 437) | pub type Bytes = String;
type StatelessResetToken (line 438) | pub type StatelessResetToken = Bytes;
type Result (line 446) | pub type Result<T> = std::result::Result<T, Error>;
type Qlog (line 450) | pub struct Qlog {
type QlogSeq (line 460) | pub struct QlogSeq {
type ImportanceLogLevel (line 470) | pub enum ImportanceLogLevel {
type Trace (line 480) | pub struct Trace {
method new (line 493) | pub fn new(
method push_event (line 509) | pub fn push_event(&mut self, event: Event) {
type TraceSeq (line 516) | pub struct TraceSeq {
method new (line 527) | pub fn new(
type VantagePoint (line 544) | pub struct VantagePoint {
type VantagePointType (line 555) | pub enum VantagePointType {
type ReferenceTime (line 565) | pub struct ReferenceTime {
type CommonFields (line 573) | pub struct CommonFields {
type TokenType (line 584) | pub enum TokenType {
type Token (line 591) | pub struct Token {
type HexSlice (line 600) | pub struct HexSlice<'a>(&'a [u8]);
function new (line 603) | pub fn new<T>(data: &'a T) -> HexSlice<'a>
function maybe_string (line 610) | pub fn maybe_string<T>(data: Option<&'a T>) -> Option<String>
function fmt (line 619) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
FILE: qlog/src/reader.rs
type Event (line 32) | pub enum Event {
type QlogSeqReader (line 44) | pub struct QlogSeqReader<'a> {
function new (line 50) | pub fn new(
function read_record (line 69) | fn read_record(
type Item (line 85) | type Item = Event;
method next (line 88) | fn next(&mut self) -> Option<Self::Item> {
FILE: qlog/src/streamer.rs
constant TIME_PRECISION_MULTIPLIER (line 35) | const TIME_PRECISION_MULTIPLIER: f64 = 1e6;
function elapsed_millis (line 39) | fn elapsed_millis(start: std::time::Instant, now: std::time::Instant) ->...
type StreamerState (line 62) | pub enum StreamerState {
type QlogStreamer (line 68) | pub struct QlogStreamer {
method new (line 87) | pub fn new(
method start_log (line 122) | pub fn start_log(&mut self) -> Result<()> {
method finish_log (line 140) | pub fn finish_log(&mut self) -> Result<()> {
method add_event_now (line 156) | pub fn add_event_now<E: Serialize + Eventable>(
method add_event_now_pretty (line 166) | pub fn add_event_now_pretty<E: Serialize + Eventable>(
method add_event_with_instant (line 176) | pub fn add_event_with_instant<E: Serialize + Eventable>(
method add_event_with_instant_pretty (line 184) | pub fn add_event_with_instant_pretty<E: Serialize + Eventable>(
method event_with_instant (line 190) | fn event_with_instant<E: Serialize + Eventable>(
method add_event_data_now (line 212) | pub fn add_event_data_now(&mut self, event_data: EventData) -> Result<...
method add_event_data_now_pretty (line 218) | pub fn add_event_data_now_pretty(
method add_event_data_ex_now (line 226) | pub fn add_event_data_ex_now(
method add_event_data_ex_now_pretty (line 236) | pub fn add_event_data_ex_now_pretty(
method add_event_data_with_instant (line 246) | pub fn add_event_data_with_instant(
method add_event_data_with_instant_pretty (line 254) | pub fn add_event_data_with_instant_pretty(
method add_event_data_ex_with_instant (line 266) | pub fn add_event_data_ex_with_instant(
method add_event_data_ex_with_instant_pretty (line 275) | pub fn add_event_data_ex_with_instant_pretty(
method event_data_ex_with_instant (line 282) | fn event_data_ex_with_instant(
method add_event (line 309) | pub fn add_event<E: Serialize + Eventable>(
method add_event_pretty (line 317) | pub fn add_event_pretty<E: Serialize + Eventable>(
method write_event (line 324) | fn write_event<E: Serialize + Eventable>(
method writer (line 350) | pub fn writer(&self) -> &Box<dyn std::io::Write + Send + Sync> {
method start_time (line 354) | pub fn start_time(&self) -> std::time::Instant {
method drop (line 360) | fn drop(&mut self) {
function serialization_states (line 379) | fn serialization_states() {
function stream_json_event (line 500) | fn stream_json_event() {
function stream_data_ex (line 542) | fn stream_data_ex() {
FILE: qlog/src/testing/event_tests.rs
function packet_sent_event_no_frames (line 38) | fn packet_sent_event_no_frames() {
function packet_sent_event_some_frames (line 79) | fn packet_sent_event_some_frames() {
constant MIN_RTT (line 162) | const MIN_RTT: f32 = 10.0;
constant SMOOTHED_RTT (line 163) | const SMOOTHED_RTT: f32 = 15.0;
constant CONGESTION_WINDOW (line 164) | const CONGESTION_WINDOW: u64 = 12000;
constant PACING_RATE (line 165) | const PACING_RATE: u64 = 500000;
constant DELIVERY_RATE (line 166) | const DELIVERY_RATE: u64 = 1000000;
constant COLLISION_VALUE (line 167) | const COLLISION_VALUE: f32 = 999.0;
function packet_header (line 170) | fn packet_header() {
function metrics_updated_with_ex_data (line 187) | fn metrics_updated_with_ex_data() {
function metrics_updated_ex_data_collision (line 213) | fn metrics_updated_ex_data_collision() {
function metrics_updated_round_trip (line 237) | fn metrics_updated_round_trip() {
function metrics_updated_no_ex_data (line 271) | fn metrics_updated_no_ex_data() {
FILE: qlog/src/testing/mod.rs
function make_pkt_hdr (line 36) | pub fn make_pkt_hdr(packet_type: PacketType) -> PacketHeader {
function make_trace (line 54) | pub fn make_trace() -> Trace {
function make_trace_seq (line 68) | pub fn make_trace_seq() -> TraceSeq {
FILE: qlog/src/testing/trace_tests.rs
function trace_no_events (line 38) | fn trace_no_events() {
function trace_seq_no_events (line 59) | fn trace_seq_no_events() {
function trace_single_transport_event (line 79) | fn trace_single_transport_event() {
FILE: quiche/examples/client.c
type conn_io (line 49) | struct conn_io {
function debug_log (line 60) | static void debug_log(const char *line, void *argp) {
function flush_egress (line 64) | static void flush_egress(struct ev_loop *loop, struct conn_io *conn_io) {
function recv_cb (line 100) | static void recv_cb(EV_P_ ev_io *w, int revents) {
function timeout_cb (line 206) | static void timeout_cb(EV_P_ ev_timer *w, int revents) {
function main (line 229) | int main(int argc, char *argv[]) {
FILE: quiche/examples/client.rs
constant MAX_DATAGRAM_SIZE (line 32) | const MAX_DATAGRAM_SIZE: usize = 1350;
constant HTTP_REQ_STREAM_ID (line 34) | const HTTP_REQ_STREAM_ID: u64 = 4;
function main (line 36) | fn main() {
function hex_dump (line 277) | fn hex_dump(buf: &[u8]) -> String {
FILE: quiche/examples/http3-client.c
type conn_io (line 49) | struct conn_io {
function debug_log (line 64) | static void debug_log(const char *line, void *argp) {
function flush_egress (line 68) | static void flush_egress(struct ev_loop *loop, struct conn_io *conn_io) {
function for_each_setting (line 104) | static int for_each_setting(uint64_t identifier, uint64_t value,
function for_each_header (line 112) | static int for_each_header(uint8_t *name, size_t name_len,
function recv_cb (line 121) | static void recv_cb(EV_P_ ev_io *w, int revents) {
function timeout_cb (line 329) | static void timeout_cb(EV_P_ ev_timer *w, int revents) {
function main (line 352) | int main(int argc, char *argv[]) {
FILE: quiche/examples/http3-client.rs
constant MAX_DATAGRAM_SIZE (line 34) | const MAX_DATAGRAM_SIZE: usize = 1350;
function main (line 36) | fn main() {
function hex_dump (line 334) | fn hex_dump(buf: &[u8]) -> String {
function hdrs_to_strings (line 340) | pub fn hdrs_to_strings(hdrs: &[quiche::h3::Header]) -> Vec<(String, Stri...
FILE: quiche/examples/http3-server.c
type connections (line 55) | struct connections {
type conn_io (line 64) | struct conn_io {
type connections (line 84) | struct connections
function debug_log (line 88) | static void debug_log(const char *line, void *argp) {
function flush_egress (line 92) | static void flush_egress(struct ev_loop *loop, struct conn_io *conn_io) {
function mint_token (line 127) | static void mint_token(const uint8_t *dcid, size_t dcid_len,
function validate_token (line 137) | static bool validate_token(const uint8_t *token, size_t token_len,
type conn_io (line 181) | struct conn_io
type sockaddr (line 183) | struct sockaddr
type sockaddr_storage (line 185) | struct sockaddr_storage
type conn_io (line 188) | struct conn_io
type sockaddr (line 204) | struct sockaddr
function for_each_header (line 229) | static int for_each_header(uint8_t *name, size_t name_len,
function recv_cb (line 238) | static void recv_cb(EV_P_ ev_io *w, int revents) {
function timeout_cb (line 496) | static void timeout_cb(EV_P_ ev_timer *w, int revents) {
function main (line 524) | int main(int argc, char *argv[]) {
FILE: quiche/examples/http3-server.rs
constant MAX_DATAGRAM_SIZE (line 38) | const MAX_DATAGRAM_SIZE: usize = 1350;
type PartialResponse (line 40) | struct PartialResponse {
type Client (line 48) | struct Client {
type ClientMap (line 56) | type ClientMap = HashMap<quiche::ConnectionId<'static>, Client>;
function main (line 58) | fn main() {
function mint_token (line 456) | fn mint_token(hdr: &quiche::Header, src: &net::SocketAddr) -> Vec<u8> {
function validate_token (line 479) | fn validate_token<'a>(
function handle_request (line 505) | fn handle_request(
function build_response (line 568) | fn build_response(
function handle_writable (line 620) | fn handle_writable(client: &mut Client, stream_id: u64) {
function hdrs_to_strings (line 671) | pub fn hdrs_to_strings(hdrs: &[quiche::h3::Header]) -> Vec<(String, Stri...
FILE: quiche/examples/qpack-decode.rs
function main (line 38) | fn main() {
FILE: quiche/examples/qpack-encode.rs
function main (line 37) | fn main() {
FILE: quiche/examples/server.c
type connections (line 55) | struct connections {
type conn_io (line 64) | struct conn_io {
type connections (line 81) | struct connections
function debug_log (line 85) | static void debug_log(const char *line, void *argp) {
function flush_egress (line 89) | static void flush_egress(struct ev_loop *loop, struct conn_io *conn_io) {
function mint_token (line 125) | static void mint_token(const uint8_t *dcid, size_t dcid_len,
function validate_token (line 135) | static bool validate_token(const uint8_t *token, size_t token_len,
type conn_io (line 179) | struct conn_io
type sockaddr (line 181) | struct sockaddr
type sockaddr_storage (line 183) | struct sockaddr_storage
type conn_io (line 186) | struct conn_io
type sockaddr (line 202) | struct sockaddr
function recv_cb (line 227) | static void recv_cb(EV_P_ ev_io *w, int revents) {
function timeout_cb (line 423) | static void timeout_cb(EV_P_ ev_timer *w, int revents) {
function main (line 451) | int main(int argc, char *argv[]) {
FILE: quiche/examples/server.rs
constant MAX_DATAGRAM_SIZE (line 36) | const MAX_DATAGRAM_SIZE: usize = 1350;
type PartialResponse (line 38) | struct PartialResponse {
type Client (line 44) | struct Client {
type ClientMap (line 50) | type ClientMap = HashMap<quiche::ConnectionId<'static>, Client>;
function main (line 52) | fn main() {
function mint_token (line 398) | fn mint_token(hdr: &quiche::Header, src: &net::SocketAddr) -> Vec<u8> {
function validate_token (line 421) | fn validate_token<'a>(
function handle_stream (line 447) | fn handle_stream(client: &mut Client, stream_id: u64, buf: &[u8], root: ...
function handle_writable (line 499) | fn handle_writable(client: &mut Client, stream_id: u64) {
FILE: quiche/include/quiche.h
type quiche_error (line 67) | enum quiche_error {
type quiche_config (line 150) | typedef struct quiche_config quiche_config;
type quiche_cc_algorithm (line 237) | enum quiche_cc_algorithm {
type quiche_cc_algorithm (line 244) | enum quiche_cc_algorithm
type quiche_conn (line 294) | typedef struct quiche_conn quiche_conn;
type sockaddr (line 299) | struct sockaddr
type sockaddr (line 300) | struct sockaddr
type sockaddr (line 306) | struct sockaddr
type sockaddr (line 307) | struct sockaddr
type sockaddr (line 327) | struct sockaddr
type sockaddr (line 328) | struct sockaddr
type sockaddr (line 335) | struct sockaddr
type sockaddr (line 336) | struct sockaddr
type quiche_recv_info (line 360) | typedef struct {
type quiche_send_info (line 374) | typedef struct {
type sockaddr (line 397) | struct sockaddr
type sockaddr (line 398) | struct sockaddr
type sockaddr (line 403) | struct sockaddr
type sockaddr (line 404) | struct sockaddr
type quiche_shutdown (line 422) | enum quiche_shutdown {
type quiche_shutdown (line 433) | enum quiche_shutdown
type quiche_stream_iter (line 457) | typedef struct quiche_stream_iter quiche_stream_iter;
type quiche_connection_id_iter (line 487) | typedef struct quiche_connection_id_iter quiche_connection_id_iter;
type quiche_stats (line 568) | typedef struct {
type quiche_transport_params (line 659) | typedef struct {
type quiche_path_stats (line 704) | typedef struct {
type sockaddr (line 837) | struct sockaddr
type sockaddr (line 838) | struct sockaddr
type sockaddr (line 866) | struct sockaddr
type sockaddr (line 867) | struct sockaddr
type sockaddr (line 870) | struct sockaddr
type sockaddr (line 875) | struct sockaddr
type sockaddr (line 876) | struct sockaddr
type quiche_path_event_type (line 879) | enum quiche_path_event_type {
type quiche_path_event (line 888) | typedef struct quiche_path_event quiche_path_event;
type quiche_path_event_type (line 894) | enum quiche_path_event_type
type sockaddr_storage (line 898) | struct sockaddr_storage
type sockaddr_storage (line 898) | struct sockaddr_storage
type sockaddr_storage (line 902) | struct sockaddr_storage
type sockaddr_storage (line 902) | struct sockaddr_storage
type sockaddr_storage (line 906) | struct sockaddr_storage
type sockaddr_storage (line 906) | struct sockaddr_storage
type sockaddr_storage (line 910) | struct sockaddr_storage
type sockaddr_storage (line 910) | struct sockaddr_storage
type sockaddr_storage (line 914) | struct sockaddr_storage
type sockaddr_storage (line 915) | struct sockaddr_storage
type sockaddr_storage (line 916) | struct sockaddr_storage
type sockaddr_storage (line 917) | struct sockaddr_storage
type sockaddr_storage (line 921) | struct sockaddr_storage
type sockaddr_storage (line 922) | struct sockaddr_storage
type quiche_socket_addr_iter (line 931) | typedef struct quiche_socket_addr_iter quiche_socket_addr_iter;
type sockaddr (line 935) | struct sockaddr
type sockaddr_storage (line 939) | struct sockaddr_storage
type sockaddr (line 946) | struct sockaddr
type sockaddr (line 946) | struct sockaddr
type quiche_h3_error (line 967) | enum quiche_h3_error {
type quiche_h3_config (line 1106) | typedef struct quiche_h3_config quiche_h3_config;
type quiche_h3_conn (line 1127) | typedef struct quiche_h3_conn quiche_h3_conn;
type quiche_h3_event_type (line 1133) | enum quiche_h3_event_type {
type quiche_h3_event (line 1142) | typedef struct quiche_h3_event quiche_h3_event;
type quiche_h3_event_type (line 1149) | enum quiche_h3_event_type
type quiche_h3_header (line 1182) | typedef struct {
type quiche_h3_priority (line 1191) | typedef struct {
type quiche_h3_stats (line 1259) | typedef struct {
FILE: quiche/src/buffers.rs
type BufFactory (line 35) | pub trait BufFactory: Clone + Default + Debug {
method buf_from_slice (line 42) | fn buf_from_slice(buf: &[u8]) -> Self::Buf;
type Buf (line 69) | type Buf = DefaultBuf;
method buf_from_slice (line 71) | fn buf_from_slice(buf: &[u8]) -> Self::Buf {
type BufSplit (line 48) | pub trait BufSplit {
method split_at (line 52) | fn split_at(&mut self, at: usize) -> Self;
method try_add_prefix (line 55) | fn try_add_prefix(&mut self, _prefix: &[u8]) -> bool {
type DefaultBufFactory (line 62) | pub struct DefaultBufFactory;
type DefaultBuf (line 66) | pub struct DefaultBuf(Arc<Box<[u8]>>);
method as_ref (line 77) | fn as_ref(&self) -> &[u8] {
FILE: quiche/src/build.rs
constant CMAKE_PARAMS_ANDROID_NDK (line 4) | const CMAKE_PARAMS_ANDROID_NDK: &[(&str, &[(&str, &str)])] = &[
constant CMAKE_PARAMS_IOS (line 12) | const CMAKE_PARAMS_IOS: &[(&str, &[(&str, &str)])] = &[
constant CMAKE_PARAMS_ARM_LINUX (line 24) | const CMAKE_PARAMS_ARM_LINUX: &[(&str, &[(&str, &str)])] = &[
function get_boringssl_platform_output_path (line 34) | fn get_boringssl_platform_output_path() -> String {
function get_boringssl_cmake_config (line 70) | fn get_boringssl_cmake_config() -> cmake::Config {
function write_pkg_config (line 173) | fn write_pkg_config() {
function target_dir_path (line 205) | fn target_dir_path() -> std::path::PathBuf {
function main (line 218) | fn main() {
FILE: quiche/src/cid.rs
constant RETIRED_CONN_ID_LIMIT_MULTIPLIER (line 43) | const RETIRED_CONN_ID_LIMIT_MULTIPLIER: u64 = 3;
type BoundedConnectionIdSeqSet (line 46) | struct BoundedConnectionIdSeqSet {
method new (line 56) | fn new(capacity: usize) -> Self {
method insert (line 63) | fn insert(&mut self, e: u64) -> Result<bool> {
method remove (line 71) | fn remove(&mut self, e: &u64) -> bool {
method is_empty (line 75) | fn is_empty(&self) -> bool {
type ConnectionIdEntry (line 82) | pub struct ConnectionIdEntry {
type BoundedNonEmptyConnectionIdVecDeque (line 97) | struct BoundedNonEmptyConnectionIdVecDeque {
method new (line 108) | fn new(capacity: usize, initial_entry: ConnectionIdEntry) -> Self {
method resize (line 117) | fn resize(&mut self, new_capacity: usize) {
method get_oldest (line 124) | fn get_oldest(&self) -> &ConnectionIdEntry {
method get (line 129) | fn get(&self, seq: u64) -> Option<&ConnectionIdEntry> {
method get_mut (line 135) | fn get_mut(&mut self, seq: u64) -> Option<&mut ConnectionIdEntry> {
method iter (line 141) | fn iter(&self) -> impl Iterator<Item = &ConnectionIdEntry> {
method len (line 146) | fn len(&self) -> usize {
method insert (line 160) | fn insert(&mut self, e: ConnectionIdEntry) -> Result<()> {
method clear_and_insert (line 175) | fn clear_and_insert(&mut self, e: ConnectionIdEntry) {
method remove (line 189) | fn remove(&mut self, seq: u64) -> Result<Option<ConnectionIdEntry>> {
type ConnectionIdentifiers (line 203) | pub struct ConnectionIdentifiers {
method new (line 246) | pub fn new(
method set_source_conn_id_limit (line 304) | pub fn set_source_conn_id_limit(&mut self, v: u64) {
method get_dcid (line 320) | pub fn get_dcid(&self, seq_num: u64) -> Result<&ConnectionIdEntry> {
method get_scid (line 327) | pub fn get_scid(&self, seq_num: u64) -> Result<&ConnectionIdEntry> {
method new_scid (line 359) | pub fn new_scid(
method set_initial_dcid (line 408) | pub fn set_initial_dcid(
method new_dcid (line 431) | pub fn new_dcid(
method retire_scid (line 550) | pub fn retire_scid(
method retire_dcid (line 590) | pub fn retire_dcid(&mut self, seq: u64) -> Result<Option<usize>> {
method scids_iter (line 603) | pub fn scids_iter(&self) -> impl Iterator<Item = &ConnectionId<'_>> {
method link_scid_to_path_id (line 609) | pub fn link_scid_to_path_id(
method link_dcid_to_path_id (line 619) | pub fn link_dcid_to_path_id(
method lowest_usable_scid_seq (line 630) | pub fn lowest_usable_scid_seq(&self) -> Result<u64> {
method lowest_available_dcid_seq (line 647) | pub fn lowest_available_dcid_seq(&self) -> Option<u64> {
method find_scid_seq (line 663) | pub fn find_scid_seq(
method available_scids (line 681) | pub fn available_scids(&self) -> usize {
method available_dcids (line 691) | pub fn available_dcids(&self) -> usize {
method oldest_scid (line 700) | pub fn oldest_scid(&self) -> &ConnectionIdEntry {
method oldest_dcid (line 711) | pub fn oldest_dcid(&self) -> &ConnectionIdEntry {
method mark_advertise_new_scid_seq (line 719) | pub fn mark_advertise_new_scid_seq(
method mark_retire_dcid_seq (line 737) | pub fn mark_retire_dcid_seq(
method next_advertise_new_scid_seq (line 755) | pub fn next_advertise_new_scid_seq(&self) -> Option<u64> {
method retire_dcid_seqs (line 766) | pub fn retire_dcid_seqs(&self) -> HashSet<u64> {
method has_new_scids (line 772) | pub fn has_new_scids(&self) -> bool {
method has_retire_dcids (line 779) | pub fn has_retire_dcids(&self) -> bool {
method zero_length_scid (line 785) | pub fn zero_length_scid(&self) -> bool {
method zero_length_dcid (line 791) | pub fn zero_length_dcid(&self) -> bool {
method get_new_connection_id_frame_for (line 797) | pub fn get_new_connection_id_frame_for(
method active_source_cids (line 812) | pub fn active_source_cids(&self) -> usize {
method retired_source_cids (line 819) | pub fn retired_source_cids(&self) -> usize {
method pop_retired_scid (line 823) | pub fn pop_retired_scid(&mut self) -> Option<ConnectionId<'static>> {
function ids_new_scids (line 834) | fn ids_new_scids() {
function new_dcid_event (line 893) | fn new_dcid_event() {
function new_dcid_reordered (line 966) | fn new_dcid_reordered() {
function new_dcid_partial_retire_prior_to (line 1003) | fn new_dcid_partial_retire_prior_to() {
function retire_scids (line 1045) | fn retire_scids() {
FILE: quiche/src/crypto/boringssl.rs
type EVP_AEAD_CTX (line 15) | struct EVP_AEAD_CTX {
type AES_KEY (line 24) | pub(crate) struct AES_KEY {
method get_evp_aead (line 30) | fn get_evp_aead(self) -> *const EVP_AEAD {
type PacketKey (line 41) | pub(crate) struct PacketKey {
method new (line 50) | pub fn new(
method from_secret (line 60) | pub fn from_secret(aead: Algorithm, secret: &[u8], enc: u32) -> Result...
method open_with_u64_counter (line 83) | pub fn open_with_u64_counter(
method seal_with_u64_counter (line 119) | pub fn seal_with_u64_counter(
type HeaderProtectionKey (line 168) | pub(crate) enum HeaderProtectionKey {
method new (line 175) | pub fn new(alg: Algorithm, hp_key: Vec<u8>) -> Result<Self> {
method new_mask (line 200) | pub fn new_mask(&self, sample: &[u8]) -> Result<HeaderProtectionMask> {
function make_aead_ctx (line 251) | fn make_aead_ctx(alg: Algorithm, key: &[u8]) -> Result<EVP_AEAD_CTX> {
function hkdf_extract (line 276) | pub(crate) fn hkdf_extract(
function hkdf_expand (line 300) | pub(crate) fn hkdf_expand(
function EVP_aead_aes_128_gcm_tls13 (line 323) | fn EVP_aead_aes_128_gcm_tls13() -> *const EVP_AEAD;
function EVP_aead_aes_256_gcm_tls13 (line 325) | fn EVP_aead_aes_256_gcm_tls13() -> *const EVP_AEAD;
function EVP_aead_chacha20_poly1305 (line 327) | fn EVP_aead_chacha20_poly1305() -> *const EVP_AEAD;
function HKDF_extract (line 330) | fn HKDF_extract(
function HKDF_expand (line 335) | fn HKDF_expand(
function EVP_AEAD_CTX_init (line 341) | fn EVP_AEAD_CTX_init(
function EVP_AEAD_CTX_open (line 346) | fn EVP_AEAD_CTX_open(
function EVP_AEAD_CTX_seal_scatter (line 352) | fn EVP_AEAD_CTX_seal_scatter(
function AES_set_encrypt_key (line 360) | fn AES_set_encrypt_key(
function AES_ecb_encrypt (line 364) | fn AES_ecb_encrypt(
function CRYPTO_chacha_20 (line 369) | fn CRYPTO_chacha_20(
FILE: quiche/src/crypto/mod.rs
constant MAX_NONCE_LEN (line 36) | pub const MAX_NONCE_LEN: usize = 12;
constant HP_MASK_LEN (line 39) | pub const HP_MASK_LEN: usize = 5;
type Level (line 43) | pub enum Level {
method from_epoch (line 51) | pub fn from_epoch(e: packet::Epoch) -> Level {
type Algorithm (line 63) | pub enum Algorithm {
method get_evp_digest (line 77) | fn get_evp_digest(self) -> *const EVP_MD {
method key_len (line 85) | pub const fn key_len(self) -> usize {
method tag_len (line 93) | pub const fn tag_len(self) -> usize {
method nonce_len (line 105) | pub const fn nonce_len(self) -> usize {
type EVP_AEAD (line 116) | pub struct EVP_AEAD {
type EVP_MD (line 122) | struct EVP_MD {
type HeaderProtectionMask (line 126) | type HeaderProtectionMask = [u8; HP_MASK_LEN];
type Open (line 128) | pub struct Open {
constant DECRYPT (line 142) | pub const DECRYPT: u32 = 0;
method new (line 144) | pub fn new(
method from_secret (line 159) | pub fn from_secret(aead: Algorithm, secret: &[u8]) -> Result<Open> {
method new_mask (line 171) | pub fn new_mask(&self, sample: &[u8]) -> Result<[u8; 5]> {
method alg (line 179) | pub fn alg(&self) -> Algorithm {
method derive_next_packet_key (line 183) | pub fn derive_next_packet_key(&self) -> Result<Open> {
method open_with_u64_counter (line 200) | pub fn open_with_u64_counter(
type Seal (line 219) | pub struct Seal {
constant ENCRYPT (line 233) | pub const ENCRYPT: u32 = 1;
method new (line 235) | pub fn new(
method from_secret (line 250) | pub fn from_secret(aead: Algorithm, secret: &[u8]) -> Result<Seal> {
method new_mask (line 262) | pub fn new_mask(&self, sample: &[u8]) -> Result<[u8; 5]> {
method alg (line 270) | pub fn alg(&self) -> Algorithm {
method derive_next_packet_key (line 274) | pub fn derive_next_packet_key(&self) -> Result<Seal> {
method seal_with_u64_counter (line 291) | pub fn seal_with_u64_counter(
method from_secret (line 318) | pub fn from_secret(aead: Algorithm, secret: &[u8]) -> Result<Self> {
function derive_initial_key_material (line 329) | pub fn derive_initial_key_material(
function derive_initial_secret (line 400) | fn derive_initial_secret(
function derive_client_initial_secret (line 417) | fn derive_client_initial_secret(
function derive_server_initial_secret (line 424) | fn derive_server_initial_secret(
function derive_next_secret (line 431) | fn derive_next_secret(aead: Algorithm, secret: &[u8]) -> Result<Vec<u8>> {
function derive_hdr_key (line 441) | pub fn derive_hdr_key(
function derive_pkt_key (line 455) | pub fn derive_pkt_key(aead: Algorithm, prk: &[u8], out: &mut [u8]) -> Re...
function derive_pkt_iv (line 467) | pub fn derive_pkt_iv(aead: Algorithm, prk: &[u8], out: &mut [u8]) -> Res...
function hkdf_expand_label (line 479) | fn hkdf_expand_label(
function make_nonce (line 495) | fn make_nonce(iv: &[u8], counter: u64) -> [u8; MAX_NONCE_LEN] {
function verify_slices_are_equal (line 508) | pub fn verify_slices_are_equal(a: &[u8], b: &[u8]) -> Result<()> {
function EVP_sha256 (line 523) | fn EVP_sha256() -> *const EVP_MD;
function EVP_sha384 (line 525) | fn EVP_sha384() -> *const EVP_MD;
function CRYPTO_memcmp (line 528) | fn CRYPTO_memcmp(a: *const u8, b: *const u8, len: usize) -> c_int;
function derive_initial_secrets_v1 (line 536) | fn derive_initial_secrets_v1() {
function derive_chacha20_secrets (line 624) | fn derive_chacha20_secrets() {
FILE: quiche/src/crypto/openssl_quictls.rs
type EVP_CIPHER_CTX (line 8) | struct EVP_CIPHER_CTX {
type EVP_PKEY_CTX (line 14) | struct EVP_PKEY_CTX {
type OSSL_PARAM (line 20) | struct OSSL_PARAM {
method get_evp (line 25) | pub fn get_evp(self) -> *const EVP_AEAD {
method get_evp_aead (line 33) | pub fn get_evp_aead(self) -> *const EVP_AEAD {
type PacketKey (line 42) | pub(crate) struct PacketKey {
method new (line 56) | pub fn new(
method from_secret (line 67) | pub fn from_secret(aead: Algorithm, secret: &[u8], enc: u32) -> Result...
method open_with_u64_counter (line 80) | pub fn open_with_u64_counter(
method seal_with_u64_counter (line 189) | pub fn seal_with_u64_counter(
method drop (line 297) | fn drop(&mut self) {
type HeaderProtectionKey (line 305) | pub(crate) struct HeaderProtectionKey {
method new (line 312) | pub fn new(alg: Algorithm, hp_key: Vec<u8>) -> Result<Self> {
method new_mask (line 319) | pub fn new_mask(&self, sample: &[u8]) -> Result<HeaderProtectionMask> {
method clone (line 373) | fn clone(&self) -> Self {
method drop (line 384) | fn drop(&mut self) {
function make_evp_cipher_ctx_basic (line 392) | fn make_evp_cipher_ctx_basic(
function hkdf_extract (line 427) | pub(crate) fn hkdf_extract(
function hkdf_expand (line 459) | pub(crate) fn hkdf_expand(
function EVP_aes_128_ctr (line 493) | fn EVP_aes_128_ctr() -> *const EVP_AEAD;
function EVP_aes_128_gcm (line 494) | fn EVP_aes_128_gcm() -> *const EVP_AEAD;
function EVP_aes_256_ctr (line 496) | fn EVP_aes_256_ctr() -> *const EVP_AEAD;
function EVP_aes_256_gcm (line 497) | fn EVP_aes_256_gcm() -> *const EVP_AEAD;
function EVP_chacha20 (line 499) | fn EVP_chacha20() -> *const EVP_AEAD;
function EVP_chacha20_poly1305 (line 500) | fn EVP_chacha20_poly1305() -> *const EVP_AEAD;
function EVP_CIPHER_CTX_new (line 503) | fn EVP_CIPHER_CTX_new() -> *mut EVP_CIPHER_CTX;
function EVP_CIPHER_CTX_dup (line 505) | fn EVP_CIPHER_CTX_dup(ctx: *const EVP_CIPHER_CTX) -> *mut EVP_CIPHER_CTX;
function EVP_CIPHER_CTX_free (line 507) | fn EVP_CIPHER_CTX_free(ctx: *mut EVP_CIPHER_CTX);
function EVP_CipherInit_ex2 (line 509) | fn EVP_CipherInit_ex2(
function EVP_CIPHER_CTX_ctrl (line 514) | fn EVP_CIPHER_CTX_ctrl(
function EVP_CipherUpdate (line 518) | fn EVP_CipherUpdate(
function EVP_CipherFinal_ex (line 523) | fn EVP_CipherFinal_ex(
function EVP_PKEY_CTX_new_id (line 528) | fn EVP_PKEY_CTX_new_id(id: c_int, e: *mut c_void) -> *mut EVP_PKEY_CTX;
function EVP_PKEY_CTX_set_hkdf_mode (line 530) | fn EVP_PKEY_CTX_set_hkdf_mode(ctx: *mut EVP_PKEY_CTX, mode: c_int) -> c_...
function EVP_PKEY_CTX_set_hkdf_md (line 531) | fn EVP_PKEY_CTX_set_hkdf_md(
function EVP_PKEY_CTX_set1_hkdf_salt (line 534) | fn EVP_PKEY_CTX_set1_hkdf_salt(
function EVP_PKEY_CTX_set1_hkdf_key (line 537) | fn EVP_PKEY_CTX_set1_hkdf_key(
function EVP_PKEY_CTX_add1_hkdf_info (line 540) | fn EVP_PKEY_CTX_add1_hkdf_info(
function EVP_PKEY_derive_init (line 544) | fn EVP_PKEY_derive_init(ctx: *mut EVP_PKEY_CTX) -> c_int;
function EVP_PKEY_derive (line 546) | fn EVP_PKEY_derive(
function EVP_PKEY_CTX_free (line 550) | fn EVP_PKEY_CTX_free(ctx: *mut EVP_PKEY_CTX);
FILE: quiche/src/dgram.rs
type DatagramQueue (line 34) | pub struct DatagramQueue {
method new (line 41) | pub fn new(queue_max_len: usize) -> Self {
method push (line 49) | pub fn push(&mut self, data: Vec<u8>) -> Result<()> {
method peek_front_len (line 62) | pub fn peek_front_len(&self) -> Option<usize> {
method peek_front_bytes (line 66) | pub fn peek_front_bytes(&self, buf: &mut [u8], len: usize) -> Result<u...
method pop (line 82) | pub fn pop(&mut self) -> Option<Vec<u8>> {
method has_pending (line 91) | pub fn has_pending(&self) -> bool {
method purge (line 95) | pub fn purge<F: Fn(&[u8]) -> bool>(&mut self, f: F) {
method is_full (line 102) | pub fn is_full(&self) -> bool {
method is_empty (line 106) | pub fn is_empty(&self) -> bool {
method len (line 110) | pub fn len(&self) -> usize {
method byte_size (line 114) | pub fn byte_size(&self) -> usize {
FILE: quiche/src/error.rs
type Result (line 33) | pub type Result<T> = std::result::Result<T, Error>;
type Error (line 37) | pub enum Error {
method to_wire (line 185) | pub(crate) fn to_wire(self) -> u64 {
method to_c (line 205) | pub(crate) fn to_c(self) -> libc::ssize_t {
method fmt (line 235) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
method source (line 241) | fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
method from (line 247) | fn from(_err: octets::BufferTooShortError) -> Self {
type WireErrorCode (line 124) | pub enum WireErrorCode {
type ConnectionError (line 254) | pub struct ConnectionError {
FILE: quiche/src/ffi.rs
function quiche_version (line 103) | pub extern "C" fn quiche_version() -> *const u8 {
type Logger (line 108) | struct Logger {
method enabled (line 114) | fn enabled(&self, _metadata: &log::Metadata) -> bool {
method log (line 118) | fn log(&self, record: &log::Record) {
method flush (line 123) | fn flush(&self) {}
function quiche_enable_debug_logging (line 127) | pub extern "C" fn quiche_enable_debug_logging(
function quiche_config_new (line 143) | pub extern "C" fn quiche_config_new(version: u32) -> *mut Config {
function quiche_config_load_cert_chain_from_pem_file (line 152) | pub extern "C" fn quiche_config_load_cert_chain_from_pem_file(
function quiche_config_load_priv_key_from_pem_file (line 165) | pub extern "C" fn quiche_config_load_priv_key_from_pem_file(
function quiche_config_load_verify_locations_from_file (line 178) | pub extern "C" fn quiche_config_load_verify_locations_from_file(
function quiche_config_load_verify_locations_from_directory (line 191) | pub extern "C" fn quiche_config_load_verify_locations_from_directory(
function quiche_config_verify_peer (line 204) | pub extern "C" fn quiche_config_verify_peer(config: &mut Config, v: bool) {
function quiche_config_grease (line 209) | pub extern "C" fn quiche_config_grease(config: &mut Config, v: bool) {
function quiche_config_discover_pmtu (line 214) | pub extern "C" fn quiche_config_discover_pmtu(config: &mut Config, v: bo...
function quiche_config_set_pmtud_max_probes (line 219) | pub extern "C" fn quiche_config_set_pmtud_max_probes(
function quiche_config_log_keys (line 226) | pub extern "C" fn quiche_config_log_keys(config: &mut Config) {
function quiche_config_enable_early_data (line 231) | pub extern "C" fn quiche_config_enable_early_data(config: &mut Config) {
function quiche_config_set_application_protos (line 238) | pub extern "C" fn quiche_config_set_application_protos(
function quiche_config_set_max_amplification_factor (line 251) | pub extern "C" fn quiche_config_set_max_amplification_factor(
function quiche_config_set_max_idle_timeout (line 258) | pub extern "C" fn quiche_config_set_max_idle_timeout(
function quiche_config_set_max_recv_udp_payload_size (line 265) | pub extern "C" fn quiche_config_set_max_recv_udp_payload_size(
function quiche_config_set_initial_max_data (line 272) | pub extern "C" fn quiche_config_set_initial_max_data(
function quiche_config_set_initial_max_stream_data_bidi_local (line 279) | pub extern "C" fn quiche_config_set_initial_max_stream_data_bidi_local(
function quiche_config_set_initial_max_stream_data_bidi_remote (line 286) | pub extern "C" fn quiche_config_set_initial_max_stream_data_bidi_remote(
function quiche_config_set_initial_max_stream_data_uni (line 293) | pub extern "C" fn quiche_config_set_initial_max_stream_data_uni(
function quiche_config_set_initial_max_streams_bidi (line 300) | pub extern "C" fn quiche_config_set_initial_max_streams_bidi(
function quiche_config_set_initial_max_streams_uni (line 307) | pub extern "C" fn quiche_config_set_initial_max_streams_uni(
function quiche_config_set_ack_delay_exponent (line 314) | pub extern "C" fn quiche_config_set_ack_delay_exponent(
function quiche_config_set_max_ack_delay (line 321) | pub extern "C" fn quiche_config_set_max_ack_delay(config: &mut Config, v...
function quiche_config_set_disable_active_migration (line 326) | pub extern "C" fn quiche_config_set_disable_active_migration(
function quiche_config_set_cc_algorithm_name (line 333) | pub extern "C" fn quiche_config_set_cc_algorithm_name(
function quiche_config_set_cc_algorithm (line 345) | pub extern "C" fn quiche_config_set_cc_algorithm(
function quiche_config_set_initial_congestion_window_packets (line 352) | pub extern "C" fn quiche_config_set_initial_congestion_window_packets(
function quiche_config_enable_hystart (line 359) | pub extern "C" fn quiche_config_enable_hystart(config: &mut Config, v: b...
function quiche_config_enable_pacing (line 364) | pub extern "C" fn quiche_config_enable_pacing(config: &mut Config, v: bo...
function quiche_config_set_enable_cubic_idle_restart_fix (line 369) | pub extern "C" fn quiche_config_set_enable_cubic_idle_restart_fix(
function quiche_config_set_max_pacing_rate (line 376) | pub extern "C" fn quiche_config_set_max_pacing_rate(config: &mut Config,...
function quiche_config_enable_dgram (line 381) | pub extern "C" fn quiche_config_enable_dgram(
function quiche_config_set_max_send_udp_payload_size (line 389) | pub extern "C" fn quiche_config_set_max_send_udp_payload_size(
function quiche_config_set_max_connection_window (line 396) | pub extern "C" fn quiche_config_set_max_connection_window(
function quiche_config_set_max_stream_window (line 403) | pub extern "C" fn quiche_config_set_max_stream_window(
function quiche_config_set_active_connection_id_limit (line 410) | pub extern "C" fn quiche_config_set_active_connection_id_limit(
function quiche_config_set_stateless_reset_token (line 417) | pub extern "C" fn quiche_config_set_stateless_reset_token(
function quiche_config_set_disable_dcid_reuse (line 430) | pub extern "C" fn quiche_config_set_disable_dcid_reuse(
function quiche_config_set_ticket_key (line 437) | pub extern "C" fn quiche_config_set_ticket_key(
function quiche_config_free (line 450) | pub extern "C" fn quiche_config_free(config: *mut Config) {
function quiche_header_info (line 455) | pub extern "C" fn quiche_header_info(
function quiche_accept (line 520) | pub extern "C" fn quiche_accept(
function quiche_connect (line 547) | pub extern "C" fn quiche_connect(
function quiche_negotiate_version (line 572) | pub extern "C" fn quiche_negotiate_version(
function quiche_version_is_supported (line 592) | pub extern "C" fn quiche_version_is_supported(version: u32) -> bool {
function quiche_retry (line 597) | pub extern "C" fn quiche_retry(
function quiche_conn_new_with_tls_and_client_dcid (line 623) | pub extern "C" fn quiche_conn_new_with_tls_and_client_dcid(
function quiche_conn_new_with_tls_and_client_dcid (line 665) | pub extern "C" fn quiche_conn_new_with_tls_and_client_dcid(
function quiche_conn_new_with_tls (line 676) | pub extern "C" fn quiche_conn_new_with_tls(
function quiche_conn_set_keylog_path (line 712) | pub extern "C" fn quiche_conn_set_keylog_path(
function quiche_conn_set_keylog_fd (line 735) | pub extern "C" fn quiche_conn_set_keylog_fd(conn: &mut Connection, fd: c...
function quiche_conn_set_qlog_path (line 744) | pub extern "C" fn quiche_conn_set_qlog_path(
function quiche_conn_set_qlog_fd (line 775) | pub extern "C" fn quiche_conn_set_qlog_fd(
function quiche_conn_set_session (line 793) | pub extern "C" fn quiche_conn_set_session(
function quiche_conn_set_max_idle_timeout (line 806) | pub extern "C" fn quiche_conn_set_max_idle_timeout(
type RecvInfo (line 817) | pub struct RecvInfo<'a> {
function from (line 825) | fn from(info: &RecvInfo) -> crate::RecvInfo {
function quiche_conn_recv (line 834) | pub extern "C" fn quiche_conn_recv(
type SendInfo (line 851) | pub struct SendInfo {
function quiche_conn_send (line 861) | pub extern "C" fn quiche_conn_send(
function quiche_conn_send_on_path (line 885) | pub extern "C" fn quiche_conn_send_on_path(
function quiche_conn_stream_recv (line 913) | pub extern "C" fn quiche_conn_stream_recv(
function quiche_conn_stream_send (line 942) | pub extern "C" fn quiche_conn_stream_send(
function quiche_conn_stream_priority (line 972) | pub extern "C" fn quiche_conn_stream_priority(
function quiche_conn_stream_shutdown (line 983) | pub extern "C" fn quiche_conn_stream_shutdown(
function quiche_conn_stream_capacity (line 994) | pub extern "C" fn quiche_conn_stream_capacity(
function quiche_conn_stream_readable (line 1005) | pub extern "C" fn quiche_conn_stream_readable(
function quiche_conn_stream_readable_next (line 1012) | pub extern "C" fn quiche_conn_stream_readable_next(conn: &mut Connection...
function quiche_conn_stream_writable (line 1017) | pub extern "C" fn quiche_conn_stream_writable(
function quiche_conn_stream_writable_next (line 1030) | pub extern "C" fn quiche_conn_stream_writable_next(conn: &mut Connection...
function quiche_conn_stream_finished (line 1035) | pub extern "C" fn quiche_conn_stream_finished(
function quiche_conn_readable (line 1042) | pub extern "C" fn quiche_conn_readable(conn: &Connection) -> *mut Stream...
function quiche_conn_writable (line 1047) | pub extern "C" fn quiche_conn_writable(conn: &Connection) -> *mut Stream...
function quiche_conn_max_send_udp_payload_size (line 1052) | pub extern "C" fn quiche_conn_max_send_udp_payload_size(
function quiche_conn_is_readable (line 1059) | pub extern "C" fn quiche_conn_is_readable(conn: &Connection) -> bool {
function quiche_conn_close (line 1064) | pub extern "C" fn quiche_conn_close(
function quiche_conn_timeout_as_nanos (line 1083) | pub extern "C" fn quiche_conn_timeout_as_nanos(conn: &Connection) -> u64 {
function quiche_conn_timeout_as_millis (line 1092) | pub extern "C" fn quiche_conn_timeout_as_millis(conn: &Connection) -> u64 {
function quiche_conn_on_timeout (line 1101) | pub extern "C" fn quiche_conn_on_timeout(conn: &mut Connection) {
function quiche_conn_trace_id (line 1106) | pub extern "C" fn quiche_conn_trace_id(
type ConnectionIdIter (line 1117) | pub struct ConnectionIdIter<'a> {
type Item (line 1123) | type Item = ConnectionId<'a>;
method next (line 1126) | fn next(&mut self) -> Option<Self::Item> {
function quiche_conn_source_ids (line 1134) | pub extern "C" fn quiche_conn_source_ids(
function quiche_connection_id_iter_next (line 1145) | pub extern "C" fn quiche_connection_id_iter_next(
function quiche_connection_id_iter_free (line 1159) | pub extern "C" fn quiche_connection_id_iter_free(iter: *mut ConnectionId...
function quiche_conn_source_id (line 1164) | pub extern "C" fn quiche_conn_source_id(
function quiche_conn_destination_id (line 1174) | pub extern "C" fn quiche_conn_destination_id(
function quiche_conn_application_proto (line 1185) | pub extern "C" fn quiche_conn_application_proto(
function quiche_conn_peer_cert (line 1195) | pub extern "C" fn quiche_conn_peer_cert(
function quiche_conn_session (line 1209) | pub extern "C" fn quiche_conn_session(
function quiche_conn_server_name (line 1223) | pub extern "C" fn quiche_conn_server_name(
function quiche_conn_is_established (line 1237) | pub extern "C" fn quiche_conn_is_established(conn: &Connection) -> bool {
function quiche_conn_is_resumed (line 1242) | pub extern "C" fn quiche_conn_is_resumed(conn: &Connection) -> bool {
function quiche_conn_is_in_early_data (line 1247) | pub extern "C" fn quiche_conn_is_in_early_data(conn: &Connection) -> bool {
function quiche_conn_is_draining (line 1252) | pub extern "C" fn quiche_conn_is_draining(conn: &Connection) -> bool {
function quiche_conn_is_closed (line 1257) | pub extern "C" fn quiche_conn_is_closed(conn: &Connection) -> bool {
function quiche_conn_is_timed_out (line 1262) | pub extern "C" fn quiche_conn_is_timed_out(conn: &Connection) -> bool {
function quiche_conn_peer_error (line 1267) | pub extern "C" fn quiche_conn_peer_error(
function quiche_conn_local_error (line 1286) | pub extern "C" fn quiche_conn_local_error(
function quiche_stream_iter_next (line 1305) | pub extern "C" fn quiche_stream_iter_next(
function quiche_stream_iter_free (line 1317) | pub extern "C" fn quiche_stream_iter_free(iter: *mut StreamIter) {
type Stats (line 1322) | pub struct Stats {
type TransportParams (line 1351) | pub struct TransportParams {
function quiche_conn_stats (line 1368) | pub extern "C" fn quiche_conn_stats(conn: &Connection, out: &mut Stats) {
function quiche_conn_peer_transport_params (line 1402) | pub extern "C" fn quiche_conn_peer_transport_params(
type PathStats (line 1434) | pub struct PathStats {
function quiche_conn_path_stats (line 1464) | pub extern "C" fn quiche_conn_path_stats(
function quiche_conn_is_server (line 1501) | pub extern "C" fn quiche_conn_is_server(conn: &Connection) -> bool {
function quiche_conn_dgram_max_writable_len (line 1506) | pub extern "C" fn quiche_conn_dgram_max_writable_len(
function quiche_conn_dgram_recv_front_len (line 1517) | pub extern "C" fn quiche_conn_dgram_recv_front_len(conn: &Connection) ->...
function quiche_conn_dgram_recv_queue_len (line 1526) | pub extern "C" fn quiche_conn_dgram_recv_queue_len(conn: &Connection) ->...
function quiche_conn_dgram_recv_queue_byte_size (line 1531) | pub extern "C" fn quiche_conn_dgram_recv_queue_byte_size(
function quiche_conn_dgram_send_queue_len (line 1538) | pub extern "C" fn quiche_conn_dgram_send_queue_len(conn: &Connection) ->...
function quiche_conn_dgram_send_queue_byte_size (line 1543) | pub extern "C" fn quiche_conn_dgram_send_queue_byte_size(
function quiche_conn_dgram_send (line 1550) | pub extern "C" fn quiche_conn_dgram_send(
function quiche_conn_dgram_recv (line 1567) | pub extern "C" fn quiche_conn_dgram_recv(
function quiche_conn_dgram_purge_outgoing (line 1586) | pub extern "C" fn quiche_conn_dgram_purge_outgoing(
function quiche_conn_is_dgram_send_queue_full (line 1598) | pub extern "C" fn quiche_conn_is_dgram_send_queue_full(
function quiche_conn_is_dgram_recv_queue_full (line 1605) | pub extern "C" fn quiche_conn_is_dgram_recv_queue_full(
function quiche_conn_send_ack_eliciting (line 1612) | pub extern "C" fn quiche_conn_send_ack_eliciting(
function quiche_conn_send_ack_eliciting_on_path (line 1622) | pub extern "C" fn quiche_conn_send_ack_eliciting_on_path(
function quiche_conn_free (line 1635) | pub extern "C" fn quiche_conn_free(conn: *mut Connection) {
function quiche_conn_peer_streams_left_bidi (line 1640) | pub extern "C" fn quiche_conn_peer_streams_left_bidi(conn: &Connection) ...
function quiche_conn_peer_streams_left_uni (line 1645) | pub extern "C" fn quiche_conn_peer_streams_left_uni(conn: &Connection) -...
function quiche_conn_send_quantum (line 1650) | pub extern "C" fn quiche_conn_send_quantum(conn: &Connection) -> size_t {
function quiche_conn_active_scids (line 1655) | pub extern "C" fn quiche_conn_active_scids(conn: &Connection) -> size_t {
function quiche_conn_scids_left (line 1660) | pub extern "C" fn quiche_conn_scids_left(conn: &Connection) -> size_t {
function quiche_conn_new_scid (line 1665) | pub extern "C" fn quiche_conn_new_scid(
function quiche_conn_retire_dcid (line 1689) | pub extern "C" fn quiche_conn_retire_dcid(
function quiche_conn_available_dcids (line 1699) | pub extern "C" fn quiche_conn_available_dcids(conn: &Connection) -> size...
function quiche_conn_retired_scids (line 1704) | pub extern "C" fn quiche_conn_retired_scids(conn: &Connection) -> size_t {
function quiche_conn_retired_scid_next (line 1709) | pub extern "C" fn quiche_conn_retired_scid_next(
function quiche_conn_send_quantum_on_path (line 1725) | pub extern "C" fn quiche_conn_send_quantum_on_path(
function quiche_conn_paths_iter (line 1736) | pub extern "C" fn quiche_conn_paths_iter(
function quiche_socket_addr_iter_next (line 1745) | pub extern "C" fn quiche_socket_addr_iter_next(
function quiche_socket_addr_iter_free (line 1758) | pub extern "C" fn quiche_socket_addr_iter_free(iter: *mut SocketAddrIter) {
function quiche_conn_is_path_validated (line 1763) | pub extern "C" fn quiche_conn_is_path_validated(
function quiche_conn_probe_path (line 1776) | pub extern "C" fn quiche_conn_probe_path(
function quiche_conn_migrate_source (line 1792) | pub extern "C" fn quiche_conn_migrate_source(
function quiche_conn_migrate (line 1806) | pub extern "C" fn quiche_conn_migrate(
function quiche_conn_path_event_next (line 1822) | pub extern "C" fn quiche_conn_path_event_next(
function quiche_path_event_type (line 1832) | pub extern "C" fn quiche_path_event_type(ev: &PathEvent) -> u32 {
function quiche_path_event_new (line 1849) | pub extern "C" fn quiche_path_event_new(
function quiche_path_event_validated (line 1865) | pub extern "C" fn quiche_path_event_validated(
function quiche_path_event_failed_validation (line 1881) | pub extern "C" fn quiche_path_event_failed_validation(
function quiche_path_event_closed (line 1897) | pub extern "C" fn quiche_path_event_closed(
function quiche_path_event_reused_source_connection_id (line 1913) | pub extern "C" fn quiche_path_event_reused_source_connection_id(
function quiche_path_event_peer_migrated (line 1935) | pub extern "C" fn quiche_path_event_peer_migrated(
function quiche_path_event_free (line 1951) | pub extern "C" fn quiche_path_event_free(ev: *mut PathEvent) {
function quiche_put_varint (line 1956) | pub extern "C" fn quiche_put_varint(
function quiche_get_varint (line 1973) | pub extern "C" fn quiche_get_varint(
function optional_std_addr_from_c (line 1991) | fn optional_std_addr_from_c(
function std_addr_from_c (line 2004) | fn std_addr_from_c(addr: &sockaddr, addr_len: socklen_t) -> SocketAddr {
function std_addr_to_c (line 2063) | fn std_addr_to_c(addr: &SocketAddr, out: &mut sockaddr_storage) -> sockl...
function std_time_to_c (line 2153) | fn std_time_to_c(time: &Instant, out: &mut timespec) {
function std_time_to_c (line 2164) | fn std_time_to_c(_time: &Instant, out: &mut timespec) {
function addr_v4 (line 2179) | fn addr_v4() {
function addr_v6 (line 2220) | fn addr_v6() {
function inet_ntop (line 2270) | fn inet_ntop(
FILE: quiche/src/flowcontrol.rs
constant WINDOW_INCREASE_FACTOR (line 32) | const WINDOW_INCREASE_FACTOR: u64 = 2;
constant WINDOW_TRIGGER_FACTOR (line 36) | const WINDOW_TRIGGER_FACTOR: u32 = 2;
type FlowControl (line 39) | pub struct FlowControl {
method new (line 58) | pub fn new(max_data: u64, window: u64, max_window: u64) -> Self {
method window (line 71) | pub fn window(&self) -> u64 {
method max_data (line 76) | pub fn max_data(&self) -> u64 {
method consumed (line 82) | pub fn consumed(&self) -> u64 {
method add_consumed (line 87) | pub fn add_consumed(&mut self, consumed: u64) {
method should_update_max_data (line 95) | pub fn should_update_max_data(&self) -> bool {
method max_data_next (line 102) | pub fn max_data_next(&self) -> u64 {
method update_max_data (line 107) | pub fn update_max_data(&mut self, now: Instant) {
method autotune_window (line 115) | pub fn autotune_window(&mut self, now: Instant, rtt: Duration) {
method ensure_window_lower_bound (line 128) | pub fn ensure_window_lower_bound(&mut self, min_window: u64) {
function max_data (line 141) | fn max_data() {
function should_update_max_data (line 148) | fn should_update_max_data() {
function max_data_next (line 159) | fn max_data_next() {
function update_max_data (line 170) | fn update_max_data() {
function autotune_window (line 186) | fn autotune_window() {
function ensure_window_lower_bound (line 215) | fn ensure_window_lower_bound() {
FILE: quiche/src/frame.rs
constant MAX_CRYPTO_OVERHEAD (line 45) | pub const MAX_CRYPTO_OVERHEAD: usize = 8;
constant MAX_DGRAM_OVERHEAD (line 46) | pub const MAX_DGRAM_OVERHEAD: usize = 2;
constant MAX_STREAM_OVERHEAD (line 47) | pub const MAX_STREAM_OVERHEAD: usize = 12;
constant MAX_STREAM_SIZE (line 48) | pub const MAX_STREAM_SIZE: u64 = 1 << 62;
type EcnCounts (line 51) | pub struct EcnCounts {
type Frame (line 58) | pub enum Frame {
method from_bytes (line 190) | pub fn from_bytes(
method to_bytes (line 372) | pub fn to_bytes(&self, b: &mut octets::OctetsMut) -> Result<usize> {
method wire_len (line 601) | pub fn wire_len(&self) -> usize {
method ack_eliciting (line 814) | pub fn ack_eliciting(&self) -> bool {
method probing (line 825) | pub fn probing(&self) -> bool {
method to_qlog (line 836) | pub fn to_qlog(&self) -> QuicFrame {
method fmt (line 1089) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
function parse_ack_frame (line 1257) | fn parse_ack_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
function encode_crypto_header (line 1313) | pub fn encode_crypto_header(
function encode_stream_header (line 1326) | pub fn encode_stream_header(
function encode_dgram_header (line 1353) | pub fn encode_dgram_header(length: u64, b: &mut octets::OctetsMut) -> Re...
function parse_stream_frame (line 1367) | fn parse_stream_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
function parse_datagram_frame (line 1396) | fn parse_datagram_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
function padding (line 1417) | fn padding() {
function ping (line 1443) | fn ping() {
function ack (line 1470) | fn ack() {
function ack_ecn (line 1506) | fn ack_ecn() {
function reset_stream (line 1548) | fn reset_stream() {
function stop_sending (line 1578) | fn stop_sending() {
function crypto (line 1607) | fn crypto() {
function new_token (line 1637) | fn new_token() {
function stream (line 1665) | fn stream() {
function stream_too_big (line 1696) | fn stream_too_big() {
function max_data (line 1721) | fn max_data() {
function max_stream_data (line 1747) | fn max_stream_data() {
function max_streams_bidi (line 1776) | fn max_streams_bidi() {
function max_streams_uni (line 1802) | fn max_streams_uni() {
function data_blocked (line 1828) | fn data_blocked() {
function stream_data_blocked (line 1854) | fn stream_data_blocked() {
function streams_blocked_bidi (line 1883) | fn streams_blocked_bidi() {
function streams_blocked_uni (line 1909) | fn streams_blocked_uni() {
function new_connection_id (line 1935) | fn new_connection_id() {
function retire_connection_id (line 1966) | fn retire_connection_id() {
function path_challenge (line 1992) | fn path_challenge() {
function path_response (line 2020) | fn path_response() {
function connection_close (line 2048) | fn connection_close() {
function application_close (line 2078) | fn application_close() {
function handshake_done (line 2107) | fn handshake_done() {
function datagram (line 2133) | fn datagram() {
FILE: quiche/src/h3/ffi.rs
function quiche_h3_config_new (line 44) | pub extern "C" fn quiche_h3_config_new() -> *mut h3::Config {
function quiche_h3_config_set_max_field_section_size (line 53) | pub extern "C" fn quiche_h3_config_set_max_field_section_size(
function quiche_h3_config_set_qpack_max_table_capacity (line 60) | pub extern "C" fn quiche_h3_config_set_qpack_max_table_capacity(
function quiche_h3_config_set_qpack_blocked_streams (line 67) | pub extern "C" fn quiche_h3_config_set_qpack_blocked_streams(
function quiche_h3_config_enable_extended_connect (line 74) | pub extern "C" fn quiche_h3_config_enable_extended_connect(
function quiche_h3_config_free (line 81) | pub extern "C" fn quiche_h3_config_free(config: *mut h3::Config) {
function quiche_h3_conn_new_with_transport (line 86) | pub extern "C" fn quiche_h3_conn_new_with_transport(
function quiche_h3_for_each_setting (line 97) | pub extern "C" fn quiche_h3_for_each_setting(
function quiche_h3_conn_poll (line 120) | pub extern "C" fn quiche_h3_conn_poll(
function quiche_h3_event_type (line 138) | pub extern "C" fn quiche_h3_event_type(ev: &h3::Event) -> u32 {
function quiche_h3_event_for_each_header (line 155) | pub extern "C" fn quiche_h3_event_for_each_header(
function quiche_h3_event_headers_has_more_frames (line 191) | pub extern "C" fn quiche_h3_event_headers_has_more_frames(
function quiche_h3_extended_connect_enabled_by_peer (line 202) | pub extern "C" fn quiche_h3_extended_connect_enabled_by_peer(
function quiche_h3_event_free (line 209) | pub extern "C" fn quiche_h3_event_free(ev: *mut h3::Event) {
type Header (line 214) | pub struct Header {
function quiche_h3_send_request (line 223) | pub extern "C" fn quiche_h3_send_request(
function quiche_h3_send_response (line 237) | pub extern "C" fn quiche_h3_send_response(
function quiche_h3_send_response_with_priority (line 251) | pub extern "C" fn quiche_h3_send_response_with_priority(
function quiche_h3_send_additional_headers (line 271) | pub extern "C" fn quiche_h3_send_additional_headers(
function quiche_h3_send_body (line 292) | pub extern "C" fn quiche_h3_send_body(
function quiche_h3_recv_body (line 310) | pub extern "C" fn quiche_h3_recv_body(
function quiche_h3_send_goaway (line 328) | pub extern "C" fn quiche_h3_send_goaway(
function quiche_h3_parse_extensible_priority (line 340) | pub extern "C" fn quiche_h3_parse_extensible_priority(
function quiche_h3_send_priority_update_for_request (line 357) | pub extern "C" fn quiche_h3_send_priority_update_for_request(
function quiche_h3_take_last_priority_update (line 369) | pub extern "C" fn quiche_h3_take_last_priority_update(
function quiche_h3_dgram_enabled_by_peer (line 394) | pub extern "C" fn quiche_h3_dgram_enabled_by_peer(
function quiche_h3_conn_free (line 401) | pub extern "C" fn quiche_h3_conn_free(conn: *mut h3::Connection) {
function headers_from_ptr (line 405) | fn headers_from_ptr<'a>(
type Stats (line 425) | pub struct Stats {
function quiche_h3_conn_stats (line 431) | pub extern "C" fn quiche_h3_conn_stats(conn: &h3::Connection, out: &mut ...
FILE: quiche/src/h3/frame.rs
constant DATA_FRAME_TYPE_ID (line 32) | pub const DATA_FRAME_TYPE_ID: u64 = 0x0;
constant HEADERS_FRAME_TYPE_ID (line 33) | pub const HEADERS_FRAME_TYPE_ID: u64 = 0x1;
constant CANCEL_PUSH_FRAME_TYPE_ID (line 34) | pub const CANCEL_PUSH_FRAME_TYPE_ID: u64 = 0x3;
constant SETTINGS_FRAME_TYPE_ID (line 35) | pub const SETTINGS_FRAME_TYPE_ID: u64 = 0x4;
constant PUSH_PROMISE_FRAME_TYPE_ID (line 36) | pub const PUSH_PROMISE_FRAME_TYPE_ID: u64 = 0x5;
constant GOAWAY_FRAME_TYPE_ID (line 37) | pub const GOAWAY_FRAME_TYPE_ID: u64 = 0x7;
constant MAX_PUSH_FRAME_TYPE_ID (line 38) | pub const MAX_PUSH_FRAME_TYPE_ID: u64 = 0xD;
constant PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID (line 39) | pub const PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID: u64 = 0xF0700;
constant PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID (line 40) | pub const PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID: u64 = 0xF0701;
constant SETTINGS_QPACK_MAX_TABLE_CAPACITY (line 42) | pub const SETTINGS_QPACK_MAX_TABLE_CAPACITY: u64 = 0x1;
constant SETTINGS_MAX_FIELD_SECTION_SIZE (line 43) | pub const SETTINGS_MAX_FIELD_SECTION_SIZE: u64 = 0x6;
constant SETTINGS_QPACK_BLOCKED_STREAMS (line 44) | pub const SETTINGS_QPACK_BLOCKED_STREAMS: u64 = 0x7;
constant SETTINGS_ENABLE_CONNECT_PROTOCOL (line 45) | pub const SETTINGS_ENABLE_CONNECT_PROTOCOL: u64 = 0x8;
constant SETTINGS_H3_DATAGRAM_00 (line 46) | pub const SETTINGS_H3_DATAGRAM_00: u64 = 0x276;
constant SETTINGS_H3_DATAGRAM (line 47) | pub const SETTINGS_H3_DATAGRAM: u64 = 0x33;
constant MAX_SETTINGS_PAYLOAD_SIZE (line 50) | const MAX_SETTINGS_PAYLOAD_SIZE: usize = 256;
type Frame (line 53) | pub enum Frame {
method from_bytes (line 107) | pub fn from_bytes(
method to_bytes (line 153) | pub fn to_bytes(&self, b: &mut octets::OctetsMut) -> Result<usize> {
method to_qlog (line 338) | pub fn to_qlog(&self) -> Http3Frame {
method fmt (line 479) | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
function parse_settings_frame (line 557) | fn parse_settings_frame(
function parse_push_promise (line 635) | fn parse_push_promise(
function parse_priority_update (line 648) | fn parse_priority_update(
function data (line 678) | fn data() {
function headers (line 706) | fn headers() {
function cancel_push (line 734) | fn cancel_push() {
function settings_all_no_grease (line 761) | fn settings_all_no_grease() {
function settings_all_grease (line 806) | fn settings_all_grease() {
function settings_h3_only (line 865) | fn settings_h3_only() {
function settings_h3_connect_protocol_enabled (line 903) | fn settings_h3_connect_protocol_enabled() {
function settings_h3_connect_protocol_enabled_bad (line 941) | fn settings_h3_connect_protocol_enabled_bad() {
function settings_h3_dgram_only (line 978) | fn settings_h3_dgram_only() {
function settings_h3_dgram_bad (line 1017) | fn settings_h3_dgram_bad() {
function settings_qpack_only (line 1052) | fn settings_qpack_only() {
function settings_h2_prohibited (line 1093) | fn settings_h2_prohibited() {
function settings_too_big (line 1161) | fn settings_too_big() {
function push_promise (line 1186) | fn push_promise() {
function goaway (line 1217) | fn goaway() {
function max_push_id (line 1244) | fn max_push_id() {
function priority_update_request (line 1271) | fn priority_update_request() {
function priority_update_push (line 1303) | fn priority_update_push() {
function unknown_type (line 1335) | fn unknown_type() {
FILE: quiche/src/h3/mod.rs
constant APPLICATION_PROTOCOL (line 326) | pub const APPLICATION_PROTOCOL: &[&[u8]] = &[b"h3"];
constant PRIORITY_URGENCY_OFFSET (line 329) | const PRIORITY_URGENCY_OFFSET: u8 = 124;
constant PRIORITY_URGENCY_LOWER_BOUND (line 334) | const PRIORITY_URGENCY_LOWER_BOUND: u8 = 0;
constant PRIORITY_URGENCY_UPPER_BOUND (line 335) | const PRIORITY_URGENCY_UPPER_BOUND: u8 = 7;
constant PRIORITY_URGENCY_DEFAULT (line 336) | const PRIORITY_URGENCY_DEFAULT: u8 = 3;
constant PRIORITY_INCREMENTAL_DEFAULT (line 337) | const PRIORITY_INCREMENTAL_DEFAULT: bool = false;
constant QLOG_FRAME_CREATED (line 340) | const QLOG_FRAME_CREATED: EventType =
constant QLOG_FRAME_PARSED (line 343) | const QLOG_FRAME_PARSED: EventType =
constant QLOG_STREAM_TYPE_SET (line 346) | const QLOG_STREAM_TYPE_SET: EventType =
type Result (line 355) | pub type Result<T> = std::result::Result<T, Error>;
type Error (line 359) | pub enum Error {
method to_wire (line 483) | fn to_wire(self) -> u64 {
method to_c (line 510) | fn to_c(self) -> libc::ssize_t {
method fmt (line 539) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
method source (line 545) | fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
method from (line 551) | fn from(err: super::Error) -> Self {
method from (line 561) | fn from(_err: octets::BufferTooShortError) -> Self {
type WireErrorCode (line 433) | pub enum WireErrorCode {
type Config (line 567) | pub struct Config {
method new (line 579) | pub const fn new() -> Result<Config> {
method set_max_field_section_size (line 598) | pub fn set_max_field_section_size(&mut self, v: u64) {
method set_qpack_max_table_capacity (line 605) | pub fn set_qpack_max_table_capacity(&mut self, v: u64) {
method set_qpack_blocked_streams (line 612) | pub fn set_qpack_blocked_streams(&mut self, v: u64) {
method enable_extended_connect (line 619) | pub fn enable_extended_connect(&mut self, enabled: bool) {
method set_additional_settings (line 646) | pub fn set_additional_settings(
type NameValue (line 672) | pub trait NameValue {
method name (line 674) | fn name(&self) -> &[u8];
method value (line 677) | fn value(&self) -> &[u8];
method name (line 685) | fn name(&self) -> &[u8] {
method value (line 689) | fn value(&self) -> &[u8] {
method name (line 725) | fn name(&self) -> &[u8] {
method value (line 729) | fn value(&self) -> &[u8] {
method name (line 746) | fn name(&self) -> &[u8] {
method value (line 750) | fn value(&self) -> &[u8] {
type Header (line 696) | pub struct Header(Vec<u8>, Vec<u8>);
method fmt (line 706) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method new (line 719) | pub fn new(name: &[u8], value: &[u8]) -> Self {
function try_print_as_readable (line 698) | fn try_print_as_readable(hdr: &[u8], f: &mut fmt::Formatter) -> fmt::Res...
type HeaderRef (line 736) | pub struct HeaderRef<'a>(&'a [u8], &'a [u8]);
function new (line 740) | pub const fn new(name: &'a [u8], value: &'a [u8]) -> Self {
type Event (line 757) | pub enum Event {
type Priority (line 816) | pub struct Priority {
method new (line 832) | pub const fn new(urgency: u8, incremental: bool) -> Self {
type Error (line 843) | type Error = Error;
method try_from (line 860) | fn try_from(value: &[u8]) -> std::result::Result<Self, Self::Error> {
method default (line 822) | fn default() -> Self {
type ConnectionSettings (line 906) | struct ConnectionSettings {
type QpackStreams (line 917) | struct QpackStreams {
type Stats (line 930) | pub struct Stats {
function close_conn_critical_stream (line 937) | fn close_conn_critical_stream<F: BufFactory>(
function close_conn_if_critical_stream_finished (line 949) | fn close_conn_if_critical_stream_finished<F: BufFactory>(
type Connection (line 960) | pub struct Connection {
method new (line 991) | fn new(
method with_transport (line 1062) | pub fn with_transport<F: BufFactory>(
method send_request (line 1113) | pub fn send_request<T: NameValue, F: BufFactory>(
method send_response (line 1190) | pub fn send_response<T: NameValue, F: BufFactory>(
method send_response_with_priority (line 1246) | pub fn send_response_with_priority<T: NameValue, F: BufFactory>(
method send_additional_headers (line 1302) | pub fn send_additional_headers<T: NameValue, F: BufFactory>(
method send_additional_headers_with_priority (line 1373) | pub fn send_additional_headers_with_priority<T: NameValue, F: BufFacto...
method encode_header_block (line 1396) | fn encode_header_block<T: NameValue>(
method send_headers (line 1414) | fn send_headers<T: NameValue, F: BufFactory>(
method send_body (line 1512) | pub fn send_body<F: BufFactory>(
method send_body_zc (line 1553) | pub fn send_body_zc<F>(
method do_send_body (line 1599) | fn do_send_body<F, B, R, SND>(
method dgram_enabled_by_peer (line 1733) | pub fn dgram_enabled_by_peer<F: BufFactory>(
method extended_connect_enabled_by_peer (line 1747) | pub fn extended_connect_enabled_by_peer(&self) -> bool {
method recv_body (line 1762) | pub fn recv_body<F: BufFactory>(
method send_priority_update_for_request (line 1837) | pub fn send_priority_update_for_request<F: BufFactory>(
method take_last_priority_update (line 1939) | pub fn take_last_priority_update(
method poll (line 1986) | pub fn poll<F: BufFactory>(
method send_goaway (line 2089) | pub fn send_goaway<F: BufFactory>(
method peer_settings_raw (line 2149) | pub fn peer_settings_raw(&self) -> Option<&[(u64, u64)]> {
method open_uni_stream (line 2153) | fn open_uni_stream<F: BufFactory>(
method open_qpack_encoder_stream (line 2190) | fn open_qpack_encoder_stream<F: BufFactory>(
method open_qpack_decoder_stream (line 2212) | fn open_qpack_decoder_stream<F: BufFactory>(
method send_grease_frames (line 2235) | fn send_grease_frames<F: BufFactory>(
method open_grease_stream (line 2328) | fn open_grease_stream<F: BufFactory>(
method send_settings (line 2364) | fn send_settings<F: BufFactory>(
method process_control_stream (line 2450) | fn process_control_stream<F: BufFactory>(
method process_readable_stream (line 2472) | fn process_readable_stream<F: BufFactory>(
method process_finished_stream (line 2797) | fn process_finished_stream(&mut self, stream_id: u64) {
method process_frame (line 2819) | fn process_frame<F: BufFactory>(
method stats (line 3141) | pub fn stats(&self) -> Stats {
function grease_value (line 3154) | pub fn grease_value() -> u64 {
type Session (line 3181) | pub struct Session<F = DefaultBufFactory>
method new (line 3191) | pub fn new() -> Result<Session> {
method with_configs (line 3195) | pub fn with_configs(
function new_with_buf (line 3203) | pub fn new_with_buf() -> Result<Session<F>> {
function with_configs_and_buf (line 3235) | pub fn with_configs_and_buf(
function handshake (line 3249) | pub fn handshake(&mut self) -> Result<()> {
function advance (line 3300) | pub fn advance(&mut self) -> crate::Result<()> {
function poll_client (line 3305) | pub fn poll_client(&mut self) -> Result<(u64, Event)> {
function poll_server (line 3310) | pub fn poll_server(&mut self) -> Result<(u64, Event)> {
function send_request (line 3317) | pub fn send_request(&mut self, fin: bool) -> Result<(u64, Vec<Header>)> {
function send_response (line 3337) | pub fn send_response(
function send_body_client (line 3360) | pub fn send_body_client(
function recv_body_client (line 3376) | pub fn recv_body_client(
function send_body_server (line 3385) | pub fn send_body_server(
function recv_body_server (line 3401) | pub fn recv_body_server(
function send_frame_client (line 3408) | pub fn send_frame_client(
function send_dgram_client (line 3428) | pub fn send_dgram_client(&mut self, flow_id: u64) -> Result<Vec<u8>> {
function recv_dgram_client (line 3448) | pub fn recv_dgram_client(
function send_dgram_server (line 3461) | pub fn send_dgram_server(&mut self, flow_id: u64) -> Result<Vec<u8>> {
function recv_dgram_server (line 3481) | pub fn recv_dgram_server(
function send_frame_server (line 3492) | pub fn send_frame_server(
function send_arbitrary_stream_data_client (line 3510) | pub fn send_arbitrary_stream_data_client(
function send_arbitrary_stream_data_server (line 3521) | pub fn send_arbitrary_stream_data_server(
function grease_value_in_varint_limit (line 3541) | fn grease_value_in_varint_limit() {
function h3_handshake_0rtt (line 3547) | fn h3_handshake_0rtt() {
function request_no_body_response_no_body (line 3623) | fn request_no_body_response_no_body() {
function request_no_body_response_one_chunk (line 3653) | fn request_no_body_response_one_chunk() {
function request_no_body_response_many_chunks (line 3691) | fn request_no_body_response_many_chunks() {
function request_one_chunk_response_no_body (line 3736) | fn request_one_chunk_response_no_body() {
function request_many_chunks_response_no_body (line 3771) | fn request_many_chunks_response_no_body() {
function many_requests_many_chunks_response_one_chunk (line 3816) | fn many_requests_many_chunks_response_one_chunk() {
function request_no_body_response_one_chunk_empty_fin (line 3914) | fn request_no_body_response_one_chunk_empty_fin() {
function request_no_body_response_no_body_with_grease (line 3954) | fn request_no_body_response_no_body_with_grease() {
function body_response_before_headers (line 3998) | fn body_response_before_headers() {
function send_body_invalid_client_stream (line 4025) | fn send_body_invalid_client_stream() {
function send_body_invalid_server_stream (line 4077) | fn send_body_invalid_server_stream() {
function trailers (line 4128) | fn trailers() {
function informational_response (line 4173) | fn informational_response() {
function no_multiple_response (line 4234) | fn no_multiple_response() {
function no_send_additional_before_initial_response (line 4283) | fn no_send_additional_before_initial_response() {
function additional_headers_before_data_client (line 4322) | fn additional_headers_before_data_client() {
function data_after_trailers_client (line 4360) | fn data_after_trailers_client() {
function max_push_id_from_client_good (line 4412) | fn max_push_id_from_client_good() {
function max_push_id_from_client_bad_stream (line 4428) | fn max_push_id_from_client_bad_stream() {
function max_push_id_from_client_limit_reduction (line 4453) | fn max_push_id_from_client_limit_reduction() {
function max_push_id_from_server (line 4476) | fn max_push_id_from_server() {
function push_promise_from_client (line 4492) | fn push_promise_from_client() {
function cancel_push_from_client (line 4521) | fn cancel_push_from_client() {
function cancel_push_from_client_bad_stream (line 4537) | fn cancel_push_from_client_bad_stream() {
function cancel_push_from_server (line 4561) | fn cancel_push_from_server() {
function goaway_from_client_good (line 4577) | fn goaway_from_client_good() {
function goaway_from_server_good (line 4591) | fn goaway_from_server_good() {
function client_request_after_goaway (line 4604) | fn client_request_after_goaway() {
function goaway_from_server_invalid_id (line 4619) | fn goaway_from_server_invalid_id() {
function goaway_from_server_increase_id (line 4636) | fn goaway_from_server_increase_id() {
function parse_priority_field_value (line 4661) | fn parse_priority_field_value() {
function priority_update_request (line 4747) | fn priority_update_request() {
function priority_update_single_stream_rearm (line 4765) | fn priority_update_single_stream_rearm() {
function priority_update_request_multiple_stream_arm_multiple_flights (line 4813) | fn priority_update_request_multiple_stream_arm_multiple_flights() {
function priority_update_request_multiple_stream_arm_single_flight (line 4859) | fn priority_update_request_multiple_stream_arm_single_flight() {
function priority_update_request_collected_completed (line 4909) | fn priority_update_request_collected_completed() {
function priority_update_request_collected_stopped (line 4963) | fn priority_update_request_collected_stopped() {
function priority_update_push (line 5021) | fn priority_update_push() {
function priority_update_request_bad_stream (line 5041) | fn priority_update_request_bad_stream() {
function priority_update_push_bad_stream (line 5061) | fn priority_update_push_bad_stream() {
function priority_update_request_from_server (line 5080) | fn priority_update_request_from_server() {
function priority_update_push_from_server (line 5099) | fn priority_update_push_from_server() {
function uni_stream_local_counting (line 5118) | fn uni_stream_local_counting() {
function open_multiple_control_streams (line 5130) | fn open_multiple_control_streams() {
function close_control_stream_after_type (line 5155) | fn close_control_stream_after_type() {
function close_control_stream_after_frame (line 5176) | fn close_control_stream_after_frame() {
function reset_control_stream_after_type (line 5196) | fn reset_control_stream_after_type() {
function reset_control_stream_after_frame (line 5221) | fn reset_control_stream_after_frame() {
function close_qpack_stream_after_type (line 5254) | fn close_qpack_stream_after_type() {
function close_qpack_stream_after_data (line 5278) | fn close_qpack_stream_after_data() {
function reset_qpack_stream_after_type (line 5299) | fn reset_qpack_stream_after_type() {
function reset_qpack_stream_after_data (line 5323) | fn reset_qpack_stream_after_data() {
function qpack_data (line 5353) | fn qpack_data() {
function max_state_buf_size (line 5389) | fn max_state_buf_size() {
function stream_backpressure (line 5454) | fn stream_backpressure() {
function request_max_header_size_limit (line 5521) | fn request_max_header_size_limit() {
function transport_error (line 5572) | fn transport_error() {
function data_before_headers (line 5608) | fn data_before_headers() {
function poll_after_error (line 5633) | fn poll_after_error() {
function headers_blocked (line 5658) | fn headers_blocked() {
function headers_blocked_on_conn (line 5721) | fn headers_blocked_on_conn() {
function send_body_truncation_stream_blocked (line 5790) | fn send_body_truncation_stream_blocked() {
function send_body_stream_blocked_by_small_cwnd (line 5926) | fn send_body_stream_blocked_by_small_cwnd() {
function send_body_stream_blocked_zero_length (line 5998) | fn send_body_stream_blocked_zero_length() {
function zero_length_data (line 6076) | fn zero_length_data() {
function zero_length_data_blocked (line 6131) | fn zero_length_data_blocked() {
function empty_settings (line 6186) | fn empty_settings() {
function dgram_setting (line 6216) | fn dgram_setting() {
function dgram_setting_no_tp (line 6261) | fn dgram_setting_no_tp() {
function settings_h2_prohibited (line 6313) | fn settings_h2_prohibited() {
function set_prohibited_additional_settings (line 6384) | fn set_prohibited_additional_settings() {
function set_additional_settings (line 6423) | fn set_additional_settings() {
function single_dgram (line 6471) | fn single_dgram() {
function multiple_dgram (line 6491) | fn multiple_dgram() {
function multiple_dgram_overflow (line 6522) | fn multiple_dgram_overflow() {
function poll_datagram_cycling_no_read (line 6547) | fn poll_datagram_cycling_no_read() {
function poll_datagram_single_read (line 6589) | fn poll_datagram_single_read() {
function poll_datagram_multi_read (line 6674) | fn poll_datagram_multi_read() {
function finished_is_for_requests (line 6820) | fn finished_is_for_requests() {
function finished_once (line 6836) | fn finished_once() {
function data_event_rearm (line 6862) | fn data_event_rearm() {
function dgram_event_rearm (line 7049) | fn dgram_event_rearm() {
function reset_stream (line 7140) | fn reset_stream() {
function client_shutdown_write_server_fin (line 7198) | fn client_shutdown_write_server_fin() {
function client_shutdown_read (line 7296) | fn client_shutdown_read() {
function reset_finished_at_server (line 7360) | fn reset_finished_at_server() {
function reset_finished_at_server_with_data_pending (line 7400) | fn reset_finished_at_server_with_data_pending() {
function reset_finished_at_server_with_data_pending_2 (line 7439) | fn reset_finished_at_server_with_data_pending_2() {
function reset_finished_at_client (line 7482) | fn reset_finished_at_client() {
FILE: quiche/src/h3/qpack/decoder.rs
type Representation (line 38) | enum
Condensed preview — 2129 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,903K chars).
[
{
"path": ".github/dependabot.yml",
"chars": 1150,
"preview": "version: 2\nupdates:\n- package-ecosystem: cargo\n directory: \"/\"\n schedule:\n interval: daily\n time: \"13:00\"\n open"
},
{
"path": ".github/workflows/deploy.yml",
"chars": 1339,
"preview": "on:\n push:\n branches:\n - master\n\nname: Deploy\n\nenv:\n RUSTDOCFLAGS: \"--cfg docsrs\"\n\njobs:\n docs:\n runs-on: "
},
{
"path": ".github/workflows/nightly.yml",
"chars": 4498,
"preview": "on: [push, pull_request]\n\nname: Nightly\n\npermissions:\n contents: read\n pull-requests: write\n\nenv:\n FEATURES: \"async,f"
},
{
"path": ".github/workflows/semgrep.yml",
"chars": 754,
"preview": "on:\n pull_request: {}\n workflow_dispatch: {}\n push: \n branches:\n - main\n - master\n schedule:\n - cron"
},
{
"path": ".github/workflows/stable.yml",
"chars": 11534,
"preview": "on: [push, pull_request]\n\nname: Stable\n\npermissions:\n contents: read\n pull-requests: write\n\nenv:\n DEFAULT_OPTIONS: \"-"
},
{
"path": ".gitignore",
"chars": 46,
"preview": "**/target\n**/*.rs.bk\n**/Cargo.lock\n**/*.*qlog\n"
},
{
"path": ".gitlab-ci.yml",
"chars": 71,
"preview": "test-job1:\n stage: test\n script:\n - echo \"This job tests nothing\"\n"
},
{
"path": ".gitmodules",
"chars": 117,
"preview": "[submodule \"boringssl\"]\n\tpath = quiche/deps/boringssl\n\turl = https://github.com/google/boringssl.git\n\tignore = dirty\n"
},
{
"path": ".semgrepignore",
"chars": 56,
"preview": "/apps/\n/fuzz/\n/quiche/examples/\n/tokio-quiche/examples/\n"
},
{
"path": "AGENTS.md",
"chars": 6961,
"preview": "# PROJECT KNOWLEDGE BASE\n\n**Generated:** 2026-02-20\n**Commit:** 89d1850f\n**Branch:** master\n\n## OVERVIEW\n\nCloudflare's Q"
},
{
"path": "CODEOWNERS",
"chars": 24,
"preview": "* @cloudflare/protocols\n"
},
{
"path": "COPYING",
"chars": 1306,
"preview": "Copyright (C) 2018-2019, Cloudflare, Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with "
},
{
"path": "Cargo.toml",
"chars": 2483,
"preview": "[workspace]\nmembers = [\n \"apps\",\n \"buffer-pool\",\n \"datagram-socket\",\n \"h3i\",\n \"netlog\",\n \"octets\",\n \"qlog\",\n \"ql"
},
{
"path": "Dockerfile",
"chars": 1414,
"preview": "FROM rust:1.85 AS build\n\nWORKDIR /build\n\nCOPY Cargo.toml ./\nCOPY apps/ ./apps/\nCOPY buffer-pool ./buffer-pool/\nCOPY data"
},
{
"path": "Makefile",
"chars": 1612,
"preview": "DOCKER = docker\n\nBASE_REPO = cloudflare/quiche\nBASE_TAG = latest\n\nQNS_REPO = cloudflare/quiche-qns\nQNS_TAG = late"
},
{
"path": "README.md",
"chars": 15642,
"preview": "\n\n[](https://crates.io/crates/quiche)\n[![do"
},
{
"path": "RELEASING.md",
"chars": 4379,
"preview": "Releasing\n=========\n\nThis document describes the process for cutting releases of the crates in this\nrepository.\n\nMajor, "
},
{
"path": "apps/Cargo.toml",
"chars": 963,
"preview": "[package]\nname = \"quiche_apps\"\nversion = \"0.1.0\"\nauthors = [\"Lucas Pardue <lucaspardue.24.7@gmail.com>\"]\nedition = { wor"
},
{
"path": "apps/run_endpoint.sh",
"chars": 3743,
"preview": "#!/bin/bash\nset -e\n\n# Set up the routing needed for the simulation\n/setup.sh\n\n# The following variables are available fo"
},
{
"path": "apps/src/args.rs",
"chars": 20850,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/bin/cert.crt",
"chars": 1302,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDkzCCAnugAwIBAgIUaj26Dyzr2W9R8juKm2pNyrtati0wDQYJKoZIhvcNAQEL\nBQAwWTELMAkGA1UEBhMCQVUxEzA"
},
{
"path": "apps/src/bin/cert.key",
"chars": 1708,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqtLfR+eQjpD7l\nIqwFeQjCeE7rXH9aC3TOjk/7TJM"
},
{
"path": "apps/src/bin/quiche-client.rs",
"chars": 2008,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/bin/quiche-server.rs",
"chars": 27277,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/client.rs",
"chars": 19477,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/common.rs",
"chars": 53145,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/lib.rs",
"chars": 1485,
"preview": "// Copyright (C) 2020, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "apps/src/sendto.rs",
"chars": 4691,
"preview": "// Copyright (C) 2021, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "buffer-pool/Cargo.toml",
"chars": 413,
"preview": "[package]\nname = \"buffer-pool\"\nversion = \"0.2.1\"\nrepository = { workspace = true }\nedition = { workspace = true }\nlicens"
},
{
"path": "buffer-pool/src/buffer.rs",
"chars": 6175,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "buffer-pool/src/lib.rs",
"chars": 16190,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "buffer-pool/src/raw_pool_buf_io.rs",
"chars": 2928,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "catalog-info.yaml",
"chars": 621,
"preview": "apiVersion: backstage.io/v1alpha1\nkind: Component\nmetadata:\n title: \"quiche\"\n name: \"quiche\"\n description: \"Savoury i"
},
{
"path": "clippy.toml",
"chars": 37,
"preview": "cognitive-complexity-threshold = 100\n"
},
{
"path": "datagram-socket/Cargo.toml",
"chars": 568,
"preview": "[package]\nname = \"datagram-socket\"\nversion = \"0.7.0\"\nrepository = { workspace = true }\nedition = { workspace = true }\nli"
},
{
"path": "datagram-socket/src/datagram.rs",
"chars": 24689,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "datagram-socket/src/lib.rs",
"chars": 2136,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "datagram-socket/src/mmsg.rs",
"chars": 7869,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "datagram-socket/src/shutdown.rs",
"chars": 4447,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "datagram-socket/src/socket_stats.rs",
"chars": 9250,
"preview": "// Copyright (C) 2025, Cloudflare, Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms,"
},
{
"path": "fuzz/.gitignore",
"chars": 17,
"preview": "target\nartifacts\n"
},
{
"path": "fuzz/Cargo.toml",
"chars": 832,
"preview": "[package]\nname = \"quiche-fuzz\"\nversion = \"0.1.0\"\nauthors = [\"Alessandro Ghedini <alessandro@ghedini.me>\"]\nedition = \"201"
},
{
"path": "fuzz/Dockerfile",
"chars": 1050,
"preview": "FROM rustlang/rust:nightly as fuzz\n\nWORKDIR /build\n\nCOPY Cargo.toml Cargo.toml\nCOPY Makefile Makefile\nCOPY apps/ ./apps/"
},
{
"path": "fuzz/README.md",
"chars": 2117,
"preview": "This crate provides fuzzers based on [libfuzzer](https://llvm.org/docs/LibFuzzer.html).\n\nAvailable fuzzers:\n\n* packet\\_r"
},
{
"path": "fuzz/cert.crt",
"chars": 769,
"preview": "-----BEGIN CERTIFICATE-----\nMIICCjCCAa+gAwIBAgIUF98LyjChPz8gcFcrQx6UAtWxSw0wCgYIKoZIzj0EAwIw\nWTELMAkGA1UEBhMCVVMxEzARBgN"
},
{
"path": "fuzz/cert.key",
"chars": 302,
"preview": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEINW2Gd"
},
{
"path": "fuzz/corpus/packet_recv_client/52538a80094f7b62948fd31e68fd17a315d8dc91",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/packet_recv_client/ac9231da4082430afe8f4d40127814c613648d8e",
"chars": 1,
"preview": "\t"
},
{
"path": "fuzz/corpus/packet_recv_server/2416b12c35a58e5f6cf2bc0d33ad4119f8208714",
"chars": 1,
"preview": "_"
},
{
"path": "fuzz/corpus/packet_recv_server/52538a80094f7b62948fd31e68fd17a315d8dc91",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/packet_recv_server/54b8cf23f97a0a8653e76a77b6339978f29b2913",
"chars": 25,
"preview": "\u0006\u0006\u0006\u0006\u0006\u0006\u0006\u0006\u0006%\u0006\u0007\u0006\u000f\u0006\u0006\u0006\u0006\u0006>\u001c\u0006(\n\u0001"
},
{
"path": "fuzz/corpus/packet_recv_server/ac9231da4082430afe8f4d40127814c613648d8e",
"chars": 1,
"preview": "\t"
},
{
"path": "fuzz/corpus/qpack_decode/0389b46ef8babfb1a5a543f7430c66e4ef38da69",
"chars": 1,
"preview": ";"
},
{
"path": "fuzz/corpus/qpack_decode/03da02bdb5382901c3081c7628d0fe0d3ed08480",
"chars": 1,
"preview": "$"
},
{
"path": "fuzz/corpus/qpack_decode/05e5a9f40a49ed6e519faf8c98665f6945a76e85",
"chars": 2,
"preview": "11"
},
{
"path": "fuzz/corpus/qpack_decode/0678a8571fbef7d23cfd6b7f9c290faec65d9a6a",
"chars": 6,
"preview": "?!\u001e?!\u0006"
},
{
"path": "fuzz/corpus/qpack_decode/0769c7bc1c230bd061b0d7b799ddedf9e3879b29",
"chars": 2,
"preview": "[\u0003"
},
{
"path": "fuzz/corpus/qpack_decode/08a583c0fc6609ebc4f993732f6ffd8b06214b4c",
"chars": 1,
"preview": "\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/0a710b2b1235e97561f628b66ab92ecbe32edae9",
"chars": 1,
"preview": "\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/0b163753986ab8121b1e9cec3cafef819e760c8e",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/0c55df3c612d22fb13e991cafc0bf2cf41f37ec3",
"chars": 10,
"preview": "AN\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/0e193d05e77da73a2e2fb4863d0bc87ba401d109",
"chars": 1,
"preview": "@"
},
{
"path": "fuzz/corpus/qpack_decode/0ebf87e99f2585f844687adbe4a8b8153d2f88c3",
"chars": 14,
"preview": "($1**1**1**1**"
},
{
"path": "fuzz/corpus/qpack_decode/11fe182aaee18d0f3c116134ecec55a29ff3b2e0",
"chars": 3,
"preview": "ll-"
},
{
"path": "fuzz/corpus/qpack_decode/1256f042c18db040bb768fe235c460449da5a8b2",
"chars": 3,
"preview": "\u0013'\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/131f91d526dd5804dd8f87200467408757ef5fe8",
"chars": 1,
"preview": "C"
},
{
"path": "fuzz/corpus/qpack_decode/13397261a996f329edf9dc405491afb9dc1754ac",
"chars": 1,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/13f4bf3f5c8ad3bdd600f935613e1f953647c1ab",
"chars": 27,
"preview": "@D\u0001?~\u0001\t]\u0001?~\u0001?D\u0001]\u0001?~\u0001?]\u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/145fb971177b418075853fe53ef7c7c61e6125c7",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/1535300c7581bc65e5dcd660ff68ffe2a3061117",
"chars": 1,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/16cd5a44f52703a9a049a91522e2c7f7c22fd195",
"chars": 65,
"preview": "*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*"
},
{
"path": "fuzz/corpus/qpack_decode/1708e3c33398a5ce728134c261f7d4b82727f415",
"chars": 1,
"preview": "\u0011"
},
{
"path": "fuzz/corpus/qpack_decode/17d6fdc9d91f517d76ef4742446386a0f06e2559",
"chars": 2,
"preview": "0\u0016"
},
{
"path": "fuzz/corpus/qpack_decode/180a5ecd0cb6814e8c6ad86a24e878aed6e52736",
"chars": 5,
"preview": "((c\u0001c"
},
{
"path": "fuzz/corpus/qpack_decode/18eea3b493b082490165d372eafba9e495bff3a2",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/191e6f0e8b11f7b5fc279d9dcfde3fa8d4d9c92a",
"chars": 18,
"preview": "AN\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/1cb53efeab8cb7153d77118db868580a991ee913",
"chars": 9,
"preview": "})с)с)с)с"
},
{
"path": "fuzz/corpus/qpack_decode/1cb8dfcd5bd58feff7cd4b8090b6f9ff287c1ad3",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/1cc1a4a09897a4943b359c6bbe686dbaaaac2109",
"chars": 1,
"preview": "+"
},
{
"path": "fuzz/corpus/qpack_decode/1d76cef839ee530ef9221cd33c439649de627947",
"chars": 1,
"preview": "&"
},
{
"path": "fuzz/corpus/qpack_decode/1e07554d871857d402da21228e5da62ffa31c5e0",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/1e4048ffc3fcaf1e716476a7ba772763c9cc90d9",
"chars": 12,
"preview": "\u0001&\"0'\u0001&\"0'\u0001&"
},
{
"path": "fuzz/corpus/qpack_decode/201342cdddb3b8c686fb502664ac91617a4aef89",
"chars": 5,
"preview": "\u0013N\u000b\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/20c6a49a1636af8568f2e0873d4b76d8e59c164f",
"chars": 3,
"preview": "(1*"
},
{
"path": "fuzz/corpus/qpack_decode/213e374bf2669c82e5ed6a1451b491d3d7d3e341",
"chars": 3,
"preview": "\n(-"
},
{
"path": "fuzz/corpus/qpack_decode/23b5f31a247edf77fb3064ac694ce18e74ac0c5c",
"chars": 3,
"preview": "\u0004}\u0007"
},
{
"path": "fuzz/corpus/qpack_decode/272fe3549b8e8d0e84bfbc32ff32593165bce833",
"chars": 6,
"preview": " # #"
},
{
"path": "fuzz/corpus/qpack_decode/27e9edabbd020c9a29cb58d6dd6a7c2e8f0c7740",
"chars": 1,
"preview": "7"
},
{
"path": "fuzz/corpus/qpack_decode/291912a79d5fcd55e47f6e4fbac6c82a697fb249",
"chars": 3,
"preview": "$?~"
},
{
"path": "fuzz/corpus/qpack_decode/2bbecaa186302b609e2f499bc0146b4904b369df",
"chars": 7,
"preview": "m!xmx\u000f\u000f"
},
{
"path": "fuzz/corpus/qpack_decode/2d92a1deb1df02a146bbfaf50d5ae7156943939e",
"chars": 1,
"preview": "\u0002"
},
{
"path": "fuzz/corpus/qpack_decode/2e359dfc8bcdc849f9bdf8b1b5ba1707b960533f",
"chars": 2,
"preview": "\u0011\u0010"
},
{
"path": "fuzz/corpus/qpack_decode/2fcc837fdcf19093fc07481e105d0e106c603f02",
"chars": 3,
"preview": "\u0002&&"
},
{
"path": "fuzz/corpus/qpack_decode/3130e6e549eb6bf75bfdf15f6f0e2a9a490821d0",
"chars": 2,
"preview": "1)"
},
{
"path": "fuzz/corpus/qpack_decode/318edab5378d4d506bea461b58afea23e7e27fbb",
"chars": 1,
"preview": "+"
},
{
"path": "fuzz/corpus/qpack_decode/31ea2d281fd0e7db70cc9c5f4b916708d7e9392c",
"chars": 3,
"preview": "\u0001@@"
},
{
"path": "fuzz/corpus/qpack_decode/323456136961397da3c0429a6492bd1f9190757a",
"chars": 22,
"preview": "\u000161?\u0001?1\u00010'\u0001\u001d?1~\u0001?!:\u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/3400cabf81d7839890cb2045f9b64eff662c9330",
"chars": 5,
"preview": "\n(((("
},
{
"path": "fuzz/corpus/qpack_decode/351ebcc9797063b4f3fe80b7c117621acec912ea",
"chars": 6,
"preview": "POS?9\u000f"
},
{
"path": "fuzz/corpus/qpack_decode/37b7e167db697587b5661c569ac38ffb5f498e41",
"chars": 3,
"preview": "\n*("
},
{
"path": "fuzz/corpus/qpack_decode/39412207a2044393327d87cbaabddde289f4d434",
"chars": 130,
"preview": "'2\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013"
},
{
"path": "fuzz/corpus/qpack_decode/3b2fd4c127c54578e31a151052e23bbdc035fb9d",
"chars": 1,
"preview": "A"
},
{
"path": "fuzz/corpus/qpack_decode/3b351c9b1b7ee7c6a3a88001c18557b91f977a31",
"chars": 1,
"preview": "f"
},
{
"path": "fuzz/corpus/qpack_decode/3d2d01a661aa7d23989b113fad1835f983d857ea",
"chars": 3,
"preview": "20 "
},
{
"path": "fuzz/corpus/qpack_decode/3f26bf019f07d4df95145e61127528bda535981d",
"chars": 1,
"preview": "*"
},
{
"path": "fuzz/corpus/qpack_decode/3f4bf38ee41bc3c86809c2884de76b8195418e2e",
"chars": 1,
"preview": "\r"
},
{
"path": "fuzz/corpus/qpack_decode/3fa5bfd93317ad25772680071d5ac3259cd2384f",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/3fc3e1d986713a39fd7a522ca03cc840be9ce5e8",
"chars": 3,
"preview": "10\u000f"
},
{
"path": "fuzz/corpus/qpack_decode/40d92f230c5257a383424d5db622e0fb88274911",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/417a31b64daf2a5b24cdfa2ccdbbfb729dafbb70",
"chars": 2,
"preview": "!6"
},
{
"path": "fuzz/corpus/qpack_decode/434233ebede6c984ab2acc096a19f1a343277142",
"chars": 2,
"preview": "\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/44b33774470d8f7fbc227e1c5ffa90add6c6a0f1",
"chars": 2,
"preview": "--"
},
{
"path": "fuzz/corpus/qpack_decode/45187832dae51e95536168a4d2493f59c3f89765",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/453ea3a491331d7bd3d63603a80546a14ab2fae8",
"chars": 9,
"preview": "+Pte\u0013\u0013\u0013\u0013"
},
{
"path": "fuzz/corpus/qpack_decode/4776eabfe1d9ec687982caa8f2f4e64d17481228",
"chars": 2,
"preview": "11"
},
{
"path": "fuzz/corpus/qpack_decode/487da629861a85e37c66b8e2a607189a0c24947d",
"chars": 4,
"preview": "\u000bJ\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/4a4d329659e1c831db7a1522dd6b0dab0c719ff5",
"chars": 1,
"preview": "\u0002"
},
{
"path": "fuzz/corpus/qpack_decode/4b12f06f88334c62a540bb83a5ad65d92c1159e6",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/4bf9dc9638a574b7025c0e560af75cf3796edd6f",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/4d3b8a3c50cb37f29ee87dcd3116413107277b84",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/4f7e760cd98486e9dcdd3315a05778d9a7f20c13",
"chars": 12,
"preview": "\u0005\b\b\b\b\b\b\b\b\b\b\b"
},
{
"path": "fuzz/corpus/qpack_decode/4fbec485b09eba1377acc3af638827b7eac3ae36",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/50c4509efda8dcbea0e0eec77b59aa624e176d94",
"chars": 63,
"preview": "**\n(*1*\n(1**1*\n(1**\n(*1***\b(*(*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*1*\u0001*"
},
{
"path": "fuzz/corpus/qpack_decode/50df183b80223dde85dd784425447f922e0c6f11",
"chars": 3,
"preview": "(99"
},
{
"path": "fuzz/corpus/qpack_decode/51b514f0a18f88f7a1cd4d8df74e05a50fef9218",
"chars": 2,
"preview": "=%"
},
{
"path": "fuzz/corpus/qpack_decode/526de4e1097375983dadc85a08f327047649ded4",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/54009614f8e5896556131bfc2e9676c12d69a11a",
"chars": 1,
"preview": "z"
},
{
"path": "fuzz/corpus/qpack_decode/541bb4db914646ca8bfa3e4548101d77abafec9c",
"chars": 11,
"preview": "\u0001\bw\u0001\bz\u0001\by\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/54c65adb6cb5a0d154adfbbd3dbe86cb174eea73",
"chars": 7,
"preview": "??2\u001d&\u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/55c38e9253befc318a7196921cc0092689c17537",
"chars": 1,
"preview": "?"
},
{
"path": "fuzz/corpus/qpack_decode/587769c92dd937366fd2ead23e769c393f0a6fdc",
"chars": 10,
"preview": "\n.((((((8("
},
{
"path": "fuzz/corpus/qpack_decode/58fbb611237c8c0fae4ba801b5de12304f91b15c",
"chars": 62,
"preview": "**\n(*1*\n(1**\n(*1**1*\n(1**\n(*1***\b(**\n(*1*\n(1**\n(*1*\n(1**\n(*1**"
},
{
"path": "fuzz/corpus/qpack_decode/5b1047c5201637a55f95889e2ac707abd5dfa825",
"chars": 26,
"preview": "\u0001?w\u0001?w\u0001?w\u0001?w\u0001;w\u0001?w\u0001;w\u0001?w\u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/5b8a0b61912fcc0d9a3bdbf2959b8421e80e07b5",
"chars": 3,
"preview": "ll-"
},
{
"path": "fuzz/corpus/qpack_decode/5c41c5cd2b66d690404746bd14329bba14d67a9b",
"chars": 5,
"preview": ";,#,\u0003"
},
{
"path": "fuzz/corpus/qpack_decode/5df91c5df959d8ec3ac4da0636526c9a572bb769",
"chars": 2,
"preview": "\nA"
},
{
"path": "fuzz/corpus/qpack_decode/5e37509ce51787d029472017487a5b21d23e0ece",
"chars": 1,
"preview": "-"
},
{
"path": "fuzz/corpus/qpack_decode/5e7bd00a6f0c996622aab0d05c4f5d2f8751dfb4",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/6123af566cad0b86fe22a983b6702f1ca4da0157",
"chars": 1,
"preview": "z"
},
{
"path": "fuzz/corpus/qpack_decode/6146e8e16f7e4182e92410337d3c06d2b929e68f",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/61eb4bcb9f234c00bd5231b36a143c2bef3f512a",
"chars": 2,
"preview": "\u0002?"
},
{
"path": "fuzz/corpus/qpack_decode/639777406e879d6ba483c85bafa806670db74fea",
"chars": 3,
"preview": "\u0002w\u0007"
},
{
"path": "fuzz/corpus/qpack_decode/647e242902e268b0435254c784787528dcec8b22",
"chars": 13,
"preview": "Dw\u0001\u0001}\u0001\u0001~\u0001\u0001~\u0001D"
},
{
"path": "fuzz/corpus/qpack_decode/64a1bede71641692664d69d4f95adc35953f733f",
"chars": 2,
"preview": "(c"
},
{
"path": "fuzz/corpus/qpack_decode/64f4c0a2c65b2307e28486e212d8061ced9f0d21",
"chars": 1,
"preview": "#"
},
{
"path": "fuzz/corpus/qpack_decode/65c0591f541af77e010716ce5553ae615785be3d",
"chars": 13,
"preview": "\u0001 \u0001[ \u0001[~\u0001? \u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/663f5765df1e7de8a9bb911547c108f621c1b4eb",
"chars": 3,
"preview": "#\u001cO"
},
{
"path": "fuzz/corpus/qpack_decode/669436d423138023429e78aaabff715d271e8e03",
"chars": 2,
"preview": "}M"
},
{
"path": "fuzz/corpus/qpack_decode/6abda42115d3c9dc45890121afb3d9f688959ff4",
"chars": 66,
"preview": "\n(1**\b(**\b(**\b(**\b(**\n(**\b(**\b(**\n(**\n(*1**\b(**\n(**\b(**\b(**\n(**\b(*"
},
{
"path": "fuzz/corpus/qpack_decode/6c8f26698182d8ad63f897e92cf8863459d728ca",
"chars": 4,
"preview": "*\b\b\b"
},
{
"path": "fuzz/corpus/qpack_decode/6cb208ccdc982010795407a2e96651e468fad313",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/6e57784e75db443ae9419f08c82aa84ffe1b4b46",
"chars": 5,
"preview": ",\u0002\u0017\u0017\u0017"
},
{
"path": "fuzz/corpus/qpack_decode/70c9156a6d37c9f56a8c44a47ec9ed456b822dc8",
"chars": 1,
"preview": "="
},
{
"path": "fuzz/corpus/qpack_decode/717fd94b003a8b72c2ea42e2f67cfbe2281da118",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/7190700d24d8d33d1a5b6e56c4af965a8a944541",
"chars": 3,
"preview": "\u0004}("
},
{
"path": "fuzz/corpus/qpack_decode/736ec334b327f40b0834454303b19e7615dff1e3",
"chars": 1,
"preview": "\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/73b875e881b5588e9119fa83f3c23c7019414547",
"chars": 1,
"preview": "\u0002"
},
{
"path": "fuzz/corpus/qpack_decode/73cdd545cb9f0e7e357673a625ca10993758f404",
"chars": 1,
"preview": "?"
},
{
"path": "fuzz/corpus/qpack_decode/74f85de06629b9e866398c154ca87952fd990948",
"chars": 5,
"preview": "460\u0001>"
},
{
"path": "fuzz/corpus/qpack_decode/756952f980bfd880a05f9973718edda98dada4d8",
"chars": 5,
"preview": "\u0001\u000b\u000b\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/75e80ec43df21fc8fa2fe49078d70d4cc392e52f",
"chars": 1,
"preview": "&"
},
{
"path": "fuzz/corpus/qpack_decode/770fe083b0716f6042bb3d24a624e1f5901f9bd8",
"chars": 6,
"preview": "OOP\u0002\u000f%"
},
{
"path": "fuzz/corpus/qpack_decode/7754a75544d8fb96c08f94894e0120f3b29d4d06",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/785f8c9d8025cc5d65840af5ccff5c7e08c8c855",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/79d667ed0657468d439109cb4bc7e2955103bd90",
"chars": 7,
"preview": "\u0001*2\u0001{\u0001U"
},
{
"path": "fuzz/corpus/qpack_decode/7a939d3971804e3750decfc05458f72444c908d4",
"chars": 7,
"preview": "(*(**(*"
},
{
"path": "fuzz/corpus/qpack_decode/7b5235bc7684f131d3b91588be3b5279b9a2d023",
"chars": 4,
"preview": "EAL\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/7ba99e1d77bf3c9fea760a6d0a4f6c40451c43a2",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/7bde08642b72f7ee94ca4411d004097185d0591f",
"chars": 2,
"preview": "1)"
},
{
"path": "fuzz/corpus/qpack_decode/7ed7943400658ed3503632443baff0bc87eb0426",
"chars": 1,
"preview": "["
},
{
"path": "fuzz/corpus/qpack_decode/7fcb35f23a8754a3f9e58c8cb429c1067e9967db",
"chars": 138,
"preview": "\u0001??\u0001?1?\u0001?1\u0001?1'\u0001/1\u0001?1\u0001>1'\u0001?1?\u0001?1\u0001?1\u0001?1\u0001?1'\u0001?1?\u0001?1\u0001?1'\u0001/1\u0001?1'\u0001?1?\u0001?1\u0001?1'\u0001/1\u0001?1\u0001?1'\u0001?1?\u0001?1\u0001?1\u0001?1\u0001?1'\u0001?1?\u0001?1"
},
{
"path": "fuzz/corpus/qpack_decode/7fd3d98bad8f3a2e785ecc0ef0f6967be57452f2",
"chars": 1,
"preview": "\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/803cee12c08d6b4b9c3cde4ffdfaba068b2cdee4",
"chars": 9,
"preview": "(!-!-(!-("
},
{
"path": "fuzz/corpus/qpack_decode/810a06d12925ae06b2d54ea5407023adce355c32",
"chars": 2,
"preview": ",\u0017"
},
{
"path": "fuzz/corpus/qpack_decode/83490f0a81a95963b203d7c7827c82e3b03c8e6e",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/858416dc22c6c02c59065cbde2faba3d09729add",
"chars": 98,
"preview": "\u0001D]\u0001\u0005z\u0001?z\u0001\u0005z\u0001\u0005]\u0001\u0005z\u0001?]\u0001\u0005]\u0001\u0005z\u0001D]\u0001\u0005z\u0001D]\u0001\u0005z\u0001?z\u0001D]\u0001\u0005z\u0001?z\u0001\u0005z\u0001?]\u0001\u0005z\u0001D]\u0001\u0005z\u0001D]\u0001\u0005z\u0001\u0005z\u0001?]\u0001\u0005]\u0001\u0005z\u0001D]\u0001?z\u0001D]\u0001\u0005z\u0001?"
},
{
"path": "fuzz/corpus/qpack_decode/85e53271e14006f0265921d02d4d736cdc580b0b",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/869989fb0161c02968c6bd7bbf56dae9fb3e77b0",
"chars": 1,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/86c1a83d4e198ca6723093ddf12a3949aaf85544",
"chars": 3,
"preview": "(("
},
{
"path": "fuzz/corpus/qpack_decode/86e1b600bb9f8e83720c6a526f3bc479506fe109",
"chars": 3,
"preview": "2(("
},
{
"path": "fuzz/corpus/qpack_decode/87a882b0ae341d53a545f20032cee1eab3e62eea",
"chars": 16,
"preview": "(((((((((((((((("
},
{
"path": "fuzz/corpus/qpack_decode/891163a5f443198c9578eee25ab7d291a2f62b59",
"chars": 2,
"preview": "HE"
},
{
"path": "fuzz/corpus/qpack_decode/8a21554ccbb758bf272c44ed2bfb245122766ea2",
"chars": 16,
"preview": "($1*\u0001*1*\u0001*1**1**"
},
{
"path": "fuzz/corpus/qpack_decode/8b8edf8bcbebd1c9c62d9336118b8b44ac6a4209",
"chars": 1,
"preview": "\f"
},
{
"path": "fuzz/corpus/qpack_decode/90ce68b6646e84c9f116340784ab3ad5ff624687",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/934d273830e2a7a5c07f38e59239e6758dddfc44",
"chars": 3,
"preview": "M[˘"
},
{
"path": "fuzz/corpus/qpack_decode/945ae4d631071140021ac173601aef8db262d0d5",
"chars": 3,
"preview": "\u000b(0"
},
{
"path": "fuzz/corpus/qpack_decode/95295d3777556ef727f606b8e791ec8ef400b713",
"chars": 1,
"preview": "0"
},
{
"path": "fuzz/corpus/qpack_decode/95e1c34fcc230143378464a20b4e85ec6c37aee5",
"chars": 2,
"preview": "\n?"
},
{
"path": "fuzz/corpus/qpack_decode/95ed069cd723680afda0c3d2904acf069c9064f8",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/9656eec3092f2163ad358c7eec031fdf30820dea",
"chars": 1,
"preview": "\u0003"
},
{
"path": "fuzz/corpus/qpack_decode/9713162d3cecbc5394629d9623f8d737c3be7a33",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/9a9e1d6e7b350bc7c3ba7a9cc13a562ada0312b0",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/9b0f4da82f1d8e0efe3fd602941dddbc5eee3d08",
"chars": 0,
"preview": ""
},
{
"path": "fuzz/corpus/qpack_decode/9b7c3ec6265973493d02ba2b98e3ebdf5ba6323d",
"chars": 6,
"preview": "`\u0002`1\u0001"
},
{
"path": "fuzz/corpus/qpack_decode/9c24367ab94cda9d22ca3464016ee4b743e2308d",
"chars": 1,
"preview": "И"
},
{
"path": "fuzz/corpus/qpack_decode/9c3c634ff44887ede4f9b028a3ac209c7d4ea26c",
"chars": 34,
"preview": "'\u0013\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b"
},
{
"path": "fuzz/corpus/qpack_decode/9df0df441a54bdf165c2ce4643fbd15aae1fa463",
"chars": 3,
"preview": "\u0012[U"
},
{
"path": "fuzz/corpus/qpack_decode/9f33ead21ba43e84ec1a570dd4e709664f8eda7c",
"chars": 9,
"preview": "?!\u001e?!\u001e?!!"
},
{
"path": "fuzz/corpus/qpack_decode/9f934df7c406b1f9bfa339130306ccc002747eac",
"chars": 8,
"preview": "\u000f\u000f\u000f\u000f\u000f\u000f\u000f\u000f"
}
]
// ... and 1929 more files (download for full content)
About this extraction
This page contains the full source code of the cloudflare/quiche GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2129 files (4.5 MB), approximately 1.3M tokens, and a symbol index with 5348 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.