Files
boc/aamos-ledger-rust/target/debug/deps/libtokio_util-a3e5b1c36cd61910.rmeta
T

2253 lines
695 KiB
Plaintext
Raw Normal View History

rust
Ù
#rustc 1.96.0 (ac68faa20 2026-05-25)ÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁ futures_sinkÁL1T𽉤
¾
Èþ.-14e3b8a05e30b9eeÁtokioÁJ;Ì3<þÝñŠ7_ú-081d57d1ceb823d6Á parking_lotÁâ°r4¨6ª(ü²Hd©n¼-21962aa896c8619bÁlock_apiÁEcÓŽ/ÅS}sw‡A$P-0e8055cd433fa267Á
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁparking_lot_coreÁ’Ý%Ž=Eq^U4FOV)àŸ-e1ee0517e8b9a4bfÁsmallvecÁ[“S‰«2ûÓàÁ3™ËºS-fa382cf08413422fÁserdeÁFVæ¸Û•IÄÀzÍ-9c8ce3cf08540cc3Á serde_deriveÁ,w|êñ]ù¿¥­C£ð-975c43f96d83014eÁ
serde_coreÁ²€Ãb˜cÐòžÇÇ
-7a42419d8e43b208Á®f©¾/ô)c§{õa“â‘-a3906971a93fd1b8Áæ\‹±ÔcdùÀTƒ-f86f80b348d33b13ÁmioÁGùj0ðÔ·â"FÆ#0Q-3545320490828222ÁbytesÁ`²['3_²µÆ=üå¥-d4f44708ed5da7b6Á tokio_macrosÁóÁm¹^E¼>ŽCê
z3-074a4ab5bbda1a72Ásocket2ÁsT›¸n>~RÊ1G/R-c161f09f0083d1e0Ásignal_hook_registryÁœ¥¿’g›´·DV<{Y<<-b3ea108dcb9d0adeÁerrnoÁÍ\Ý|#{°zŽ¡p&a”-464950f23d45b34dÁ futures_coreÁÆöc$޳–º¾v¸dK-ac1e9cdb826f83c0Á KÊ ¤ ¥$&taskÁ$æ»rtÁtÍtestsÁ,ö¬ú,“/$ü.udpÁÊ»netÁxFãµÛ»µcompatÁ4ý»×G˜read_arcÁDò»io-utilÁ˜Q¬read_exact_arcÁt˜»&( sync_bridgeÁ\±»FH SyncIoBridgeÁdÝ»gicontextÁ<»»îpRŠ timeÁ$…»€S× è poll_proceedÁd€»îŠ Àâ cfg_codecÁ
cfg_compatÁcfg_netÁcfg_ioÁcfg_rtÁ
cfg_not_rtÁcfg_timeÁloomÁ ç    çcancellation_tokenÁ£disarmÁã guard_refÁ'aÁ®ã tree_nodeÁ     TreeNodeÁ%innerÁ%wakerÁ (æ (notifiedÁ InnerÁ+parentÁ+
parent_idxÁ+childrenÁ+ is_cancelledÁ+ num_handlesÁ  
child_nodeÁ disconnect_childrenÁ with_locked_node_and_parentÁ44RetÁ4 move_children_to_parentÁ  remove_childÁ increase_handle_refcountÁ decrease_handle_refcountÁ;  cancelÁ CancellationTokenÁH¨L×NƒPãR>Tæ T child_tokenÁTTT cancelledÁTcancelled_ownedÁT
drop_guardÁTdrop_guard_refÁTrun_until_cancelledÁ]]] Trun_until_cancelled_ownedÁaaa eÞe×hÞh°hŠ  l×
næ n
new_futureÁ q°qŠ  tÞttæ 
xÞxx°xŠ }}°}Š æ mpscÁ 
¥
into_innerÁœ¥œ×Ÿ¥make_acquire_futureÁ¡¥¡¡ ¤  InnerFutureÁ¦Þ¦¥©¥©emptyÁ« ­¥­æ ­Š ­setÁ²¥²æ ²
take_stateÁ² poll_reserveÁ² send_itemÁ² is_closedÁ²get_refÁ²closeÁ²
abort_sendÁ¼¥¼ƒ¿¥¿ErrorÁ¿
poll_readyÁ¿
poll_flushÁ¿
start_sendÁ¿
poll_closeÁ 
 poll_semaphoreÁÉÉÉÉÉÉÉÉÉÉ É
É É É
É
PollSemaphoreÁØ semaphoreÁØ
permit_futÁÉÛæ ÛäÛ clone_innerÁÛ¨Û poll_acquireÁÛpoll_acquire_manyÁÛavailable_permitsÁÛ add_permitsÁÉää poll_nextÁÉçƒÉé×ÉëÉ  reusable_boxÁîîîîîîîîîî î
î î îReusableBoxFutureÁüÞü¥üboxedÁîÞ¥æ ƒítry_setÁ real_try_setÁÞ get_pinÁŠ î¥°Š î¥î¥×î
reuse_pin_boxÁ˜¥˜¦˜ ˜˜ î
CallOnDropÁž žž±î¢ ¢¢æ ¢Ñî§ §§ã
eitherÁ¬¬¬¬¬¬¬¬¬¬ ¬
¬ ¬ ¬
¬
delegate_callÁ¬¼¼£¼ ¼°¼Š ¬Â£ poll_readÁ¬ÆÆ£Æ
poll_fill_bufÁÆconsumeÁ¬ËË£Ë
start_seekÁË
poll_completeÁ¬ÐУÐ
poll_writeÁÐÄ Ð
poll_shutdownÁÐpoll_write_vectoredÁÐis_write_vectoredÁ¬ØØ£ØØ¯#¬ÝÝ£ÝÝ¥ Ý¥ ݲ ÝÖ ÝÄ Ýè utilÁèéééééééé
MaybeDanglingÁð
ð¥ðˆéô¥ôãé÷¥÷æ éúú°úŠ ý èpoll_bufÁÿÿÿÿÿÿÿÿÿÿ ÿ
ÿ ÿ ÿ
ÿÿ
poll_read_bufÁ¥ÿpoll_write_bufÁ¥MAX_BUFSÁ èèèèfutureÁwith_cancellation_tokenÁœœœœœœœœœœ œ
œ¨Þ¨¨æ « œ­Þ­­°­Š œ²²æ ´ œ°Š  FutureExtÁ¿/¿with_cancellation_token_ownedÁÂ¥ cfg_io_utilÁtracingÁÅtraceÁcodecÁÇ bytes_codecÁÈÈÈÈÈÈÈÈÐæ ÈÒÒ¥ ÒdecodeÁÈÖ¥ ÖencodeÁÈÙ¥ Ùï2ÇÇdecoderÁÝÝÝÝÝÝÝDecoderÁää¥ äÔ2ä
decode_eofÁäframedÁé¥ÇÇencoderÁìììEncoderÁïï¥ ïï2ÇÇ framed_implÁôôôôôôôôôô ô
ô ô ô
ôôôôôINITIAL_CAPACITYÁô
WriteFrameÁˆbufferÁˆbackpressure_boundaryÁô>ô>ô÷ô÷ôborrowÁô
borrow_mutÁôÖ6ôé6ô¥¦£¯#       ô ¥¥¥š¥¦¥¨¥¥ ¥² ¥Ö ¥Ä ­¥è ÇÇÇÇÇÇý3µµµµµµµµµµ µ
µ µ µ
µµµµµµµÊ¥Ê¦Êæ Ê
with_capacityÁÊ
from_partsÁÊÕÊget_mutÁÊ get_pin_mutÁÊï1Ê codec_mutÁÊ map_codecÁÕÕÊ
codec_pin_mutÁÊ read_bufferÁÊread_buffer_mutÁÊ write_bufferÁÊwrite_buffer_mutÁÊ6Êset_backpressure_boundaryÁʨÊ
into_partsÁµá¥á¦áá¯#µæ¥æšæ¦æ¥ æ² æÖ æÄ æè µï¥ï¦ï×µó¥ó¦óæ öšÇÇ Ç
Ç framed_readÁûûûûûûûûûû û
û û û
ûû¥æ Ê9Õù9ˆ:¨—3 decoder_mutÁ map_decoderÁdecoder_pin_mutÁê:ý:ñ;û¥¯#û¢¥¢š¢¢¥ ¢² ¢Ö ¢Ä ¢è û«¥««×Ç Ç framed_writeÁ°°°°°°°°°° °
° ° °
°°°Á¥ÁÁæ ÁÊ9ÁÕÁù9Áˆ:Á¨Á˜4Á encoder_mutÁÁ map_encoderÁÌÌÁencoder_pin_mutÁÁ”;Á¨;Á‚6ÁÈ;Áñ;°Õ¥ÕšÕÕ¥ Õ² ÕÖ ÕÄ Õè °Þ¥ÞÞÞ¯#°ã¥ã¦ã×Ç Çlength_delimitedÁèèèèèèèèèè è
è è è
èèèèèèèèèLengthDelimitedCodecErrorÁÿ_privÁèæ builderÁmax_frame_lengthÁset_max_frame_lengthÁ decode_headÁ decode_dataÁ興¥ ˆÔ2茥 Œï2Ž è>èÍELengthFieldTypeÁèæ 
big_endianÁ
little_endianÁ
native_endianÁÜElength_field_typeÁŸ¥length_field_lengthÁlength_field_offsetÁlength_adjustmentÁnum_skipÁ new_codecÁnew_readÁ¦¥ new_writeÁ¨¥
new_framedÁª¥num_head_bytesÁ get_num_skipÁadjust_max_frame_lenÁè¯>è±×è³×èÇ
ÇÇÇ lines_codecÁ¹¹¹¹¹¹¹¹¹¹ ¹
¹Åæ Ånew_with_max_lengthÁÅ
max_lengthÁ¹utf8ÁÉ ¹without_carriage_returnÁ¹ÌÌ¥ ÌÔ2Ï Ìë3¹Ò¥Ò¥ Òï2¹Ö>¹Ø×¹Ú÷¹ÇÇÇÇany_delimiter_codecÁàààààààààà à
à àDEFAULT_SEEK_DELIMITERSÁàDEFAULT_SEQUENCE_WRITERÁàïæ ïµKïÐKàóó¥ óÔ2ö óë3àù¥ù¥ ùï2àý>àÿ×à÷àÇÇÇÈ
BytesCodecÁ
ˆÈÈÈŒƒÈŽ×ÈÖÈ È
È È ï
È
§šùÈœ>ô ReadFrameÁžeofÁž is_readableÁžô5ž has_erroredÁô
£×ôRWFramesÁ¥readÁ¥writeÁô ¨>µ FramedPartsÁª¥ª¦ªioÁªï1ªread_bufÁª write_bufÁª³Eµ²¥²¦²×èBuilderÁ
max_frame_lenÁlength_field_lenÁ¾HÙHòHlength_field_is_big_endianÁè ½×è
è Àƒè èLengthDelimitedCodecÁÃÍEúè
Æ×èȃè DecodeStateÁÊHeadÁË
ÊDataÁÍ
͈èÐ×èèÓƒè¹
LinesCodecÁÖ
next_indexÁÖÐKÖ
is_discardingÁ¹Úƒ¹Ü×¹ ÞÖ¹
¹ á¹ ã¹
åï
¹ç§èù¹LinesCodecErrorÁêMaxLineLengthExceededÁë
êIoÁí
툹ð×àAnyDelimiterCodecÁò½UòÐKò×Uòseek_delimitersÁòsequence_writerÁàøƒàú×à üÖà
à ÿà à
ĕ
à§ùàAnyDelimiterCodecErrorÁˆMaxChunkLengthExceededÁ
ˆW
ˆàŽ×’R
copy_to_bytesÁš¤šæ šÕšù9š¨ Þ ¤ ¥  ²  Ö  Ä  è ¨¤¨¨¯#inspectÁ¬¬¬¬¬¬¬¬¬¬ ¬
¬ ¬ ¬º£ººæ º¨¬¿£¿¿”)¬Ã£Ãï*ÃÄ ÃÉ*ÃÞ*Ãù*¬Ë¨ËËæ ˨¬Ð¨ÐЯ*ÐÄ ÐÉ*ÐÞ*Ðù*¬Ø¨ØØ”)¤RÜÜÜÜÜÜÜÜܤRå£ååå é ReadBufFnÁê
êÞê£êêˆêéñÞñ£ññ°ñŠ 
reader_streamÁ÷÷÷÷÷÷÷÷÷÷ ÷DEFAULT_CAPACITYÁ÷ƒ £ƒ æ ƒ Ê9÷£¯#Š simplexÁŒ Œ Œ Œ Œ Œ Œ Œ Œ Œ  Œ 
Œ  Œ  Œ 
Œ Œ Œ Œ Œ Œ IoResultÁ  ¥Œ CLOSED_ERROR_MSGÁŒ £ Ê9£ register_receiver_wakerÁ£ register_sender_wakerÁ£ take_receiver_wakerÁ£ take_sender_wakerÁ£ Ä£ close_receiverÁ£  close_senderÁŒ ¬ ㌠® ”)Œ ° ㌠² ¯*² Ä ² É*² ù*² Þ*Œ æ  sink_writerÁ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹ ¹  ¹ 
¹  ¹ Æ ¤Æ æ Æ ÕÆ ù9Æ ¨¹ Ì ¤Ì Ì ÞÌ ¯*Ì Ä Ì É*¹ Ó ¤Ó Ó ¯#¹ × ¤× ”)
stream_readerÁÚ Ú Ú Ú Ú Ú Ú Ú Ú Ú  Ú 
Ú  Ú ç ¤ç ç ç æ ç  has_chunkÁç into_inner_with_chunkÁÚ î ¤î î Õî ù9î ˆ:î ¨Ú õ ¤õ õ õ ”)Ú ú ¤ú ú ú º)ú Ï)Ú 
¤
Ú StreamReaderProjectÁƒ
Þƒ
¤ƒ
ƒ
¨ƒ
chunkÁÚ 
¤

projectÁÚ 
¤


¥
¥ 
² 
Ö 
Ä 
è  
Œ Ú¢
6¢
Ä¢
receiver_wakerÁ¢
 sender_wakerÁ¢
bufÁŒ ¨
׌ ReceiverÁª
¨Œ ¬
׌ SenderÁ®
¨Œ °
×Ú  StreamReaderÁ²
¤²
²
¨²
ÖhÚ ·
¤·
·
× DropGuardÁ»
¨½
× DropGuardRefÁ¿
Þ¿
¨Â
ÞÂ
×WaitForCancellationFutureÁÅ
ÞÅ
Å
ý.É
Ê
ÞÉ
__assert_not_repr_packedÁÌ
ÞÉ

ProjectionÁÎ
'__pinÁÎ
ÞÎ
Î
ý.É

ProjectionRefÁÓ
ÞmÓ
ÞÓ
Ó
ý.Ê
øhØ
ÞmÊ
 project_refÁÚ
ÞmÉ
__OriginÁÜ
ÞmÜ
ÞÜ
__dummy_lifetimeÁÜ
Ü
ý.É
â
Þmâ
ÞÉ
MustNotImplDropÁÉ
æ
¥É
è
ÞWaitForCancellationFutureOwnedÁê
ý.ê
í
í
¤mí
Ìmð
Þmð
ý.ð
í
„nô
Þmô
ý.ô
î
øhø
Þmî
Énú
Þmí
änü
Þmü
„oü
ý.ü
í
 Þmí
Áoí
 ¥í
RunUntilCancelledFutureÁ Þ   cancellationÁ ý.Œ  Þ Œ ¤m Þ Œ Ìm Þm Þ  —r ý.Œ „n Þm Þ  —r ý. øhŸ Þm Én¡ ÞmŒ än£ Þm£ Þ£ £ „o£ —r£ ý.Œ ª Þmª Þª Œ ÁoŒ ¯ ¥Œ ± Þ± RunUntilCancelledFutureOwnedÁ´ ´ —r´ ý.¸ ¹ ¸ ¤m» ¸ Ìm½ Þm½ ½ —r½ ý.¸ „n Þm  —r ý.¹ øhÇ Þm¹ ÉnÉ Þm¸ änË ÞmË Ë „oË —rË ý.¸ Ñ ÞmÑ ¸ Áo¸ Õ ¥¸ × 
PollSendErrorÁÙ
Ù ¥Ù ˆÝ ¥Ý ×StateÁà ¥à IdleÁâ
â ˆà  AcquiringÁå
à  ReadyToSendÁç
ç ˆà ClosedÁê
 ì ¥ì ×
PollSenderÁï ¥ï senderÁï ºï acquireÁ
ô ¥ô ×PollSenderFutureÁ÷
÷ ¥÷ ˆ û ¥û ׬EitherÁþ þ £þ LeftÁ
 ˆþ RightÁ
 ˆ¬  £ ׬  £ ƒèèèèRestoreOnPendingÁ
è 
made_progressÁ蹜WithCancellationTokenFutureÁ Þ  œ œ Þœ  ¤mŸ ÞŸ  Ìm¢ Þm¢ Þ¢ ¢  „n§ Þm§ Þ§ § œ øh¬ Þmœ Én® Þm än° Þm° Þ° ° „o°   Þm Þ  Áo » ¥ ½ Þ½ œ WithCancellationTokenFutureOwnedÁÀ À œà Ä à ¤mÆ à ÌmÈ ÞmÈ È à „nÌ ÞmÌ Ì Ä øhÐ ÞmÄ ÉnÒ Þmà änÔ ÞmÔ Ô „oÔ à Ù ÞmÙ à Áoà Ý ¥à ß ¹ 
SinkWriterÁá ¤á ¨¹ ä ¤ä ×¹ ç è ¤ç ¤mê ¤ç Ìmì Þmì ¤ì ¨ç „nð Þmð ¤ð ¨è øhô Þmè Énö Þmç änø Þmø ¤ø „oø ¨ç ý Þmý ¤ç Áoç 
¥ç ƒ
¤÷ ReaderStreamÁ
£
readerÁ
Íj
capacityÁ÷Š
£Š
×÷
Ž
£
¤m
£
Ìm
Þm
£
û‚
Íj
‘ƒ
„n˜
Þm˜
£˜
û‚˜
Íj˜
‘ƒŽ
øhž
ÞmŽ
Én 
Þm
än¢
Þm¢
£¢
„o¢
û‚¢
Íj¢
‘ƒ
©
Þm©
£
Áo
­
¥
¯
£¬
InspectWriterÁ±
¨±
±
writerÁ±
±¬
·
¨·

¤mº
¨º

Ìm½
Þm½
¨½
½
ô…½
±
„nÃ
ÞmÃ
¨Ã
Ã
ô…Ã
±·
øhÉ
Þm·
ÉnË
Þm
änÍ
ÞmÍ
¨Í
Í
„oÍ
ô…Í
±
Ô
ÞmÔ
¨Ô

Áo
Ù
¥
Û
¨Û
¬
InspectReaderÁÞ
£Þ
Þ
û‚Þ
±¬ã
ä
£ä
ã
¤mç
£ç
ã
Ìmê
Þmê
£ê
ê
û‚ê
±ã
„nð
Þmð
£ð
ð
û‚ð
±ä
øhö
Þmä
Énø
Þmã
änú
Þmú
£ú
ú
„oú
û‚ú
±ã
Þm£ã
Áoã
¥ã
ˆ£ˆ CopyToBytesÁ¤¨Ž¤Ž×¤¤m¤ÌmÞm¤¨„nšÞmš¤š¨øhžÞmÉn Þmän¢Þm¢¤¢„o¢¨§Þm§¤Áo«¥­¤° FramedWriteÁ¯¥¯¯¨°³´¥´³¤m·¥·³ÌmºÞmº¥ºº¨³„n¿Þm¿¥¿¿¨´øhÄÞm´ÉnÆÞm³änÈÞmÈ¥ÈÈ„oȨ³ÎÞmΥγÁo³Ó¥³Õ¥Õû
FramedReadÁØ¥ØØ¨ûÜÝ¥Ýܤmà¥àÜÌmãÞmã¥ãã¨Ü„nèÞmè¥èè¨ÝøhíÞmÝÉnïÞmÜänñÞmñ¥ññ„oñ¨Ü÷Þm÷¥÷ÜÁoÜü¥Üþ¥þµFramedÁ¥¦¨µ¥¦¤m¥¦ÌmŒÞmŒ¥Œ¦Œ¨„nÞm¥¦¨øhÞmÉn˜ÞmänšÞmš¥š¦š„oš¨ Þm ¥ ¦Áo¥¥§¥§¦ô
FramedImplÁª¥ª¦ªÙwª¨ªºªï1ô ±¥±¦±Ùw±×ô·¥·¦·Ùw¤m»¥»¦»ÙwÌm¿Þm¿¥¿¦¿Ùw¿¨¿º¿ï1„nÇÞmǥǦÇÙwǨǺÇï1·øhÏÞm·ÉnÑÞmänÓÞmÓ¥Ó¦ÓÙwÓ„oÓ¨ÓºÓï1ÜÞmܥܦÜÙwÁoâ¥ä¥ä¦äÙw


*
1
2
3
4
4
4
8
8
9
9
:
;
=
M
M
M
O
Q
V
W
X
Y
\
]
g
g
g
k
k
k
m
m
m
p
s
s
s
|
|
|



ž
ž
ž
°
°
°
±
µ



·
¸
¹
º
»
¾
Â
Â
Â
Ã
Ã
Ã
Ä
Å
Å
Å
Ý
Þ
à
à
à
á
á
á
â
ã
æ
æ
æ
è
ê
ê
ê
ì




Ž
Ž
Ž









ª
Á
Á
Á
Å
Å
Å
Å
Å
É
É
É
Ê
Î
Ï
Ï
Ï
Ó
Ó
Ó
Ó
Ô
Ô
Ô
Õ
Õ
Õ
Ö
Ö
Ö
Ö
Ö
×
Ü
Ü
Ü
ã
ã
ã
ä
å
å
å
æ
æ
æ
ö
ý
ý
ý








±
±
±
¹
¹
¹
À
Õ
Õ
Ø
Ø
Û
Û
ç
ç
è
è
ò
ò


˜
š
 
 
 
«
«
«
¬
­
­
­
¯
¯
¯
Ð
Ñ
Ò
Ó
Ô
Ø
Ù
Ú
Û
Ü
Ý
Þ
å
å
å
ë
ë
ë
ì
í
í
í
î
î
î
ò
ò
ò






š

¡
¡
¡
§
§
§
¨
©
©
©
ª
ª
ª
®
®
®
Æ
Ç
È
Ê
Ë
Ï
Ð
Ñ
Ò
Ó
Ú
Ú
Ú
Û
Ü
Ü
Ü
Ý
Ý
Ý
â
â
â
æ
æ
æ








Ž
Ž

œ

ž
Ÿ
¡
¢
£
¤
¥
¦
¨
ª
¬
­
®
²
²
²
´
´
´
È
É
Ë
Ï
Ï
Ñ
Ñ
Õ
Õ
Ù
Ù
Ù
ò
ö
ö
ø
ø
ü
ü












˜
˜
š
š
¤
¤
¤
µ
µ
µ
¾
¾
¾
Á
Ç
Ç
Ç
É
Ñ
Ñ
Ñ
Ô
Û
Ý
Ý
Ý
ß
â
â
ä
ä
æ
æ
è
è
ñ
ñ
ñ
ù
û
û
û
ý












ž
¤
¤
¤
¥
¦
¦
¦
§
§
§
«
«
«
½
¿
Â
Â
Â
Â
Â
Æ
Æ
Æ
Æ
Ç
Ç
Ç
È
È
È
É
É
É
É
É
Ê
Î
Ð
Ó
Ó
Ó
Ó
Ô
Ô
Ô
Õ
Õ
Õ
Ö
Ö
Ö
Ö
Ö
×
Û
Û
Û
Û
Û
å
å
ö
ö
ö
Š
Š
Š
¥
¥
¦
¦
§
¨
©
ª
«
­
¯
¯
¯
¯
¯
±
³
³
³
³
´
´
´
µ
µ
µ

·
·
·
·
·
É
Ê
Ð
Ð
Ð
Ð
Ñ
Ñ
Ñ
Ò
Ò
Ò
Ö
Ö
Ö
Ù
Ù
Ù
Ù
Ù
ì
ñ
ò
ó
ù
ù
ù
ù
ù
þ
þ
þ
ÿ
Œ










©
©
©
­
­
­
±
±
±
º
º
º
¾
¾
¾
Ä
Ä
Ä
Ì
ï

»
ß
ß
ß
î
î
î
ö
ö
ö
ý
ý
ý
Š
Š
Š
Ž



Ÿ
Æ
æ
æ
æ
ê
Œ
Œ
Œ

º
ç




·
à

µ
µ
µ
»
è8è8_8äïá¤ûÒªØ
¬
å
ƒ ® Ô º Ü ¿Š ˆÆOˆÈ ýJ >²îÛá±Øá±¿cá±á±Ðìá±µßá±á±ºá±íßá±á±šeá±³á±äá±ïá±BytesÁµ dataÁvtableÁNÍâíŠáïá±"¿"¿BytesMutÁµ "™"™capÁ"™Ò²"™)Ö1^ÔvÏ¿cªª“•®¨¯º°ï1x
ä'†ý3¿¥¦Ùw“íªª“•®¨¯º°ï1x
ä'†ý3¿¥¦Ùwá·µáó´¿cžžãPŸôP ÿP¡ô5¢šQìJÝ(…ž/³¥¥ºQ¦ÊQ§ÖQÁA½+úô³Ķ³ˆˆâ5ô5Š‚6ƸðÐzo¡CéĶŽ´éã·Ž´ ™·Ķ£™·Ķ ™·ã·£™·ã·'Eªª“•®¨¯º°ï1x
ä'†ý3¿·µ½µ£
ªª“•®¨¯º°ï1x
ä'†ý3¿·µ›¶¨š“íÒ’¨µçwpW…r}X•¶›¶¤·µ¤Ò’¨µçwpW…r}X·µ½µ'Eüº
Ò’¨µçwpW…r}X·µ›¶¥º¿cüº¿cªªïQ­’R®ï1¯¤R°´R±³E{ äáT·µ½µ“íØØÛ¨ûF}pøc•¶û·µûØØÛ¨ûF}pøc·µ'E¼½
ØØÛ¨ûF}pøc·µ¤½¥º¿c¼½“í¯¯Ç²¨°Ír°k0Fo•¶Ò·µÒ¯¯Ç²¨°Ír°k0Fo·µ
¯¯Ç²¨°Ír°k0Fo·µ†¿¥º'E¯¯Ç²¨°Ír°k0Fo·µï½¿c¯¯Ç²¨°Ír°k0Fo·µ½µ¿cêR·ùR踎Sè¹¾HèºÙHè»òHè¼¾SèñÆ0w,g‡ÛšÁØšÁŠ šÁ¿cÃÄTÄÍEèźèÚ¸h¼*ج¿cÊËÌÝTÍÎîTψèÆõ/(ðí†iÛøÂØøÂŠ øÂä¬Âï¬Â¢³³¬Â³šÁ¿cÿÿ’E³Eèí^³h
ª‹VÄcÄľÄÄØÖÖ«U×½U¹ØÐK¹Ù×U¹Y÷Eú¿cÅÅÐìŵßÅźÅíßÅÅšeÅäÅïÅ·µ³Å¿cêëìëVíîWïˆê)µGùØ=ÄcÙÆéÙÆßߥ à ¬
ÑøÿËO Ÿ¾ÙÆØòò±Wó½UàôÐKàõ×UàöâWà÷ùWà~ý3̘Í;¿cîÇîÇÐìîǵßîÇîǺîÇíßîÇîÇšeîÇäîÇïîÇ·µ³îÇ¿cˆŠ–YŒWˆ{ Þ”íݬ&ÄcÐÉéÐɮǾÐÉ¿c¬‹¨yî‚$7ŒÙ³¤“í¬‹¨yî‚$7ŒÙ³¤ª·µª»Ê
øÊ Þ
'E»Ê“íÞ
Þ
Àˆá
û‚¬â
±¬€´
5eµF£·µÞ
Þ
Àˆá
û‚¬â
±¬€´
5eµF£ÄÌÃÄÌ“í±
±
Ï…´
􅬵
±¬7†„€[¿%¨¬ÌØ
ᵯ
±
±
Ï…´
􅬵
±¬7†„€[¿%¨†ÍÂ΂΂ØêêëÆ^ïˆÜðÜ O2“M¤ópäަ̿c

ß‚
û‚÷ˆ
Íj÷
‘ƒ÷H&tK^øâ€Í“í

ß‚
û‚÷ˆ
Íj÷
‘ƒ÷H&tK^øâ¦Ì¬
·µ¬
»Ï'E»Ï¿c¢
¢
Ú£
6Œ ¤
ÄŒ ¥
£jŒ ¦
¹jŒ §
ÍjŒ m¸cÏUŸ\¿cª
ª
åj«
¨Œ * ·Š ¸Œ"éÑéÑ¿c®
®
Šk¯
¨Œ 1\wìþòÎŒ"´Òôҿcá á ŀ㠨¹ u8"Õ´!«ŒêÊ“íá á ŀ㠨¹ u8"Õ´!«Œ§Ë
·µ
ÿÒÃÿÒ'EÿÒÿÒ¿c²
²
­kµ
¨Ú 
ÖhÚ œ?E¤*k(êʪÔtªÔ“íªÔ
ªÔ¥¿c»
»
ýk¼
¨Ù»háþ),gŒ"¦Õ¿c¿
¿
¡lÁ
¨Ó0Xj˜]RÞŒ"¿
¿
¡lÁ
¨Ó0Xj˜]R8«½HHÉI¨bO³r<¬½ÙÖ“íÅ
Å
ØlÇ
È
ý.%‹™ßK¤ÃKÞå
ᵌ
Å
Å
ØlÇ
È
ý.%‹™ßK¤ÃKÞ“íê
ê
ñoë
ý.ì
J|]E“wkƒ ·µƒ ­Ø¿cÙÖØÙÖŒ"ÙÖ³ÙÖ¿cçׂØç׿c­Ø‚Ø­Ø“í  èqŠ —r ý.L‚@Ó°ÍÜëެ̮ ·µ®   èqŠ —r ý.L‚@Ó°ÍÜëÞ†Í‚Ø±Ú“í´ ´ ät —r· ý. ÚP7>_ІÍÔ ·µÔ ´ ´ ät —r· ý. ÚP7>_Š‚ØÕÛ¿cÙ Ù Ú šwÜ ˆ C]˜è÷ZÆ·µÄc¦Ü¾¦Ü¿cà â ã îwä ˆå æ ‡xç è xé ˆê ë ½xo슡;šÈš·µ¿cï ï åxñ ÿxò ºó •yA,úqaƒ·µ¿c÷ ÷ ø ¹yú ˆ 9ŒJñ
ûÓ·µØòÝ
òÝ·µ'EØØá!Ùö!ÉÚ‡"ɼç¨ùÑtóžØ˜ß¿c˜ßà˜ßŸ^Ÿ^ SemaphoreÁ ^ll_semÁÄUÊ}Õ¹iQ‚Øüü¿$ÿè$îÊðß”Ti8•¶ ¸à¿c¸àŒ"žžú&¡±îÁB9# †Í¿cþ   ™zƒ ˆ  ²z ˆµ‹_-u ¦ÌØËá‚ØËáËátËá©ËáÃËá'EËá
ËáŒ"ððñ¹,óˆé ÇñËÙzWŒJ·µ‚Øððñ¹,óˆé ÇñËÙzWŒJÜ“í  Ô{š œÃI?ïҌެ̺ ·µº   Ô{š œÃI?ïÒŒÞ†Í‚ØÆä“íÀ À ª~ œ0Ì#Åø>í†ÍÜ ·µÜ À À ª~ œ0Ì#Åø>íÜ‚ØÖå¿·µŠÂÕÊ¿ÒÊŒÀÈÃÓÊÚÖøòNï çØ þ ޱª£žï²ª«Øã¯½ÆÃÐʱÿÜÖðêúòŽˆŽŠ

¨
¢
¬
ª
°
®
ä á ·
²
½
»
Â
¿
LHeÅ
lê
Ý Ù ì à ô ï û ÷ éØü þ ÞÖüòàÖþòáÖÿòãÖòåÖƒòçÖòœ¨¥žˆÃ¯ÖÖýòRˆÃÌÖóòÖÙŒÃÒÖùòܪ ÷ØÎ¯§Þ
Ô
±
©

ý á
²
â
Å
ê
ª  Ñ ´  Ù À â䪞ˆÚꈥ¥¥¥ªáØÞ¯¨
Ó á 䨨þ ¥ªæ¢ØÕ¯ 
²
¿ï Ýþ ¥§üþØÓÕ¯˜³ÿØêÿˆœÙ µÿÜꃈŸÙ «­ˆÞ
¿Þ
ر
® ª
× á õ ²
Âþ ÃÞ
б
² ®
Ì á Ðþ Ù
Û
±
ñêhÅ
qê
x }´ ü¼þ úð­ À ­
¯

¬ ª
° ®
»
¿
Pžôð
ƒ
á ú ²
Æþ JHK
è
Å
ê
¯ ±  Õ × ´ ëØüËþ » ½  Ý ß À Š Ä
ÛØ
¿c"DêÐìµßºíßše³ ä=ï“í#ápé
 £'E 
?¤8û
Ò

Äc¾ª

Ã*Ø
#‚Ø
¬
BŒ"
-t
«½¬½å
ƒ 
® 
Ô 
à
 ©º Ü 
¿
 ±5 86jü‘)£/ 5B ÓË Âü“1í’õäôäô6 b",;\n\r"Á 5B’õ ïüÅ,î’õœöŠœö6b","Á
ü« Ï  é€ÍèԓؓؔØÎ•؈ä o
³΢½Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®Ç €Í èÔÁÎ
Ì üøŠÚ ‚ù¤¸  ê€ÍèÔÍ  
ˆØêêëÆ^ïˆÜðÜ O2“M¤ópä€ÍèÔ iи úŽ ú¦«
öX ú À ÉÍ
Úß
„Øúò
Š   * œØ¥øAMç È¥øú œØ¥ø &ÇÓÚ
µ
Ãþ    é:øŽ« Ï  !(
f t  ΄ 
A Ò Žù 
ÍÖß=òú&0
®Û÷C &-!k Û÷v ÌÌkδ¸Ï local_wakerÁ¸ÐextÁ¸Ñ_markerÁ¸Ò_marker2Á¸f'EwÚ]¾åüø ‚ùÚ áúùú'üø‚ùÈ ú²X/œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¥ø}„¾„¾PinÁ†¾ ˜X$]È=„kt•°ûº°ûðûÌÄ€hÄ€qÄ€çï¥øÄ€ÄÌÔÜäì¥øzþÊQŠüøÍj‚ùÊQ®Íj°û7ú Ló œØ(3
éB%,œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¯Û÷¸Ä€ÁÉú;û« TXÆ®‚„¾„¾ˆ‚†¾ ˜X$]È=„kt•Ù÷CÄ€LüøF‚ùEú6úd®‚Hü‚Q°ûZÄ€ck¥øÄ€}Ù÷¿þÊÊQÇüøÍjÏ‚ùÊQëÍjíûtú  0 ˆú
ªûÞûÊQÍjú¾ûƒÖÚHúèû­r4096Á "simplex has been closed"Áü—Kè
 `Üì÷Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÜƒØ ÙÖ܃
,ÒJ
ÒJ
ÓŒ©ÙJ
Üœ¤K
d©K

X$¤K
t©K
)$ÆK
 ۼŌü¡KØ

„ L
L¥L

Y$ L
\¥L
ÊL
 üèKt
  Ü êL
 
ˆØ  èqŠ —r ý.L‚@Ó°ÍÜëÜx_ø¬èK‡
Á Áž£
öX Á ¸ ÁÅ
Ò×
„ØÁ ê
Œ
 øü

¨
" œØ€Œ9Eé
È€Œÿ«îL
Á
­þL
(ÿL
œØ€Œ&}Áy޼Ì7r[ av |`ø­—Kè
 ÝäÂ#Ð#¡¨­ »ÁÓ  øL
 ÕÝíøÿ ox? l sy?
GWbir
| ÷
Ü)07>ELU_
®í‹rÜãµ¼$š 틥Ā®ÓŒÜÙJ
ÄÓŒ·Á Á4Å
Å
ØlÇ
È
ý.%‹™ßK¤ÃKÀÓŒ³Ü«Á E|œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã€ŒÊ„¾„¾ˆ‚†¾ ˜X$]È=„kt•ÚÚÚÄ€½Ä€ÆÄ€2:€ŒàçÄ€S[Öû #€Œltþ$ÓJ
ÓŒfutÁàÜ
ö›þûÁ «èù œØ ( 
`6  §y°†_ í‹h Ä€q y ÁU2û—K
Þ­šÁ „¾„¾ˆ‚†¾ ˜X$]È=„kt•ë‹ü Ä€
ÓŒj ÜW ÁVÁÙ×ܹ­šzûšƒÚŒÄ€€ŒCÄ€¯€Œ

닚
þ¥
&ÓŒö›Ü0
ö›!û¹Á Î  í
ËŽ» ºS ÔZ ˆ‘a ÁùÁÜêÜñö›Á- ûÐçë­ ÁW ûú× ü•S3
 dÜì÷€ŒÙÖÜ2? ¯ÑR
ÙÖÙÖ°×R
Ü$ŸS
ÙÖìŸS
œ¤S

]Ü3¸S

ĤS
½S
 
ˆØí‹N
%ø³ŸS#
í‹DK í‹ch
öXë‹ z ƒ

„Øí‹¬
ˆ º¾ Ê  㠜؀Œùâ È€Œ²ÁS
í‹

´ÇS
ÙÖ ÈS
œØ€Œ &fí‹
bÙÖŠ
Ø
æÁ ÇÜ âdüø´•S3
 BI'5RYÄlí‹   ÇS
 ˆÙÖ © ±ÌÕè d
kâ êóÙÖ   '
1;E`is}ÜÜ«ÙÖÀÇÎÕÞè
®ž£ûÿ>E # ž£.Ä€7ÙÖ$ÑR
Ü×R
틃틾ӌàܱí‹~·­šÀ¡ŸÉë‹Òë‹ÛÄ€»Ä€ÄÄ€öþ€ŒÞåÄ€ $,€Œ)1þ<ÙÖö›Ü+ÙÖö›7ûí‹ ¨«¼Ê œØàë
dùý<C°†"ž£+Ä€4<ÙÖ í‹Zû•S
BF¥­šˆ„¾„¾ˆ‚†¾ ˜X$]È=„kt•œ£ÃÄ€ÌÜí‹
í‹HÓŒj­š(¡Ÿ1ë‹:Ä€CK€Œ+Ä€]6œ£?þJÙÖö›Ü9ÙÖö›Eû¡í‹  ¹º¤%ì¤úË¥ü¥í‹ìÙÖÖí‹úÙÖäö›ÙÖÈÜ_ûÄ hÙÖšµUûû<@Ÿüö ê  ¤·µì÷Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
‰M‰M OwnedPermitÁMchanÁìLyòÚ'ØyJc·µ¦ÜÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙúLúLŠküL®¶ìL訋øæ´÷R·µ4B ¸¯ ×·×·$‚
×· ùØž"#ù½ž"#
°cùÓµ.#Z˜‹94
×·Ûœ¸ü¡
# 

ÅM·µ

Ò
 
ˆØÇM·µì÷Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
·¦\¦\§\ SendErrorÁ©\ˆ P@T‡#Í蜸îÈø»¡
6 éºçî éº 
öX éº ",1
?E
„ØéºY
 hm z 
 œØ¶¢®é ÈýººÖ
éº ¼í
 ¥·µÏ»¦Üü¡
d 

ç[·Ï»¦Ü¥·µÒ¾ ü¡
6 k
üå
à œØ¶&ù×@#á×#
ÜW>'ñéº
 
ô
D J_ e¤ø¾ö ê ü‘
t cj¯,½,ÉÐÛ"ãéº û  
 ¾ß   $[df ks
z ipx 
¤
«'×·À'ÐÙâ ë ò*×·*PYcm×·ž§±
®®¶ÄD? §-ì ®¶÷Ä€×· d‘
œ¸6ýº¢éºöéº.œ¸éºEQ!œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãýºo„¾„¾ˆ‚†¾ ˜X$]È=„kt•켪켳켼ĀùĀĀ×ßýº#Ä€øˆ¿!ù×Üì#ŒäÈäÈ ArgumentsÁæÈtemplateÁ `çÈÀ `üöMõô]Tdµ½ÅÍÕݼÄÌÔÜäì¶#
+
þ6
Ò²:×·Ò²M×·ÿxûséº ˆ
¦
´
œØÊ
Õ

¤ä
d_Àǰ†
®¶ Ä€ ' ×·.éº;Ò²ûö ÀÄ+ œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¶º „¾„¾ˆ‚†¾ ˜X$]È=„kt•¬¶õ Ä€þ ôœ¸)
éºà éº
úÆò ÈÇû ì¼
Ä€

ýºR Ä€'
ˆ¿H¦öÈÏ
¶  ¬¶ þ Ò²¡×·Ò²´×·ÿxì
ûÚ éº ï  ü  ܹ^ ´º âºÝ
æ¼ä
Ÿ½ë
éº% ö¾æú¿oéº: Ò²×·G·µÆM[
Ò²û ßãJ ×·ñÐ
Ò²ûY  ƒ IJ  ¬·µì÷¶,9ùݽD#Áݽ#
àWùÝÖ*#(˜‹4ƒŽ ¯¬½ÈÕåíöÿ
®òÑ òÑ(Ä€1í¶@HþS\m{ œØœ
¬«°†¸òÑÁÄ€ÊÒ² Ê Íþ„¾„¾ˆ‚†¾ ˜X$]È=„kt•ðÑ9Ä€BþQðÑZþenÂÒ.¤¢¥¸¹@64Á@MAX_BUFSÁ¬÷ ˆ%á±18?$û~
ÊÎ%øÂ18?û; êî%ÙÆ1®Ç9@½F ˆŒ%ÐÉ1®Ç9@ÔÙ ê¦Ì®Ï%ë2êêëÆ^ïˆÜðÜ O2“M¤ópä¦Ì®Ï ¦Ì ®Ï˜ŸÜ— Ù ·µÚ )¦Ü5Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ·µ à ·µã )ùÜ5œ¸=D à ·µè )ùÜ5·=DÔº ÷ ·µø )ÃÞ5üü¿$ÿè$îÊðß”Ti¶mt$¿ þ “â¦Ì  -Ëá9“âAH þ “â¦Ì  -Ëá9¦ÌAHüº " ð·µñ*€ã6ÑÛÑÛ MaybeUninitÁÓÛuninitÁÝÔÛ»ÝÍõƒ«%9·µ ¬èÅÇÀö "çüØü±%" Utilities for working with Tokio.Á×úüÛ96 This crate is not versioned in lockstep with the coreÁü•@= [`tokio`] crate. However, `tokio-util` _will_ respect Rust'sÁüÖKH semantic versioning policy, especially with regard to breaking changes.Áü¿ üá" ¬èÅÇÀ|ö }"çš ´´L
  Ä  ,,   *, 8÷$!& %8÷$&
+*. 1 Â, ; < »+ J K b8âL O a8»<P X7ï1<Z+ p q Ÿ8äDr z ž8docsrsÁ4{$ 8Óƒ  8â Š œ8»< 7ï1<•, ­8÷
¼¼Ç ß Ž å ô, æ ç ò, è8÷& í8÷
ó*ö ù Œ, ƒ  +   «8â  ª8»<˜  7×+ ¹ º é8ä à è8áå$ Ê8ÓÌ Ï ç8âÐ Ó æ8» Ü7×, ÷8÷
¤‘ ¦ ÿ ¬ », ­ ® ¹, ¯8÷& ´8÷
º*½ À ý, Ê Ë ö+ Ù Ú 8âÛ Þ 8£ß â 8» ë7µ$ ò8» ü7ï1+   Ú8äD— Ÿ Ù8áå$ ¦8Ó¨ « Ø8⬠¯ ×8£° ³ Ö8»<´ ¼7µ$ Ã8» Í7ï1, è8÷
÷œ‚4  ½ œ «,  ž ©, Ÿ8÷$ & ¤8÷
ª*­ ° », º » ´+ É Ê Þ8âË Î Ý8» ×7R+ ì í ˜8ä ö 8áå$ ý8Óÿ  8⃠ 8»<‡ 7R$, ¦8÷
µœ½ Ñ ø  × æ, Ø Ù ä, Ú8÷& ß8÷
å*è ë ö , õ ö ï +   8â  ˜ 8» 7î$” + §  ¨  Ó 8ä ±  Ò 8áå$ ¸ 8Óº  ½  Ñ 8â¾  Á  Ð 8» Ê 7î, á 8÷
ð ¼û Tˆ

 
 ¨
, š

 ¦
, œ
8÷$
& ¡
8÷

§
*ª
 ­
 ƒ , ·
 ¸
 ü
+ Æ
 Ç
 à
8âÈ
 Ë
 ß
8
Ì
 Ï
 Þ
8»
 Ø
7î
, î
8÷

ý
¬ˆ D•  ž  É  ¤  ³ , ¥  ¦  ± , § 8÷ & ¬ 8÷$­ 
² *µ  ¸  Ç ,   à  À + Ñ  Ò  è 8âÓ  Ö  ç 8»<×  ß 7 + ö  ÷  ¤ 8ä   £ 8áå4 $ 8Ó  Œ  ¢ 8â   ¡ 8»<  74› , ² 8÷ 
Á  œx$‡K£†J¤µ>¥½TL—:<+-ô Synchronization primitivesÁ$ÉîýkLa»
¡ldw¿
ÉŒ…HØl̘Å
ˆñoô·ê
èq¼þ ätä—´ ŒšwlÐÙ ÇåxTßï Èá!l™Øí¿$ŒÑü«´ ”$
ê
´ É
í
Œ ¸ KÚ
†J>¹,lð
ð?FutureÁ4
‚Ø@ˆ‚¨
„¾Ak<¾
ÌC·
œØDýkLÚ
»
E¡ldô
¿
F pin_projectÁ\˜
G¤ƒ
,
»
ÉŒHô¦Õü™,üåJG Returns stored cancellation token and removes this drop guard instanceÁü´FC (i.e. it will no longer cancel token). Other guards for this tokenÁ¬ÿ are not affected.Á4 ¦ÕÙÖ
¼¸¦Õ"”Öè è¦Õ Þ
Ä™

¿
ÉŒHôÌÀÞåÕÅü”0üàJÀýü¯F”þ¬úãþ4›åÕ ÞÙÖ
Þô·8ééŸÖ"”Üê êŸÖ ä
8

%+123489:;=K£†J "¤µ> #¥½T $ŒCE13!Ô»%%&¨ '´ N‡4BïiN‡4Bïi&'œÜ %%µ>µ>¤·>¨£>¸>poisonÁ£>¹>Ò²£>Ë»™z™g—++Ú,æ -ó . / 0¦ 3|íáßSç1Ôõ %%š]š]NotifyÁ]ºâRœ]waitersÁâRx‹óÖ
l“Ø„)*ܧµØ„((
)üòCD€ë ëØ„Æ]Æ]NotifiedÁÈ]notifyÁâRÉ]ºâRÊ]notify_waiters_callsÁâRË]waiterÁâRqhY4Üë( (
* „†3|íáßSç1,-./0ìõ ++Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdèØ„çEçEèEGlobalÁ ¿±‡§í#Œ˜ ++ä¯ ++ªBªBö­BÍj÷<®B÷<9)
-ÜnLÙŠ©‹”Ñ ++”é ++ü±8d¿ì ìÙŠ Ò
1nodeÁ$Ìü´Aí íيي Õ
2æüÕ"(œØ" î  ò"
3ºŒ$ì"üÑ+žÜÔ+ ñ ñÙŠÜ5656 þ+ÍìÜ ð+Íìœó+ïð"ܽT½T¥ÀTlockÁ£>ÁTÖ„£>0ªk¥aۼݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ½T½T¥ÀT£>ÁTÖ„£>0ªk¥að„†ü«,Cïðܘ"œë,
4ÜœºŒ$ø+funcÁ$Ž,MPKN¼ú,d…-ü¡=@¼¤= òó ò„† ó„† Â=
8ºŒ$¼=æ4Î=ü BDd£B ôõ ô„†½T½T¥ÀT£>ÁTÖ„£>0ªk¥aõ„† ¸B
9æ4°BºŒ$ÈBüÕJ<ÄãJö öÙŠ ‚K
:ºŒ$üJü×N<ÄåN÷ ÷ÙŠ „O
;ºŒ$þN”úP;<closure_kind>Á<<closure_signature>Á<<upvars>Á<<;<½T½T¥ÀT£>ÁTÖ„£>0ªk¥a„†Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ½T½T¥ÀT£>ÁTÖ„£>0ªk¥a„†üY*4žYø øÙŠ «Y
=ºŒ$¥Y´Ç
rÔã
c¤ƒ
Mt
?
36%(„Ó
¼é
ì†
ø
äá
ü¦M
J A token which can be used to signal a cancellation request to one or moreÁ
 tasks.Áÿ
úüƒA
> Tasks can call [`CancellationToken::cancelled()`] in order to矁J
G obtain a Future which will be resolved when cancellation is requested.Á
úü”S
P Cancellation can be requested through the [`CancellationToken::cancel`] method.Áè
ú
# ExamplesÁû
úlÿ
```no_runÁ´
 use tokio::select;Áü¤,
) use tokio_util::sync::CancellationToken;ÁÑ
ú”Õ
 #[tokio::main]Á¬è
 async fn main() {Áüþ-
* let token = CancellationToken::new();Áü¬)
& let cloned_token = token.clone();ÁÖ
úüÚ3
0 let join_handle = tokio::spawn(async move {ÁüŽ?
< // Wait for either cancellation or a very long timeÁ¬Î
 select! {Áüä1
. _ = cloned_token.cancelled() => {Áü– .
+ // The token was cancelledÁ¬Å
ŒÛ
üí Q
N _ = tokio::time::sleep(std::time::Duration::from_secs(9999)) => {Á´¿
 99ÁŒÖ
õ 

 });Á
úü† !
 tokio::spawn(async move {矬 K
H tokio::time::sleep(std::time::Duration::from_millis(10)).await;ÁÜô
 token.cancel();Á\
¬¢œ
úü  2
/ assert_eq!(5, join_handle.await.unwrap());Á

 ```ÁŒì
ÙÖbO³r<IQü„

,„
HHÙŠü¨
1
ÙÖüÝ
4
ÙÖüÊ+
ÙÖMÀcMüüD
ÿ
ùúû ùÙÖ ú c cˆ¢cµ
 `£cÍj `àB¤GS
ûÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ È¥  éBLL ƒ
L
M$„
± Š
üÇ
ÙÖOÙO¼ÿ
üîI
F Creates a clone of the [`CancellationToken`] which will get cancelledÁü¼ >
; whenever the current token gets cancelled, and vice versa.Á,!
ü üÙÖÙÖN ˆ!
N
O$‰!
ü©"
ÙÖQ"Q”Ï"
$Ò"
ý ýÙÖP ×"
P
Q$Ü"
ü§#"
ÙÖS´SüÐ#!
<Ó#
ÙÖRR
S´ž$
ÙÖUVWXYZ[\]aüƒ%!
ü»$C
@ Creates a new [`CancellationToken`] in the non-cancelled state.ÁŠ%
ÙÖTT
Uüé0.
ü‘&I
F Creates a [`CancellationToken`] which will get cancelled whenever theÁüß&H
E current token gets cancelled. Unlike a cloned [`CancellationToken`],Áü¬'>
; cancelling a child token does not cancel the parent token.Áï'
úü÷'G
D If the current token is already cancelled, the child token will getÁüÃ(
 returned in cancelled state.Áè(
útð(
÷›ƒ)
úl)
šœ´)
°œü¸),
Мé)
ú”ñ)
¬ˆ*
¬ü¢*-
ËüÔ*.
+ let child_token = token.child_token();Á‡+
úü+3
ÁžüÇ+?
þž¬‹,
ÆŸü¥,0
- _ = child_token.cancelled() => {ÁüÚ,.
  ¬-
× Œ§-
õ ü½-Q
¡´“.
ꡌ®.
õ lÄ.
–¢\Ö.
¬¢æ.
úüî.!
Í¢ü”/K
ø¢Üä/
Ì£\„0
¬¢”0
úüœ02
Ф,Ó0
Ť<Ý0
Ó¤\ð0
þ þÙÖÙÖT ü0
T
V$ý0
¤Ç6
ü‚2H
E Cancel the [`CancellationToken`] and all child tokens which had beenÁ¤Ï2
 derived from it.Áè2
úüð2C
@ This will wake up all tasks which are waiting for cancellation.Á¸3
úüÀ3I
F Be aware that cancellation is not an atomic operation. It is possibleÁüŽ4K
H for another thread running in parallel with a call to `cancel` to firstÁüÞ4J
G receive `true` from `is_cancelled` on one child node, and then receiveÁü­5H
E `false` from `is_cancelled` on another child node. However, once theÁüú5H
E call to `cancel` returns, all child nodes have been fully cancelled.Á4Î6
ÿ ÿÙÖT Õ6
T
W$Ö6
üÑ7"
ü‘7;
8 Returns `true` if the `CancellationToken` is cancelled.ÁdØ7
 ÙÖT å7
Tí$æ7
ü´;8
ü®8L
I Returns a [`Future`] that gets fulfilled when cancellation is requested.Áÿ8
ú”‡9
 Equivalent to:Áž9
úl¦9
```ignoreÁô¸9
 async fn cancelled(&self);Á<Û9
Ó¤ç9
úüï9J
G The future will complete immediately if the token is already cancelledÁü¾:
 when this method is called.Áâ:
úÌê:
 # Cancellation safetyÁˆ;
úü;
 This method is cancel safe.ÁL»;
 ÙÖÅ
Å
ØlÇ
È
ý.%‹™ßK¤ÃKT Å;
TËŽ$Æ;
üç@>
üù<L
§»Ê=
ú”Ò=
ˆ¼é=
úlñ=
¯¼üƒ>#
async fn cancelled_owned(self);Á<«>
Ó¤·>
úü¿>J
†½üŽ?
Ú½²?
úüº?G
D The function takes self by value and returns a future that owns theÁT†@
 token.Á•@
úÌ@
޾»@
úüÃ@
½¾|î@
ÙÖ­ØTT
Z$þ@
üƒC$
üåA+
( Creates a [`DropGuard`] for this token.Á•B
úüBH
E Returned guard will cancel this token (and all its children) on dropÁ¤êB
 unless disarmed.ÁTŠC
ÙÖ¦ÕTT
[$•C
üþD0
üÝC.
+ Creates a [`DropGuardRef`] for this token.ÁD
úü˜DH
¹Ã¤åD
ŠÄt…E
 ÙÖ¿
¿
¡lÁ
¨Ó0Xj˜]RT ”E
T
\$•E
ü®Jd
üçET
Q Runs a future to completion and returns its result wrapped inside of an `Option`ÁüÀFT
Q unless the [`CancellationToken`] is cancelled. In that case the function returns矪G'
$ `None` and the future gets dropped.ÁÅG
útÍG
# FairnessÁàG
úüèGG
D Calling this on an already-cancelled token directly returns `None`.Áü´HB
? For all subsequent polls, in case of concurrent completion andÁüûH?
< cancellation, this is biased towards the future completion.Á¿I
úÌÇI
޾åI
úüíI<
9 This method is only cancel safe if `fut` is cancel safe.Áœ»J
ƒ ƒÙÖÜ܃_T^^ ÒJ
TË ÏJ
‚ØÜ4K
º¤HXö›Z&(ˆ®äJ
]8ÈÈ]`Üì÷€Œ 8ÙÖÜÍìÜ8_]‚Ø“Îl“΃؀Œ~‹Î¥ÎŠ´Î]€a]<coroutine_kind>Á` <resume_ty>Á`
<yield_ty>Á` <return_ty>Á`Ë•``]í‹ü§Ri
ü…MT
ÊÆüÞMT
¨Çü·N'
†ÈãN
úüëNN
K The function takes self by value and returns a future that owns the token.Á¾O
útÆO
ÂÈÙO
úüáOG
æÈü­PB
·ÉüôP?
ƒÊ¸Q
úÌÀQ
޾ÞQ
úüæQ<
ñÊÌ´R
ÙÖÜÜcTbbTË ÎR
—Í4‰S
aÜRö›R"$ˆµâR
aaž£ÍìœÒ#‚ØœÒ2œÒƒØ€ŒD‹ÓJšÓP©ÓVaCXa÷Íd‘Îd¦ÎdºÎdË•ddaž£üûS;
Þffç×gÀcg€T
ü½TD
ÀT
 ç×  c cˆ¢cµ
 `£cÍj `àB¤GS
å§e ÄT
e
gÞ$ÅT
± ËT
üÊU1
Þiiç×jkƒØ„ØkÏU
\V
4‡V
hhü™V?
$œV
ˆ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ç× ˆÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å°†h «V
h
kÞ$¡V
cxÁ·V
ü“\8
­ØmÀcmüÒ\D
Õ\
ŠŒ Š­Ø  c cˆ¢cµ
 `£cÍj `àB¤GS
Œå§l Ù\
l
m$Ú\
± à\
üä]#
­ØopüŽ^5
^
ÙÖ­Ønn
o”•^
üÛcv
Tåc
 ÙÖÆ]Æ]¸‡È]ɇâRÉ]ºâRÊ]ç‡âRË]‡ˆâRqhY4Ün d
n
p”ùc
ü¨g.
­ØrsƒØ„Øs\Ýg
4âg
qqüôg?
$÷g
Ž„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ž­Ø ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å°†q †h
q
s$üg
õ×h
üžr2
ÞuvuvÍì†Í §r
‚؆Í4ªr
±Úw£r
!#ü×rO
år
µ‚†Í±Útt
wކ͔ér
ý.4”s
ü™t=
ÞyzyzÂß ¢t
Óß4¥t
±Ú{|ƒØ„Ø|žt
')\Ýt
4ât
xxÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zن̓ØüƒuI
$†u
„¾„¾ˆ‚†¾ ˜X$]È=„kt• ±Ú ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã±ÚƒØx •u
x
|Þ†Í$‹u
õסu
ü‘{:
~~Ë {
—Í4™{
Õۃ؄Ø#%\Ò{
4×{
}}€Œüø{I
$û{
„¾„¾ˆ‚†¾ ˜X$]È=„kt• ÕÛ ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÕÛƒØ} Š|
}
Ü$€|
õ×|
üÙ~/
Ë Þ~
—Í4á~
ÕÛƒüK

ÙÖÜÕÛ
ƒÜ”¡
ý.4È
”@„Z¨7¼l777„7‡7x7{7”ép7s7b7e7D·¡¦Ù Ú ï à ÷ ø SinkÁ$ 
Žˆ‚& „¾k<; Ì·$D œØ×U ¤,íZ ëš¶\w ‰MŠk4› úL¿$Œ¯ ü˜« ½l ®L/ Ÿ¡ŽO prôd b̈ TĨ EÄÀ ¥ššÍì·µ Å ¦Ü 
ü¿$ üß& # Consumes the stored value, if any.ÁŠ úü’^ [ If this error was encountered when calling `start_send`/`send_item`, this will be the itemÁüõE B that the caller attempted to send. Otherwise, it will be `None`.ÁTÆ ¦ÜíÛ
·µ üþ) ¥Ëì ƒ ¦ÜžÅcžü®: ± ˜ ¦Ü ˜ c cˆ¢cµ
 `£cÍj `àB¤GS
å§œ µ œ
ž·µ ×¼ üš: ¥  Ëì Ÿ ¿c·µ ¦ÜüŠ k œ“ ×··µ£¥¢¢Ëì §
¡·µÒ²$Vø¿Í ( ¡¡®¶Íìò&‚Øò5òƒØ¶GóòM‚óS‘óY¡^¡÷ͤ‘Τ¦Î¤ºÎ¤Ë•¤¤¡®¶í
¡–•¥®•¥Ë•¥¥¡ˆ¿¼â  Þ§¥¨¨§Íì•¶ ÷ üü¿$ÿè$îÊðß”TiÞÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
‰M‰Mš¶‹M®¶ìLyòÚ'ØyJc•¶Ù Ù Ú šwÜ ˆ C]˜è÷ZÆ•¶ó õ÷Ü𠥪ªËì õ ÃÞ« 
”Ò  ÃÞ©©
«·µ «÷ͬ‘ά¦Î¬ºÎ¬Ë•¬¬«òÑüÖ! ¥®®Ëì Û Ìì·µ ÃÞ¯°±"$„© ¬ ÃÞ­­
¯·µüÏZ  šœ šÃÞ ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœÍ­ × ­
°·µ õ×â üñ, ô  ÃÞ×·­ ø ­
±·µ ÿx4ƒ Ü€ ¥³³Ëì  ´ù òÝ´µ·¸¹º»(*üÆ% ü¢  Creates a new `PollSender`.ÁÍ œ¸òݲ²
´·µÿx4Ñ ü’ $ T• ž žòÝùܲ   ²
µ·µ ü‡&Z üù 6 3 Attempts to prepare the sender to receive a value.Á´! úü¼!U R This method must be called and return `Poll::Ready(Ok(()))` prior to each call toÁ„–"
`send_item`.Á«" úü³"^ [ This method returns `Poll::Ready` once the underlying channel is ready to receive a value,Áü–#V S by reserving a slot in the channel for the item to be sent. If this method returnsÁüñ#G D `Poll::Pending`, the current task is registered to be notified (viaÁü½$K H `cx.waker().wake_by_ref()`) when `poll_reserve` should be called again.Á% úd•% # ErrorsÁ¦% úü®%T Q If the channel is closed, an error will be returned. This is a permanent state.ÁdŽ& Ÿ ¡ ŸòÝ  ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å¡œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¦Ü² & ²
·µ$ & õצ& üç5E üŽ2!  Sends an item to the channel.Á´2 úü¼2V S Before calling `send_item`, `poll_reserve` must be called with a successful returnÁü—3# value of `Poll::Ready(Ok(()))`.Á¿3 údÇ3 ì‚Ø3 úüà3T Žƒ¹4 údÁ4 # PanicsÁÒ4 úüÚ4` ] If `poll_reserve` was not successfully called prior to calling `send_item`, then this methodÁ|¿5 will panic.Á²|Ó5 Lî5 ¢ ¢òÝ·µ܆² ø5 ²
··µ$ý5 »,ƒ6 üæ= üà<) & Checks whether this sender is closed.ÁŽ= úü–=K H The underlying channel that this sender was wrapping may still be open.ÁLí= £ £òݲ ÷= ²
¸·µ$ø= ü±@+ üØ>? < Gets a reference to the `Sender` of the underlying channel.Áœ? úü¤?` ] If `PollSender` has been closed, `None` is returned. The underlying channel that this senderÁü‰@# was wrapping may still be open.Á<¸@ ¤ ¤òÝÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ 
<9 - `Poll::Ready(Some(permit))` if a permit was acquired.ÁüÙ
<9 - `Poll::Ready(None)` if the semaphore has been closed.Áš úü¢ KH When this method returns `Poll::Pending`, the current task is scheduledÁüò DA to receive a wakeup when a permit becomes available, or when theÁü» LI semaphore is closed. Note that on multiple calls to `poll_acquire`, onlyÁüŒ
DA the `Waker` from the `Context` passed to the most recent call isÁüÕ
" scheduled to receive a wakeup.Ádƒ´µ ´˜ß µÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÑ®Û Û
à$•õ×üªŒüŠ41 Poll to acquire many permits from the semaphore.ÁÃúüË)¡³ùúü>à³üÄ<¨´ü…<î´ÆúüÎKÀµüžFC to receive a wakeup when the permits become available, or when theÁüéLã¶üºD¹·üƒ"‡¸Œ±·¸¹ ·˜ß ¸ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å¹ݺÛ ÌÛ
áõ×ßô­üÑ$(ü¼"41 Returns the current number of available permits.Áõ"úüý"LI This is equivalent to the [`Semaphore::available_permits`] method on theÁüÎ#" `tokio::sync::Semaphore` type.Áõ#úüý#OL [`Semaphore::available_permits`]: tokio::sync::Semaphore::available_permitsÁŒØ$º º˜ßÛ ê$Û
â$ë$ü·(#ü²%*' Adds `n` new permits to the semaphore.Áá%úüé%RO The maximum number of permits is [`Semaphore::MAX_PERMITS`], and this functionÁüÀ&(% will panic if the limit is exceeded.Áí&úüõ&FC This is equivalent to the [`Semaphore::add_permits`] method on theÁüÀ'"ÙÀç'úüï'C@ [`Semaphore::add_permits`]: tokio::sync::Semaphore::add_permitsÁ\¾(» »˜ßÛ Ê(Û
ã$Ë(¹ Ñ(ì)˜ßåæ'F'GæL±)$¶)ääÑ®üØ)^LÛ)¼½¾„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¼˜ß ½ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å¾ݺä ï)ä
æ$å)õ×û)äñ*˜ßèÙèü”+ ,—+¿ ¿˜ß˜ßç +ç
è$ž+üï+!˜ßêÀcêü—,8š,ÀÁ À˜ß Á c cˆ¢cµ
 `£cÍj `àB¤GS
Âå§é ž,é
ê$Ÿ,± ¥,üÊ-'˜ßìâìôø-4û-Ã Ã˜ß Ãóßë ‚.ë
ì$ƒ.ì‰Æh„©ü˜ž 4èØîï×!¤,îðý.$8äîòÛû4>‚Øîóí$Vëîõ ManuallyDropÁd\ÃÛîöˆ‚y„¾î÷µ îøk<œÌîú·œØîûÞDÎ\*¿4/¯±DK¡PˆlowDhLZ\HJüï#ü­>; A reusable `Pin<Box<dyn Future<Output = T> + Send + 'a>>`.ÁìúüðC@ This type lets you replace the future stored in the box withoutÁü´:7 reallocating when the size and alignment permits this.ÁŒúÞý¥þýþ õ üü¿$ÿè$îÊðß”TiÞ•¶Êðß”TiÿŒXZü™3,™îüü„¾„¾ˆ‚†¾ ˜X$]È=„kt•žBoxÁ¡ˆˆ¢ˆl }.xς؃ؕ¶ÌìÞ©‹üÑ$Þ¥ õ Ú€ÒƒŽÖüÈUüüGD Create a new `ReusableBoxFuture<T>` containing the provided future.ÁϬ̀ÒÍì¬Ì ӂج̔þ¬ÌƒØ•¶T…Ìì¬Ì$“¬ÌÞš
ƒÞ•¶¬Ìý.4Ödfü½Xüí41 Replace the future currently stored in this box.Á¦úü®HE This reallocates if and only if the layout of the provided future isÁüû=: different from the layout of the currently stored future.ÁÄÄ Ä€Ò¬Ì Ë„Ö È•Ö”ö¦ÖºÖ$‹ËÖ
Þ•¶¬Ìý.4ÖFHüö
müŒ 4”ÖÅ úüÍ IF This function never reallocates, but returns an error if the providedÁü›
FC future has a different size or alignment from the currently storedÁ
 future.Á<ý
ŠŀҬÌÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¬Ìˆˆ ˆ „Ö •Ö”Ä ¦Ö ºÖ ËÖà 
Þ•¶¬Ì$ ý.4“ FHü³dîÆ Æüü¿$ÿè$îÊðß”TiÞâ†ÍÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
†ÍÞŠŠ ·Âß ¡ÓßÌì†Í†ÍÞ½
Þ†ÍthisÁ$±ý.4êUWŠ–•Œ®•ŒË•ŒŒŒ†Íž»Ò¡ˆˆ¢ˆl }.xφͩ‹ „¾„¾ˆ‚†¾ ˜X$]È=„kt•ž»Ò¡ˆˆ¢ˆl }.xς؃ØâÌì©‹ü¥Füì41 Get a pinned reference to the underlying future.Á<¬Ç Ç€Ò„¾„¾ˆ‚†¾ ˜X$]È=„kt• ǂ؃ؕ¶ÌìÇ ´
Þ•¶üÅ7ü•+( Poll the future stored inside this box.Á$ÌÈÉÊ È€Ò ÉÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åʜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã•¶ Ñ
ŽÞ•¶õ×Üü¨+8˥ˠõ ­¸àƒØ„Ø•¶ü >üð+™äÌÍ΄¾„¾ˆ‚†¾ ˜X$]È=„kt• ̸à ÍÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åÎúæ ²
8•¶õ×¾üÕ08ϥϠõ á¸à
üŠ/8ХРõ ¸àÀcüÀ8ÃÑÒÓ Ñ¸à Ò c cˆ¢cµ
 `£cÍj `àB¤GS
Óå§ Ç
8•¶± Îü¹î„¾„¾ˆ‚†¾ ˜X$]È=„kt•ž»Ò¡ˆˆ¢ˆl }.xÏ·µ©‹½µÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ½µ¥¦š œœšÎì·µ ÊÍì½µ ÕÍìÜï ØÍì‰ï Û–"‰ïž»Ò¡ˆˆ¢ˆl }.xϽµ©‹œª‰ïüð˜"Üï ¼
˜·µ½µÜï‰ïè$,Þ new_valueÁLòcallbackÁD€åçáãÝßÙÛ˜–•®•Ë•˜·µ½µÜï‰ïÜï  ·µ½µ‰ïüÀ#&TÇ#î Ÿ  ŸÍìºá Ò#Âß Õ#–"†ÍlØ#†Í˜"ºá ä#ŒáÁB9#¡ªRTWY”í# í#îžžÃÛÃÛ²ÍÅÛ»¬µÜÀ,%*†Íü„$* £¤£¤·ô ›$Âß Œ$¤ôl$‹ô ‰$Œá¥¦+-¤µ$¸$î†ÍŒá¢¢
¥ºá†Í± ¼$%$’%îŒáºá¢¢
¦ºá†Í$—%ü¥&3 ¨©©¨·ô ¼&Âß ­&¤ôl°&‹ô ª&Œáª"ª02”ß&$â&Ô ÔŒá§ ç&§
ªºá†Í$ì&üô~tü# Module defining an Either type.Áþ Ûû4;‚ج®SeekFromÁDKñL¬¯ˆ‚^„¾¬°k<n̬²·$wœØ¬³ AsyncBufReadÁdt¬µ AsyncReadÁLŸ¬ AsyncSeekÁLª©¬·
AsyncWriteÁTµÃ¬¸ReadBufÁ<Áù¬¹Íݬº(t3dGDYùü(CëíÚÜL…Á誎su[]JLÔÉ ä  ê 
, ë8& ð8¼ ö, ÷8methodÁ& þ8¼,ÿ  ,   , 8À$ˆ& Œ8¼,$  *˜  8" ¬ 8, À8 Å8get_unchecked_mutÁŒÆ × Ø Ú 8'ð8™z ö ø8· ÷*ú8ˆ‚ý'8ð l  8·  , 8Ÿü4” š ¥,  œ ¢, 8À$ £ ¤$ ¦8$¸'¼8²z à Å8½ Ä*Ç8ˆ‚Ê'Í8ð  Ü Þ8½ Ý ß, à8Ÿü ç ò, è é ï, ê8À$ ð ñ$ óü–a½£¾ ¿¾¿½“âƒØÜï¦ÌƒØÜïÏð ¡‚Ø“â”ÉÍì“⠂ئ̔äÍì¦Ì žËáÀÁƒØ„ØÁ>@)+z|¼¼Üïü”I$—ÕÖׄ¾„¾ˆ‚†¾ ˜X$]È=„kt• ÕËá ÖÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åל؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃËáƒØ¼ ¦¼
Á“â¦ÌÜïõײüOãÄÃĹƒ Ûƒ “â¦ÌËáÅÅ;=@BüåØÙÚÛÜ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ØËá ÙÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åÚ ÛùùÞúûÍjöüfilledÁöý initializedÁö| 8WSm³úܜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®Ç Â
Å“â¦Ìõ×Íj·ü£XÇ£ÈÇȹƒ ¨Ûƒ «t“ât¦ÌËáÉÊuvÊÉBDGIü‚Sl…ÝÞß„¾„¾ˆ‚†¾ ˜X$]È=„kt• ÝËá ÞÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åߜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ÝÓË®ÇÆ Æ
É“â¦Ì$“õשü’,<•à„¾„¾ˆ‚†¾ ˜X$]È=„kt• àËáÆ §Æ
Ê“â¦Ì$amtÁ³üõOÌ£ÍÌ͹ƒ úÛƒ ý©“⩦ÌËáÎϪ«ÏÎFHKMüËEᄾ„¾ˆ‚†¾ ˜X$]È=„kt• áËáñLòLóLStartÁôLˆõLöLEndÁ÷LˆøLùLCurrentÁúLˆaÍ>4¡9cÅç‹Ë ãË
Γâ¦ÌpositionÁDïüÐQâã䄾„¾ˆ‚†¾ ˜X$]È=„kt• âËá ãÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åäœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®ÇË ëË
Ï“â¦Ìõ×÷üÜRÑ£ÒÒѹƒ áÛƒ äÓâTæÌËáÓÔÕÖ×ÄÅÆÇÊÓ×ÖÔÕgilnüµ\T¸åæç脾„¾ˆ‚†¾ ˜X$]È=„kt• åËá æÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åç è
æLæLçLIoSliceÁéLˆ¦ —óë@M$Tó®‚Ð ¤"Ð
Ö“â¦Ì$š"õ׸"bufsÁ$Ö"ü÷##Œú#ô ôËáÐ Œ$Ð
דâ¦Ì$$ü®%˜Ù£ÚÙÚ¦Ì'F“â'Ft¶&Ûƒ ¶%'E“âäô%'E¦Ìü™&,¹ƒ ³%ËáÛÜ'F'GÜLNLÍ&$Ò&ØØަüç&TLê&õö÷„¾„¾ˆ‚†¾ ˜X$]È=„kt• õËá öÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å÷œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙËá'FØ þ&Ø
Ü“â¦Ì$ô&õ׊'üò'§Þ£ßॠáÞáßà“âóâ ¥ lÚ(¦Ìóâ  «lŠ)Íìóâ$ý'Íì «,ƒ(
“âóâüÁ('¹ƒ ÷'
¦Ìóâüñ('Ûƒ ú'Ëáâãäåæ 
åãæäRTCET ),¥)ÝÝ «ü¹)~T¼)øùú„¾„¾ˆ‚†¾ ˜X$]È=„kt• øËá ùÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åúœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ëáóâ Ý Ú)Ý
ã“â¦Ìóâ «$Ð)õ×î)üñ*WTô*û„¾„¾ˆ‚†¾ ˜X$]È=„kt• ûËáóâίÝ ‰+Ý
ä“â¦Ìóâ «$ÿ*÷$•+ü„,~T‡,üýþ„¾„¾ˆ‚†¾ ˜X$]È=„kt• üËá ýÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åþ‰¯Ý ¥,Ý
å“â¦Ìóâ «$›,õ×¹,ü¼-~T¿-ÿ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ÿËá ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å‰¯Ý Ý-Ý
æ“â¦Ìóâ «$Ó-õ×ñ-‡ªŠªD¾éÿ ¹,lqðŠ.lû ¯.tŠ šk<çÌè ·œØè tèðñÛû4‚Øéêãß\)ÑÛé눂E„¾éìk<[Ìéî·$dœØéï¤j´Yt:HTN9;(*¥òòËì Ú €ãÇñËÙzWŒJñó×à€ãö±¬Té×à€ãðð
ñ·µoqéðð×àüï !¥õõËì ô €ãö"ö”—

 €ãô Ÿ
ô
ö·µ
Ä¥ ¥øøËì ª €ãù 
üÄ #Ò ·µ€ã÷÷
ù·µ¨ ü™ +ûûË ž —Í ¾ãüýƒØ„Øý$&  úúÅŒüé I ƒ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ƒ¾ã ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¾ãƒØú û ú
ýÜ õ×
4•ý–•þ®•þË•þþýþÜ ¾ã ÜdC»Rt»ï1Œ.ü#ü.DGèƒúLÿ¿úTÃÿÞú<'ùÿƒBufÁ>"ÿBufMutÁ4C"™ÿR$Z¦ÿˆƒ£<`æLÿˆ‚x„¾ÿŠ©§,¥‚ÿŒk<”Ìÿ·$œØÿŽLðòßáÎÐ,6¾À©«<PœUŒŽln~Lnp\^JLüæ ”ü¥UR Try to read data from an `AsyncRead` into an implementer of the [`BufMut`] trait.ÁûúÔÿ [`BufMut`]: bytes::BufÁšú
# ExampleÁ¬úÓ¤ü¸! use bytes::{Bytes, BytesMut};ÁüÚ use tokio_stream as stream;ÁÔú use tokio::io::Result;Áü•63 use tokio_util::io::{StreamReader, poll_read_buf};ÁìÌ use std::future::poll_fn;Á´ê use std::pin::Pin;Áü/, # #[tokio::main(flavor = "current_thread")]Áü±.+ # async fn main() -> std::io::Result<()> {ÁàúüäNK // Create a reader from an iterator. This particular reader will always beÁ
// ready.ÁüÁhe let mut read = StreamReader::new(stream::iter(vec![Result::Ok(Bytes::from_static(&[0, 1, 2, 3]))]));Áªúü®" let mut buf = BytesMut::new();Á´Ñ let mut reads = 0;Áèú loop {Áœ÷ reads += 1;Áü‹VS let n = poll_fn(|cx| poll_read_buf(Pin::new(&mut read), cx, &mut buf)).await?;Áâúœæ if n == 0 {Á”ú break;ÁL,—Ťúü¡,) // one or more reads might be necessary.ÁÄÎ assert!(reads >= 1);Áüç(% assert_eq!(&buf[..], &[0, 1, 2, 3]);Ád  # Ok(())Á<  # }ÁÓ¤ˆ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ·µ ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åˆ èÔ®‚¥ ª
­ð û ÍìèÔ
·µ"™èÔ4•

·µèÔR¢
õ×·
ÍjÑ
[]WYüÜü¯DA Try to write data from an implementer of the [`Buf`] trait to anÁüô;8 [`AsyncWrite`], advancing the buffer's internal cursor.Á°úü´MJ This function will use [vectored writes] when the [`AsyncWrite`] supportsÁ¤‚ vectored writes.Áút›÷›ªúü®GD [`File`] implements [`AsyncWrite`] and [`Cursor<&[u8]>`] implementsÁ [`Buf`]:Áƒúl‡šœü•'$ use tokio_util::io::poll_write_buf;Á”½ use tokio::io;ÁÄÐ use tokio::fs::File;Áéúœí use bytes::Buf;Áì’ÆÄŸ use std::io::Cursor;Á´¸¸ÆÏú”Óüæ'$ async fn main() -> io::Result<()> {ÁüŽ63 let mut file = File::create("foo.txt").await?;ÁüÅ41 let mut buf = Cursor::new(b"data to write");ÁúúüþFC // Loop until the entire contents of the buffer are written toÁ¤Å // the file.ÁüÚ# while buf.has_remaining() {ÁüþSP poll_fn(|cx| poll_write_buf(Pin::new(&mut file), cx, &mut buf)).await?;ÁéËÜú Ok(())ÁŤÓ¤ýú¼ [`Buf`]: bytes::BufÁü™)& [`AsyncWrite`]: tokio::io::AsyncWriteÁìà [`File`]: tokio::fs::FileÁüáA> [vectored writes]: tokio::io::AsyncWrite::poll_write_vectoredÁŠŒ„¾„¾ˆ‚†¾ ˜X$]È=„kt• Š·µ ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åŒ èÔ®‚¥ Ÿ­ð òûÐ ŠÃ·µ"èÔ
·µèÔ’Rõ׬ÍjÆQSVX¬öÿìa¡˜ŒüRO An extension trait for Futures that provides a variety of convenient adapters.Áœ¿Ô{Ü »ª~ü¬ À ¼Ûû‚ؽɌûH¾ÜT¼X À à Ûû4‚Øœžˆ‚(„¾œŸk<8Ìœ¡·$AœØœ¢×ü\bœ£ÉŒ‚Hœ¥èq¼• œ¦ätä®´ œ§Œt¶D#¥ü1ˆìPw\thjTV?Aü¨6Þ©ªª©Âß ±Ó߯䫭üåOóµ‚†ÍÆä¨¨
«Þ†Í”÷ý.4¢¢«–•¬®•¬Ë•¬¬«¬†Í  èqŠ —r ý.L‚@Ó°ÍÜë†ÍÓŒ†ÍüóAÞ®¯®¯Âß üÓß4ÿÆä°±ƒØ„رø*,­­Èáüá IŽ„¾„¾ˆ‚†¾ ˜X$]È=„kt• ŽÆä ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÆäƒØ­ ó ­
±Þ†Íõ×ÿ üÃ3³³Ë È—ÍÖå´üýKÙÖÜÖå²²
´Üý.4¶´–•µ®•µË•µµ´µÜÕÛµ£üŒ>··Ë —Í4”Ö帹ƒØ„ع$&€Œü÷I„¾„¾ˆ‚†¾ ˜X$]È=„kt• Öå ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖåƒØ 
¹Ü$ÿõ×¼uqtbeœÔUôîFÜèüXU A trait which contains a variety of convenient adapters and utilities for `Future`s.Á¿¿Îìüè‚Ø
ϰ
É ç ¸ ñ , ò ó þ, ô8÷& ù8÷
ÿ*  ²,   §+ ¦ § À8⨠« ¿8» ´7+ Ò Ó ƒ8ä Ü 8áå$ ã8Óå è 8âé ì 8» õ7, 8÷$
¨»ï1ˆ PÈ J,
  z  %,   #, 8argÁ& 8¯!
$*' * w+ 4 5 N8â6 9 M8»<: B7Ô1LD8Ô1<X'_8ã1,a f g p, h i n, j8ø‚k
o% q% xü96 Adaptors from `AsyncRead`/`AsyncWrite` to Stream/SinkÁ:úü>KH Raw I/O objects work with byte sequences, but higher-level code usuallyÁüŠA> wants to batch these into meaningful chunks, called "frames".ÁÌúüÐPM This module contains adapters to go from streams of bytes, [`AsyncRead`] andÁü¡KH [`AsyncWrite`], to framed streams implementing [`Sink`] and [`Stream`].Áüí0- Framed streams are also known as transports.Ážúü¢)& # Example encoding using `LinesCodec`ÁÌúüÐSP The following example demonstrates how to use a codec such as [`LinesCodec`] toÁü¤PM write framed data. [`FramedWrite`] can be used to achieve this. Data sent toÁüõTQ [`FramedWrite`] are first framed according to a specific codec, and then sent toÁüÊ%" an implementor of [`AsyncWrite`].ÁðúÓ¤üü use futures::sink::SinkExt;Áüœ&# use tokio_util::codec::LinesCodec;ÁüÃ'$ use tokio_util::codec::FramedWrite;Áëúüï/ØÆ¼Ÿ # async fn main() {Áä· let buffer = Vec::new();ÁüÔ*' let messages = vec!["Hello", "World"];Áüÿ$! let encoder = LinesCodec::new();Á¤úü¨DA // FramedWrite is a sink which means you can send values into itÁ´í // asynchronously.Áü„ 74 let mut writer = FramedWrite::new(buffer, encoder);Á¼ úüÀ JG // To be able to send values into a FramedWrite, you need to bring theÁü‹
" // `SinkExt` trait into scope.Áü®
,) writer.send(messages[0]).await.unwrap();ÁüÛ
,) writer.send(messages[1]).await.unwrap();Áˆ úüŒ " let buffer = writer.get_ref();Á¯ úü³ ?< assert_eq!(buffer.as_slice(), "Hello\nWorld\n".as_bytes());Á ²Í ```Á úü† )& # Example decoding using `LinesCodec`Áü° S„‰ü„
\Y read a stream of framed data. [`FramedRead`] can be used to achieve this. [`FramedRead`]Áüá
b_ will keep reading from an [`AsyncRead`] implementor until a whole frame, according to a codec,Á”Ä can be parsed.Á×ú÷’üâ  use tokio_stream::StreamExt;Áüƒ&ŠŒüª&# use tokio_util::codec::FramedRead;ÁÑúüÕ/ØÆ¼…ü,) let message = "Hello\nWorld".as_bytes();ÁüÊ$! let decoder = LinesCodec::new();ÁïúüóUR // FramedRead can be used to read a stream of values that are framed according toÁüÉWT // a codec. FramedRead will read from its input (here `buffer`) until a whole frameÁ¬¡ // can be parsed.Áü·74 let mut reader = FramedRead::new(message, decoder);Áïúüó>; // To read values from a FramedRead, you need to bring theÁü²$! // `StreamExt` trait into scope.Áü×74 let frame1 = reader.next().await.unwrap().unwrap();Áü74 let frame2 = reader.next().await.unwrap().unwrap();ÁÇúüË+( assert!(reader.next().await.is_none());Áü÷  assert_eq!(frame1, "Hello");Áü˜  assert_eq!(frame2, "World");Á²ÍÓ¤Éú¼Í # The Decoder traitÁåúüéOL A [`Decoder`] is used together with [`FramedRead`] or [`Framed`] to turn anÁü¹OL [`AsyncRead`] into a [`Stream`]. The job of the decoder trait is to specifyÁü‰GD how sequences of bytes are turned into a sequence of frames, and toÁüÑFC determine where the boundaries between frames are. The job of theÁü˜NK `FramedRead` is to repeatedly switch between reading more data from the IOÁüçLI resource, and asking the decoder whether we have received enough data toÁü´! decode another frame of data.ÁÖúüÚPM The main method on the `Decoder` trait is the [`decode`] method. This methodÁü«PM takes as argument the data that has been read so far, and when it is called,Áüü2/ it will be in one of the following situations:Á¯úü³30 1. The buffer contains less than a full frame.Áüç1. 2. The buffer contains exactly a full frame.Áü™30 3. The buffer contains more than a full frame.ÁÍúüÑA> In the first situation, the decoder should return `Ok(None)`.Áúü—MJ In the second situation, the decoder should clear the provided buffer andÁüå)& return `Ok(Some(the_decoded_frame))`.Áúü“PM In the third situation, the decoder should use a method such as [`split_to`]ÁüäOL or [`advance`] to modify the buffer such that the frame is removed from theÁü´NK buffer, but any data in the buffer after that frame should still remain inÁüƒ OL the buffer. The decoder should also return `Ok(Some(the_decoded_frame))` inÁ this case.Áâ úüæ OL Finally the decoder may return an error if the data is invalid in some way.Áü¶!OL The decoder should _not_ return an error just because it has yet to receiveÁŒ†" a full frame.Á˜"úüœ"MJ It is guaranteed that, from one call to `decode` to another, the providedÁüê"OL buffer will contain the exact same data as before, except that if more dataÁüº#MJ has arrived through the IO resource, that data will have been appended toÁüˆ$FC the buffer. This means that reading frames from a `FramedRead` isÁüÏ$1. essentially equivalent to the following loop:Á%úl…%šœü“%  use tokio::io::AsyncReadExt;Áü´%C@ # // This uses async_stream to create an example that compiles.Áüø%ro # fn foo() -> impl futures_core::Stream<Item = std::io::Result<bytes::BytesMut>> { async_str
á±ÑÔë
ü©
= : Creates a new `BytesCodec` for shipping around raw bytes.Áò
á±ÐÐ
Ñܨ á±ÓÔÕåæçÕ ÒÒŽ´ ÒÒ®Çü O 4„  á± Ž´Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙŽ´®ÇÒ Ò
Õ$ Íj üò
" á±×ØñòØT›  ÖÖ®Çü¸N  ˜ á±¢³ ˜Ž´ç‹Ö  Ö
Ø Ò² ÍjÚ üÙ% á±ÚÛñòÛT…  ÙÙ®Çü¢Q  š ᱎ´ šŽ´ç‹Ù ¬ Ù
Û Ò² ÍjÇ ì‰cU\©c<­cÇäÒ’4ÝÞùƒúL+Ýà¿úT6ÃÝᘳDO"¿Ýâ’Rb¦Ýã¤kLWYFH|H8<])Œâ
üg# Decoding of frames via buffers.ÁúüEB This trait is used when constructing an instance of [`Framed`] orÁüÕOL [`FramedRead`]. An implementation of `Decoder` takes a byte stream that hasÁü¥HE already been buffered in `src` and decodes the data into a stream ofÁÄî `Self::Item` frames.Áúü‹DA Implementations are able to track state on `self`, which enablesÁüÐMJ implementing stateful streaming parsers. In many cases, though, this typeÁüž=: will simply be a unit struct (e.g. `struct HttpDecoder`).ÁÜúüà=: For some underlying data-sources, namely files and FIFOs,Áüž>; it's possible to temporarily read 0 bytes by reaching EOF.ÁÝúüá?< In these cases `decode_eof` will be called until it signalsÁü¡>; fulfillment of all closing frames by returning `Ok(None)`.ÁüàOL After that, repeated attempts to read from the [`Framed`] or [`FramedRead`]Áü°JG will not invoke `decode` or `decode_eof` again, until data can be readÁœû during a retry.Áúü“DA It is up to the Decoder to keep track of a restart after an EOF,ÁüØ>; and to decide how to handle such an event by, for example,Áü— KH allowing frames to cross EOF boundaries, re-emitting opening frames, orÁüã (% resetting the entire internal state.ÁŒ
úü
$! [`Framed`]: crate::codec::FramedÁüµ
,) [`FramedRead`]: crate::codec::FramedReadÁ
ääµñüâ
º4äµñµñ åæçèéåæçèéÍì½ñå ËÍì½ñæä éò®Çê‚‘çèé üú
 The type of decoded frames.Á$£ ääÜ ü® 41 The type of unrecoverable frame decoding errors.Áç úüï EB If an individual message is ill-formed but can be ignored withoutÁü¹ FC interfering with the processing of future messages, it may be moreÁü„
.+ useful to report the failure as an `Item`.Á·
úü¿
LI `From<io::Error>` is required in the interest of making `Error` suitableÁüKH for returning directly from a [`FramedRead`], and to enable the defaultÁüàKH implementation of `decode_eof` to yield an `io::Error` when the decoderÁü°(% fails to consume all available data.ÁÝúüåJG Note that implementors of this trait can simply indicate `type Error =Áü´.+ io::Error` to use I/O errors as this type.Áçúüï,ÇŽääüŸ(TüÂA> Attempts to decode a frame from the provided buffer of bytes.ÁˆúüJG This method is called by [`FramedRead`] whenever bytes are ready to beÁüßHE parsed. The provided buffer of bytes is what's been read so far, andÁü¬IF this instance of `Decode` can determine whether an entire frame is inÁüú+( the buffer and is ready to be returned.Áªúü²IF If an entire frame is available, then this instance will remove thoseÁü€?< bytes from the buffer provided and return them as a decodedÁüÄKH frame. Note that removing bytes from the provided buffer doesn't alwaysÁü”KH necessarily copy the bytes, so this should be an efficient operation inÁ¼ä most circumstances.ÁúüˆHE If the bytes look valid, but a frame isn't fully available yet, thenÁüÕJG `Ok(None)` is returned. This indicates to the [`Framed`] instance thatÁü¤FC it needs to read some more bytes before calling this method again.Áïúü÷DA Note that the bytes provided may be empty. If a previous call toÁüÀGD `decode` consumed all the bytes in the buffer then `decode` will beÁüŒPM called again until it returns `Ok(None)`, indicating that more bytes need toÁ be read.ÁòúüúFC Finally, if the bytes in the buffer are malformed then an error isÁüÅKH returned indicating why. This informs [`Framed`] that the stream is nowÁü•%" corrupt and should be terminated.Á¿úüÇ$™Žüð,ÇŽ¡ú¼© # Buffer managementÁÅúüÍJG Before returning from the function, implementations should ensure thatÁüœJG the buffer has appropriate capacity in anticipation of future calls toÁüë52 `decode`. Failing to do so leads to inefficiency.Á¥úü­GD For example, if frames have a fixed length, or if the length of theÁüùFC current frame is known from a header, a possible buffer managementÁ„Ä 
strategy is:ÁÙ úšœ”ó  # use std::io;Á,Š!Ô”! # use bytes::BytesMut;Áü³!%±,Ý!ܧ¬ç! # struct MyCodec;Á,"ܧô‹" impl Decoder for MyCodec {Át®" // ...ÁüÁ" # type Item = BytesMut;Áüå"! # type Error = io::Error;Á#úü“#]Z fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {Á”õ# // ...ÁŒ$úü”$HE // Reserve enough to complete decoding of the current frame.Áüá$<9 let current_frame_len: usize = 1000; // Example.Áü¢%41 // And to start decoding the next frame.ÁüÛ%>; let next_frame_header_len: usize = 10; // Example.Áüž&C@ src.reserve(current_frame_len + next_frame_header_len);Áæ&úäî& return Ok(None);ÁL'éË,'Ť<§'Ó¤³'úü»'EB An optimal buffer management strategy minimizes reallocations andÁ¬…( over-allocations.Á4¢(œ ½ñ œŽ´Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ôü×üôýY4î ôÿZLö£ô’R¦ôˆ‚„¾ô©§¥‚ôk<¹Ìô·œØôô>ô(0¤M!Lg|ù”¥éì½Ú\àÌμ¾<†¯l“ŸL¦Ž|~jlì‘„—ôäíTÿã·ƸðÐzo¡CŠÜ4›ˆˆŽ´ü±'¬¼ˆˆÔÒĶŒ´Œ¤óĶ
ŒÜà ã·Ž´Ž¤å ã·
Žü’ !Ķëüº % Ž´Ķ
ô54Æ üþ
"ã·ëü§%Ž´ã·
ô54³üÅ#™·¢ôï¡ ¡™· ¡Ķ ù
ü«&™·¥üØ*¢ ¢™· ¢Ķ æ
ü¤$™·˜¢˜üÏ£ £™· £ã· Ù
˜ü'™·š¥šü»+¤ ¤™· ¤ã· É
šü‰q¥œ¦£žžœËì Ž¾ð Íìǹ ŒÑä½µ£ǹͤåû¸Ÿ 'F'G ]_bd^`L$†Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
½µå½µæü­T¥¦§„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¥û¸ ¦ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å§œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙû¸'F Ä
 ·µ½µǹõ×ÐÔl,”@ –•¢®•¢Ë•¢¢ ¢·µ½µǹÞÞ $”E –•£®•£Ë•££ £·µ½µǹ¼âËâ,¤L –•¤®•¤Ë•¤¤ ¤·µ½µǹ®Ç®ÇËâü¡U™¥¦š§¦¨¨©§¨¦©Ëì ¦UÍ쥺 ©UÍì›¶ ¬UÍ쟺 ¯U›ßTßUï›¶¥ºTòUé›¶¥ºñ®Ç|ŒV£Ÿºã·¬¤VÓ¹ª«¬­¯ 
¬¯­«¸º´°²¬®TÁV,ÆV¥¥ÙåüÝV^TàV¨©ª„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¨Ó¹ ©ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åªœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ó¹¥º ¥ ùV¥
«·µ¥º›¶Ÿº$ïVõ×…WüˆYGT‹Y«„¾„¾ˆ‚†¾ ˜X$]È=„kt• «Ó¹¥º¹é¥  Y¥
¬·µ¥º›¶Ÿº$–Y÷$¬YüöZZTùZ¬­®„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¬Ó¹ ­ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å®ôè¥ Ž[¥
­·µ¥º›¶Ÿº$„[õך[Üß[tì[ü£b^T¦b¯°±„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¯Ó¹ °ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å±ôè¥ ¿b¥
¯·µ¥º›¶Ÿº$µbõ×ËbŒ¾d
<
<ü;ÿ;î;ñ;à;ã;Te4…eǪÄ3<äµ±4<?ïµ·“•Thªµ¹ºQDt¥µºãPL~žµ»â5T‰ˆµ¼Ó¦'Eµ½ƒúµ¿¿úõÀ˜³"¿µÁ¼é$
µÂ×ü\µÃ׳¤,µÄ’RÁ¦µÅˆ‚Ó„¾µÆk<è̵ȷœØµÉôhô(ZÌLKN=@/2!$¤›
÷ù|Þé”óÙì‹ÊD®»<¼¬lÉœLÜ{}¼—
¥Ë¦ÌÌËËì œ
¾ð Ÿ
üºÍÎÏÐÑÒÓÔÕØÙÚÛÜÝÞßàFHKMü.üµ
PÏ»üŠQN I/O object, using [`Decoder`] and [`Encoder`] to read and write the raw data.ÁàúüèK¤…ü¸F™½üƒEB method layers framing on top of an I/O object, by using the codecÁüÍHº¾üš:Œ¿ÙúüáGD This function returns a *single* object that is both [`Stream`] andÁü­MJ [`Sink`]; grouping this into a single object is often useful for layeringÁüÿL€Á´ÐÕÁëúüóIÂüÁIF calling [`split`] on the `Framed` returned by this method, which willÁüL§ÃàúüèLI Note that, for some byte sources, the stream can be resumed after an EOFÁü¹LI by reading from it, even after it has returned `None`. Repeated attemptsÁüŠKH to do so, without new data available, continue to return `None` withoutÁüÚ# creating more (closing) frames.ÁúüŠ$šñü³ ÈñüØ%" [`Decode`]: crate::codec::DecoderÁü‚&# [`Encoder`]: crate::codec::EncoderÁü­[X [`split`]: https://docs.rs/futures/0.3/futures/stream/trait.StreamExt.html#method.splitÁ·µ½µüºÊÊ
Í·µ½µ¨ï1,¢üØ&IüìPÏ»üÁQN I/O object, using [`Decoder`] and [`Encoder`] to read and write the raw data,Áü—1. with a specific read buffer initial capacity.ÁÍúüÕK¤…ü¥F™½üðEöüºHº¾ü‡ :Œ¿Æ úüÎ G„÷üš!MÕ÷üì!L€Á´½"ÕÁØ"úüà"IÂü®#Iáøüü#L§ÃÍ$úüÕ$$šñüþ$ Èñü£%%¤üüÍ%&Óüüø%[ƒýlß&·µ½µüºÊÊ
ηµ½µ¨,í&ï1,÷&‘ƒD'ü¹8;ü“,PÏ»üè,QŠõ¾-úüÆ-K¤…ü–.F™½üá.Gé½ü­/Hº¾üú/:Œ¿¹0úüÁ0G„÷ü1MÕ÷üß1L€Á´°2ÕÁË2úüÓ2SP This objects takes a stream and a `readbuffer` and a `writebuffer`. These fieldÁü«3MJ can be obtained from an existing `Framed` with the [`into_parts`] method.Áý3úü…4IÂüÓ4Iáøü¡5L§Ãò5úüú5$šñü£6 ÈñüÈ6&# [`Decoder`]: crate::codec::DecoderÁüó6&Óüüž763 [`into_parts`]: crate::codec::Framed::into_parts()ÁüÙ7[ƒýTÀ8¼üºÊÊ
Ï·µ½µpartsÁ,Ë8ܾ=üª;?< Returns a reference to the underlying I/O stream wrapped byÁlî;
`Framed`.Á€<úüˆ<KH Note that care should be taken to not tamper with the underlying streamÁüØ<FC of data coming in as it may corrupt the stream of frames otherwiseÁ´£= being worked with.Á<Å=² ²üº ²·µÊ Í=Ê
зµ½µ$Î=ü@#ü>GD Returns a mutable reference to the underlying I/O stream wrapped byÁlÍ>؈ß>úüç>Kûˆü·?FЉ´‚@ŸŠ<¤@³ ³üº ³·µÊ ¬@Ê
Ñ·µ½µ$±@üC7üì@NK Returns a pinned mutable reference to the underlying I/O stream wrapped byÁl¿A؈ÑAúüÙAKûˆü©BFЉ´ôBŸŠ\–C´„¾„¾ˆ‚†¾ ˜X$]È=„kt• ´üº„¾„¾ˆ‚†¾ ˜X$]È=„kt• ´·µÊ ¬CÊ
Ò·µ½µ$¢CÌõEüD:7 Returns a reference to the underlying codec wrapped byÁlÀD؈ÒDúüÚDJG Note that care should be taken to not tamper with the underlying codecÁü©EGD as it may corrupt the stream of frames otherwise being worked with.Á,üEµ µüº µ½µÊ ‚FÊ
Ó·µ½µ$ƒFü²H%ü¶FB? Returns a mutable reference to the underlying codec wrapped byÁlýF؈Gúü—GJçüæGG»‘L¹H üº ½µÊ ÃHÊ
Ô·µ½µ$ÈHüŒKYüƒIDA Maps the codec `U` to `C`, preserving the read and write buffersÁÄÌI wrapped by `Framed`.ÁéIúüñIJçüÀJG»‘L“Küº‰ïÒ’¨µçwpW…r}X·µÊÖ×Ö×ÊÍì— Kàð  K–"‰ï½µtÖK‰ï›˜˜"— ãK
Õ·µ½µ—‰ï$£KØ©K]_bdüÈP4üÌNBõ’l“O؈¥Oúü­OJçüüOG»‘lÏP·„¾„¾ˆ‚†¾ ˜X$]È=„kt• ·üº ·½µÊ çPÊ
Ø·µ½µ$ÝPüçQ&ü·Q+( Returns a reference to the read buffer.Á\îQ¸ ¸üº ¸Ž´Ê úQÊ
Ù·µ½µ$ûQüùR2üÁR30 Returns a mutable reference to the read buffer.Á|€S¹ ¹üº ¹Ž´Ê SÊ
Ú·µ½µ$•Sü”T'üãS,) Returns a reference to the write buffer.ÁdTº ºüº ºŽ´Ê ¨TÊ
Û·µ½µ$©Tü©U3üðT41 Returns a mutable reference to the write buffer.Á„°U» »üº »Ž´Ê ÁUÊ
Ü·µ½µ$ÆUü»V,ü•V! Returns backpressure boundaryÁ¬ÂV¼ ¼üºÊ ØVÊ
Ý·µ½µ$ÙVüÐW<üªW! Updates backpressure boundaryÁÌ×W½ ½üºÊ ñWÊ
Þ·µ½µ$öWboundaryÁDüWäÝZüÛX?< Consumes the `Framed`, returning its underlying I/O stream.ÁŸYúü§YKûˆü÷YFЉ´ÂZŸŠTäZüº·µÊÊ
ß·µ½µ$ïZüÛ],ü [JG Consumes the `Framed`, returning its underlying I/O stream, the bufferÁüï[)& with unprocessed data, and the codec.Á\úü¥\Kûˆüõ\FЉ´À]ŸŠTâ]üº¼ÊÊ
à·µ½µ$í]ü±`J¥â¦ãâãËì ¶`¾ð ¹`ŒÑLá`ÂÜ<ó`üºäå'F'Gå0257La$‡aáá·Ýü®aTL±a¾¿À„¾„¾ˆ‚†¾ ˜X$]È=„kt• ¾üº ¿ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åÀœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈ
 `£cÍj `àB¤GS
Íå§ï  iï
ò·µ½µ$¡i± §iäðp¥ô¦õôõËì õp¾ð øp¼öüÀqTü“q(% Create a new, default, `FramedParts`ÁÇq·µ½µ¼óš÷÷óÍìš Ëqï½µÕ¹T‰r
ö·µ½µÕ¹’RÎqï1,Õq9;d•e`„`u`x`|»e\¿eÇØÜ“•T ªûýãPL,žûþÄ3<JäûÿëÓ¦4f'EûƒúL}û˜³D”"¿û¼é
ûƒ×üû×â¤,ûˆ‚õ„¾ûk<ŠÌûˆ·$“œØûïQ\¦ªûŠúÌ ¬<¤Xî¤rß|Д¢À캱DÝ¢lë’Lþƒqs”ŸcÜ쥌ŒËì ñÍìï½ ô¼½Žšœ@B<>üË 4üŽ 85 Creates a new `FramedRead` with the given `decoder`.ÁÒ ·µï½¼½
Ž·µï½¨—3<à üª Oü½ RO Creates a new `FramedRead` with the given `decoder` and a buffer of `capacity`ÁŒ”  initial size.Ál± ·µï½¼½
·µï½¨,¿ —3<É ‘ƒ ܉üñ?ˆŒµ `FramedRead`.ÁËúüÓKûˆü£FЉ´îŸŠ<Πμ½ ηµ ˜
·µï½$™üì#üÌG¨‹Œ˜ÅÀ®úü¶Kûˆü†FЉ´ÑŸŠÏ ϼ½ Ï·µ û
·µï½$€üâ7ü»N¤ŒŽÅÀ¤úü¬KûˆüüFЉ´ÇŸŠÐ„¾„¾ˆ‚†¾ ˜X$]È=„kt• м½„¾„¾ˆ‚†¾ ˜X$]È=„kt• зµ ÿ
·µï½äÚüÔC@ Consumes the `FramedRead`, returning its underlying I/O stream.Áœúü¤KûˆüôFЉ´¿ŸŠ¼½·µ
·µï½ÜÔü2/ Returns a reference to the underlying decoder.Á<ÛÑ Ñ¼½ Ñï½ ã
·µï½üÖ'ü—:7 Returns a mutable reference to the underlying decoder.Á\ÝÒ Ò¼½ Òï½ é
·µï½ü†_ü©;8 Maps the decoder `D` to `C`, preserving the read bufferÁÄ鬕\¼½‰ïØØÛ¨ûF}pøc·µ—˜˜÷— à𠜖"‰ïiïÞ̘"— ã
·µï½—‰ïØ¥]_bdü•"6üÖ!:ÅÈ|œ"Ó„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ó¼½ Óï½ ¶"
·µï½$¬"ü¶#&ü†#+è™\½#Ô Ô¼½ ÔŽ´ É#
š·µï½$Ê#üÃ$2ü‹$3†›|Ê$Õ Õ¼½ ÕŽ´ Ú$
·µï½$ß$ü©&,ü¨%NK Consumes the `FramedRead`, returning its underlying I/O stream, the bufferÁüû%)³£T°&¼½ªªïQ­’R®ï1¯¤R°´R±³E{ äáT·µï½
œ·µï½$»&üì(N¥žŸŸžËì ñ(á½ ô(ŒÑL )äï½<²)¼½ ¡'F'G¡8:=?LÁ)$Æ)Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ï½åï½æüí)TLð)Öר„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ö¼½ ×ÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾å؜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¼½'F „*
¡·µï½$ú)õ×*ü«+@¥£š¤¥£¤¥Ëì °+ƒå ³+Í줽 ¶+
·µ¥º<ã+…¾¦§¨©ª 
¨©§ªbdgiceTò+,÷+¢¢·µ¥º üŽ,ZT‘,ÙÚÛ„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ù…¾ ÚÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åۜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
…¾¥º ¢ ¦,¢
§·µ¥º¤½$œ,õײ,ü²-GTµ-Ü„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ü…¾¥º¬Ü¢ Ê-¢
¨·µ¥º¤½$À-÷$Ö-üÅ.ZTÈ.ÝÞß„¾„¾ˆ‚†¾ ˜X$]È=„kt• Ý…¾ ÞÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åßçÛ¢ Ý.¢
©·µ¥º¤½$Ó.õ×é.üé/ZTì/àáℾ„¾ˆ‚†¾ ˜X$]È=„kt• à…¾ áÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åâçÛ¢ 0¢
ª·µ¥º¤½$÷/õ×0ü‹1V¥¬­¬­Ëì 1á½ “1ÊñTÃ1¿cï½TÖ1¼½®Àc®358:üè18ë1ãäå ã¼½ ä c cˆ¢cµ
 `£cÍj `àB¤GS
åå§« ï1«
®·µï½$ð1± ö1ìÔe'v„ôedøeǯ³±4<ï°±“•TDª°³â5TPˆ°´Ó¦4p'E°µ¿úT‡Ã°˜³"¿°·¼é
°¸×ü°¹×í¤,°º’Rû¦°»ˆ‚„¾°¼k<¢Ì°¾·œØ°¿ïQ\¾ª°Àúô-Ì(!¤b¬|ö|˜æ”­ÖìÅÇDè¸<ö©lƒ™L–ŠŒxz”·j以ÂÃÃÂËì ÀÍìÑ¿ Þ¿ÄÅÆÇÈÉÊËÌÏÐÑÒÓÔFHBDüœ 5üÞ96 Creates a new `FramedWrite` with the given `encoder`.Á£ ·µÑ¿ž¿ÁÁ
Ä·µÑ¿¨˜4<± ü Pü“ SP Creates a new `FramedWrite` with the given `encoder` and a buffer of `capacity`ÁŒë »¿ ·µÑ¿ž¿ÁÁ
Å·µÑ¿¨,– ˜4<  ‘ƒ Ü©ü?ˆ”Ô `FramedWrite`.ÁëúüóKûˆüÃFЉ´ŽŸŠæ æž¿ æ·µÁ ¸Á
Æ·µÑ¿ü#üìG¨‹”¸›ìÏúü×Kûˆü§FЉ´òŸŠ<”ç çž¿ ç·µÁ œÁ
Ç·µÑ¿ü„7üÜN¤”¯›ìÆúüÎKûˆüžFЉ´éŸŠ\‹è„¾„¾ˆ‚†¾ ˜X$]È=„kt• èž¿„¾„¾ˆ‚†¾ ˜X$]È=„kt• è·µÁ ¡Á
È·µÑ¿$—äýüöDA Consumes the `FramedWrite`, returning its underlying I/O stream.Á¿úüÇKûˆü—FЉ´âŸŠT„ž¿·µÁÁ
É·µÑ¿$Ü÷üÀ2/ Returns a reference to the underlying encoder.Á<þé éž¿ éÑ¿Á Á
Ê·µÑ¿$‡üù'üº:7 Returns a mutable reference to the underlying encoder.Á\€ê êž¿ êÑ¿Á ŒÁ
Ë·µÑ¿$‘üª`üÌ<9 Maps the encoder `E` to `C`, preserving the write bufferÁĬ•ž¿‰ï¯¯Ç²¨°Ír°k0Fo·µ—ÁÍÎÎÍÁ÷— ½àð À–"‰ïÑ¿‰ï·ø˜"— ˆ
Ì·µÑ¿—‰ïØÉ]_bdü»!6üü :ô|Â!넾„¾ˆ‚†¾ ˜X$]È=„kt• ëž¿ ëÑ¿Á Ü!Á
Ï·µÑ¿$Ò!üÝ"'ü¬",¬œdä"ì ìž¿ 쎴Á ñ"Á
зµÑ¿$ò"üì#3ü³#4Ë„ó#í íž¿ 펴Á „$Á
Ñ·µÑ¿$‰$üø$,üÒ$!òž¬ÿ$î îž¿Á •%Á
Ò·µÑ¿$%ü‡&<üá%!ûŸÌŽ&ï ïž¿Á ¨&Á
Ó·µÑ¿$­&ø D³&üŽ(,üŒ'OL Consumes the `FramedWrite`, returning its underlying I/O stream, the bufferÁüà')³£T•(ž¿ªªïQ­’R®ï1¯¤R°´R±³E{ äáT·µÑ¿ÁÁ
Ô·µÑ¿$ (üÑ*v¥Öš×ØÖרËì Ö*ƒå Ù*Í솿 Ü*›ßTŠ+¥ºT+醿¥ºñ®Ç|·+Ý¿ÙÚÛÜÝ 
ÛÝÜÚŠŒTÎ+,Ó+ÕÕ üê+ZTí+ðñò„¾„¾ˆ‚†¾ ˜X$]È=„kt• ðÝ¿ ñÌÌkδ¸Ïéÿ¸Ð‚€¸Ñ“€¸Ò¨€¸f'EwÚ]¾åòœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ý¿¥º Õ ‚,Õ
Ú·µ¥º†¿$ø+õ׎,üþ,GT-󄾄¾ˆ‚†¾ ˜X$]È=„kt• óÝ¿¥ºׄ Õ –-Õ
Û·µ¥º†¿$Œ-÷$¢-
 `£cÍj `àB¤GS
ÿå§ã ¹3ã
æ·µ½µ$º3± À3üŽf…ŒÄ°fü4
1 Frame a stream of bytes based on a length prefixÁ5
úü9F
C Many protocols delimit their frames by prefacing frame data with aÁü€:
7 frame head that specifies the length of the frame. TheÁü»H
E `length_delimited` module provides utilities for handling the lengthÁü„F
C based framing. This allows the consumer to work with entire framesÁüËC
@ without having to worry about buffering or other framing logic.Á
ú¬“
 # Getting startedÁ©
úü­K
H If implementing a protocol from scratch, using length delimited framingÁüùG
D is an easy way to get started. [`LengthDelimitedCodec::new()`] willÁüÁG
D return a length delimited codec using default configuration values.Áü‰F
C This can then be used to construct a framer to adapt a full-duplexÁüÐ(
% byte stream into a stream of frames.Áù
ú
Ó¤ü…+
( use tokio::io::{AsyncRead, AsyncWrite};Áü±:
7 use tokio_util::codec::{Framed, LengthDelimitedCodec};Áì
úüð7
4 fn bind_transport<T: AsyncRead + AsyncWrite>(io: T)矬*
' -> Framed<T, LengthDelimitedCodec>Á
üÙ4
1 Framed::new(io, LengthDelimitedCodec::new())Á
Ť´”
 # pub fn main() {}Á
Ó¤³
úü·H
E The returned transport implements `Sink + Stream` for `BytesMut`. ItÁü€ G
D encodes the frame with a big-endian `u32` header denoting the frameÁœÈ
 payload length:ÁÜ
ú
 ```textÁüì 1
. +----------+--------------------------------+Áüž
1
. | len: u32 | frame payload |ÁüÐ
1
ï <
Ó¤Š
úüŽ &
# Specifically, given the following:Áµ
ú
Ó¤üÁ +
…™ üí :
º™ ¨
ú̬
 use futures::SinkExt;Á¬Æ
 use bytes::Bytes;ÁÜ
úüà L
I async fn write_frame<T>(io: T) -> Result<(), Box<dyn std::error::Error>>ÁL­
 whereÁü·
*
' T: AsyncRead + AsyncWrite + Unpin,Á
þš üè
I
F let mut transport = Framed::new(io, LengthDelimitedCodec::new());Áü²/
, let frame = Bytes::from("hello world");Áâ
úüæ%
" transport.send(frame).await?;Á
æÙ,
Ť
Ó¤©
úü­*
' The encoded frame will look like this:ÁØ
ú
Ú üè'
$ +---- len: u32 ----+---- data ----+Áü'
$ | \x00\x00\x00\x0b | hello world |Áü¸'
$ +------------------+--------------+Á
Ó¤è
ú
# DecodingÁû
úüÿK
H [`FramedRead`] adapts an [`AsyncRead`] into a `Stream` of [`BytesMut`],ÁüËI
F such that each yielded [`BytesMut`] value contains the contents of an知B
? entire frame. There are many configuration parameters enabling矯E
B [`FramedRead`] to handle a wide range of protocols. Here are someÁüžA
> examples that will cover the various options at a high level.Áà
ú„ä
## Example 1Áõ
úüùK
H The following will parse a `u16` length field at offset 0, omitting the矁)
& frame head in the yielded `BytesMut`.Áï
ú
Ó¤üû"
 # use tokio_stream::StreamExt;Áüž2
/ # use tokio_util::codec::LengthDelimitedCodec;矄/
ØÆ¼
ü™-
* # let io: &[u8] = b"\x00\x0BHello world";矂4
1 let mut reader = LengthDelimitedCodec::builder()Áüü0
- .length_field_offset(0) // default valueÁü­#
.length_field_type::<u16>()矄0
- .length_adjustment(0) // default valueÁ´‚
 .new_read(io);Áü™?
< # let res = reader.next().await.unwrap().unwrap().to_vec();ÁüÙ&
# # assert_eq!(res, b"Hello world");Á<€
²Í<ˆ
Ó¤
úü”0
- The following frame will be decoded as such:ÁÅ
ú
Ú üÕ1
. INPUT DECODEDÁü‡6
3 +-- len ---+--- Payload ---+ +--- Payload ---+Áü¾6
3 | \x00\x0B | Hello world | --> | Hello world |Áüõ6
3 +----------+---------------+ +---------------+Á
Ó¤´
úü¸L
I The value of the length field is 11 (`\x0B`) which represents the lengthÁü…J
G of the payload, `hello world`. By default, [`FramedRead`] assumes thatÁüÐH
E the length field represents the number of bytes that **follows** the矪L
I length field. Thus, the entire frame has a length of 13: 2 bytes for theÁüæ*
' frame head + 11 bytes for the payload.Á
ú„•
## Example 2Á¦
úüªL
I The following will parse a `u16` length field at offset 0, including theÁü÷)
œª ¡
ú
Ó¤ü­"
èª üÐ2
”« üƒ /
ØÆ¼³
üË -
ë« üù 4
¢¬ ü®!0
ଠüß!#
š­ üƒ":
7 .length_adjustment(2) // Add head size to lengthÁü¾"7
4 .num_skip(0) // Do NOT skip the headÁ´ö"
€® ü#?
 ® üÍ#.
+ # assert_eq!(res, b"\x00\x0BHello world");Á<ü#
²Í<„$
Ó¤Œ$
úü$0
¿¯ Á$
ú\Å$
Ú üÑ$4
1 INPUT DECODED矠%A
> +-- len ---+--- Payload ---+ +-- len ---+--- Payload ---+ÁüÈ%A
> | \x00\x0B | Hello world | --> | \x00\x0B | Hello world |ÁüŠ&A
> +----------+---------------+ +----------+---------------+Á<Ì&
Ó¤Ô&
úüØ&I
F This is similar to the first example, the only difference is that the矢'J
G frame head is **included** in the yielded `BytesMut` value. To achieveÁüí'P
M this, we need to add the header size to the length with `length_adjustment`,Áü¾(;
8 and set `num_skip` to `0` to prevent skipping the head.Á
included.Á•C
ú<™C
Ó¤ü¡C"
èª üÄC2
”« ü÷C/
ØÆ¼§D
ü¿D5
2 # let io: &[u8] = b"\xCA\x00\x0B\xFEHello world";ÁüõD4
¢¬ üªE1
. .length_field_offset(1) // length of hdr1矆E#
š­ ü€F0
- .length_adjustment(1) // length of hdr2Áü±F,
) .num_skip(3) // length of hdr1 + LENÁ´ÞF
€® üõF?
 ® üµG*
' # assert_eq!(res, b"\xFEHello world");Á<àG
²Í<èG
Ó¤ðG
úüôG0
¿¯ ¥H
ú\©H
Ú ÔµH
ñÌ üÐH2
/ +- hdr1 -+-- len ---+- hdr2 -+--- Payload ---+ÁüƒI2
/ | \xCA | \x00\x0B | \xFE | Hello world |Áü¶I2
/ +--------+----------+--------+---------------+ÁéI
ú¤íI
 DECODEDÁô‚J
 +- hdr2 -+--- Payload ---+Áô¡J
 | \xFE | Hello world |ÁôÀJ
 +--------+---------------+Á<ßJ
Ó¤çJ
úüëJI
F The length field is situated in the middle of the frame head. In thisÁüµKK
H case, the first byte in the frame head could be a version or some otherÁüLH
E identifier that is not needed for processing. On the other hand, theÁüÊL&
# second half of the head is needed.ÁñL
úüõLJ
G `length_field_offset` indicates how many bytes to skip before startingÁüÀML
I to read the length field. `length_adjustment` is the number of bytes toÁüNI
F skip starting at the end of the length field. In this case, it is theÁä×N
 second half of the head.ÁôN
ú„øN
## Example 6Á‰O
úüOI
õÓ ü×OL
ÈÔ ü¤PJ
žÕ üïPH
E included. In this case, the length field **includes** the frame headÁ\¸Q
 length.ÁÄQ
ú<ÈQ
Ó¤üÐQ"
èª üóQ2
”« ü¦R/
ØÆ¼ÖR
üîR5
2 # let io: &[u8] = b"\xCA\x00\x0F\xFEHello world";Áü¤S4
¢¬ üÙS1
¥× ü‹T#
š­ ü¯TA
> .length_adjustment(-3) // length of hdr1 + LEN, negativeÁ¤ñT
 .num_skip(3)Á´†U