Files
boc/aamos-ledger-rust/target/debug/deps/libcrossbeam_epoch-90c3f33e672820a4.rmeta
T

524 lines
247 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Ácrossbeam_utilsÁ\€v€*˜‚³aÑl®Ø{Í-580ebf62485b3066ÁloomÁ$ðcrossbeam_loomÁ primitiveÁL¶testsÁ,ê¤$ɤ¸¾Ù¾,›® MAX_OBJECTSÁ\crossbeam_sanitizeÁ”ëµ $ÿÔꮾ,žŸ$ýž¾,¸P$—PÖ$þ=$Ý=޾
À¢cellÁ¥æ withÁ£impl FnOnce(*const T) -> RÁwith_mutÁ £ impl FnOnce(*mut T) -> RÁçatomicÁ¤µ  
  
strongest_failure_orderingÁ/CompareAndSetErrorÁ1'gÁ1¥1¡CompareExchangeErrorÁ5
5¥5¡5currentÁ5æ ;¥;¡;×CompareAndSetOrderingÁ?successÁ?failureÁBB¡EE¡low_bitsÁH¥ensure_alignedÁJ¥ compose_tagÁL¥
decompose_tagÁN¥ PointableÁPALIGNÁPInitÁPinitÁP´T'aÁPVòPãY¥YÉYÕYàY´^òY`òYãMc¥ccelementsÁf h¥hlayoutÁk¥kÉkÕkàk´pòkròkãVu¥udataÁu_markerÁy¥{¥}¥}æ  ¥à
¬
 load_consumeÁ
È¡swapÁ
¡ Ž
Ž¡Ž Ž ¡
¡  ¾˜
˜compare_and_setÁ
 ¡compare_and_set_weakÁŸ
Ÿ Ÿ¡ fetch_andÁ£
fetch_orÁ¥
 fetch_xorÁ§

into_ownedÁtry_into_ownedÁ
«¥«× ®¥®× ±¥±ƒ
´¥´>·¥·÷º¥º÷½¥½÷À
À¥À÷Ä¥Ä÷Ç¥Ç
into_usizeÁÇOwnedÁË¥ËâËíÏ¥ÏÏÓ¥Ófrom_rawÁÓinto_boxÁÓæ Ø¥ØàØ into_sharedÁÛ
ØtagÁØwith_tagÁߥßãâ¥â×å¥åƒè¥èåè´ì¥ìï¥ï÷ò¥ò÷õ¥õborrowÁø¥ø
borrow_mutÁû¥ûÉ þ¥þas_mutÁSharedÁ
¥âí!¥ƒ"¥#¥$
¥as_rawÁ%
¥
is_nullÁ´É©»Øã&Ÿ¥Ÿ÷'¢
¢¥¢(¦¥)¨
¨¥¨ï
*¬¥¬+¯¥¯×,²¥²×-µ¥µ> collectorÁ¸¸¸¸¸¸¸ CollectorÁ¿globalÁ¸¸¸Ã>¸Åæ ÅregisterÁ¸Èƒ¸Ê׸̸¸ LocalHandleÁÏ®¸Ñÿ
Ñ is_pinnedÁѸ Õã¸
××deferredÁÙÙÙÙÙÙÙÙ
DATA_WORDSÁÙDataÁâ ÙDeferredÁäÑäâäíÙè×ÙêNO_OPÁë
no_op_callÁêæ ííÑïíÑñêÑepochÁôôôôøstartingÁøëøÖøpinnedÁøunpinnedÁø successorÁôÿæ ÿ¬ÿÈÿ £GuardÁ®deferÁŽŽ£defer_uncheckedÁ£ 
defer_destroyÁ¥ flushÁrepinÁ repin_afterÁšš£š
ScopeGuardÁ
ˆš ã¢ ¤ã¦× unprotectedÁ¨ GuardWrapperÁ©
©ˆ¨¨ UNPROTECTEDÁå®®®®®®®®®® ®
® ® ®
®®®®®®®®®®®®®®®®®®® ®BagÁÐ deferredsÁÑ Ð®®Õæ Õis_emptyÁÕtry_pushÁÕsealÁ®Ú>Û ®Ýã®ß×®®â
is_expiredÁ®GlobalÁälocalsÁäqueueÁäî!®è
COLLECT_STEPSÁèæ èpush_bagÁècollectÁì è try_advanceÁ®LocalÁïentryÁïïbagÁï guard_countÁï handle_countÁï pin_countÁïî!®÷PINNINGS_BETWEEN_COLLECTÁ÷ò÷Á÷û ÷Ö÷Â#þ ÷­$ ÷ÿ
÷þ÷º$÷acquire_handleÁ÷release_handleÁ÷finalizeÁ  ® Šentry_ofÁŠ
element_ofÁŠ…,çŽlistÁ  IsElementÁš¥š¤,š´,š…,IterÁŸ
Ÿ¥ŸŸ£ŸpredÁŸcurrÁŸheadÁŸí¨>ªdeleteÁ¬¥¬¬æ ¬insertÁ°
¬ù²
´¥´´ã¸
¸¥¸¸¸ó Ž once_lockÁ¾¾¾¾OnceLockÁÂ¥ÂonceÁ»¾Æ¥¾È¥¾Ê¥Êæ Ê get_or_initÁÍÊ
initializeÁÏÏ Ê
get_uncheckedÁ¾Ó¥Ó㎂)ÖÖÖÖÖÖÖÖÖÖ Ö
Ö ÖNodeÁã¥ãâãó Öç¥Öé¥Öë¥ëæ ë
push_internalÁëpushÁë pop_internalÁð ð ëpop_if_internalÁóó ó ëtry_popÁë
try_pop_ifÁøÖú¥úã 
  
>ŽŽŽŽŽŽŽ COLLECTORÁŽÿ
 ŽÖ Ždefault_collectorÁŽ with_handleÁœœ£œ œ 
UnsafeCellÁ¥
¥¥¥ˆ©¥©×ôEpochÁ¬âôôô°ƒô²>ô´×ôÖôô ¹ô AtomicEpochÁ»âô
½>ô ¿×® SealedBagÁÁî!Á_bagÁ®
Ä>® Æ×EntryÁÈó Ê×ListÁÌ¥Ì̈.ÌíÑ¥ÑÑ× IterErrorÁÕStalledÁÖ
Ù Û×ÖQueueÁݥ݈.ÝtailÁÖá¥á׎HANDLEÁä__rust_std_internal_init_fnÁä æ ç__RUST_STD_INTERNAL_VALÁæ é:

;
>
>
>
@
A
C
D
F
G




Ž
Ž


˜


Ÿ
Ÿ
£
¥
§
­
­
­
°
°
°
³
Ý
á
ä
ä
ä
ç
ë
î
÷
ú
ý


ˆ




˜

š

ž
Ÿ
¥
¥
¦
«
«
¬
®
®
¯
±
±
±
²
´
´
´
µ
Ç
É
Ë
Ë
Ë
Í
Í
Ò
Ó
Ô
Ö
Ø
Ø
Ø
é
é
é


ƒ
Ž



˜

š
¡
¢
¥
§
§
§
×
Ø
Þ
à
à
à
ã
ë
ë
ë
ì
ì
ì
î
î
ù
ú
û
ý
þ
þ



ƒ





Œ


œ

ž
ž
«
«
·
½
Í
Ï
Ò
Õ
î
î
î
î
ï
ï
ð
ð
ó
ó
ó
÷
÷
ø
ø
ø
ü
œ
«
«
«
±
µ
µ
µ
·
º
º
À
À
À
Ç
Ç
Ç
Ë
Ë
Ë
Ô
Ô
Ô
Ú
Ú
Ü
Ü
Ü
ã
ã
ã
?PÇš¿c¥¥¦Ô5¨ˆ r÷MŠH‹¥¿c55
9É
:æ »c,ç´ÏÆ8¥¡?¼À½À¾ÀË¿ÀÀÀÌÁÀÂÀGÃÀÄÀFÅÀÆÀ×`šÁ¬S øB?ªDªDPÖCP
ÑÛÑÛ MaybeUninitÁÓÛuninitÁÝÔÛ»ÝÍõƒ«%9ÖCÌìuuVwâxíJ°*‰®†ÚÖC F¿cFÎcFØF³FéFËË´ÍâÎíݶçPrhìþÖCéFžBoxÁ¡ˆˆ¢ˆl }.xÏÖCçEçEèEæ( ¿±‡§í#éFÖCéuuVwâxíJ°*‰®†Ú˜DìâíÊ,8ܪÏý
˜DéF ÖCÇGÖCŒ"G¿cGØ‚Gé!‚Gö!‚Gé‚GÖCé‚GÇG ‚GÖC£‚GÖCà‚GÖCã‚GÖCØìâíÊ,8ܪÏý8˜DŠ ßJÇßJ˜DéßJ ˜DµßûHûHßJíßûHûHºßJ¿cßJÎcßJ³ßJÌì¿¿°ÀÁêðL¹ƒ~/ô ›L³›LØ›L¿c›Lµß›L›L›LŒ"ÏϮЮk8,g
öÀ¿cM¿cääÞ åÑÙæâÙçíÙÐ¥0ß”CWŠ ¬¬6­âôžÛšNØšN³šN¿cšNšNÐìšNµßšNšN³»»ó6¼âôºÿ‚2s™…6¿cšOŒ"žê$Ÿˆ Ä¿²¥qŒ"¨#Œ®}<8‡nöK¿cP ©©ªÐ%«ˆ Ú óÞÌìÐи'ÑÃ'®Ó®Éú?R?éw7³ŠQŒ"ŠQ¿cŠQ³ÁÁ§7Âî!®ÃÀ7®ìu 2«Ä¿céQ éQšïïð)ðý)®ñ®ò’*ó*®ô°*®õÄ*®öî!®:È¡¸§%¶¥¾R¿cÈÈå7Éó ,•$Sše|³¿cÌ̇8ψ.Ðíö°+j”PÖCÐìÕÖ×á8웫Èá'vµß½T½T¿c½T³½SŒ"òSùMŸŸÄ-££¤ð-¥ü-¦ˆ.§íQøíI½Ï†×
˜D ÂÂè/Ä€0¾Å»¾ÜæâñâºãpÖCÌìŠVŒ"ŠV¿cÝÝ”9߈.Öà±9Ö¯Á™Z­ÖC ãVÌìãVŒ"ãV©¥;˯ʿ×Ïèä´¬¿»¦ßÐÆÁÊÈÑÌÛÕáÝB¼ÀE
Yk y¿ÔÐÈÂéÝ{¿¬©áÁÆÂçÝ®±ËÈ¿°¬´Ã¿²¬½»ÚÐÄÁ¨È·ËòËŸÏËßËÕÏ ¤ÝдÌÓÂúÝèËìËõËøËûËþË®¬¢Ì¿¹¬Ùզﬨ¬¯¬¸¬ØÕŠï¸Ÿ¿cÆ?tP Ìì !Îc(Ø
³"é7Ç3Œ"é!8ö! £à㊠µßíߺÛÐìšùMüˆ%#$¦%
#ìˆ%
õ0ÖC3E ª%üý$/ ¥ÖC «%º%ü¹$¥ClÝ$ÖC$Ñ$î0î0Ô5ð0»Ì-·}—KEüC£ÖCÛÖCÙâHw¤Ó3
 ”Ó3
ÊÖC%ü¾3*[,Ë3$Ô_ܱ>
 ̱>
ÊccMefç€çΑÖÏÇÖCXüœ>1mÔ_,©>$œ÷U
„÷U
ŒÄ ˆVÔ_>\¡V  ÖCüÞUY uÖC ¶V½Vü³UŠFLÊU¤]¤]V¦]Á‚]üß3ø¤”&Ô_â PhantomDataÁFu\»ŸöaØÔ_Ô_
DATA_WORDSÁ
ì ¬Ó
œÓ
òÔ_Ô_9\ÿ  ¢düœy ä üËÑëÍM›dßÑÛÑÛÂDÓÛ×DÝÔÛ»ÝÍõƒ«%9Êdù’bFu\»ŸûdéŸ@Ô_64Á@Ô_ MAX_OBJECTSÁ@Ô_ MAX_OBJECTSÁÔ_Ô_128Á

þ8'üÓ&¬ã
ϋ
òÖC+8
?
õ0¶EO` øüšj ÂÖC ƒŠÌüV$‹ï8ï8OnceÁð8innerÁé8ãTPàVça!î0î0Ô5ð0»Ì-·}—KEüC£¶E,¶E+ùW·e

éW·e
¾MùWÕúeæÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙM Mk±ßùVfaä®®£°åh¨it§ÅLS¶MáV¢faXækkùWðe
éWðe
ÐM/5ùW¦®e  çk¥l¢d/k W¿eùWíÔeùW‚!­e  é”n—n¢d#k W!eM WÀ$eùWÛôeækç”n—n¢dåé”n—n¢dŸSüõ ¥ÖC¦)¥C4¸^;BŒÿq ž%ÙO0 ¾R9@œù– ©ª&ÐP1P8?¸Ùô®ŽŽÀ¤, +é ”ý/1þ÷
¬‘0?ÿV41u
¤‰15ƒ´,Ÿ1˹L¦1P<±1Çì4º1°LÓ1¿®\Þ1ÏŠ½%\ø1 ¨Œ¨#,…2ÿ4Œç2 ¢ÖLú2 £ÿ
…3 ¤üŠ3ü# Epoch-based memory reclamation.Á$úü(\Y An interesting problem concurrent collections deal with comes from the remove operation.Áü…b_ Suppose that a thread removes an element from a lock-free map, while another thread is readingÁüè`] that same element at the same time. The first thread must wait until the second thread stopsÁüÉ=: reading the element. Only then it is safe to destruct it.Áúü‹]Z Programming languages that come with garbage collectors solve this problem trivially. TheÁüéa^ garbage collector will destruct the removed element when no thread can hold a reference to itÁ anymore.ÁØúüÜa^ This crate implements a basic memory reclamation mechanism, which is based on epochs. When anÁü¾`] element gets removed from a concurrent collection, it is inserted into a pile of garbage andÁüŸc` marked with the current epoch. Every time a thread accesses a collection, it checks the currentÁüƒa^ epoch, attempts to increment it, and destructs some garbage that became so old that no threadÁüå" can be referencing it anymore.ÁˆúüŒb_ That is the general mechanism behind epoch-based memory reclamation, but the details are a bitÁüï`] more complicated. Anyhow, memory reclamation is designed to be fully automatic and somethingÁüÐ C@ users of concurrent collections don't have to worry much about.Á
út˜
# PointersÁ§
úü«
b_ Concurrent collections are built using atomic pointers. This module provides [`Atomic`], whichÁüŽ ^[ is just a shared atomic pointer to a heap-allocated object. Loading an [`Atomic`] yields aÁüí a^ [`Shared`], which is an epoch-protected pointer through which the loaded object can be safelyÁ  read.ÁÙ ú
# PinningÁë úüï b_ Before an [`Atomic`] can be loaded, a participant must be [`pin`]ned. By pinning a participantÁüÒ
XU we declare that any object that gets removed from now on must not be destructed justÁü«\Y yet. Garbage collection of newly removed objects is suspended until the participant getsÁlˆ
unpinned.Áú
# GarbageÁ¨úü¬a^ Objects that get removed from concurrent collections must be stashed away until all currentlyÁüŽ^[ pinned participants get unpinned. Such objects can be stored into a thread-local or globalÁüíRO storage, where they are kept until the right time for their destruction comes.ÁÀúüÄkh There is a global shared instance of garbage queue. You can [`defer`](Guard::defer) the execution of anÁü°_\ arbitrary function until the global epoch is advanced enough. Most notably, concurrent dataÁü74 structures may defer the deallocation of an object.ÁÈú # APIsÁ×úüÛa^ For majority of use cases, just use the default garbage collector by invoking [`pin`]. If youÁü½IF want to create your own garbage collector, use the [`Collector`] API.Áü¼ üæ6|™¸Ùô®ŽŽÀ
¤
é 
1þ÷

?ÿV
u

5ƒ´Ž
˹
PŒ
Çì
°Š
¿®
ÏŠ½%ˆ
¨Œ¨#
ÿ4
¢Ö
£ÿ

¤ª­°lóµ ̱ü«!„ÖÜÍL‘dÈ*µœ¡¥¦¬ÿ#¥ÍìÖC „$¥C 
ü¹$1Í$ÖC¥C
ÖCâeüÞ%@$ì%ë ë¥CØ
££ Ø
 
 ô%ÍìÓ‘ ñ%ÍìΑÔþ%–"ΑÆI¬ƒ&Α³’˜"Ó‘ —&
ÖCÓ‘Α$õ%± û%_a[]üò&BD€'ì ì¥C Ó‘£ 

  Œ'†’ ‰'Íì¿“Ä–'"¿“öaœ›'¿“™”˜"Ó‘ ­'
ÖCÓ‘¿“$'± “'_a[]œù'$ˆ(Kˆ*†J¬—(4¦(¦tð( _¼,€) _ AtomicPtrÁL‡)¯] AtomicUsizeÁ\)„Ä®DŸ)¼À”Ê(vxgiOQ57%'„û)­ŒÃ*?”“+ Tâ+»¤Œ²+óµ ÌÅ+ü±+.ü¨+94æ+/15?HJLNPcuÇËÕF 4(èØY4C ZLK£a×p ` ’b\‡!’b!íë#ÂD\ªÑÛ$r,Èé!&DerefMutÁDÏö!'µ ä(ž‰f)¨#,*ß”„Ä,®¼À-
AtomicConsumeÁlîmœad4UXJML[ALj5Ìy)L˜
žþôöÝßLÞÒ\íÅœÿ¸ô˜ª¬™üÕ&|ü–8Ô™ªDªD
/ordÁ´ü‡%üå;8 The error returned on failed compare-and-set operation.Á"Use `CompareExchangeError` insteadÁüà$üÌ:íš
2¥3¡4423Íì˜D §ÍìžD ª55
9É
:æ »c,ç´ÏÆ
˜DžD£UWRTüIüÐ<9 The error returned on failed compare-and-swap operation.Á¤˜
6¥7¡8867Îì˜D ±èœ ÈP˜DÇžD˜D˜D
»Í÷œ»c,ç´ÏÆ9:­[]`bÔª üÝHE The value in the atomic pointer at the time of the failed operation.Á<® 55ûHT‡
üË 74 The new value, which the operation failed to store.Á
55žDü–
Q8í¥<¡=í=<Øœ
èœ ž
ûž
¿cžD
ãC>Àc>/146üî
8ñ
îïð îãC ï c cˆ¢cµ
 `£cbufÁ `àB¤GS
ðÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¢dŸÈŸÈ ÈErrorÁ O˜éBL; õ
;
>8˜DžD
± ü
üÛüÉ 41 Memory orderings for compare-and-set operations.Áþ úü‚
[X A compare-and-set operation can have different memory orderings depending on whether itÁüÞ
\Y succeeds or fails. This trait generalizes different ways of specifying memory orderings.Á»úü¿A> The two ways of specifying orderings for compare-and-set are:Áúü…^[ 1. Just one `Ordering` for the success case. In case of failure, the strongest appropriateÁÔä ordering is chosen.Áüÿ\Y 2. A pair of `Ordering`s. The first one is for the success case, while the second one isÁäÜ for the failure case.ÁŠ`compare_and_set` and `compare_and_set_weak` that use this trait are deprecated, use `compare_exchange` or `compare_exchange_weak instead`Áü½šü¤¬åë¨??ÎìüÛß?ª«ª«@A@AA@ô¹ü30 The ordering of the operation when it succeeds.Á<¼ë¨Ìñ ñ²«ªD? Ä?
@²«ôšüÝ0- The ordering of the operation when it fails.Áúüš]Z The failure ordering can't be `Release` or `AcqRel` and must be equivalent or weaker thanÁÌü the success ordering.Á<ë¨ùò ò²«ªD? ¥?
A²«üÑ'ªDCD@ADCì<ó óªDªDB ˜B
C$™ìÔ<×ô ôªDªDB ßB
Dü¼3ŸEFG@AFGì„<‡õ õŸEªDE E
F$ìÌö öŸEªDE ×E
Güï-Ô_¥IIÎìÖC ûPÖCL‡
HÖCüŠ4tÔ_¢d¥KKê² œú²
JÖC@³ü¯GÔ_Ô_Ô_¥MMê² ¾ú²
LÖCâØâ#%üƒFl†Ô_Ô_Ô_¥OOê² ú²
NÖCâœÈ'ü… /, Types that are pointed to by a single word.Áµ úü¹ b_ In concurrent programming, it is necessary to represent an object within a word because atomicÁüœ!_\ operations (e.g., reads, writes, read-modify-writes) support only single words. This traitÁüü!>; qualifies such types that are pointed to by a single word.Á»"úü¿"\Y The trait generalizes `Box<T>` for a sized type `T`. In a box, an object of type `T` isÁüœ#c` allocated in heap and it is owned by a single-word pointer. This trait is also implemented forÁü€$da `[MaybeUninit<T>]` by storing its size along with its elements and pointing to the pair of arrayÁ´å$ size and elements.Áü$úü€%]Z Pointers to `Pointable` types can be stored in [`Atomic`], [`Owned`], and [`Shared`]. InÁüÞ%GD particular, Crossbeam supports dynamically sized slices as follows.Á¦&ú<ª& ```Áô²& use std::mem::MaybeUninit;ÁüÑ& use crossbeam_epoch::Owned;Áñ&úüõ&JG let o = Owned::<[MaybeUninit<i32>]>::init(10); // allocating [i32; 10]Á<À'¼LÒ'PPª«üÈ'Ö Pª«ª«QRSTVXQRSTVXÍ첫RTÀ(¡¿XVTS”„(ìâ' The alignment of pointer.Á,Š(PPÔ_LÀ(ô( The type for initializers.Á$Å(PPü×)*üÐ(-* Initializes a with the given initializer.Á)údŠ) # SafetyÁ)úü£)/, The result should be a multiple of `ALIGN`.Á$á)©¿Ô_PP
S²«à$æ)üÇ,,ü‡*# Dereferences the given pointer.Á¯*úd·*™ÀÈ*úüÐ*LI - The given `ptr` should have been initialized with [`Pointable::init`].Áü¡+DA - `ptr` should not have yet been dropped by [`Pointable::drop`].Áüê+XU - `ptr` should not be mutably der
`Shared`.Á¤lúü¬lZÃãt‹m¦äžmút¦m¼Û¹mú<Ám¼üÍm96 use crossbeam_epoch::{self as epoch, Atomic, Shared};Áü‹n,«å¼núôÄn¢ÜôçnùåüŠo2/ let p = a.swap(Shared::null(), SeqCst, guard);ÁüÁo41 # unsafe { drop(p.into_owned()); } // avoid leakÁ<úo¼$pŒú úFÁõªD Œ’PìâíÊ,8ܪÏýŒÖC¡’pïõ –p€öT™p
ÖCÁõ$¦pæ ¬p‘š´p ÃpDF;=üò~Šü¼q`] Stores the pointer `new` (either `Shared` or `Owned`) into the atomic pointer if the currentÁü¡r^[ value is the same as `current`. The tag is also taken into account, so two pointers to theÁü„sGD same object, but with different tags, will not be considered equal.ÁÐsúüØs_\ The return value is a result indicating whether the new pointer was written. On success theÁü¼t[X pointer that was written is returned. On failure the actual current value and `new` areÁlœu
returned.Á®uúü¶uEB This method takes two `Ordering` arguments to describe the memoryÁü€vQN ordering of this operation. `success` describes the required ordering for theÁüÖv[X read-modify-write operation that takes place if the comparison with `current` succeeds.Áü¶wZW `failure` describes the required ordering for the load operation that takes place whenÁü•xRO the comparison fails. Using `Acquire` as success ordering makes the store partÁüìxNK of this operation `Relaxed`, and using `Release` makes the successful loadÁü¿yPM `Relaxed`. The failure ordering can only be `SeqCst`, `Acquire` or `Relaxed`Áü”zB? and must be equivalent to or weaker than the success ordering.ÁÛzútãz¼Ûözú<þz¼üŠ{@= use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared};ÁüÏ{,«å€|úôˆ|¢Ü«|úô³|ùåüÖ|%" let curr = a.load(SeqCst, guard);Áü€}OL let res1 = a.compare_exchange(curr, Shared::null(), SeqCst, SeqCst, guard);ÁüÔ}QN let res2 = a.compare_exchange(curr, Owned::new(5678), SeqCst, SeqCst, guard);Áüª~74 # unsafe { drop(curr.into_owned()); } // avoid leakÁ<æ~¼„ù~ûü ûFìâíÊ,8ܪÏýüÖCÁõªDªD ’PÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ìâíÊ,8ܪÏýÖC55
9É
:æ »c,ç´ÏÆÖCÁõ¡Šïõ Ž€öTñ€
ŽÖCÁõ$›É
æ É¡ UWLN•‚Ž<closure_kind>Á<closure_signature>Á<upvars>ÁŽÖCÁõÔ_ìâíÊ,8ܪÏýÖC Ô_LÒ‚ŽêŒƒ¡ŽÖCÁõÒŽ55
9É
:æ »c,ç´ÏÆÖCÁõüå—üŸ„`žûü„…^ˆüüç…Gðü³†úü»†_\ Unlike [`compare_exchange`], this method is allowed to spuriously fail even when comparisonÁüŸ‡_\ succeeds, which can result in more efficient code on some platforms. The return value is aÁüƒˆZW result indicating whether the new pointer was written. On success the pointer that wasÁüâˆTQ written is returned. On failure the actual current value and `new` are returned.Á»‰úüÉE½ÿüŠQŒ€üãŠ[ç€üËZÌü¢ŒR°‚üùŒNŒƒüÌPäƒü¡ŽB¾„èŽúüðŽ2/ [`compare_exchange`]: Atomic::compare_exchangeÁ§ú¼ÛÂú¼üÖ@¼…ü›,«åÌúôÔ¢Üô÷ùåš‘úü¢‘# let mut new = Owned::new(5678);ÁüÊ‘(% let mut ptr = a.load(SeqCst, guard);Áü÷‘HE # unsafe { drop(a.load(SeqCst, guard).into_owned()); } // avoid leakÁTÄ’ loop {ÁüÓ’HE match a.compare_exchange_weak(ptr, new, SeqCst, SeqCst, guard) {Á´ “ Ok(p) => {ÁÄ»“ ptr = p;Á´Ø“ break;Áló“
Ì…” Err(err) => {Áü£”" ptr = err.current;ÁôÊ” new = err.new;Álí”ú˜Lÿ”,—•úüŸ•)& let mut curr = a.load(SeqCst, guard);ÁTÍ•±—üÜ•TQ match a.compare_exchange_weak(curr, Shared::null(), SeqCst, SeqCst, guard) {Áܵ– Ok(_) => break,ÁüÕ–+( Err(err) => curr = err.current,ÁL…——š,“—ªšü7©ˆ<Ù—¼¬ì—ýþ ýFìâíÊ,8ܪÏýþÖCÁõªDªD ’PÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ìâíÊ,8ܪÏýÖC55
9É
:æ »c,ç´ÏÆÖCÁõ¡‚˜ïõ †˜€öTé™
ÖCÁõ$“˜É
<¡˜æ Á˜<ј¡<ì˜ ‡™\^RT’›êŒƒ¡ÖCÁõÏŽLϛꌃ¡ÖCÁõûüô«üœTQ Fetches the pointer, and then applies a function to it that returns a new value.Áüõ^[ Returns a `Result` of `Ok(previous_value)` if the function returned `Some`, else `Err(_)`.ÁØžúüàž^[ Note that the given function may be called multiple times if the value has been changed byÁüß^[ other threads in the meantime, as long as the function returns `Some(_)`, but the functionÁü¦ 96 will have been applied only once to the stored value.Áä úüì JG `fetch_update` takes two [`Ordering`] arguments to describe the memoryÁü»¡MJ ordering of this operation. The first describes the required ordering forÁü¢FC when the operation finally succeeds while the second describes theÁüØ¢LI required ordering for loads. These correspond to the success and failureÁü©£;8 orderings of [`Atomic::compare_exchange`] respectively.Áé£úüñ£FC Using [`Acquire`] as success ordering makes the store part of thisÁü¼¤KH operation [`Relaxed`], and using [`Release`] makes the final successfulÁüŒ¥HE load [`Relaxed`]. The (failed) load ordering can only be [`SeqCst`],ÁüÙ¥KH [`Acquire`] or [`Relaxed`] and must be equivalent to or weaker than theÁ¬©¦ success ordering.Áæúü˦" [`Relaxed`]: Ordering::RelaxedÁüò¦" [`Acquire`]: Ordering::AcquireÁü™§" [`Release`]: Ordering::ReleaseÁüÀ§  [`SeqCst`]: Ordering::SeqCstÁå§útí§¼Û€¨ú<ˆ¨¼ü”¨1ðäüʨ,«åû¨úôƒ©¢Üô¦©ùåÉ©úüÑ©NK let res1 = a.fetch_update(SeqCst, SeqCst, guard, |x| Some(x.with_tag(1)));ÁÔ¤ª assert!(res1.is_ok());Áêúü˪?< let res2 = a.fetch_update(SeqCst, SeqCst, guard, |x| None);ÁÜ« assert!(res2.is_err());Áü¯«4ÊÜ<諼dû«ÿ ÿFªDªD 
’PÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ìâíÊ,8ܪÏý
ÖC¥³
šš ˜¬ÍìÒ² Œ¬“"Ò²¥³üÌ­-Ò²¹´˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¥³¬ä­
˜ÖC
Ò²$™¬ set_orderÁL§¬
fail_orderÁTĬ£,â¬funcÁ$€­ˆ¬ÖØü¸¾Šüݰ`žûü±^ˆüü¥²Gðüñ²úüù²_Íýüݳ[¶þl½´šÿÏ´úü×´UR This method takes a [`CompareAndSetOrdering`] argument which describes the memoryÁü±µ ordering of this operation.ÁÕµúüݵ%" # Migrating to `compare_exchange`Á‡¶úüXU `compare_and_set` is equivalent to `compare_exchange` with the following mapping forÁ¬ì¶ memory orderings:Á†·úüŽ·  Original | Success | FailureÁü³·  -------- | ------- | -------ÁüØ·  Relaxed | Relaxed | RelaxedÁüý·  Acquire | Acquire | AcquireÁü¢¸  Release | Release | RelaxedÁüǸ  AcqRel | AcqRel | AcquireÁüì¸ SeqCst | SeqCst | SeqCstÁ¹út˜¹¼Û«¹ú<³¹¼Ü¿¹ # #![allow(deprecated)]Áüß¹@¼…ü¤º,«åÕºúôݺ¢Ü€»úôˆ»ùåü«»%ƆüÕ»FC let res1 = a.compare_and_set(curr, Shared::null(), SeqCst, guard);Áü ¼HE let res2 = a.compare_and_set(curr, Owned::new(5678), SeqCst, guard);Áüí¼7©ˆ<©½¼Use `compare_exchange` insteadÁü‘¾ üý½6|¿¾˜¾,œ FìâíÊ,8ܪÏýÖCžD  œ’PÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ìâíÊ,8ܪÏýœÖC55
9É
:æ »c,ç´ÏÆœÖCžD ¡žžϾÍìÌÀ Ó¾èœ Ö¾?ÌÀ¬•ÀÇžDÖCT·À
ÖCÌÀžD$ã¾É
<ñ¾æ ‘¿‘š¡¿£,±¿qsuwü¡Õü¥Á`žûüŠÂ^ˆüüíÂGðü¹ÃúüÁÃ^[ Unlike [`compare_and_set`], this method is allowed to spuriously fail even when comparisonÁü¤Ä_÷üˆÅZá‘üçÅTÆ’ÀÆúüÈÆU‘¶ü¢Çñ¶ÆÇúüÎÇ0- [`compare_and_set`]: Atomic::compare_and_setÁƒÈúü‹È*' # Migrating to `compare_exchange_weak`ÁºÈúüÂÈb_ `compare_and_set_weak` is equivalent to `compare_exchange_weak` with the following mapping forÁ¬©ÉǸÃÉúüËÉ ô¸üðÉ Ÿ¹ü•Ê ʹüºÊ õ¹üßÊ  ºü„Ë ˺ü©ËöºÍËútÕ˼ÛèËú<ð˼ÜüËÕ»üœÌ@¼…üáÌ,«å’ÍúôšÍ¢Üô½ÍùåàÍúüèÍ#þ•üÎ(¬–ü½ÎHß–TŠÏ±—ü™Ï?< match a.compare_and_set_weak(ptr, new, SeqCst, guard) {Á´ÝϘ˜ÄøÏ¸˜´•ÐÚ˜l°Ðú˜ÌÂБ™üàÐ"µ™ô‡Ñá™lªÑú˜L¼Ñ—š,ÊѪšÔÑúüÜÑ)ÇšTŠÒ±—ü™ÒKH match a.compare_and_set_weak(curr, Shared::null(), SeqCst, guard) {ÁÜéÒç›ü‰Ó+œL¹Ó—š,ÇÓªšüÑÓ7©ˆ<Ô¼#Use `compare_exchange_weak` insteadÁüõÔ%üáÔ;¤¨ÕˆÍ, ƒ FìâíÊ,8ܪÏýƒÖCžDÌÀ  ’PÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ìâíÊ,8ܪÏý ÖC55
9É
:æ »c,ç´ÏÆ ÖCžD ¡¡¢¢¡½Õâ ÁÕèœ ÄÕý¬ƒ×ÃT¥×
ŸÖCÌÀžD$ÑÕÉ
<ßÕæ ÿÕ‘šÖ£,ŸÖjl`bdfüìÝUü˜Ø'$ Bitwise "and" with the current tag.ÁÄØúüÌØ^[ Performs a bitwise "and" operation on the current tag and the argument `val`, and sets theÁü¯Ù85 new tag to the result. Returns the previous pointer.ÁìÙúüôÙZÃãtÓÚ¦äæÚútîÚ¼ÛÛú<‰Û¼ü•Û9¤÷üÓÛ,«å„Üú
 `£cý¡ `àB¤GS
¤£« è‚«
­ÖC$邱 ï‚ü……6¥¯¯ê² Š…ú²L–…Ïc°üÂ…8Å…ŠŒ ŠF  c cˆ¢cµ
 `£cý¡ `àB¤GS
Œ¤£® É…®
°ÖC$Ê…± Ð…ü²‡/¥²²ê² ·‡ú²LÇÙ³¼—‰üè‡'$ Returns a copy of the atomic value.Á”ˆúüœˆ[X Note that a `Relaxed` load is used here. If you need synchronization, use it with otherÁ´üˆ atomics or fences.Á,š‰ FF±  ‰±
³ÖC$¡‰ü‘Š1¥µµê² –Šú²L¢Š´¤ÉŠ<ÌŠF´´
ÖCü€‹8¥¸¸ê² …‹ú²L‘‹ë¹üÚ ü¿‹52 Returns a new atomic pointer pointing to `owned`.Áù‹útŒ¼Û”Œú<œŒ¼ü¨Œ)& use crossbeam_epoch::{Atomic, Owned};ÁÖŒúüÞŒ2/ let a = Atomic::<i32>::from(Owned::new(1234));Áü•4Êܼ‚GF··
¹ÖCownedÁ,âüàŽ"¥»»± åŽë¼Ô‰ÇGFºº
¼ÖC­ ìÒ¥¾¾± ×F¿ë¿¬öÖCF½½
¿ÖC¿ þü¬A
Á¥ÂÂÁÕž µížÅHÃëñ#%üÚ’#üô30 Returns a new atomic pointer pointing to `ptr`.Á¬‘út´‘¼ÛÇ‘ú<Ï‘¼üÛ‘*' use crossbeam_epoch::{Atomic, Shared};ÁŠ’úü’’74 let a = Atomic::<i32>::from(Shared::<i32>::null());Á<Î’¼$Ý’ûHÅHÀÀ
Ã
˜Dµ â’ü¬“$¥Åű ±“ëÆôÆ•üד30 Returns a new atomic pointer pointing to `raw`.Áút—”¼Ûª”ú<²”¼Œ¾” use std::ptr;ÁüÔ” íÛù”úü41 let a = Atomic::<i32>::from(ptr::null::<i32>());Á<º•¼$É•ÆIFÄÄ
ÆÖC@ΕüÌ–(ü—–41 A trait for either `Owned` or `Shared` pointers.Á<Ö–Ç¥ÈÇȪ«üÌ–ÌÕž Þ–ížLê–Ǫ«-ª«ÊÉÊÊÉ=?ì¶—üû–63 Returns the machine representation of the pointer.ÁT¹—²«Ô_ÇÇ
ɲ«˜D$Ä—üì™*üÙ—@= Returns a new pointer pointing to the tagged pointer `data`.Áž˜úd¦˜™À·˜úü¿˜_\ The given `data` should have been created by `Pointer::into_usize()`, and one `data` shouldÁü£™DA not be converted back by `Pointer::from_usize()` multiple times.ÁTö™Ô_²«ÇÇ
ʲ«˜Dâ$šüÿ›'üšš# An owned heap-allocated object.Á¾šúüš*' This type is very similar to `Box<T>`.ÁíšúüñšbþÓüÔ›*' least significant bits of the address.Á,Šœ¥ÌÌê² œú²Lœœ‚GݶçPrhìþÍÎá,.\­œ$­œËËÔ_侜<¾œËË’bFu\»ŸÇGüßœ3¥ÐÐê² äœú²Lðœ‚GÑÒÉÊÑÒ')ä§‚GÔ_ÏÏ
ÑÖCü½Ÿ)ü—ž@¸‹Üžúdäž¿åõžúüýž-* Panics if the data is zero in debug mode.ÁTÇŸÔ_‚GÏÏ
ÒÖCâ$ÒŸ„‚¡¥ÔÔ± ‡¡‚GÕÖ×ü÷¦/ü™¡2/ Returns a new owned pointer pointing to `raw`.ÁСúüØ¡\Y This function is unsafe because improper use may lead to memory problems. Argument `raw`Áü¹¢]Z must be a valid pointer. Also, a double-free may occur if the function is called twice onÁÌ›£ the same raw pointer.Á¹£údÁ£¿åÒ£úüÚ£,) Panics if `raw` is not properly aligned.Á‹¤úd“¤™À¤¤úü¬
 `£cý¡ `àB¤GS
¤£â ž½â
äÖC$Ÿ½± ¥½üŠ¿!¥ææ± ¿ØÖC,’¿‚GçÙç#%¼²¿,µ¿ ‚G‚Gå »¿å
çÖC$¼¿üÀ.¥ééê² ”Àú²L À‚Gêëê!ë!ë#%\ÄÀ4ÉÀèèÖC¬ÚÀ,ÝÀ ‚G ÖCè ãÀè
ëÖC$äÀüÒÁ1¥ííê² ×Áú²LãÁ‚Gî÷!îüŠÂ!L ‚G ÖCì —Âì
îÖC$œÂä’Ã¥ð𱠗ÂGñëñ¬µÃ$¸ÃÖC‚Gïï
ñÖC¿ ½ÃüìÃ!¥óó± ñÂGôëôÔ߯ü”Ä0- Returns a new owned pointer pointing to `b`.ÁÉÄúdÑÄ¿åâÄúüêÄ>; Panics if the pointer (the `Box`) is not properly aligned.Á­ÅútµÅ¼ÛÈÅú<ÐżüÜÅǼ€ÆúüˆÆF‚š<ÓÆ¼$âÆÇG‚Gòò
ôÖC­ çÆü¹Ç2¥ööê² ¾Çú²LÊÇ‚G÷¢÷´òÇ4õÇ ‚G ÖCõ üÇõ
÷ÖC$ýÇü©È5¥ùùê² ®Èú²LºÈ‚Gú¥úüåÈ"TèÈ ‚G ÖCø óÈø
úÖC$øÈü¬É1¥üüê² ±Éú²L½É‚Gýâý´äÉ4çɘ ˜‚G ˜ÖCû îÉû
ýÖC$ïÉü›Ê1¥ÿÿê²  Êú²L¬Ê‚G€åôÓÊ4ÖÊ ‚G ÖCþ ÝÊþ
ÖC$âÊü¢Í1ü–Ë52 A pointer to an object protected by the epoch GC.ÁÌËúüÐË?< The pointer is valid for use only during the lifetime `'g`.ÁÌúü”ÌbþÓü÷Ì*¾4­Í
¥ƒƒÕž ¸ÍŸOížLÉÍûHÊ,8ܪÏý´Í79\ÚÍ$ÚÍÔ_üëÍ(<ëÍ’bFu\»Ÿ 
¢dÀKü˜Î38š¥šÕž ÎížL©ÎßJˆÙˆ¼ÒÎ,ÕÎ ßJßJ ÛÎ
ˆ8˜D$ÜÎüƒÏ28œ¥ŠœŠÕž ˆÏížL”ÏßJüºÏ88¥ŒŒÕž ¿ÏížLËÏßJŽÉÊŽ')ä‡ÐTŠÐßJÔ_
8˜D$•ÐüÑÐ)TÛÐÔ_ßJ
Ž8˜Dâ$æÐÌÕÑ
¥Øœ ÞÑûH’ÚÑüýÕ üõÑ<9 Converts the pointer to a raw pointer (without the tag).Á¶Òút¾Ò¼ÛÑÒú<ÙÒ¼üåÒ85 use crossbeam_epoch::{self as epoch, Atomic, Owned};Áü¢Ó,«åÓÓúìÛÓ°œôýÓ let raw = &*o as *const _;Áä Ô let a = Atomic::from(o);ÁÁÔúôÉÔùåüìÔ"¡æü“Õ  assert_eq!(p.as_raw(), raw);Áü¸Õ4ÊÜ<ñÕ¼4„Öž žûHÀK ‹Ö

˜D$ŒÖü÷Ö-
¥Õž €×ížLŒ×ûH–˜šœžüÖ35ôüØü«× Returns a new null pointer.ÁÏ×út××¼Ûê×ú<ò×¼üþ×  use crossbeam_epoch::Shared;Á£Øúü«Ø" let p = Shared::<i32>::null();ÁÌÒØ assert!(p.is_null());Á<ðؼ$ƒÙûH

˜DìæÝüúÙ*' Returns `true` if the pointer is null.Á©Úút±Ú¼ÛÄÚú<ÌÚ¼üØÚ8ØÆü•Û,«åÆÛúÜÎÛ let a = Atomic::null();ÁôîÛùå
,œüœ08¨¥§¨§Õž ÇœížLÓœßJü÷œK
©¥ª©ªÕž ížûH«ïß«üœ$&üÉ<©ª ©ûH ªûHÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¿ßÀßÁßLessÁÂßÃßÄß~Å߯ßÇßGreaterÁÈßåºÝÈnûê7¨ ب
«
˜D¹
ü¼ž18«¥­­«Õž ÁžížLÍžßJ®»®üôž,÷ž¬­ ¬ßJ ­ßJ烬 ûž¬
®8˜D$üž¹
,‚ŸüÏŸ88®¥°°®Õž ÔŸížLàŸßJ±Àc±üŽ 8‘ ¯°± ¯ßJ ° c cˆ¢cµ
 `£cý¡ `àB¤GS
±¤£¯ • ¯
±8˜D$– ± œ ü‚¢:8²¥³²³Õž ‡¢ížL“¢ßJ´Ïc´üâ8Æ¢³´µ ³ßJ ´ c cˆ¢cµ
 `£cý¡ `àB¤GS
µ¤£² Ê¢²
´8˜D$Ë¢± Ñ¢üÌ£58¥Õž Ñ£ížLÝ£ßJ·´·¤ˆ¤<‹¤ßJµµ
·8˜Dl¨,»¤Œø+óµ Ì‹,ü÷+.üî+9L¬,¿Ï׳ `¸¹¨#,˸ºæ(4è丼ð),ð︽K†J¸¾L­lœ½]|ÖNP=?Üü1¤Àüš%" An epoch-based garbage collector.ÁLêðL¹ƒ~/ôÀôÛ¿¿†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdèääæ(åô(®æ‚)®çî! ɼ÷XBš‹Hôþ›Lô ›LÔÛLĴĤä›LÃÃ
Ä›LÆÇ¤€äß Creates a new collector.Á›LÅÅ
Æüì%üº-* Registers a new handle for the collector.ÁDó· ·›LMÅ üÅ
ÇÄ»›LÉÙɼ›üÚ<9 Creates another reference to the same garbage collector.Á,ž¸ ¸›L›LÈ ¤È
Éì… ›LËÀcËü© 8¬ ¹º» ¹›L º c cˆ¢cµ
 `£cý¡ `àB¤GS
»¤£Ê ° Ê
˱ · ä
›LÍ·ßÍüî
%ü²
74 Checks if both handles point to the same collector.Áñ
¼½ ¼›L ½›LÌ ô
Ì
Í
rhsÁû
¬Í ›L´Œ üç $! A handle to a garbage collector.Á\— Mk8,g
öÀÐÖô©  ÏÏ’q„Ì ÓÔÔŠ
¤ã  Pins the handle.Á
¾ ¾M’PÑ
Ñ
Ò$
ü—üÙ
+( Returns `true` if the handle is pinned.ÁLž¿ ¿MÑ ¨Ñ
Óü¼%üñ85 Returns the `Collector` associated with this handle.ÁLÃÀ ÀM À›LÑ ÍÑ
ÔÌš"Ö”ÈÁ ÁM¢dÕ ÐÕ
Öü²ÀcØüØ8ÛÂÃÄ ÂM àc cˆ¢cµ
 `£cý¡ `àB¤GS
Ĥ£× ß×
ر ædñ,»¤ŒÁ,óµ ÌÔ,üÀ,.ü·,9Dõ,áâäÕFÙÚ×! `ÙÛ’b\8ÙÜ’bÙÜí$UëÙÞÂD\[ÑÛÙßµ sÙàŒŽLÌ*pLILO=?Lm/¼ôÙÔ_LËÙÔ_ãÔ_Ô•ÍMÐ¥0ß”CWåæçĶÙää›d¼ÔÙääÑÛÑÛÂDÓÛ×DÝÔÛ»ÝÍõƒ«%9§ ìñÙää¥fä¤ÍMéÀcéüÇCÊÅÆÇ ÅÍM Æ c cˆ¢cµ
 `£cý¡ `àB¤GS
Ǥ£è Îè
é± ÕÍMëíóäËêêÍMäôÙžd¢dd_rawÁ$üÙ ,ç ÍMêîîêÍìߤ ë –"ߤ¢dߤ¢d˜"¢d
íߤ± ø ;=üÍ )$× Ùžd¢dðð‡¥ Ü ˜¥ «¥
ïߤ@é "$üÊ)Ùžd¢dòò‡¥ Ù˜¥«¥
ñߤ@æ"$äìÍM¢dêê
óL¹-»¤Œ‰-óµ Ìœ-üˆ-.üÿ,9,½-»¬ß”\“
„Äôö®
¼Àô÷ôò
35
šNùúûüýþü

šNøø
ùüÔ
4
šNšNøø
ú
›–õ
ü•%

šNøø
û$­
ü©#