Ë
    ¨Œj>“  ã                   óÖ  — d dl Z d dlZd dlZ	 ddlmZ 	 ddlmZ ej                  Zej                  Z	dZ
dZdZdZ	 ej                  Zej&                  Zej*                  edf   Zej0                  e   Zej0                  e   Zej0                  e   Zej0                  e   Zej0                  ej@                     Z!	 	 	 	 	 dAd
ejD                  dededejF                  de$de%fd„Z&	 	 	 	 	 	 dBd
ejD                  dededejF                  de$de%fd„Z'	 	 	 	 dCd
ejD                  dededejF                  def
d„Z(	 dDd
ejD                  dedejF                  defd„Z)	 	 dEd
ejD                  de
de
dedejF                  f
d„Z*	 	 	 	 	 dFd
ejD                  dededede$dedejF                  fd„Z+	 dGdddd	dddœd
ejD                  dedededejF                  de$fd „Z,dDdefd!„Z-d"ed#edefd$„Z.d
ejD                  d%edefd&„Z/de%fd'„Z0de%fd(„Z1d)ede2fd*„Z3d)ede2fd+„Z4d,ejj                  d"ede2fd-„Z6d.„ Z7	 d/„ Z8d0„ Z9defd1„Z:defd2„Z;d3edefd4„Z<d5e2d6ed7e2dejz                  fd8„Z>d5e2d6edejz                  fd9„Z?dDd:ed;e%dejz                  fd<„Z@dDd5e2d6ed=e%dejz                  fd>„ZAd5e2d6ed?edejz                  fd@„ZBy# e$ r d dlZY �Œ¯w xY w# e$ r d dlZY �Œ¸w xY w# e$ r eez  ez  ZY �ŒŸw xY w)Hé    Né   )Úpymupdf)ÚmupdfÚ
point_likeÚ	rect_likeÚmatrix_likeÚ	quad_likeFÚpageÚclipÚflagsÚtextpageÚsortÚreturnc                 ó  — t        j                  | «       |€t         j                  }|}|€| j                  ||¬«      }nt	        |d«      | k7  rt        d«      ‚|j                  «       }|€~|r|j                  d„ ¬«       |S )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                 ó   — | d   | d   fS ©Né   r   © )Úbs    úW/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/pymupdf/utils.pyÚ<lambda>z!get_text_blocks.<locals>.<lambda>R   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&   4   sŠ   € ô" ×Ñ˜ÔØ€}Ü×(Ñ(ˆØ	€BØ	€zØ×Ñ D°ÐÓ6‰Ü	��XÓ	 $Ò	&ÜÐ6Ó7Ð7à×ÑÓ€FØÐØÙØ�‰Ñ.ˆÔ/Ø€Mr   r   c                 óÌ  ‡— ˆfd„}t        j                  | «       |€t         j                  }|}|€| j                  ||¬«      }nt	        |d«      | k7  rt        d«      ‚|j                  |«      }	|�]|�[t        j                  |«      }|	D �
cg c];  }
t        ||
dd z  «      dt        t        j                  |
dd «      «      z  k\  sŒ:|
‘Œ= }	}
|€~|	r
|r ||	«      }	|	S c c}
w )aœ  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                 ó  •— | j                  d„ ¬«       g }| d   g}t        j                  | d   dd «      }| dd D ]¤  }t        j                  |dd «      }t        |j                  |j                  z
  «      ‰k  s%t        |j
                  |j
                  z
  «      ‰k  r|j                  |«       ||z  }Œ||j                  d„ ¬«       |j                  |«       |g}|}Œ¦ |j                  d„ ¬«       |j                  |«       |S )	z1Sort words line-wise, forgiving small deviations.c                 ó   — | d   | d   fS r   r   ©Úws    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>r   s   €  ! A¡$¨¨!©¡r   r   r   Né   r   c                 ó   — | d   S ©Nr   r   r*   s    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>   s   € ¨¨!ªr   c                 ó   — | d   S r.   r   r*   s    r   r   z4get_text_words.<locals>.sort_words.<locals>.<lambda>„   s   €   !¢r   )r   r   ÚRectÚabsÚy0Úy1ÚappendÚextend)ÚwordsÚnwordsÚlineÚlrectr+   ÚwrectÚ	tolerances         €r   Ú
sort_wordsz"get_text_words.<locals>.sort_wordsp   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"   ÚextractWORDSr0   r1   )r
   r   r   r   r   Ú
delimitersr;   r<   r$   r6   r+   s         `    r   Úget_text_wordsr@   V   sú   ø€ ô4ô2 ×Ñ˜ÔØ€}Ü×'Ñ'ˆØ	€BØ	€zØ×Ñ D°ÐÓ6‰Ü	��XÓ	 $Ò	&ÜÐ6Ó7Ð7à�O‰O˜JÓ'€Eð Ð Ð 0ä�|‰|˜DÓ!ˆáó
Ù�!¤ D¨1¨R¨a¨5¡LÓ 1°S¼3¼w¿|¹|ÈAÈbÈqÈEÓ?RÓ;SÑ5SÓ SŠA�uð 	ð 
ð ÐØÙ‘á˜5Ó!ˆà€Lùò
s   Â;C!Ã
C!c           	      ó~  — d„ }t        | |||d|¬«      D �cg c]  }t        j                  |dd «      |d   f‘Œ! }}|syt        j                  «       }|D ]
  \  }	}
||	z  }Œ g }|d   g}|d   d   }|dd D ]“  \  }	}
|d	   \  }}t	        |j
                  |	j
                  z
  «      |k  s%t	        |j                  |	j                  z
  «      |k  r|j                  |	|
f«       ||	z  }Œq |||«      }|j                  ||f«       |	|
fg}|	}Œ•  |||«      }|j                  ||f«       |j                  d
„ ¬«       |d   d   }
|d   d   j                  }|dd D ]Y  \  }}t        t        t        |j
                  |z
  |j                  z  «      «      d«      }d|dz   z  }|
||z   z  }
|j                  }Œ[ |
S c c}w )a¯  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                 ó„  — |j                  d„ ¬«       d}| j                  }t        j                  «       }|D ]…  \  }}||z  }t	        t        t        |j                  |z
  |j                  z  t        |«      z  «      «      || j                  k(  s|j                  |k  rdnd«      }|d|z  |z   z  }|j                  }Œ‡ |S )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                 ó    — | d   j                   S r.   )Úx0r*   s    r   r   z4get_sorted_text.<locals>.line_text.<locals>.<lambda>Ñ   s   €   !¡§¢r   r   Ú r   r   Ú )
r   rD   r   Ú
EMPTY_RECTÚmaxÚintÚroundÚwidthÚlenÚx1)r   r8   ÚltextrM   r9   ÚrÚtÚdists           r   Ú	line_textz"get_sorted_text.<locals>.line_textÄ   s´   € ð 	�	‰	Ñ'ˆ	Ô(ØˆØ�W‰WˆÜ×"Ñ"Ó$ˆÛ‰DˆAˆqØ�Q‰JˆEäÜ”E˜1Ÿ4™4 "™9¨¯©Ñ/´#°a³&Ñ8Ó9Ó:Ø˜DŸG™G’m q§t¡t¨r¢z‘¸óˆDð
 �S˜4‘Z !‘^Ñ#ˆEØ—‘‰Bð ð ˆr   T)r   r   r   r   r;   Nr,   rE   r   r   éÿÿÿÿc                 ó    — | d   j                   S r.   )r3   )Úls    r   r   z!get_sorted_text.<locals>.<lambda>  s   € ˜a ™dŸgšgr   r   é   Ú
)r@   r   r0   rG   r1   r2   r3   r4   r   ÚminrI   rJ   Úheight)r
   r   r   r   r;   rR   r+   r6   ÚtotalboxÚwrÚtextÚlinesr8   r9   Úw0rÚ_rN   r3   ÚdistanceÚbreakss                       r   Úget_sorted_textrb   ¥   s  € ò>ô@  ØØØØØØõ
ó
ñ
ˆAô 
�‰�a˜˜�eÓ	˜a ™dÒ#ð
ð 
ð 
ñ ØÜ×!Ñ!Ó#€HÛ‰ˆˆDØ�B‰‰ð ð €EØ�!‰Hˆ:€DØ�!‰H�Q‰K€Eð ˜!˜"“I‰ˆˆDØ�b‘‰ˆˆQô ˆu�x‰x˜"Ÿ%™%ÑÓ  IÒ-´°U·X±XÀÇÁÑ5EÓ1FÈ)Ò1SØ�K‰K˜˜T˜
Ô#Ø�R‰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                 óŒ   — |}|€| j                  «       }nt        |d«      | k7  rt        d«      ‚|j                  |«      }|€~|S )Nr   r   )r    r!   r"   ÚextractTextbox)r
   rc   r   r$   Úrcs        r   Úget_textboxrg     sU   € ð
 
€BØ	€zØ×ÑÓ ‰Ü	��XÓ	 $Ò	&ÜÐ6Ó7Ð7Ø	×	Ñ	˜4Ó	 €BØÐØØ€Ir   Úp1Úp2c                 óÚ   — t        j                  | «       |}|€"| j                  |t         j                  ¬«      }nt	        |d«      | k7  rt        d«      ‚|j                  ||«      }|€~|S )Nr   r   r   )r   r   r    ÚTEXT_DEHYPHENATEr!   r"   ÚextractSelection)r
   rh   ri   r   r   r$   rf   s          r   Úget_text_selectionrm   *  sr   € ô ×Ñ˜ÔØ	€BØ	€zØ×Ñ D´×0HÑ0HÐÓI‰Ü	��XÓ	 $Ò	&ÜÐ6Ó7Ð7Ø	×	Ñ	˜R Ó	$€BØÐØØ€Ir   ÚlanguageÚdpiÚfullÚtessdatac                 ó<  ‡— t        j                  | «       t        j                  ‰«      Šˆfd„}|r || |||«      S | j                  |¬«      }| j	                  dt         j
                  ¬«      d   D �]`  }|d   dk7  rŒt        j                  |d   «      }	|	j                  dk  s|	j                  dk  rŒD	 t        j                  |d	   «      }
|
j                  |
j                  z
  dk7  r$t        j                  t         j                  |
«      }
|
j                  rt        j                  |
d
«      }
t        j                  d|
j                  |‰¬«      «      }|j                  d
«      }d}
|j                   }t        j"                  d|j                  z  d|j                  z  «      }||d   z  }|j%                  |d
|¬«       |j'                  «        �Œc |S # t(        t*        j,                  f$ r( 	 d}t        j2                  d«        || |||«      cY c S w xY w)as  Create a Textpage from combined results of normal and OCR text parsing.

    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 image, or only its images (default)
    c                 óò  •— |dz  }t        j                  ||«      }| j                  |¬«      }t        j                  d|j	                  d|‰¬«      «      }|j                  d«      }| j                  j                  |j                  j                  z  }	t        j                  |	|	«      | j                  z  }
|j                  ||
¬«      }|j                  «        d }t        j                  | «      |_        |S )NéH   )ÚmatrixÚpdfF)Úcompressrn   rq   r   ©r   ru   )r   ÚMatrixÚ
get_pixmapÚDocumentÚpdfocr_tobytesÚ	load_pagerc   rK   Úderotation_matrixr    ÚcloseÚweakrefÚproxyr   )r
   ro   rn   r   ÚzoomÚmatÚpixÚocr_pdfÚocr_pageÚunzoomÚctmÚtpagerq   s               €r   Úfull_ocrz"get_textpage_ocr.<locals>.full_ocrP  sÜ   ø€ Ø�R‰xˆÜ�n‰n˜T 4Ó(ˆØ�o‰o SˆoÓ)ˆÜ×"Ñ"ØØ×"Ñ"Ø"Ø%Ø%ð #ó óˆð ×$Ñ$ QÓ'ˆØ—‘—‘ 8§=¡=×#6Ñ#6Ñ6ˆÜ�n‰n˜V VÓ,¨t×/EÑ/EÑEˆØ×%Ñ%¨E¸#Ð%Ó>ˆØ�‰ŒØˆÜ—}‘} TÓ*ˆŒØˆr   )r   Údictr%   Útyper   Úbboxr   Úimager   rv   )rn   rq   NÚ	transformrx   zFalling back to full page OCR)r   r   Úget_tessdatar    Úget_textÚTEXT_PRESERVE_IMAGESr0   rK   rY   ÚPixmapÚnÚalphaÚcsRGBr{   r|   r}   rc   ry   Úextend_textpager   ÚRuntimeErrorr   ÚFzErrorBaseÚg_exceptions_verboseÚexception_infoÚmessage)r
   r   rn   ro   rp   rq   rŠ   r‰   Úblockr�   r„   ÚimgdocÚimgpageÚimgrectÚshrinkrƒ   s        `          r   Úget_textpage_ocrr¢   =  sè  ø€ ô  ×Ñ˜ÔÜ×#Ñ# HÓ-€Hôñ, Ù˜˜c 8¨UÓ3Ð3ð
 ×Ñ EÐÓ*€EØ—‘˜v¬W×-IÑ-I�ÓJÈ8ÕTˆØ�‰=˜AÒØÜ�|‰|˜E &™MÓ*ˆØ�:‰:˜Š?˜dŸk™k¨QÒ.Øð	8Ü—.‘.  w¡Ó0ˆCØ�u‰u�s—y‘yÑ  AÒ%Ü—n‘n¤W§]¡]°CÓ8�Ø�yŠyÜ—n‘n S¨!Ó,�Ü×%Ñ%ØØ×&Ñ&°À8Ð&ÓLóˆFð ×&Ñ& qÓ)ˆGØˆCà—l‘lˆGÜ—^‘^ A¨¯©Ñ$5°q¸7¿>¹>Ñ7IÓJˆFØ˜5 Ñ-Ñ-ˆCØ×#Ñ# E°¸3Ð#Ô?Ø�L‰LŽNð/ UðB €Løô œe×/Ñ/Ð0ò 	8Øð ˆEÜ�O‰OÐ;Ô<Ù˜D # x°Ó7Ô7ð	8ús   Â9DGÇ<HÈH)r   r   r   r   r?   r;   Úoptionc                ó¬  — t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  dœ
}|j                  «       }||v sJ ‚||vrd}|€||   }|dk(  rt        | |||||¬«      S |dk(  rt        | ||||¬«      S |dk(  r|rt        | ||||¬«      S t        j                  | «       d}	|d	v r| j                  }|�t        j                  |«      }d}	n't!        | «      t         j"                  u r| j                  }	|}
|
€| j%                  ||¬
«      }
nt'        |
d«      | k7  rt)        d«      ‚|dk(  r|
j+                  |	|¬«      }nŸ|dk(  r|
j-                  |	|¬«      }n†|dk(  r|
j/                  |	|¬«      }nm|dk(  r|
j1                  |	|¬«      }nT|dk(  r|
j3                  «       }n>|dk(  r|
j5                  «       }n(|dk(  r|
j7                  «       }n|
j9                  |¬«      }|€~
|S )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".
    )
r\   ÚhtmlÚjsonÚrawjsonÚxmlÚxhtmlr‹   Úrawdictr6   r%   r\   Nr6   )r   r   r   r   r?   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   Úlowerr@   r&   rb   r   Úcropboxr0   rŒ   ÚPager    r!   r"   ÚextractJSONÚextractRAWJSONÚextractDICTÚextractRAWDICTÚextractHTMLÚ
extractXMLÚextractXHTMLÚextractText)r
   r£   r   r   r   r   r?   r;   Úformatsr«   r$   rP   s               r   r‘   r‘   ‘  se  € ô: ×&Ñ&Ü×&Ñ&Ü×&Ñ&Ü×,Ñ,Ü×$Ñ$Ü×(Ñ(Ü×&Ñ&Ü×,Ñ,Ü×(Ñ(Ü×*Ñ*ñ€Gð �\‰\‹^€FØ�WÑÐÐØ�WÑØˆØ€}Ø˜‘ˆà�ÒÜØØØØØØ!ô
ð 	
ð �ÒÜØ�t 5°8À$ô
ð 	
ð �Ò™DÜØØØØØô
ð 	
ô ×Ñ˜ÔØ	€BØÐ)Ñ)Ø�|‰|ˆØÐÜ�|‰|˜DÓ!ˆØ‰Ü	ˆd‹”w—|‘|Ñ	#Ø�\‰\ˆà	€Bà	€zØ×Ñ D°ÐÓ6‰Ü	��XÓ	 $Ò	&ÜÐ6Ó7Ð7à�ÒØ�N‰N˜b tˆNÓ,‰Ø	�9Ò	Ø×Ñ ¨$ÐÓ/‰Ø	�6Ò	Ø�N‰N˜b tˆNÓ,‰Ø	�9Ò	Ø×Ñ ¨$ÐÓ/‰Ø	�6Ò	Ø�N‰NÓ‰Ø	�5ŠØ�M‰M‹O‰Ø	�7Ò	Ø�O‰OÓ‰à�N‰N ˆNÓ%ˆàÐØØ€Hr   c                 óÐ  — t        | t        j                  «      r| j                  |«      }n;t        | t        j                  «      r| j
                  }nJ dt        | «      ›d�«       ‚|j                  ddœ}	 t        | d«      r| j                  |d<   t        j                  dd«      }|j                  t        j                  z  r|j                   j"                  |_        |j                  t        j$                  z  r|j                   j&                  |_        |j                  t        j(                  k(  r|j*                  |d<   |S |j                  t        j,                  k(  rS|j.                  |d	<   ||d
<   |j                  t        j0                  z  r|j2                  j"                  |d<   |S d|d<   |S |j                  t        j4                  k(  r’|j6                  j9                  dd«      |d<   |j.                  |d	<   |j.                  dk  r|j
                  |d
<   |S ||d
<   |j                  t        j0                  z  r|j2                  j"                  |d<   |S d|d<   |S |j                  t        j:                  k(  r!|j6                  j9                  dd«      |d<   |S |j                  t        j<                  k(  ri|j>                  jA                  «       |jA                  «       z  rJ ‚|jC                  |j>                  «       d
|v rt        j                  |d
   «      |d
<   |S |j.                  |d	<   |S # t        $ r! t        dk\  rt        j                  «        Y �ŒÑw xY w)Nr   zUnexpected type(ln)=Ú.)ÚkindÚxrefrc   Úfromé   Úurir
   Útor‚   g        Ú\Ú/Úfile)"Ú
isinstancer   ÚOutlineÚdestinationÚLinkÚdestrŒ   rÀ   Úhasattrrc   Ú	Exceptionrš   r›   Ú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æ   þ  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ð% ˆBˆ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   Á8L; Ì;&M%Í$M%rÁ   Úddictc                 óð  — |syd„ }d„ }d„ }d„ }d„ }t        |«      t        t        fv r || d|d«      }|S |j                  dt        j
                  «      }|t        j
                  k(  ry|d   t        j                  k(  rJ|j                  d	d«      }	|j                  d
t	        j                  dd«      «      }
|
\  }} || |||	«      }|S |d   t        j                  k(  r  |t	        j                  |d   «      «      }|S |d   t        j                  k(  r#t	        j                  |d   «      } |||«      }|S |d   t        j                  k(  rB|d   dk  r:t	        j                  |d   «      } |t	        j                  |d
   «      ||«      }|S |d   t        j                  k(  rO|d   dk\  rGt	        j                  |d   «      } ||d   |d
   j                  |d
   j                  |d	   ||«      }|S y)zrCalculate the PDF action string.

    Notes:
        Supports Link annotations and outline items (bookmarks).
    rE   c                 ó,   — d| › dt        |||f«      › d�S )Nz/A<</S/GoTo/D[z	 0 R/XYZ z]>>©Ú	_format_g)Úar   ÚcÚds       r   r   zgetDestStr.<locals>.<lambda>A  s!   €  N°1°#°Y¼yÈ!ÈQÐPQÈÓ?SÐ>TÐTWÑ"Xr   c           	      ó8   — d| › dt        |||f«      › d|› d|› d�	S )Nz/A<</S/GoToR/D[z /XYZ z]/F<</Fú/UFú/Type/Filespec>>>>rê   )rì   r   rí   rî   ÚeÚfs         r   r   zgetDestStr.<locals>.<lambda>B  s5   € ¨O¸A¸3¸fÄYÐPQÐSTÐVWÈyÓEYÐDZÐZaÐbcÐadÐdgÐhiÐgjÐj|Ñ*}r   c                 ó   — d| › d|› d|› d�S )Nz/A<</S/GoToR/Dz/F<</Frð   rñ   r   )rì   r   rí   s      r   r   zgetDestStr.<locals>.<lambda>C  s   €  >°!°°F¸1¸#¸SÀÀÐCUÑ!Vr   c                 ó   — d| › d|› d�S )Nz/A<</S/Launch/F<</Frð   rñ   r   )rì   r   s     r   r   zgetDestStr.<locals>.<lambda>D  s   € Ð 3°A°3°c¸!¸Ð<NÑOr   c                 ó   — d| › d�S )Nz/A<</S/URI/URIz>>r   )rì   s    r   r   zgetDestStr.<locals>.<lambda>E  s   € ˜.¨¨¨2Ñ.r   r   rÀ   r‚   rÅ   rÄ   rÈ   r
   )rŒ   rI   Ú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  9  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ˆØ‰ˆ�Ù˜˜f e¨VÓ4ˆØˆàˆV�}œ×(Ñ(Ò(Ù”w×*Ñ*¨5°©<Ó8Ó:ˆØˆàˆV�}œ×+Ñ+Ò+Ü×#Ñ# E¨&¡MÓ2ˆÙ˜% Ó'ˆØˆàˆV�}œ×*Ñ*Ò*¨u°V©}¸qÒ/@Ü×#Ñ# E¨&¡MÓ2ˆÙœ'×-Ñ-¨e°D©kÓ:¸EÀ5ÓIˆØˆàˆV�}œ×*Ñ*Ò*¨u°V©}ÀÒ/AÜ×#Ñ# E¨&¡MÓ2ˆÙØ�&‰MØ�$‰K�M‰MØ�$‰K�M‰MØ�&‰MØØó
ˆð ˆàr   Úlnkc           	      ór  — | j                   }| }|d   }t        t        ||z  «      «      }d}|d   t        j                  k(  rê|d   dk\  r®t        j
                  d   }|d   }| j                  j                  |«      }	|j                  dt        j                  dd«      «      }
| j                  |   }|j                   }| }|
|z  } ||	|j                  |j                  |j                  dd«      |«      }�nét        j
                  d	   } |t        j                  |d   «      |«      }�nµ|d   t        j                  k(  rå|d   dk\  r¦t        j
                  d
   }|j                  dt        j                  dd«      «      }
t        |
«      t        j                  urt        j                  dd«      }
 ||d   |
j                  |
j                  |j                  dd«      |d   |d   |«      }nñt        j
                  d   } |t        j                  |d   «      |d   |«      }nº|d   t        j                  k(  r$t        j
                  d   } ||d   |d   |«      }n€|d   t        j                   k(  r t        j
                  d   } ||d   |«      }nJ|d   t        j"                  k(  r4t        j
                  d   }|j                  d«      }|€|d   } |||«      }|s|S t%        | j'                  «       D �cg c]#  }|d   t        j(                  k(  sŒ|d   |d   f‘Œ% c}«      }|j                  dd«      }|r|d   |f|j+                  «       v r|}nBd}t        j,                  j/                  «       dz   }	 ||z  }||j1                  «       vrn|dz  }Œ|j3                  dd|z  «      }|S c c}w )NrÂ   rE   rÀ   r
   r   Úgoto1rÅ   r‚   Úgoto2Úgotor1rÈ   Úgotor2ÚlaunchrÄ   rß   ÚnameÚ	nameddestr   rÃ   ÚidrÁ   z-L%iz/Linkz/Link/NM(%s))Ú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ˆ   ÚictmrO   rc   ÚannotÚtxtÚpnorÁ   rå   Ú	dest_pageÚdest_ctmÚ	dest_ictmÚipntÚlnamerÓ   Ú
link_namesÚold_namer  ÚiÚstems                         r   ÚgetLinkTextr'  s  s�  € ð ×
$Ñ
$€CØˆ4€DØˆF‰€AÜ”U˜1˜t™8“_Ó%€Dà€EØ
ˆ6�{”g×'Ñ'Ò'Øˆv‰;˜!ÒÜ×$Ñ$ WÑ-ˆCØ�f‘+ˆCØ—;‘;×(Ñ(¨Ó-ˆDØ—'‘'˜$¤§¡¨a°Ó 3Ó4ˆCØŸ™ CÑ(ˆIØ ×6Ñ6ˆHØ!˜	ˆIØ˜‘?ˆDÙ˜˜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˜4Ó ˆÙØˆô Ø#×/Ñ/Ô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˜' >°DÑ#8Ó9€EØ€Lùò# 	Us   Ë>N4ÌN4c            
      ól   — t        j                  «       D � ���cg c]	  \  } }}}| ‘Œ c}}}} S c c}}}} w )zP
    Returns a list of upper-case colour names.
    :rtype: list of strings
    ©r   Úcolors_wx_list)r  rO   Úgr   s       r   ÚgetColorListr,  Ô  s/   € ô
 '.×&<Ñ&<Ô&>Ö?Ñ&>‘]�T˜1˜a ŠDÐ&>Ô?Ð?ùÕ?s   š.
c                  ó*   — t        j                  «       S )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   ÚgetColorInfoListr.  Ü  s   € ô ×!Ñ!Ó#Ð#r   r  c                 óf   — t        j                  «       j                  | j                  «       d«      S )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   ÚgetColorr1  æ  s&   € ô ×"Ñ"Ó$×(Ñ(¨¯©«°yÓAÐAr   c                 ó<  — 	 t        «       t        «       j                  | j                  «       «         }|d   dz  }|d   dz  }|d   dz  }t        |||«      }t        |dz  d«      }t        |||«      }||z
  }|dk(  rd}	n6||k(  rd||z
  |z  d	z  z  }	n"||k(  rd||z
  |z  dz   z  }	nd||z
  |z  d
z   z  }	t        t        |	«      «      }
|dk(  rd}n||z  }t        t        |dz  «      «      }|
||fS # t        $ r t
        rt        j                  «        Y yw xY w)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.
    )rS   rS   rS   r   g     ào@rÃ   r   éd   r   g      N@é   r,   )r.  r,  ÚindexÚupperrÏ   rš   r   r›   rH   rJ   rX   rI   )r  rÓ   rO   r+  r   ÚcmaxÚVÚcminÚdeltaÚhueÚHÚsatÚSs                r   ÚgetColorHSVr?  ï  sE  € ðÜÓœ|›~×3Ñ3°D·J±J³LÓAÑBˆð
 	
ˆ!‰ˆu‰€AØ	ˆ!‰ˆu‰€AØ	ˆ!‰ˆu‰€AÜˆq�!�Q‹<€DÜˆd�S‰j˜!Ó€AÜˆq�!�Q‹<€DØ�4‰K€EØ�‚zØ‰Ø	�ŠØ˜˜A™ ‘¨!Ñ+Ñ,‰Ø	�ŠØ˜˜A™ ‘¨!Ñ+Ñ,‰à˜˜A™ ‘¨!Ñ+Ñ,ˆäŒE�#‹J‹€Aàˆq‚yØ‰à�d‰lˆÜŒE�#˜‘)ÓÓ€Aàˆq�!ˆ9Ðøô9 ò Ý¤G×$:Ñ$:Ô$<Ùðús   ‚2C5 Ã5#DÄDÚdocc                 ód  — | j                  |«      \  }}}}d}d}|dk(  r|||||fS |rj	 t        j                  |¬«      }|j                  }|j                  }|j
                  }	||z
  dk  r |	j                  |k  r|	j                  }d|z
  }|||||fS |dk7  r/	 t        j                  |«      }|j                  }|j                  }n
|dz  }|dz  }|||||fS # t        $ r! t        j                  «        |dz  }|dz  }Y Œuw xY w# t        $ r! t        j                  «        |dz  }|dz  }Y Œ]w xY w)Ngš™™™™™é?gš™™™™™É¿rE   )Ú
fontbufferr   g333333ó?zn/a)	Úextract_fontr   ÚFontÚascenderÚ	descenderr�   r2   rÏ   r›   )
r@  rÁ   ÚfontnameÚextÚstypeÚbufferÚascÚdscÚfontr�   s
             r   Ú_get_font_propertiesrN    sW  € Ø#&×#3Ñ#3°DÓ#9Ñ €Hˆc�5˜&Ø
€CØ
€CØ
ˆb‚yØ˜˜e S¨#Ð-Ð-áð	Ü—<‘<¨6Ô2ˆDØ—-‘-ˆCØ—.‘.ˆCØ—9‘9ˆDØ�S‰y˜1Š}Ø—7‘7˜S’=ØŸ'™'�CØ˜#‘g�ð
 ˜˜e S¨#Ð-Ð-Ø
ˆe‚|ð	Ü—<‘< Ó)ˆDØ—-‘-ˆCØ—.‘.‰Cð 	ˆs‰
ˆØˆs‰
ˆØ�S˜%  cÐ)Ð)øô# ò 	Ü×"Ñ"Ô$Ø�3‰JˆCØ�3‰JŠCð	ûô ò 	Ü×"Ñ"Ô$Ø�3‰JˆCØ�3‰JŠCð	ús$   ªA"C Â-D Ã'DÄDÄ'D/Ä.D/c                 ó�   — d}d}| j                   j                  }	 |sn!|dz  }||j                  z  }|j                  }Œ$d|› d|› �S )Nr   r   z
num_spans=z num_chars=)Ú
m_internalÚheadrL   Únext)r\   Ú	num_spansÚ	num_charsÚspans       r   Ú_show_fz_textrV  ;  s`   € ð
 €IØ€IØ�?‰?×Ñ€DØ
ÙØØ�Q‰ˆ	Ø�T—X‘XÑˆ	Ø�y‰yˆð ð ˜	�{ +¨i¨[Ð9Ð9r   c                 óf  — | \  }}|dd j                  d«      dd }|dddœ}d}t        |«      D ]~  \  }} |rd}Œ| d	k(  r||dz      |d
<   d}Œ| j                  d«      r+| dd j                  dd«      j                  dd«      }||d<   ŒZ| j                  d«      sŒlt	        | dd «      }||d<   Œ€ |S )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   NrE   )Ú	startpageÚprefixÚfirstpagenumFr>  ÚstyleTÚPÚ(Ú)rZ  ÚStr[  )ÚsplitÚ	enumerateÚ
startswithrÜ   rI   )Úitemr  Úrulerî   Úskipr%  rÓ   s          r   Ú	rule_dictrg  ^  sá   € ð �I€CˆØ��"ˆ:×Ñ˜CÓ   Ð$€DØ R¸Ñ;€AØ€DÜ˜T–?‰ˆˆ4ÙØˆDØØ�3Š;Ø˜a !™e™ˆAˆg‰JØˆDØØ�?‰?˜3ÔØ�Q�R�× Ñ   bÓ)×1Ñ1°#°rÓ:ˆAØˆAˆh‰KØØ�?‰?˜4Õ Ü�D˜˜�H“ˆAØ !ˆAˆnÒð #ð €Hr   c                 óî   — |D �cg c]  }|d   | k  sŒ|‘Œ c}d   }t        |«      }|j                  dd«      }|j                  dd«      }|dv rdnd}| |d   z
  |d   z   |z   }t        |||«      S c c}w )	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   rS   rZ  rE   r\  )rì   ÚArY  r[  )rg  rø   Úconstruct_label)	ÚpgNoÚlabelsrÓ   rd  re  rZ  r\  r:  Ú
pagenumbers	            r   Úget_label_pnorn  €  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
   …A2“A2c                 ó,  — d}| dk(  rt        |«      }n{| dk(  rt        |«      j                  «       }n\| dk(  rt        |«      j                  «       }n=| dk(  rt	        |«      j                  «       }n| dk(  rt	        |«      j                  «       }||z   }|S )z9Construct a label based on style, prefix and page number.rE   ÚDrO   ÚRrì   ri  )ÚstrÚintegerToRomanr²   r6  ÚintegerToLetter)r\  rZ  r  Ún_strÚresults        r   rj  rj  •  s�   € ð €EØ�‚|Ü�C“‰Ø	�#ŠÜ˜sÓ#×)Ñ)Ó+‰Ø	�#ŠÜ˜sÓ#×)Ñ)Ó+‰Ø	�#ŠÜ Ó$×*Ñ*Ó,‰Ø	�#ŠÜ Ó$×*Ñ*Ó,ˆØ�e‰^€FØ€Mr   c           
      ó\  — ddl }|j                  }d| }}t        d|«      |k  r7|t        t	        j                  d|«      «      z  }|dz  }t        d|«      |k  rŒ7d}t        t        |«      «      D ]8  }t        |t        t	        j                  d|«      «      «      \  }}|||   z  }|}Œ: |S )z-Returns letter sequence string for integer i.r   Nr   é   rE   )ÚstringÚascii_uppercaseÚpowrI   ÚmathÚreversedÚrangeÚdivmod)	r%  ry  Úlsr”   rì   Ústr_tÚjró   r+  s	            r   rt  rt  ¨  s«   € ó Ø	×	Ñ	€BØˆa€q€AÜ
ˆb�!‹*˜Š/Ø	ŒS”—‘˜"˜a“Ó!Ñ!ˆØ	ˆQ‰ˆô ˆb�!‹*˜‹/ð €EÜ”e˜A“hÖˆÜ�aœœTŸX™X b¨!›_Ó-Ó.‰ˆˆ1Ø��A‘‰ˆØ‰ð  ð €Lr   Únumc                 óf   ‡— dŠˆfd„}dj                   || «      D �cg c]  }|‘Œ c}«      S c c}w )z$Return roman numeral for an integer.))iè  ÚM)i„  ÚCM)iô  rp  )i�  ÚCD)r3  ÚC)éZ   ÚXC)é2   ÚL)é(   ÚXL)é
   ÚX)é	   ÚIX)rV   r8  )r,   ÚIV)r   ÚIc              3   ól   •K  — ‰D ]*  \  }}t        | |«      \  }}||z  –— | ||z  z  } | dk  sŒ* y  y ­wr.   )r  )rƒ  rO   ÚltrrÓ   r_   Úromans        €r   Ú	roman_numz!integerToRoman.<locals>.roman_numÎ  sD   øè ø€ Û‰FˆAˆsÜ˜#˜q“>‰DˆAˆqØ˜‘'ŠMØ�1�q‘5‰LˆCØ�a‹xÙñ ùs   ƒ,4°4rE   )Újoin)rƒ  r˜  rì   r—  s      @r   rs  rs  º  s6   ø€ ð€Eô ð �7‰7™y¨œ~Ó.™~˜!’A˜~Ñ.Ó/Ð/ùÒ.s   ž	.Úline_dirrU  r�   c                 óR  — | €|d   } | \  }}t        j                  |«      }t         j                  j                  «       rd}n|d   |d   z
  }||d   z  }||z  }||z  }|dk\  rJ|dk  rE|j                  d|fz
  }	|j
                  |dfz   }
|j                  |dfz
  }|j
                  d|fz   }nâ|dk  rJ|dk  rE|j                  |dfz   }	|j                  d|fz
  }
|j                  d|fz   }|j                  |dfz
  }n“|dk  rJ|dk\  rE|j
                  d|fz
  }	|j                  |dfz   }
|j
                  |dfz
  }|j                  d|fz   }nD|j                  |dfz   }	|j                  d|fz
  }
|j                  d|fz   }|j                  |dfz
  }t        j                  |	|
||«      S )a�  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   rE  rF  Úsizer   )	r   r0   r  Úset_small_glyph_heightsÚblÚtrÚbrÚtlÚQuad)rš  rU  r�   ÚcosÚsinrî   rY   Ú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ÑˆÜ�<‰<˜˜B  BÓ'Ð'r   c                 ó®   — t        | «      t        ust        | «      dk7  rt        d«      ‚t        |«      t        urt        d«      ‚t        | ||d   «      S )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  rL   r"   r‹   r¬  )rš  rU  s     r   Úrecover_quadr°    sR   € ô ˆHƒ~œUÑ"¤c¨(£m°qÒ&8ÜÐ0Ó1Ð1ÜˆDƒzœÑÜÐ,Ó-Ð-Ü˜X t¨T°&©\Ó:Ð:r   r8   Úspansc           	      ó&  — |€| d   }t        |«      dk(  rt        d«      ‚| d   }|\  }}t        ||d   «      }t        |«      dkD  rt        ||d   «      }n|}|j                  }|j                  }t        j                  ||«      }	||	z  }
t
        j                  j                  «       }t        |D �cg c]  }|d   |rdn
|d   |d	   z
  z  ‘Œ c}«      }t        j                  d| |
j                  d«      }|j                  }||	 z  }|S c c}w )
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   rS   r�  rE  rF  )rL   r"   r°  rª  r«  r   Úplanish_liner  rž  rH   r0   rÓ   Úquad)r8   r±  rš  r¤  r¥  Úq0Úq1Úline_llÚline_lrÚmat0Úx_lrÚsmallÚsÚhÚ	line_rectÚ	line_quads                   r   Úrecover_line_quadrÀ    s   € ð €}Ø�W‘ˆÜ
ˆ5ƒz�Q‚Ü˜Ó)Ð)Ø�E‰{€HØ�H€CˆÜ	�h  a¡Ó	)€BÜ
ˆ5ƒz�A‚~Ü˜( E¨"¡IÓ.‰àˆà�e‰e€GØ�e‰e€Gä×Ñ ¨Ó1€Dð �T‰>€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   Â4DÚcharsc                 ó  — | €|d   } |€t        | |«      S d|j                  «       vrt        d«      ‚t        | ||d   «      }t	        |«      dkD  rt        | ||d   «      }n|}|j
                  }|j                  }t        j                  ||«      }||z  }t        j                  j                  «       }	|d   |	rdn
|d   |d	   z
  z  }
t        j                  d|
 |j                  d«      }|j                  }|| z  }|S )
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   rS   r�  rE  rF  )r°  rà   r"   Úrecover_char_quadrL   rª  r«  r   r³  r  rž  r0   rÓ   r´  )rš  rU  rÁ  rµ  r¶  Úspan_llÚspan_lrr¹  rº  r»  r½  Ú	span_rectÚ	span_quads                r   Úrecover_span_quadrÈ  K  s  € ð" ÐØ˜‘;ˆØ€}Ü˜H dÓ+Ð+Ø�d—i‘i“kÑ!ÜÐDÓEÐEä	˜8 T¨5°©8Ó	4€BÜ
ˆ5ƒz�A‚~Ü˜x¨¨u°R©yÓ9‰àˆà�e‰e€GØ�e‰e€GÜ×Ñ ¨Ó1€Dà�T‰>€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                 ót  — | €|d   } t        | «      t        ust        | «      dk7  rt        d«      ‚t        |«      t        urt        d«      ‚t        |«      t        u rt        j                  |d   «      }n5t        |«      t        u rt        j                  |d   «      }nt        d«      ‚t        | ||«      S )aD  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  rL   r"   r‹   r   r0   r¬  )rš  rU  rÉ  r�   s       r   rÃ  rÃ  x  s¥   € ð ÐØ˜‘;ˆÜˆHƒ~œUÑ"¤c¨(£m°qÒ&8ÜÐ0Ó1Ð1ÜˆDƒzœÑÜÐ,Ó-Ð-ÜˆDƒz”TÑÜ�|‰|˜D ™LÓ)‰Ü	ˆd‹”uÑ	Ü�|‰|˜D ™GÓ$‰äÐ,Ó-Ð-ä˜X t¨TÓ2Ð2r   )NNNF)NNNFNr   )NNNr   )N)NN)r   Úengrt   FN)r\   )Cr|  Útypingr€   rE   r   rÏ   r   Úformat_grë   rš   r   r   r   r	   Ú
ByteStringÚAttributeErrorÚbytesÚ	bytearrayÚ
memoryviewÚAnyÚAnyTypeÚUnionrI   ÚOptIntÚOptionalr÷   ÚOptFloatrr  ÚOptStrr‹   ÚOptDictÚOptBytesÚSequenceÚOptSeqr´   ÚTextPageÚboolÚlistr&   r@   rb   rg   rm   r¢   r‘   ræ   r  r'  r,  r.  r  r1  r?  r{   rN  rV  rg  rn  rj  rt  rs  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 "&ñØ
�,‰,ðà
ðð ×Ñðð 	ó	ð( Ø!%ñØ
�,‰,ðàðð 	ðð ð	ð
 ×Ñóð* ØØØØñQØ
�,‰,ðQàðQð ðQð 
ð	Qð
 ðQð ðQð ×ÑóQðl ð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øðS# ò Þðûð ò Þðûð  ò 0à˜Ñ" ZÑ/ƒJð0ús3   ŽJ7 •K ¼K Ê7	KËKË	KËKËK(Ë'K(