+
    ÂHàj»;  ã                  óz  € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
HtHt RR.t^RIHt ^R	IHtHtHtHtHtHtHtHtHtHtHtHtHtHt ]
'       d   ^ R
IH t  ]PB                  R*8¬  ;'       d
    ]"! ]R4      t#^ t$ ! R R]4      t%]! RR7      R R l4       t&]! RR7      R R l4       t']! RR7      R R l4       t(]! RR7      R R l4       t)]! RR7      R R l4       t* ! R R]4      t+]! RR7      R R l4       t,R R lt-R+R  R! llt.R+R" R# llt/R$ R% lt0R& R' lt1R+R( R) llt2]#'       d   ].t3R# ]/t3R# ),zú
Grapheme cluster segmentation following Unicode Standard Annex #29.

This module provides pure-Python implementation of the grapheme cluster boundary algorithm as
defined in UAX #29: Unicode Text Segmentation.

https://www.unicode.org/reports/tr29/
)ÚannotationsN)ÚIntEnum)Ú	lru_cache)ÚTYPE_CHECKINGÚOptionalÚ
NamedTuplezwcwidth.bisearchzwcwidth.table_grapheme)Úbisearch)Ú
GRAPHEME_LÚ
GRAPHEME_TÚ
GRAPHEME_VÚGRAPHEME_LVÚINCB_EXTENDÚINCB_LINKERÚGRAPHEME_LVTÚINCB_CONSONANTÚGRAPHEME_EXTENDÚGRAPHEME_CONTROLÚGRAPHEME_PREPENDÚGRAPHEME_SPACINGMARKÚEXTENDED_PICTOGRAPHICÚGRAPHEME_REGIONAL_INDICATOR)ÚIteratorÚiter_graphemesc                  óR   € ] tR t^8tRt^ t^t^t^t^t	^t
^t^t^t^	t^
t^t^t^tRtR# )ÚGCBz'Grapheme Cluster Break property values.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚOTHERÚCRÚLFÚCONTROLÚEXTENDÚZWJÚREGIONAL_INDICATORÚPREPENDÚSPACING_MARKÚLÚVÚTÚLVÚLVTÚ__static_attributes__r   ó    Ú’/home/ubuntu/.hermes/installs/5f0a1ff4045d044e/environments/88679baa1dc64374a0cd943b62eeefb9/venv/lib/python3.14/site-packages/wcwidth/grapheme.pyr   r   8   sL   † Ù1à€EØ	
€BØ	
€BØ€GØ€FØ
€CØÐØ€GØ€LØ	€AØ
€AØ
€AØ	€BØ
„Cr0   r   i   )Úmaxsizec               ó    € V ^8„  d   QhRRRR/# )é   ÚucsÚintÚreturnr   r   )Úformats   "r1   Ú__annotate__r9   O   s   € ÷ ñ  ð ¨ñ r0   c                ó¤  € V ^8X  d   \         P                  # V ^
8X  d   \         P                  # V R8X  d   \         P                  # \	        V \
        4      '       d   \         P                  # \	        V \        4      '       d   \         P                  # \	        V \        4      '       d   \         P                  # \	        V \        4      '       d   \         P                  # \	        V \        4      '       d   \         P                  # \	        V \        4      '       d   \         P                   # \	        V \"        4      '       d   \         P$                  # \	        V \&        4      '       d   \         P(                  # \	        V \*        4      '       d   \         P,                  # \	        V \.        4      '       d   \         P0                  # \         P2                  # )z;Return the Grapheme_Cluster_Break property for a codepoint.i   )r   r"   r#   r&   Ú	_bisearchr   r$   r   r%   r   r'   r   r(   r   r)   r	   r*   r   r+   r
   r,   r   r-   r   r.   r!   ©r5   s   &r1   Ú_grapheme_cluster_breakr=   N   s'  € ð
 ˆf„}Ü�v‰vˆØ
ˆf„}Ü�v‰vˆØ
ˆf„}Ü�w‰wˆä�Ô&×'Ò'Ü�{‰{ÐÜ�”o×&Ò&Ü�z‰zÐÜ�Ô1×2Ò2Ü×%Ñ%Ð%Ü�Ô&×'Ò'Ü�{‰{ÐÜ�Ô*×+Ò+Ü×ÑÐÜ�”j×!Ò!Ü�u‰uˆÜ�”j×!Ò!Ü�u‰uˆÜ�”j×!Ò!Ü�u‰uˆÜ�”k×"Ò"Ü�v‰vˆÜ�”l×#Ò#Ü�w‰wˆÜ�9‰9Ðr0   c               ó    € V ^8„  d   QhRRRR/# ©r4   r5   r6   r7   Úboolr   )r8   s   "r1   r9   r9   r   s   € ÷ 7ñ 7 3ð 7¨4ñ 7r0   c                ó4   € \        \        V \        4      4      # )z6Check if codepoint has Extended_Pictographic property.)r@   r;   r   r<   s   &r1   Ú_is_extended_pictographicrB   q   s   € ô ”	˜#Ô4Ó5Ó6Ð6r0   c               ó    € V ^8„  d   QhRRRR/# r?   r   )r8   s   "r1   r9   r9   x   ó   € ÷ -ñ -˜ð - ñ -r0   c                ó4   € \        \        V \        4      4      # )z,Check if codepoint has InCB=Linker property.)r@   r;   r   r<   s   &r1   Ú_is_incb_linkerrF   w   ó   € ô ”	˜#œ{Ó+Ó,Ð,r0   c               ó    € V ^8„  d   QhRRRR/# r?   r   )r8   s   "r1   r9   r9   ~   s   € ÷ 0ñ 0˜Cð 0 Dñ 0r0   c                ó4   € \        \        V \        4      4      # )z/Check if codepoint has InCB=Consonant property.)r@   r;   r   r<   s   &r1   Ú_is_incb_consonantrJ   }   s   € ô ”	˜#œ~Ó.Ó/Ð/r0   c               ó    € V ^8„  d   QhRRRR/# r?   r   )r8   s   "r1   r9   r9   „   rD   r0   c                ó4   € \        \        V \        4      4      # )z,Check if codepoint has InCB=Extend property.)r@   r;   r   r<   s   &r1   Ú_is_incb_extendrM   ƒ   rG   r0   c                  ó0   € ] tR t^‰t$ RtR]R&   R]R&   RtR# )ÚBreakResultz*Result of grapheme cluster break decision.r@   Úshould_breakr6   Úri_countr   N)r   r   r   r   r    Ú__annotations__r/   r   r0   r1   rO   rO   ‰   s   ‡ Ù4àÓØ‡Mr0   rO   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   Úprev_gcbr   Úcurr_gcbr7   zOptional[BreakResult]r   )r8   s   "r1   r9   r9   ‘   s"   € ÷ -ñ - #ð -°ð -Ð9Nñ -r0   c                óJ  € V \         P                  8X  d#   V\         P                  8X  d   \        R^ R7      # V \         P                  \         P                  \         P                  39   d   \        R^ R7      # V\         P                  \         P                  \         P                  39   d   \        R^ R7      # V \         P
                  8X  dQ   V\         P
                  \         P                  \         P                  \         P                  39   d   \        R^ R7      # V \         P                  \         P                  39   d3   V\         P                  \         P                  39   d   \        R^ R7      # V \         P                  \         P                  39   d#   V\         P                  8X  d   \        R^ R7      # V\         P                  8X  d   \        R^ R7      # V\         P                  8X  d   \        R^ R7      # V \         P                  8X  d   \        R^ R7      # R# )zÊ
Check simple GCB-pair-based break rules (cacheable).

Returns BreakResult for rules that can be determined from GCB properties alone, or None if
complex lookback rules (GB9c, GB11) need to be checked.
F©rP   rQ   TN)r   r"   r#   rO   r$   r*   r+   r-   r.   r,   r%   r)   r(   )rT   rU   s   &&r1   Ú_simple_break_checkrX   �   st  € ð ”3—6‘6Ô˜h¬#¯&©&Ô0Ü¨¸Ô:Ð:ð ”C—K‘K¤§¡¬¯©Ð0Ô0Ü¨°qÔ9Ð9ð ”C—K‘K¤§¡¬¯©Ð0Ô0Ü¨°qÔ9Ð9ð ”3—5‘5Ô˜X¬#¯%©%´·±¼¿¹ÄÇÁÐ)HÔHÜ¨¸Ô:Ð:ð ”C—F‘FœCŸE™E�?Ô" x´C·E±E¼3¿5¹5°>Ô'AÜ¨¸Ô:Ð:ð ”C—G‘GœSŸU™UÐ#Ô#¨´C·E±EÔ(9Ü¨¸Ô:Ð:ð ”3—:‘:ÔÜ¨¸Ô:Ð:ð ”3×#Ñ#Ô#Ü¨¸Ô:Ð:ð ”3—;‘;ÔÜ¨¸Ô:Ð:ñ r0   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r4   rT   r   rU   ÚtextÚstrÚcurr_idxr6   rQ   r7   rO   r   )r8   s   "r1   r9   r9   Á   sL   € ÷ @=ñ @=Øð@=àð@=ð ð@=ð ð	@=ð
 ð@=ð ñ@=r0   c                óÖ  € \        W4      pVe   V# V\        P                  8X  d   \        R^ R7      # \	        W#,          4      p\        V4      '       d†   RpV^,
          pV^ 8¼  dt   \	        W(,          4      p	\        V	4      '       d   RpV^,          pK6  \        V	4      '       d   V^,          pKR  \        V	4      '       d   V'       d   \        R^ R7      # M V \        P                  8X  d}   \        V4      '       dl   V^,
          pV^ 8¼  d\   \	        W(,          4      p	\        V	4      p
V
\        P                  8X  d   V^,          pKC  \        V	4      '       d   \        R^ R7      #  V \        P                  8X  dE   V\        P                  8X  d0   V^,          ^8X  d   \        RV^,           R7      # \        R^R7      # V\        P                  8X  d   ^M^ p\        RVR7      # )zƒ
Determine if there should be a grapheme cluster break between prev and curr.

Implements UAX #29 grapheme cluster boundary rules.
FrW   T)rX   r   r&   rO   ÚordrJ   rF   rM   rB   r=   r%   r'   )rT   rU   rZ   r\   rQ   ÚresultÚcurr_ucsÚ
has_linkerÚiÚprev_ucsÚ	prev_props   &&&&&      r1   Ú_should_breakre   Á   s“  € ô ! Ó4€FØÒØˆð ”3—7‘7ÔÜ¨¸Ô:Ð:ô
 �4•>Ó"€HÜ˜(×#Ò#Øˆ
Ø�q�LˆØ�1ŒfÜ˜4�7“|ˆHÜ˜x×(Ò(Ø!�
Ø�Q•’Ü  ×*Ò*Ø�Q•’Ü# H×-Ò-ßÜ&°EÀAÔFÐFØàð ”3—7‘7ÔÔ8¸×BÒBØ�q�LˆØ�1ŒfÜ˜4�7“|ˆHÜ/°Ó9ˆIØœCŸJ™JÔ&Ø�Q•’Ü*¨8×4Ò4Ü"°ÀÔBÐBàð ”3×)Ñ)Ô)¨h¼#×:PÑ:PÔ.PØ�a�<˜1ÔÜ¨E¸HÀq½LÔIÐIÜ¨°qÔ9Ð9ð ¤× 6Ñ 6Ô6‰q¸A€HÜ D°8Ô<Ð<r0   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r4   Úunistrr[   Ústartr6   ÚendzOptional[int]r7   úIterator[str]r   )r8   s   "r1   r9   r9     s0   € ÷ +.ñ +.Øð+.àð+.ð 
ð+.ð ñ	+.r0   c              #  óì   "  € V '       g   R# \        V 4      pVf   TpW8¼  g   W8¼  d   R# \        W#4      pWV p\        P                  ! V4       F  pWEP                  VP
                   x € K  	  R# 5i©a%  
Iterate over grapheme clusters using :func:`unicodedata.iter_graphemes`.

Grapheme clusters are "user-perceived characters" - what a user would
consider a single character, which may consist of multiple Unicode
codepoints (e.g., a base character with combining marks, emoji sequences).

:param unistr: The Unicode string to segment.
:param start: Starting index (default 0).
:param end: Ending index (default len(unistr)).
:yields: Grapheme cluster substrings.

Example::

    >>> list(iter_graphemes('cafe\u0301'))
    ['c', 'a', 'f', 'e\u0301']
    >>> list(iter_graphemes('ok\U0001F468\u200D\U0001F469\u200D\U0001F467'))
    ['o', 'k', '\U0001F468\u200D\U0001F469\u200D\U0001F467']
    >>> list(iter_graphemes('ok\U0001F1FA\U0001F1F8'))
    ['o', 'k', '\U0001F1FA\U0001F1F8']

.. versionadded:: 0.3.0
N)ÚlenÚminÚunicodedatar   ri   rj   )rh   ri   rj   ÚlengthÚfull_segmentÚsegs   &&&   r1   Ú_iter_graphemes_stdlibrt     sh   é € ÷8 Ùä�‹[€Fà
‚{Øˆà„|�u”Ùä
ˆcÓ
€Cà Ð$€LÜ×)Ò)¨,Ö7ˆØŸ9™9 S§W¡WÐ-Ô-ó 8ùs   ‚A2A4c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r4   rh   r[   ri   r6   rj   z
int | Noner7   rk   r   )r8   s   "r1   r9   r9   2  s6   € ÷ A$ñ A$ØðA$àðA$ð 
ðA$ð ñ	A$r0   c              #  ó¾  "  € V '       g   R# \        V 4      pVf   TpW8¼  g   W8¼  d   R# \        W#4      pTp^ p\        \        W,          4      4      pV\        P
                  8X  d   ^p\        V^,           V4       FR  p\        \        W,          4      4      p\        WhWV4      p	V	P                  pV	P                  '       d	   WV x € TpTpKT  	  WV x € R# 5irm   )
rn   ro   r=   r^   r   r'   Úrangere   rQ   rP   )
rh   ri   rj   rq   Úcluster_startrQ   rT   ÚidxrU   r_   s
   &&&       r1   Ú_iter_graphemes_pythonrz   2  sÕ   é € ÷8 Ùä�‹[€Fà
‚{Øˆà„|�u”Ùä
ˆcÓ
€Cð €MØ€Hô '¤s¨6­=Ó'9Ó:€Hð ”3×)Ñ)Ô)Øˆä�U˜Q•Y Ö$ˆÜ*¬3¨v­{Ó+;Ó<ˆä˜x°6ÀÓIˆØ—?‘?ˆà××ÐØ sÐ+Ò+ØˆMàŠñ %ð ˜sÐ
#Ô#ùs   ‚CCc               ó$   € V ^8„  d   QhRRRRRR/# )r4   rZ   r[   Úposr6   r7   r   )r8   s   "r1   r9   r9   v  s!   € ÷ 1ñ 1˜cð 1¨ð 1°ñ 1r0   c                ót  € \        W^,
          ,          4      pV^
8X  d%   V^8¼  d   W^,
          ,          R8X  d
   V^,
          # V^€8  dg   V^8¼  dW   V^ 8¼  dP   \        W^,
          ,          4      pV^€8¼  d1   \        V4      \        P                  8X  d   \	        W^,
          4      # V^,
          # V^,
          pV^ 8”  d`   W,
          \
        8  dO   \        W,          4      p^ Tu;8:  d   ^€8  d   M MM*\        V4      \        P                  8X  d   MV^,          pKf  Tp\        \        W,          4      4      pV\        P                  8X  d   ^M^ p\        V^,           V4       FL  p	\        \        W	,          4      4      p
\        WzW	V4      pVP                  pVP                  '       d   T	pT
pKN  	  V# )ac  
Find the start of the grapheme cluster containing the character before pos.

Scans backwards from pos to find a safe starting point, then iterates forward using standard
break rules to find the actual cluster boundary.

:param text: The Unicode string.
:param pos: Position to search before (exclusive).
:returns: Start position of the grapheme cluster.
Ú)r^   r=   r   r(   Ú_find_cluster_startÚMAX_GRAPHEME_SCANr$   r'   rw   re   rQ   rP   )rZ   r|   Ú	target_cpÚprev_cpÚ
safe_startÚcprx   Úleft_gcbrQ   rb   Ú	right_gcbr_   s   &&          r1   r   r   v  sp  € ô �D˜q�•MÓ"€Ið �DÔ˜S AœX¨$°Q­w­-¸4Ô*?Ø�Q�wˆð �4Ôà�!Œ8˜	 TÔ)Ü˜$ Q�w�-Ó(ˆGØ˜$ŒÔ#:¸7Ó#CÄsÇ{Á{Ô#RÜ*¨4°qµÓ9Ð9Ø�Q�wˆð �q•€JØ
�qŒ.˜cÕ.Ô2CÔCÜ�Õ!Ó"ˆØ�2Ö˜×ØÜ" 2Ó&¬#¯+©+Ô5ØØ�a�Š
ð €MÜ&¤s¨4Õ+;Ó'<Ó=€HØ¤× 6Ñ 6Ô6‰q¸A€Hä�: •> 3Ö'ˆÜ+¬C°µ«LÓ9ˆ	Ü˜x°D¸XÓFˆØ—?‘?ˆØ××ÐØˆMØŠñ (ð Ðr0   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   rh   r[   r|   r6   r7   r   )r8   s   "r1   r9   r9   ª  s!   € ÷ >ñ > Sð >¨sð >°sñ >r0   c           	     óR   € V^ 8:  d   ^ # \        V \        V\        V 4      4      4      # )a   
Find the grapheme cluster boundary immediately before a position.

:param unistr: The Unicode string to search.
:param pos: Position in the string (0 < pos <= len(unistr)).
:returns: Start index of the grapheme cluster containing the character at pos-1.

Example::

    >>> grapheme_boundary_before('Hello \U0001F44B\U0001F3FB', 8)
    6
    >>> grapheme_boundary_before('a\r\nb', 3)
    1

.. versionadded:: 0.3.6
)r   ro   rn   )rh   r|   s   &&r1   Úgrapheme_boundary_beforer‰   ª  s&   € ð" ˆa„xÙÜ˜v¤s¨3´°F³Ó'<Ó=Ð=r0   c               ó(   € V ^8„  d   QhRRRRRRRR/# rg   r   )r8   s   "r1   r9   r9   À  s0   € ÷ &ñ &Øð&àð&ð 
ð&ð ñ	&r0   c              #  óØ   "  € V '       g   R# \        V 4      pVf   TM
\        W#4      p\        V^ 4      pW8¼  g   W8¼  d   R# TpWA8”  d   \        W4      pWQ8  d   R# WV x € TpK#  R# 5i)ay  
Iterate over grapheme clusters in reverse order (last to first).

:param unistr: The Unicode string to segment.
:param start: Starting index (default 0).
:param end: Ending index (default len(unistr)).
:yields: Grapheme cluster substrings in reverse order.

Example::

    >>> list(iter_graphemes_reverse('cafe\u0301'))
    ['e\u0301', 'f', 'a', 'c']

.. versionadded:: 0.3.6
N)rn   ro   Úmaxr   )rh   ri   rj   rq   r|   rx   s   &&&   r1   Úiter_graphemes_reverser�   À  so   é € ÷( Ùä�‹[€Fà’K‰&¤S¨Ó%5€CÜ��q‹M€Eà„|�u”Ùà
€CØ
Œ+Ü+¨FÓ8ˆàÔ ÙØ 3Ð'Ò'ØŠñ ùs   ‚A(A*)é   é   )é    N)4r    Ú
__future__r   Úsysrp   Úenumr   Ú	functoolsr   Útypingr   r   r   Ú__lazy_modules__r   r;   Útable_graphemer	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Úcollections.abcr   Úversion_infoÚhasattrÚ_HAS_PYTHON315_ITER_GRAPHEMESr€   r   r=   rB   rF   rJ   rM   rO   rX   re   rt   rz   r   r‰   r�   r   r   r0   r1   Ú<module>rœ      sp  ðñõ #ó Û Ý Ý ç 6Ñ 6ð ØðÐ õ
 ,÷:÷ :÷ :÷ :÷ å(ð ×Ñ˜Ñ÷ /ð /Ù�Ð-Ó.ð ð Ð ôˆ'ô ñ, �4Ôôó ðñD �4Ôô7ó ð7ñ
 �4Ôô-ó ð-ñ
 �4Ôô0ó ð0ñ
 �4Ôô-ó ð-ô
�*ô ñ �4Ôô-ó ð-õ`@=÷F+.÷\A$õH1õh>÷,&÷V <Ðò à	ò r0   