+
    ŠvjUt ã                   óô  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIt^ RIt^ RIHt . t. tRt]P"                  t]P&                  t^ ]P*                  ,          ]P,                  ,          ]P.                  ,          ]P0                  ,          t^ ]P.                  ,          ]P4                  ,          ]P6                  ,          ]P0                  ,          t]! ]P<                  4      tR t R t!R t"R	 R
 lt#R t$R t%RqR lt& ! R R]'4      t(. RrOt). RsOt*](! ^ 4      t+^t,^t-^t.^t/^t0^t1Rt2^t3]
! RRRR4      t4RRRRRRRRRRR R!R"R!/t5R# R$ lt6 ! R% R&4      t7 ! R' R(4      t8 ! R) R*4      t9R+ R, lt:]Pv                  ! ]8Px                  4      Pz                  P}                  4       t?]Pv                  ! ]94      Pz                  P}                  4       t@R- R. ltAR/ R0 ltB]03R1 R2 lltCRtR3 R4 lltDR5 tER6 R7 ltFR8 R9 ltGR: R; ltHRuR< R= lltIRvR> R? lltJR@ RA ltKRB RC ltLRD RE ltMRF RG ltN],],3RH ltORI RJ ltP]-3RK RL lltQRM tRRN RO ltSRP RQ ltTRR tURS tV]/3RT RU lltWRV tX].3RW RX lltYRwRY RZ lltZR[ t[R\ t\R] R^ lt] ! R_ R`4      t^ ! Ra Rb]^4      t_ ! Rc Rd4      t` ! Re Rf4      ta] ! Rg Rh4      4       tb ! Ri Rj4      tc RxRk ltdRyRl lteRm tfRn tgRRRRR],RR]-RR^].]/^RR^^^RRRR3Ro Rp llthR# )zaë  
Copyright (C) 2023 Artifex Software, Inc.

This file is part of PyMuPDF.

PyMuPDF is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.

PyMuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
details.

You should have received a copy of the GNU Affero General Public License
along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>

Alternative licensing terms are available from the licensor.
For commercial licensing, see <https://www.artifex.com/> or contact
Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
CA 94129, USA, for further information.

---------------------------------------------------------------------
Portions of this code have been ported from pdfplumber, see
https://pypi.org/project/pdfplumber/.

The ported code is under the following MIT license:

---------------------------------------------------------------------
The MIT License (MIT)

Copyright (c) 2015, Jeremy Singer-Vine

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------------------
Also see here: https://github.com/jsvine/pdfplumber/blob/stable/LICENSE.txt
---------------------------------------------------------------------

The porting mainly pertains to files "table.py" and relevant parts of
"utils/text.py" within pdfplumber's repository on Github.
With respect to "text.py", we have removed functions or features that are not
used by table processing. Examples are:

* the text search function
* simple text extraction
* text extraction by lines

Original pdfplumber code does neither detect, nor identify table headers.
This PyMuPDF port adds respective code to the 'Table' class as method '_get_header'.
This is implemented as new class TableHeader with the properties:
* bbox: A tuple for the header's bbox
* cells: A tuple for each bbox of a column header
* names: A list of strings with column header text
* external: A bool indicating whether the header is outside the table cells.

N)ÚSequence)Ú	dataclass)Ú
itemgetter)Úmupdfc                óÌ   €  V ^ ,          V^ ,          8¬  ;'       dJ    V ^,          V^,          8¬  ;'       d/    V ^,          V^,          8*  ;'       d    V ^,          V^,          8*  # )zBCheck whether rectangle 'inner' is fully inside rectangle 'outer'.© )ÚinnerÚouters   &&ÚQ/var/www/html/daimler-pipeline/venv/lib/python3.14/site-packages/pymupdf/table.pyÚrect_in_rectr   s   sn   € ð	!Ø�!�H˜˜a�Ñ ÷	!ð 	!à�!�H˜˜a�Ñ ÷	!ð 	!ð �!�H˜˜a�Ñ ÷	!ð 	!ð �!�H˜˜a�Ñ ðó    c                óx   a€ \         ;QJ d    V3R lV  4       F  '       g   K   R# 	  R# ! V3R lV  4       4      # )zCCheck whether any of the chars in CHAR are inside rectangle 'rect'.c              3   óî   <"  € T Fj  p S^ ,          VR,          8*  ;'       dJ    VR,          S^,          8*  ;'       d/    S^,          VR,          8*  ;'       d    S^,          VR,          8¬  x € Kl  	  R# 5i)é   Úx0Úx1Úy0Úy1Nr   )Ú.0ÚcÚrects   & €r
   Ú	<genexpr>Ú chars_in_rect.<locals>.<genexpr>€   sƒ   øé € ð ñ ˆAð	Ø��G�q˜•wÑ÷	ð 	àˆd�G�t˜A•wÑ÷	ð 	ð ��G�q˜•wÑ÷	ð 	ð ��G�q˜•wÑô		ó
 ùs   ƒA5£A5¾A5ÁA5TF©Úany)ÚCHARSr   s   &fr
   Úchars_in_rectr   ~   sB   ø€ ç‹3ô ñ ó�3Œ3ð Š3ð ˆ3ô ñ óó ð r   c           	     ó*  € \        ^ \        V ^,          V^,          4      \        V ^ ,          V^ ,          4      ,
          4      p\        ^ \        V ^,          V^,          4      \        V ^,          V^,          4      ,
          4      pW#,          pV'       g   ^ # V ^,          V ^ ,          ,
          V ^,          V ^,          ,
          ,          pV^,          V^ ,          ,
          V^,          V^,          ,
          ,          pWEV,           V,
          ,          # )z2Compute intersection over union of two rectangles.©ÚmaxÚmin)Úr1Úr2ÚixÚiyÚintersectionÚarea1Úarea2s   &&     r
   Ú_iour(   Š   sÃ   € ä	ˆQ”�B�q•E˜2˜a�5Ó!¤C¨¨1­¨r°!­uÓ$5Õ5Ó	6€BÜ	ˆQ”�B�q•E˜2˜a�5Ó!¤C¨¨1­¨r°!­uÓ$5Õ5Ó	6€BØ•7€LßÙØ��U�R˜•U�]˜r !�u r¨!¥u�}Õ-€EØ��U�R˜•U�]˜r !�u r¨!¥u�}Õ-€EØ 5�=¨<Õ7Õ8Ð8r   c                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn©Úbool)Úformats   "r
   Ú__annotate__r0   –   s   € ÷ Mñ M¬tñ Mr   c                ó~   a a€ \         ;QJ d     V V3R lV 4       F  '       g   K   R# 	  R# ! V V3R lV 4       4      # )zMCheck whether any of the words in bbox are cut through by
horizontal line y.
c              3   ó    <"  € T FC  p\        VS4      '       g   K  VP                  Su;8  ;'       d    VP                  8  Mu x € KE  	  R # 5i©N)r   r   r   )r   ÚrÚbboxÚys   & €€r
   r   Ú%intersects_words_h.<locals>.<genexpr>š   s0   øé € ÐL©
 1´lÀ1Àd×6KŒˆq�t‰t�a�Œ˜!Ÿ$™$�‰«
ùs   ƒAœA´ATFr   )r5   r6   Ú
word_rectss   ff&r
   Úintersects_words_hr9   –   s.   ù€ ÷ ‹3ÕL©
ÓL�3Œ3ÐLŠ3ÐLˆ3ÕL©
ÓLÓLÐLr   c                ór   € / p\         P                  P                  V P                  P                  W!4       V# )zAExtract MuPDF table structure information from a given rectangle.)ÚpymupdfÚextraÚmake_table_dictÚthisÚ
m_internal)Útextpager   Ú
table_dicts   && r
   Úget_table_dict_from_rectrB   �   s+   € à€JÜ‡M�M×!Ñ! (§-¡-×":Ñ":¸JÔMØÐr   c           
     óú  a€ . p\        W4      pVP                  R4      \        P                  8w  d   V# \        P
                  ! VR,          4      p\        VR,          R R7      p\        VR,          R R7      pVR,          w  r‰. p
V FU  w  r¼V^ 8”  d   K  \        W[V4      '       d   K"  V
'       d   WºR,          ,
          ^8  d   WºR&   KD  V
P                  V4       KW  	  \        ^ \        \        V
4      ^,
          R	,          4      4      p	V Uu. uF  qÝ^,          V	8:  g   K  V^ ,          NK  	  ppVP                  VR,          ^,           8”  d   VP                  VP                  4       \        \        V
4      ^,
          4       EF[  p\        P
                  ! VP                  W¯,          VP                  W¯^,           ,          4      p\        V Uu. uF  p\        VV4      '       g   K  VNK  	  upR
 R7      pV Uau. uFG  o\         ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   KE  SNKI  	  pp\        \        V4      ^,
          4       Fr  p\        P
                  ! VV,          W¯,          VV^,           ,          W¯^,           ,          4      pVP"                  '       d   KX  VP                  \%        V4      4       Kt  	  EK^  	  V# u upi u upi u upi )z0Detect table structure within a given rectangle.Útyper5   Úxposc                 ó   € V ^ ,          # ©é    r   ©Úxs   &r
   Ú<lambda>Ú&make_table_from_bbox.<locals>.<lambda>°   ó   € ¨q°®tr   ©ÚkeyÚyposc                 ó   € V ^ ,          # rG   r   )r6   s   &r
   rK   rL   ±   rM   r   Úmax_uncertaingffffffÖ?c                 ó   € V P                   # r3   )r   ©r4   s   &r
   rK   rL   Ó   s   € ÈqÏtÊtr   c              3   óv   <"  € T F.  qP                   Su;8  ;'       d    VP                  8  Mu x € K0  	  R # 5ir3   ©r   r   )r   r4   rJ   s   & €r
   r   Ú'make_table_from_bbox.<locals>.<genexpr>Ö   s#   øé € Ð0TÉ)ÀQ·±¸·´¸A¿D¹D·±Ë)ùs   ƒ69TFéÿÿÿÿ)rB   Úgetr   ÚFZ_STEXT_BLOCK_GRIDr;   ÚRectÚsortedr9   Úappendr   ÚroundÚlenr   Úranger   r   r   Úis_emptyÚtuple)r@   r8   r   ÚcellsÚblockr5   rE   rP   ÚxmaxuÚymaxuÚnyposr6   ÚyuncrJ   ÚnxposÚiÚrow_boxr4   Ú	row_wordsÚ	this_xposÚjÚcells   &&&          `        r
   Úmake_table_from_bboxrp   ¤   s:  ø€ à€Eô % XÓ4€Eà‡y�y�ÓœE×5Ñ5Ô5ØˆÜ�<Š<˜˜f�Ó&€Dô �%˜•-¡^Ô4€DÜ�%˜•-¡^Ô4€Dð ˜Õ)�L€Eð €EÛ‰ˆØ�!Œ8ÙÜ˜d z×2Ò2Ùß�a �)•m aÔ'Ø�"‹Ià�L‰L˜ŽOñ ô �”5œ#˜e›* q�.¨DÕ0Ó1Ó2€Eñ  Ó1™4�a Q¥4¨5¡=ŒTˆQˆq�TˆT™4€EÐ1Ø‡w�w��r•˜Q•ÔØ�‰�T—W‘WÔô ”3�u“: •>×"ˆÜ—,’,˜tŸw™w¨­°$·'±'¸5ÀQÅ½<ÓHˆäÙ"Ó?™
�1¤l°1°g×&>�QˆQ™
Ñ?Á^ô
ˆ	ñ !&ÔU¡˜1¯S«SÔ0TÉ)Ó0T¯S¯SªSÔ0TÉ)Ó0T×-T—Q�Q¡ˆ	ÐUÜ”s˜9“~¨Õ)Ö*ˆAÜ—<’< 	¨!¥¨e­h¸	À!ÀaÅ%Õ8HÈ%ÐTUÕPUÍ,ÓWˆDØ—=—=’=Ø—‘œU 4›[Ö)ô +ñ #ð €Lùò% 2ùò @ùò Vs0   ÄK.Ä(K.ÇK3
Ç2K3
ÈK8ÈK8È.K8ÉK8c           	     ó–  € RpV P                  4       R,           EFœ  pVR,          ^ 8w  d   K  VR,          p V^ ,          V^,          8”  g@   V^,          V^ ,          8  g+   V^,          V^,          8”  g   V^,          V^,          8  d   Kt  VR,           EF  pVR,          p V^ ,          V^,          8”  g@   V^,          V^ ,          8  g+   V^,          V^,          8”  g   V^,          V^,          8  d   Kd  V'       d   Y2'       d   RMR,          pVR,          R8H  ;'       g    VR,          R8H  pVR	,           EFn  p	V	R,          p
 V
^ ,          V^,          8”  g@   V
^,          V^ ,          8  g+   V
^,          V^,          8”  g   V
^,          V^,          8  d   Kd  RpV	R
,           Fo  pVR,          p\        P                  ! VR,          4      p\        Wá,          4      R\        V4      ,          8”  d   W½,          pKY  V\        9   g   Kf  VR,          pKq  	  V'       g   Kì  V'       g   W;,          pKþ  RpRpV'       d-   V	R,          \
        ,          '       d   VR,          pRV,           pV	R,          \        ,          '       d   VR,          pRV,           pV	R,          \        P                  ,          '       d   VR,          pRV,           pV	R,          \        P                  ,          '       d   VR,          pRV,           p\        V	R
,          4      ^8”  d   VP                  4       p\        V4      ;p'       d/   VP                  V4      '       d   VRV)  V,           V,           pEK6  VP                  4       '       g   VR,          pEKX  W?V,           V,           ,          pEKq  	  EK  	  EKŸ  	  VP                  4       # )a  Extract text from a rect-like 'cell' as plain or MD styled text.

This function should ultimately be used to extract text from a table cell.
Markdown output will only work correctly if extraction flag bit
TEXT_COLLECT_STYLES is set.

Args:
    textpage: A PyMuPDF TextPage object. Must have been created with
        TEXTFLAGS_TEXT | TEXT_COLLECT_STYLES.
    cell: A tuple (x0, y0, x1, y1) defining the cell's bbox.
    markdown: If True, return text formatted for Markdown.

Returns:
    A string with the text extracted from the cell.
Ú ÚblocksrD   r5   Úlinesú<br>Ú
ÚdirÚspansÚcharsr   g      à?Ú Ú
char_flagsz~~z**ÚflagsÚ_Ú`N)rH   r   )r   rH   )ÚextractRAWDICTr;   r[   ÚabsÚwhite_spacesÚTEXT_STRIKEOUTÚ	TEXT_BOLDÚTEXT_FONT_ITALICÚTEXT_FONT_MONOSPACEDr_   ÚrstripÚendswithÚstrip)r@   ro   ÚmarkdownÚtextrd   Ú
block_bboxÚlineÚlbboxÚ
horizontalÚspanÚsbboxÚ	span_textÚcharÚ	this_charr5   ÚprefixÚsuffixÚlss   &&&               r
   Úextract_cellsr—   ß   s  € ð  €DØ×(Ñ(Ó*¨8×4Ñ4ˆØ��=˜AÔÙØ˜6•]ˆ
àØ˜!�}˜t A�wÔ&Ø˜!�}˜t A�wÔ&Ø˜!�}˜t A�wÔ&Ø˜!�}˜t A�wÔ&áØ˜'—N‘NˆDØ˜•LˆEàØ˜•8˜d 1�gÔ%Ø˜•8˜d 1�gÔ%Ø˜•8˜d 1�gÔ%Ø˜•8˜d 1�gÔ%áçØ¦(™°Õ4�ð ˜e�¨Ñ.×GÐG°$°uµ+ÀÑ2GˆJà˜WŸ™�Ø˜V��àØ˜Q•x $ q¥'Ô)Ø˜Q•x $ q¥'Ô)Ø˜Q•x $ q¥'Ô)Ø˜Q•x $ q¥'Ô)áð �	Ø  ŸM˜M�DØ $ S¥	�IÜ"Ÿ<š<¨¨V­Ó5�DÜ˜4�;Ó'¨#´°D³	­/Ô9Ø!Õ.š	Ø"¤lÖ2Ø! SÕ(š	ñ *÷ !ÙçØÕ%�DÙà�Ø�ß $ |Õ"4´~×"EÔ"EØ˜d•N�FØ! F�]�FØ˜Õ%¬	×1Ô1Ø˜d•N�FØ! F�]�FØ˜•=¤7×#;Ñ#;×;Ô;Ø˜c•M�FØ  6�\�FØ˜•=¤7×#?Ñ#?×?Ô?Ø˜c•M�FØ  6�\�Fä�t˜G•}Ó%¨Ô)Ø )× 0Ñ 0Ó 2�Iô ˜f›+Ð%�BÖ%¨4¯=©=¸×+@Ò+@Ø  " ˜:¨	Õ1°FÕ:“Dà$Ÿ?™?×,Ò,Ø �›à¨Õ 2°VÕ ;Õ;›ôk &ô# #ñ 5ðh �:‰:‹<Ðr   c                   ó   € ] tR tRtRtR# )Ú
UnsetFloatiL  r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r
   r™   r™   L  ó   † Ûr   r™   rt   g      @r   Útopr   Úbottomu   ï¬€Úffu   ï¬ƒÚffiu   ï¬„Úfflu   ï¬�Úfiu   ï¬‚Úflu   ï¬†Ústu   ï¬…c                ó$   € V ^8„  d   QhR\         /# r*   ©Úlist)r/   s   "r
   r0   r0   x  s   € ÷ 	 ñ 	 œ4ñ 	 r   c                 óÔ   € \        V \        4      '       d   V # \        V \        4      '       d   \        V 4      # \        V R 4      '       d   V P	                  R4      pV# \        V 4      # )Úto_dictÚrecords)Ú
isinstancer«   r   Úhasattrr­   )Ú
collectionÚress   & r
   Úto_listr³   x  sZ   € Ü�*œd×#Ò#ØÐÜ	�J¤×	)Ò	)Ü�JÓÐÜ	�˜Y×	'Ò	'Ø× Ñ  Ó+ˆØˆ
ä�JÓÐr   c                   óP   a € ] tR tRt o RtR	V 3R lR lltR
V 3R lR lltRtV tR# )ÚTextMapi„  zŠ
A TextMap maps each unicode character in the text to an individual `char`
object (or, in the case of layout-implied whitespace, `None`).
Nc                ó   <€ V ^8„  d   QhRR/# ©r+   r,   Nr   )r/   Ú__classdict__s   "€r
   r0   ÚTextMap.__annotate__Š  s   ø€ ÷ =ñ = tñ =r   c                ód   € Wn         R P                  \        \        ^ 4      V4      4      V n        R# )rr   N)ÚtuplesÚjoinÚmapr   Ú	as_string©Úselfr»   s   &&r
   Ú__init__ÚTextMap.__init__Š  s"   € ØŒØŸ™¤¤Z°£]°FÓ!;Ó<ˆŽr   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r+   Ú
main_groupÚreturn_groupsÚreturn_charsr,   )Úintr.   Údict)r/   r¸   s   "€r
   r0   r¹   Ž  s5   ø€ ÷ ñ ñ ðñ ð	ñ
 ðñ 
ñr   c           
     óB  € V P                   VP                  V4      VP                  V4       pV UUu. uF  w  rgVf   K  VNK  	  ppp\        V4      w  ršr¼RVP	                  V4      RV	RV
RVRV/pV'       d   VP                  4       VR&   V'       d   W�R&   V# u uppi )NrŠ   r   r¡   r   r¢   Úgroupsry   )r»   ÚstartÚendÚobjects_to_bboxÚgrouprÊ   )rÀ   ÚmrÄ   rÅ   rÆ   ÚsubsetrŠ   r   ry   r   r¡   r   r¢   Úresults   &&&&&         r
   Úmatch_to_dictÚTextMap.match_to_dictŽ  s£   € ð —‘˜QŸW™W ZÓ0°1·5±5¸Ó3DÐEˆÙ$*Ô<¡F‘y˜¨a—�¡FˆÑ<Ü-¨eÓ4Ñˆ�ð �A—G‘G˜JÓ'Ø�"Ø�3Ø�"Ø�fð
ˆ÷ Ø Ÿx™x›zˆF�8ÑçØ#�7‰Oàˆùó# =s   ³BÁ B)r¾   r»   r3   )rH   TT)	r›   rœ   r�   rž   Ú__doc__rÁ   rÒ   rŸ   Ú__classdictcell__©r¸   s   @r
   rµ   rµ   „  s#   ø‡ € ñ÷
=ò =÷÷ ð r   rµ   c                   óf   a € ] tR tRt o RtV 3R lR ltR^ ^ ^ ^ ]]^ ^ ]RRR3V 3R lR llt	R	t
V tR
# )ÚWordMapiª  z
A WordMap maps words->chars.
c                ó   <€ V ^8„  d   QhRR/# r·   r   )r/   r¸   s   "€r
   r0   ÚWordMap.__annotate__¯  s   ø€ ÷ ñ  $ñ r   c                ó   € Wn         R # r3   ©r»   r¿   s   &&r
   rÁ   ÚWordMap.__init__¯  s   € ØŽr   FTc                óD   <€ V ^8„  d   QhRS[ RS[RS[RS[ RS[ RS[ RS[/# )r+   ÚlayoutÚlayout_width_charsÚlayout_height_charsÚuse_text_flowÚ	presortedÚexpand_ligaturesr,   )r.   rÇ   rµ   )r/   r¸   s   "€r
   r0   rÚ   ²  sZ   ø€ ÷ V!ñ V!áðV!ñ
  ðV!ñ !ðV!ñ ðV!ñ ðV!ñ ðV!ñ 
ñV!r   c                ó¸  € . p\        V P                  4      '       g   \        V4      # V'       d   \        M/ pV'       dx   V'       d   V'       d   \	        R4      hM\        \        W&,          4      4      pV'       d   V'       d   \	        R4      hM\        \        W7,          4      4      pR.V,          pM. p^ pV'       g	   V'       d   V P                  M\        V P                  R R7      pV^ ,          ^ ,          pVR,          VR,          ,
          p\        \        VR V
4      4       EFÀ  w  ppV'       d-   V^ ,          ^ ,          R,          VV	,           ,
          V,          M^ p\        \        V^ 8„  4      \        V4      V,
          4      p\        V4       FC  p\        V4      '       d   VR,          ^ ,          R	8X  d
   VV,          pVP                  R4       KE  	  VV,          p^ pV'       g	   V'       d   TM\        VR
 R7      pV Fµ  w  ppV'       d   VR,          V,
          V,          M^ p\        \        ^V4      \        V4      V,
          4      pVR.V,          ,          pVV,          pV FH  pVP                  VR,          VR,          4      p V  F  p!VP                  V!V34       V^,          pK!  	  KJ  	  K·  	  V'       g   EK¨  VR.VV,
          ,          ,          pEKÃ  	  V'       dW   VV^,           ,
          p"\        V"4       F$  pV^ 8”  d
   VV,          pVP                  R4       K&  	  VR,          R8X  d   VRR p\        V4      # )a÷  
Given a list of (word, chars) tuples (i.e., a WordMap), return a list of
(char-text, char) tuples (i.e., a TextMap) that can be used to mimic the
structural layout of the text on the page(s), using the following approach:

- Sort the words by (doctop, x0) if not already sorted.

- Calculate the initial doctop for the starting page.

- Cluster the words by doctop (taking `y_tolerance` into account), and
  iterate through them.

- For each cluster, calculate the distance between that doctop and the
  initial doctop, in points, minus `y_shift`. Divide that distance by
  `y_density` to calculate the minimum number of newlines that should come
  before this cluster. Append that number of newlines *minus* the number of
  newlines already appended, with a minimum of one.

- Then for each cluster, iterate through each word in it. Divide each
  word's x0, minus `x_shift`, by `x_density` to calculate the minimum
  number of characters that should come before this cluster.  Append that
  number of spaces *minus* the number of characters and spaces already
  appended, with a minimum of one. Then append the word's text.

- At the termination of each line, add more spaces if necessary to
  mimic `layout_width`.

- Finally, add newlines to the end if necessary to mimic to
  `layout_height`.

Note: This approach currently works best for horizontal, left-to-right
text, but will display all words regardless of orientation. There is room
for improvement in better supporting right-to-left text, as well as
vertical text.
z;`layout_width` and `layout_width_chars` cannot both be set.z=`layout_height` and `layout_height_chars` cannot both be set.Nc                 ó4   € \        V ^ ,          R,          4      # ©rH   Údoctop©ÚfloatrI   s   &r
   rK   Ú$WordMap.to_textmap.<locals>.<lambda>  s   € ´5¸¸1½¸h½Ô3Hr   rN   rè   r¡   c                 ó4   € \        V ^ ,          R,          4      # rç   ré   rI   s   &r
   rK   rë     s   € ¬u°Q°qµT¸(µ^Ô/Dr   rv   c                 ó4   € \        V ^ ,          R,          4      # )rH   r   ré   rI   s   &r
   rK   rë   )  s   € ¬e°A°aµD¸µJÔ.?r   r   rŠ   )rz   NrX   )rv   N)r_   r»   rµ   Ú	LIGATURESÚ
ValueErrorrÇ   r^   r\   Ú	enumerateÚcluster_objectsr   r`   r]   r    rY   )#rÀ   rß   Úlayout_widthÚlayout_heightrà   rá   Ú	x_densityÚ	y_densityÚx_shiftÚy_shiftÚy_tolerancerâ   rã   rä   Ú_textmapÚ
expansionsÚ
blank_lineÚnum_newlinesÚwords_sorted_doctopÚ
first_wordÚdoctop_startrj   ÚwsÚy_distÚnum_newlines_prependÚline_lenÚline_words_sorted_x0Úwordry   Úx_distÚnum_spaces_prependr   ÚlettersÚletterÚnum_newlines_appends#   &&&&&&&&&&&&&&                     r
   Ú
to_textmapÚWordMap.to_textmap²  sÿ  € ðf ˆä�4—;‘;×ÒÜ˜8Ó$Ð$ç"2•Y¸ˆ
çß!ßÜ$ØUóð ð  ô
 &)¬¨|Õ/GÓ)HÓ%IÐ"ç"ß Ü$ØWóð ð !ô
 '*¬%°Õ0IÓ*JÓ&KÐ#à%˜Ð);Õ;‰JàˆJàˆ÷ ŸMð �KŠKä˜Ÿ™Ñ)HÔIð 	ð )¨Õ+¨AÕ.ˆ
Ø! (Õ+¨j¸Õ.?Õ?ˆäÜØ#Ñ%DÀkó÷
‰EˆAˆr÷ ð �A•�q•˜(Õ# |°gÕ'=Õ>À)ÖKàð ô
 $'ä�A˜‘E“
ä�f“ Õ,ó	$Ð ô Ð/Ö0�Ü˜8—}’}¨°­°Q­¸4Ô(?Ø 
Õ*�HØ—‘ Ö-ñ 1ð
 Ð0Õ0ˆLàˆH÷ §ñ ä˜BÑ$?Ô@ð !ó  4‘��eß?E˜$˜t�* wÕ.°)Ö;È1�Ü%(¬¨Q°Ó)9¼5À»=È8Õ;SÓ%TÐ"Ø˜[˜MÐ,>Õ>Õ>�ØÐ.Õ.�ã�AØ(Ÿn™n¨Q¨v­Y¸¸&½	ÓB�GÛ")˜Ø Ÿ™¨°¨Ô4Ø  A�šó #*ó ñ  4÷ ŠvØ˜[˜MÐ-?À(Õ-JÕKÕK“ñ]
÷b Ø"5¸ÈÕ9IÕ"JÐÜÐ.Ö/�Ø�q”5Ø 
Õ*�HØ—‘ Ö-ñ 0ð ˜�|˜|Ô+Ø# C R˜=�ä�xÓ Ð r   rÜ   N)r›   rœ   r�   rž   rÔ   rÁ   ÚDEFAULT_X_DENSITYÚDEFAULT_Y_DENSITYÚDEFAULT_Y_TOLERANCEr  rŸ   rÕ   rÖ   s   @r
   rØ   rØ   ª  sO   ø‡ € ñ÷ð ð
 ØØØ"#Ø#$Ø#Ø#ØØØ'Ø#ØØ!%÷V!÷ V!ð V!r   rØ   c            	       ó¢   a € ] tR tRt o ]]RRRRRRR3	V 3R lR lltV 3R lR ltV 3R	 lR
 ltR t	R t
R tV 3R lR ltV 3R lR ltRtV tR# )ÚWordExtractoriK  FTNc                ó    <€ V ^8„  d   QhRS[ /# )r+   Úkeep_blank_charsr-   )r/   r¸   s   "€r
   r0   ÚWordExtractor.__annotate__L  s   ø€ ÷ @ñ @ñ ñ	@r   c
                óî   € Wn         W n        W0n        W@n        WPn        W`n        Vf   . MTV n        VRJ d   \        P                  MT;'       g    RV n	        V	'       d   \        V n        R # / V n        R # )NTrr   )Úx_tolerancerø   r  râ   Úhorizontal_ltrÚvertical_ttbÚextra_attrsÚstringÚpunctuationÚsplit_at_punctuationrî   rú   )
rÀ   r  rø   r  râ   r  r  r  r  rä   s
   &&&&&&&&&&r
   rÁ   ÚWordExtractor.__init__L  sp   € ð 'ÔØ&ÔØ 0ÔØ*ÔØ,ÔØ(ÔØ!,Ò!4™2¸+ˆÔð
 $ tÓ+ô ×Òà&×,Ð,¨"ð 	Ô!÷ (8œ)ˆŽ¸RˆŽr   c                ó    <€ V ^8„  d   QhRS[ /# )r+   Úordered_charsrª   )r/   r¸   s   "€r
   r0   r  i  s   ø€ ÷ #ñ #©ñ #r   c                óh  a € \        V4      w  r#rEV^ ,          R,          V^ ,          R,          ,
          pV^ ,          R,          pV'       d   S P                  '       d   MS P                  '       d   ^MRpV^ ,          R,          p	^ p
V'       g   V	^,          ^ 8  d   \        V4      pRp
V	^ ,          ^ 8  d   V	^,          ^ 8  d   ^´p
MV	^,          ^ 8”  d   ^Zp
RRP	                  V 3R lV 4       4      R	VR
VRVRW6,           RVRVRVRV
/	pS P
                   F  pV^ ,          V,          W¼&   K  	  V# )rH   rè   r¡   ÚuprightÚmatrixé  rŠ   rr   c              3   óx   <"  € T F/  pSP                   P                  VR ,          VR ,          4      x € K1  	  R# 5i©rŠ   N)rú   rY   )r   r   rÀ   s   & €r
   r   Ú,WordExtractor.merge_chars.<locals>.<genexpr>|  s0   øé € ð ÙCP¸a�—‘×#Ñ# A f¥I¨q°­y×9Ð9Ã=ùs   ƒ7:r   r   r¢   Ú	directionÚrotationrX   )rÍ   r  r  Úreversedr¼   r  )rÀ   r  r   r¡   r   r¢   Ú
doctop_adjr!  r'  r"  r(  r  rO   s   f&           r
   Úmerge_charsÚWordExtractor.merge_charsi  s4  ø€ Ü-¨mÓ<Ñˆ�Ø" 1Õ% hÕ/°-ÀÕ2BÀ5Õ2IÕIˆ
Ø Õ" 9Õ-ˆß18˜$×-×-Ñ-¸d×>O×>OÐ>O‘AÐVXˆ	à˜qÕ! (Õ+ˆàˆß˜6 !�9 qœ=Ü$ ]Ó3ˆMØˆHà�!�9�qŒ=˜V A�Y¨œ]Ø‰HØ�A�Y˜Œ]ØˆHð �B—G‘Gô ÙCPóó ð �"Ø�"Ø�3Ø�cÕ&Ø�fØ�wØ˜Ø˜ð
ˆð ×#Ô#ˆCØ% aÕ(¨Õ-ˆD‹Iñ $ð ˆr   c                ó    <€ V ^8„  d   QhRS[ /# r*   r-   )r/   r¸   s   "€r
   r0   r  Ž  s   ø€ ÷ I
ñ I
ñ 
ñ	I
r   c                ó`  € VR,          '       dx   V P                   pV P                  pVR,          pVR,          pV P                  '       d   VR,          pVR,          pVR,          p	M•VR,          ) pVR,          ) pVR,          ) p	MvV P                  pV P                   pVR,          pVR,          pV P                  '       d   VR,          pVR,          pVR,          p	MVR,          ) pVR,          ) pVR,          ) p	\	        W—8  ;'       g    W˜V,           8„  ;'       g    WeV,           8„  4      # )a¼  This method takes several factors into account to determine if
`curr_char` represents the beginning of a new word:

- Whether the text is "upright" (i.e., non-rotated)
- Whether the user has specified that horizontal text runs
  left-to-right (default) or right-to-left, as represented by
  self.horizontal_ltr
- Whether the user has specified that vertical text the text runs
  top-to-bottom (default) or bottom-to-top, as represented by
  self.vertical_ttb
- The x0, top, x1, and bottom attributes of prev_char and
  curr_char
- The self.x_tolerance and self.y_tolerance settings. Note: In
  this case, x/y refer to those directions for non-rotated text.
  For vertical text, they are flipped. A more accurate terminology
  might be "*intra*line character distance tolerance" and
  "*inter*line character distance tolerance"

An important note: The *intra*line distance is measured from the
*end* of the previous character to the *beginning* of the current
character, while the *inter*line distance is measured from the
*top* of the previous character to the *top* of the next
character. The reasons for this are partly repository-historical,
and partly logical, as successive text lines' bounding boxes often
overlap slightly (and we don't want that overlap to be interpreted
as the two lines being the same line).

The upright-ness of the character determines the attributes to
compare, while horizontal_ltr/vertical_ttb determine the direction
of the comparison.
r!  r¡   r   r   r¢   )r  rø   r  r  r.   )
rÀ   Ú	prev_charÚ	curr_charrJ   r6   ÚayÚcyÚaxÚbxÚcxs
   &&&       r
   Úchar_begins_new_wordÚ"WordExtractor.char_begins_new_wordŽ  s:  € ðN �Y×ÔØ× Ñ ˆAØ× Ñ ˆAØ˜5Õ!ˆBØ˜5Õ!ˆBØ×"×"Ð"Ø˜t•_�Ø˜t•_�Ø˜t•_‘à •oÐ%�Ø •oÐ%�Ø •oÐ%‘ð × Ñ ˆAØ× Ñ ˆAØ˜4•ˆBØ˜4•ˆBØ× × Ð Ø˜uÕ%�Ø˜xÕ(�Ø˜uÕ%‘à Õ)Ð)�Ø Õ&Ð&�Ø Õ)Ð)�äà‰W÷ ð Ø˜!•V‘÷ð ð ˜!•V‘ó
ð 	
r   c              #  óà  a"  € . oRV3R llpV FÂ  pVR,          pV P                   '       g)   VP                  4       '       d   V! R 4       R j  x€L
  KF  W@P                  9   d#   V! V4       R j  x€L
  V! R 4       R j  x€L
  Kx  S'       d2   V P                  SR,          V4      '       d   V! V4       R j  x€L
  K±  SP	                  V4       KÄ  	  S'       d   Sx € R # R #  L– Lv Lh L15i)Nc              3   ó>   <"  € S'       d   Sx € V f   . oR # V .oR # 5ir3   r   )Únew_charÚcurrent_words   &€r
   Ústart_next_wordÚ:WordExtractor.iter_chars_to_words.<locals>.start_next_wordÜ  s!   øé € ÷ Ø"Ò"à!)Ò!1˜2ŠL¸°zŠLùs   ƒrŠ   r3   rX   )r  Úisspacer  r6  r]   )rÀ   r  r<  r’   rŠ   r;  s   &&   @r
   Úiter_chars_to_wordsÚ!WordExtractor.iter_chars_to_wordsÙ  sÌ   øé € Øˆ÷	Bó "ˆDØ˜•<ˆDà×(×(Ð(¨T¯\©\¯^ª^Ù*¨4Ó0×0Ò0à×2Ñ2Ô2Ù*¨4Ó0×0Ð0Ù*¨4Ó0×0Ò0ç $×";Ñ";¸LÈÕ<LÈd×"SÒ"SÙ*¨4Ó0×0Ò0ð ×#Ñ# DÖ)ñ "÷" ØÔñ ñ 1ñ 1Ù0ñ 1ùsZ   ƒA C.ÁC.ÁC&Á!C.Á1C(Á2C.ÂC*ÂC.Â*C.Â:C,Â;"C.Ã	C.Ã(C.Ã*C.Ã,C.c              #  óÂ  "  € R  R lp\        \        V4      V^ 4       F¶  pV^ ,          R,          pV'       d   RMRp\        V\        V4      V P                  4      pV Fq  pV'       d   RMRp\	        V\        V4      R7      p	V'       d   V P
                  '       g)   MV P                  '       g   \        V	4       Rj  x€L
  Kg  T	 Rj  x€L
  Ks  	  K¸  	  R#  L L5i)c                ó$   € V ^8„  d   QhR\         /# r*   ©rÇ   )r/   s   "r
   r0   Ú3WordExtractor.iter_sort_chars.<locals>.__annotate__ù  s   € ÷ 	&ñ 	&œcñ 	&r   c                 ó(   € \        V R ,          4      ) # )r!  rC  rI   s   &r
   Úupright_keyÚ2WordExtractor.iter_sort_chars.<locals>.upright_keyù  s   € Ü˜˜)�Ó%Ð%Ð%r   r!  rè   r   rN   N)rñ   r«   r   rø   r\   r  r  r)  )
rÀ   ry   rF  Úupright_clusterr!  Úcluster_keyÚsubclustersÚscÚsort_keyÚto_yields
   &&        r
   Úiter_sort_charsÚWordExtractor.iter_sort_charsø  sº   é € õ	&ô  /¬t°E«{¸KÈÖKˆOØ% aÕ(¨Õ3ˆGß&-™(°4ˆKô *Ø¤¨KÓ!8¸$×:JÑ:JóˆKó "�ç#*™4°�Ü! "¬*°XÓ*>Ô?�÷ 07˜×+×+Ñ+¸D×<M×<MÐ<MÜ'¨Ó1×1Ò1à'×'Ò'ó "ó  Lñ  2á'ùs0   ‚BCÂCÂ2CÃ CÃCÃCÃCÃCc              #  ó"  "  € V P                   '       d   TMV P                  V4      p\        R .V P                  O5!  p\        P
                  ! W#4      pV F2  w  rVV P                  V4       F  pV P                  V4      V3x € K  	  K4  	  R# 5i)r!  N)râ   rN  r   r  Ú	itertoolsÚgroupbyr?  r+  )rÀ   ry   r  Úgrouping_keyÚgrouped_charsÚkeyvalsÚ
char_groupÚ
word_charss   &&      r
   Úiter_extract_tuplesÚ!WordExtractor.iter_extract_tuples  s€   é € Ø!%×!3×!3Ð!3™¸×9MÑ9MÈeÓ9Tˆä! )Ð?¨d×.>Ñ.>Ó?ˆÜ!×)Ò)¨-ÓFˆã#0ÑˆGØ"×6Ñ6°zÖB�
Ø×'Ñ'¨
Ó3°ZÐ@Ô@ó Có $1ùs   ‚BBc                ó    <€ V ^8„  d   QhRS[ /# r*   )rØ   )r/   r¸   s   "€r
   r0   r    s   ø€ ÷ >ñ >©ñ >r   c                óH   € \        \        V P                  V4      4      4      # r3   )rØ   r«   rX  )rÀ   ry   s   &&r
   Úextract_wordmapÚWordExtractor.extract_wordmap  s   € Ü”t˜D×4Ñ4°UÓ;Ó<Ó=Ð=r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r+   ry   r,   rª   )r/   r¸   s   "€r
   r0   r    s   ø€ ÷ ñ ¡4ð ©Dñ r   c                óH   € \        R  V P                  V4       4       4      pV# )c              3   ó*   "  € T F	  w  rVx € K  	  R # 5ir3   r   )r   r  rW  s   &  r
   r   Ú.WordExtractor.extract_words.<locals>.<genexpr>  s   é € ÐRÑ2QÑ.˜d•TÓ2Qùs   ‚)r«   rX  )rÀ   ry   Úwordss   && r
   Úextract_wordsÚWordExtractor.extract_words  s"   € ÜÑR°$×2JÑ2JÈ5Ô2QÓRÓRˆØˆr   )	rú   r  r  r  r  râ   r  r  rø   )r›   rœ   r�   rž   ÚDEFAULT_X_TOLERANCEr  rÁ   r+  r6  r?  rN  rX  r\  rd  rŸ   rÕ   rÖ   s   @r
   r  r  K  sj   ø‡ € ð (Ø'Ø!&ØØØØØ"Ø÷@ò @÷:#ð #÷JI
ð I
òVò>(ò0A÷>ð >÷ö r   r  c                ó0   € V ^8„  d   QhR\         R\         /# r_  rª   )r/   s   "r
   r0   r0   "  s   € ÷ 8ñ 8œð 8¬Dñ 8r   c                 ó6   € \        R/ VB P                  V 4      # )Nr   )r  rd  )ry   Úkwargss   &,r
   rd  rd  "  s   € ÜÑ"˜6Ñ"×0Ñ0°Ó7Ð7r   c                ó0   € V ^8„  d   QhR\         R\        /# r_  )r«   rµ   )r/   s   "r
   r0   r0   *  s   € ÷ ñ œDð ¬wñ r   c           
      ó(  € VP                  R R/4       \        R/ \         Uu/ uF  q"V9   g   K  W!V,          bK  	  upB pVP                  V 4      pVP                  ! R/ \
         Uu/ uF  q"V9   g   K  W!V,          bK  	  upB pV# u upi u upi )rã   Tr   )Úupdater  ÚWORD_EXTRACTOR_KWARGSr\  r  ÚTEXTMAP_KWARGS)ry   ri  ÚkÚ	extractorÚwordmapÚtextmaps   &,    r
   Úchars_to_textmaprs  *  sš   € Ø
‡M�M�; Ð%Ô&äñ Ý!6Ó
FÑ!6˜A¸v¹+Œ<ˆ1�Q�iŠ<Ñ!6Ñ
Fñ€Ið ×'Ñ'¨Ó.€GØ× Ò ñ Ý!/Ó
?¡˜A¸±;Œ<ˆ1�Q�iŠ<¡Ñ
?ñ€Gð €Nùò Gùò @s   £B
°B
Á)BÁ6Bc                ó0   € V ^8„  d   QhR\         R\        /# r_  ©r«   Ústr)r/   s   "r
   r0   r0   8  s   € ÷ ñ œð ¬3ñ r   c           
      ó|  € \        V 4      p \        V 4      ^ 8X  d   R# VP                  R4      '       d   \        V 3/ VB P                  # VP                  R\
        4      p\        R/ \         Uu/ uF  q3V9   g   K  W1V,          bK  	  upB pVP                  V 4      pV'       d   V^ ,          R,          pM^ pV^Z8X  d=   VP                  R R7       RP                  V Uu. uF  qwR,          NK  	  up4      pV# VR	8X  d=   VP                  R
 R7       RP                  V Uu. uF  qwR,          NK  	  up4      pV# \        V\        R4      V4      pRP                  R V 4       4      pV^´8X  d3   RP                  \        V4       U	u. uF  q™R8w  d   T	MRNK  	  up	4      pV# u upi u upi u upi u up	i )rH   rr   rß   rø   r(  c                 ó(   € V R ,          V R,          ) 3# ©r   r¡   r   ©Úws   &r
   rK   Úextract_text.<locals>.<lambda>K  s   €  a¨¥g°°%µ¨yÑ%9r   rN   rz   rŠ   r#  c                 ó(   € V R ,          ) V R,          3# ry  r   rz  s   &r
   rK   r|  N  s   €  q¨¥w h°°%µÑ%9r   rè   rv   c              3   óR   "  € T F  pR P                  R V 4       4      x € K  	  R# 5i)rz   c              3   ó2   "  € T F  qR ,          x € K  	  R# 5ir%  r   )r   r  s   & r
   r   Ú)extract_text.<locals>.<genexpr>.<genexpr>R  s   é € Ð&EÁ¸¨F§|¢|Ãùs   ‚N)r¼   )r   rŒ   s   & r
   r   Úextract_text.<locals>.<genexpr>R  s$   é € ÐXÑRWÈ$˜cŸh™hÑ&EÁÓ&E×EÐEÓRWùs   ‚%'r   )r³   r_   rY   rs  r¾   r  r  rm  rd  Úsortr¼   rñ   r   r)  )
ry   ri  rø   ro  rp  rc  r(  r{  rt   r   s
   &,        r
   Úextract_textrƒ  8  sš  € Ü�E‹N€EÜ
ˆ5ƒz�Q„Ùà‡z�z�(×ÒÜ Ñ0¨Ñ0×:Ñ:Ð:à—j‘j Ô0CÓDˆÜ!ñ 
Ý%:ÓJÑ%: À6¹kŒ|ˆq˜•)Š|Ñ%:ÑJñ
ˆ	ð ×'Ñ'¨Ó.ˆßØ˜Q•x 
Õ+‰HàˆHà�rŒ>Ø�J‰JÑ9ˆJÔ:Ø—H‘H±Ó7±¨A Ÿi˜i±Ñ7Ó8ˆEð ˆð ˜Œ_Ø�J‰JÑ9ˆJÔ:Ø—H‘H±Ó7±¨A Ÿi˜i±Ñ7Ó8ˆEð ˆô $ E¬:°hÓ+?ÀÓMˆEØ—I‘IÑXÑRWÓXÓXˆEØ˜3ŒØŸ™ÄHÈUÄOÓ TÁO¸q¨D¤y¡!°cÒ"9ÁOÑ TÓU�àˆùò) Kùò 8ùò 8ùò
 !Us   Á0F*Á=F*Ã$F/Ä'F4ÆF9c                ó0   € V ^8„  d   QhR\         R\        /# )r+   Ú
line_charsr,   ru  )r/   s   "r
   r0   r0   Y  s   € ÷ ñ Üðô 	ñr   c                 óº   € R pRp\        V \        R4      R7       F<  pVe   VR,          W1,           8”  d
   VR,          pVR,          pW$R,          ,          pK>  	  V# )rr   Nr   rN   rz   r   rŠ   )r\   r   )r…  Ú	toleranceÚcollÚlast_x1r’   s   &&   r
   Úcollate_linerŠ  Y  s]   € ð €DØ€GÜ�z¤z°$Ó'7×8ˆØÒ d¨4¥j°GÕ4GÔ&HØ�C�KˆDØ�t•*ˆØ�V•ÕŠñ	 9ð
 €Kr   c                ó0   € V ^8„  d   QhR\         R\         /# r_  rª   )r/   s   "r
   r0   r0   g  s   € ÷ ,ñ ,œð ,¬dñ ,r   c                óŽ   aaa€ \        RRRR4      o\        RR4      oR VVV3R llpV! V 4      p\        W0P                  R	7      # )
u�   
Removes duplicate chars â€”Â those sharing the same text, fontname, size,
and positioning (within `tolerance`) as other characters in the set.
ÚfontnameÚsizer!  rŠ   rè   r   c                ó$   € V ^8„  d   QhR\         /# )r+   ry   rª   )r/   s   "r
   r0   Ú"dedupe_chars.<locals>.__annotate__o  s   € ÷ 	<ñ 	<¤$ñ 	<r   c              3   ó  <"  € \        V SR 7      p\        P                  ! VSR 7       F^  w  r#\        \	        V4      \        R4      S4       F6  p\        V\        R4      S4       F  p\        VSR 7      ^ ,          x € K  	  K8  	  K`  	  R# 5i)rN   rè   r   N)r\   rQ  rR  rñ   r«   r   )	ry   Úsorted_charsÚgrpÚ	grp_charsÚ	y_clusterÚ	x_clusterrO   Úpos_keyr‡  s	   &     €€€r
   Úyield_unique_charsÚ(dedupe_chars.<locals>.yield_unique_charso  s|   øé € Ü˜e¨Ô-ˆÜ'×/Ò/°À#×F‰NˆCÜ,Ü�Y“¤¨HÓ!5°yö�	ô "1Øœz¨$Ó/°ö"�Iô ! °Ô8¸Õ;Ô;ó"óó Gùs   ƒB
BrN   )r   r\   Úindex)ry   r‡  r˜  ÚdedupedrO   r—  s   &f  @@r
   Údedupe_charsrœ  g  sF   ú€ ô
 �Z ¨°FÓ
;€CÜ˜ 4Ó(€G÷	<ò 	<ñ ! Ó'€GÜ�'Ÿ{™{Ô+Ð+r   c                 óT   € \        V 4      pV R ,          V R,          8X  d   RMRVR&   V# )r¡   r¢   ÚhÚvÚorientation©rÈ   )rŒ   Úedges   & r
   Úline_to_edger£  ~  s+   € Ü�‹:€DØ"& u¥+°°hµÔ"?™#Àc€DˆÑØ€Kr   c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   „  s   € ÷ %&ñ %&œ4ñ %&r   c                 óÐ  € \        ^4       Uu. uF  p\        V 4      NK  	  upw  r#rEVP                  RRR^ RV R,          RV R,          RR	/4       VP                  RRR^ RV R,          RV R,          V R,          ,           R
V R
,          V R,          ,           RR	/4       VP                  RRR^ RV R,          RR/4       VP                  RRR^ RV R,          RR/4       W#WE.# u upi )é   Úobject_typeÚ	rect_edgeÚheightr   r   r¢   r¡   r   rž  rè   Úwidthr   r   rŸ  )r`   rÈ   rl  )r   rJ   r¡   r¢   ÚleftÚrights   &     r
   Úrect_to_edgesr­  „  s  € Ü49¸!´HÓ=±H¨q¤ T¦
±HÑ=Ñ€C�Ø‡J�Jà˜;Ø�aØ�$�t•*Ø�d˜5•kØ˜3ð	
ôð ‡M�Mà˜;Ø�aØ�$�t•*Ø�4˜•;  h¥Õ/Ø�d˜8•n t¨H¥~Õ5Ø˜3ð	
ô	ð 	‡K�Kà˜;Ø�QØ�$�t•*Ø˜3ð		
ôð 
‡L�Là˜;Ø�QØ�$�t•*Ø˜3ð		
ôð ˜Ð%Ð%ùòI  >s   ŽC#c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   ¬  s   € ÷ ñ œTñ r   c                 ó   € \        V R ,          V R ,          R,          4      pV UUu. uEF  w  r#RRR\        V^ ,          V^ ,          4      R\        V^ ,          V^ ,          4      R\        V^,          V^,          4      R\        V^,          V^,          4      V R,          V R,          ,
          ,           R\        V^,          V^,          4      R	\        V^ ,          V^ ,          ,
          4      R
\        V^,          V^,          ,
          4      RV^ ,          V^ ,          8X  d   RMV^,          V^,          8X  d   RMR/	NEK  	  upp# u uppi )Úptsºr   NNr§  Ú
curve_edger   r   r¡   rè   r¢   rª  r©  r   rŸ  rž  N)Úzipr    r   r€   )ÚcurveÚpoint_pairsÚp0Úp1s   &   r
   Úcurve_to_edgesr¸  ¬  s  € Ü�e˜E•l E¨%¥L°Õ$4Ó5€Kñ "ôò "‰FˆBð ˜<Ø”#�b˜•e˜R �UÓ#Ø”#�b˜•e˜R �UÓ#Ø”3�r˜!•u˜b �eÓ$Ø”c˜"˜Q�%  A¥Ó'¨5°­?¸UÀ5½\Õ+IÕJØ”c˜"˜Q�%  A¥Ó'Ø”S˜˜A�  A¥�Ó'Ø”c˜"˜Q�% " Q¥%�-Ó(Ø " Q¥%¨2¨a­5¤.™3¸bÀ½eÀrÈ!Åu¼n±sÐRVô
	
ñ "òð ùó s   §DE
c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   ¾  s   € ÷ Hñ Hœñ Hr   c                 ó„   € V R ,          pRV9   d   V .# VR8X  d   \        V 4      .# R\        R\        /V,          ! V 4      # )r§  Ú_edgerŒ   r   r´  )r£  r­  r¸  )ÚobjÚts   & r
   Úobj_to_edgesr¾  ¾  sH   € ØˆMÕ€AØ�!„|ØˆuˆØ	
ˆfŒÜ˜SÓ!Ð"Ð"àœ w´Ð?ÀÖBÀ3ÓGÐGr   c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   È  s   € ÷ %ñ %ô
 
ñ%r   c                 ój   aaa€ SR9  d   \        R4      hR VVV3R llp\        \        W@4      4      # )rŸ  úOrientation must be 'v' or 'h'c                ó$   € V ^8„  d   QhR\         /# r*   r-   )r/   s   "r
   r0   Ú"filter_edges.<locals>.__annotate__Ñ  s   € ÷ Nñ N”4ñ Nr   c                 óÌ   <€ V R ,          R8X  d   RMRpSe   V R,          S8H  MRpSRJ ;'       g    V R ,          S8H  p\        T;'       d    T;'       d    W,          S8¬  4      # )r   rŸ  r©  rª  Nr§  Tr-   )ÚeÚdimÚ
et_correctÚorient_correctÚ	edge_typeÚ
min_lengthr   s   &   €€€r
   ÚtestÚfilter_edges.<locals>.testÑ  sk   ø€ Ø˜MÕ*¨cÔ1‰h°wˆØ6?Ò6K�Q�}Õ%¨Ò2ÐQUˆ
Ø$¨Ð,×OÐO°°-Õ0@ÀKÑ0OˆÜ�J×LÐL >×LÐL°qµvÀÑ7KÓMÐMr   )rŸ  rž  N)rï   r«   Úfilter)Úedgesr   rÉ  rÊ  rË  s   &fff r
   Úfilter_edgesrÏ  È  s8   ú€ ð Ð*Ô*ÜÐ9Ó:Ð:÷Nò Nô ”�tÓ#Ó$Ð$r   c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   Ú  s   € ÷ ñ ¤Tñ r   c                 ó²  € V^ 8X  d   \        V 4       Uu. uF  q".NK  	  up# \        V 4      ^8  d   \        V 4       Uu. uF  q".NK  	  up# . p\        \        V 4      4      p V ^ ,          .pV ^ ,          pV R,           F8  pW%V,           8:  d   VP                  V4       MVP                  V4       V.pTpK:  	  VP                  V4       V# u upi u upi )rH   r±  )r\   r_   r«   r]   )Úxsr‡  rJ   rÊ   Úcurrent_groupÚlasts   &&    r
   Úcluster_listrÕ  Ú  sÉ   € Ø�A„~Ü# BœZÓ(™Z˜“™ZÑ(Ð(Ü
ˆ2ƒw�„{Ü# BœZÓ(™Z˜“™ZÑ(Ð(Ø€FÜ	Œf�R‹jÓ	€BØ˜•U�G€MØˆa�5€DØ��VˆVˆØ˜	Õ!Ô"Ø× Ñ  Õ#à�M‰M˜-Ô(Ø˜CˆMØŠñ ð ‡M�M�-Ô Ø€Mùò )ùâ(s   •CÁ Cc                ó$   € V ^8„  d   QhR\         /# r*   r¡  )r/   s   "r
   r0   r0   î  s   € ÷ 1ñ 1¬Dñ 1r   c           
      óò   € \        \        \        V 4      4      V4      p\        V4       UUUu. uF  w  r4V Uu. uF  qUV3NK  	  upNK  	  pppp\	        \
        P                  ! V!  4      # u upi u upppi r3   )rÕ  r«   Úsetrð   rÈ   rQ  Úchain)Úvaluesr‡  Úclustersrj   Úvalue_clusterÚvalÚnested_tupless   &&     r
   Úmake_cluster_dictrß  î  sq   € ÜœD¤ V£Ó-¨yÓ9€Hô ENÈhÔDWõÙDWÑ0@°™]Ó+™]�cˆq‹™]Ô+ÑDWð ò ô ”	—’ Ñ/Ó0Ð0ùò 	,ùôs   ®A2¹A-ÁA2Á-A2c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   ø  s   € ÷ 5ñ 5¬dñ 5r   c           
      óP  aa
€ \        S4      '       g   \        S4      o\        SV 4      p\        W24      o
\        ^ 4      \        ^4      rT\	        V
V3R lV  4       VR7      p\
        P                  ! WeR7      pV UU	u. uF  w  r‰\        \        WI4      4      NK  	  up	p# u up	pi )rH   c              3   óT   <"  € T F  qSP                  S! V4      4      3x € K  	  R # 5ir3   )rY   )r   rJ   Úcluster_dictÚkey_fns   & €€r
   r   Ú"cluster_objects.<locals>.<genexpr>  s#   øé € ÐJÁrÀ! ×!1Ñ!1±&¸³)Ó!<Õ=Ãrùs   ƒ%(rN   )Úcallabler   r½   rß  r\   rQ  rR  r«   )rÒ  rä  r‡  rÚ  Úget_0Úget_1Úcluster_tuplesÚgroupedro  rŸ  rã  s   &f&       @r
   rñ   rñ   ø  s‚   ù€ Ü�F×ÒÜ˜FÓ#ˆä�˜‹_€FÜ$ VÓ7€Lä˜a“=¤*¨Q£-ˆ5äÕJÁrÓJÐPUÔV€Nä×Ò Ô:€Gá,3Ô4©G¡D AŒD”�U“Ö©GÒ4Ð4ùÓ4s   Á?B"c                ó$   € V ^8„  d   QhR\         /# )r+   Úaxis©rv  )r/   s   "r
   r0   r0     s   € ÷ @ñ @œ3ñ @r   c                 óÖ  € VR	9   g   Q hVR 8X  d%   RV R,          V,           3RV R,          V,           3.pVR8X  dx   RV R,          V,           3RV R,          V,           3.pRV 9   d   VRV R,          V,           3.,          pRV 9   d,   VRV R,          V,
          3RV R,          V,
          3.,          pV P                  \        V P                  4       4      \        X4      ,           4      # )
rž  rŸ  r   r   r¡   r¢   rè   r   r   )rž  rŸ  )Ú	__class__rb   Úitems)r¼  rì  ÚvalueÚ	new_itemss   &&& r
   Úmove_objectró    sô   € Ø�:ÔÐÐØˆs„{à�3�t•9˜uÕ$Ð%Ø�3�t•9˜uÕ$Ð%ð
ˆ	ð ˆs„{à�C˜•J Õ&Ð'Ø�s˜8•} uÕ,Ð-ð
ˆ	ð �sŒ?Ø˜8 S¨¥]°UÕ%:Ð;Ð<Õ<ˆIØ�3Œ;ØØ�s˜4•y 5Õ(Ð)Ø�s˜4•y 5Õ(Ð)ðõ ˆIð �=‰=œ˜sŸy™y›{Ó+¬e°IÓ.>Õ>Ó?Ð?r   c                ó0   € V ^8„  d   QhR\         R\        /# )r+   Úattrr,   )rv  r«   )r/   s   "r
   r0   r0     s   € ÷ 	4ñ 	4œSð 	4´ñ 	4r   c                 óÊ  € R RRRRRRR/V,          p\        V 4      p\        V\        V4      V4      pV Uu. uF1  p\        \	        \        V4      V4      4      \        V4      ,          NK3  	  pp\        WW4       UUU	u. uF.  w  rhV U	u. uF  p	\        W“W‰V,          ,
          4      NK  	  up	NK0  	  p
ppp	\        \        P                  ! V
!  4      # u upi u up	i u up	ppi )r   rž  r   r¡   rŸ  r¢   )
r«   rñ   r   Úsumr½   r_   r³  ró  rQ  rÙ  )Úobjsrõ  r‡  rì  Ú	list_objsrÛ  ÚclusterÚavgsÚavgr¼  Úsnapped_clusterss   &&&        r
   Úsnap_objectsrþ    sÕ   € Ø�#�t˜S %¨¨h¸Ð<¸TÕB€DÜ�T“
€IÜ˜y¬*°TÓ*:¸IÓF€HÙNVÓWÉhÀ7ŒC””J˜tÓ$ gÓ.Ó/´#°g³,×>Ð>Éh€DÐWô   Ô/õá/‰LˆGñ =DÓD¹G°SŒ�S ¨$¥i¥Ö	0¹GÔDÙ/ð ò ô ”	—’Ð!1Ñ2Ó3Ð3ùò XùâDùôs   ·7CÁ?CÂ
"CÂ,CÃCc                ó¼   € R. R. /pV  F!  pW4R,          ,          P                  V4       K#  	  \        VR,          RV4      p\        VR,          RV4      pWV,           # )zg
Given a list of edges, snap any within `tolerance` pixels of one another
to their positional average.
rŸ  rž  r   r   r¡   )r]   rþ  )rÎ  r  rø   Úby_orientationrÅ  Ú	snapped_vÚ	snapped_hs   &&&    r
   Ú
snap_edgesr  *  sc   € ð ˜2˜s BÐ'€NÛˆØ˜Õ'Õ(×/Ñ/°Ö2ñ ô ˜^¨CÕ0°$¸ÓD€IÜ˜^¨CÕ0°%¸ÓE€IØÕ Ð r   c                ó$   € V ^8„  d   QhR\         /# )r+   rO   rí  )r/   s   "r
   r0   r0   <  s   € ÷ @ñ @œCñ @r   c                 óL  € VR	9   g   Q hW,          pW#,
          pW3.pVR 8X  d3   W R,          8:  g   Q hVP                  RV R,          V,
          34       EMVR8X  d1   W R ,          8¼  g   Q hVP                  RW R ,          ,
          34       MàVR8X  d{   W R,          8:  g   Q hVP                  RV R,          V,           34       VP                  RV R,          V,
          34       RV 9   d"   VP                  RV R,          V,
          34       M_VR8X  dY   W R,          8¼  g   Q hVP                  RV R,          V,           34       RV 9   d"   VP                  RV R,          V,
          34       V P                  \        V P                  4       4      \        V4      ,           4      # )
r   r   r¡   r¢   rª  rè   r©  r   r   )r   r   r¡   r¢   )r]   rï  rb   rð  )r¼  rO   rñ  Ú	old_valueÚdiffrò  s   &&&   r
   Úresize_objectr  <  s  € ØÐ/Ô/Ð/Ð/Ø•€IØÕ€Dà	ˆð€Ið ˆd„{Ø˜D�	Ô!Ð!Ð!Ø×Ñ˜' 3 t¥9¨uÕ#4Ð5Ö6Ø	�ŒØ˜D�	Ô!Ð!Ð!Ø×Ñ˜' 5¨t­9Õ#4Ð5Õ6Ø	�ŒØ˜H�Ô%Ð%Ð%Ø×Ñ˜( C¨¥M°DÕ$8Ð9Ô:Ø×Ñ˜( C¨¥M°DÕ$8Ð9Ô:Ø�3Œ;Ø×Ñ˜d C¨¥I°Õ$4Ð5Ô6øØ	�ŒØ˜E�
Ô"Ð"Ð"Ø×Ñ˜( C¨¥M°DÕ$8Ð9Ô:Ø�3Œ;Ø×Ñ˜d C¨¥I°Õ$4Ð5Ô6Ø�=‰=œ˜sŸy™y›{Ó+¬e°IÓ.>Õ>Ó?Ð?r   c                ó$   € V ^8„  d   QhR\         /# )r+   r   rí  )r/   s   "r
   r0   r0   W  s   € ÷ ñ ¬ñ r   c                óz  € VR8X  d   RRrCMVR8X  d   RRrCM\        R4      h\        \        V \        V4      R7      4      pV^ ,          .pVR	,           Fc  pVR
,          pWs,          W„,          V,           8:  d-   Wt,          W„,          8”  d   \	        W„Wt,          4      VR
&   KP  KR  VP                  V4       Ke  	  V# )zs
Given a list of edges along the same infinite line, join those that
are within `tolerance` pixels of one another.
rž  r   r   rŸ  r¡   r¢   rÁ  rN   r±  rX   )rï   r«   r\   r   r  r]   )	rÎ  r   r‡  Úmin_propÚmax_propÚsorted_edgesÚjoinedrÅ  rÔ  s	   &&&      r
   Újoin_edge_groupr  W  s´   € ð
 �cÔØ! 4‘(Ø	˜Ô	Ø" H‘(äÐ9Ó:Ð:äœ˜u¬*°XÓ*>Ô?Ó@€LØ˜1�oÐ€FØ˜"×ÐˆØ�b�zˆØ�;˜4�>¨IÕ5Ô6Ø�{˜T�^Ô+ä*¨4¸1½;ÓG��r“
ñ ,ð
 �M‰M˜!Öñ ð €Mr   c                óÞ   aa€ R pV^ 8”  g   V^ 8”  d   \        WV4      p \        WR7      p\        P                  ! WeR7      pVV3R lV 4       p\	        \        P
                  ! V!  4      p V # )zp
Using the `snap_edges` and `join_edge_group` methods above,
merge a list of edges into a more "seamless" list.
c                 óJ   € V R ,          R8X  d   RV R,          3# RV R,          3# )r   rž  r¡   rŸ  r   r   )r¢  s   &r
   Ú	get_groupÚmerge_edges.<locals>.get_group~  s-   € Ø�Õ #Ô%Ø˜˜e�Ð%Ð%à˜˜d�Ð$Ð$r   rN   c              3   ón   <"  € T F*  w  r\        Y!^ ,          V^ ,          R8X  d   SMS4      x € K,  	  R# 5i)rH   rž  N)r  )r   ro  rð  Újoin_x_toleranceÚjoin_y_tolerances   &  €€r
   r   Úmerge_edges.<locals>.<genexpr>‰  s?   øé € ð ñ $‰HˆAô 	Ø�Q•4¨a°­d°c¬kÑ*Ð?O÷	
ð 	
ó $ùs   ƒ25)r  r\   rQ  rR  r«   rÙ  )	rÎ  Úsnap_x_toleranceÚsnap_y_tolerancer  r  r  Ú_sortedÚedge_groupsÚedge_gens	   &&&ff    r
   Úmerge_edgesr  r  sl   ù€ ò%ð ˜!ÔÐ/°!Ô3Ü˜5Ð4DÓEˆä�UÔ*€GÜ×#Ò# GÔ;€Kõñ $ó	€Hô ”—’ (Ñ+Ó,€EØ€Lr   c                ó$   € V ^8„  d   QhR\         /# r*   r¡  )r/   s   "r
   r0   r0   “  s   € ÷ Mñ Mœ$ñ Mr   c           	     óN   € RV ^ ,          RV ^,          RV ^,          RV ^,          /# )zX
Return the rectangle (i.e a dict with keys "x0", "top", "x1",
"bottom") for an object.
r   r¡   r   r¢   r   ©r5   s   &r
   Úbbox_to_rectr!  “  s+   € ð
 �$�q•'˜5 $ q¥'¨4°°aµ¸(ÀDÈÅGÐLÐLr   c                ó$   € V ^8„  d   QhR\         /# r*   r¡  )r/   s   "r
   r0   r0   ›  s   € ÷ 2ñ 2¤ñ 2r   c                ó*   € \        \        V 4      4      # )z�
Given an iterable of objects, return the smallest rectangle (i.e. a
dict with "x0", "top", "x1", and "bottom" keys) that contains them
all.
)r!  rÍ   ©Úobjectss   &r
   Úobjects_to_rectr&  ›  s   € ô œ¨Ó0Ó1Ð1r   c                ón   € \        V !  w  rr4\        V4      \        V4      \        V4      \        V4      3# )z_
Given an iterable of bounding boxes, return the smallest bounding box
that contains them all.
)r³  r    r   )Úbboxesr   r¡   r   r¢   s   &    r
   Úmerge_bboxesr)  ¤  s1   € ô
 ˜v™,Ñ€BˆRÜ�‹G”S˜“Xœs 2›w¬¨F«Ð4Ð4r   c                ó4   € \        \        \        V 4      4      # )zX
Given an iterable of objects, return the smallest bounding box that
contains them all.
)r)  r½   Úbbox_getterr$  s   &r
   rÍ   rÍ   ­  s   € ô
 œœK¨Ó1Ó2Ð2r   c                ó$   € V ^8„  d   QhR\         /# ©r+   Úword_thresholdrC  )r/   s   "r
   r0   r0   µ  s   € ÷ &ñ &¬Cñ &r   c                óÎ  a€ \        V \        R4      ^4      p\        V3R lV4      p\        \	        \
        V4      4      p\        V4      ^ 8X  d   . # \        \	        \        R4      V4      4      p\        \	        \        R4      V4      4      p. pV FN  pVRVRVRVR,          RVR,          RWe,
          RR/RVRVRVR,          RVR,          RWe,
          RR/.,          pKP  	  V# )	z]
Find (imaginary) horizontal lines that connect the tops
of at least `word_threshold` words.
r¡   c                 ó    <€ \        V 4      S8¬  # r3   ©r_   ©rJ   r.  s   &€r
   rK   Ú"words_to_edges_h.<locals>.<lambda>»  ó   ø€ ¤c¨!£f°Ò&>r   r   r   r¢   rª  r   rž  )	rñ   r   rÍ  r«   r½   r&  r_   r    r   )	rc  r.  Úby_topÚlarge_clustersÚrectsÚmin_x0Úmax_x1rÎ  r4   s	   &f       r
   Úwords_to_edges_hr:  µ  sõ   ø€ ô
 ˜U¤J¨uÓ$5°qÓ9€FÜÔ>ÀÓG€NÜ””_ nÓ5Ó6€EÜ
ˆ5ƒz�Q„Øˆ	Ü””Z Ó% uÓ-Ó.€FÜ””Z Ó% uÓ-Ó.€Fà€EÛˆØð �fØ�fØ�q˜•xØ˜!˜E�(Ø˜�Ø˜sðð �fØ�fØ�q˜•{Ø˜!˜H�+Ø˜�Ø˜sðð
õ 	
Šñ ð0 €Lr   c                 óÐ   € V w  r#rEVw  rgr‰\        W&4      p
\        WH4      p\        WY4      p\        W74      pWº,
          pWÍ,
          pV^ 8¼  d   V^ 8¼  d   Wþ,           ^ 8”  d   W­W¼3# R# ©rH   Nr   )ÚaÚbÚa_leftÚa_topÚa_rightÚa_bottomÚb_leftÚb_topÚb_rightÚb_bottomÚo_leftÚo_rightÚo_bottomÚo_topÚo_widthÚo_heights   &&              r
   Úget_bbox_overlaprM  Þ  ss   € Ø'(Ñ$€F�7Ø'(Ñ$€F�7Ü�Ó €FÜ�'Ó#€GÜ�8Ó&€HÜ�Ó€EØÕ€GØÕ€HØ�1„}˜ Aœ¨(Õ*<¸qÔ*@Ø˜wÐ1Ð1ár   c                ó$   € V ^8„  d   QhR\         /# r-  rC  )r/   s   "r
   r0   r0   í  s   € ÷ :ñ :¬Cñ :r   c                ó”  aa€ \        V \        R4      ^4      p\        V \        R4      ^4      pR p\        W^4      pW#,           V,           p\        VR R7      p\        V3R lV4      p\	        \        \        V4      4      p	. p
V	 FX  o\        ;QJ d    V3R lV
 4       F  '       g   K   RM	  R	M! V3R lV
 4       4      pV'       d   KG  V
P                  S4       KZ  	  V
'       g   . # \        \        V
4      p\	        \        V\        R4      R7      4      p\        \        \        R4      V4      4      p\        \        \        R
4      V4      4      p\        \        \        R4      V4      4      pV Uu. uF&  pRVR,          RVR,          R
VRVRVV,
          RR/NK(  	  upRVRVR
VRVRVV,
          RR/.,           # u upi )zm
Find (imaginary) vertical lines that connect the left, right, or
center of at least `word_threshold` words.
r   r   c                 óP   € \        V R ,          V R,          ,           4      ^,          # rV   ré   )r  s   &r
   Ú
get_centerÚ$words_to_edges_v.<locals>.get_centerö  s   € Ü�T˜$•Z $ t¥*Õ,Ó-°Õ1Ð1r   c                 ó   € \        V 4      ) # r3   r1  rI   s   &r
   rK   Ú"words_to_edges_v.<locals>.<lambda>ý  s
   € ´c¸!³f±Wr   rN   c                 ó    <€ \        V 4      S8¬  # r3   r1  r2  s   &€r
   rK   rT  þ  r4  r   c              3   ó<   <"  € T F  p\        SV4      x € K  	  R # 5ir3   )rM  ©r   r   r5   s   & €r
   r   Ú#words_to_edges_v.<locals>.<genexpr>  s   øé € ÐJÑ9I°AÔ& t¨Q×/Ð/Ó9Iùs   ƒTFr¡   r¢   r©  r   rŸ  )rñ   r   r\   rÍ  r«   r½   rÍ   r   r]   r!  r   r    )rc  r.  Úby_x0Úby_x1rQ  Ú	by_centerrÛ  Úsorted_clustersr6  r(  Úcondensed_bboxesÚoverlapÚcondensed_rectsÚsorted_rectsr9  Úmin_topÚ
max_bottomr>  r5   s   &f                @r
   Úwords_to_edges_vrc  í  s»  ù€ ô ˜E¤:¨dÓ#3°QÓ7€EÜ˜E¤:¨dÓ#3°QÓ7€Eò2ô   °1Ó5€IØ�}˜yÕ(€Hô ˜XÑ+<Ô=€OÜÔ>ÀÓP€Nô ”#”o ~Ó6Ó7€Fð ÐÛˆß“#ÔJÑ9IÓJ—#—#’#ÔJÑ9IÓJÓJˆß‰wØ×#Ñ# DÖ)ñ ÷
 Øˆ	äœ,Ð(8Ó9€OÜœ˜´J¸tÓ4DÔEÓF€Lä””Z Ó% |Ó4Ó5€FÜ”#”j Ó'¨Ó6Ó7€GÜ”Sœ HÓ-¨|Ó<Ó=€Jñ ó
ñ ˆAð �!�D•'Ø�!�D•'Ø�7Ø�jØ�j 7Õ*Ø˜3ó	
ñ ñ
ð �&Ø�&Ø�7Ø�jØ�j 7Õ*Ø˜3ð	
ð		õð ùò 
s   Å;,Gc                ó$   € V ^8„  d   QhR\         /# r*   r¡  )r/   s   "r
   r0   r0   *  s   € ÷ ñ Ä4ñ r   c           	     óŽ  a€ / pR	 Uau. uF  o\        \        V3R lV 4      4      NK  	  upw  rV\        V\        RR4      R7       Fõ  p\        V\        RR4      R7       F×  pVR,          VR,          V,           8:  g   K!  VR,          VR,          V,
          8¼  g   K?  VR,          VR,          V,
          8¼  g   K]  VR,          VR,          V,           8:  g   K{  VR,          VR,          3p	W“9  d	   R. R. /W9&   W9,          R,          P	                  V4       W9,          R,          P	                  V4       KÙ  	  K÷  	  V# u upi )
z]
Given a list of edges, return the points at which they intersect
within `tolerance` pixels.
rŸ  rž  c                 ó   <€ V R ,          S8H  # )r   r   )rJ   Úos   &€r
   rK   Ú(edges_to_intersections.<locals>.<lambda>1  s   ø€ ˜a Õ.°!Ò3r   r   r¡   rN   r¢   r   )rŸ  rž  )r«   rÍ  r\   r   r]   )
rÎ  r  rø   Úintersectionsrg  Úv_edgesÚh_edgesrŸ  rž  Úvertexs
   &&& `     r
   Úedges_to_intersectionsrm  *  s  ø€ ð
 €MáFPôÙFPÀŒŒVÔ3°UÓ;Ö<ÁjñÑ€Gô �G¤¨D°%Ó!8×9ˆÜ˜¤Z°°tÓ%<×=ˆAà�5•˜a �h¨Õ4Ö5Ø�x•[ Q u¥X°Õ%;Ö<Ø�t•W  4¥¨;Õ!6Ö7Ø�t•W  4¥¨;Õ!6Ö7à˜D�' 1 U¥8Ð,�ØÔ.Ø-0°"°c¸2Ð,>�MÑ)ØÕ% cÕ*×1Ñ1°!Ô4ØÕ% cÕ*×1Ñ1°!Ö4ó >ñ :ð Ðùò!s   ‰"Ec                ó   € \        V 4      # )z(
Return the bounding box for an object.
)r+  )r¼  s   &r
   Úobj_to_bboxro  C  s   € ô �sÓÐr   c                óö   a aaaa€ R V 3R llo\        \        S P                  4       4      4      o\        S4      oR VV V3R lloVV3R l\	        \        S4      4       4       p\        \        RV4      4      # )a   
Given a list of points (`intersections`), return all rectangular "cells"
that those points describe.

`intersections` should be a dictionary with (x0, top) tuples as keys,
and a list of edge objects as values. The edge objects should correspond
to the edges that touch the intersection.
c                ó$   € V ^8„  d   QhR\         /# r*   r-   )r/   s   "r
   r0   Ú,intersections_to_cells.<locals>.__annotate__T  s   € ÷ ñ ¤ñ r   c                 ó’  <€ R  pV ^ ,          V^ ,          8X  dM   V! SV ,          R,          4      P                  V! SV,          R,          4      4      p\        V4      '       d   R# V ^,          V^,          8X  dM   V! SV ,          R,          4      P                  V! SV,          R,          4      4      p\        V4      '       d   R# R# )c                 ó4   € \        \        \        V 4      4      # r3   )rØ  r½   ro  )rÎ  s   &r
   Úedges_to_setÚCintersections_to_cells.<locals>.edge_connects.<locals>.edges_to_setU  s   € Ü”sœ;¨Ó.Ó/Ð/r   rŸ  Trž  F)r%   r_   )r·  Úp2ru  Úcommonri  s   &&  €r
   Úedge_connectsÚ-intersections_to_cells.<locals>.edge_connectsT  s©   ø€ ò	0ð ˆa�5�B�q•EŒ>Ù! -°Õ"3°CÕ"8Ó9×FÑFÙ˜]¨2Õ.¨sÕ3Ó4óˆFô �6�{Š{Ùàˆa�5�B�q•EŒ>Ù! -°Õ"3°CÕ"8Ó9×FÑFÙ˜]¨2Õ.¨sÕ3Ó4óˆFô �6�{Š{ÙÙr   c                ó$   € V ^8„  d   QhR\         /# )r+   rj   rC  )r/   s   "r
   r0   rr  j  s   € ÷ ñ ¤cñ r   c                 ó   <€ VS^,
          8X  d   R# W,          pW^,           R pV Uu. uF  qD^ ,          V^ ,          8X  g   K  VNK  	  ppV Uu. uF  qD^,          V^,          8X  g   K  VNK  	  ppV F‹  pS
! W'4      '       g   K  V Fr  pS
! W(4      '       g   K  V^ ,          V^,          3p	V	S9   g   K.  S
! W˜4      '       g   K>  S
! W—4      '       g   KN  V^ ,          V^,          V	^ ,          V	^,          3u u # 	  K�  	  R# u upi u upi ©r   Nr   )Úpointsrj   ÚptÚrestrJ   Úbelowr¬  Úbelow_ptÚright_ptÚbottom_rightry  ri  Ún_pointss   &&        €€€r
   Úfind_smallest_cellÚ2intersections_to_cells.<locals>.find_smallest_cellj  sø   ø€ Ø�˜1•ÔÙØ�YˆØ˜!•e�gˆˆá Ó2™D�q a¥D¨B¨q­E¡M—�™DˆÐ2Ù Ó2™D�q a¥D¨B¨q­E¡M—�™DˆÐ2ÛˆHÙ  ×.Ò.Ùã!�Ù$ R×2Ò2Ùà (¨¥¨X°a­[Ð9�ð " ]Ö2Ù% l×=Ô=Ù% l×=Ô=à˜q�E 2 a¥5¨,°q­/¸<È½?ÐKÔKó "ñ	 ñ  ùò% 3ùÚ2s   ©DÁDÁDÁ+Dc              3   ó6   <"  € T F  pS! SV4      x € K  	  R # 5ir3   r   )r   rj   r†  r~  s   & €€r
   r   Ú)intersections_to_cells.<locals>.<genexpr>„  s   øé € ÐJÑ7I°!Ñ" 6¨1×-Ð-Ó7Iùs   ƒN)r«   r\   Úkeysr_   r`   rÍ  )ri  Úcell_genry  r†  r…  r~  s   f @@@@r
   Úintersections_to_cellsrŒ  J  sb   ü€ ÷ð ô& ”&˜×+Ñ+Ó-Ó.Ó/€FÜ�6‹{€H÷ò õ4 K´u¼SÀ»[Ô7IÓJ€HÜ”�t˜XÓ&Ó'Ð'r   c                ó$   € V ^8„  d   QhR\         /# r*   rª   )r/   s   "r
   r0   r0   ˆ  s   € ÷ Oñ O¤Dñ Or   c                óÄ  a€ R R lp\        V4      p\        4       o. p. p\        V4      '       Ed   \        V4      p\        V4       F£  pV! V4      p\        V4      ^ 8X  d7   S\        V4      ,          oVP                  V4       VP	                  V4       KQ  \        V3R lV 4       4      p	V	^ 8”  g   Ko  S\        V4      ,          oVP                  V4       VP	                  V4       K¥  	  \        V4      V8X  g   Ká  VP                  \        V4      4       SP                  4        VP                  4        EK  \        V4      '       d   VP                  \        V4      4       \        \        V4      ^,
          RR4       FÇ  p
\        P                  ! 4       p\        4       p\        4       pWZ,           F;  pW¾,          pVP                  V^,          4       VP                  V^ ,          4       K=  	  \        V4      ^8  gC   \        V4      ^8  g3   \        P                  V P                  V\        R7      4      '       g   KÅ  WZ KÉ  	  \        VR R7      pV# )zy
Given a list of bounding boxes (`cells`), return a list of tables that
hold those cells most simply (and contiguously).
c                ó$   € V ^8„  d   QhR\         /# r*   )rb   )r/   s   "r
   r0   Ú%cells_to_tables.<locals>.__annotate__Ž  s   € ÷ Bñ B¤ñ Br   c                 ó    € V w  rr4W3W3W23W433# r3   r   )r5   r   r¡   r   r¢   s   &    r
   Úbbox_to_cornersÚ(cells_to_tables.<locals>.bbox_to_cornersŽ  s#   € Ø"Ñˆ�Ø�	˜B˜<¨"¨°R°LÐAÐAr   c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir3   r   )r   r   Úcurrent_cornerss   & €r
   r   Ú"cells_to_tables.<locals>.<genexpr>§  s   øé € Ð"NÁ¸A¨Ö#7Ãùs   ƒ©r@   c                 ó&   € \        R  V  4       4      # )c              3   óD   "  € T F  q^,          V^ ,          3x € K  	  R# 5ir}  r   ©r   r   s   & r
   r   Ú4cells_to_tables.<locals>.<lambda>.<locals>.<genexpr>Ö  s   é € Ð.GÁQÀ°!µ°a¸µd­|ÃQùs   ‚ )r    )r½  s   &r
   rK   Ú!cells_to_tables.<locals>.<lambda>Ö  s   € ¬3Ñ.GÁQÓ.GÔ+Gr   rN   rX   )r«   rØ  r_   r]   Úremover÷  Úclearr`   r;   Ú
EMPTY_RECTÚaddr�   Ú
issupersetÚget_textboxÚTEXTPAGEr\   )Úpagerc   r’  Úremaining_cellsÚcurrent_cellsÚtablesÚinitial_cell_countro   Úcell_cornersÚcorner_countrj   r4   Úx1_valsÚx0_valsr   r  r•  s   &&              @r
   Úcells_to_tablesr­  ˆ  sû  ø€ õBô ˜5“k€Oô
 “e€OØ€Mà€FÜ
ˆo×
Ó
Ü  Ó/ÐÜ˜Ö)ˆDÙ*¨4Ó0ˆLä�=Ó! QÔ&à¤3 |Ó#4Õ4�Ø×$Ñ$ TÔ*Ø×&Ñ& tÖ,ô  #Ô"NÁÓ"NÓN�ð   !Ö#à#¤s¨<Ó'8Õ8�OØ!×(Ñ(¨Ô.Ø#×*Ñ*¨4Ö0ñ# *ô( ˆ}ÓÐ!3Ö3à�M‰Mœ$˜}Ó-Ô.Ø×!Ñ!Ô#Ø×Ñ×!ô
 ˆ=×Òà�‰”d˜=Ó)Ô*ô ”3�v“; •? B¨Ö+ˆÜ×ÒÓ ˆÜ“%ˆÜ“%ˆØ—�ˆAØ�FˆAØ�K‰K˜˜!�ÔØ�K‰K˜˜!�Öñ ô
 �‹L˜1ÔÜ�7‹|˜aÔÜ×&Ñ&Ø× Ñ ØÜ%ð !ó ÷ô ð ’	ñ% ,ô, �VÑ!GÔH€GØ€Nr   c                   ó&   a € ] tR tRt o R tRtV tR# )Ú	CellGroupiÚ  c                óX  € Wn         \        \        \        ^ 4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      \        \        \        ^4      \	        RV4      4      4      3V n        R# r<  )rc   r    r½   r   rÍ  r   r5   )rÀ   rc   s   &&r
   rÁ   ÚCellGroup.__init__Û  sx   € ØŒ
ä””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8Ü””J˜q“M¤6¨$°Ó#6Ó7Ó8ð	
ˆŽ	r   )r5   rc   N)r›   rœ   r�   rž   rÁ   rŸ   rÕ   rÖ   s   @r
   r¯  r¯  Ú  s   ø‡ € ÷
ð 
r   r¯  c                   ó   € ] tR tRtRtR# )ÚTableRowiå  r   Nrš   r   r   r
   r³  r³  å  r    r   r³  c                   ó*   a € ] tR tRt o RtR tRtV tR# )ÚTableHeaderié  z9PyMuPDF extension containing the identified table header.c                ó6   € Wn         W n        W0n        W@n        R # r3   )r5   rc   ÚnamesÚexternal)rÀ   r5   rc   r·  Úaboves   &&&&&r
   rÁ   ÚTableHeader.__init__ì  s   € ØŒ	ØŒ
ØŒ
ØŽr   )r5   rc   r¸  r·  N)r›   rœ   r�   rž   rÔ   rÁ   rŸ   rÕ   rÖ   s   @r
   rµ  rµ  é  s   ø‡ € ÙC÷ð r   rµ  c                   ó¶   a € ] tR tRt o R t]R 4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR	 l4       t	V 3R
 lR lt
RR ltR tRR ltRtV tR# )ÚTableió  c                óV   € Wn         R V n        W n        V P                  4       V n        R # r3   )r¤  r@   rc   Ú_get_headerÚheader)rÀ   r¤  rc   s   &&&r
   rÁ   ÚTable.__init__ô  s#   € ØŒ	ØˆŒØŒ
Ø×&Ñ&Ó(ˆŽr   c           
     ó  € V P                   p\        \        \        ^ 4      V4      4      \        \        \        ^4      V4      4      \	        \        \        ^4      V4      4      \	        \        \        ^4      V4      4      3# rG   )rc   r    r½   r   r   )rÀ   r   s   & r
   r5   Ú
Table.bboxú  sa   € à�J‰Jˆä””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&Ü””J˜q“M 1Ó%Ó&ð	
ð 	
r   c                ó    <€ V ^8„  d   QhRS[ /# r*   rª   )r/   r¸   s   "€r
   r0   ÚTable.__annotate__  s   ø€ ÷ ñ ‘dñ r   c                óÊ  € \        V P                  \        ^^ 4      R7      p\        \        \	        \        \        ^ 4      V P                  4      4      4      4      p. p\        P                  ! V\        ^4      4       FW  w  rEV Uu/ uF  qf^ ,          VbK  	  pp\        V Uu. uF  q‡P                  V4      NK  	  up4      p	VP                  V	4       KY  	  V# u upi u upi )r   rN   )r\   rc   r   r«   rØ  r½   rQ  rR  r³  rY   r]   )
rÀ   r  rÒ  Úrowsr6   Ú	row_cellsro   ÚxdictrJ   Úrows
   &         r
   rÆ  Ú
Table.rows  s³   € ä˜Ÿ™¬°A°qÓ)9Ô:ˆÜ”&œœS¤¨A£°·
±
Ó;Ó<Ó=Ó>ˆØˆÜ%×-Ò-¨g´zÀ!³}ÖE‰LˆAÙ/8Ó9©y t˜!•W˜d’]©yˆEÐ9Ü±"Ó5±"¨QŸI™I ažL±"Ñ5Ó6ˆCØ�K‰K˜Öñ Fð ˆùò :ùÚ5s   ÂCÂ$C 
c                ó    <€ V ^8„  d   QhRS[ /# r*   rC  )r/   r¸   s   "€r
   r0   rÄ    s   ø€ ÷ ñ ™3ñ r   c                ó,   € \        V P                  4      # r3   )r_   rÆ  )rÀ   s   &r
   Ú	row_countÚTable.row_count  s   € ä�4—9‘9‹~Ðr   c                ó    <€ V ^8„  d   QhRS[ /# r*   rC  )r/   r¸   s   "€r
   r0   rÄ    s   ø€ ÷ 6ñ 6™3ñ 6r   c                ó|   € \        V P                   Uu. uF  p\        VP                  4      NK  	  up4      # u upi r3   )r   rÆ  r_   rc   )rÀ   r4   s   & r
   Ú	col_countÚTable.col_count  s+   € ä¨$¯)ª)Ó4©) Q”C˜Ÿ™–L©)Ñ4Ó5Ð5ùÒ4s   ”9c                ó    <€ V ^8„  d   QhRS[ /# r*   rª   )r/   r¸   s   "€r
   r0   rÄ    s   ø€ ÷ $ñ $¡4ñ $r   c           	     óT  € \         p. pR  R lpV P                   Fÿ  p. pV Uu. uF  qt! WuP                  4      '       g   K  VNK   	  ppVP                   F®  p	V	f   Rp
M“V Uu. uF  qt! Wy4      '       g   K  VNK  	  pp\	        V4      '       da   V	^ ,          VR&   V	^,          VR&   RV9   d5   V	^,          V	^ ,          ,
          VR&   V	^,          V	^,          ,
          VR&   \        V3/ VB p
MRp
VP                  V
4       K°  	  VP                  V4       EK  	  V# u upi u upi )	c                ó$   € V ^8„  d   QhR\         /# r*   r-   )r/   s   "r
   r0   Ú#Table.extract.<locals>.__annotate__  s   € ÷ 	ñ 	¬ñ 	r   c                 óæ   € V R ,          V R,          ,           ^,          pV R,          V R,          ,           ^,          pVw  rErg\        W48¬  ;'       d    W68  ;'       d    W%8¬  ;'       d    W'8  4      # )r¡   r¢   r   r   r-   )r’   r5   Úv_midÚh_midr   r¡   r   r¢   s   &&      r
   Úchar_in_bboxÚ#Table.extract.<locals>.char_in_bbox  sj   € Ø˜%•[ 4¨¥>Õ1°QÕ6ˆEØ˜$•Z $ t¥*Õ,°Õ1ˆEØ"&ÑˆB�RÜØ‘×VÐV 5¡:×VÐV°E±L×VÐVÀuÁ~óð r   Nrö   r÷   rß   rò   ró   rr   )r   rÆ  r5   rc   r_   rƒ  r]   )rÀ   ri  ry   Ú	table_arrrÚ  rÉ  Úarrr’   Ú	row_charsro   Ú	cell_textÚ
cell_charss   &,          r
   ÚextractÚTable.extract  s&  € ÜˆØˆ	õ	ð —9”9ˆCØˆCÙ*/ÓP©% $°<ÀÇhÁh×3OŸ˜©%ˆIÐPàŸ	œ	�Ø’<Ø $‘Iñ *3ó"Ù)2 °lÀ4×6NŸ˜©ð ð "ô ˜:—’Ø,0°­G˜˜yÑ)Ø,0°­G˜˜yÑ)Ø# vÔ-Ø59¸!µW¸tÀA½wÕ5F˜F >Ñ2Ø6:¸1µgÀÀQÅÕ6G˜F ?Ñ3Ü$0°Ñ$F¸vÑ$F™	à$&˜	Ø—
‘
˜9Ö%ñ# "ð$ ×Ñ˜S×!ñ- ð0 Ðùò- Qùò"s   ¤D ÁD Á$D%Á8D%c                ór  € RpV P                   pV P                  pV P                   UUu. uF  qfP                   Uu. uF  qwNK  	  upNK  	  ppp\	        V4       U	U
u. uF  p	\	        V4       U
u. uF  p
RNK  	  up
NK   	  pp	p
\        V4       FM  w  r¬\        V4       F9  w  r�Vf   K  \        V P                  WŠ,          V	,          RR7      Wº,          V	&   K;  	  KO  	  V'       dÉ   \	        V4       FU  p	\	        V^,
          4       F<  p
W¹,          V
^,           ,          e   K  W¹,          V
,          W¹,          V
^,           &   K>  	  KW  	  \	        V4       FU  p
\	        V^,
          4       F<  p	W¹^,           ,          V
,          e   K  W¹,          V
,          W¹^,           ,          V
&   K>  	  KW  	  \        V P                  P                  4       Fh  w  r®V'       g   RV
^,            2pVP                  RR4      pV'       d'   \        P                  ! VP                  RR	4      4      pW>R,           ,          pKj  	  VR,          pVRRP                  R
 \	        V P                  4       4       4      ,           R,           ,          pV P                  P                  '       d   ^ M^p	W¹R  Fm  pRp\        V4       FH  w  r­Vf   RpV'       d'   \        P                  ! VP                  RR	4      4      pWýR,           ,          pKJ  	  VR,          pW?,          pKo  	  VR,           # u upi u uppi u up
i u up
p	i )a  Output table content as a string in Github-markdown format.

If "clean" then markdown syntax is removed from cell content.
If "fill_empty" then cell content None is replaced by the values
above (columns) or left (rows) in an effort to approximate row and
columns spans.

Ú|NT)r‰   ÚColrv   ru   Ú-z&#45;c              3   ó&   "  € T F  pR x € K	  	  R# 5i)z---Nr   )r   rj   s   & r
   r   Ú$Table.to_markdown.<locals>.<genexpr>o  s   é € Ð FÑ0E¨1¥Ó0Eùs   ‚z|
rr   )rÍ  rÑ  rÆ  rc   r`   rð   r—   r@   r¿  r·  ÚreplaceÚhtmlÚescaper¼   r¸  )rÀ   ÚcleanÚ
fill_emptyÚoutputrÆ  Úcolsr4   r   Ú
cell_boxesrn   rj   rc   rÉ  ro   ÚnamerŒ   s   &&&             r
   Úto_markdownÚTable.to_markdown=  s�  € ð ˆØ�~‰~ˆØ�~‰~ˆð 59·I²IÔ>±I¨q§'¢'Ó*¡'˜Q’q¡'Ô*±Iˆ
Ñ>ô 7<¸D´kÔB±k°¤ d¤Ó,¡˜1“$¡Ô,±kˆÑBÜ 
Ö+‰FˆAÜ$ Sž>‘�ØÔ#Ü"/ØŸ™ z¥}°QÕ'7À$ô#�E•H˜Q“Kó *ñ ,÷ ô ˜4–[�Ü˜t a�xž�AØ•x  A¥•Ô.Ø*/­(°1­+˜�  Q¥›ó )ñ !ô ˜4–[�Ü˜t a�xž�AØ �U•| A•Ô.Ø*/­(°1­+˜ !�e� Q›ó )ñ !ô ! §¡×!2Ñ!2Ö3‰GˆAßØ˜Q˜q�S˜E�{�Ø—<‘<  fÓ-ˆDßÜ—{’{ 4§<¡<°°WÓ#=Ó>�Ø˜S•jÕ ŠFñ 4ð 	�$�ˆà�#˜Ÿ™Ñ F´°d·n±nÔ0EÓ FÓFÕFÈÕNÕNˆð —‘×%×%Ð%‰A¨1ˆð ˜“9ˆCØˆDÜ$ Sž>‘�ð ’<Ø�DßÜŸ;š; t§|¡|°C¸Ó'AÓB�DØ˜s�
Õ"’ñ *ð �D�LˆDØ�NŠFñ ð ˜�}Ðùòm +ùÓ>ùò -ùÓBs.   ªL(¼
L#ÁL(ÁL3Á0L.Á;L3Ì#L(Ì.L3c                óÆ  €  ^ RI p/ pT P	                  4       pT P
                  pT P
                  P                  p\        T4      p\        T4       F  pYh,          p	T	'       d   K  RT 2Yh&   K  	  T\        \        T4      4      8w  d0   \        T4       F   pYh,          p	T	RT 28w  g   K  T RT	 2Yh&   K"  	  TP                  '       g
   TR,          p\        T4       FJ  pYh,          p
. p\        \        T4      4       F!  pTP                  YL,          T,          4       K#  	  Y³T
&   KL  	  TP                  T4      #   \         d    \        P                  ! R4       h i ; i)z/Return a pandas DataFrame version of the table.Nz!Package 'pandas' is not installedrå  ræ  r±  )ÚpandasÚModuleNotFoundErrorr;   Úmessagerá  r¿  r·  r_   r`   rØ  r¸  r]   Ú	DataFrame)rÀ   ri  ÚpdÚpd_dictrá  Úhdrr·  Úhdr_lenrj   rñ  rO   rñ  rn   s   &,           r
   Ú	to_pandasÚTable.to_pandasƒ  s6  € ð	Ûð
 ˆØ—,‘,“.ˆØ�k‰kˆØ—‘×!Ñ!ˆÜ�e“*ˆä�w–ˆAØ•8ˆDß‘4Ø   ˜9�“ñ  ð ”cœ#˜e›*“oÔ%Ü˜7–^�Ø•x�Ø˜S  ˜9Ö$Ø"#  A d V˜}�E“Hñ $ð
 �|�|ˆ|Ø˜b•kˆGä�w–ˆAØ•(ˆCØˆEÜœ3˜w›<Ö(�Ø—‘˜W�Z¨�]Ö+ñ )à �C‹Lñ  ð �|‰|˜GÓ$Ð$øô= #ô 	Ü�OŠOÐ?Ô@Øð	ús   ‚D= Ä=#E c                óœ  a(€ V P                   o(TpV(3R lpR p V P                  ^ ,          pVP                  p\        P                  ! VP
                  4      p\        YvT P                  4       ^ ,          R4      p\        T P                  4      ^8  d   T# \        T4      ^8  d   T# T P                  ^,          p	\        ;QJ d&    R T	P                   4       F  '       d   K   RM	  RM! R T	P                   4       4      '       d   T# T! T4      p
T
'       d   T! T	P
                  4      '       g   T# T! T 4      '       d   T# TRR  Uu. uF  q»e
   T^,          MRNK  	  ppT5p^ Tn        TP                  Tn        S(P                  RT\        P                  R7      R	,          p\        T UUUu. uFo  pTR
,           F_  pTR,           FO  p\         P#                  TR,          4      '       d   K'  TR,          \        P$                  ,          '       d   KM  TNKQ  	  Ka  	  Kq  	  upppR RR7      p. p. p. p\'        \        T4      4       EF€  pTT,          pTR,          ^,          pTTR,          ^,          ,
          pTR,          \        P(                  ,          pT^ 8X  d6   TP+                  T4       TP+                  T4       TP+                  T4       KŽ  TR,          pTR,          pTR,          pT'       d   T'       g    MÊTT,
          T8:  g-   \-        TT,
          TR,          ^,          ,
          4      T8:  dB   TR,          ^ ,          TT,
          TR,          ^,          T3TR&   TTT&   T'       d   TTR&   EK6  TT,
          RT,          8”  d    M8TP+                  T4       TP+                  T4       TP+                  T4       EKƒ  	  T. 8X  d   T# TR,          pTP                  T^ ,          ,
          T^ ,          8¼  d   T# T
'       d   T^ ,          '       g   T# T. 8X  d   T# \        P.                  ! 4       pT Uu. uF#  pTR,          ^,          TR,          8¼  g   K!  TNK%  	  up F  pTTR,          ,          pK  	  TP0                  '       g   TpTP                  Tn        S(P                  RTR7       Uu. uF   p\        P                  ! TR,          4      NK"  	  pp\        \3        \5        T U u. uF  p T ^,          NK  	  up 4      4      RR7      p!. pT! Fq  p"T U#U u. uFF  p#T#f   K	  T F7  p T ^,          T"8X  g   K  T ^ ,          T#8  g   K#  T ^,          T#8”  g   K3  T#T 3NK9  	  KH  	  p$p#p T$. 8X  d   TP+                  T"4       Kq   M	  T. 8X  d   T# T5p%TR,          T%n        T Uu. uF1  pTe)   T^ ,          T%P                  T^,          T%P                  3MRNK3  	  p&pT P
                  ^ ,          T%n        T P
                  ^,          T%n        T& Uu. uFH  pTe@   S(P;                  T4      P=                  RR4      P=                  RR4      P?                  4       MRNKJ  	  p'p\        \A        T%4      T&T'R4      #   \         d     R# i ; iu upi u upppi u upi u upi u up i u up p#i u upi u upi )aê  Identify the table header.

*** PyMuPDF extension. ***

Starting from the first line above the table upwards, check if it
qualifies to be part of the table header.

Criteria include:
* A one-line table never has an extra header.
* Column borders must not intersect any word. If this happens, all
  text of this line and above of it is ignored.
* No excess inter-line distance: If a line further up has a distance
  of more than 1.5 times of its font size, it will be ignored and
  all lines above of it.
* Must have same text properties.
* Starting with the top table line, a bold text property cannot change
  back to non-bold.

If not all criteria are met (or there is no text above the table),
the first table row is assumed to be the header.
c                ó\  <€ \         P                  ! V P                  ^ ,          P                  4      pV^ VP                  ) ^ VP                  ) 3,           pSP                  VR7      P                  4       ^,          pSP                  VR7      P                  4       ^,          pW48w  d   R# R# )z£
Compare top row background color with color of same-sized bbox
above. If different, return True indicating that the original
table top row is already the header.
©ÚclipTF)r;   r[   rÆ  r5   r©  Ú
get_pixmapÚcolor_topusage)rÀ   Úbbox0ÚbboxtÚ
top_color0Ú
top_colortr¤  s   &    €r
   Útop_row_bg_colorÚ+Table._get_header.<locals>.top_row_bg_colorÀ  sˆ   ø€ ô —L’L §¡¨1¥×!2Ñ!2Ó3ˆEØ˜Q §¡ ¨q°5·<±<°-Ð@Õ@ˆEØŸ™¨e˜Ó4×CÑCÓEÀaÕHˆJØŸ™¨e˜Ó4×CÑCÓEÀaÕHˆJØÔ'ÙÙr   c                óˆ   a € \         ;QJ d#    V 3R l\         4       F  '       g   K   R# 	  R# ! V 3R l\         4       4      # )a,  Check if a row contains some bold text.

If e.g. true for the top row, then it will be used as (internal)
column header row if any of the following is true:
* the previous (above) text line has no bold span
* the second table row text has no bold span

Returns True if any spans are bold else False.
c              3   óž   <"  € T FB  p\        VR ,          VR,          VR,          VR,          3S4      '       g   K7  VR,          x € KD  	  R# 5i)r   r   r   r   ÚboldN)r   rW  s   & €r
   r   Ú:Table._get_header.<locals>.row_has_bold.<locals>.<genexpr>Ø  sC   øé € ð á�AÜ  4¥¨!¨D­'°1°Tµ7¸A¸d½GÐ DÀd×Kô ��&—	’	Ûùs
   ƒ4A¼ATF)r   r   r   s   fr
   Úrow_has_boldÚ'Table._get_header.<locals>.row_has_boldÎ  s@   ø€ ÷ “3ô åó—3”3ð ’3ð �3ô åóó ð r   NFc              3   ó(   "  € T F  qR J x € K
  	  R # 5ir3   r   rš  s   & r
   r   Ú$Table._get_header.<locals>.<genexpr>ò  s   é € Ð-¡*˜Q�D�y£*ùs   ‚TrÈ   ©r  r|   rs   rt   rx   rŠ   r|   c                 ó"   € V R ,          ^,          # r   r   ©Úss   &r
   rK   Ú#Table._get_header.<locals>.<lambda>  s   € ˜!˜F�) Až,r   )rO   Úreverser5   g      ø?ºNé   Nrc  r  ºNr¦  N)r  rv   rz   z  rr   rX   )!r¤  rÆ  rc   r;   r[   r5   Ú
IndexErrorrµ  rá  r_   Úallr   r   Úget_textÚTEXTFLAGS_TEXTr\   r�   r¡  ÚTEXT_FONT_SUPERSCRIPTr`   ÚTEXT_FONT_BOLDr]   r€   rŸ  ra   r«   rØ  r   r   r¢  ré  rˆ   rb   ))rÀ   rø   Úy_deltar	  r  rÉ  rc   r5   Úheader_top_rowÚrow2Útop_row_boldr   Úcol_xr  rs   r>  Úlr  rx   ÚselectÚline_heightsÚ
line_boldsrj   r   rž  r  r   Úh0Úbold0Únclipr{  r8   r4   Ú	word_topsr¡   rJ   ÚintersectingÚhdr_bboxÚ	hdr_cellsÚ	hdr_namesr¤  s)   &&                                      @r
   r¾  ÚTable._get_header§  sJ  ø€ ð, �y‰yˆØˆõ	ò	ð 	Ø—)‘)˜A•,ˆCØ—I‘IˆEÜ—<’< §¡Ó)ˆDô
 % T°$·,±,³.ÀÕ2CÀUÓKˆô ˆt�y‰y‹>˜AÔØ!Ð!ô ˆu‹:˜Œ>Ø!Ð!ð �y‰y˜�|ˆß‹3Ñ- $§*¢*Ó-�3�3Š3Ñ- $§*¢*Ó-×-Ò-Ø!Ð!ñ $ DÓ)ˆ÷ ¡¨T¯Y©Y× 7Ò 7Ø!Ð!á˜D×!Ò!ð "Ð!ð ;@ÀÀ¹*ÓE¹*°Qš��1–¨DÒ0¹*ˆÐEð ˆuˆØˆŒØ—'‘'ˆŒà—‘˜v¨D¼×8NÑ8N�ÓOØõ
ˆô ñ  õ	á�AØ˜7Ÿ˜�AØ˜7Ÿ˜�Aä ×+Ñ+¨A¨f­I×6ô ð ˜•z¤G×$AÑ$A×AÑA÷ �ñ $ñ á#ñ Ùó	ñ 'Øô
ˆð ˆØˆØˆ
ô ”s˜5“z×"ˆAØ�a•ˆAØ�6•˜1•ˆBØ�Q�v•Y˜q•\Õ!ˆAØ�W•:¤× 6Ñ 6Õ6ˆDð �AŒvØ—‘˜bÔ!Ø×#Ñ# AÔ&Ø×!Ñ! $Ô'Ùð ˜•ˆBØ˜bÕ!ˆBØ˜r•NˆEçŸTÙð �B�w˜'Ô!¤S¨"¨r­'°Q°vµY¸qµ\Õ)AÓ%BÀgÔ%MØ˜v�Y q�\¨2°­7°A°fµI¸aµLÀ"ÐE��&‘	Ø��a‘ßØ%)�J˜r‘NÚØ�b•˜3 �8Ô#ÙØ�M‰M˜"ÔØ×Ñ Ô"Ø×Ñ˜d×#ñA #ðD �RŒ<Ø!Ð!à˜•ˆð �7‰7�V˜A•YÕ ,¨q¥/Ô1Ø!Ð!÷  
¨1§¤Ø!Ð!à�BŒ;Ø!Ð!ô ×"Ò"Ó$ˆÙ"ÓA™U˜ a¨¥i°¥l°f¸RµjÑ&@—!�!™UÔAˆAØ�Q�v•YÕŠEñ Bà�~�~ˆ~ØˆDà—'‘'ˆŒð 48·=±=ÀÈt°=Ô3TÓUÑ3T¨a”g—l’l 1 R¥5Ö)Ñ3Tˆ
ÐUÜœ4¤±:Ó$>±:¨a Q q§T T±:Ñ$>Ó ?Ó@È$ÔOˆ	àˆó ˆCñ ôá�AØô ó $�AØ�Q•4˜3‘;ô	 ð $% Q¥4¨!¡8ô	 ð 12°!µ°q±ô	 ��A“ñ $ñ Ùð ñ ð ˜rÔ!Ø—‘˜cÖ"áñ ð �RŒ<Ø!Ð!à�5ˆØ˜R•jˆŒñ ó
á�ð 78²mˆQˆq�T�8—;‘;  !¥ h§k¡kÑ2ÈÒMÙð 	ð 
ð —i‘i •lˆŒØ—i‘i •lˆŒñ ó
ñ �ð ’=ð × Ñ  Ó#×+Ñ+¨D°#Ó6×>Ñ>¸tÀSÓI×OÑOÔQàòñ ð 	ð 
ô œ5 ›?¨I°yÀ$ÓGÐGøôO ô 	Úð	üòB Fùô	ùòN Bùò VùÚ$>ùóùò"
ùò
sl   š?Z ÅZ#Æ5<Z(Ç6!Z(ÈZ(ÑZ/Ñ.Z/Ó&Z4ÔZ9Ô2Z>Ô=Z>ÕZ>Õ"Z>Õ2Z>Ö=7[Ø*A[	ÚZ ÚZ )rc   r¿  r¤  r@   N)FT)é   )r›   rœ   r�   rž   rÁ   Úpropertyr5   rÆ  rÍ  rÑ  rá  rò  rý  r¾  rŸ   rÕ   rÖ   s   @r
   r¼  r¼  ó  s€   ø‡ € ò)ð ñ
ó ð
ð ÷ó ðð ÷ó ðð ÷6ó ð6÷$ð $ôLDòL"%÷HbHò bHr   r¼  c                   ó–   a € ] tR tRt o RtRtRtRt]t	]
t]
t]t]
t]
t^t]t]t^t]
t]
tRtV 3R lR lt]R	R l4       tV 3R ltRtV tR# )
ÚTableSettingsiŒ  rt   Nc                ó   <€ V ^8„  d   QhRR/# )r+   r,   r7  r   )r/   r¸   s   "€r
   r0   ÚTableSettings.__annotate__   s   ø€ ÷ 3ñ 3˜ñ 3r   c           	     ó^  € \          F,  p\        W4      ;'       g    ^ ^ 8  g   K  \        RV R24      h	  R FD  p\        WR,           4      pV\        9  g   K"  \        V RRP	                  \        4       R24      h	  V P
                  f   / V n        R	 F>  pW@P
                  9  g   K  V P
                  P                  R^4      V P
                  V&   K@  	  RV P
                  9   d   V P
                  R R
 F/  w  rE\        W4      \        J g   K  \        W\        W4      4       K1  	  V # )ao  Clean up user-provided table settings.

Validates that the table settings provided consists of acceptable values and
returns a cleaned up version. The cleaned up version fills out the missing
values with the default values in the provided settings.

TODO: Can be further used to validate that the values are of the correct
    type. For example, raising a value error when a non-boolean input is
    provided for the key ``keep_blank_chars``.

:param table_settings: User-provided table settings.
:returns: A cleaned up version of the user-provided table settings.
:raises ValueError: When an unrecognised key is provided.
zTable setting 'z' cannot be negativeÚ	_strategyz_strategy must be one of{Ú,Ú}r‡  )rŽ   Úvertical)r  rø   ))r  Úsnap_tolerance)r  r?  )r  Újoin_tolerance)r  r@  )Úintersection_x_toleranceÚintersection_tolerance)Úintersection_y_tolerancerB  )	ÚNON_NEGATIVE_SETTINGSÚgetattrrï   ÚTABLE_STRATEGIESr¼   Útext_settingsrY   ÚUNSETÚsetattr)rÀ   Úsettingr   Ústrategyrõ  Úfallbacks   &     r
   Ú__post_init__ÚTableSettings.__post_init__   s,  € ÷  -ˆGÜ˜Ó&×+Ð+¨!¨qÖ0Ü  ?°7°)Ð;OÐ!PÓQÐQñ -ó 6ˆKÜ˜t°;Õ%>Ó?ˆHØÔ/Ö/Ü Ø"�mð $ØŸ™Ô"2Ó3Ð4°Bð8óð ñ 6ð ×ÑÒ%Ø!#ˆDÔó 3ˆDØ×-Ñ-Ö-Ø+/×+=Ñ+=×+AÑ+AÀ+ÈqÓ+Q�×"Ñ" 4Ó(ñ 3ð ˜$×,Ñ,Ô,Ø×"Ñ" ;Ð/ó
‰NˆDô �tÓ"¤eÕ+Ü˜¤G¨DÓ$;Ö<ñ
ð ˆr   c                ó  € Vf   V ! 4       # \        W4      '       d   V# \        V\        4      '       dI   / p/ pVP                  4        F$  w  rEVR,          R8X  d   WSVR,          &   K   WRV&   K&  	  W2R&   V ! R/ VB # \        RV 24      h)Nr  Útext_:r  NNrG  zCannot resolve settings: r   )r¯   rÈ   rð  rï   )ÚclsÚsettingsÚcore_settingsrG  ro  rŸ  s   &&    r
   ÚresolveÚTableSettings.resolveÕ  s”   € àÒÙ“5ˆLÜ˜×&Ò&ØˆOÜ˜¤$×'Ò'ØˆMØˆMØ Ÿ™Ö(‘�Ø�R•5˜GÔ#Ø+, ! B¥%Ó(à'( !Ó$ñ	 )ð
 .;˜/Ñ*ÙÑ'˜Ñ'Ð'äÐ8¸¸
ÐCÓDÐDr   c                óæ   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r+   Úvertical_strategyÚhorizontal_strategyÚexplicit_vertical_linesÚexplicit_horizontal_linesr?  r  r  r@  r  r  Úedge_min_lengthÚmin_words_verticalÚmin_words_horizontalrB  rA  rC  rG  )rv  r«   rê   rÈ   )r/   r¸   s   "€r
   r0   r9  Œ  sà   ø‡ ‚ áÑ$ñ ñ Ñ&ñ ñ "Ñ(ñ	 ñ
  $Ñ*ñ ñ Ñ2ñ ñ Ñ#ñ ñ Ñ#ñ ñ Ñ2ñ ñ Ñ#ñ ñ Ñ#ñ ñ Ññ ñ Ñ:ñ ñ  Ñ>ñ ñ "Ñ%ñ ñ  $Ñ+ñ! ñ" $Ñ+ñ# ñ$ Ñò% r   )rG  r3   ) r›   rœ   r�   rž   rW  rX  rY  rZ  ÚDEFAULT_SNAP_TOLERANCEr?  rH  r  r  ÚDEFAULT_JOIN_TOLERANCEr@  r  r  r[  ÚDEFAULT_MIN_WORDS_VERTICALr\  ÚDEFAULT_MIN_WORDS_HORIZONTALr]  rB  rA  rC  rG  rM  ÚclassmethodrT  Ú__annotate_func__rŸ   rÕ   rÖ   s   @r
   r7  r7  Œ  s�   ø‡ € à$ÐØ&ÐØ$(ÐØ&*ÐØ2€NØ#ÐØ#ÐØ2€NØ#ÐØ#ÐØ€OØ :ÐØ">ÐØ$%ÐØ&+ÐØ&+ÐØ€M÷3ð 3ðj óEó ðE÷U ƒ r   r7  c                   óF   a € ] tR tRt o RtR	R ltV 3R lR ltR tRtV t	R# )
ÚTableFinderié  a  
Given a PDF page, find plausible table structures.

Largely borrowed from Anssi Nurminen's master's thesis:
http://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/21520/Nurminen.pdf?sequence=3

... and inspired by Tabula:
https://github.com/tabulapdf/tabula-extractor/issues/16
Nc                ó   € \         P                  ! V4      V n        R V n        \        P                  V4      V n        V P                  4       V n        \        V P                  V P                  P                  V P                  P                  4      V n        \        V P                  4      V n        \        V P                  V P                  4       Uu. uF  p\!        V P                  V4      NK  	  upV n        R # u upi r3   )ÚweakrefÚproxyr¤  r@   r7  rT  rR  Ú	get_edgesrÎ  rm  rA  rC  ri  rŒ  rc   r­  r¼  r§  )rÀ   r¤  rR  Ú
cell_groups   &&& r
   rÁ   ÚTableFinder.__init__ô  s»   € Ü—M’M $Ó'ˆŒ	ØˆŒÜ%×-Ñ-¨hÓ7ˆŒØ—^‘^Ó%ˆŒ
Ü3Ø�J‰JØ�M‰M×2Ñ2Ø�M‰M×2Ñ2ó
ˆÔô
 ,¨D×,>Ñ,>Ó?ˆŒ
ô .¨d¯i©i¸¿¹ÔDó
áD�
ô �$—)‘)˜ZÖ(ÙDñ
ˆŽùò 
s   ÃC;c                ó    <€ V ^8„  d   QhRS[ /# r*   rª   )r/   r¸   s   "€r
   r0   ÚTableFinder.__annotate__  s   ø€ ÷ aHñ aH™4ñ aHr   c                óÀ  € V P                   pR FZ  p\        WR,           4      pVR8X  g   K  \        VRV,           R,           4      p\        V4      ^8  g   KJ  \        RV RV R24      h	  VP                  pVP
                  pVR8X  g   VR8X  d&   \        \        3/ VP                  ;'       g    / B pM. p. pVP                  ;'       g    .  FÞ  p	\        V	\        4      '       d6   \        V	4       F$  p
V
R	,          R
8X  g   K  VP                  V
4       K&  	  KN  VP                  RV	RV	RV P                  P                  ^,          RV P                  P                  ^,          RV P                  P                  ^,          V P                  P                  ^,          ,
          R	R
/4       Kà  	  VR8X  d   \!        \"        R
4      pMDVR8X  d   \!        \"        R
RR7      pM*VR8X  d   \%        WqP&                  R7      pMVR8X  d   . pM. pW¸,           p. pVP(                  ;'       g    .  FÞ  p	\        V	\        4      '       d6   \        V	4       F$  p
V
R	,          R8X  g   K  VP                  V
4       K&  	  KN  VP                  RV P                  P                  ^ ,          RV P                  P                  ^,          RV P                  P                  ^,          V P                  P                  ^ ,          ,
          RV	RV	R	R/4       Kà  	  VR8X  d   \!        \"        R4      pMDVR8X  d   \!        \"        RRR7      pM*VR8X  d   \+        WqP,                  R7      pMVR8X  d   . pM. pWí,           p\/        V4      \/        V4      ,           p\1        VVP2                  VP4                  VP6                  VP8                  R7      p\!        VVP:                  R7      # )r>  r;  ÚexplicitÚ	explicit_Ú_lineszIf z"_strategy == 'explicit', explicit_zD_lines must be specified as a list/tuple of two or more floats/ints.rŠ   r   rŸ  r   r   r¡   r¢   r©  rt   Úlines_strictrŒ   )rÉ  )r.  rž  rª  )r  r  r  r  )rÊ  )r>  rŽ   )rR  rE  r_   rï   rW  rX  rd  r   rG  rY  r¯   rÈ   r¾  r]   r¤  r   rÏ  ÚEDGESrc  r\  rZ  r:  r]  r«   r  r  r  r  r  r[  )rÀ   rR  r   rK  rt   Úv_stratÚh_stratrc  Ú
v_explicitÚdescrÅ  Úv_baserŸ  Ú
h_explicitÚh_baserž  rÎ  s   &                r
   ri  ÚTableFinder.get_edges  s]  € Ø—=‘=ˆã5ˆKÜ˜x°{Õ)BÓCˆHØ˜:Ö%Ü ¨+¸Õ*CÀhÕ*NÓO�Ü�u“: –>Ü$Ø˜k˜]ð +$Ø$/ =ð 1'ð(óð ñ 6ð ×,Ñ,ˆØ×.Ñ.ˆà�fÔ ¨6Ô 1Ü!¤%ÑJ¨H×,BÑ,B×,HÐ,HÀbÑJ‰EàˆEàˆ
Ø×4Ñ4×:Ð:¸Ò:ˆDÜ˜$¤×%Ò%Ü% dÖ+�AØ˜Õ'¨3Ö.Ø"×)Ñ)¨!Ö,ó ,ð ×!Ñ!à˜dØ˜dØ˜tŸy™yŸ~™~¨aÕ0Ø  $§)¡)§.¡.°Õ"3Ø  $§)¡)§.¡.°Õ"3°d·i±i·n±nÀQÕ6GÕ"GØ% sðö	ñ ;ð" �gÔÜ!¤%¨Ó-‰FØ˜Ô&Ü!¤%¨¸Ô?‰FØ˜ÔÜ% e×<WÑ<WÔX‰FØ˜
Ô"Ø‰FàˆFàÕˆàˆ
Ø×6Ñ6×<Ð<¸"Ò<ˆDÜ˜$¤×%Ò%Ü% dÖ+�AØ˜Õ'¨3Ö.Ø"×)Ñ)¨!Ö,ó ,ð ×!Ñ!à˜dŸi™iŸn™n¨QÕ/Ø˜dŸi™iŸn™n¨QÕ/Ø §¡§¡°Õ!2°T·Y±Y·^±^ÀAÕ5FÕ!FØ˜tØ  $Ø% sðö	ñ =ð" �gÔÜ!¤%¨Ó-‰FØ˜Ô&Ü!¤%¨¸Ô?‰FØ˜ÔÜ%Ø×&CÑ&Cô‰Fð ˜
Ô"Ø‰FàˆFàÕˆä�Q“œ$˜q›'Õ!ˆäØØ%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6Ø%×6Ñ6ô
ˆô ˜E¨h×.FÑ.FÔGÐGr   c                ó–   € \        V P                  4      pW8¼  d   \        R 4      hV^ 8  d   W,          pK  V P                  V,          # )ztable not on page)r_   r§  r  )rÀ   rj   Útcounts   && r
   Ú__getitem__ÚTableFinder.__getitem__g  s=   € Ü�T—[‘[Ó!ˆØŒ;ÜÐ0Ó1Ð1Ø�!ŒeØ�KŠAØ�{‰{˜1�~Ðr   )rc   rÎ  ri  r¤  rR  r§  r@   r3   )
r›   rœ   r�   rž   rÔ   rÁ   ri  r~  rŸ   rÕ   rÖ   s   @r
   re  re  é  s(   ø‡ € ñô
÷ aHð aH÷Fð r   re  c                óô  € V P                   ^,           pV P                  P                  pV P                  pV P	                  V\
        R7      pV P                  RVR7      R,          pW0P                   ,          pV EFø  pVR,           EFæ  p	V	R,          p
\        V
^ ,          ^4      \        V
^,          ^4      3p
\        P                  ! V
^ ,          V
^,          ) V
^,          V
^ ,          ^ ^ 4      pV
^,          ^ 8X  d   RpMRp\        V	R	,          R
 R7       EFN  pVR,          pVR,          p\        VR,          \        P                  ,          ;'       g    VR,          ^,          4      p\        P                  ! VR,          4      p\        VR,          R R7       EFÂ  p\        P                  ! VR,          4      pVV,          p\        P                  ! VR,          4      V,          pVP                   Vn        VP$                  Vn        VR,          p/ RV'       d   VP(                  VP*                  ,
          MVP,                  VP.                  ,
          bRVP,                  bRVP.                  V,           bRVbRVP,                  VP.                  ,
          bR\1        V4      bRRbRVbRR bR!R"bR#VbRV'       d   TMVP,                  VP.                  ,
          bR$VbR%R bR&VbR'VbR(VP.                  bR)VR*VP(                  VP*                  ,
          R+VP*                  R,VP(                  R-VP.                  R.VP,                  /Cp\2        P5                  V4       EKÅ  	  EKQ  	  EKé  	  EKû  	  V# )/z(Extract text as "rawdict" to fill CHARS.r  Úrawdictr—  rs   rt   rw   TFrx   c                 ó"   € V R ,          ^ ,          # r   r   r  s   &r
   rK   Úmake_chars.<locals>.<lambda>–  s   € ¸A¸f½IÀa¾Lr   rN   ÚfontrŽ  r|   r{   Úcolorry   c                 ó"   € V R ,          ^ ,          # r   r   )r   s   &r
   rK   rƒ  �  s   € ÀÀ&Å	È!Ær   r5   Úoriginr   Úadvr¢   rè   r�  r©  r"  ÚncsÚ	DeviceRGBÚnon_stroking_colorÚnon_stroking_patternNr§  r’   Úpage_numberÚstroking_colorÚstroking_patternr  rŠ   r¡   r!  rª  r   r   r   r   )Únumberr   r©  Útransformation_matrixÚget_textpageÚFLAGSr  r^   r;   ÚMatrixr\   r.   r!  ÚsRGB_to_pdfr[   ÚPointrJ   rÅ  r6   Úfr   r   r   r   rb   r   r]   )r¤  r  r�  Úpage_heightÚctmr£  rs   Údoctop_baserd   rŒ   Úldirr"  r!  r�   r�  ÚfontsizeÚ	span_boldr…  r’   r5   Úbbox_ctmr‡  rŠ   Ú	char_dicts   &&                      r
   Ú
make_charsr   …  s8  € à—+‘+ •/€KØ—)‘)×"Ñ"€KØ
×
$Ñ
$€CØ× Ñ  d´%Ð Ó8€HØ�]‰]˜9¨xˆ]Ó8¸ÕB€FØ§¡Õ+€KÜˆØ˜'—N‘NˆDØ˜•;ˆDÜ˜$˜q�' 1Ó%¤u¨T°!­W°aÓ'8Ð9ˆDÜ—^’^ D¨¥G¨d°1­g¨X°t¸AµwÀÀQÅÈÈAÓNˆFØ�A�w˜!Œ|Ø‘à�Ü˜t G�}Ñ2H×IÐI�Ø �<�Ø �<�Ü Ø˜•M¤G×$:Ñ$:Õ:×TÐT¸dÀ<Õ>PÐSTÕ>Tó�	ô  ×+Ò+¨D°­MÓ:�Ü" 4¨¥=Ñ6L×MÐM�DÜ"Ÿ<š<¨¨V­Ó5�DØ# c�z�HÜ$Ÿ]š]¨4°­>Ó:¸SÕ@�FØ%Ÿx™x�F”HØ%Ÿx™x�F”HØ �9�Dð!Ø·G˜tŸw™w¨¯©Ö0ÀÇÁÈ4Ï7É7ÕARð!à  $§'¡'ð!ð ! $§'¡'¨KÕ"7ð!ð # Hð	!ð
 ! $§'¡'¨D¯G©GÕ"3ð!ð !¤%¨£-ð!ð ˜{ð!ð -¨eð!ð /°ð!ð & vð!ð & {ð!ð ¯G¡¸¿¹À4Ç7Á7Õ9Jð!ð )¨%ð!ð +¨Dð!ð  	ð!ð   ð!!ð" ˜tŸw™wð#!ð$ " 7Ø §¡¨4¯7©7Õ!2Ø˜dŸg™gØ˜dŸg™gØ˜hŸk™kØ˜hŸk™kñ/!�Iô2 —L‘L ×+ôA Nô Jô #ñ ðb €Or   c                 ó   a aaa a!a"a#a$a%€ VP                   o$VP                  o%VP                  pVP                  R 8H  ;'       g    VP                  R 8H  o!S P
                  P                  o"S P                  S",          oS P                  ^,           o#S P
                  pS P                  R9   d'   VP                  w  r‰\        P                  ! ^ ^ W˜4      pVe   \        P                  ! V4      pMTpV$V%3R loRVV!V V$V%3R llp
V
! VR7      w  r³V$V%3R lo VV V"V#3R lpV EF“  pVR,          pVR,          '       d[   V^ ,          ^ ,          R	8X  dF   VR,          ^ ,          R	8X  d1   VP                  R	VR,          ^,          V^ ,          ^,          34       V EF  pV^ ,          R9  d   K  V^ ,          R	8X  dB   VR,          w  ppV! VVVV4      pV'       d!   \        P                  \        V4      4       Ka  Kc  V^ ,          R
8X  EdÐ   V^,          P                  4       pVP                   V8:  d¿   VP                   VP                  8  d¤   \#        VP$                  VP&                  ,           4      ^,          p\        P(                  ! VVP*                  4      p\        P(                  ! VVP,                  4      pV! VVVV4      pV'       d   \        P                  \        V4      4       EKX  VP                  V8:  d¿   VP                  VP                   8  d¤   \#        VP,                  VP*                  ,           4      ^,          p\        P(                  ! VP&                  V4      p\        P(                  ! VP$                  V4      pV! VVVV4      pV'       d   \        P                  \        V4      4       EK'  V! VVP.                  VP0                  V4      pV'       d   \        P                  \        V4      4       V! VVP0                  VP                  V4      pV'       d   \        P                  \        V4      4       V! VVP                  VP2                  V4      pV'       d   \        P                  \        V4      4       V! VVP2                  VP.                  V4      pV'       d"   \        P                  \        V4      4       EK>  EKA  V^,          w  ppppV! VVVV4      pV'       d   \        P                  \        V4      4       V! VVVV4      pV'       d   \        P                  \        V4      4       V! VVVV4      pV'       d   \        P                  \        V4      4       V! VVVV4      pV'       g   EKø  \        P                  \        V4      4       EK  	  EK–  	  RRRRR^/pV EF  pV! VVP.                  VP2                  V4      pV'       d   \        P                  \        V4      4       V! VVP0                  VP                  V4      pV'       d   \        P                  \        V4      4       V! VVP.                  VP0                  V4      pV'       d   \        P                  \        V4      4       V! VVP2                  VP                  V4      pV'       g   Kü  \        P                  \        V4      4       EK  	  Ve    \5        V\6        \8        34      '       g   Q hM. pV Fe  w  pp\        P(                  ! V4      p\        P(                  ! V4      pV! VVVV4      pV'       g   KG  \        P                  \        V4      4       Kg  	  Ve    \5        V\6        \8        34      '       g   Q hM. pV EF1  p\        P                  ! V4      pV! VVP.                  VP0                  V4      pV'       d   \        P                  \        V4      4       V! VVP0                  VP                  V4      pV'       d   \        P                  \        V4      4       V! VVP                  VP2                  V4      pV'       d   \        P                  \        V4      4       V! VVP2                  VP.                  V4      pV'       g   EK  \        P                  \        V4      4       EK4  	  R# )rr  Nc                óô  <€ VP                   S,
          V P                   u;8:  d   VP                  S,           8:  gA   M VP                   S,
          V P                  u;8:  d   VP                  S,           8:  dƒ   M MVP                  S,
          V P                  u;8:  d   VP                  S,           8:  gC   M VP                  S,
          V P                  u;8:  d   VP                  S,           8:  d    R#  MR# V P                   S,
          VP                   u;8:  d   V P                  S,           8:  gB   M V P                   S,
          VP                  u;8:  d   V P                  S,           8:  d…   M R# V P                  S,
          VP                  u;8:  d   V P                  S,           8:  gD   M V P                  S,
          VP                  u;8:  d   V P                  S,           8:  d	    R#  R# R# R# )a  Detect whether r1, r2 are neighbors.

Defined as:
The minimum distance between points of r1 and points of r2 is not
larger than some delta.

This check supports empty rect-likes and thus also lines.

Note:
This type of check is MUCH faster than native Rect containment checks.
TF)r   r   r   r   )r!   r"   Úsnap_xÚsnap_ys   &&€€r
   Úare_neighborsÚ!make_edges.<locals>.are_neighborsÚ  s6  ø€ ð �E‰E�F�N˜bŸe™eÖ5 r§u¡u¨v¥~Ö5Ø�u‰u�v�~ §¡Ö8¨"¯%©%°&­.×8à�E‰E�F�N˜bŸe™eÖ5 r§u¡u¨v¥~Ö5Ø�u‰u�v�~ §¡Ö8¨"¯%©%°&­.Õ8áñ 9áð �E‰E�F�N˜bŸe™eÖ5 r§u¡u¨v¥~Ö5Ø�u‰u�v�~ §¡Ö8¨"¯%©%°&­.Ö8ñ ð	 �E‰E�F�N˜bŸe™eÖ5 r§u¡u¨v¥~Ö5Ø�u‰u�v�~ §¡Ö8¨"¯%©%°&­.Õ8áð 9ñ ñ Ùr   c           	     óî  <€ V f   SP                  4       pM	V R,          p. pV F\  pS
'       dA   VR,          R8X  d3   VR,          P                  S8”  d   VR,          P                  S8”  d   KK  VP                  V4       K^  	  \	        \        V Uu. uF  q3R,          NK  	  up4      R R7      p. pV'       dµ   V^ ,          pRpV'       dv   Rp\        \        V4      ^,
          ^ R	4       FP  pS	! WdV,          4      '       g   K  WdV,          P                  ,          pWdV,          P                  ,          pWH RpKR  	  K}  \        \        V4      '       d   VP                  V4       V^  K¼  WR3# u upi )
z:Detect and join rectangles of "connected" vector graphics.:NNNrD   r—  r   c                 ó2   € V P                   V P                  3# r3   )r   r   rT   s   &r
   rK   Ú4make_edges.<locals>.clean_graphics.<locals>.<lambda>	  s   € ÈÏÉÈaÏdÉdÁ|r   rN   TFrX   )Úget_drawingsrª  r©  r]   r\   rØ  r`   r_   ÚtlÚbrr   r   )ÚnpathsÚallpathsÚpathsÚpÚprectsÚ	new_rectsÚprect0Úrepeatrj   r¥  rr  r¤  r£  r¤  s   &        €€€€€r
   Úclean_graphicsÚ"make_edges.<locals>.clean_graphicsú  s<  ø€ àŠ>Ø×(Ñ(Ó*‰Hà˜a•yˆHØˆÛˆA÷ Ø�f•I Ô$Ø�f•I—O‘O fÔ,Ø�f•I×$Ñ$ vÔ-áØ�L‰L˜ŽOñ ô œ±Ó6±¨1˜vŸY˜Y±Ñ6Ó7Ñ=SÔTˆØˆ	÷ Ø˜A•YˆFØˆFßØ�Üœs 6›{¨Q�°°2Ö6�AÙ$ V°A­Y×7Ô7Ø¨¥)§,¡,Õ.˜Ø¨¥)§,¡,Õ.˜Ø"˜IØ!%šó 7ô œU F×+Ò+à× Ñ  Ô(Ø�q’	àÐÐùò3 7s   ÂE2)r­  c                ó¸   <€ \        V P                  VP                  ,
          4      S8:  g,   \        V P                  VP                  ,
          4      S8:  d   R# R# )z'Check if line is roughly axis-parallel.TF)r€   rJ   r6   )r·  rw  r£  r¤  s   &&€€r
   Úis_parallelÚmake_edges.<locals>.is_parallel+	  s:   ø€ äˆr�t‰t�b—d‘d�{Ó˜vÔ%¬¨R¯T©T°B·D±D­[Ó)9¸VÔ)CÙÙr   c                óÈ  <€ S! W4      '       g   / # \        VP                  VP                  4      p\        VP                  VP                  4      p\        VP                  VP                  4      p\        VP                  VP                  4      pWCP                  8”  g1   WSP
                  8  g!   WcP                  8”  g   WsP                  8  d   / # WCP
                  8  d   VP
                  pWSP                  8”  d   VP                  pWcP                  8  d   VP                  pWsP                  8”  d   VP                  pWT,
          pWv,
          p	Y‰u;8X  d
   ^ 8X  d    / #  / RVbRSV,
          bRVbRSV,
          bRVbRV	bRWF3WW3.bRV R,          bR	R
bRRbRRbRV R,          '       d
   V R,          MV R,          bRRbRRbRSbRRbRRbRVRVRVS,           /Cp
V
# )z;Given 2 points, make a line dictionary for table detection.r   r   r   r   rª  r©  r°  Ú	linewidthÚstrokeTÚfillFÚevenoddrŽ  r…  r‹  Nr§  rŒ   r�  r�  rŒ  r¡   r¢   rè   )r    rJ   r   r6   r   r   r   r   )r°  r·  rw  r  r   r   r   r   rª  r©  Ú	line_dictÚdoctop_basisr¸  r˜  r�  s   &&&&       €€€€r
   Ú	make_lineÚmake_edges.<locals>.make_line1	  s  ø€ á˜2×"Ò"ØˆIä�—‘�r—t‘t‹_ˆÜ�—‘�r—t‘t‹_ˆÜ�—‘�r—t‘t‹_ˆÜ�—‘�r—t‘t‹_ˆð —‘Œ<˜2§¡œ<¨2·±¬<¸2ÇÁ¼<ØˆIà—‘Œ<Ø—‘ˆBà—‘Œ<Ø—‘ˆBà—‘Œ<Ø—‘ˆBà—‘Œ<Ø—‘ˆBà•ˆØ•ˆØÖ˜aÕØˆIð  ð
Ø�"ð
à�+ Õ"ð
ð �"ð
ð �+ Õ"ð	
ð
 �Uð
ð �fð
ð �R�H˜r˜hÐ'ð
ð ˜˜7�ð
ð �dð
ð �Eð
ð �uð
ð ¨A¨g¯J¬J˜a žj¸A¸f½Ið
ð ! $ð
ð ˜6ð
ð ˜;ð
ð   ð!
ð" # Dð#
ð$ �2Ø�bØ�b˜<Õ'ñ)
ˆ	ð, Ðr   rð  Ú	closePathr'  Úrer±  r…  r½  rª  ©éZ   r#  r3   rX   )r'  rÄ  Úqu)rH   rH   rH   )r  r  r[  rW  rX  r   r©  r�  r(  r¬  r;   r[   r]   rs  r£  Ú	normalizerª  r€   r   r   r–  r   r   r«  ÚblÚtrr¯   rb   r«   )&r¤  r  Útsetr¯  Ú	add_linesÚ	add_boxesrÊ  Úprectr{  rž  rµ  r(  rÁ  r°  rð  rj   r·  rw  r¿  r   rJ   r6   ÚulÚurÚllÚlrÚpathr5   Úboxr4   r¥  rÀ  r¸  rr  r˜  r�  r£  r¤  s&   f&&&&&                        @@@@@@@@r
   Ú
make_edgesrÕ  Æ  so  ÿø€ Ø×"Ñ"€FØ×"Ñ"€FØ×%Ñ%€Jà×Ñ .Ñ0÷ 	6ð 	6Ø×#Ñ# ~Ñ5ð ð —)‘)×"Ñ"€KØ—;‘; Õ,€LØ—+‘+ •/€KØ�I‰I€EØ‡}�}˜	Ô!Ø�x‰x‰ˆÜ—’˜Q  1Ó(ˆØÒÜ�|Š|˜DÓ!‰àˆö÷@- ó - ñ^ #¨%Ô0�M€Fö÷4ð 4ôl ˆØ�'•
ˆð ˆ[�>Œ>˜e A�h q�k¨SÔ0°U¸2µY¸qµ\ÀSÔ5HØ�L‰L˜#˜u R�y¨�|¨U°1­X°a­[Ð9Ô:äˆAØ��tÐ,Ô,Ùà��t�sŒ{Ø˜2�‘��BÙ% a¨¨R°Ó6�	ßÜ—L‘L¤¨iÓ!8Ö9ñ ð �1•˜•ð ˜•t—~‘~Ó'�ð —J‘J *Ô,°·±¸d¿k¹kÔ1Iä˜DŸG™G d§g¡gÕ-Ó.°Õ2�AÜ Ÿš q¨$¯'©'Ó2�BÜ Ÿš q¨$¯'©'Ó2�BÙ )¨!¨R°°TÓ :�Iß ÜŸ™¤\°)Ó%<Ô=Úð —K‘K :Ô-°$·+±+ÀÇ
Á
Ô2Jä˜DŸG™G d§g¡gÕ-Ó.°Õ2�AÜ Ÿš t§w¡w°Ó2�BÜ Ÿš t§w¡w°Ó2�BÙ )¨!¨R°°TÓ :�Iß ÜŸ™¤\°)Ó%<Ô=Úá% a¨¯©°$·'±'¸4Ó@�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¯©°$·'±'¸4Ó@�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¯©°$·'±'¸4Ó@�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¯©°$·'±'¸4Ó@�	ßÜ—L‘L¤¨iÓ!8×9ò ð
 "# 1¥‘��B˜˜Bá% a¨¨R°Ó6�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¨R°Ó6�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¨R°Ó6�	ßÜ—L‘L¤¨iÓ!8Ô9á% a¨¨R°Ó6�	ß’9Ü—L‘L¤¨iÓ!8×9ôO ñ ð` �Y ¨¨g°qÐ9€DÜˆÙ˜d D§G¡G¨T¯W©W°dÓ;ˆ	ßÜ�L‰Lœ iÓ0Ô1á˜d D§G¡G¨T¯W©W°dÓ;ˆ	ßÜ�L‰Lœ iÓ0Ô1á˜d D§G¡G¨T¯W©W°dÓ;ˆ	ßÜ�L‰Lœ iÓ0Ô1á˜d D§G¡G¨T¯W©W°dÓ;ˆ	ß‰9Ü�L‰Lœ iÓ0×1ñ ð" ÒÜ˜)¤e¬T ]×3Ò3Ð3Ñ3àˆ	Û‰ˆˆBÜ�]Š]˜2ÓˆÜ�]Š]˜2ÓˆÙ˜d B¨¨DÓ1ˆ	ß‰9Ü�L‰Lœ iÓ0Ö1ñ ð ÒÜ˜)¤e¬T ]×3Ò3Ð3Ñ3àˆ	ÜˆÜ�LŠL˜ÓˆÙ˜d A§D¡D¨!¯$©$°Ó5ˆ	ßÜ�L‰Lœ iÓ0Ô1Ù˜d A§D¡D¨!¯$©$°Ó5ˆ	ßÜ�L‰Lœ iÓ0Ô1Ù˜d A§D¡D¨!¯$©$°Ó5ˆ	ßÜ�L‰Lœ iÓ0Ô1Ù˜d A§D¡D¨!¯$©$°Ó5ˆ	ßŠ9Ü�L‰Lœ iÓ0×1ó r   c           	     ó   € V P                   pV P                  pV P                   pV^Z8X  dZ   \        P                  ! ^^ ^ ^VP                  VP
                  ,
          VP                  ,
          VP                  ,
          ^ 4      pM�VR8X  dZ   \        P                  ! ^^ ^ ^^ VP
                  VP                  ,
          VP                  ,
          VP                  ,
          4      pM=\        P                  ! ^^ ^ ^RVP                  ,          RVP                  ,          4      pW@P                  ,          pR\        V4      ,          p\        P                  P                  W^ 4      pVR9   d/   Vw  r‰r«W“n        Wƒn        W³n        W£n        V P                  V4       V P                  ^ 4       V P                  pV P                  pWÍ,          p WW!3# )zµNullify page rotation.

To correctly detect tables, page rotation must be zero.
This function performs the necessary adjustments and returns information
for reverting this changes.
r#  s   %g %g %g %g %g %g cm éþÿÿÿrÅ  )Úmediaboxr(  r;   r”  r   r   r   r   Úderotation_matrixrb   ÚTOOLSÚ_insert_contentsÚset_mediaboxÚset_rotationÚparentr�  )r¤  rØ  ÚrotÚmbÚmat0ÚmatÚcmdÚxrefr   r   r   r   ÚdocÚpnos   &             r
   Úpage_rotation_set0rç  è	  s^  € ð �}‰}€HØ
�-‰-€Cà	�‰€Bà
ˆb„yä�~Š~˜a  A q¨"¯%©%°"·%±%­-¸"¿%¹%Õ*?À"Ç%Á%Õ*GÈÓK‰Ø	�Œä�~Š~˜a  A q¨!¨R¯U©U°R·U±U­]¸R¿U¹UÕ-BÀRÇUÁUÕ-JÓK‰ä�~Š~˜a  A q¨"¨r¯u©u­*°b¸2¿5¹5µjÓAˆð ×'Ñ'Õ
'€CØ
"¤U¨3£ZÕ
/€CÜ�=‰=×)Ñ)¨$°QÓ7€Dð ˆiÔØ‰ˆ�ØŒØŒØŒØŒØ×Ñ˜"Ôà×Ñ�aÔð �+‰+€CØ
�+‰+€CØ�8€DØ�sÐ$Ð$r   c                ó®   € V P                   pVP                  VR4       V P                  V4       V P                  V4       V P                  pWE,          p V # )zLReset page rotation to original values.

To be used before we return tables.ó    )rÞ  Úupdate_streamrÜ  rÝ  r�  )r¤  rä  rß  rØ  rå  ræ  s   &&&&  r
   Úpage_rotation_resetrë  
  sN   € ð �+‰+€CØ×Ñ�d˜DÔ!Ø×Ñ�hÔØ×Ñ�cÔØ
�+‰+€CØ�8€DØ€Kr   c                 óØ   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        R\        R\        R	\        R
\        R\        R\        R\        R\        R\        R\        /# )r+   rW  rX  Úvertical_linesÚhorizontal_linesr?  r  r  r@  r  r  r[  r\  r]  rB  rA  rC  )rv  r«   rê   )r/   s   "r
   r0   r0   !
  s¾   € ÷ Iñ Iô ðIô ð	Iô
 ðIô ðIô ðIô ðIô ðIô ðIô ðIô ðIô ðIô ðIô  ðIô  "ð!Iô" $ð#Iô$ $ñ%Ir   c           	      óÌ
  a$a%€ \         P                  ! 4        \        P                  4        \        P                  4        R p\        \         P                  P                  4       4      p\         P                  P                  R4       V P                  ^ 8w  d   \        V 4      w  p pppMR R R pppVf   \        pVf   \        pV
f   \        p
Vf   \        pVf   \        pVf   \        pVe   TpTp/ RVbRVbRVbRVbRVbRVbRVbR	V	bR
V
bRVbRVbRVbRVbRVbRVbRVbRVbRVRV/Cp\         P                  P                  4       p V P                  4        V P                  '       dg   \         P                  P                  R4       V P                   U u. uF0  p V R,          R8X  g   K  \         P                  ! V R,          4      NK2  	  p!p M. p!V!'       d   MkV P                  e^   \        V 4      p"T"\         P                  P                  V4       Ve   \!        V VVV4      p \         P                  P                  V4       # \"        P%                  VR7      p#V#V n        \)        WR7      p\+        V VV#VVVR7       \        V V#R7      p"VV"n        V!'       de   V"P.                   U$a$u. uFG  o$\0        ;QJ d    V$3R lV! 4       F  '       g   K   RM	  RM! V$3R lV! 4       4      '       g   KE  S$NKI  	  up$V"n        V! U%a%u. uF[  o%\2        ;QJ d)    V%3R lV"P.                   4       F  '       d   K   RM	  RM! V%3R lV"P.                   4       4      '       g   KY  S%NK]  	  p&p%V&'       dQ   VP5                  4        U'u. uF   p'\         P                  ! V'R,          4      NK"  	  p(p'V P7                  \8        R7      p)V& F5  p*\;        X)X(V*4      p+V"P.                  P=                  \?        V V+4      4       K7  	   \         P                  P                  T4       Te   \!        T TTT4      p \         P                  P                  T4       T"P.                   F
  p-TT-n        K  	  T"# u up i u up$i u up%i u up'i   \@         d‚   p,\         PB                  ! R\E        T,4      ,          4        R p,?,\         P                  P                  T4       Te   \!        T TTT4      p \         P                  P                  T4       R # R p,?,ii ; i  \         P                  P                  T4       Te   \!        T TTT4      p \         P                  P                  T4       i ; i) NTrW  rX  rY  rZ  r?  r  r  r@  r  r  r[  r\  r]  rB  rA  rC  Útext_toleranceÚtext_x_toleranceÚtext_y_toleranceÚtabler  )rR  r  )r  rË  r¯  rÌ  rÍ  c              3   óV   <"  € T F  p\        SP                  V4      R 8¬  x € K   	  R# 5i©g333333ã?N©r(   r5   )r   r4   Útabs   & €r
   r   Úfind_tables.<locals>.<genexpr>”
  s!   øé € Ð?¹°A”t˜CŸH™H aÓ(¨CÖ/»ùó   ƒ&)Fc              3   óV   <"  € T F  p\        SVP                  4      R 8  x € K   	  R# 5irõ  rö  )r   r÷  r4   s   & €r
   r   rø  ˜
  s!   øé € Ð#RÁzÀ¤D¨¨C¯H©HÓ$5¸Ö$;Ãzùrù  )r|   z#find_tables: exception occurred: %srX   )#r;   Ú_warn_layout_oncer   rž  rs  r.   rÚ  Úset_small_glyph_heightsr(  rç  rH  Úunset_quad_correctionsÚ
get_layoutÚlayout_informationr[   re  rë  r7  rT  Útable_settingsr   rÕ  r@   r§  r   r  ÚextractWORDSr’  ÚTABLE_DETECTOR_FLAGSrp   r]   r¼  Ú	Exceptionr÷  rv  ).r¤  r  rW  rX  rí  rî  r?  r  r  r@  r  r  r[  r\  r]  rB  rA  rC  rð  rñ  rò  rK  rÌ  rÍ  r¯  r£  Ú	old_smallÚold_xrefÚold_rotÚold_mediaboxrR  Úold_quad_correctionsr>  ÚboxesÚtbfrË  r÷  r4   Úmy_boxesr{  r8   Útp2r   rc   rÅ  ró  s.   &&&&&&&&&&&&&&&&&&&&&&&&&           ``        r
   Úfind_tablesr  !
  s  ù€ ô6 ×ÒÔÜ	‡K�K„MÜ	‡K�K„MØ€HÜ”W—]‘]×:Ñ:Ó<Ó=€IÜ‡M�M×)Ñ)¨$Ô/Ø‡}�}˜ÔÜ0BÀ4Ó0HÑ-ˆˆh˜¡à*.°°d˜<�'ˆàÒÜ ÐØÒÜ ÐØÒÜ ÐØÒÜ ÐØÒ'Ü#(Ð ØÒ'Ü#(Ð ØÒØ$ÐØ&ÐðØÐ.ðàÐ2ðð 	" >ðð 	$Ð%5ð	ð
 	˜.ðð 	Ð,ðð 	Ð,ðð 	˜.ðð 	Ð,ðð 	Ð,ðð 	˜?ðð 	Ð0ðð 	Ð 4ðð 	!Ð"8ðð 	#Ð$<ðð  	#Ð$<ð!ð" 	˜.ð#ð$ 	Ð,ØÐ,ñ'€Hô, #Ÿ=™=×?Ñ?ÓAÐð9CØ�‰ÔØ×"×"Ð"Ü�M‰M×0Ñ0°Ô6à-1×-DÒ-DóÙ-D¨ÈÈ"ÍÐQXÑHXÔ#”—’˜Q˜r�UÖ#Ñ-Dð ð ˆEð ˆEçØØ×$Ñ$Ò0ô ˜dÓ#ˆCØôL 	�‰×-Ñ-¨iÔ8ØÒÜ& t¨X°wÀÓMˆDÜ�‰×,Ñ,Ð-AÕBôO ×$Ñ$¨hÐ$Ó7ˆØ"ˆÔä˜dÔ.ˆÜØØØØØØõ	
ô ˜$¨Ô.ˆØˆŒßð Ÿ:š:ôá%�Cß“3Ô?¹Ó?—3—3’3Ô?¹Ó?×?÷ �Ù%ñˆCŒJñ ô
Ù�!§£Ô#RÀsÇzÂzÓ#R§§¢Ô#RÀsÇzÂzÓ#R× R�AˆA‘uð 	ð 
÷ Ø7?×7LÑ7LÔ7NÓOÑ7N°!œ'Ÿ,š, q¨¥uÖ-Ñ7NˆJÐOØ×#Ñ#Ô*>Ð#Ó?ˆCÛˆDÜ(¨¨j¸$Ó?ˆEØ�J‰J×Ñœe D¨%Ó0Ö1ò ô 	�‰×-Ñ-¨iÔ8ØÒÜ& t¨X°wÀÓMˆDÜ�‰×,Ñ,Ð-AÔBØ—”ˆØ!ˆŽñ à€Jùòqùò>ùò
ùò Pøô
 ô Ü�ŠÐ=ÄÀAÃÕFÔGÛä�‰×-Ñ-¨iÔ8ØÒÜ& t¨X°wÀÓMˆDÜ�‰×,Ñ,Ð-AÖBûðûô 	�‰×-Ñ-¨iÔ8ØÒÜ& t¨X°wÀÓMˆDÜ�‰×,Ñ,Ð-AÕBúsš   ÅAR ÆQ.Æ2!Q.ÇR Ç R ÉA%R Ê1Q3ËQ3ËQ3Ë8Q3Ë>R ÌQ8ÌQ8Ì<%Q8Í&Q8Í,R Î&Q=Î.AR Ñ.R ÒTÒ&T	Ò3T Ô	TÔT ÔAU#)F)r?  r  r  r@  r  r  r[  r\  r]  rB  rA  rC  )rt   rr  rŠ   ro  )r   )NNr   rG   )r   r   r3   )NNNNN)irÔ   ÚinspectrQ  r  rê  Úcollections.abcr   Údataclassesr   Úoperatorr   rg  r;   r   rs  r   r£  ÚFZ_STEXT_BOLDrƒ   ÚFZ_STEXT_STRIKEOUTr‚   r  ÚTEXT_COLLECT_STYLESÚTEXT_ACCURATE_BBOXESÚTEXT_MEDIABOX_CLIPr“  ÚTEXT_SEGMENTÚTEXT_COLLECT_VECTORSr  rØ  Ú
whitespacer�   r   r   r(   r9   rB   rp   r—   rê   r™   rD  rF  rH  r^  r_  r`  ra  rf  r  r  r  r+  rî   r³   rµ   rØ   r  rd  Ú	signaturer  Ú
parametersrŠ  rn  rm  rs  rƒ  rŠ  rœ  r£  r­  r¸  r¾  rÏ  rÕ  rß  rñ   ró  rþ  r  r  r  r  r!  r&  r)  rÍ   r:  rM  rc  rm  ro  rŒ  r­  r¯  r³  rµ  r¼  r7  re  r   rÕ  rç  rë  r  r   r   r
   Ú<module>r     s©  ðñHóT Û Û Û Ý $Ý !Ý Û Û Ý ð 	€Ø
€Ø€Ø×Ñ€	Ø×)Ñ)€àØ×Ñõà×!Ñ!õ"ð ×"Ñ"õ#ð × Ñ õ	!ð ð Ø×"Ñ"õ#à×Ñõð ×"Ñ"õ#ð × Ñ õ	!ð ñ �6×$Ñ$Ó%€òò	ò	9õMòò8ôveôZ	�ô 	òÐ ò  AÐ Ù�1‹€ØÐ ØÐ ØÐ Ø Ð ØÐ ØÐ ØÐ ØÐ Ù˜˜u d¨HÓ5€ð 
ˆ4Ø	ˆ5Ø	ˆ5Ø	ˆ4Ø	ˆ4Ø	ˆ4Ø	ˆ4ð€	õ	 ÷#ñ #÷L^!ñ ^!÷BTñ Tõn8ð ×"Ò" 7×#5Ñ#5Ó6×AÑA×FÑFÓH€Ø×)Ò)¨-Ó8×CÑC×HÑHÓJÐ õõðF "÷÷,ò.õ%&õPõ$H÷%÷$õ(1õ5õ @õ,	4ð 'Ø&ô!õ$@ð6 8N÷ ò6õBMõ2ò5ò3ð 3O÷ &òRð 3M÷ :÷zò2ò;(õ|O÷d
ñ 
ô	ˆyô 	÷ñ ÷VHñ VHðr ÷YEð YEó ðYE÷xDñ DðNô*9ôB_2òD	)%òX
ð 
Ø$Ø&ØØ!Ø2Ø"Ø"Ø2Ø"Ø"ØØ :Ø">Ø$%Ø&*Ø&*ØØØØØØØ
÷3Iñ Ir   