From a283ccff25a25ebbe6e9b2decfaaad6f300597db Mon Sep 17 00:00:00 2001 From: Qiefan Jiang Date: Mon, 1 Sep 2025 19:53:45 +0800 Subject: [PATCH] feat(msexcel): set ContentLayer.INVISIBLE for invisible sheet (#1876) * feat(msexcel): ignore invisible sheet * DCO Remediation Commit for Qiefan Jiang I, Qiefan Jiang , hereby add my Signed-off-by to this commit: ca391f4908f44f301de54a97057f0b809f5ce66c Signed-off-by: Qiefan Jiang * retain invisible sheet with ContentLayer.INVISIBLE Signed-off-by: Qiefan Jiang * update UT Signed-off-by: Qiefan Jiang * fix: use Optional for python3.9 Signed-off-by: Qiefan Jiang * DCO Remediation Commit for Qiefan Jiang I, Qiefan Jiang , hereby add my Signed-off-by to this commit: a34371a90e30589f7485f3d15ab09483d39a3c9f Signed-off-by: Qiefan Jiang --------- Signed-off-by: Qiefan Jiang --- docling/backend/msexcel_backend.py | 16 ++- .../groundtruth/docling_v2/test-01.xlsx.json | 115 +++++++++++++++++- tests/data/xlsx/test-01.xlsx | Bin 170052 -> 170934 bytes tests/test_backend_msexcel.py | 5 +- 4 files changed, 132 insertions(+), 4 deletions(-) diff --git a/docling/backend/msexcel_backend.py b/docling/backend/msexcel_backend.py index 220c05fa..9ad2a360 100644 --- a/docling/backend/msexcel_backend.py +++ b/docling/backend/msexcel_backend.py @@ -1,10 +1,11 @@ import logging from io import BytesIO from pathlib import Path -from typing import Any, Union, cast +from typing import Any, Optional, Union, cast from docling_core.types.doc import ( BoundingBox, + ContentLayer, CoordOrigin, DocItem, DoclingDocument, @@ -197,6 +198,7 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken parent=None, label=GroupLabel.SECTION, name=f"sheet: {sheet_name}", + content_layer=self._get_sheet_content_layer(sheet), ) doc = self._convert_sheet(doc, sheet) width, height = self._find_page_size(doc, page_no) @@ -237,6 +239,7 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken """ if self.workbook is not None: + content_layer = self._get_sheet_content_layer(sheet) tables = self._find_data_tables(sheet) for excel_table in tables: @@ -282,6 +285,7 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken origin=CoordOrigin.TOPLEFT, ), ), + content_layer=content_layer, ) return doc @@ -486,6 +490,7 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken The updated DoclingDocument. """ if self.workbook is not None: + content_layer = self._get_sheet_content_layer(sheet) # Iterate over byte images in the sheet for item in sheet._images: # type: ignore[attr-defined] try: @@ -511,6 +516,7 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken anchor, origin=CoordOrigin.TOPLEFT ), ), + content_layer=content_layer, ) except Exception: _log.error("could not extract the image from excel sheets") @@ -536,3 +542,11 @@ class MsExcelDocumentBackend(DeclarativeDocumentBackend, PaginatedDocumentBacken bottom = max(bottom, bbox.b) if bottom != -1 else bbox.b return (right - left, bottom - top) + + @staticmethod + def _get_sheet_content_layer(sheet: Worksheet) -> Optional[ContentLayer]: + return ( + None + if sheet.sheet_state == Worksheet.SHEETSTATE_VISIBLE + else ContentLayer.INVISIBLE + ) diff --git a/tests/data/groundtruth/docling_v2/test-01.xlsx.json b/tests/data/groundtruth/docling_v2/test-01.xlsx.json index f72f62c1..cfa618d0 100644 --- a/tests/data/groundtruth/docling_v2/test-01.xlsx.json +++ b/tests/data/groundtruth/docling_v2/test-01.xlsx.json @@ -4,7 +4,7 @@ "name": "test-01", "origin": { "mimetype": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - "binary_hash": 13665052226482254103, + "binary_hash": 5648670872883457266, "filename": "test-01.xlsx" }, "furniture": { @@ -25,6 +25,9 @@ }, { "$ref": "#/groups/2" + }, + { + "$ref": "#/groups/3" } ], "content_layer": "body", @@ -85,6 +88,20 @@ "content_layer": "body", "name": "sheet: Sheet3", "label": "section" + }, + { + "self_ref": "#/groups/3", + "parent": { + "$ref": "#/body" + }, + "children": [ + { + "$ref": "#/tables/6" + } + ], + "content_layer": "invisible", + "name": "sheet: Sheet4", + "label": "section" } ], "texts": [], @@ -3382,6 +3399,95 @@ ] }, "annotations": [] + }, + { + "self_ref": "#/tables/6", + "parent": { + "$ref": "#/groups/3" + }, + "children": [], + "content_layer": "invisible", + "label": "table", + "prov": [ + { + "page_no": 4, + "bbox": { + "l": 0.0, + "t": 0.0, + "r": 1.0, + "b": 2.0, + "coord_origin": "TOPLEFT" + }, + "charspan": [ + 0, + 0 + ] + } + ], + "captions": [], + "references": [], + "footnotes": [], + "data": { + "table_cells": [ + { + "row_span": 1, + "col_span": 1, + "start_row_offset_idx": 0, + "end_row_offset_idx": 1, + "start_col_offset_idx": 0, + "end_col_offset_idx": 1, + "text": "header", + "column_header": true, + "row_header": false, + "row_section": false + }, + { + "row_span": 1, + "col_span": 1, + "start_row_offset_idx": 1, + "end_row_offset_idx": 2, + "start_col_offset_idx": 0, + "end_col_offset_idx": 1, + "text": "1", + "column_header": false, + "row_header": false, + "row_section": false + } + ], + "num_rows": 2, + "num_cols": 1, + "grid": [ + [ + { + "row_span": 1, + "col_span": 1, + "start_row_offset_idx": 0, + "end_row_offset_idx": 1, + "start_col_offset_idx": 0, + "end_col_offset_idx": 1, + "text": "header", + "column_header": true, + "row_header": false, + "row_section": false + } + ], + [ + { + "row_span": 1, + "col_span": 1, + "start_row_offset_idx": 1, + "end_row_offset_idx": 2, + "start_col_offset_idx": 0, + "end_col_offset_idx": 1, + "text": "1", + "column_header": false, + "row_header": false, + "row_section": false + } + ] + ] + }, + "annotations": [] } ], "key_value_items": [], @@ -3407,6 +3513,13 @@ "height": 36.0 }, "page_no": 3 + }, + "4": { + "size": { + "width": 0.0, + "height": 0.0 + }, + "page_no": 4 } } } \ No newline at end of file diff --git a/tests/data/xlsx/test-01.xlsx b/tests/data/xlsx/test-01.xlsx index ea35b723b826961205656baa7e124aec0ef7ad20..5ce87531af84f82add366b8d05bee59d3df413fe 100644 GIT binary patch delta 13656 zcmcJ$bx>T*@;(lWySo!4xCVE3g1fuB1Y6vKFR*BE0t9z=ch?|6f;++G%lqD2_r0H6 z_51U8wsz`FZJ(W*nbX}*cR$l#jo8?Pi1%3@3K|;%76Kju0)hf!oAm8?1`+~dwFZw0 z09;pEW5w>w>F1Z|l#D{kEVi*79SD>U=e&g&6mlpZ6ux4c?tF<`57b_0u)(tV*&nrY zJ~VWDnQmC2peGZNvfE)8iTb` zue&B*oJO$lXC%at7IN~A6!*oqr$98Ee)-z&Ht;W(^GMVKxhwp{eM?ToQOWe`98be% zp;g#1#n-iJEB&d%mPHr=QE^M-Re2fdeiv`TYT_*z6tcyFt!m~QzMi0G>0GevgpdH2kSXC*P8rN$z}O>s zwb1~!;Wbuex88&q(yv~(c}wmvghk(tXT$hGNy9Z{&0e>$NFsU9TtPKhRA{+q%0_|NZyzN=MoLucp zot*5Ly&de!H4K~zc(DDAY~G-@vk9*;0Q4lHfK|EE5;>03Gqt@yta894;ap+a@2>L( ztXX$993?OOcREN-=>x0GG{2&qz$&Q2lHqsiWwcbTi!;j@>uBnO|8~3Do>e4Sj zd9&*j&)?u5o4~f8&X?_5&npm64tSX<$;a?{l_l2Vtw^24Oec&j){&v5+IfylAL-hn zRafSRYfdq2;q4}}!(_6|LRi4%xoUf?4nyPMrg#=z50_6clfDMW4NfUE&~SiIcV`2ihHQNRlhbv z=%mmt;m;$3&Aj45u?k4Zk{VPWGXYWTCoaqw8IXNj9&TXIkDqyPM83~&lI$)EeAJy3 z9S(U|cDEmDa0r7op=v11r%qDxW)O|=?F!IvTfHsZ&UH4EdOJ(cP0-F|xxmp?l`x-K z$Iv0@C^5tGKkoig?+qg?tM{2|7_qed*qg;z_bNY}QwlTd{Ie{T=vwPq{)b;lbBqsY zv(#bHaKV8mGUtQBuyD;^trPaMf!MGyRo}UtCGU1&n32sP6+DEDeh|6jtcpq8A5L7l z4rTw&!wI)Bh4}{7{*g(B$9d8)n!U}lf^4UpD0oFzY)3io_eR_@I^U&NyoeIJl~%8 z%r*9Y@qC{2s(28Lfko|b55<*t9=j6t)$ z`)+*>UonX3iYN!gAdi@G0=%gG?!k4hme3l=sgZqaj4Vq`54}E`sdPlj9xD2?+KM)) zLM*ify~5={+ic3CJc`?cU3j=y=ZFEJR9X85i0ztPGIQae&d5NytDmqgDb>-(I;v}8a8UCs7aIyU&1Jo__}RjSH43O=8=<>h2-k$ zUF2;AX5D#Kq+$xI+h{ZiX6N7c(|gUDAi&c)Y1gqjZho_^u@1I0;SF`aCvA*FKIh${j!R>Q<3mTfeeqYW`@=7#MjZGhil+;ulbt zB(A46pdO$vvTwnE+6RXg0J&+z`5nvGQIJ^hX{35W0BoGFzwUWNVB}KjY6X9iU$|vTPilWd%ifGYdcyAYs_0G*gbFW*7xmSO)cG| zj3SeZETe3F9o;C4*2h{6c6HT{%rfH)u(jpLDJS+xqQP+@GnjfsrsQ4YlhfT&@2!+D zL1a+I7GG@j5ohp$=v;n$HU2;U$vM%3*vsmG4n1vz@C2!eaaeRX0D{ZwLSJ*hoX@V- z!G7DI-{o>b>_1dtv+Sw(VQi z?=)SmWS}plR|vs3#i+jC$GOBtTJ65ZwT`^Ij5LR5z+Z150tUi&iBUKR2z-z>3Mues zBTg6I!JEi|5UK2S#|2NCveU`>pI&~?#1CHK9Qj~On54S45K57)tY8QjL@H5cm}o;E z_+VJ;K*H0!H+h3)nK|M7_+(3}GiTE(;pzJ2Y(bg%bHUg9jh!8=(ls*uLF8;K3OeOh zL+7zOblGA*DUjrnFDHT4DrpiTEeCMiTdZ{>TIM{2zw3Fxq5V50CKmKn)XzQx7FGK7 zADVmE88z(#YDwL7ym)My&J4H<>D_p_+?ET|cbNaNCJ~Ligc381;4bQs!QGBnb;PL@CL~)}_LF22#4FSYA zC6ht|aP4I7%*~of98*xOe8ia&L&?g0((5Yje(u~!gok_=q{ZX$ni;W|R9|=)cP{eg za_`-9^=7G#H`M6G1e2ftyd5y?1Co;nM#0DmSL=#xQzowuRJvQ^d8k*0V%MkfUoeRI zCRhfoUwM`1E49B~VlfXwOpAo$C?@C@na6!cAMa3ii3(RQMy?V_-VT+wzU?Cqoc{6j z>$eqS+#Ni#tes)EgySb0AsHnYMUAC4INc7+-GMr*shohf=R>1!z{f-2^>?5coI6IT zLJD+SL@%euGDVAu0)9T@oXq+A+Ns+qPuptafY{Mv?R z^!7W#sngl|9KlaFT-jQIijNZSfFj-`a1fgd=t^Hn%NE7jK;;bGN>V0GUmGaRFs|P$ zRHJyWEt2X2dCr`pt*;EEtWlqzxqkWB7#NXNCxoX2^>fKTg;79<2FYvRRA*4I|NiH~ z9RzJ^i1ZltEQ3cWu|$9VmvQI(i(o1VikFxijBWgN>116`!9ukj>Kuj}3`u{5Y?}0G zHHHMlJb%IvBTeSuE!#1!h;&c4z`u2LhRsDu+x2OHDY* zZUt6JxJq{<%G4($jE+jenj$qvN9EOCl+XA&f0PtJS~$Ye+VBCFo2C96dJ8+6&s={d zE8A;s6wkJxrtgDc#JmAVy9=lJNsy$Vz>)N%VN!G?W4S?eM zR_nQ3rb^JdGD`HR>yt;Hr%9vk5_J8EhfFeGo$Nd@kV^M>P%B}Y-|9SEa;PW2Vxh{Q z!2&V2@e;A!>w~x6xlgRmAiU>pu2hbVutlYzuNMD)wvP{(O@|j?Z0E8zM>65De{pkA z``H&oS&u44t+u*W7T+ixpe%L4l_hQUW%K1b;HoB_Pn8&>4_ACPm7-rl`*SLm*n9n!J$-6KJ>|vFb|!Vwkz&AV zr1xPyvWr(+{))Q!i7LY&SFI5njV)BW0LS_qI9U?96GHCxC#LtyG7Sjl(#yhPw64oz zSYy|0d=`FRUXC}@%DFDr{vfR_7DdkMA+0BOjYh!W0Oz&>yslNXulR#sldUt)xpOK|4)WZvRr8I&5w-aP zv^lF@vrKf>-Btt#B(xDW_=IWWrP5qXJbZbu&&&}D+GPt>>!%)5YSRID71t}ohh3i1 z_$=UV$dt$HaQ9l;%}DAQR4UH{Jt`c17E#Bf9A>L)u=O4EFyh`|!e@E;$0uA_ zcGKlkv{s$NQiDA^jGkf*{n5E#ak|#=HI5oujcmAm8sw^GN?;14w$Pq_4T&gAx=arX z1>*PFpzH1Bh^F0EC{t|z30kV4i~sS{@96WV4elH<=)7aK$f(!h9w=!*g){cNQlBAD z339k-ohn+ygj}1(u?DP(8~&~FjANWHneV~Rz>rsG9#ZaJIX8&r)=fKgpO@9#S^N0M zUp)8=5ki62d;6FhrtXsy4v^sRrR=wV#gH>8rmlb9F($*imq+p}rP;CSJZMs&rTZeogx3gVu4glze05 zu8F2cLtQvBkddAJV%hnHSEvF;np<5-HzLn*Yu?bb}%APL0q9(Ce#Y=*D$?XuINW)n+ z=PFzP^jLkFx``6Rl7?gtJMfY9XDPpjtfvTIcc0=R@fb$>r`?M};q<~y_{!BUPUd7z zoY8sB3~0D)%Ge)z?&3Vj+})0ZR?!Tx$m$45yLz!y!Hu|g!kz1H&lVmq7%}I%4%g+S zc2+d_<}11_i)P1nTb7U5<0@FA;RlF(C9#g!y6a{EgkCuJW?5v{&_GE-adG^zJxtUR zP?Z;Tb@FtZLvw7l|7+wQT~IceLDi!MI z%4D`_Wt%LHTFoTq%-UB;T8Qiz*8q$CLo=6913VeW0oAlIfgaX$u9XgWY`&TSJ2YHi zv4h&PFk{(QLEtNr;Rn@JKd-?RT|`^Gd76Y9>3Wrnb%5kr8Np9Ad|hqDa0{qd z3vE0SMRKm;4VAN79g)U1tmmh*v#Gl();1EX`c-zvv}frJ2#zYWlneV0_-$$#gr^-M zqOQ6LOx#OPW6)%~UYu5X7$+4Qbwn0~k?;McMw927KcaTmz{X&kV3t+e)U7GJYwo#$ z0d{Aa4ZrQs4}`pP)}8OJ+pklb@w?$xHju!+5$~kI5<}eS{#W^S^^3c7V}ZBFG_|+0 zb)S+XXR4-J+TJE`O(`&GyQPnMCym^HfZ&G^fHOXsGeDv=*2 zhr;JcbE6-f7-Hf~*a&g)3C>S)%@M$s8va15#fAVUBmr=Neu<*; z{jBI==fQ6j;f&-~Wk(iw%)N=Q zRI`!Ul#A!BgyfV6V$I^Ui&Z>Y1zuM1O21kkFdh zd3%_Q(?Sb|>R+cY>W+}D2&+mFjW9K|-Y2a0imdTCu6|ms=!y7r-yGWM822SRy6sm0 zZ%cV2`@LDRA5#JJQ|bVEX?v?KNu;aN9~o@4#LC#<_6_O9)*J4>BN4D=FaW(yi2xG{ z<|3pm&Ix2eOaat$TI0bDFfx7%(S)ClFc@gPkK=>VtAqYZgimiY2C zls?x~A(q5Q6JzCW?qp-~=6ZS8)e#py6Ak|*8x*N4LIq?9pBXlkO-IwKpwyj7#@-kB zPH@B2EE5%~RbxL8{1fsrxxsJgv=JL)4V~Obl$=^ta}qB;eG2a@RlXW&g<6Je2cjrJ zVt0^f%C4j=(^YG4mo%FqWe-wk!ajzwUWRrH9r1Sd7$YmTSaD`{^r4M=PQtkKLP{uAiYcn{)e8oH>>)Ku$Hf+?u?Z8< zbttv#k46WhcG%Tl(NMzWXg70w81?uoiAx(bxi9Ll%^jLudqge0mL0d%33^h0!UdLw z)*H*t%c#fU&D=28$(?RtwZy$%cxon*vx?^7$;^S21R7{W&p5L6t=@{^Zlq3Cq14S1 z6xx!c6PPN)@~XoOlp^N>L=_^P5jikBULP{qVOtXdxs3UpgT78RdeF)U)qYjBqbzYq zWDK_4O2gih|M+XYPcVssVfT}xLC5ZLk`cl)-rNA3w&Ep0c%y;#lzs)hO4o5>c2H^F zO4Ke8R)KkE>1d?UQ3Syl5kGDz8Ib42>u^}KKcO`$Z@eu$Wrsk^Q8=6bh|f>%kTTDSBuh!TtDls+TVKXzdL$y z8K<*4-v>-#~7P{>C;I!0lsjXg1^sOOT z#Pd995{SixN04?D<{Qn^GORJ2##rD2y$!kwo=rjxHO*_TG<|VPSTQS3Am_w~=gL1e z9%l6+z-h3`N%WT(`Xu^sCCqcYTga|mVOea*d;0T$DU7l`G`@iSNIcxJFMAMh3f?F7FD8HW$p4V`YO=Ku_9zM#II~+i7E+HcI-Z0S==Rc4@rd_s< z`;^|x5Y|r$Bx~w+29S?KI3lH!O7|t7bj8uVJ~KUwpDv?ZOa$iIh#14xXTsJ`1S-uz zBqLYmt#Rhs!QN!R-i!yn3X*KHVL_|bl99?s*>{nrBgk1^WmC@$->b66`Z2xVG^(O9#`cu+~EVt|MG4Kvkk)65KdO2OQGD;Cv4+DO>#t^Rx#Nc(M96P zd?A1p-9+hYoJ;rIj;j7n_069O~<5smLg%G=&cGGMhbyHUlR+xvV=o7(aoSReN>2SX2}72M#0Ce zL)?%YxJU6ci+*FqhzGVvC}2<)ZxT=vPHj+2a6bOVq|Cs`?TwU5qhsp@UJ$C>o%7?A zvF5uJQAalP9LZ5a1;XMyG$`u7LTR2j|!kA*x}G6y+zaisi@F zQ~_A6D&<)Xkc5#kIGaf?-*=O$`oR-N38Pw;D#f+8K63r!zyb_pjCuH3N$U*fUv=)q z_j_ACzF+jGb-7soM87ej#D3~9GBc)j=_u9VUa{dgR~vamCQeaxklTZiP>!-Bof!-HN`c za&~xIq$@PND0J$bu+}XKwM2*kbNwC3OD|~>+-Z(8q`F0B8u_r#ym*S)m^6@#nvMb? z2W!#+X$CyQG^V}cB)45(vF_seFE^Upw}(JkN=u>iZ#h8B(-6@2fK(OHSeW?^Y%`FK z01r>PknJQ(8sG&DN9xZ)Jwl3CvgKas$8hmnUK|bD@(vR_~7X)8cR{ebL_ zU@*w2{+l}RrdPQ-UdVp_+4QBXw0-lMc*l()ajV$lvsb?3aT!2TaG@$&*oJNX(C^|z zocjkS(jVYye4%#^8x|IO#4!)u6~esgI<}dcrgoCP*+osL?{|KJc7%>ntQ-CW=et#Z zt1Tan?@Kwi221CEeDd0Iobh@43l7ZB1=7>mP(cO0~Wr(+}#>}5lko~7$ z<6@8+qB?X-QV)graFEeGy%G{4`~*VVi}5Aj`Z8_NDZgGx{Q!wdZhoeR}Z4;%W-mJ}mtZE#sj9%Hksr&_W`CCK;50 zzjj8)HZr8>bPcB|v6A{+PGYOBW(d^OUC~nzDvcL#tBzzNwInv`8{oz&-qAr)ifuvD zsghyfi9Iz0+P>h+bZQcp88_M^Km213Qee)_tfBQ34j0jlbnGgtEf@AZ#aUz1OQm6N z3@aDy1Bz)Kw>Q80Qalz~Pq&V4?1d;WC0gaBdT_ILTnmI}&WShhTa{1sqX6{x(rX<$ zA`ekQ4_T@MgROj=60Zxpp8oaaqL?7&GQi#c2DoQnAJsYzzc*EY=a6X0y3fi$SD)t4FaP-|O)gqFFjl zdL4R<3U2eC?nKOKVNlPupscxms$^y`ccaCu12uk{jYbyi=7wO-C33@&d?`rDhmryg ziWOZZLEx?;XCdANw6UuK=Xdw@Sy>(l@QQAT@sXzj-K+S&cz@Q#fX<@)km+l=yzJy0 zhj6qsOqGB)e5i z^n45MEWJzYUuYnIF`?Y4D*dxn66Vf6cRtL*xHQf$CKJ3uUpNh5=r=n`usT6DBX6@m z7Q&)&)}qm@sjTA8Z|$AcqidV3?@?q=Dp@yh{=!Nh_-)p53iHU|URg;)`U*qHbIX8f?W3?Al6} zA_Doo__K@HEmTbBU^tuemjv!E-wG>{vLxjA>D*^s^@%L(RfcNh%EJ8Df-Jy z&QHGd$voCG5om-tQFiBS;t%1w1GF6+BX01gKD-f*nr=|;K*5{~Y5XG;`-$QVBx6r& zFkcq_PymT&ZPTnSQ zzmTWpGgJt1?0ixoF7kS){2^EgPm#Bt%Tq3Z)uIClDHDDmZom^hO%(=c>CH@mbX_Gv z_L)xMCjFEX=ow)fA?pnBqo?QFng3@-LPhG(BjO-l`PRYDk)L}&b8_U&KueY6N1eqx z*tz?nrMrl9uUB@&4zMf_N`x$DWbH|npzX^_e{0te-HyuG7#fqmga3I>x5-UBo>blP z*yBqn7!@=v53=S%s_Q44oP4VlLRu_$Xjy~Nt!2v~+cupfR20+NJ_}~1;Cq%s2M03!)dJ1a48Q_K+jFhNAFe20ML zp89;L1Op;Bwf85Ch;(I&G2_qBqhugP?Ty1`CijI6&|auc3unm-?M_YDH2d^Rp8a9V zn*@2p%uq zsa3xH`naZL1SjBDKn5CSBST#>R1_uN?27E(-yHi*0{X+o1DvY7q81chWw{xFubLjg z#zoXZI=A(gC+q(l6}L#3HO=%>s-Ib7OCOe01y+xPSl0 z0w$K*qyQrHsjI&4rg#m{l?gT&in|0Ijcs+1AmU!D{1Q1!eZ^H#u1Z$M>wlISf1RpkMZDS`5OD z)vU)Ww~2L*_HtBXAfEbFN5a9@xEwRE`X;mb7r~+sc%m_X{IYAto-Jl5S!!h66}t%S zMT3)UA{C?PS~LmuV7*!Rt$$9IPAqJ#JRyvJh$BOA78`U}XqU?k>3cUI^$iCo0=Pq$ z_$cK7#2vI>4Vmh}fh#;lt(O_>SndH7j$g9d_&z&*pIsFV&id53O535aG}i@Wq)!V8 zOFYlN@jyobeh-ayD0*|aRVH6-K-(~Zczw@d{<{k6p1kfD!ipSbRJ09aJ!+J$TG%7= z4N4=$vq2GNW+~?sLRNnt)t_sBc|_&r`Nf;jXpY_E@!^S2&?$XX>3Z{qqi;zXcOo&{j9Oq_hvbt0(}TTW`mioDcuvX5}Yl$^W409_mP#2j`r|Ktr;~EY0Lf zCjk!jG;!@HFpPx7CuTB#P)(MOmfs3`AX^uro=I}pwx-Th&qtU&D5O`dOs_3?Rn4C( zmE6k+tvo5N@iHp2pz)2}bop>(*14#3`O(C!dAhr&87c>!EAk8Q+}Lhegp)7&2j@{F zXVwUW%)m@|g9NeOOi{|VHL-`Ojv%F}SHMD=Z7Hq5w5B>1vA z^;HyF)6)JX6X+P-6DbrA+9aEJ%J^bTqi~FBY$fs2UzS`{%(5*&&A0c&*T2`&{WLY9RL(d{FInP7pySC6kx%%4gw?bQzo2x(4V|KMR?)#NQudAB&&l zV=K!$UTIYf4}OCx?P~ve$aBy#(Gxs#p6Cj%@6wzosqn4O?AJ1nk6r%*YkE-Y19j$i z>=^H*s=BM@YF}2e^3f%nKlAleX!RkyQ64bY8=4tyXp``dyoQsfs@yGgeoBIgxWa#{ zHfW5FJYA?VWa7j4e9Kl@xR5tyt|4rcB2mm1% z=mUTS&guM%fN>}G7Bb!T!RV5PVlpYD`U_prjko5m3uAsC1KocJ7%V0|gSDYu=`~Vw z`*oVT@RRa(av8{`a^3KHvULoHRXNAj5>aSB)%A6tsQsaobF7TI6qFZF{h`p|5eLEb z2zlA8za^nEo`M{Dw&WbLe?uAp*W(@*A*&wa>rHKl@f6%_4kXi>rIGcPRJ%u`LtwF( zBcTSMexDPqJpL#i_>lG65orCv#N%tfCOyH1PckMGO=fmYoDj!>JWH*R#)eVHkpK(iIvn(c6p zt}#W_TKdCHQ=SZ##g&g4crK(BSAH0=OFt~?eMZ0G9(t!SUGI`*D>6j!|J0Bqo~O>H z1u3%U+jE@~9W;f4-dJf2gdHo^y^x4vus-|}4LaZparPrNL6A$i(Odm2l=P0hpz7Q<+(31>f@Dr^nSk~B|_ zTMhuvy%h+aJ0uAqRyu?yY-3gF)Ji!Iaiup#8r^FQK6D{=7F{@j0l9vz6d039CR5*g z&x$GUAlQ1V2O<$#(xxH*>E@h(`j}!19ebVdQMhb$-~Z13qYaX+_eNk#Gir08R+8E4BLLKjF;Zq-$i-@Bhn31UKEBKfK64G; zY~Q*W-S6*LVNkAfKVgkeInTgSINv}pv|+@uqLdACq-vSW(d4VddTwmEzHj+2Q_UGG z`c7^^m#ktRhb)(rNN6O|GJrRv$gshjPiG}y+}KbbKI`i8b{bYmV-$2m{Hk0%5ztTC z)0r-1-U1Jlk;fc#B&PPjk|2Ve;!;3Q1D^E+!(^LC{~CKJa3Qc!N6VS|LXqD;6WdX5iMq ze0e>`o@Q)LqVWkwS2Rkvd;4kSRIz5x(o7E`qCM9>>OH{CLLbvjn2&RZ8$IU)uF4!e z&zDD?B2W9=%OGM#m`G9WA(Dmu)HgdQ{)LR2;XwV-O9UDI$nUjrFI&(y$)HcxmTQgK zSl9ELwoA|YP@pN5&TF;i>U7G5$9X|Adp-AS)JrCDAM!C?B9)bt-ggag+q$}! zDz1N|DD_X!?&&l;i)^FtTym*zvpHjangDb-6HUF@Jx|0iF{8zf=pw7| z>s3E6S`p~($vND?w5@jt`VQ2}7|XLxn)bxuuN3(`h}j2UU$Z!pApsf<9!L}xfHRMXPkQ0PC&uYVtR3!nJtZD**J|8 zf|S2p^)0~pe5ATzjic|5W5JzUPmOncG9j9W;b)5#<@WVR$eM3d|Kd=^9tU6l`#TGp zCVxvA!6kM&)(MJFf=*Yrp=3CW@krSw5DA#-9~eoZ-J=Un$VlBi$wmCQd@my^zU2gkj^~pn3~U@#7UmfzLCpCN6zKPzc18Tjf!qu=*(g=` zknBWtS~PGy`*1xw-CzGJAQa&RZMnftVA%|F@F2U9Y^P$gg@N2pf67MH-VR>7IF>H% zmgVRGn)(8EvzNE8c{qDys&!Xn>l6cAEz5Hagv zL&6U)RmSBwk^K0)$>=PLkb zd}#ly5Q|`)aJyWivncDY*naVhWbTU)&_fBLsH21me9&*!Ob0)od8gfVNA*`d4%r<} z8&`szGJOAx4tG?Sl_@Pa*z>$WZ^p5FS5!ADd(#sTb#;9vZLA2 zX)*|mA!&1)qK=&Nc>HsFb@}@IaC2lJo5rzcAXALX_FCbNlp&DGL@uzO;COYy$Gu*6 zy#ilkf`02K<~N%IgF#JOFMVeF0q(kCN0DN4^&toUp{E-yLay+iUJkdO4gW0(d5z(D~3?7x6N3|Kk^fKKuc zQ21YA>+rvY3Ba)_?^AV%0wex4!h8yV6JQtpS4SCO^YyP`l>v@1;PO;}JitE|{E!M@ zqyLXRe)kaQ|Gf+lv2g$hb0@RUu1?NwEGEv*e{Zeie+aRhQ3q3*piZP_zc)KeXKp=N znkifZFdMy?+HEZ>fHa-cj&pTJUK_vTE51`^VhspbFX1MvF|K!|Z#Y03OIb%S9jPMa z@X9O&;Vj+(;<_098_1{3^#6cKcXcZQjec5^v|KRcx3d^^W4(&-eli0_DnmvuH&?2; zgU`9f(v`VwIBfoSshO9tTk*nG;7{F-amhr^zaStcF&`f%I!n}W1aYtld_slI$f9=M zTJjmig9ZBqyS{=wWpy=1&aa&Zkw1T4NbY4D%mN`tcPZEz?+|+$xB}H)!^5spTxrNl za_CeY(pP&xr|*Q-vE!G3XHElyoizM;48vyPhT+4UrEu8aO_r(dB^sFK+uQ2RSXzQc zF9&2gL?v*IUlJ!GckZMvrVdVndC{hb-wz^l!VS8BNj~C^n%(CMd%pM2b=aiHGz!bs z^^{%+iX^2*{i*P%eECVUz*4B~SWGyNRvEs*hYyqK1!58o#Hq)Jp@K$QM|`FQzU}TT zbiE8b9TYhEr)?iA%D`DjXULSlOOm5S3V&yeShe0QfLdjHvY$KkhQ>)GS)xsJm^lwG zg!0K>WU}~qtN5%R56(7ABY}zzp`ox`cZK$jw^LX!gmk`XI;+0KSTtC|1>6koQ*?Wh zEV`!r7EJ{kzI0YlFl}5-=R)j|Im>*NVMajs%LD8)k2)f#(9Hfc7id~U7xyLDxq_Qi zF(iKC)vmqG5#;BxXBD4Xtv%#~H(`#!7yWyZlp#%*a&VYBs-LvFZR zcqM#=2K@K&$I+!lDusSK{>h1m_~0qWd|qsSBbyhfKZ*|TND*z>g8|F(CnfS6C#PzA zfodJFV}vsWW&0Zk88FL=(&hG6%BE(IuDk~i`fe{iTDSx6l2P&I#we{8Ikmq;$7rE* zTprQaQWs6p>RL2l;CxO0S-~dqQ{>sD3+KXxsXreIpuxf6R%lC-M?J11_Z7^cQjes` zEuO00t1O&blp15HFp)-&Y;Ja(mvk|*N^y6AjZ(XGo+3r=0MaZKiZqAS5bYlJS-Y~f z@I}&>+cVSCE2Xsy)V>TZKR}!19GUI*E(t9-0-B#i+8t9q3EsU!iCybPOpP*XaX%i_s;8(ifPOT(;yMw+zPdmJnMT6@bl6WXTZwNU$`nmyPGtd^Rn{gABc z!o*rs2joT|#qBxA%)kwTSE6xDuJT7s_1dr!?7Q>aBP}5w5%^;%<{t3YK+^My>u_#O zk5Mj;ZpMTAn!ehX_mzy6)DO#n-UYN${$iXZsoNx}^l8j?DNzl9;?hXFJhb`I-wdXX zC*L1U@9^J~>=%|!d?2(wI|F}2uYm+OP1;eRwsc1_nyg?FU_qSL3f;-oIEq!!0OB2Cl8u8iZ-f`}UI($b^GK&i> z2IA+g;UiLc&2YKS%Zj;N?@{q|X_v99kPw$Ayhhu)))E)aO zQSZpFNT_a^#}O!jWf%0`{qlD`+lfEjhQ>)uBTZ1+g*x?3RQ)B^NN>d&v-cr82_`_# z8Pg25*;FSB*$>gzOcT|=TPK!HK`><#e^ywR@h~PgO7qv+3M~m+i$cmQGzaxWgRQ9? z{_&IGBtmN{H1#B`r2+bW`sFBMt17XnHvL`R(f$6<^7VE-@DKP_47E?@AXl?X$mkyM z@^W&FE_LRl;Dy$HA*3<@+SnG4$M)#8QW(0Yog^@+!5fJ0jx>;qN!yo z)#`dUBDW38S|lat)xsBunD2+K~uC}=Ev z0_b*P?e6hxba=m9e?EBi`SSyhCHocm!<0nEqVgRx z^ASZgiJ;t6` zqnS3@4!{*Z!)5^J*ZNe*N}9vdLao|gT;kcfoX3TFqV_hY=)D2(DSB=z0njar9Cd(OwZq`G3r!PM<8rkqw(9i|u8x!xM9EwD`JHT=Fyh zs5D~tyY%3q{0}AI281hij3X`al5vPclh1{=E@ck^LK_ zsoPEX%wvyRHF-v_ZedKpAQ-J8b(qK(3o4?n4yBe(;syJlD2CB1NqdWh?A(dN!|GH` zYZ5T#_j9W3cfr|yzl|pkN-ZvfuR;*&M#x-X=b`Nf%es^zL)qmPxZ3G1BIOy(e-0&` zZMk)HrFzfvM%6AB-@|k`hMlVSn7S)__gfxVY$AqTpl|=MNs+;FPYM3ipmbytTGwB{IP8MSjj7YVQE0WnVvatCMXqbbE{@PO z*Wfv9!O_N4_|g;&A4TW9V}$8`^0Cc9*Sv1Q=>~Pyvs4oqmb>0;1%x$@V^k-p0au0{ zx7(N;96|5TUb`BWnp2&SGggB4n{r(`gZ&eNi%Lv#JLq(UivGMiJ9%WJHM6oEA4&vs zR+1oAb6v8bWMrqaGgSHo}$LX2L(0vx>TRt*BG9adrZr36++38_Lwf9h)x1#+@YAY78YzJ~t!LU(Qs`j-4mHk7=$}v6nnQ4(nx6()c*6^Jyk~C7w;Id ze!@!8PhN^tL?kfjV4bUEm@g1_N|EEY~LiS;Zo)6@}~*}`F16@__e05p)*)c?bjiz;Omk(f&QWz z&LAhWiBYQ+zXz10K@3GqEk=P8OT^XmX?7u;fo3&fqXWoC%P8v0R%ZEn^_Mh8j4UIM z&Pffv{fI#yt{yDWuNioni<*-0BOb&JV;rH2K=pAf`r2WZqBHbPjTF4@Z zFJJZBQRZ6b*${=*cWK5yoIJH{vrm|5B}o~nI*;TZ+*-sAV$^MDKhjQ1$dR%hlvEEjU&$PxTgK; zr3_Wv1TUUOFdQ)z`DNe48B(`|>hH+GuXkjPjx397scaDd@g)?eEIZuLMb}ZvMyoax zBu`rhN)O`<)Y@2+hPsyoY)Z5~y2KQQRSHJ)dlu59j0l5wDZ1RVf4J~gPXria%v)QQ zXdMo90dw3LlUR*Yv;8Gp5g`7v@=ug3u}y8BR)HXQgUh7OA^{pV@zHl!q}`}sI(b?A z?x9XDC&>(qKH^pg`hiX5m->=ffj!ZWq`yHm-pUVhI02&qk0pYQKMxa;&im7LZA!zq zhl1RdTZcYjf2oLXvCnKeOeM_Ec~VrM!g~y;7Fd-Nh5?}g?`XG&QAm&@S}aFhX{QI8(|p^2~?^w4L(Kc1<4%?^d5lc%7j4bqD39O$jj)Kt)_1aT@nMQ6{) z=fPQyn_iV!A-F>`(KE4{>UZkC2|K`Px^xV$7ev2mBjaW+RRJAYFEtB%;$)WZCWuie zqr}xbf-m@$gT%cLrq3dbwnr2%0*VyNoTgy9J88LjFOBT!kf^5Rb1PZ!6pt$6Bg#6# z$9IFHiGx;)^AZ^eizU7+wq6y$i%!Uvo(MmT`=10v-Ln>F{pTXbK%GV!D)9}3iTEJJ z{2eAz*&nuT?@nJ@(zj+Fkjw8B2L?;3pH$k>$oq<~tu|PvW;c3uZB^)Pg zuMI=C5~pU)vXLf<-EszJ&e@~B=klWG8?zVI8*>XO1(Qc@&$-uiC`Oz23;FB}A<1E1 z_x(&(!i@t_xA0qgC|e)HCiXl@VD09@@IABbb-$hS*M9}25W8?7GT8s*=J&>1WBFUq zj{R>Xur_hEFjsSTwQ;oiTNnHi#1#8jF{Ex~S9>#X7_Zu(?ZN*Jj?njxCUQbQHXik997+9tb`kb!la zR%EdPjErBQA*=}zA9MuWDK136ZTA{yMPXX)n{4QsgSOj-Ei;%_MvPw`)vv|m8t_+K zfc8Z9V$_eco(tC=T60G^XYBi{$|^;IB<(My2mGAzK1utdwU3Vxm-9Uy@^TlUtl2ZQ z?RkZdmrEkAfB1=iFp%$Rh?)KdB!WALewcYtS+LnQk9tdSsAgXT?@u;wl2c$A{;11B za7FItm`4+=UeJ`(mk9KO3W_Oc&0-PslUQ85UghRyPh#_#e=}?e*zZ+sX_tOaRk3TVyM;=qbd$={jJ|n8FDl48p4WUo0 ze*}?Ce0p%nLeh;}TRgMZne?HD?g;oai58=8QXgQYK7yL>E766w>9{iIHHS5UXy%4x zMB(HKrzO$+%v(Ewl36&5Kw=K2C(uCmx?`C3_PEK2*%w^WN0M=l5_cXU7gmy@W09p} zi2`(98Z-d!(E@N|HsTCM@DIh2mIF_EV3~zmCn`yQEHa5yMdemWT;OK}nW-*9WWTq^ zf1;$&9AQ{(^QEgPY{9-`$@_d;lX3A5<;1%tyH!`CEMUQm2VPC0{@pJySDOAr^=$Hy zeh5|%HY-shESI06{D>;20{X6;G?kT&Yc_k4;Ut<(f9QT!$K@P;)5Q9PWb<_!al*`z zfz=r<@*2_dK6gTcx~Ov_dhXJ0+$y#^RDkjEi@>PfM_bpFS$^874=y@Kk)T5CRJPw7 z;Tq9Kz_c)KXw}*qap?>2vBsDVgZFiEKC$@Yq|e?MPun;+j3G6eR5{oRLt>>2R#3K( zib!&7$nvK&s6H^0f`bd}x@$8Bm`$_I`wSbqCq<`HFBUTQv7oZhe^$udeJ<| zut;~NOFpq7MkTRggUoJNWOFozoxZe|edi8&U{6x{o0xImLJ2!KmyIoPbCUvQHp^>I zutD`(SU0SQVi?@#_vGA|R(|NTff%q%@iI29&Bdeol(Q{>dW_23O_TK**a_`SgG$;j zz1@mMG{W??wqY-kfq!-)#iaqt(=9HY(c=8)bSFOBQ{(A%GMWDQD0!lN67i0uhj`b+ zBR3UUwX0Co@7=$EMPjB#qXkvgZ3lrk(%-%a8T%smWZ>*ke|6*C%0(I|jU<=@vCJsJ zB|Q}NE$*m{t3+nKZ|eOiKP)1#W|EURsll# zkaE?n82n}lE6E}SN^pC-Jni9OEJYVNNjahU6`=VoMVoB^@^A~2c7&50&<_gG50*Wf z*>O(kh``$82pNXNaVts=so{^^wdRBbPE<2PS`6vZO*+G~Ep=Zizr>sgQ4)5$q-$~q z?C@7QKP`)c8%1Nv&On3mg=4&sfzz0f0xyKa64vwG3fRo?mzeL)n^G#pb6MBx4gBk@ zwh9}eVn+%hX|R0(i>UdB)mbZj$!BO;S!Qld4HGl*b`RxZ2_jo*MK8L2&a4g!5m`2N z)7KA`>$@Eb@o>qsnF_C}XcCn=t%mK$?i~Xp^BCe_zIyM55R9Ti0LW3yaK!BWFP&f2u~t9Qk@87HVS?9=XIpw%z4txJ*SZ=ng&UmAgY_dIsmyAt|_z z#U>F6PV+a5v=;oN7ioPpj!T|_nfpERZ905RLGRd-$J4;rvE1HNWTIxjh-37pW=G()M z3zvNPS{g($i9k9H5QW#x=`MUo9EmvYfS)6H<(+R|kO)GXftyR2%r>bbrwZA&r70`y zH#d+u93EYTx<%5JYdt3zblTK#(j)l;?zTztl(}{IVa&ssisE%=8!wR>|7m87o2~3a zrn7p9J(P?0LR39@(5_@xs5y+DcoEL1aAhT>SQ0p2sz-#IKSe74H z?q(l;V%azWU-59T0cHOiS`kdVJnV9wTS0qi4~zU@kHVv1@&tE}kf%cEd({#@)JfOG z{RQl&qNq=F)sJMc)og3ugc{@r%Op|n+?X@?sXhX=D^|VHrkc_HMA~a03jLuG{Kw#T zG{i)n+t1a%`q63l^n~7(J%QyL(Breg4?5DYT)4`&s)`>iUCuVmA4>STjghXp)$!-F zW{T9;RWnx9RDcnpZuDh}+VF9@jq!fZ$+(XuO1d)Lk+A#%uq-m&hk~UqhhaI!B>syf z_dgyq)O@-R_y!I%$$J&-s!t`?<~3lWeanmlz>}sWJNKJQ5ssQRxW89OZ0?!CR@Bty zXbW<>xN0SZZOkNQ zT|1%LB_ly6t0s`1s@cU3mK5j(lj0lA)$8uO>g!DV-7CvYd%dSBGh!uH(<(pe`&e>} z7|?-X!(3ew8a-c#)Lcm$)Yj@&f|@68@QPH|Pv2pY0ii#1TRv+;OZCXPF@XOaFbA$+ z)%@Vg-xbEJFPaz~P-@*fI3LDLSn0o77D!($^7#HgpzN{E7&+26o9 zMVvmkY?I;hg32+4OTemZWhC==da3ue7r`<6-xl@dWst%mHaR_n87%UdW%HS%U^Nf4xdt~ofB^o4@YwS zMry7yvb8T|p?aY^-2PBebPtet6t1wU($e_7ak98)Y-{aV*8zq~-r1HHX`Mi&h5889 zH>Ee(cTkX5AvtrkB{*DyS;1&YW%dAjl3@9f@M?~K(o9>g6En=_GrVvl$B{#M^XD*| zxVC-b$m4>Z-Vc6&@o)iKwHesEpxQ^ZA3{Yjyz*%Lv}_-I+$Ixwbm{nwudEo=30V-0 z^TvBh-QN&`?FHD3ISubQ^0TTh8cMj8Xxl=Tpdf7}0#GqAaa@SQ{+Oplv;zf($Yg~( zkh4hd&{WLLV~SSYP+3*zoyAvZe@&Jv$BkTH6~o-;d@f?zMa{%9f_!q1s;~xm{hiSi z_OcQ#%A*xK>e=*y{=55FYcZ}%6)A7fBJ8hqF`T@Ej3F?UhBOTb&2d9AmA|V=?709fMn!JD;V~9~%_X>?ecAYsS{9t5WtIoYNspklXlM z^YAAEFFTP+IZALPtf7FNz1ybRz~}w^m8csg-bYP6zgS|pd^MUM9fwMeSsxFS@x4fc zLw}JHv?#`5N?dH`uczZBOp6;^geC3~*ON(QU`8uhvN>!+g#i(%r8nxmh4?d@(m&+t^9@Q?j@BnA+9Ub*r?=`Y?!`uXAki{4xuQkUK1t z_>e4j*3G6b5CH)?d;K z%q(3w;r%q}C()9z&kh1|q$bF`f70(ATaPR@3c|WtP6aP?(%z#o*{8-~-@KXX(WiaX zgyP3gM1IhVcX6;B23wPGtb}AM?m+E_ai&BZGvBWpQKB&{=K9 zIbXV;Gpk^-Qcmiy$QM&$kdM$1?bXi(bsYlXPrq5%>5YFVAKFjYKZMPij*{AwH1-m` z+kQNTIqt?jd(SFLvD-;;J};1QIKbzD89a8_AaxTXwMfL+&TE^v@u=WQ26xRK&zO_D z-%GW;Y0p#XnQem1eNXTq(8N6=vQmB82#%IYclWD-9peW5tbd#; z^U#v%=USR(&b|i;YNjx*iP?ZqbI;0qm6sF+0z9wj{Fh=@l@UfFi`PJ>k~^>&mDG*^ zLqG@>NvMUFHrRk$WT-3`T>rI5Esdx#$;rTGgnAau+4bs5if&rp;CSgw>aR zyi*NKWDhYsm98l2lyR$&pa41ERxh?+&n;Y*8&3ADN|6ZgNRnqL-(7gWBc;$EF0|ZU zRUZorvBwpW-nmiAcm&QJbFD?!xHpZ{KLi2Ey*P%My_f=u^LCz~%4zFcbW59|syxtQ4!uLzsgYThQK!N_LzuOmZk zM^cl1ro~s0tb~=3CnTlfQq8rN!xoU7ec*Z4l)N1^7zP%Yf0mKPj+Xxh&rAL7dz;I0 z9pYpin{F-?m5SXQCs-6KOQW!h6>hIlbE`djToA5t#b?Y=X>gOfXLBAu^phbLj$KPg zj0-&iO@e`2)8l(on)U`NTc_q7E4)oBt0&QV&^K?+BsQV~@=VbKyMfIJ+H9;5=ci-n zr{mb14;2XCfbhxAKx8R4xUXC$i?paJ*2bXOiS!*Ar)@~{1-SPPijGPpXhs1aT^v)< zL}xBEk7nGoHx=2JI}|}%%T@kHq0Tj!w9+*=TL%|vMgI407`zl)cz{NXkOU2|DROpL z&7>q3U*x{X{wFm3aZ9nx$xFA4;hWg40bBT^I@^uDnaROL*mq7$V})NEX;(eZRrn&E zvbE2jFW+|5;@?}!IV6V^$ciF5RUS&z1BEH3d&?{+Sy;=2mWY4;fHt`X-pFL0+@&no z368~W)W-P`T!7)mkn`$*X{os<#E^7JnL`*Fro%DP>+Ryj50uU6kRtGpJ!5i8y^faT z7yLVyj+8G4<2?D6ODBQZFYu$cn;qPuDK+AGC7;U6nm%z)glhMD z+J1#qzwY+Jf^q)=TbUvoK)W&4zq5T`!hZobFP9G@R1lXJMOFiKGX45Va%3zWb*aD5 z!9ghR3zW&h%MrnWH}k53J%@okkze-RIEdk!3f^`!^_^^)!7pzaEL~#su;6S zGU~~qJa+FZ+L5p{9p0|>pQt|y%q9cZ?XvPnc9}L$FczK@_gznXUpbhorv0DM+1@n1 zV|WYTr2bT!@~yZWXQO5p9HQ;{BYeZ+vaM}>oRT!(OF z58|1_+UKwfT@1Q?NYMEo3P)^rc(MG*yFDp6)#xM&a5ULt7G&IUjO>h)!4uI zNY1W^*ZT{6_j%Z#5#7v|grNz)k-**t8`Gu&kqIbAIf+ynlpSB#wBBvUk~M2}#!nu^ zP6?|^0@4Xh;j@X-^_Rsd68lt+V6#_HLXC($R~`6ZfKcEO+Tf|mDTIh!{cdu$nW}~x zbACYQjb&FNIu*>2OP5W5ZS?yuzSX~MSREZm_M_6Z0;BxTF$T>cIR%DV4faV6Emhi) zk3R!zK^Mq9--_gsO0K0FrUqZwKXm1zrbpu%+ZFFeO3BCHfz|PdmtFMv&Z`xF!Uc6QP-n`#4PCq=#_eOQP>0HWyYa)R(>uScQC9Gsg^oz3$V=4@XH4@w)_{|o_9ay5*^mYe zAP3+-%N9?}6(1fpCCDNFb*d@`Ax;cY??aT#hoK+*q!IKLP{s^Vm|`5M_G}=5>q$k8 z4atJ3!)(JZbGDp9xZ{G7iJwt-hHl;4Za?M`{L;<8uXR5qi`BQAZ=Gg{%$B|#ZQ2Lx zc^~4?KSv$oSZc#7WB%fj=0R$@-y3JXuAKH5z_z?(f^EZDyp2zx$tEb^v!QGp@bv8r zLTj}w1Ogyb1q5!|-!3Mr;uy&|IP_N*mN$q^sj{ z5mip+m0+&vBOKdVI|__JG6#o_Y&nA?R)c4W$9Cr4nnq&qB}*vxu?wOO9pY|sCPe-* zLiWmfXu+%)9r82K2(Y#0(3G+XcUxp-j9~~Vj9mIglwu;s8xs`iS#ofcv9LGKW5oMh z%PE6`pe{xVdsRau5_z(g+hTo5z!!uMBlj?2?&qz6g3kA_*i{;#PY6D{=Mb!s#p}dS z+tKTQxjJ)ILZ@hVo{5S<%gSFQlvcC9Ji9B?xw*HG9V@u{;&j!yrs2afxds+LRJhF+ zq&m*VJ18tSBinQzxQLa++>k!YsefJIUg2ndMX(cVQ-wyjEOtHs zyIQLBhQOCea|;MN&qk%K!7wz5$f&!2>qWPavH-_jG;ger$bC*}LAOA_&s$74kV+!T z{@y3zV!Mhvi4XkB`Kf~7)%;VB9MR8Om_Zmfl;$2~bV+wLJy%i%>f!=j!E{z$7cxs>J&wM*A^Pk4|1 zuQ%IDpm+ZD?ait*7sLU{puh@FZ}s=^Gw2%(_&M7PD0_?*b3nyTwfFFC&ISU{;}2HhZArzDSK3Y|IaodV7)tLSYvHhh1@ zsO1yD^r!z2#8|ytnujmo$p5lYWWg##BJ^Rx0XYA=$svoY=U3`OZw5ZCdZtidZ8r4W z5+qrycz3l3>wtLNuEB4q?xJ~A8uo?QjTzMSN2SPM9iboDq zXR10Y(&JvFDY1r4J}B@_6B~i)0+!4(ML%8{W_rrU@LJwbw==<}oGV|}g3akg9(=JR z=P2)*+p>z+H z&&Wbe5zg>2PM{XXGJjOe(S~LlIW@7h;(M6|o~8NCcz!As5;jLr_j-6O%y za2Q3i5qM~DAC&%Yk|;UA>* zzYC3u_}4<;z!NN_5(30v_>Y-=izzVw|04hXPW=o7m^+y%yE-|$v6wlzTKs)hB>!VQ q-k=!9e+|Ho`#%FroSpwlN+^S1-$*|I!27q4)LW?ZE8*=qfd2>Unil{7 diff --git a/tests/test_backend_msexcel.py b/tests/test_backend_msexcel.py index 6dd73425..25004c7a 100644 --- a/tests/test_backend_msexcel.py +++ b/tests/test_backend_msexcel.py @@ -87,13 +87,14 @@ def test_pages(documents) -> None: backend=MsExcelDocumentBackend, ) backend = MsExcelDocumentBackend(in_doc=in_doc, path_or_stream=path) - assert backend.page_count() == 3 + assert backend.page_count() == 4 # number of pages from the converted document doc = next(item for path, item in documents if path.stem == "test-01") - assert len(doc.pages) == 3 + assert len(doc.pages) == 4 # page sizes as number of cells assert doc.pages.get(1).size.as_tuple() == (3.0, 7.0) assert doc.pages.get(2).size.as_tuple() == (9.0, 18.0) assert doc.pages.get(3).size.as_tuple() == (13.0, 36.0) + assert doc.pages.get(4).size.as_tuple() == (0.0, 0.0)