ó
    Eñi&›  ã                   óð  • S SK r S SKrS SKr SSKJr  \R                  r\R                  rSr	Sr
SrSr \R                  r\R$                  r\R(                  \S4   r\R.                  \   r\R.                  \   r\R.                  \   r\R.                  \   r\R.                  \R>                     r      S@S	\RB                  S
\
S\S\RD                  S\#S\$4S jjr%      SAS	\RB                  S
\
S\S\RD                  S\#S\$4S jjr&    SBS	\RB                  S
\
S\S\RD                  S\4
S jjr' SCS	\RB                  S\
S\RD                  S\4S jjr(  SDS	\RB                  S\	S\	S
\
S\RD                  4
S jjr)     SES	\RB                  S\S\S\S\#S\S\RD                  4S jjr* SFSSSSSSS.S	\RB                  S\S
\
S\S\RD                  S\#4S jjjr+SCS\4S  jjr,S!\S"\S\4S# jr-S	\RB                  S$\S\4S% jr.S\$4S& jr/S\$4S' jr0S(\S\14S) jr2S(\S\14S* jr3S+\Rh                  S!\S\14S, jr5S- r6 S. r7S/ r8S\4S0 jr9S\4S1 jr:S2\S\4S3 jr;S4\1S5\S6\1S\Rx                  4S7 jr=S4\1S5\S\Rx                  4S8 jr>SCS9\S:\$S\Rx                  4S; jjr?SCS4\1S5\S<\$S\Rx                  4S= jjr@S4\1S5\S>\S\Rx                  4S? jrAg! \ a    S SKr GNËf = f! \ a    \\-  \-  r GN³f = f)Gé    Né   )ÚpymupdfÚ
point_likeÚ	rect_likeÚmatrix_likeÚ	quad_likeFÚpageÚclipÚflagsÚtextpageÚsortÚreturnc                 ó  • [         R                  " U 5        Uc  [         R                  nUnUc  U R                  XS9nO[	        US5      U :w  a  [        S5      eUR                  5       nUc  AU(       a  UR                  S S9  U$ )a?  Return the text blocks on a page.

Notes:
    Lines in a block are concatenated with line breaks.
Args:
    flags: (int) control the amount of data parsed into the textpage.
Returns:
    A list of the blocks. Each item contains the containing rectangle
    coordinates, text lines, running block number and block type.
©r
   r   Úparentúnot a textpage of this pagec                 ó   • U S   U S   4$ ©Né   r   © )Úbs    ÚJ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pymupdf/utils.pyÚ<lambda>Ú!get_text_blocks.<locals>.<lambda>N   s   €  1 Q¡4¨¨1©¡,ó    ©Úkey)r   ÚCheckParentÚTEXTFLAGS_BLOCKSÚget_textpageÚgetattrÚ
ValueErrorÚextractBLOCKSr   )r	   r
   r   r   r   ÚtpÚblockss          r   Úget_text_blocksr&   0   sˆ   € ô" ×Ò˜ÔØ�}Ü×(Ñ(ˆØ	€BØ	�zØ×Ñ DÐÐ6‰Ü	��XÓ	 $Ó	&ÜÐ6Ó7Ð7à×ÑÓ€FØÑØÞØ�‰Ñ.ˆÑ/Ø€Mr   r   c                 óô  ^• U4S jn[         R                  " U 5        Uc  [         R                  nUnUc  U R                  XS9nO[	        US5      U :w  a  [        S5      eUR                  U5      n	Ubd  Uba  [         R                  " U5      nU	 V
s/ s H>  n
[        XSS -  5      S[        [         R                  " U
SS 5      5      -  :¼  d  M<  U
PM@     n	n
Uc  AU	(       a  U(       a  U" U	5      n	U	$ s  sn
f )ah  Return the text words as a list with the bbox for each word.

Args:
    page: pymupdf.Page
    clip: (rect-like) area on page to consider
    flags: (int) control the amount of data parsed into the textpage.
    textpage: (pymupdf.TextPage) either passed-in or None.
    sort: (bool) sort the words in reading sequence.
    delimiters: (str,list) characters to use as word delimiters.
    tolerance: (float) consider words to be part of the same line if
        top or bottom coordinate are not larger than this. Relevant
        only if sort=True.

Returns:
    Word tuples (x0, y0, x1, y1, "word", bno, lno, wno).
c                 ó  >• U R                  S S9  / nU S   /n[        R                  " U S   SS 5      nU SS  H¥  n[        R                  " USS 5      n[        UR                  UR                  -
  5      T::  d&  [        UR
                  UR
                  -
  5      T::  a  UR                  U5        X5-  nM  UR                  S S9  UR                  U5        U/nUnM§     UR                  S S9  UR                  U5        U$ )	z1Sort words line-wise, forgiving small deviations.c                 ó   • U S   U S   4$ r   r   ©Úws    r   r   Ú4get_text_words.<locals>.sort_words.<locals>.<lambda>n   s   €  ! A¡$¨¨!©¡r   r   r   Né   r   c                 ó   • U S   $ ©Nr   r   r*   s    r   r   r,   {   s   € ¨¨!ªr   c                 ó   • U S   $ r/   r   r*   s    r   r   r,   €   s   €   !¢r   )r   r   ÚRectÚabsÚy0Úy1ÚappendÚextend)ÚwordsÚnwordsÚlineÚlrectr+   ÚwrectÚ	tolerances         €r   Ú
sort_wordsÚ"get_text_words.<locals>.sort_wordsl   së   ø€ à�
‰
Ñ-ˆ
Ñ.ØˆØ�a‘ˆzˆÜ—’˜U 1™X b q˜\Ó*ˆØ�q�r“ˆAÜ—L’L  2 A Ó'ˆEä�E—H‘H˜uŸx™xÑ'Ó(¨IÓ5Ü�u—x‘x %§(¡(Ñ*Ó+¨yÓ8à—‘˜A”Ø‘’à—	‘	™n�	Ñ-Ø—‘˜dÔ#Ø�s�Ø’ñ ð 	�	‰	‘nˆ	Ñ%Ø�‰�dÔàˆr   Nr   r   r   r-   g      à?)	r   r   ÚTEXTFLAGS_WORDSr    r!   r"   ÚextractWORDSr1   r2   )r	   r
   r   r   r   Ú
delimitersr<   r=   r$   r7   r+   s         `    r   Úget_text_wordsrB   R   sö   ø€ õ4ô2 ×Ò˜ÔØ�}Ü×'Ñ'ˆØ	€BØ	�zØ×Ñ DÐÐ6‰Ü	��XÓ	 $Ó	&ÜÐ6Ó7Ð7à�O‰O˜JÓ'€Eð Ñ Ñ 0ä�|Š|˜DÓ!ˆáó
Ú�!¤ D¨R¨a¨5¡LÓ 1°S¼3¼w¿|º|ÈAÈbÈqÈEÓ?RÓ;SÑ5SÑ S�A‘uð 	ð 
ð ÑØÞ–á˜5Ó!ˆà€Lùò
s   Â;C5ÃC5c           	      ó†  • S n[        U UUUSUS9 Vs/ s H!  n[        R                  " USS 5      US   4PM#     nnU(       d  g[        R                  " 5       nU H	  u  pšX‰-  nM     / nUS   /nUS   S   nUSS  H‘  u  pšUS	   u  pï[	        UR
                  U	R
                  -
  5      U::  d&  [	        UR                  U	R                  -
  5      U::  a  UR                  Xš45        XÙ-  nMp  U" XŒ5      nUR                  UU45        Xš4/nU	nM“     U" XŒ5      nUR                  UU45        UR                  S
 S9  US   S   n
US   S   R                  nUSS  HZ  u  nn[        [        [        UR
                  U-
  UR                  -  5      5      S5      nSUS-   -  nU
UU-   -  n
UR                  nM\     U
$ s  snf )ag  Extract plain text avoiding unacceptable line breaks.

Text contained in clip will be sorted in reading sequence. Some effort
is also spent to simulate layout vertically and horizontally.

Args:
    page: pymupdf.Page
    clip: (rect-like) only consider text inside
    flags: (int) text extraction flags
    textpage: pymupdf.TextPage
    tolerance: (float) consider words to be on the same line if their top
        or bottom coordinates do not differ more than this.

Notes:
    If a TextPage is provided, all text is checked for being inside clip
    with at least 50% of its bbox.
    This allows to use some "global" TextPage in conjunction with sub-
    selecting words in parts of the defined TextPage rectangle.

Returns:
    A text string in reading sequence. Left indentation of each line,
    inter-line and inter-word distances strive to reflect the layout.
c                 ó‚  • UR                  S S9  SnU R                  n[        R                  " 5       nU H…  u  pVXE-  n[	        [        [        UR                  U-
  UR                  -  [        U5      -  5      5      X0R                  :X  d  UR                  U::  a  SOS5      nUSU-  U-   -  nUR                  nM‡     U$ )a³  Create the string of one text line.

We are trying to simulate some horizontal layout here, too.

Args:
    clip: (pymupdf.Rect) the area from which all text is being read.
    line: (list) word tuples (rect, text) contained in the line
Returns:
    Text in this line. Generated from words in 'line'. Distance from
    predecessor is translated to multiple spaces, thus simulating
    text indentations and large horizontal distances.
c                 ó    • U S   R                   $ r/   )Úx0r*   s    r   r   Ú4get_sorted_text.<locals>.line_text.<locals>.<lambda>Í   s   €   !¡§¢r   r   Ú r   r   Ú )
r   rF   r   Ú
EMPTY_RECTÚmaxÚintÚroundÚwidthÚlenÚx1)r
   r9   ÚltextrP   r:   ÚrÚtÚdists           r   Ú	line_textÚ"get_sorted_text.<locals>.line_textÀ   s®   € ð 	�	‰	Ñ'ˆ	Ñ(ØˆØ�W‰WˆÜ×"Ò"Ó$ˆÛ‰DˆAØ‰JˆEäÜ”E˜1Ÿ4™4 "™9¨¯©Ñ/´#°a³&Ñ8Ó9Ó:ØŸG™G“m q§t¡t¨r£z‘¸óˆDð
 �S˜4‘Z !‘^Ñ#ˆEØ—‘ŠBñ ð ˆr   T)r
   r   r   r   r<   Nr-   rH   r   r   éÿÿÿÿc                 ó    • U S   R                   $ r/   )r4   )Úls    r   r   Ú!get_sorted_text.<locals>.<lambda>  s   € ˜a ™dŸgšgr   r   é   Ú
)rB   r   r1   rJ   r2   r3   r4   r5   r   ÚminrL   rM   Úheight)r	   r
   r   r   r<   rU   r+   r7   ÚtotalboxÚwrÚtextÚlinesr9   r:   Úw0rÚ_rQ   r4   ÚdistanceÚbreakss                       r   Úget_sorted_textrg   ¡   sð  € ò>ô@  ØØØØØØò
ó
ò
ˆAô 
�Š�a˜˜�eÓ	˜a ™dÓ#ñ
ð 
ð 
ö ØÜ×!Ò!Ó#€HÛ‰ˆØ‰Šñ ð €EØ�!‰Hˆ:€DØ�!‰H�Q‰K€Eð ˜!˜"“I‰ˆØ�b‘‰ˆô ˆu�x‰x˜"Ÿ%™%ÑÓ  IÓ-´°U·X±XÀÇÁÑ5EÓ1FÈ)Ó1SØ�K‰K˜˜
Ô#Ø‰KŠEñ ˜hÓ-ˆEØ�L‰L˜% ˜Ô(Ø�J�<ˆDØŠEñ ñ �hÓ%€EØ	‡L�L�%˜�Ô ð 
‡J�JÑ&€JÑ'à�‰8�A‰;€DØ	ˆq‰�!‰�‰€BØ˜a˜b›	‰ˆˆuÜ”sœ5 %§(¡(¨R¡-°5·<±<Ñ!?Ó@ÓAÀ1ÓEˆØ˜ A™Ñ&ˆØ�˜‘ÑˆØ�X‰XŠñ	 "ð €Kùòk
s   ”(F>Úrectc                 ó’   • UnUc  U R                  5       nO[        US5      U :w  a  [        S5      eUR                  U5      nUc  AU$ )Nr   r   )r    r!   r"   ÚextractTextbox)r	   rh   r   r$   Úrcs        r   Úget_textboxrl     sU   € ð
 
€BØ	�zØ×ÑÓ ‰Ü	��XÓ	 $Ó	&ÜÐ6Ó7Ð7Ø	×	Ñ	˜4Ó	 €BØÑØØ€Ir   Úp1Úp2c                 óÚ   • [         R                  " U 5        UnUc  U R                  U[         R                  S9nO[	        US5      U :w  a  [        S5      eUR                  X5      nUc  AU$ )Nr   r   r   )r   r   r    ÚTEXT_DEHYPHENATEr!   r"   ÚextractSelection)r	   rm   rn   r
   r   r$   rk   s          r   Úget_text_selectionrr   &  sp   € ô ×Ò˜ÔØ	€BØ	�zØ×Ñ D´×0HÑ0HÐÐI‰Ü	��XÓ	 $Ó	&ÜÐ6Ó7Ð7Ø	×	Ñ	˜RÓ	$€BØÑØØ€Ir   ÚlanguageÚdpiÚfullÚtessdatac                 óò   ^• [         R                  " U 5        [         R                  " T5      mU[         R                  ) -  [         R                  ) -  nU4S jnU4S jnU(       a	  U" XX!5      $ U" XX!5      $ )a;  Create a Textpage from the OCR version of the page.

OCR can be executed for the full page image, or (the default) only
for areas that are not covered by readable digital text.

Args:
    flags: (int) control content becoming part of the result.
    language: (str) specify expected language(s). Default is "eng" (English).
    dpi: (int) resolution in dpi, default 72.
    full: (bool) whether to OCR the full page, or to keep legible text
    tessdata: (str) path to Tesseract language data files. If None, the
              built-in function is used to find the path.
c                 ó‚  >• U R                  US9n[        R                  " UR                  SUT
S9S9nUR	                  S5      nU R
                  R                  UR
                  R                  -  n[        R                  " Xw5      U R                  -  nUR                  X8S9n	[        R                  " U 5      U	l        U	$ )z$Perform OCR for the full page image.©rt   F©Úcompressrs   rv   ©Ústreamr   )r   Úmatrix)Ú
get_pixmapr   ÚDocumentÚpdfocr_tobytesÚ	load_pagerh   rN   ÚMatrixÚderotation_matrixr    ÚweakrefÚproxyr   )r	   rt   rs   r   ÚpixÚocr_pdfÚocr_pageÚunzoomÚctmÚtpagerv   s             €r   Úfull_ocrÚ"get_textpage_ocr.<locals>.full_ocrX  s°   ø€ à�o‰o #ˆoÐ&ˆä×"Ò"Ø×%Ñ%ØØ!Ø!ð &ð ñ
ˆð ×$Ñ$ QÓ'ˆØ—‘—‘ 8§=¡=×#6Ñ#6Ñ6ˆÜ�nŠn˜VÓ,¨t×/EÑ/EÑEˆØ×%Ñ%¨EÐ%Ð>ˆô —}’} TÓ*ˆŒØˆr   c           
      óŽ  >• U R                   n[        R                  " 5       nUR                  X@R                  U R                  S9  UR                  S5      nUR                  5         UR                  US9nUR                  5       S   n U V	V
Vs/ s HA  n	U	S   S:X  d  M  U	S     H)  n
U
S     H  n[        S5      US	   ;   d  M  US
   PM     M+     MC     nn
n	nU(       a¼  U H  nUR                  U5        M     UR                  [        R                  [        R                  [        R                  S9  UR                  US9nUR                  5       S   nUR                  X@R                  U R                  S9  UR                  S5      nUR                  5         U V	V
Vs/ s HA  n	U	S   S:X  d  M  U	S     H)  n
U
S     H  n[        S5      US	   ;  d  M  US
   PM     M+     MC     nn
n	nU H  nUR                  U5        M     UR                  [        R                  [        R                  [        R                  S9  UR                  US9n[        R                  " UR!                  SUTS9S9nUS   nUR#                  U[        R$                  S9  [&        R(                  " U 5      Ul         U$ s  snn
n	f s  snn
n	f )zxPerform OCR for parts of the page without legible text.

We create a temporary PDF for which we can freely redact text.
)Ú	from_pageÚto_pager   )r   r%   Útyperb   Úspansiýÿ  ra   Úbbox)ÚimagesÚgraphicsra   rW   ry   Frz   r|   )r   r   ÚopenÚ
insert_pdfÚnumberr‚   Úremove_rotationr    ÚextractDICTÚchrÚadd_redact_annotÚapply_redactionsÚPDF_REDACT_IMAGE_NONEÚPDF_REDACT_LINE_ART_NONEÚPDF_REDACT_TEXT_REMOVEr   r�   Úextend_textpageÚTEXT_ACCURATE_BBOXESr…   r†   )r	   rt   rs   r   ÚdocÚtemp_pdfÚ	temp_pager$   r%   r   rY   ÚsÚ
fffd_spansr”   Úspan_bboxesr‡   rˆ   r‰   rv   s                     €r   Úpartial_ocrÚ%get_textpage_ocr.<locals>.partial_ocrl  sØ  ø€ ð
 �k‰kˆô —<’<“>ˆØ×Ñ˜C¯;©;ÀÇÁÐÑLØ×&Ñ& qÓ)ˆ	Ø×!Ñ!Ô#ð ×#Ñ#¨%Ð#Ð0ˆØ—‘Ó! (Ñ+ˆð	ñ õ
â�Ø�‰y˜A‰~ó ð �w•Z�Ø�w•Z�Ü�6‹{˜a ™iÑ'ó ˆAˆfŒIñ  ñ	 ñ  ñ Ùð 	ò 
ö Û"�Ø×*Ñ*¨4Ö0ñ #à×&Ñ&Ü×4Ñ4Ü ×9Ñ9Ü×3Ñ3ð 'ñ ð ×'Ñ'¨eÐ'Ð4ˆBØ—^‘^Ó% hÑ/ˆFà×Ñ ¯{©{ÀDÇKÁKÐÑPØ ×*Ñ*¨2Ó.ˆIØ×%Ñ%Ô'ñ õ
â�Ø�‰y˜A‰~ó ð �w•Z�Ø�w•Z�Ü�v“; ! F¡)Ñ+ó ˆAˆfŒIñ  ñ	 ñ  ñ Ùð 	ò 
ó  ˆDØ×&Ñ& tÖ,ñ  ð 	×"Ñ"Ü×0Ñ0Ü×5Ñ5Ü×/Ñ/ð 	#ñ 	
ð
 ×"Ñ" sÐ"Ð+ˆô —,’,Ø×%Ñ%ØØ!Ø!ð &ð ñ
ˆð ˜1‘:ˆð 	× Ñ  ¬7×+GÑ+GÐ ÑHô —M’M $Ó'ˆŒ	Øˆ	ùô}
ùô0
s$   ÂJ9Â""J9ÃJ9Æ&K Æ7"K ÇK )r   r   Úget_tessdataÚ TEXT_USE_CID_FOR_UNKNOWN_UNICODEÚ TEXT_USE_GID_FOR_UNKNOWN_UNICODE)r	   r   rs   rt   ru   rv   r�   rª   s        `  r   Úget_textpage_ocrr¯   9  s|   ø€ ô* ×Ò˜ÔÜ×#Ò# HÓ-€Hð 	Ü×3Ñ3Ð
3ñ	4ä×3Ñ3Ð
3ñ	4ð 
õõ(Tön Ù˜ 8Ó3Ð3ñ �t (Ó2Ð2r   )r
   r   r   r   rA   r<   Úoptionc                óœ  • [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  [         R                  S.
nUR                  5       nX;   d   eX;  a  SnUc  X�   nUS:X  a  [        U UUUUUS9$ US:X  a  [        XX4US9$ US:X  a  U(       a  [        U UUUUS9$ [         R                  " U 5        Sn	US	;   a  U R                  nUb  [         R                  " U5      nSn	O([!        U 5      [         R"                  L a  U R                  n	Un
U
c  U R%                  X#S
9n
O['        U
S5      U :w  a  [)        S5      eUS:X  a  U
R+                  X•S9nO–US:X  a  U
R-                  X•S9nO€US:X  a  U
R/                  X•S9nOjUS:X  a  U
R1                  X•S9nOTUS:X  a  U
R3                  5       nO=US:X  a  U
R5                  5       nO&US:X  a  U
R7                  5       nOU
R9                  US9nUc  A
U$ )aÄ  Extract text from a page or an annotation.

This is a unifying wrapper for various methods of the pymupdf.TextPage class.

Args:
    option: (str) text, words, blocks, html, dict, json, rawdict, xhtml or xml.
    clip: (rect-like) restrict output to this area.
    flags: bit switches to e.g. exclude images or decompose ligatures.
    textpage: reuse this pymupdf.TextPage and make no new one. If specified,
        'flags' and 'clip' are ignored.

Returns:
    the output of methods get_text_words / get_text_blocks or pymupdf.TextPage
    methods extractText, extractHTML, extractDICT, extractJSON, extractRAWDICT,
    extractXHTML or etractXML respectively.
    Default and misspelling choice is "text".
)
ra   ÚhtmlÚjsonÚrawjsonÚxmlÚxhtmlÚdictÚrawdictr7   r%   ra   Nr7   )r
   r   r   r   rA   r%   )r
   r   r   r   )r
   r   r   r<   )r²   rµ   r¶   r   r   r   r³   )Úcbr   r´   r·   r¸   r²   rµ   r¶   )r   )r   ÚTEXTFLAGS_TEXTÚTEXTFLAGS_HTMLÚTEXTFLAGS_DICTÚTEXTFLAGS_RAWDICTÚTEXTFLAGS_XMLÚTEXTFLAGS_XHTMLr?   r   ÚlowerrB   r&   rg   r   Úcropboxr1   r’   ÚPager    r!   r"   ÚextractJSONÚextractRAWJSONr›   ÚextractRAWDICTÚextractHTMLÚ
extractXMLÚextractXHTMLÚextractText)r	   r°   r
   r   r   r   rA   r<   Úformatsr¹   r$   rS   s               r   Úget_textrË   Ë  sQ  € ô: ×&Ñ&Ü×&Ñ&Ü×&Ñ&Ü×,Ñ,Ü×$Ñ$Ü×(Ñ(Ü×&Ñ&Ü×,Ñ,Ü×(Ñ(Ü×*Ñ*ñ€Gð �\‰\‹^€FØÓÐÐØÓØˆØ�}Ø‘ˆà�ÓÜØØØØØØ!ñ
ð 	
ð �ÓÜØ 5À$ñ
ð 	
ð �ÓžDÜØØØØØñ
ð 	
ô ×Ò˜ÔØ	€BØÐ)Ó)Ø�|‰|ˆØÑÜ�|Š|˜DÓ!ˆØ‰Ü	ˆd‹”w—|‘|Ò	#Ø�\‰\ˆà	€Bà	�zØ×Ñ DÐÐ6‰Ü	��XÓ	 $Ó	&ÜÐ6Ó7Ð7à�ÓØ�N‰N˜bˆNÐ,‰Ø	�9Ó	Ø×Ñ ÐÐ/‰Ø	�6Ó	Ø�N‰N˜bˆNÐ,‰Ø	�9Ó	Ø×Ñ ÐÐ/‰Ø	�6Ó	Ø�N‰NÓ‰Ø	�5‹Ø�M‰M‹O‰Ø	�7Ó	Ø�O‰OÓ‰à�N‰N ˆNÐ%ˆàÑØØ€Hr   c                 ó<  • [        U [        R                  5      (       a  U R                  U5      nOA[        U [        R                  5      (       a  U R
                  nO S[        U 5      < S35       eUR                  SS.n [        U S5      (       a  U R                  US'   [        R                  " SS5      nUR                  [        R                  -  (       a  UR                   R"                  Ul        UR                  [        R$                  -  (       a  UR                   R&                  Ul        UR                  [        R(                  :X  a  UR*                  US'   U$ UR                  [        R,                  :X  aX  UR.                  US	'   XCS
'   UR                  [        R0                  -  (       a  UR2                  R"                  US'   U$ SUS'    U$ UR                  [        R4                  :X  a˜  UR6                  R9                  SS5      US'   UR.                  US	'   UR.                  S:  a  UR
                  US
'   U$ XCS
'   UR                  [        R0                  -  (       a  UR2                  R"                  US'   U$ SUS'    U$ UR                  [        R:                  :X  a!  UR6                  R9                  SS5      US'   U$ UR                  [        R<                  :X  aq  UR>                  RA                  5       URA                  5       -  (       a   eURC                  UR>                  5        S
U;   a  [        R                  " US
   5      US
'   U$ UR.                  US	'   U$ ! [         a#    [        S:¼  a  [        R                  " 5          GN÷f = f)Nr   zUnexpected type(ln)=Ú.)ÚkindÚxrefrh   Úfromé   Úurir	   ÚtoÚzoomg        Ú\Ú/Úfile)"Ú
isinstancer   ÚOutlineÚdestinationÚLinkÚdestr’   rÎ   Úhasattrrh   Ú	ExceptionÚg_exceptions_verboseÚexception_infoÚPointr   ÚLINK_FLAG_L_VALIDÚltÚxÚLINK_FLAG_T_VALIDÚyÚLINK_URIrÒ   Ú	LINK_GOTOr	   ÚLINK_FLAG_R_IS_ZOOMÚrbÚ
LINK_GOTORÚ	file_specÚreplaceÚLINK_LAUNCHÚ
LINK_NAMEDÚnamedÚkeysÚupdate)ÚlnÚdocumentrÜ   ÚnlÚpnts        r   ÚgetLinkDictr÷   8  s×  € Ü�"”g—o‘o×&Ñ&Ø�~‰~˜hÓ'‰Ü	�BœŸ™×	%Ñ	%Ø�w‰w‰à,Ð)¤ R£™{¨!Ð,Ó,ˆqØ—)‘) QÑ	'€BðÜ�2�v×ÑØŸ™ˆBˆv‰Jô
 �-Š-˜˜1Ó
€CØ‡z�z”G×-Ñ-×-Ø—‘—	‘	ˆŒØ‡z�z”G×-Ñ-×-Ø—‘—	‘	ˆŒà‡y�y”G×$Ñ$Ó$Ø—H‘Hˆˆ5‰	ðD €IðA 
�‰”g×'Ñ'Ó	'Ø—Y‘Yˆˆ6‰
Øˆ4‰Ø�:‰:œ×3Ñ3×3ØŸ™Ÿ™ˆBˆv‰Jð8 €Ið5 ˆBˆvŠJð4 €Ið1 
�‰”g×(Ñ(Ó	(Ø—^‘^×+Ñ+¨D°#Ó6ˆˆ6‰
Ø—Y‘Yˆˆ6‰
Ø�9‰9�q‹=Ø—y‘yˆBˆt‰Hð( €Ið% ˆt‰HØ�z‰zœG×7Ñ7×7Ø!ŸW™WŸY™Y��6‘
ð  €Ið !��6’
ð €Ið 
�‰”g×)Ñ)Ó	)Ø—^‘^×+Ñ+¨D°#Ó6ˆˆ6‰
ð €Ið 
�‰”g×(Ñ(Ó	(à—J‘J—O‘OÓ%¨¯©«	×1Ð2Ð2Ø
�	‰	�$—*‘*ÔØ�2‹:Ü—}’} R¨¡XÓ.ˆBˆt‰Hð €Ið —Y‘Yˆˆ6‰
Ø€Iøô[ ó ä 1Ó$¬×(>Ò(>Ô(@Úðús   Â M. Í.)NÎNrÏ   Úddictc                 ó  • U(       d  gS nS nS nS nS n[        U5      [        [        4;   a  U" U SUS5      nU$ UR                  S[        R
                  5      nU[        R
                  :X  a  gUS   [        R                  :X  aH  UR                  S	S5      n	UR                  S
[        R                  " SS5      5      n
U
u  p¼U" XXÉ5      nU$ US   [        R                  :X  a!  U" [        R                  " US   5      5      nU$ US   [        R                  :X  a#  [        R                  " US   5      nU" XÝ5      nU$ US   [        R                  :X  aD  US   S:  a;  [        R                  " US   5      nU" [        R                  " US
   5      XÝ5      nU$ US   [        R                  :X  aQ  US   S:¼  aH  [        R                  " US   5      nU" US   US
   R                  US
   R                  US	   UU5      nU$ g)zfCalculate the PDF action string.

Notes:
    Supports Link annotations and outline items (bookmarks).
rH   c                 ó*   • SU  S[        XU45       S3$ )Nz/A<</S/GoTo/D[z	 0 R/XYZ z]>>©Ú	_format_g)Úar   ÚcÚds       r   r   ÚgetDestStr.<locals>.<lambda>{  s   €  N°1°#°Y¼yÈ!ÐPQÈÓ?SÐ>TÐTWÑ"Xr   c           	      ó6   • SU  S[        XU45       SU SU S3	$ )Nz/A<</S/GoToR/D[z /XYZ z]/F<</Fú/UFú/Type/Filespec>>>>rû   )rý   r   rþ   rÿ   ÚeÚfs         r   r   r   |  s2   € ¨O¸A¸3¸fÄYÐPQÐVWÈyÓEYÐDZÐZaÐbcÐadÐdgÐhiÐgjÐj|Ñ*}r   c                 ó   • SU  SU SU S3$ )Nz/A<</S/GoToR/Dz/F<</Fr  r  r   )rý   r   rþ   s      r   r   r   }  s   €  >°!°°F¸1¸#¸SÀÀÐCUÑ!Vr   c                 ó   • SU  SU S3$ )Nz/A<</S/Launch/F<</Fr  r  r   )rý   r   s     r   r   r   ~  s   € Ð 3°A°3°c¸!¸Ð<NÑOr   c                 ó   • SU  S3$ )Nz/A<</S/URI/URIz>>r   )rý   s    r   r   r     s   € ˜.¨¨¨2Ñ.r   r   rÎ   rÔ   rÓ   rÒ   r×   r	   )r’   rL   ÚfloatÚgetr   Ú	LINK_NONErè   rá   rç   Úget_pdf_strrî   rë   rä   ræ   )rÏ   rø   Ústr_gotoÚ
str_gotor1Ú
str_gotor2Ú
str_launchÚstr_urirÜ   Úd_kindÚd_zoomrÓ   Úd_leftÚd_topÚfspecs                 r   Ú
getDestStrr  s  sé  € ö ØÙX€HÙ}€JÙV€JÙO€JÙ.€GäˆEƒ{”sœE�lÓ"Ù˜˜a ¨Ó*ˆØˆØ�Y‰Y�vœw×0Ñ0Ó1€Fà”×"Ñ"Ó"ØàˆV�}œ×)Ñ)Ó)Ø—‘˜6 1Ó%ˆØ�Y‰Y�tœWŸ]š]¨1¨aÓ0Ó1ˆØ‰ˆÙ˜ eÓ4ˆØˆàˆV�}œ×(Ñ(Ó(Ù”w×*Ò*¨5°©<Ó8Ó:ˆØˆàˆV�}œ×+Ñ+Ó+Ü×#Ò# E¨&¡MÓ2ˆÙ˜%Ó'ˆØˆàˆV�}œ×*Ñ*Ó*¨u°V©}¸qÓ/@Ü×#Ò# E¨&¡MÓ2ˆÙœ'×-Ò-¨e°D©kÓ:¸EÓIˆØˆàˆV�}œ×*Ñ*Ó*¨u°V©}ÀÓ/AÜ×#Ò# E¨&¡MÓ2ˆÙØ�&‰MØ�$‰K�M‰MØ�$‰K�M‰MØ�&‰MØØó
ˆð ˆàr   Úlnkc           	      ó°  • U R                   nU) nUS   n[        [        XC-  5      5      nSnUS   [        R                  :X  aë  US   S:¼  a­  [        R
                  S   nUS   nU R                  R                  U5      n	UR                  S[        R                  " SS5      5      n
U R                  U   nUR                   nU) nX­-  nU" XžR                  UR                  UR                  SS5      U5      nGOó[        R
                  S	   nU" [        R                  " US   5      U5      nGO¾US   [        R                  :X  aê  US   S:¼  a©  [        R
                  S
   nUR                  S[        R                  " SS5      5      n
[        U
5      [        R                  La  [        R                  " SS5      n
U" US   U
R                  U
R                  UR                  SS5      US   US   U5      nOõ[        R
                  S   nU" [        R                  " US   5      US   U5      nO½US   [        R                  :X  a$  [        R
                  S   nU" US   US   U5      nO‚US   [        R                   :X  a   [        R
                  S   nU" US   U5      nOKUS   [        R"                  :X  a4  [        R
                  S   nUR                  S5      nUc  US   nU" Xõ5      nU(       d  U$ [%        U R'                  5        Vs/ s H&  nUS   [        R(                  :X  d  M  US   US   4PM(     sn5      nUR                  SS5      nU(       a  US   U4UR+                  5       ;   a  UnOESn[        R,                  R/                  5       S-   n UU-  nUUR1                  5       ;  a  OUS-  nM!  UR3                  SSU S35      nU$ s  snf )NrÐ   rH   rÎ   r	   r   Úgoto1rÓ   rÔ   Úgoto2Úgotor1r×   Úgotor2ÚlaunchrÒ   rð   ÚnameÚ	nameddestr   rÑ   ÚidrÏ   z-L%iz/Linkz	/Link/NM(Ú))Útransformation_matrixrü   Útupler   rè   Ú
annot_skelr   Ú	page_xrefr
  rá   rä   ræ   r  rë   r’   rî   rç   rï   r·   Úannot_xrefsÚPDF_ANNOT_LINKÚitemsÚTOOLSÚset_annot_stemÚvaluesrí   )r	   r  r‹   ÚictmrR   rh   ÚannotÚtxtÚpnorÏ   rö   Ú	dest_pageÚdest_ctmÚ	dest_ictmÚipntÚlnamerä   Ú
link_namesÚold_namer  ÚiÚstems                         r   ÚgetLinkTextr:  ­  sŽ  € ð ×
$Ñ
$€CØˆ4€DØˆF‰€AÜ”U˜1™8“_Ó%€Dà€EØ
ˆ6�{”g×'Ñ'Ó'Øˆv‰;˜!ÓÜ×$Ñ$ WÑ-ˆCØ�f‘+ˆCØ—;‘;×(Ñ(¨Ó-ˆDØ—'‘'˜$¤§¢¨a°Ó 3Ó4ˆCØŸ™ CÑ(ˆIØ ×6Ñ6ˆHØ!˜	ˆIØ‘?ˆDÙ˜Ÿf™f d§f¡f¨c¯g©g°f¸aÓ.@À$ÓGŠEä×$Ñ$ WÑ-ˆCÙœ×+Ò+¨C°©IÓ6¸Ó=ŠEà	ˆV‰œ×*Ñ*Ó	*Øˆv‰;˜!ÓÜ×$Ñ$ XÑ.ˆCØ—'‘'˜$¤§¢¨a°Ó 3Ó4ˆCÜ�C‹y¤§¡Ò-Ü—m’m A qÓ)�ÙØ�F‘Ø—‘Ø—‘Ø—‘˜ Ó"Ø�F‘Ø�F‘Øó‰Eô ×$Ñ$ XÑ.ˆCÙœ×+Ò+¨C°©IÓ6¸¸F¹ÀTÓJ‰Eà	ˆV‰œ×+Ñ+Ó	+Ü× Ñ  Ñ*ˆÙ�C˜‘K  V¡¨dÓ3‰à	ˆV‰œ×(Ñ(Ó	(Ü× Ñ  Ñ'ˆÙ�C˜‘J Ó%‰à	ˆV‰œ×*Ñ*Ó	*Ü× Ñ  Ñ)ˆØ—‘˜“ˆØ‰=Ø˜Ñ$ˆEÙ�EÓ ˆÞØˆô Ø#×/Ñ/Ô1ÓTÒ1˜!°Q°q±T¼W×=SÑ=SÑ5S‹ˆ!ˆA‰$��!‘‹Ñ1ÑTó€Jð �w‰w�t˜RÓ €Hæ�S˜‘[ (Ð+¨z×/?Ñ/?Ó/AÓAØ‰àˆÜ�}‰}×+Ñ+Ó-°Ñ6ˆØØ˜!‘8ˆDØ˜:×,Ñ,Ó.Ó.ØØ�‰FˆAñ	 ð �M‰M˜E i°¨v°QÐ$7Ó8€EØ€Lùò# 	Us   ÌOÌ,Oc            
      óp   • [         R                  " 5        V VVVs/ s H  u  pp#U PM
     snnnn $ s  snnnn f )zD
Returns a list of upper-case colour names.
:rtype: list of strings
©r   Úcolors_wx_list)r  rR   Úgr   s       r   ÚgetColorListr?    s+   € ô
 '.×&<Ò&<Ô&>Ö?Ò&>‘]�T˜a‹DÑ&>Ô?Ð?ùÕ?s   ›0
c                  ó,   • [         R                  " 5       $ )z¡
Returns list of (name, red, gree, blue) tuples, where:
    name: upper-case color name.
    read, green, blue: integers in range 0..255.
:rtype: list of tuples
r<  r   r   r   ÚgetColorInfoListrA    s   € ô ×!Ò!Ó#Ð#r   r  c                 óh   • [         R                  " 5       R                  U R                  5       S5      $ )zŒRetrieve RGB color in PDF format by name.

Returns:
    a triple of floats in range 0 to 1. In case of name-not-found, "white" is returned.
)r   r   r   )r   Úcolors_pdf_dictr
  rÀ   )r  s    r   ÚgetColorrD     s&   € ô ×"Ò"Ó$×(Ñ(¨¯©«°yÓAÐAr   c                 ó>  •  [        5       [        5       R                  U R                  5       5         nUS   S-  nUS   S-  nUS   S-  n[        X#U5      n[        US-  S5      n[        X#U5      nXW-
  nUS:X  a  Sn	O3XR:X  a  SX4-
  U-  S	-  -  n	O XS:X  a  SXB-
  U-  S-   -  n	OSX#-
  U-  S
-   -  n	[        [        U	5      5      n
US:X  a  SnOX…-  n[        [        US-  5      5      nX¬U4$ ! [         a#    [
        (       a  [        R                  " 5          gf = f)z–Retrieve the hue, saturation, value triple of a color name.

Returns:
    a triple (degree, percent, percent). If not found (-1, -1, -1) is returned.
)rW   rW   rW   r   g     ào@rÑ   r   éd   r   g      N@é   r-   )rA  r?  ÚindexÚupperrÞ   rß   r   rà   rK   rM   r]   rL   )r  rä   rR   r>  r   ÚcmaxÚVÚcminÚdeltaÚhueÚHÚsatÚSs                r   ÚgetColorHSVrR  )  s4  € ðÜÓœ|›~×3Ñ3°D·J±J³LÓAÑBˆð
 	
ˆ!‰ˆu‰€AØ	ˆ!‰ˆu‰€AØ	ˆ!‰ˆu‰€AÜˆq�Q‹<€DÜˆd�S‰j˜!Ó€AÜˆq�Q‹<€DØ‰K€EØ�ƒzØ‰Ø	‹Ø˜™ ‘¨!Ñ+Ñ,‰Ø	‹Ø˜™ ‘¨!Ñ+Ñ,‰à˜™ ‘¨!Ñ+Ñ,ˆäŒE�#‹J‹€AàˆqƒyØ‰à‰lˆÜŒE�#˜‘)ÓÓ€Aà�!ˆ9Ðøô9 ó ßÒ¤G×$:Ò$:Ô$<Ùðús   ‚2C/ Ã/*DÄDr¤   c                 ój  • U R                  U5      u  p#pESnSnUS:X  a  X#XFU4$ U(       ag   [        R                  " US9nUR                  nUR                  nUR
                  n	Xg-
  S:  a!  U	R                  U:  a  U	R                  nSU-
  nX#XFU4$ US:w  a0   [        R                  " U5      nUR                  nUR                  nO
US-  nUS-  nX#XFU4$ ! [         a"    [        R                  " 5         US-  nUS-  n Nuf = f! [         a"    [        R                  " 5         US-  nUS-  n N_f = f)Ngš™™™™™é?gš™™™™™É¿rH   )Ú
fontbufferr   g333333ó?zn/a)	Úextract_fontr   ÚFontÚascenderÚ	descenderr”   r3   rÞ   rà   )
r¤   rÏ   ÚfontnameÚextÚstypeÚbufferÚascÚdscÚfontr”   s
             r   Ú_get_font_propertiesr`  P  sE  € Ø#&×#3Ñ#3°DÓ#9Ñ €H�5Ø
€CØ
€CØ
ˆbƒyØ˜e¨#Ð-Ð-æð	Ü—<’<¨6Ñ2ˆDØ—-‘-ˆCØ—.‘.ˆCØ—9‘9ˆDØ‰y˜1‹}Ø—7‘7˜S“=ØŸ'™'�CØ˜#‘g�ð
 ˜e¨#Ð-Ð-Ø
ˆeƒ|ð	Ü—<’< Ó)ˆDØ—-‘-ˆCØ—.‘.‰Cð 	ˆs‰
ˆØˆs‰
ˆØ˜% cÐ)Ð)øô# ó 	Ü×"Ò"Ô$Ø�3‰JˆCØ�3‰JŠCð	ûô ó 	Ü×"Ò"Ô$Ø�3‰JˆCØ�3‰JŠCð	ús$   ¬A!C Â.D Ã)DÄDÄ)D2Ä1D2c                 óš   • SnSnU R                   R                  n U(       d  O!US-  nX#R                  -  nUR                  nM)  SU SU 3$ )Nr   r   z
num_spans=z num_chars=)Ú
m_internalÚheadrO   Únext)ra   Ú	num_spansÚ	num_charsÚspans       r   Ú_show_fz_textrh  u  s^   € ð
 €IØ€IØ�?‰?×Ñ€DØ
ÞØØ�Q‰ˆ	Ø—X‘XÑˆ	Ø�y‰yˆñ ð ˜	�{ +¨i¨[Ð9Ð9r   c                 óˆ  • U u  pUSS R                  S5      SS nUSSS.nSn[        U5       H�  u  pPU(       a  SnM  U S	:X  a  X%S-      US
'   SnM$  U R                  S5      (       a+  U SS R                  SS5      R                  SS5      nXcS'   Me  U R                  S5      (       d  M}  [	        U SS 5      nXcS'   M‘     U$ )a  Make a Python dict from a PDF page label rule.

Args:
    item -- a tuple (pno, rule) with the start page number and the rule
            string like <</S/D...>>.
Returns:
    A dict like
    {'startpage': int, 'prefix': str, 'style': str, 'firstpagenum': int}.
rÑ   éþÿÿÿrÖ   r   NrH   )Ú	startpageÚprefixÚfirstpagenumFrQ  ÚstyleTÚPÚ(r"  rl  ÚStrm  )ÚsplitÚ	enumerateÚ
startswithrí   rL   )Úitemr0  Úrulerÿ   Úskipr8  rä   s          r   Ú	rule_dictrx  ˜  sÝ   € ð �I€CØ��"ˆ:×Ñ˜CÓ   Ð$€DØ R¸Ñ;€AØ€DÜ˜T–?‰ˆÞØˆDÙØ�3‹;Ø !™e™ˆAˆg‰JØˆDÙØ�?‰?˜3×ÑØ�Q�R�× Ñ   bÓ)×1Ñ1°#°rÓ:ˆAØˆh‰KÙØ�?‰?˜4× Ó Ü�D˜˜�H“ˆAØ !ˆnÓñ #ð €Hr   c                 óö   • U Vs/ s H  o"S   U ::  d  M  UPM     snS   n[        U5      nUR                  SS5      nUR                  SS5      nUS;   a  SOSnXS   -
  US   -   U-   n[        XeU5      $ s  snf )	zÌReturn the label for this page number.

Args:
    pgNo: page number, 0-based.
    labels: result of doc._get_page_labels().
Returns:
    The label (str) of the page number. Errors return an empty string.
r   rW   rl  rH   rn  )rý   ÚArk  rm  )rx  r
  Úconstruct_label)	ÚpgNoÚlabelsrä   ru  rv  rl  rn  rM  Ú
pagenumbers	            r   Úget_label_pnor  º  sŠ   € ñ Ó.’v�! 1¡¨¡�A‘vÑ.¨rÑ2€DÜ�T‹?€DØ�X‰X�h Ó#€FØ�H‰H�W˜bÓ!€Eà˜:Ó%‰B¨1€EØ˜[Ñ)Ñ)¨D°Ñ,@Ñ@À5ÑH€JÜ˜5¨*Ó5Ð5ùò /s
   …A6•A6c                 ó4  • SnU S:X  a  [        U5      nOU S:X  a  [        U5      R                  5       nO_U S:X  a  [        U5      R                  5       nO?U S:X  a  [	        U5      R                  5       nOU S:X  a  [	        U5      R                  5       nX-   nU$ )z9Construct a label based on style, prefix and page number.rH   ÚDrR   ÚRrý   rz  )ÚstrÚintegerToRomanrÀ   rI  ÚintegerToLetter)rn  rl  r0  Ún_strÚresults        r   r{  r{  Ï  s�   € ð €EØ�ƒ|Ü�C“‰Ø	�#‹Ü˜sÓ#×)Ñ)Ó+‰Ø	�#‹Ü˜sÓ#×)Ñ)Ó+‰Ø	�#‹Ü Ó$×*Ñ*Ó,‰Ø	�#‹Ü Ó$×*Ñ*Ó,ˆØ‰^€FØ€Mr   c           
      ód  • SSK nUR                  nSU pC[        SU5      U::  a:  U[        [        R                  " SU5      5      -  nUS-  n[        SU5      U::  a  M:  Sn[        [        U5      5       H8  n[        U[        [        R                  " SU5      5      5      u  pxXRU   -  nUnM:     U$ )z-Returns letter sequence string for integer i.r   Nr   é   rH   )ÚstringÚascii_uppercaseÚpowrL   ÚmathÚreversedÚrangeÚdivmod)	r8  rŠ  ÚlsÚnrý   Ústr_tÚjr  r>  s	            r   r…  r…  â  s¥   € ó Ø	×	Ñ	€BØˆa€qÜ
ˆb�!‹*˜‹/Ø	ŒS”—’˜"˜a“Ó!Ñ!ˆØ	ˆQ‰ˆô ˆb�!‹*˜�/ð €EÜ”e˜A“hÖˆÜ�aœœTŸXšX b¨!›_Ó-Ó.‰ˆØ�A‘‰ˆØŠñ  ð €Lr   Únumc                 ól   ^• SmU4S jnSR                  U" U 5       Vs/ s H  o"PM     sn5      $ s  snf )z$Return roman numeral for an integer.))iè  ÚM)i„  ÚCM)iô  r�  )i�  ÚCD)rF  ÚC)éZ   ÚXC)é2   ÚL)é(   ÚXL)é
   ÚX)é	   ÚIX)r[   rK  )r-   ÚIV)r   ÚIc              3   óh   >#   • T H'  u  p[        X5      u  p4X#-  v •  XU-  -  n U S::  d  M'    g    g 7fr/   )r�  )r•  rR   Últrrä   rd   Úromans        €r   Ú	roman_numÚ!integerToRoman.<locals>.roman_num  s9   øé € Û‰FˆAÜ˜#“>‰DˆAØ‘'ŠMØ�q‘5‰LˆCØ�a�xÙò ùs   ƒ&2­2rH   )Újoin)r•  rª  rý   r©  s      @r   r„  r„  ô  s6   ø€ ð€Eõ ð �7‰7™y¨œ~Ó.š~˜!’A™~Ñ.Ó/Ð/ùÒ.s   Ÿ1Úline_dirrg  r”   c                 ób  • U c  US   n U u  p4[         R                  " U5      n[         R                  R                  5       (       a  SnOUS   US   -
  nXQS   -  nXd-  nXc-  nUS:¼  aK  US::  aE  UR                  SU4-
  n	UR
                  US4-   n
UR                  US4-
  nUR
                  SU4-   nOæUS::  aK  US::  aE  UR                  US4-   n	UR                  SU4-
  n
UR                  SU4-   nUR                  US4-
  nO•US::  aK  US:¼  aE  UR
                  SU4-
  n	UR                  US4-   n
UR
                  US4-
  nUR                  SU4-   nODUR                  US4-   n	UR                  SU4-
  n
UR                  SU4-   nUR                  US4-
  n[         R                  " XšX¼5      $ )ao  Compute the quad located inside the bbox.

The bbox may be any of the resp. tuples occurring inside the given span.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line or None.
    span: (dict) the span. May be from get_texttrace() method.
    bbox: (tuple) the bbox of the span or any of its characters.
Returns:
    The quad which is wrapped by the bbox.
Údirr   rW  rX  Úsizer   )	r   r1   r*  Úset_small_glyph_heightsÚblÚtrÚbrÚtlÚQuad)r­  rg  r”   ÚcosÚsinrÿ   r^   ÚhsÚhcÚulÚurÚllÚlrs                r   Úrecover_bbox_quadr¿    sÈ  € ð ÑØ˜‘;ˆØ�H€CÜ�<Š<˜Ó€DÜ‡}�}×,Ñ,×.Ñ.Ø‰à�Ñ˜t KÑ0Ñ0ˆà�f‘Ñ€Fð 
‰€BØ	‰€BØ	ˆQƒw�2˜“7Ø�W‰W˜˜2�wÑˆØ�W‰W˜˜A�wÑˆØ�W‰W˜˜A�wÑˆØ�W‰W˜˜2�wÑ‰Ø	ˆq‹�R˜1“WØ�W‰W˜˜A�wÑˆØ�W‰W˜˜2�wÑˆØ�W‰W˜˜2�wÑˆØ�W‰W˜˜A�wÑ‰Ø	ˆq‹�R˜1“WØ�W‰W˜˜2�wÑˆØ�W‰W˜˜A�wÑˆØ�W‰W˜˜A�wÑˆØ�W‰W˜˜2�wÑ‰à�W‰W˜˜A�wÑˆØ�W‰W˜˜2�wÑˆØ�W‰W˜˜2�wÑˆØ�W‰W˜˜A�wÑˆÜ�<Š<˜ Ó'Ð'r   c                 ó²   • [        U 5      [        Ld  [        U 5      S:w  a  [        S5      e[        U5      [        La  [        S5      e[        XUS   5      $ )z¸Recover the quadrilateral of a text span.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line.
    span: the span.
Returns:
    The quadrilateral enveloping the span's text.
rÑ   úbad line dir argumentúbad span argumentr”   )r’   r$  rO   r"   r·   r¿  )r­  rg  s     r   Úrecover_quadrÃ  H  sP   € ô ˆHƒ~œUÒ"¤c¨(£m°qÓ&8ÜÐ0Ó1Ð1ÜˆDƒzœÒÜÐ,Ó-Ð-Ü˜X¨T°&©\Ó:Ð:r   r9   r“   c           	      ó2  • Uc  U S   n[        U5      S:X  a  [        S5      eU S   nUu  p4[        X!S   5      n[        U5      S:”  a  [        X!S   5      nOUnUR                  nUR                  n[
        R                  " Xx5      n	X‰-  n
[
        R                  R                  5       n[        U Vs/ s H  oÌS   U(       a  SO
US   US	   -
  -  PM     sn5      n[
        R                  " SU* U
R                  S5      nUR                  nXù) -  nU$ s  snf )
aÃ  Calculate the line quad for 'dict' / 'rawdict' text extractions.

The lower quad points are those of the first, resp. last span quad.
The upper points are determined by the maximum span quad height.
From this, compute a rect with bottom-left in (0, 0), convert this to a
quad and rotate and shift back to cover the text of the spans.

Args:
    spans: (list, optional) sub-list of spans to consider.
Returns:
    pymupdf.Quad covering selected spans.
r“   r   zbad span listr¯  r   rW   r°  rW  rX  )rO   r"   rÃ  r½  r¾  r   Úplanish_liner*  r±  rK   r1   rä   Úquad)r9   r“   r­  r·  r¸  Úq0Úq1Úline_llÚline_lrÚmat0Úx_lrÚsmallr§   ÚhÚ	line_rectÚ	line_quads                   r   Úrecover_line_quadrÑ  X  s  € ð �}Ø�W‘ˆÜ
ˆ5ƒz�QƒÜ˜Ó)Ð)Ø�E‰{€HØ�H€CÜ	�h a¡Ó	)€BÜ
ˆ5ƒz�Aƒ~Ü˜(¨"¡IÓ.‰àˆà�e‰e€GØ�e‰e€Gä×Ò Ó1€Dð ‰>€Dä�M‰M×1Ñ1Ó3€EäÙQVÓWÒQVÈAˆ6‰ž5‘a q¨¡}°q¸±~Ñ'EÔ	GÑQVÑWó	€Aô —’˜Q   D§F¡F¨AÓ.€IØ—‘€IØ�Ñ€IØÐùò 	Xs   Â3#DÚcharsc                 ó  • U c  US   n Uc  [        X5      $ SUR                  5       ;  a  [        S5      e[        XUS   5      n[	        U5      S:”  a  [        XUS   5      nOUnUR
                  nUR                  n[        R                  " XV5      nXg-  n[        R                  R                  5       n	US   U	(       a  SO
US   US	   -
  -  n
[        R                  " SU
* UR                  S5      nUR                  nXÇ) -  nU$ )
a*  Calculate the span quad for 'dict' / 'rawdict' text extractions.

Notes:
    There are two execution paths:
    1. For the full span quad, the result of 'recover_quad' is returned.
    2. For the quad of a sub-list of characters, the char quads are
       computed and joined. This is only supported for the "rawdict"
       extraction option.

Args:
    line_dir: (tuple) 'line["dir"]' of the owning line.
    span: (dict) the span.
    chars: (list, optional) sub-list of characters to consider.
Returns:
    pymupdf.Quad covering selected characters.
r¯  rÒ  z)need 'rawdict' option to sub-select charsr   r   rW   r°  rW  rX  )rÃ  rñ   r"   Úrecover_char_quadrO   r½  r¾  r   rÅ  r*  r±  r1   rä   rÆ  )r­  rg  rÒ  rÇ  rÈ  Úspan_llÚspan_lrrË  rÌ  rÍ  rÎ  Ú	span_rectÚ	span_quads                r   Úrecover_span_quadrÙ  …  sü   € ð" ÑØ˜‘;ˆØ�}Ü˜HÓ+Ð+Ø�d—i‘i“kÓ!ÜÐDÓEÐEä	˜8¨5°©8Ó	4€BÜ
ˆ5ƒz�Aƒ~Ü˜x¨u°R©yÓ9‰àˆà�e‰e€GØ�e‰e€GÜ×Ò Ó1€Dà‰>€Dä�M‰M×1Ñ1Ó3€EØˆV‰žU™¨¨jÑ)9¸DÀÑ<MÑ)MÑO€Aä—’˜Q   D§F¡F¨AÓ.€IØ—‘€IØ�Ñ€IØÐr   Úcharc                 ó‚  • U c  US   n [        U 5      [        Ld  [        U 5      S:w  a  [        S5      e[        U5      [        La  [        S5      e[        U5      [        L a  [
        R                  " US   5      nO7[        U5      [        L a  [
        R                  " US   5      nO[        S5      e[        XU5      $ )a$  Recover the quadrilateral of a text character.

This requires the "rawdict" option of text extraction.

Args:
    line_dir: (tuple) 'line["dir"]' of the span's line.
    span: (dict) the span dict.
    char: (dict) the character dict.
Returns:
    The quadrilateral enveloping the character.
r¯  rÑ   rÁ  rÂ  r”   r   )r’   r$  rO   r"   r·   r   r1   r¿  )r­  rg  rÚ  r”   s       r   rÔ  rÔ  ²  s£   € ð ÑØ˜‘;ˆÜˆHƒ~œUÒ"¤c¨(£m°qÓ&8ÜÐ0Ó1Ð1ÜˆDƒzœÒÜÐ,Ó-Ð-ÜˆDƒz”TÒÜ�|Š|˜D ™LÓ)‰Ü	ˆd‹”uÒ	Ü�|Š|˜D ™GÓ$‰äÐ,Ó-Ð-ä˜X¨TÓ2Ð2r   )NNNF)NNNFNr   )NNNr   )N)NN)r   ÚengéH   FN)ra   )Br�  Útypingr…   rH   r   rÞ   Úformat_grü   rß   r   r   r   r   Ú
ByteStringÚAttributeErrorÚbytesÚ	bytearrayÚ
memoryviewÚAnyÚAnyTypeÚUnionrL   ÚOptIntÚOptionalr	  ÚOptFloatrƒ  ÚOptStrr·   ÚOptDictÚOptBytesÚSequenceÚOptSeqrÂ   ÚTextPageÚboolÚlistr&   rB   rg   rl   rr   r¯   rË   r÷   r  r:  r?  rA  r$  rD  rR  r€   r`  rh  rx  r  r{  r…  r„  r¶  r¿  rÃ  rÑ  rÙ  rÔ  r   r   r   Ú<module>ró     sõ  ðó Û Û ðÝð ×Ñ€	à×3Ñ3Ð à€
Ø€	Ø€Ø€	ð0Ø×"Ñ"€Jð
 �*‰*€Ø	�‰�c˜4�iÑ	 €Ø�?‰?˜5Ñ!€Ø	�‰˜Ñ	€Ø
�/‰/˜$Ñ
€Ø�?‰?˜:Ñ&€Ø	�‰˜Ÿ™Ñ	)€ðð ØØ!%ØñØ
�,‰,ðà
ðð ðð ×Ñð	ð
 ðð 
õðH ØØ!%ØØØñLØ
�,‰,ðLà
ðLð ðLð ×Ñð	Lð
 ðLð 
õLðb ØØ!%ØñrØ
�,‰,ðrà
ðrð ðrð ×Ñð	rð 	õrðp "&ñØ
�,‰,ðà
ðð ×Ñðð 	õ	ð( Ø!%ñØ
�,‰,ðàðð 	ðð ð	ð
 ×Ñõð* ØØØØñO3Ø
�,‰,ðO3àðO3ð ðO3ð 
ð	O3ð
 ðO3ð ðO3ð ×ÑõO3ðh ðjð ØØ!%ØØØòjØ
�,‰,ðjàðjð ð	jð
 ðjð ×Ñðjð öjñZ8 dõ 8ðv7�Sð 7 ð 7¨#ô 7ðtP�g—l‘lð P¨ð P°#ô PðB@�dô @ð$˜$ô $ðB�3ð B˜5ô Bð$�cð $˜eô $ðN"*˜g×.Ñ.ð "*°cð "*¸eô "*òJ:ð"ò$òD6ð*¨3ô ð&˜#ô ð$0˜ð 0 ô 0ðD/( ð /(¨Tð /(¸ð /(À7Ç<Á<ô /(ðd;˜5ð ;¨ð ;°·±ô ;ñ *˜Dð *¨ð *¸¿¹õ *ñZ* ð *¨Tð *¸$ð *È'Ï,É,õ *ðZ3 ð 3¨Tð 3¸ð 3À'Ç,Á,õ 3øðG% ó Þðûð  ó 0à˜Ñ" ZÑ/ƒJð0ús"   ŽK µK# Ë
K ËK Ë#K5Ë4K5