From 1ab0326bd5a4e73946223fb7490e52bc561cc6f5 Mon Sep 17 00:00:00 2001 From: Daniel Gredler Date: Sun, 28 May 2023 20:10:32 -0400 Subject: [PATCH] Use barcode-specific min height when searching for stop pattern (fixes #1641) (#1642) --- .../google/zxing/pdf417/detector/Detector.java | 16 ++++++++++++---- .../zxing/pdf417/PDF417BlackBox1TestCase.java | 8 ++++---- .../test/resources/blackbox/pdf417-1/13.png | Bin 0 -> 238842 bytes .../test/resources/blackbox/pdf417-1/13.txt | 1 + 4 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 core/src/test/resources/blackbox/pdf417-1/13.png create mode 100644 core/src/test/resources/blackbox/pdf417-1/13.txt diff --git a/core/src/main/java/com/google/zxing/pdf417/detector/Detector.java b/core/src/main/java/com/google/zxing/pdf417/detector/Detector.java index e629beaf0..cda7f650f 100644 --- a/core/src/main/java/com/google/zxing/pdf417/detector/Detector.java +++ b/core/src/main/java/com/google/zxing/pdf417/detector/Detector.java @@ -40,7 +40,8 @@ public final class Detector { private static final int[] INDEXES_START_PATTERN = {0, 4, 1, 5}; private static final int[] INDEXES_STOP_PATTERN = {6, 2, 7, 3}; private static final float MAX_AVG_VARIANCE = 0.42f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.7f; + private static final float MAX_INDIVIDUAL_VARIANCE = 0.8f; + private static final float MAX_STOP_PATTERN_HEIGHT_VARIANCE = 0.5f; // B S B S B S B S Bar/Space pattern // 11111111 0 1 0 1 0 1 000 @@ -178,14 +179,20 @@ public final class Detector { int width = matrix.getWidth(); ResultPoint[] result = new ResultPoint[8]; - copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN), + int minHeight = BARCODE_MIN_HEIGHT; + copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, minHeight, START_PATTERN), INDEXES_START_PATTERN); if (result[4] != null) { startColumn = (int) result[4].getX(); startRow = (int) result[4].getY(); + if (result[5] != null) { + int endRow = (int) result[5].getY(); + int startPatternHeight = endRow - startRow; + minHeight = (int) Math.max(startPatternHeight * MAX_STOP_PATTERN_HEIGHT_VARIANCE, BARCODE_MIN_HEIGHT); + } } - copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN), + copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, minHeight, STOP_PATTERN), INDEXES_STOP_PATTERN); return result; } @@ -201,6 +208,7 @@ public final class Detector { int width, int startRow, int startColumn, + int minHeight, int[] pattern) { ResultPoint[] result = new ResultPoint[4]; boolean found = false; @@ -251,7 +259,7 @@ public final class Detector { result[2] = new ResultPoint(previousRowLoc[0], stopRow); result[3] = new ResultPoint(previousRowLoc[1], stopRow); } - if (stopRow - startRow < BARCODE_MIN_HEIGHT) { + if (stopRow - startRow < minHeight) { Arrays.fill(result, null); } return result; diff --git a/core/src/test/java/com/google/zxing/pdf417/PDF417BlackBox1TestCase.java b/core/src/test/java/com/google/zxing/pdf417/PDF417BlackBox1TestCase.java index b86222d24..c4060cab6 100644 --- a/core/src/test/java/com/google/zxing/pdf417/PDF417BlackBox1TestCase.java +++ b/core/src/test/java/com/google/zxing/pdf417/PDF417BlackBox1TestCase.java @@ -29,10 +29,10 @@ public final class PDF417BlackBox1TestCase extends AbstractBlackBoxTestCase { public PDF417BlackBox1TestCase() { super("src/test/resources/blackbox/pdf417-1", new MultiFormatReader(), BarcodeFormat.PDF_417); - addTest(11, 11, 0.0f); - addTest(11, 11, 90.0f); - addTest(11, 11, 180.0f); - addTest(11, 11, 270.0f); + addTest(12, 12, 0.0f); + addTest(12, 12, 90.0f); + addTest(12, 12, 180.0f); + addTest(12, 12, 270.0f); } } diff --git a/core/src/test/resources/blackbox/pdf417-1/13.png b/core/src/test/resources/blackbox/pdf417-1/13.png new file mode 100644 index 0000000000000000000000000000000000000000..3251b95d38bb1b26f458fb9bb2abe0ec9555c3ab GIT binary patch literal 238842 zcmeIb3s{p^wl{9|LuU%wevcy*`_Y@D{`pCLZE6zY!c7{p%T$=?fr%@8i={lGo4+Y zK2L-<@7{aub=~W?*8ceaE?YeI*@@4N7%^h(l0PndXT*qKjfDR<{|bIF;?RqKetyJ= z4@N9mIRD-4VP&%UXK49jM_tzLy87$4mz-Z1TG}nXC*S{t_R)je>mT)%`)5W($3$oD zI7@Fj;eVMQu3aaeXSf#LBo~)fUiB$C*R*4utf zlb7KU$1HiXvwc%)^Mfng%ls9Blm2gs*6wLO63;u#RRqtxIZ{$usG3FB)+YLE#Lp?G z8fx?C!ou3$slC~k`E4>k&RfyPct7~DZ>yVb+!?oKE&Kd97;Iteh2WZ~HOKt997c3X zma-#?$Ngd3s=$=e8EX#h=qXwhn|MduCi|-XGXGFW-h$X=k~uO4lg8hY)ZC=h9r5Nw zmGisRd$j4is0MG<>Zt5?4^dlCSF4x!5WQ|rx0k4s&A#{k7~eP1To=Zk@Q=vdK=-ZV zGsIc+3b~eBC}nid&Y4`%G|{)VETQp)e|cAESL-!RTTm^n;kf_lu%oS6X7pH~ubxBK z?$y0PU(QVl>6#MXnHpN_z42&os%nS7X#3ewUU;sE%6WZz>*sxI%8KS__CR}GOzy*U>-8JVXU6*SnR`<1?} z9!1OhDs^T2kl(43-0@t2%0a7`%DwJgt#bBlpuRz!)3Ho4j#>StD8-%Lku8K>;CV@A zb``KV>a0<^6}z@DI$AxKbH5vj<_d$wk2hnp6@rT3>9x7n zFVu=p)8ab=TNVL>>}&oSv2xrG-J6+#@eT6no$p7NECPloZ>T(yr2neC zB#RrDdYZ903C$G-llgGex_kel!;Bs; z7cAEku_Izf#Eys^v3A7T5o<@BOyXn~N`Dq7Q(f!(#;Dvo+qzmK88sf@i>sA1aF@Yn z*4|0hRjs9YZ|v#KT_M<&?_T49{na*EH7D}e3~(tI#x8?kCJ$nbEOnZ!A9Z3@i0skItd!fo$v`3`sWjDV$FvmPjm7#TufDpJJ8n1ONX%JKO zo(caeFA#+};>1_=5b*`s^3c&j^%DHK<1a0S4x5PYn;Cmdyv7rC9{qj zZ69oay?@7=8;!6;;~?{jz==oV`)c@>Sl^Ms{z;Y^6OHjW5nSh}q`~%u2rdy^XB$Bx zxWwXG=_L)Ok_OB>vAD$II@>QF;5gzc|KeTceDx7o$su0cd||X;)#%2|(EU2)w2UN9 zlviYe{*w*IvXpMhY{@$BjnN!C9#L>{u?ZQ(I*Jl<*~EZ^T!dUicRgKE6FDJrLga+V z332X*@MM2+3KBI{P_Ag|F9LT6UuH_{nUbVW!lt0df&MolV=Dw_L(WX28o>|Hav-3R zX6#JhY%HB=tyBsVbpTktCDqs{z{!}i0hk|^vmje$7yQw+Th_iSM>c=o!nZs|UN*GE zfBoN)@22mZ)|c@?`Vc@(V@eYmRY-4m-bU>+zN+V9P$ty9wP3^~l%nzK5u6dq{<=dk zI20=J?0JaF{vaj|-;#=(XIyiPgeF-tN%#PhQW-92Qc)l%sYDVH^@C%xw?K!20f|`I zbOSZcpm#ePUTRvRlFC#DOBhy(MWWGc#m5oIjbAsq?)c?237t$)mc2=EzLMcA!A_L6_lOFU^R>~!+0}tMFj^C-BnsBtJPgJuM8OhUX+Nh7W)6t0w9RQF zQt5xs(hh;DUgJ%IS64{g|*z+TAgi!tyK%x7Sujy^4nq~7gKw|`SxV$Qmf}`2@x}j&a zx}^_yk`@cJQ2hhvuVa|iPo3S+ud}d7jhJe)-1E5_5UP*~SWBaDbk3rgX;!=*s`aUu{T|Cul5NlX(FEQs>$<3%D^4yqC& zSPrTZVzKOOh-%V{#9}#Uqlv|G)J79m&_45P@}7p>6$BXgUiY1>^2U~}!-j(*BR&DW zb4qTGP?b>CCJd+vYe6`Na1P;|ClJy^I)(y@6KiD|TTeLW-;;Aj_Ixm6#E1_@ELk}J zUB@dl2p9drxCmflyq=>1xNp>@cqOPvP15IdJnZbgz;P{J32JESvb)v0q;LtV9Vi!b zT$~xes2{JST0OcEK3}SLR~>LEUI{9Z<|Qb&kM6?_uTP@(%x32h#3Clzd*h|v_PODH zF^gRa{)2k1Q91wu-qyhVx-JF(L1F%}0FC(3PD!4RYr%iQLLy901DTq!D-k9KxZjAR z{lyEDVLfZy*57^-@%&$#A1NmN<;%ala60#a=zkq4S{XdLaW$ZwnSvsZqC!B;)`x9^ zE}6RBF#^ez>2>l(H)UADm(W17*u6la|5MF81`|3^={|=}kP3iAH%_CC(&a$6&Em&i zL~r5!7u1{{7Bb;opx^~wti{fG^B_~)*>fDOBw#k4fmz;fpIaVQVt>Q-y;xB_Sei}8bdb2rMYq>AKcT`(=N(Wn%35H*@2(0Aebhh)&WWy}8 zubpHi8|DPE5(%?a*$%?311fPWWBd5#ru)fvrJ;AVmE+D$tef3g_|DG8 ziy8*i!s*j`F4axsMM1{{bPH$Q%&?aG_^MA>9!yaW)8eft3q5pMRR`{=A%yfIU#F}9XE)_4=ufEEmF&obF@3zYQK7ui;9pVHF z!zynZE$0mFcR}0ZZhKvTF~4^X1DX%3jnk#`6h)ym6FI>8rJe5AVay+$%=e~Y^`%A+ zgovAi%7uuVEsEE~fTPVcI1x7o%}i21Cll*7wB@(JfZiL;IGI>CyWA^tA`|P@FP!GI z@hGx|$i$hn!oRnM$UlcO8BxF8CpW7wMJ>>a)|>-J`Fc=U(O55VE4OVQ@5icegP6w$ z+M}s9KLZiM9%v~s)85C*g;;r|gx=g%#F0`+b|<+G4pm#M9<&*Xf7e(lBH^+i6bE6!wc zi(pU}r@AL{$ifB(Zw!)891;jYcFYMd8N!M~;fM$;0@#Si7?H7|F?K|G5alr#Ow)*? zBFcj(kAFkuad=04<1GG`{M#azBB+0#g!8WnDRdIY&}>HDamYb_O$0q%|B#;me8p2Ypa&0r#1V4F%yHKKBpmU_Mr) z$@E?uMUiyh@1UsS?v${`6nBUaW|w_@PDoFz+$tyB^-KbICvNd^#>?W}yIPGmyu)4Z#!Kb>>iEW+;lqyk zpQdh$FPj&;jJiR7ds6ce>Q?!?BPFwpH_e;9@PUfDQNSmDJo0b-*2Y#x+4_#Mq7+*v zwM&I>ch6f8djWZWZd!0SZGFcrj-c(3Xq9f+={!)?~k9ap%`8oDJCw^>6MuRZo6!x88Q z;K8`6$;;4&>oaO099}l$!}z{N2S(+|;fy{d>&~`SfqK7$Kol3Ae)<&c9Cc3gQ7yef z-ZeXCvf-d)GCI{*VFO`o8`T*3#rr7I`f8ffygBHEglqeDSTkw?b#6hIjAK?m+z?ys z!9WKyjxd3RQI%8xpBc8NIPy_}C^E$d&V!u8dgh~QYeKV;PV$B}+ zYfXeP*R_@$WFlrx6|-+3c@sgULxwAh2+;+~1Q}BncBUi;a!F6g1NA4kGQ-GHHEqx- z&*n6&$TH-a$mwyr65WVWr%N)raQ4-`Te*c_fgWR=M3Q~VL4mWG6v z5f_5E5VPaQ!+pGFEJBRUkj5q^T3Nmw0oWj*awW!0wOa4j4EVTAfPlFWVg@&!_N9sd zcoyYagc;m#`RE2h_W?%Fc7R_$bjSpdGXdC4NJ3*el5CG{7)oPCpKOn97*r!DhDeWX z7~X#9A5m_$VW5d}v!MBhHV#C&*#)rwxs_Ym%lWU381cb~B@5@j>!MNt;wBI`0l+T9 zWQPDFG~SQa(8o*+G{c+OnU^!qd>Vmk=BuxT2~;hiB4V*AVo@F+S(q0)?aljCrG(Qb8ltEm6?mU5%!dthMz(~FE~ zwFS_a!cDwO7Q4w7bfPr_Ot0&QIZ`0JJ#aabJLl2imMi_gKQ=V{(Y66hFQU@K<0Ky+ z^wd6_QU0aV2Qbl^f=m*DGHtSH4@@LV8d~&;Ks^EXwT<72Kskb{B^K(b=yMC~NGy~? zz-MBi96{d`mv5+g5epLg^SONf{P4O9!P6_`55%Kvt=hLEAJn3!>J*|n-Gf&_6-(wW z?sxX*lx$7es$&x8yECEcqqAe&Q`=;8u4j#V=as)kyzr}skLpvG1ueX}w_5S%v~*+B z4qsFI4qHDJ_c3t!MB)A2o(iaUY1NEdW9k6ns!vP<7Z->`b-K}VprWU?-lxRWY{XTc z>h&GChlQ-wxZ488W>a4iSA7!bT9i`_wRwD*S5Y2RWzoaA-wkvLanYx6RXJ{8;m`Nm z7y)%>(bD#F1AOhGPg3D7T&TsKX_Voe>ZE}dAujr~ll2IfqN!t~$C8U9Q?l-#9W~JV z#YLZfYJ8Z5itWV8okjuPHpW)5yE4(%ZxBKCfiPV`1l8EZ$!;+wf+{!($7MDPptav1 zf=UE6xWaDn1PrtByF^flpawFX;ST?-t}m`{pT{u7M=%Nk5^y7m-7%NKP)8i`E2=`= zRLHkVuf^?3+--lPP->WDssQ)i7#;41AYp=4qZ>0rp()$6j3iDJG=I>4vf)^k68g4D z*1Hi22HRJ&R492LR$D4QtrvOja|k zET`ik)#whjz!=@Atj8?^oyTgXm36CM#_=N&B3so15h8mP9}yzd>XTR^P@qJJh!7bq zHL*mf&96OvMh@*5Mt ztwX3S=MF(-*3e|BvvPT@xU}z+m1~V1W1O*yfgv!!2GOGrpH?&I9j*FlVM)c2ra!oV zntCd+LpID2#vvO9cR@NT=|sZdLPLaSBq|X%(tJ$05(y&`20cU{;|Y_-AvTQXxbs6K zj7ZqOtAs&4L8%*~me!CtoDic0vFq69$Hlo1FNCX(e<&ocqG|WAB5&YApjJ=qo1(SD zifkg=>S90@*;ZErE{U|d2=UpE^CU{x3BZ>D2+Y8zelQGC!bAxh@1nFH3QDB4zl$%C zR%2&j`z>#OF$1x!zfju>H|k7dU*@Ol-f$^6YESb=#gXA#Qk#!Jmk*c1z0h^4hEGDe zS|b@X_T%nMU?}sXXn)2NUl+Tw>4g7O)oR=Eb|w(i(5StBNFKfpS9-%!GD|799YJVe zC0Zj?(F8I?*Zt}zh}vY;oD64z3r&md&$Hv}j0Gi&VwVXEU5a7D*ERDhY4LFdSsPr6 z%0t&t6H&4aTSP?3W}Ge&B`3hF`yso;D%ozhh*h$m0sE2F#46eD1Df#s#KE(f0f*he zYuM*egf5r7%opFsP0wsctPO(oG9|H1=rsz~Mn-cM8ir8vmrcpJiq==$cE6C4^xdOf zlD2Cl|GWB7jL+m*&#-QGXJHX-yr^N6;oOzZV4^5Aa33Gs9Z$V^9gJOxlSr z>Q!y$-NqoyP^eLx!CE{zcsqTEPjgdN>?SL|l_b2^E64W)+cf;HdbpoANOd5|vw3OQ z9)Irb5c?)=&G5>W;^q3)S2>Z#lKs=`uglc;Gwhr6F*BN(53lFy(s_y^AMcIVW#4bx z9>RU6XrPX0AEMuh!h164sdF zj$Na#167-!iJc;-fbPjJ`hJJ({CGcBg**IuE%rbi!WOI=VQZX)E)v9UFkz6UD zTk|#h=KvW$C^v$TtWplPw%Vc&#JfV48qPAyK3@8WbXhL<%js5`$x#*Pe2O})c>b=vI;^AkD_SZ?ihjO%JjPIV)p_Ggj4ep6wrnOqJUAl z)zCrBo`>$Yf7UqFkP}hA-6uSxC`0>qPN1+pY?JrKOO0;Iu!Ju+91CDV&otfV8AX+fsF&g^*jU(l^>BInckd&P^G)zbGw z&e|cDf*HK8nI}W?KlxMB50P~F=Eji@r8*+bHuqf z_q6&g8em--p`|c*kQIE$`q+bGF;6|3=Y0p#XqTj6c}zIqx&ZkkI}keNueOwi4=}`^ zhk&N+*N~}tD)`5mS6j+f>$Ms;h%xR?fgIQqxFS1WZBAKJQkQHRh1jx_vL=WD*|eds zaMnd`rd=ifvixDj92Vx;z;eimB)rrM41N{3lx~u?!(<$pyh0I}sZe{Z% z8^syJ134lKvlC+Y7}$>Nn4PH1f5r+BRwS(WIM(-HM80eo6kRZB=E{Q z{2v#*({oRL@iri$b0mO>Mu3LZ34m5U1NiAeJ>aK90oxp{18lPxfYkCv08(=R8#H8xnMYux2p*0AUU2XO1Ea(9Z~7V%v+05qkQu7q$K~R#+~TVuRz17n{#8 z^Pj=H3`6e;UGURMVLoH?7Y{ zi8`t5#J8=`5JUl(t88PC!{=Q@SjR`>M(nq zF+oNKCFG@AMiE9LA~V(~3`98)-3zEuVr6i1QDRT2KCMJK5XX$Tpv2iGVFilEObA2e zgWaCZ3z^kX=GkdGQ?lkS>c=FoXO_d28qmUQkgU7;x9l9gKO@YS`E9%&RFn~8Rnp(S z;Z4cYs809b?c;MN^X;6pHN%_W7G%qYz`j^Re6nRu!Lkr3dkhL?r;Z_t(HU?tq8OhB z3M7gV-KIg@59?v1<{U$$j7XU^z~f<+GF4~p)v}X|m?5|uhcn?-rWaDl)I2hh13(T! zJrg_G^nvi6Bj8CwJwm<5vA2XH2uBc(F!nBUg11EEiOAExi#$Q4MUs;o4B&+2*%*6<>`)$%g@vtU zzi5W;v;1{?!Gciw6QloeWSp&7L)&L#>@yL@i7Y(mbx7qRJ{j0(<8`r6bHtaFoolj` z;k11*gWxcY?X(Ub^igVWxwQ(f+l#)lb~eUFQ$z%jsvcwux>TVHIzy8nFkzqd#~PYirzSy@qvSDWms`pa-J z{8+y_{tCfKD14Y0cFg~D*kZUDen#26*kzJ^P$0qFp45CK-beEBLB-vXl3CrejutN0XZAa)4(yQC6Ji?TpsOz3=!=_n*y`_F%Q6Em z+{xM{hZ`UJ!woB0Zs7Y?v&_Jj3v`#1Qw_BZ`#g%;WLc8Qe5HFqfOsABvw>z7m(Hvj z-IxhIZwjYDvzjRATBH30`r6p@$m(*#t8nF`H$G;?cof zt@7qHnM2badht0eefvS!_UfwUr8YMyLkcX+$)P>#7Qb8oB9`ytz40=ikq|g@=s7vG zXN8G93y@$5Cyk=T$3@3hM>#a@p}A4fkyr)dbdeKzY*B2xmZo%Q+7`I6SN$9jBD>^_ z2$7wNj|dU5ME#bU2oVt?qw7R0k-d&85h90$h~CL&pKt%W^mz!1d(ZfNEuB0n_fB^x zPHqNY)rh6f8!|kKPStaHxY<{bpriNq+K}mWhr?RBaTBB&5~;>LKel=vGoDwE8=NV+ zo_LWS$7I4uWGq5M!W%@sh~A(=X`&B_J|y~(=tH6pi9RGgwx!sibDw9pN+6Z?ogHO= zn$PN-i!q5r2DK@RO2})LfF_J&Pdc735@95wdx`EH6sz-#P!3D~m)G49BR&|hWa0dG ztwJdMB34aS`WWhr>?tvG|2}3;yHv2AjSzt8x>jdm)J(uCBXB4s>&~`XjQcB4A8{r| z%>=A6rfc))l6|EZ?I+|Hx)OcIIaU9b2*FCLIdQH;-&M%FX18K=tdcFaA2ev%5OZvi zF_Tcra>d4afZ--Qiw_S}!}0XrrxxwBcefs70w57w67tlkMsaMa5lCLBg4juQZnO z)aF$*?e>Z9Jeue=97sIvo1(RQnjf5QSp)@gPX+LqPuqK=6-dB7RB%SN&4~a?vTe5D zPR-etNShUKU30PxBJD&;K8f72ifqTs=uecSvr*%J;*=FI`hyXcd#6Gw!+hbHT7&Q;!%IeKPh|@enKP-Bkx=$DqsL)P~SX9UDEwQMMieezsk{A;~9Tq_y7p_{}()W#T75Ki{5(FsV zKnFDe>d+Pn9n^4#Ht3+H$9-|2gPN_6z{^peF%QO0Ry42YW$`N?7CZ1Z3v=R8?Z32l zi?h1byR^GK6lqSFzWIRNR9CLNih7QM`zYUi`l>)@(#tfUg6cR|K{g0we{EnvvO%`d zOW7~gM1r6RWj`@&(1Jw8*=aS1inG(o5*0^O9Cpo!1Q7|s&iZiMAZV4Qt*y_x?in5e z>AFNymmE{05L2%NQ=c|F9x|o5M23hA5g8&fa0RTnd-w0B9F_`}!^Mrd7%9|!TnagH2u)^QYWKW$X*jBqg`@v0^rZa-!4 z{cTt73o`EqI}uA{ zt6xMck-hZ{{YXpV&e`gM54$_p)jF5+R&@B5)aHe_W7uQxu0isn=1FI(9-@+h+B*KD zhRP$nN?QDQ+zrhUaEFDNQ0<`d7Q{YW?-i$?AZiQ3o!;y~XIU78YMx}mI#rC5-2W`J zR=Kk2gg@2A&H?O?C7R+^Cmsy4acR!UvyzP)6iZ@>1Xp`4%?aHPL{JT*< z4)w5Uigu2wFNLf0m<{LokBU;`^wZeagSOLmJavk8j%ru~J!EERzmx51tej<-Ai6uH zEYk+U*fuKf3=}#}|pWE`B?@{Dx=qNB-#)pW4X;qlf0=ZBZc8x z++#2BtDVg7rnM3=bBanKVrI3jHL>0xl0(Fd@@t7T8{Bdm#q4n3xZ9rL9p~J@mW_+O z@g=L|15n4;gUX7=dV%4dUH0)o;q{SVd-lNHhBMck1NC`#N?2oxI~ZD@=C1=)o1Xz& zQNiE7=|$h~WZ!SwKHiU2@#M=MG$vB!OqRGOE>*z&&e0cIoLwSoF1BalsPc-^%6f)1 zGqm_Zi_0w+Qj!*0*mAw;hQ`Mg^c$F6xQeo9XOtbA+4s7~*|{MDFSNM30v+W!)@!+M zi++k9GxQEy`9h2AQm?06N2Z=}BxI*#l=Jv+u-P#UlQ3cy1(PNR*|tp<1)Q&8kl6s_BB*F&x1=g>J*T=V4<#gWI< zogtTloj!(XwwWDsuEBAgY{%kMMOqT)QtTqYP&sEErZEO6A~pP9bn1EAhZY<-x-p=9 zLhfY8Xf?OKregkQ&=5;9j;wAXTn0~d2$c8x=0He}uR9R~OaKvWvfY#1x1 zwmiL z#Wa^gr1F@kTBivWiZ4QuksQ?# zeXJ1Lg~&5ucm|Mc=HnW1DP-&HM?RY9Ot#Km@TiG|1FUMqHxQ|_oa8rGAOj>cNxKmV zKoq9)aLz&Hu^pC<;MTaxhQhGPLtxNlhZc}9{x z2QI-bUKu>Pu@EkVtq=>3d*l1(tSmXAj1&51+0%j@zHifa2^e zY^c8uDiUt6fz@nVCcUK(mjVo%RZ9FX+ydoOs7A;6fbqGkCxykf6%er-wjc$I-6lo> zkUS;MFhPL&1~|9RkSUR+#1-*ZIg#LidEC}d3rlh#(h1l4pVC#y8{NF+x|L-kT?kLZ zT?~R$2eOLYryo%Xw!66y=7jq*92QPufO>md6n^hn7h=<>Qh3&44tTzs+2uDTxDrr^ zi~Jk+X+cw5Z%VA3=1O21ZeLL3qXaLsqO|XmmCz64iRM@)rnM^jnq;BN7H-Ty1k9mc zUqrxoP}Aoi)Pe|D$n-h~k!Zw%wWL{4c2;RkV!;d|bVUTHYeuWG8EvvA5?G=(G8-lb@QAwZ)1i zYW7beT-DzU@Ym4)^3j9V6C0w3&YoGEyp@xv*Hewd#=v;c!nC|}qte^8?YxTn`dh)0 zZG3t|KC+Gdm`@^&uIR-`q|ui4m_!R`M?q>)JDQ#<_)0w^Q4k=RDN^iqGo zp$JX0JA=^59jlMO#;bUW&U z3n1_0N~9l^Oy+fW>&uw5)sRqgeJWYn8=ufzoRI^G3}^S`Gr_7dJB*3saGoTfBREh2 z=UY!;E?kgC7D$`3xw(^>jr&}QU!<@bM9i#**9@}N{iqEhW{&j7Bw}VY#A^^9G~vMd z0aC=8In*;xY9Q9kBFxYd51JruCM+VcW{&g;zTZxq#=)SjR`HD;pszCmbK0DP>blDaDIf|Mv+ABPn1{~<^R38s5f?BM<_e~oXoZQ&fBNx9_=?R*%}3&WBp>_dULPr$)jd0Yd~9%q zTYTIP+q$MS7p1s&wO-S-1(j_Y>(wUvs{S&6`_+lQb^H~Alm7Qk%`kr<8Pi1mUl47* zIc-5*Q{u-68)OtfIt=*CQF7o(h(k;I9D1~N83 z!s~ez*p&=L2>2Lt5w;+5HHbnXY(dz9um!Qg*0~=&R#HM3f;oiKepqvlP~T7QjrDzAsH4vvah zJoDy_zm#t-@X5^g@ox2uBw$K-jL!0-@Xs8Yu;G}eJvr}p+m&m zCQFy5suW$lqQqDAH1CZ;f?XP~buDQq;K|&vIJJ3U?1kWhfQ01Q2Kn?_T7#^&eMw7S zlqka+&A8+ren(;!!{8~Um3$xNUiX1%aUwD!_Q1CjHC`wDUoKd#hk3yR5N>sT(Q!lA zzp~N6{fkABRaEok6aJU^c^NU6!d|5d3q9i8Ifc@ME8KEr?gl(#cDMUf)d3hhf_*Ov z)_lP8zcSl^p>R(w>|6);;mzl{eLNQ>@WL4qH zssVa+sbe`zJmb`mz6;eH6dfK4DO19l-!x5YomU19>soB0-a zHEeZr0Uc6`D29RGz9piICy&a#vuzbq8MEsd_GJ_u-M@j4Yhd-AZs~}Ssf+v(ozY= zh};b#cC0cJ=CDjSi4MO#q{>vMp>O9D#|Xo7&fUp#T-A*Xom7s?JoYRO)Ha1|KbGg`gt1K&f+MP-#}6XRa!QgC?J@ ztMXuUO=;ys;qZ1Glg8KiokM}`j_Kj6pbPHmmPN7IU7@QO(LkizKCm139gw6wy(5~I z84=Cq=DAO=JB+B;xlhs5UaQmT+9yycHh3z6rqt?p`%szQoMNp)M`NJLLkx!^;5bGh zw23_&wx>8lruX{J6GexaemRpz>2f-7^qrGc2thJ|hcFK9VuLVw~jT(kvwouPcIU zq73evQDB{2>!nCb;wZS6`BQmb3ONu-1#d=s2?^`CAG$X+uMUiAK$-5{9(e1omYtj- zV#FmRh!ZLyhKB{g6jue#6ie1({)W>58gOWh98DgM0)XqkZjx(ZKTp*I+ZFb?l`KMs z46W|W>Uj)}7)Af?%-cXD9lROsB_6!@KRR+I)3vp_ah&-mKyQ<6YQB6}l~pQ{s3q%; zYU!{bm}1UkzB&x^_rB(jiZg&iH$<^5<%|)(f&{Uv^*=f`%5?Ik=H~XWd^kfOVhpDv zM2v|T6EP;%7`Xz(8WU?wtno>I;#3o-+Br@&WO{I*kf4!GgFpa+o%M`@fUviOlSa`{ z5Qse0h2TU-Krk|fS-qB~d`VE->kARKvplFZR@j~3ztAQg}_$9H}U z0S5$C4f|p~TM28Ohl5QN*h0)5vy+tiNIhExkn@Kj4NG6d?qGpMjB{q}TOyU3$ zZbVDB9|%svOnmm zn}{Miy7*9GNK>LQ9-;d}DzKByhRQ<}vMB(X38|ycR-&{VihfWSr;Xywhs2KnQe8DT zxo5;M!YN0JI;?yG3N!u1S@gmd_2Jk}#;DSx2!*cdTHjW!r^py^Dfgx-b(LlO5U71b zG3g9Wgg0OvZ%%-u4i4|&cWz=RaD$|a1{GA|#F`O?x{8?@A*zpEghDSF`*y9CD{2i1 zHbz>ba`Pd-LOe-!2=OHQ1Atb} zp8LBowyeO%dm{pVaRD%xrvOA92Ap+oDqnzVrl>>1q$lY*A#B@^N(V_pM8svwHX8z$p{`ax3p_%d7q!KPDpx;sO4OGmF`Oh-HY?QR+uwYgHUo zs=;S#Tq6YlRAuFd)YPf=spP&@c`R|+i=}}7(q>D3A0-qo*QOh4W4LWzMN{f0ANZiwOM2Mkx zGETHsF}+K8Q&{LeJx1l*@dq{lD8u?jYM3NF%^=S(9R;czC7kfx_ zB|5;~sf0D+0|>g=raLGGjC3n>^bGs9>_ivLrKZjfSh6sG2?_oM~f<9$s+beq54~| zKd`~KZlg843UD16)d4OEk_tU^}$pWp+Jm+e1C-=1rv*6$9nZZ z_YQ<`d)0q#js+P8Nduq>? zy@*#zMKfqkbCdx3gB^jtlzLOK)G8Gnf-_Iaj5STrOk*wJBlk2t*w5Pv%@0GM{A)@* z)IK3ZBy9f$K>nqMd><8~%H0|9eblPJl;+(Kntc(DGG>`l4Xt6@4u8DTu?YT$*TgHJ zcI5pX{#)rN!m5(x38ULs-_YWjB_$9A0%ovcT%q|>T2pT%wIgj1l40gOz>i>Ef?zkK zOR;$iv?u{2W(rJufxa5*?N}@*>Ra<1lZGLf>Vwb>rGUmhz|UuieoTgM(!60oRkCyl z8zBeTdj_*9@Gq!w2%lS z5lDQzKm?KqBm!X*3rQ>__$`5QdlM|gvuF|Tg^z)hwVyMeBXPG3&GCo^$-Zrwsy+dGzcIdjzZuw#Ulf-ZeT&l?Q1Y6sSTNi`S9C+5#m=Fk$e!qab1l z`MxzvotEjxDA?zouE9}bTsag^fd}9D+m2-_ALtN>0tyu^>@5^5qe%0xR0Ufg-gzAY z3PcAc3fDTiS8fbCvz)g$6#}+C2z}5x6c92%Wf{WO?SZIgFWPbFSkbv*v0_Wa);=6* zv~wX4q|#fP#G_CY4pE`FavBb>P;_#Yi?-k(^k$5PH+e%82i0JbhtEQ44Dw+pLOlxc zD_Tb|#C^E*3q`;vRDm7m1V%}gb?rf) z)!!sncjK79v;{F6l_%7VL*X}sgE~*aArx7mbAq527HmPNbTfp5hz>JQu-(%;4RVZ- zSVXC|Lg(qk57OT3!XO4PsY6j$UAo%&4 z2K@9pC{_rSzL`^;b8{q)dMLj#~MIwP=W(biJ`q83dzt@0ng2OaK8TQXa;8-rRdb5H={UA`#@;CGO3xfKsV4+^}%vG-uoG$r$p zH%kRMkU-Fs{4@(CK6-GJ0>C!K=4arkc4)4LTy69dFWw-4LZ2vvI)g#OeV4XCf4O#U zt3UMj;}(UYXzpSx1Y9_W1+hz7CUU4DN`l1AY~TGTG@#Iekd&G23k6LmIw0FewvR|3 zkv^h4iSopdYhwF|>q1-?Xy}X&F^T6%JWsm<2ZS<%I3yyv7lNJ8*a!dLsYGxw zbf_jc%qL{2LK43f&lCV@UsF{_O>-KfM-Hy@j_J?`i2jb@N6rf1k#<>i|Mc(WVR(O6WG{#0iH^4=Ss8S%ZB(h6{@rW!D^+1$3u}j3% z67PZdc*Je}IXrQkJwYY!Yok#ig0W;BFk%$|k^uxw8kedqLDe#VKdM0`7*I)qYhNx3 zp<)78sGv@32!aLJADrL-oR#-RsM0S1fC3pjIC6V;K-XqomL=RQ#Y7jG4mG2to|RMn5rSdbj05=R(!1OXKw@8EhLsC%i9$8goLVLKwA zq6fk#abi9T#b>BK2r6w*KBWb6HGp?QU?^jS3F<$9AXt!6LD`xlQ~^U5LLn2bQ$Z~u zP*4Tg9(0^E5kcnWF@=l@0C7Qg1E_pKiLtXSWj|hkG|WvJ)j>) z2cx(Z@OZ*W9~K9|k^d`Vl!tl%llnFdzkWKSLX~SQP zfVK*XXH^||AtmCKpB{z#z5m`v8|gnT`{Dmfo9Vtjfc?r0Rdxikpf56jombT25m2bx zMlp1GX7eOn?>at5+*_MNz*BP3lnRkP*8 zFZ-g}GFbux-snDA*Grq~y;Mai-?q$V&FgKMF`sFFx51FbDvjX3##pYLQ?1VX8ye^| z{GqHcS3U0&?cVH(o^7wUy~Nz2-HQvzb7$}Rz!2Uu(p-n`}WpM%qxYpXs}d4@zruX@ja0sLEuv<05i#rURq?+F7c z6p@DN_@=d+%Dv;GR2nIk++B3Z;>PaEnL43+{HdP!XXB@+Cc*L&qeIvYr>f*Dgv+=3 zzi|r&f{DN~VwnE>Ut^p+o#F>Pq!MlYGuQ4j#5qrbGtK=X>cusFBZjOGZQ0Fb2 zqFN3g0}Zk|x+<)P;%NSzfGcPGgquX6b#zJniaNUTCA2(-YHP*JMV#ycUYa=Kbu`d& z^oQsWanf&;-T^b-s9RCDfOB!?48=`hrKi$6qfrL`{sRZ8e>A7${FnUqA7)+3o1siB zc*%cNV{A&cQh%0G#Vt!a4sdw+L1NwR>^qX|-PzT8w7eE&#*0GCI_XVg1505bm`IhJ zp=uoaMU}kmtB9oR-7gi;gcbA;M zl1T5W71r~xih39o|5=eHmDR}d>RQ^-{hO|(!o{$>KDn?dF9@;D(eK%-zC{DAfIl=V z73^0QasIG;tb5mQy7p(~2YuRI!pdL7N%@jPhkpZagStR-ipcq9>=#igdQ6b;D16M& z^N&XhCGC`L^}m|%MQC`;Rkrw8biCm7vFL&TBpF=ctrQkw9m8+A74M*dve6&pLJmj{ z5{F}_kL}U!Wxbd44J(yaK!2l{e;od;MRpF)iHImT5ky3Zh!PPcR`h>_6$Paq(3SjU z(^=^&iT4E`yuOL}+A$NU50dJiMny~A7fUiA7?$~p@h}T7D{Qh`(MV$s_MTeib zG%<3e)~ANEL&{?!1e-Oh4#ga8*!|)k(fpV7?gl^T#XpK;J&~t$1b+X zdhU(0O`pQND*eIkf#o~9L9p3ygtv7UGTeKlK#h8@FTjo42D9>ppIOyF*S4?nEB!>d z;ljL?CEMOuDqJ3Oo|^wu-h8l_W4}=Q1A!NDmcj2cwrVKf5_uR`g=0KJVMCVn-r$21 z11^KQU}Xv1M^uWvum#~j4UPLdVDQnbz+clI`5x%nb*?4;Her|g zxF1lX+wFDm-q5Vj&oV^U`1fM&)vz=NY1#>FANO?K_>j$`zN-G;hRRn*jQA~U$-?>X z!djMu?+3qj)TSO85c@zDJoDj~FgxsCB446Nm$c|0Y)-oLrzxN$feA(MI)t>uj#!-+ zP^NeHZvxyTXolzqJa^^w$Pfj@u9Cy= z&%Xn+!;T1Y3>)?5P9UaV623G2HF(>}(}39&U4m{Q*sE@H2g>l~f0DgB49yDtq$3(< zPYijmRn@z}Js}wwKhp3uaLRiye_;79&{`UKg+T1c+wl9fufvS6SBczzR>IoL!1ORL z=@Rs|%U5X$$tr~GME(~MMIwr>6Gb9^MEr;){Mjra5kDe+MEw3$#qXtl-_9cdoJZu} z;^Sap!{O#hGgL3dMEJ+G;4?@#HC%A1sb{J1XnO)W-GoSoV?10oh92WX8gkcPR$gGA z>X9xH^=3e@5%SH6LN`%+;=Si^khH)UgMd$%^9_o<0?=U^oXome-+|4vGH)#7*Kso(<<`YfbLflTD}P31wsggsJc6Z zTmI7+9QwTq5e$l~Am~)wL=ojn=)9MentLYzj+M`Qa_Buc4*)0k5Vyf14R@sI__DFv zZPP*H=`j^yF!Gbtvputb?(rS`_x~Qd1Y!zA)yaG18B%bd=Y9q z|EI#l_OCrTh#m6ycO6pDPZ3@F5Op_d_g(;>D;oZ^Sx>Ac}#Mgs@W4 z^%7)0*1~2Z{;QJ1$+dSpT4dk*E$D<@*Sou@#+cxs;-)O10%8XaUD6YD_8%e?DIuzs zZ0kwgg$_pHRNNRq5g{W&MudzA8BQ`0OGYdiv1G(uB<`Y}?qW8F7l;n>Jpx7GNgfn~ zLkHd&Iv+>LlHYW#ecgY708lE&PdDiIvP!9w^Gztu82wJnigX=d2C%mcAQ2P^;QY!R z_)3kMq0)zZGZN0^W6sO!j2V!+t7l^I*>=PoJ@}Gaxo{>9K@iI1pj^W4m)^J))wT_Q zI99*|$?h*8D*xI=QK(9M5A2bI2Buv{#ij1m(mU#h@MuTeun z0|Fs*_Ky-l&&KEdjeoozuo`tMViGP2sjL8GH6Yp;^}6t@YCSY&?I!rVMth59EL#eu7{KW{tCWueU+&Bqa%3K4A-w~Cf%H^J!`Lqx zPEAn(LSM0ZRN`iA{mr30J5S?Q?^~k#aZxcn_7DJAOK}B@HEADz4}tbi36K z$r=cUP>K;Hx!eL)eJiWe0H~<#bz#8z5Gwfy85@W>l76GQ7HNQ{Z8*FIOb-gZabBz! zzOuDPF6>j}e*l@Kkj?ZiW9F)>NE3q7gR9O;wm||ftIG`qL?}{2d7oor0!zK)0XOwr zK&3Dm@KXJ`MF=tXuj3z%DThvpD8NOqCG;hfD*6*-;6mG*mBN