From 4480f2c987867fce1ee04bb359b66c37752c6b51 Mon Sep 17 00:00:00 2001 From: Eddie Kohler Date: Sun, 9 Jul 2017 17:23:00 -0400 Subject: [PATCH] Correct computation of TeX sizes. (#755) * Em and mu sizes are relative to current font's quad metric, which might not be "1em" in CSS terms. * We don't need the `emPerEx` metric, because we want to convert TeX `ex` to CSS `em`, not TeX `ex` to TeX `em`. The `xHeight` metric does that already: it is relative to font size. * Mu sizes scale with the style, em and ex do not (empirically checked; agrees with rule 2 of TeXbook Appendix G). This corrects a bug in b866cd5224b143 (in which em scaled), and a bug in previous versions (in which mu did not scale). * Correct rule sizes. Previous comment---"the sizes of rules are absolute"---was misleading. Rule sizes are NOT absolute---in \large size, a rule denominated in 'em' is larger. But the 'em' unit is not sensitive to styles. So now a 1em rule will be the same size in super/subscript, as it should be, but an 18mu rule will change size in super/subscript, as it should. Note a TODO. --- src/buildHTML.js | 57 ++++++++++++------ src/fontMetrics.js | 2 +- .../images/RelativeUnits-chrome.png | Bin 0 -> 14537 bytes .../images/RelativeUnits-firefox.png | Bin 0 -> 13622 bytes test/screenshotter/ss_data.yaml | 9 +++ 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 test/screenshotter/images/RelativeUnits-chrome.png create mode 100644 test/screenshotter/images/RelativeUnits-firefox.png diff --git a/src/buildHTML.js b/src/buildHTML.js index a91734e2..944fdc60 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -547,14 +547,41 @@ groupTypes.genfrac = function(group, options) { options); }; +/** + * Parse a `sizeValue`, as parsed by functions.js argType "size", into + * a CSS em value. `options` gives the current options. + */ const calculateSize = function(sizeValue, options) { - let x = sizeValue.number; - if (sizeValue.unit === "ex") { - x *= options.fontMetrics().emPerEx; - } else if (sizeValue.unit === "mu") { - x /= 18; + let scale; + // `mu` units scale with scriptstyle/scriptscriptstyle. + // Other units always refer to the *textstyle* font in the current size. + if (sizeValue.unit === "mu") { + scale = options.fontMetrics().cssEmPerMu; + } else { + let unitOptions; + if (options.style.isTight()) { + // isTight() means current style is script/scriptscript. + unitOptions = options.havingStyle(options.style.text()); + } else { + unitOptions = options; + } + // TODO: In TeX these units are relative to the quad of the current + // *text* font, e.g. cmr10. KaTeX instead uses values from the + // comparably-sized *Computer Modern symbol* font. At 10pt, these + // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; + // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. + // TeX \showlists shows a kern of 1.13889 * fontsize; + // KaTeX shows a kern of 1.171 * fontsize. + if (sizeValue.unit === "ex") { + scale = unitOptions.fontMetrics().xHeight; + } else { + scale = unitOptions.fontMetrics().quad; + } + if (unitOptions !== options) { + scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; + } } - return x; + return sizeValue.number * scale; }; groupTypes.array = function(group, options) { @@ -1312,14 +1339,8 @@ groupTypes.rule = function(group, options) { shift = calculateSize(group.value.shift, options); } - let width = calculateSize(group.value.width, options); - let height = calculateSize(group.value.height, options); - - // The sizes of rules are absolute, so make it larger if we are in a - // smaller style. - shift /= options.sizeMultiplier; - width /= options.sizeMultiplier; - height /= options.sizeMultiplier; + const width = calculateSize(group.value.width, options); + const height = calculateSize(group.value.height, options); // Style the rule to the right size rule.style.borderRightWidth = width + "em"; @@ -1342,15 +1363,11 @@ groupTypes.kern = function(group, options) { // Make an empty span for the rule const rule = makeSpan(["mord", "rule"], [], options); - let dimension = 0; if (group.value.dimension) { - dimension = calculateSize(group.value.dimension, options); + const dimension = calculateSize(group.value.dimension, options); + rule.style.marginLeft = dimension + "em"; } - dimension /= options.sizeMultiplier; - - rule.style.marginLeft = dimension + "em"; - return rule; }; diff --git a/src/fontMetrics.js b/src/fontMetrics.js index f8048c16..9c9be045 100644 --- a/src/fontMetrics.js +++ b/src/fontMetrics.js @@ -269,7 +269,7 @@ const getFontMetrics = function(size) { metrics[key] = sigmasAndXis[key][sizeIndex]; } } - metrics.emPerEx = metrics.xHeight / metrics.quad; + metrics.cssEmPerMu = metrics.quad / 18; } return fontMetricsBySizeIndex[sizeIndex]; }; diff --git a/test/screenshotter/images/RelativeUnits-chrome.png b/test/screenshotter/images/RelativeUnits-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1795f7ea1c03044fef1814ff9a67e7781c2c73 GIT binary patch literal 14537 zcmeAS@N?(olHy`uVBq!ia0y~yU}0cjU}oT8U|?XFf6?nA1B1l`PZ!6KiaBrZRxSuB z{rmsp_m~~ui*AOeiiaF&2=Q`dovt%6` z6nw_#?<)IZbKaAxs*bL#lVtbY`8oIe^E2mS9-ON=cjoz--#>q}7oWRRZI^HN{9N|A zIZumKI309XmN7D{YG+^&QD$H`%E91Z$ixuP1Lh_@;WD(^9nw-p%n zMZ7f%aOP;JkW~BhH|u(XloP{|Q=7gieGl2qaYcYhAuO$1#co}h;0i?+hc$DQjaJ<< zT`*06VWW}Xlj^JM7`L`CbW9HIRVokL%`qiuk!|bl`mLuU_!$M%`&sLqC%&_C@iG|G4+xG3T{CVh)#|d*Vn%Z}JPW?lT zm*4%ruXbN@PUvUN*6av*#s?Roqfc$)ZmM6;SN82y_|EwM_s7O{Shx5zy4K6sG@G4koOS`;V zRVMganZavA(Xp1ZZzAU^7fm;NuUX`2@iTOyu~No&hl$RIR~EbO6LVzlIJfxV{qA=6 zJdOsTKYl^$PRCZYdR$-nFhzbM`(5+fmyAD47B!s^zhmCOF;{<6?$&ILCI*dz>t6*k ze(*YXNc7G4-91*nL-$&l$j`%%+e`BA zyj!(3?|O_J(*l>^=I_55cXIC&t9he;)@Poy<&%9lA+KFLGM!^P0{qwN~E-CE=tCmhb@mSF0r|ZPX zhgVu1ANRXnXi|E8Z?5g-K*@s6|mW=b<2>)^>R+f$ahPeShK&#ZTw)d(oSx=X|R?QaHPI zX|Tn|vTp^Vqxx34-?El9je(Tm>mDY_t)cL+h)Zym8zn2yt{=DBq_qBRaoyAY%=i)_s zl_verm?NWDwCeWM>CFrpzV#<#zD_n$mVI+y_;c*uo%bKEyKQ6oRrJ9|E6I;5Ur*KE zvfJbEsW)#_50?E7x2Wtm5t(;;*36xP38l7-0`>omcK7=~*NwUmSr$9p=U=&3(t;Dr z2d|%49{uy~q_de@+W*PFRaDlcaHF|ThZu&gY&y%)RF`l*AQuc%J zc5Quj#(+uEO>1wgd{Fbw*>}@*(dFOXRbBu5)#%xyyx_artGs_7G1r?v$D`)>+wZ|k z|B2-so>N@Ao^A7GTI4m7Nj%Z(Mih#Y5(56Q0tV zxo*<3QaML!xyAQcZjFzyppi=YiPhVqNi&D7V9p`=CujagrleSWZSeSe z>WO=)xai-#lWMe#F8Z1De|n|W5W(88@z2u4L26mXN45I~f4hW0i@y{8?o3~#d5DjFQ~s;i`m~3!j0I07cbC7uS$O8{!4Q_^ zwoSI%f2HQnvs<$7`jZdqpIrIy>Hf`HwwdqQvfI~}PuMPF-kw?9dSd&ZU2WE7i~@C= znZP4ny1ADxSRIF&EePub3Dd{{ZtefzZ4*51DjA4@%b(YpJ@ zJ>9OgI%74%CiV$u*CwCK{}Y&hG-9Id zTfRHlZ=3(UeO~qV*`fHG_vcOc@4aF5kNoSe`@46r9{Bj}@BPguQXSr#dp@(sdr*0D z|GC3U>n8o4u$Y3GL;x#5Zj(h*3V5|I%l(In$X_XX@^r`E=r3(4VEXzqY(9 zV_kpd%+Gn{g)Huo*GswW+%Eloyw|v#@rCeah93rhig)Jy4ZrrqNIxb2z)YQ=*DEbb zk~h3Mvgpj4Yl82xuk3hie7#g=`u{_J^ps*Rm)ppxwwlLHeZMqe?tP#0C88@oXD!&r z)fLI`$L>$D=BJo7>}NmO-CWOBtGem$u6&l&=lE2=PF#E9sb#Wlok_xHzlUOf@Bb0+ zoBZX0jc4_vPa*Mr`;H3XmGzL~9a&tUU+_uwN6 zCuJZ0jJq6^zTfZNv6FMlChwcP{mtUGIr@>^!euS0+t2VN{j!LGO_$gM7>HZga89lROud{nOIUuDE;KJ-EfPS?B-BGj;p6 zc5U!H!_2=l;mZ>J=V`AZAJtUw?QXU(v@P~9*nBUNL-&y=!^-p`QR$GYb69**-oKL( zIx{at?M^&*#ePfvnKNhSbG=$s%6_S_bJFKhn=R*J4i{!t<<0S^zJ5OP*Zn(eXVQ;f z?33>3tzbP+`0cO#k{jN(&Enh6ojGf4pU!q}@4^p1ihiD%{_o9%iO*`LzHax(NNPJR zT4|eq(>g7%D&pPMUcou%EVa|iKk8n-^*(mHfcQtQhTI$mndmpF#YTG7?FZIAdw$P* z*2nO5MX^VeC+*y6Eg4sMXS$-5ciOq*OY@KTS6|bqwl_`YyEymFuB*vScaMs$%q&hU z*PkzUEjaKg+ky7&a(1iyA5V*~ULfRLvRA&2d587Pn7YeH9A&Ne=Nf5WUbFM}{|jgQ z-$|e0<@gsHHDB(<)w$b?_uJ2Ew_EN$$%*sKN4uGG_Md5Sn*XI|C(ny@3Eq5`rxI7+ z=lgH7W<48k%!`7%AA{l;&e-m93_3P*^~(QsFGJ;btz5n0cCPo^X=^O>jje8U*e{R! zz48gqlQg!tDb16fEol7hZnXW2*iA#zzc;^4s!WjgD%@~0g!Qo59&w#py0*r4HczUi z&w04v>Sm+GCFL1@0T)8-T=j`R>r}B$JZvL|KF<1P({GD+1*>@~|uKDTTw!HCo$NI{% z&B;sOy{eqse7?6bzjsRaVhxoa_h!wo%m3-Td*ASSEH=3Vqs?YrRXh=;=>3Nh|XoBGMW~TTaJz-_SH=klQwY@9niG^lsYLc$aj( z6aLt8Ww+k*32)=yHhuZ9_Pe~zhT6wF;%{Wv&$G^P_$`<2YOE6R;o!%^fpe{LKCiW} zG}|{hnS1@+dXLL#kKgxg;4D5rZO^QjijRGFrGLr)E2#Q7%el#RNA0#r%VwTzWo~-^ z`tQ@}ebW0@@4nJ6C-uhU-lK}6hQUb;dosWOmySCdDI&LM`g#k^)hi|@a^F7{DRQrC zdur}}{?#cbPx`JrGIxi?&pX%mf0@m3YlE})m&n?@_7LyiDSk?KjrWx=djIh~OR#)R zy2I~(`^)Zq`7^og+V?xJrQTjIm?p-c{r2PjKY`!x^O`?o^*g2Y?D2<<47;D#tuk-# z-FNGi{=$&{8G)hYJ3rlfT`qd_XQu+U(Eoz_C-mRerF?L$fADhu?96uz5?|K+cH6+X zl=Z;NZ@Jf%-@kcz`eF6Qi`VLw=d4`J^ZtpRH|v436HQlL+gf^1F7C$q<()S^@9p26 z|8(}lZ>#OE&-0oo=hOG)#m-8pDIyH|H}Fz~E0yOX9+F#USR zfgKtzuDZP9IzBBnS6%(z>wPm1mYtoO)?S=_CiCv+JKLMCO%-9NZp+_o{z*(ObGl{C zyr_k5bD4i`&$X2f3;OboVahq1e>Q&|eqZ@|PB11|^4@0EuQOx2HJ@pG>f-&&CZny& zaH##=3GvU<^HRm#Oa#gk3V&#v`?J__d+Sn}Tc_SHFgZV?c#pF2dF$+#yX(GKeU#q) zwQl0f?aVs&_cg{hWG`iL$YNLcuXOuLuhqr5;`2q#Ce%;R*z?2S{Sk&!+YZHeXx5+5 z+h85Pzv%viz1ym@%I@8{Fwyvy)S_@FhBLhPOD5G{thb0scP{yz|FC**f=t)YlI_m3=+*jH-PlzdDm&k7~iM|gu*L*{dzKM9U z`QPR%Gd2m{t6y-zrg~!fIp;NRCr&$i*F0tZ=dkILg<`DTZAspa=l@!je7TX&zWa(}KPkuH|=aG&Cq zRc{$LD12R3t&pGjN^9;5xrx)QKK&@WcSt*U>mKpQ&0K%4$1&`vJ}311&El{6H}q%A z2K-#|rp7z`8-v!`w~Ph(Kjvv$Xv@Sc6@D1XAbyLDtF3>Y#!)_=1v=N)e_wm5Z^xfW zzo)s){`$-&+j)jFBvVp-~2XeT6p!%z9$ncxew+3 z+4Fnag;m?w4=6s|{VuwJn#YW3H-Z^Q z_7(iSxatyl7Z|2>)HOF=3 zMXST^&*J8OexTEy_FN`)OWd~WY~L%io3@2)_J1Zbb#DE^yy)V@56VjZJ91w3>|u!5 z&C6c0dO=Gy<2enRNMq%i|I6R8+;V&(=YI5Q)LrfWH?I6HGnl!IqiyA-b93@f+RW77 zdBUdDv}VFRlb0_`Sl(Kzez$ymeOB2OyQRCcyf_+ue%l>YX0yRq)to_2SW@Jq!|QKL z>Ysi2l2jeA;p0KxzieJf>o558Pup!H!$EnMhYi(elrNnI=#2P!SYZ3`Agqpr~9nCz4SwoZMdCm!mS;;b1Ki)>6JeJY|oTG zb9ZCCn4kVl?K9svJ+0sU)|UQr)Xdr_;`7UgPxha^cGvN}vDNBjQy6}nnRh@o=iQ&# z^>yYGzwP%px20a~x_bCLg-<^_=56`ZB5AYl-=qhdGvA&3*7x=8Gq=kV%F)vml{8vU! zs)ld-o8;*^mz|dsvm8F&o_70l-B;)8Tic|TZQd`@J1w8(uJwygk>)-EFF(9~Qv59A z^_Ba56ZP_U<-L5Ua9O%<_gAgYE)7SvY?c1cx+Cn-|B?Nh&7H0*9Pck# zAG-UgoZolJ>|C2yy}kc!ye`)S)~=d;{0wJWejdl}nrXkM&6A#aZ^3T6mvwJ%>4L2}`G|@&lslYuTE&SHm z===II$$(ad56322^K&pg*pfA!F_eR$Ux$O~!M!YTFxy6B(vKy#TpdK24k)L0*6h1w z>LAW^KsnjfZ%rBRg;s_S$4{|M+`TH6<<$3>xt8-MS8Tggn#09(K)#=?-jsVaNc=~h z^_A``f44&=o_FU&zmt=cna-bq&WpraQrJmCQI91LpC6pZ;$7nK`p8GP+8lV(zV)CpNKj z)AOg7t54oY&0FO>^^dE{$HJ}MH&j>-s6`k2Z=KxMb3XptwP~B)Ha)n%y4gJc@2XGN z>LWMwohxS-)>nPf@hPlTYqp}%rdy^tQcMYx*UT|YG_GFn_s_c6G5)2^b)PLcnnugc zn0*s}`C-Z2UvpIM=@h4~SY?}3Y|+keLuLQuDX)u=Modp-CqahY9-L24tJHQ5UHeYq z)9)Fr#`liiDfyUHd~720OL;XJYKOof_`!8M%&I@l~?-o zx8T$qz8{`5vz=%EUAFs8>CvOnWpi$Zp3^H1ee7B$ai#dyQ{g2K%l)#t`4~5xWMhAS z`gE~)jqZ;d@v~;yY(I1LyZB5|zrPk4FB*-mw{5fXhm3+Y-+{3Hk_2QY^x9nkCCn71O_G7Wq-qX?HS2!Ac zOI<#w8!P5}e%Sc`bHS_SO4T#h{`Gjddj4!l{x4}0k5w*R&msM};8oAL|Ec280nyE$ z*1wpc@@a3ut8)ux8eLXNVmYvkYv1DK{=b&LnX|99{;tIDtsjs0rN(goSb4(5`l3zO zYKBEuZJxJQziOTmJ2$q(b3@^OQ9n7QqOh5~U(Vg(D9~dJ(EgWdXFTs*w2AUxzrXWl zFjt)Y%csA*QGdxkrWh5YrE|U}2(RJVm-cp^vAxTa;)fxp)0FBp^Pd*Gyb^1j{MglM z+V)K=1Q}+(XnWv$PxHUtUe>v(*Go@6sb8+bHtX=W{dyDWj^eg*zHKD93ZPUgx${WnPdia)KD-*l9a?ey(T|dST%QKJ5e6)XjyjRX{gZtqN zMeDC-tafhRKe3j3n(Y;p>e#}p_v^}S=pYLHDXQ6h3E- z{`~OGnw^Ut?<@EuHBo=+&QF(J{5Y4-n{Z|!Yy43ShHE90*X&#S??&|Vcej=o-k7eIfKSHJ(VZS}GLnNqc1mh9T_Rd-(b*0_-7ossI_1O7utOqKdoCs+4qC%<)M zut`_H#w%!9r)(dSYsl4LxmWlm!;Vcq&f5sp1n}=Jj{I!A+oQbr?Z27pr1qaPu|gg* zT^H7)Rbg{u#`5Q9{#zFR{>OYU{Tq19bn3=$!7gzdg!hZzJoSB|W3mXtu}{<6S{VcW zDF3+jU~#>Fwe9gw=WojIz7~3T^4nKs|1bEgm(nrXa^|9afUh{)?N9!epS@=(#2 z-WDkQUUu(my4XF@hKiffOYSb;$?eCh|9|e?^a++Z`^zdGKD=iZxqE6)q5%FL-h%L)?G%AP0W@rR#{%kR_KH*wzX^HT!O6(;30p$^IF zo$s}i%-Q#Nnb%#v!@`$-_Lp7UC0+I=!v0%dO3_n(wr#if-H|=sznnKu=Fe99V-IWc z?l3**GhpbFZMIf_|Lfg(t7q}A1LcZE9lmw(6(5eUy#6;?SO+v3``~lsJ&u>sCEtbG zSMRfkh@V@N8)x+M|1NLm$m#h<c+h?wYeOV!pZk_X(@hezR&@ z>l&9gMw(4Nlsz+@Ap=Hm@1m=`fbbo2XWc*U&`#KuYH%j?S5;S(T^(< z3x6Fty@U0@HZul3y-%lBK5KoGD|6lB=l0UH8`6wvscHN3(%zSB$vgY+l3i_7`R+s0 z)jCUNPoJ6dbyt6oNjYy=MbWCJrq7J8j_5Gh@%)cj7yW;#>E1KkH}CE|`RIeu8|mh$ zs$!{W+sk&9FTC+_=4-1y?TXa2bB*)5W#^YvDn{JDapm~G>_`8%T1|uvmKvS8)SOm1 z|4lga=e-}<*UkFtwqaA?%$@x?yiez7y1j5`HuL8__i_JE{WI^CE}7OYdZ(eehkvt8 zIP2@(nx=mjJ-IKo!tV^zgWccOFTK&ruzZI2rtcT`C8oVEzxqbuWbK8+d(-aD4XrOO zdEvL)^Zv>BiaAT%UwGXz-tW8a+;b`R=SRNFpLrSE{VH-O z+lN)frB80uJ-I(`=HGpLHBMaIb+!7~muCn5q{^E2>F9wmfe8+NVGLK+VhZ_iVHH0;d0c!Lek9yHeMldHc`A94XDL z%8U88_jjsw)TZwpdjg*@EYU+6EzN?CmYzwySA9D4srm1Yl(sj%ZPz8f|1Dv*?=!17 znX~fjr|El>r!77HEdK6`iiowbuCp#B@1E)G%6V11bh)tkc@m%~` z_k;JryOg4zzQXLKFKkLqt?}9X?A?E7WBbf?U!?^8?A~H$dn4QOjIpEIvUE99)jQ$; zyb@=w|7~Phe{*x%&EG2}jn`Z|sTa*-r&Z?XFE0JUclsx$gm)KtCmEgNsr~ZZd;PBq zzOk-%^P;o1ryQ-EdGVmzAIq<|{8iHp%s&_CT54qSN#(p=aCh20CF^C&>~F^zIqzFo z^K4Gc!wtM?>lKRU+>2o=2^Vmn5#9 z_{=(bd-~fCH})#YFu%3_X8XT&`B_0bNt+!P|4g1Cc(3?t-0y_rHl=z0+^kC`?BvOC zy7xHVt1Rck{+KyyA1bV4EI697`o!s<-1oV~-cFk*DL=1qr}w#nD^J#~Jbd`%hX;M{ zWE+Z@9+XyFr&6p14kM z6Z1xtane{5o9&8M&scq~pA+%!#rzWn(;q#vFS+|-+FqOYUypq_v_AjzeHl|r%g=Y_ zO`F@qzlOChOgeZe`+>vXKD>2YX`Ekd?*D$u{VfmUwGX$yR7?4PC0A+v&AAQtZ@o;l zW{>{7@0lro-_%{JpO^Ce%XzlfG)S-Pa>)l@Q^VSOpW4fefB&!fxBD}6l(cl>mA8%E zXA19g9yDKnZ+7jo6(^-#_syE=m0>?CxQOA*D)ZUz9-Il=ss8s_O{Mex&}r6}eCJG( z%zVgF&11ReQT{|rz8mZOQcfSAeDZelCn3(8*RRh0`ds!hyKKz7No|%~>eof|{$_9Z z_~wH)Y$(=Z_r}MM`7Wif_ttM&=yCbh6e$M&+vo4S4NIB+MsA2=E1X{0RwR~P z1PzZ0tiv20-MPD^<{-a&>8lNAxBnAq4~&b6ta$s+d6t=UeR+%TjOuMqu0A=`UH<0Y zh5sMUY_{s-*q?D$PD|ZKQ1afMoZEfx{I11HzX|?h{_|#OZ_t14bnV{NLd*|*cmKct zA?w_t4+48@j(SGA_VPsk2s^jv!?8WOrhB!u(=Y}{nRQ`^9k;M#sZ?2?J` z&Vq&$C;ol%ZeKeuR6VxrmF${t|1D!OeWp?}K)PYR{f962&zguc@K>3CJ!Sj2TK$*Y ze?Nn-2g}*Ey#JrQ{H)#QuV-KX_TRPoQvdYNftid2yJ~NLJ+b@tyQd%a{>aGQAH3~K zU|V_7^rcJ>o}G{ieSK?J0>A#7>z7^L{JeMk?)Fb-3w~dnpY6ZKhhNQo+RqffExw+N zADaGFYgp(MFOIz?aQEA6v3KvD>;AU*!(3F_C6Oua`HiFU^tx@6g#~S%q-}^TUVii8 z9jW4|?>67pE+|!HJuvU#?RUL*%Jb!|)=63a_MBwg&p#deU6X88Sq_wFew%6_^RRNw z>{VSiH=aoUo4(R8Re8^UhlQ2jl+Mq*$@C_ub9!58X}MySP}a z$C!It!F_?KtKS$RCRAOvov_`cbgEwo{~2%D${OqZhf`NZ-RoWx+4?VApW%$G&V4&h z&8F4Q-hMcxp87m`*CzIW%v}D4>cih-4n{uwpf#6cJ=2a0W&s8@UtBcH5*Si<*6qy? zEj#jb`kn12x7L_H7tH>4D4~xrB;+>pgX0fp=cW9+lo^=6`*05P&%^HK%h}jwiN$W_ z^4(B7>+_#fW2IZazQ39NKDau`{JGlv=$zBRQU7@@u76{&(5ksC+Ou@e+*pabp$wkY z@hkq= z8$2J**8Bf+PWK^ahRv~4x9&^a*7(Q$$XwxRo19D5YJK6qy`24t&c^rN>dvd5ZvH*V z{h1EO_K%<6MLVs&CCAX-@_yI;r@DWdW3TDS$i0}8@Alz((*E{SkM^Xl{N22Ghkxk$ z50SN&$$Bm6uVd}z8b9^ed~Xipk~hNPDFWZi!h>!zE8Ov)+*--)zv=X$?&kTYd!9eJ z6mZ#L`ySWzty6Q($IjKeSzPz&IcNxUU-RkZ#mnBLhyC#?`xn0Lsd4mw)*aWsF>ILL z>3RH5t8y{lv9l-cuP;6l*SpL0-lE{##howm9Kv2|-Cq4ZMf}F*uhlbFUe_vU`03_x{WSxY(bXPJi?Fo@Z|5nTC2JoAQ&780ymJ}LWOv*}4}K;C}FFEKZM zomXbc2PPxN3{>^JpXfXI^?n{;^xnNBa0pp11DUv+eJu+*!UZKKoW@!WqV#08U1O`*q=` z``F8tJz+bLtkgW`-^?X9C;yvy`EvJL$Aib%&A&)%bnbPk&&*1zw2-;+BVkkJ=R2>z z$wuV7GxFot{<>)A#^O7xc>gio(N1-kQ2aJ=(Uob{{~3yZ+@H7f{cgRPG26W#KCN0; zV|8FlVYJ2PS$|_*oqJx-a?hxo`M=JbxJ}_R-U?4DyYoHV>_>NQS;~fImk*z;pS^bX z;YqyzZSH8RGT3caFJPZ-{r}ng`@T#5>Q6F$JOAX@lT+0@YV0P-Hl%#wG_I)mt9mf~ z@}0?VWnbSu+q+Eh?K!SrW!%4gj;c4$*?Zy6V(Wz1qMHVmHwv9U?`D(!VrXo7n}^-1 z?|c2zsU{jPUY-2*_g=pGZ%Z4KA2NA2kL%rB*6#6~qphF+?6&8BU$uYRl56UdUT-L+ zd!J)h`Gu#O^JXYqdU*Zh^D`H(t=uoG9DA?i?xn+y%gklUUxz;HWa!MyHvh+6u=a>L z^W6*De~<2e%>Slxhv-VddrQk(c0YYDH_OBPcEuHG>Hn2emi=7xE5y8irtq12cLd6Q z>U`I=H8W*&ck=fouU+}ERD4m!il6g3n_umIUs1%eT`D1X z%D;*NhK=qF3|)c@4M{8v3nUmBG~8&yjR<9Sh*|Zlo~1(*z6h1LA=D zz3voMpB+-GAI3l|_e!Duudse`j)oPhisSs(SlnFFSAB7N)gA{1m(aPNtCEhMR4cvH zz3=K{Rwjj2ujX7A*7h@7`8e*&S~-0IhQQG0d*($HZt|41hK*VaZtV>_v3=I6y|r_c85RvegLbZBYxw=Y_xjbNjhE$04#2#k z6&@>N@z#+Y=Klpn^ij}1_j$6fX*0u$n9{-r$yEnqU@$6IbU#cZrNDM&2_s8XBXaL1No=G#_Evdp4Sn20kDC a{(pVOq3*ArpF4o|D0;g3xvX}()PDT1|P7-OyX8iwEcYU61b^pv6d#@W+|K2mN|9D*XThrZJ!@k{n|2Ovj`|{dw zr*#Y$Uagp9$H1W4&cGm|%)oGzgTcX&i6Ni|#%=g9G4ye{arMK4lk5a!EIAr}Y}{RU ztV>oYecG482OLfeNBXrijka~G#Kc@W-l)vMC=gyJl39@BDbLcUz~T@yQ*~0zrQ;3C zoQwkgM*DL9H9M7by?!YOtelZ^NReUB*UQrL*RQR3yE!!M?b`Q$k3D}svE@m* z`#Ik|ANGB_moIDAeNs(^>45j|U;A{-@9xdJ@qGLD({nGL`h3=U{(@xdb9?I!Oqv*f z@ArS3`&NHMXM^l-F%n;1JAYeA)aMJOlGpw1p9!a*{W|@NsOHnZcIn+YzW&(?mp<&f zE>-ru?)Qh_9J7Z43=@CcpRr}>&9sM0E^M`Yn|5lpn&7NEHbH&6E_~km?tj#iD_35f z3tIkr$^W;V^WHPmb)8j{VNwt(*DZg3^>xd-+N@<;-sMa`Ct|sN&-3coAIndeeEvH< zOX>AAvkx`wFe^^@6}SiIi|s1<$1u_TuIuxh_eJl&zna5%#s0KjZmHaA&W0UAi$U&J z3G@86eVLv58ny=?{}u%)JWBuhDeifG>BjHU?Web=&5_7Gq{yHY{42$nSNGD|e?Ci` zn_^=&MV>OzezU*JFUx@8nMJ?wp8Je7ImbFLf*k6kd2aC~OGRzFvU6Na7wv+VWLlp8 zzN2WfN}Sl8pMmKW`+>=6dr-7-girwRAkj(CMh7p}zq33|fy{`-!YCvUXMG%ss% zo2-8FS1#n{&Z3`PPqoAN-p<*7>U`Rq2(Wunm=x9om2dW#d#Wt+fB3f3*VjMQuG)3H zSE=#*lQTRMZ~Wx#^bfY)@pZ>m=W9Q2_6UQMN=n^51y-g5nxE%C*IW8m(Np}?y37Bs z-haK9ElT#j_{#dp*KdcV_5J?qpEYOysp~MSlDQb3O0};m+&8B&Pww$tqm)T!PGr1& ztLHCL$laH%?r~|w3{B@_EBDPcvagMK(zN7H=svT@kfbOn%;4+YzAn?$!|Z13M}14i z2WPUXYF<89UAj4Z*3W%%)lYkmu~(b^yJg6GRC7wZ*rPwW$2zZq0?|k_=)hj+C-dlM7T+R>Lu*^R3($m%YyKJ)`ZL;H^zq#znN99*{ zo`3aY*Z=qL(YnawYuBn?zmLn0QdMW@6D|=?SF!Q!A<9O+V{UGP*6YWPWHBy+P~lJz8Gx0`+UBo z)yj_Rt|z}SdA!|sYG$sC>8k6ix0x+?)WG;I-e2leR%!(Z{D%a zvublJxEfAf-S&)azKQ-H)AjaKG#wJ#Eg6+(Vs<87#89PrRFIeq+{$L;7pZ>@DBm@jiUc z{8QPl%;Hk6%?Y`2deQbHmLfmbp6QtFx~k;#US~DFeaGj^9<=vkn8LO8)%UHE>S?nJ z9%(T2B%j-P;GcEd*F*eO2Y&wBUUgIN+WWtIjCF5cn19&7UM?tYS9IW&r|*0!7tQ`& z`~TtU+WQ@Iq@yICXB+#SF?)CcfdL1&)W zH+DVRv|MlU+sSz!)BShp)_(5Z>TX*7#_8nEr;8gM z*qjRPhA*jQVG;IcMa!)xyMNjham66H>_>s`y40u%`FnNW&s^#0r^sNlee?Gdce;B2 z&-wOp1DkAp^()W*?RobOzY;&MU4BpB`xo#0F#no7P@)AHDN-I5!Ek41_>xa^E6>-N zh_<Gj)sb>2k&y?hMCQr{C+9{)9E z`u{I6cdHtA`W?RxE_XW5Ggy3k!~Eaq>Yl~1T2E|C&wW^OMfIOd%gx}Vg4@5ZTTagX z_vWR?^v#)vtB$vQy?xnF|HE?8vzMPvd_Jf3iFkF6;KyHP+|NG6SXKo|r{7BUdDZ5A z?_0(1k4pEL5|+(X6A!XYzMb=#J=*B~`$|#1nwjE3bKDPWRh|z^vzmNIDZXb>?%Lg^ z`5Utu?Q`=d>-pX(`?0QnIs5L56=@5D^SmYQ9@A4_erkr}RhxT`b2>IN-1swju4vKH zYy6+*dbU1!@cHJW`?(T_q9=&Y@O<;-ZI609+y4LQB74%qzF$>3e8)fiRUC+ap z_=p~GzP{tMdRI#Q#gmU^k91maH;9ynd5AXHX8*39xo7!mpY+=KObM+w%jy_rOzz!K zs9LaM)s<6scHh+#%_*91b+U3gv+U=Tr5-zrZSQU6Y}muKc&|{l_)9svLP-YoE7l+M z=g;=6+i(B*pW3f090^?Fii{Jo)LOrJA8_0fqrB;seY`TkU2nU>3$sbaSOpL_M5<_f`h#tkR;D*G#jGORv3cUPaC z@sB%G82;?y?|#`mBYua6;n#Zgs@kqq?zi;Pi<}zG8YZ4woEc}jdgb}ARt#sJEB}yN zX4(JBb^o^xv3SM_kIr$eWZIy*gYDqIM(MMqRb~vEPRaauq%pJh>2~M3B(?Hm7oN%% z9;*@MuG_!)3}@_znsb~Dm*UvpyqPd}-JioVuY9Rs|EMI#yx?0V`@f^#Zk@6h+&=fK z@1b%@>uaC0^^51Ye-PJB?=oIlG5z}Q3y1fGvT|i-E{jsI{E*ULe5!Qb_32SH+Cg^u zM{?)(T`S)4gNtE1*Mbe_u51(4{LiCsv~o_>9*<`!nl}!rR4sd4vEgb(+fIWG`ETxi zHH~|t|K@f2uWEHOE}NONpZ=9RaL@FdrdwR)MVAYaQy7#ce>|FAZ1y*9Yu@wOe9rRE z?}y!p%$|7n@v=V~p00R2EB3lxz_)dQmAh|i-v3p+%GmI*b?wx`J>Rd#{nIsl|0wUc z!}G#ApR!Lq{M~0bL$5L|PMIBGtNZ@03FpJo>F3t|ZeCo!gV$qw)t=@Zg0T#LKK^>W zP5b!z{pV_`rWB{`%lq_hHP_3fucwMw>z2A6TM+*Cg~RT!{&n9UO?`KNmi7IgUk=XM@NenVAebB2>2i z-TePc&iZAK%+_aEoUhbh{pC~6Rt7E+sR+rZC_-nqqo_ZZCvc$ zUbaBQ+O|6Kx#_t#A~)w~ZrYN&fBD}yY+>n=av zs`vOl4W@+j>z?PfPhR_tefXFtORd9j-%FYPq1|DI-?`o4Yd zW!3L9b&8+vkGcNBedeZncQ%)YfB)!tJh!0F|H;|4zBY1m?pyqP7HIUS&iKZKN2|A; zHkAKWa&{r#HkJSbhBK0m_auMKxa&9b^vwFIE$!c5d9KI=JlkIy{8 zobdIk_neoKmvhTko!-C8$n?A9?tKZ%^WNu_RWtt4x>VNj)70YEGPmBjP6rljKKu8M zkh;nJNq_qVpTGI>;HByDx*cDoCO&-o{HwRbljDthrtHd!?lzybY`?XJ^FOnXdz$~V zYn%!y-W9*|L1yw|VY8XrZ_dbAH+-?@f=tvy{F3Q+mpAX<$~tT<+U@ES#43MH?MEW)t|L9zifz<_%Tn$cd-gj%(Q55=i1c! z(fsNAY#*f0tbV>|yL9~1r**euKOfw4{Quk?i{A^Zv|GAzdUT($Alrd^eb1PD#~KPpkR;U3Ra3>SyzQdE8d^&313nA7<&fk-vH*ncd6?w$LUBRZ4)*hHg$p(}PUPLSD_x7GTx z)vV_DZQG+BPx*hG?by-0+LeFjRoQCIPt<3b@LZnHX78<^Yv<2=bv@yohKma0huzhm z=U%$rwzl;CX|;WK71L+mKCi#05>31NrBE z|J%Lyznd^ad!P!VLB;a9Th|C}yT;q_M5BLs#^$^8q8~C&cy?|J-}6V46Q3>F9XS0# z@$GAsoA`ShzZn-Fi$3`L+pqZ{@4q)Ixe72?D&P6}H8ItU^# z*bd{ZwmWM#p5!^9&i{1%hUR%cKkm*s|H|sg@$GNDzXfm0=k>I3U}605lg-+Dhf&Vj z>bAIJ?d!fLT65?#yqW#}ob4VTmQPDE&s#n`_D8h%%#r?Qb8oVmxRp^Z^bQ`Z@fLnEvdvYF)Eww$>i)$^=-wuf7kIV>-@`G zB_-t4CH8LZed9g%g}a0t8O{`>uRU~qm+F@%FZ!P8*Gx`Mf5m~k2w1GB8P6|jeko!?RuZ}9TKr;n8y0- zA@9FDb6fe<3`~C;4qto9@@t~Z&%dAe7ym5Vu=vRYez!*Hg%!&aL=Q;qel2yc|8b9! zs67J{YlGFp#|g`BWD5J|uarxhI=7AeK+N{<8}CGXINEVXyzG`yN^d;lhSSr2IIm*Z zw=MWsxWybL3)X^kR;#vUH&(`Pf5h?5>>w>-rhLpZc6#F z8GGV3T@RI!HFE3MWr%rlc!uS+=N=i~n?$VNKKMH?V96tPhXj^6AG{K)>vcT0EH+QS zzuQ;tqYcBPGfRRZo*!1tJGxj_kSA{A^M}07zaH%@@);mp!}o45T8)Xg`SjkEu=ZLZp$L%BQmq%5{ExtHs^nzupl_P_I| z?X0#1hzBhzww`h4`9rya0FWnc+UIEO`8)sC%xb-NI@<-$UyagW{q-k*vuxOsVq%b_suzWwb)F$?&^KvZ%PlU^egu3Up>?DYT@=%e@=;TO3gf7VmIm1 zytp^Hr;DdH`G?msjTir|H2MBz)#?v^v7hF6&bl2{y^~!g zgoW|KO|}C~Pabsn|2r?cMtkA9nfo5^In;i7r=Bru|D2l#wI|eN=l^1xJ~!t0@7R~u z&U|6HBUAJ17kgUPqQBqQFP*!*I&02@n!HQ>{5H`!t4dz+ek9PE0R5@iqP5S2m^3AFQQam$81^^+ev@`tqsZAOEV?-O^QdJ;qzYT_|k5 z`|t*pt~c^JZ~OnR{=ebJyIsC1KV-`a&u{g1(enNNFYeus?1?=bS03HmcW%q?bGJ{Q zIQQS~d5!RH-dLNkBqu`RFh}Uhn4;1 z)7%~^Nr`;9xLEF{e)a#G&$pbJ>i2U0p9S@&cKXk%IwHt@#nsyjtD8n^ z_t)OGGyl4OW~1YY!Wph*@eS>IFScH>ylZ~5FRYhmf4;&r@4yWI zYk8XSkLOH#`*$~|;j8n13(hQxFMeIN=k%N};j=A2?R^@(`fJsd_HA=t1wZGRzjfc0 zlfG8lk`)dJ3BEk*D12KqM`+dM{q$c?ZUr`)T%EUpQZ+8uljjz zj-kS%+s(`!^(+hvBp4Yq+!z?T1Q{BVsLd77-jwwxFHPSj;u1TPFGoYfM#SK-gD8_i zScvDujj<{ZA5F63Tj9iTWP-e_RKe|H89x>W9>~ZrLo7$bjfo%Uo=8=#6}ZsK&>?$2 ztve>_5_{u|qruI5i~`nkj2o(sPyOPkQ1$W30%wLJeUTyzeLN6$4|HJoLGO;t3yKVj zPzHwO@3uWd85ow4^76T3@&;?3*dQ+K|6S9;iP|K9j_Jz;^lr+%K1xn20~EAzCT zKcDXXe}3`d!jvQaAO}qCdA(fzvuE+d*ZMEDgS2+#o)x<}Yu+`7B@b)Yo4$E>_9Ikb z!3p>f@`O$07{`?!?J!e+b-N;uZ^S|u3HC)xZFy$!7^n#3k=4!c_ z+afJAOWp<>FD*^qU9#*%<f-nZTb89>a0z5VOQQ){1X#%->&H5 zmE6q7Sdal8GmbLf!j|wgT}f8x&7(Be#}(zJ?*;n=hWG%h8GH^Jldn1?y}WTWd0?P3nwhK==XZwvL*sH z9NhI{+dib>V3E7mK1?rL7qc(vXV+9`>*wn)-CE$xAY=4AJZ@I&zL~RKUxjS*{=I*b z?EX64c*93)^F=soUZtgV9Qn51ZO`mm2iIO$DZ9xp8{~r%J`62e-&&;p`+R5V7JHSK zPB%+`?f>Pzx!HmF@NcEB`CVz&79E!FzT2-X{HL`Q94Nmkn?*Pno^wmTcw=}^(^BnZ zPtUc9`Ttx5x0h@zYf|a$dKr{_=k;yP&zFz8>Uo@sU%Jh)oxvhx8AHIj!WXl`no}mn zO8lQB%y4c^nuvHqT#!}u(wXmHZw$YeQL`ajS?ain$npttvz}E+mvA&Vr!pDDLv@1;UsE$NZl&Kl$%J$vD3!%ARM=kC33%6Ma*zImg>vD)YFRQ5KMRF8jSr z_{%l>V*5JNv@KL3{ci3lJYm1(9@|_Cu7)*w)}Q9T(fsuL|JNN;cyFfPy>T5A43 zU8EGZWykfL;JN?qmM>nORyO~BQAv>CdTq1Y+zMNNYo%{1ys{#0{WQB9^$ilw{+wyw z`r<|Ih0etcD`Il9^FDZfJ{14?m-Ea^pE{RWUamfy9r=p==liv}dv8^DefG$nc>CMG zC-(L`%#%HSwXm$;)^qqgXG74!(7zA|oV%s8sro7JxBJ^ZtX^CEURLMQZ_(u@wZ3Mho&Cykx#VqB>;ralI*XV&`33TE9JdN$R;D zf%ntqUi%q$`E7W9v)>%nh7;e*ZtdA{daIko{=Zkpk@Ljjhr4q{sHlYpvEe9=|`Y>e6A|*>Mb4_2-4Z+Y>+Si?rR^c^Y{a zI=3@;#HXdVmR^f1+-_W{vi^Q3uW^(66x&@+Gy2c0-Tu_pI6sGr@xl73;eU1hzl!$@ zx^+LYw7cd-D#MIVcbb>Vy$+81ce%LqHS4oovTJ#*K8i7DzFV__VMpsM}pRG>vdY2F;B1G=DCi_{u{~N#eUBpE<5{lSJ9UxX6LpX zpK*n^f6v>8+aCMYupQW#F8^ctO0{ddLrzrx>iw)y+8Msv^tK;QUhaRZ^i5}1=Vnhs z3<&f8KmE<@<)tIJ-S2-@RBg!aRTr~joM*7BH`dQ@s$ui0${imqg!358M3W^y|E{(QBd}_}>lh<|($HyY&3O zJumv?CmK92=8t`>H(z7YUsrX0bGh_KIt*t2Q_@>w*8MzOlOCjK`J-lAMP>f94}Hqq zXH>TBt~lPV-+ceSG1ncB{8uW^ZS*f#`iFH*vA%xz?kt8A*5M`Rq#r+66#M^3B*T&& zo1IoMK+z&s_V&d|*yo3$J?fiIA03cb4yt)w=LL4LX4P#Z<|6 z@1F%$_I&D3c;B!4o1>@4{Gg?Z{om7KJcom`A;eg7i#k)+(x+0- zr7ObPWCCKXOILcVG;379FZ1L33Z2_Rm+VsN{`P+>c>GcA9Fsx-YrzBgZ+|nE{WNub zrhR+GrtsaS@L^z4`R{c-wcuf3{U09BFPf}B_w+UMe>u_5j|F%dOr8hseQ{mx<0EYb zvz_0cYcAnR*t#?S`o(m%`LoS$?w)Nt^IrSUqn#qb|H~Im-x@S)>DwYT^_K07DKkIC zY_NFF;*hETf9u(P=ePxHz{9s77wuzGI67A}h&93gu@uX1_B@mDw>KG1Xca%`?mnAi zyZ`A&VdI^~$JT%9l2%*A{qMl?nVXxQ9GGnD_w%)l{_og&?I64NcekjQ&*CorD8aDR z-};08w%2L@GIze+m0!1ccaQArgRD0#&nf?qo@#t_X2>4xUuzF-$PaBiH0$NNnKv{( zq~uN8p3YEx-D0_TrM+m{`}9Dj4)Huuhs5xR8(~ZS7&nMKFMRb;Y3AgoU!3A%W1dw_ zOh}(7`RveveIE-yKfkek|AzYspY>~^;@qn~Go7z0vE25Kzwh6}YqIxWJv{cs8pNXdfkDKmZ7rQ_uZtv4s?-id$F zS@$IP`x?(Z{}vPx z)gQgS=bxSXzNYFysb%b$7kp_q)}1WcD$ZOUV{prJ{((;}&zURVwEWPrJZi9=Yr%op zDPGZ)_b!PPv&bA0p1 z=cTLNvgP0*;k93&L&Dex15;P3UVEx&@zwc9>ZRMm@c~k$sd$deY z>8#wBw9SQDT?{vFmQFI(y}dlz_xY1Q2j3T0=gLfZJLfX*cYTI8?XG6AyZldm-S^bz z=I_M!B`0guPRIPzzi#>~aM>F3@(*{f*4A7ql%DfgxUx8VvPN6ksq#-}7pENgn^v*# zXn5}QWV**EvKrBdepk}s=N7hL`QseAXA2YQxeK2yq> z`idvAA9%HTy2WMVWw-67POmRb&3b2C_IG3bS9#ae&9}J^{7l&*o7C0pe*emfjlmoe zCEIqcOn%hzEPB&_!$)&u+{BxPC`bzwz2fduBhn`66oW{pp_kvs)YApEL~4 zuH1U_he#pAnq601zP#Mbym!T^{o(b~cbDvAcMsjM{*&0ddd-4!5&LfoeEyLu|BdX~9>reZ+em`BAl3y14b+zBh)6uh*8rlAKw@b3&D&l5f|FW_o zbtq!_ws6{hX2kfKg<4E?tl5CzJ1P1eoa{xmuu?hD#aij zHRFAKtLDMDDa-H3OL*MfFIQB__~FargQ3@FF?h)TnGu<{A>qo6)cxT(7Y~0?tbcnc z(f(iH>-+Pzez-E@@5S4nw}oU~_!V~km}GD5|KAzc+G4lfx?jAhe)op=ncOF3%D=xTNTb5P+;&Ml0fz0*>i-{={ZgD_|NEiGuFvQG?2nml zU)OJbYrFlA>^_b8HfhJ>WBwhQogX{@>!0ac*?tvH_x?RE&hTGj?>U{?V?B(E^$V`g zx2b@I~mHoRtKe)*Xn zcV%0U#)iM>-gtaz-S779kX=tFEwMaYR&r{dkz>kpmG|F2ZO)9*{d-7bWr6SMGdGiq z!eY!c11|Z$x@-O3)puFNzWaV%?F^jakqkcadFkg{*Ouhpc^uFBQ>UC~UOD&6JNEM# zKHNCAjeBnK=kNX^FK_())VqB~nz8-5S=(6~-UJpsUhVgB(QV$hMc?mPY@d+5_u*`` zLEra>xW4l|xN>XZYbNYvr2rOXPJId`+lmsNU*+vntOJ*N4;pO>fa z{;#0lwqJ`P&e?o(VyOK0@WAEOa}WJH6Y`#|__(915X1i6=Jz#gb8kd_-<$L3_TQpy zJOBPUIp0`s3|d*1KA{kPnNu|UFAh@rXs zR^(}|#O%8a9(|uGy3B6B-6tu>konH%^9(;biL|V{Ql*@B+jZxw|GprRVQ-wiN3>}>KE**rm(1IOR339Q&J@cnmXV}2-u_1#N#jm8ak-|d;8 z*d(xWYnqGSPPPB(7T2%6uQETBbm9H7Rf>vBG9KRhWqbIy?LrMfmIFNH*R*QZMmzcU zz03G_$lS6_Opc*)dAD!P?X^zMXMd~`3Oc;|PS4MPtL@KzhFspf*wG{O5`WpL+Uxv_ zAF&@OGhfCn!ns{<8K@mK&h>bp2;*^SJ}n?R$@VK*}?7|xVd%b)ILjqf>8 zo48!p`PvUrhTS=x_Di@PWLu|hX+5mj6wFW_wjep9YwoX)#)8{!fB0SKTb};>NBFyd z6LCxuw_c|omP!vg*xq-b`^k|bN3d#d%KFt7Rw+Gl(F{9Iv^Q?fIY05jJ66rITL*vJF7!Cc-*BM9 z;^EXo-|`|SWwhs?-&a1{=20bs%1qCt8_u{7 zj6Jt!g-J6gZ~HrcdTmM0LcJwE&&v#UoBUgP24@7CS6x@l!3ujI?j)tU90scf$zZ^fR|d$Z1G;-;lNw|<^ipXK>i z+U5>3->M&s1zw@m`V(pwzMfb7`o&#tH~UXdP1eoZeDlNVfAcnoGhVMg_`7yxnp+6} z-uQRn%RDZeh*|b|;*@V+lJcYHtrn@-bxX`N?vkz7_e60={{z~`XS|#?!Spfn;x9LM z7wE<)hOY1UwS%u<=T7DDU+X>{6yhAzn$+@?7w~& z*ZV7~=Vvb2xpwRH>I06h0t|C=8FW1O*8O<$|IWc(La%1Mv_7X@vt!O{qu>uGX3Fki zdb$1EviyRZCrkI-pPF~p$N#|DgUi>~CoEIDRsTQgR^_hc$2iYDSNr?pz~-aNyq4cf z@c-V>+@-(}H9yzy_;GgW`^)ak5REX}>-t|tle6wluHnk(o6nVa#4+UTz7%6Q?Mq|7 zE&r5PH?rg7wrd}EDbMf={%D+dKk(kR?IHH{`%cJ|C#2uJc#`wWW3}LU)@PJB8jehl zwmND1-?scf$C>49Z>MVuoz0zA9DYr>GOazP{#ks!f)W4z&4DRV3G2Q8ecWuk)~5CS z{^zUi8U>}?ao8?kzHzfPkN2Vz{|;XI_hbJr{_gkdZo9PIPZa+iv)g6Kr4s#jPx~Hq zq_`{)JO8b8+1>Jcac*V*zFR(@eIxh9qnXQsKHR+6sT@D8h}qW8E&S;B=(nOTcl}$( zwW;QY^s}z5Zo;pAZBl>w%m230{(V`;m~VdmaeC)++YGmc*ouXFw(30O?EhYJdP1eq z`u-`vQw zwI>qh=gqxcP&U|W|Q9=Zhh%@ zk<;H>w&2T`U%zKsth^aj`R4Ywoh$#J<>7JaJFK(mH zYhvctZWE7O8E&&vu{<$q>DQSPv~QLvoLq9QKPcvl=i~f*&&h?4=PWJy`)kT1LD_v1 zzub166#uct-}HIuY&H4Yd=ATPZeDHY?khA9yeIi$lj~*mbFtF{clq63*VyOy|J8?c z%cZwX*}Y?be{=B_Df5Ig>e<_;tS|IC{q5h~7KyLV>nzePuHRW|eJ|DT*Xpw}Kkt27 zd$r2;mGf=CuPck&&PT<+dZH$K+fX2(v*XLN1)XoX%s8*Uyl;Q2*>Xql{13luL|Qd! zoipn97}-{d{5-Y7^lDx8Jt47=Zx1pau}5CO%iw^ro|kg&8W-jRmv=iptJ-Pk!0tuz zpt8fnMSH>mzhCW)i+!>3cl<{K1>{x74PtRuyk!bYg{VDJP5BtOs5ygBjV0ImBi}AE z8nz3e53D;KO)|~Wk-IF|3|l%)Y*1@oWH_OFa;|(xj=byxRze~A!CB|qqOPOKT7`oz zhzL(H9OZ3@iSIk4y|K3Bqk`Cf*5r>f`Xr_xrvU8B(1{I8Y)jZj_0qIFfNvET4d>Bt n9!(5bchQVy4T4$Y&41>`y)Sjd?&g<(Hbi;4`njxgN@xNAsfyRD literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index a6818a97..348d9849 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -170,6 +170,15 @@ OverUnderset: | Phantom: \dfrac{1+\phantom{x^{\blue{2}}} = x}{1+x^{\blue{2}} = x} PrimeSpacing: f'+f_2'+f^{f'} PrimeSuper: x'^2+x'''^2+x'^2_3+x_3'^2 +RelativeUnits: | + \begin{array}{ll} + a\kern1emb^{a\kern1emb^{a\kern1emb}} & + {\footnotesize a\kern1emb^{a\kern1emb^{a\kern1emb}}} \\ + a\mkern18mub^{a\mkern18mub^{a\mkern18mub}} & + {\footnotesize a\mkern18mub^{a\mkern18mub^{a\mkern18mub}}} \\ + \rule{1em}{1em}^{\rule{1em}{1em}}\rule{18mu}{18mu}^{\rule{18mu}{18mu}} & + {\footnotesize\rule{1em}{1em}^{\rule{1em}{1em}}\rule{18mu}{18mu}^{\rule{18mu}{18mu}}} + \end{array} RlapBug: \frac{\rlap{x}}{2} Rule: \rule{1em}{0.5em}\rule{1ex}{2ex}\rule{1em}{1ex}\rule{1em}{0.431ex} SizingBaseline: