From 0e0de2f25f7be11cfb773a5b77dbcc9d4d139886 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 11:35:57 +0200 Subject: [PATCH 1/8] Apply autotickangles also on axes with tickson="boundaries" and axes with showdividers=true --- src/plots/cartesian/axes.js | 65 ++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 1386cb8418c..782751f49c3 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -3748,12 +3748,42 @@ axes.drawLabels = function(gd, ax, opts) { }); }); - if((ax.tickson === 'boundaries' || ax.showdividers) && !opts.secondary) { + // autotickangles + // if there are dividers or ticks on boundaries, the labels will be in between and + // we need to prevent overlap with the next divider/tick. Else the labels will be on + // the ticks and we need to prevent overlap with the next label. + + // TODO should secondary labels also fall into this fix-overlap regime? + var preventOverlapWithTick = (ax.tickson === 'boundaries' || ax.showdividers) && !opts.secondary; + + var vLen = vals.length; + var tickSpacing = Math.abs((vals[vLen - 1].x - vals[0].x) * ax._m) / (vLen - 1); + + var adjacent = preventOverlapWithTick ? tickSpacing / 2 : tickSpacing; + var opposite = preventOverlapWithTick ? ax.ticklen : maxFontSize * 1.25 * maxLines; + var hypotenuse = Math.sqrt(Math.pow(adjacent, 2) + Math.pow(opposite, 2)); + var maxCos = adjacent / hypotenuse; + var autoTickAnglesRadians = ax.autotickangles.map( + function(degrees) { return degrees * Math.PI / 180; } + ); + var angleRadians = autoTickAnglesRadians.find( + function(angle) { return Math.abs(Math.cos(angle)) <= maxCos; } + ); + if(angleRadians === undefined) { + // no angle with smaller cosine than maxCos, just pick the angle with smallest cosine + angleRadians = autoTickAnglesRadians.reduce( + function(currentMax, nextAngle) { + return Math.abs(Math.cos(currentMax)) < Math.abs(Math.cos(nextAngle)) ? currentMax : nextAngle; + } + , autoTickAnglesRadians[0] + ); + } + var newAngle = angleRadians * (180 / Math.PI /* to degrees */); + + if(preventOverlapWithTick) { var gap = 2; if(ax.ticks) gap += ax.tickwidth / 2; - // TODO should secondary labels also fall into this fix-overlap regime? - for(i = 0; i < lbbArray.length; i++) { var xbnd = vals[i].xbnd; var lbb = lbbArray[i]; @@ -3761,14 +3791,11 @@ axes.drawLabels = function(gd, ax, opts) { (xbnd[0] !== null && (lbb.left - ax.l2p(xbnd[0])) < gap) || (xbnd[1] !== null && (ax.l2p(xbnd[1]) - lbb.right) < gap) ) { - autoangle = 90; + autoangle = newAngle; break; } } } else { - var vLen = vals.length; - var tickSpacing = Math.abs((vals[vLen - 1].x - vals[0].x) * ax._m) / (vLen - 1); - var ticklabelposition = ax.ticklabelposition || ''; var has = function(str) { return ticklabelposition.indexOf(str) !== -1; @@ -3779,29 +3806,7 @@ axes.drawLabels = function(gd, ax, opts) { var isBottom = has('bottom'); var isAligned = isBottom || isLeft || isTop || isRight; var pad = !isAligned ? 0 : - (ax.tickwidth || 0) + 2 * TEXTPAD; - - // autotickangles - var adjacent = tickSpacing; - var opposite = maxFontSize * 1.25 * maxLines; - var hypotenuse = Math.sqrt(Math.pow(adjacent, 2) + Math.pow(opposite, 2)); - var maxCos = adjacent / hypotenuse; - var autoTickAnglesRadians = ax.autotickangles.map( - function(degrees) { return degrees * Math.PI / 180; } - ); - var angleRadians = autoTickAnglesRadians.find( - function(angle) { return Math.abs(Math.cos(angle)) <= maxCos; } - ); - if(angleRadians === undefined) { - // no angle with smaller cosine than maxCos, just pick the angle with smallest cosine - angleRadians = autoTickAnglesRadians.reduce( - function(currentMax, nextAngle) { - return Math.abs(Math.cos(currentMax)) < Math.abs(Math.cos(nextAngle)) ? currentMax : nextAngle; - } - , autoTickAnglesRadians[0] - ); - } - var newAngle = angleRadians * (180 / Math.PI /* to degrees */); + (ax.tickwidth || 0) + 2 * TEXTPAD; for(i = 0; i < lbbArray.length - 1; i++) { if(Lib.bBoxIntersect(lbbArray[i], lbbArray[i + 1], pad)) { From 608b945fe73280eda0afca84bb5b5e1b822f0757 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 11:48:23 +0200 Subject: [PATCH 2/8] Add draftlog for PR 6967 --- draftlogs/6967_fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/6967_fix.md diff --git a/draftlogs/6967_fix.md b/draftlogs/6967_fix.md new file mode 100644 index 00000000000..8518c7595e3 --- /dev/null +++ b/draftlogs/6967_fix.md @@ -0,0 +1 @@ + - Apply autotickangles also on axes with tickson='boundaries' or showdividers=true [[#6967](https://github.com/plotly/plotly.js/pull/6967)] From 3465f95222c884e8df56e83c44376e4d737f8376 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 11:58:01 +0200 Subject: [PATCH 3/8] Update baseline image tickson_boundaries.png, now honors autotickangles --- test/image/baselines/tickson_boundaries.png | Bin 31296 -> 31930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/tickson_boundaries.png b/test/image/baselines/tickson_boundaries.png index 0b1c752609e6f84bdcee9c7cbef00dd16f2e1248..4c96e37006f164e761629559a2d1f34f13b7be3e 100644 GIT binary patch literal 31930 zcmeFZXINBQw%s#w_ZLg+WB~`jE&mel{Zr(Tpwb&6Q8s_{1o^?6&Mk0F8n4c+!`f)$GNyB}4 z!E(onErC+F^?paWO_Jw|#H!5h*pjdLilNm4W-fMh-n&`gZB|y+kwYkXl6`c3BxKh# z{vyMs<9wXi_kQK1qmw77ll{IbPmbaw9y}7x_2;{Ek`I3W5$6lieJGjzN){+&2u>2x zz;@Q(KcFo9NYEYf^vCxhAHy(MVT#{B>^sishZojX4Bq>AAKa!Dxej;z=WYIJw12L& zf9{+AGtLI*ct|}_`r9l2`>2m9e;Jk9i$(~WjosF`Bjw+>)SZ}Lc7c=lVtHpKGuLA6 z=Xa+@u8_;a)!vyYYx|EM=4?C6<%egeYgb)5;fG%$TU9uQrmb73S{;f!f4ly2x@N)~ zo8BCh44LrjwM!(}&8rk1^v_Aqv<+{o_2AQ*SYfLxN=iY}+r-aZmF^D$*&iO)*aA1X zow2_Pr9y%Y84JYQ#XlrS&6g<{7Txv7v*n#oG6y@ozdw1_9>wX*qM}EjU+d;2mJWIF zql4dzdf#upan2AD1c?sy*|0&V_PdRciHP@XH&xu!il(qs;-=k1EagJ@PhGTP+FYZlE9G^KTRD z&r)t6PHH~?N#^QaiCL?kE%I9UN$LKH(GxFN@#ESLl=_$of&QnZd5ibgVXLO`Z~PYH zJ98H4uAw~764R_t)JA(s>&~t;nqC@h+BOTDB2#)DC4e#dPVYhHgOb^I_O%CCs^L0$ zAUi{^;ey7ask7hOp5S@D9L1{mDP0$Wmv?LS!`~i#g4ei7kE2Yw+-G|BLv%&{$Z2X7 z!mlF-u?-&?v2nHB&J41F_8(Q;TFK}gvha8l0Z~R2H84+Wf;LGAv8@5-X1WX7>FY4arG^+1D0^lQ!6)7;VwvnN5=E z5@v2Y-?iEqG+}u;``$#3(JYfK#($RUP~Lr z))XnaBgv$XhaQ*z(Awaa4o#u9@2RCvPw-2;`WRO9@Hs6#g8fvSC=0(c%O!aG2CBhE z81A-Tv5`K-h&pq>mZqdPYl+0o6Kz2&~AEER(n)7gTSR6j6 z!SnL);VE=jApc4|YB2a1wttPwnMW>g{un1ZjO++j6h}o!DWOP6KWI*oXdE^7e(yGP49h|thz}*9#~C5E(F%Ny=g~OU!NTKw+n)|c&xyuR z!;8WV=sn(0j=6&k&eEa9VF-ItZsKKWdP#T(b7=>7hXZJWvL9+t04({K53NE7KlyA5 zjGQlz8bsk0utElfin3-a?&JQ`OYiNP`xT!*73Q3t!q*rSDBlq>WpjU2TDhIzCFzhF zU$$A__14mTd@b83N>#}{Al^|Iom4Y%NunQj7r$6obHMt2r4@EY!%?8wuu-rL#toe^j;ob+zb^HQX zFWAw3A2&}6?9xoH_Fd}}+^E5eG=JtXPprd!@ZOdhcFLwZS_-{eeGujS;d6ojrax&v zvW226!p-LHbCe7iU@Q2~pmUoJV|ko0H72uGFtfNI(_hCb_&@B(s-5gGrT0+l@~F=E zg_1dwf7h3jTE+}n2p3XdEnbhuEnTe&_H zL2RPbF&$J@$EvNE!7=3dj?#JDxVBTGK&bD_Lu)Ni4c^#j{BEo;)!(zYKGIa0t+b=d z-{+TnbVG&1`-HxkcX4Zil)fZp{_KZfnn(??Zx&Te=j;bAcJ4BZ*&f@4%S7JItw4__-V3(G#i_|N>rTQ}A@!4`UQD4DaTeft@+@sMPl5g&59y?n*! zfZWYmlJcc?snq1;WaUqSRm5u&Kk`1j@m!rpdGERwT(1}~O0Uct^S#dd$1vSm5lcny z!Um2ol^D8|@*84n)<&P!J=qHL-MTFrdtFOLH~8Rj?tZ&c6B@&*B;RVUU!Rx?JeKcS ze@+W!_56`v&>}c2SJO(B!03@PS#oGU1Hy1Jm(m8~(qwCr|on6sg`|4>n)q>fie z*utT{D(}Xp68%~x7j%`|Sb5`K+HqGIt~7re>XYwS?d%F0&l3x2`ff*Cn)dX_FwSL` zd2XsTmf`eJ-$j9?FOuyUzphSNe;MdmQEmPFPIi^h`Jrz+`MD4nhuEdII2q^AEHM>- zU4~Rsa{9z^N#_jPn(Y;q_#-?j&tG!vt~C@aRBtv{Ecoos|3Y)DY8jrQ_0GG2D-n#e zw`2L_vk_w@808R?6GgvSbcmN|(y%K+`0QJ8@JW?}$3u?b!7x z^_Y*a*uUgdOs=vWlAzE%K?8HZ;k%V@{Gd&=?ut>Es7=r18lUa)M9=x~J8iG+^0sj3 zh0p0>#F_4=0;?XE9ci|GZ$=C>TeQd|){J|#Ij9@kcuU=swraBPNoK?ik*!t?Z)=j% zvY*AZrC`cye$}%$b?fRs-ubaHn;SE{H7VZpPM1ISqT{Xmd|utrn-ei+g0~x<(|qg@ zCE|P~=p@nl`>Jb5P7lk?p=8XQSe}oiU1aHnk#B7hKWj}i^XI<&R%oTx@SH7R3h(mN zX`(r*F4O^6T-~i_)TG2@a^iZLdU#h?*T_`O?)E}v=>#}{j%EHvDsTU_jfDN>_w3}W6^6h>iXs>IrGJfA(7Bp+dvjmO)(?j){Oqe1)ZiMm zsn$hw*kgY2Pq9d*UOlc)s5XroPb=HiIGclgKr^^zb@JLpqxtarmhaA^#iNC%1u%g- z-lXeCGjV(u_?^duF7gxINO~Hg7;%rqA*sI|WXd6nc;P7d?kaXW{wt|=pRbKM7|s7Y zzNFU}5fz1X7-~((Po%vP_JeWbuvYa{qxf@1uu&IB2tHKQBB=VioEs7|!|#{f*CY7k z;y>tinq-D^)hM1C7Ivcf$293fY>ZjcaI`J=HG{0G6yGmqeF}FaZ1dH5->9<&#nFr# zMfC4)+c+QdgS>6d6KF!c2N&WksP_JSUbZEH z#;6LLl+)qzO~GkTy+-f-%OmLf9Bup_}>C@%dUc=R7djhLuLhc9-lQS)Y-7>)7roglB8=IkpHSbWa!7>`$|L-g z`R6D^SI=o?D~BhU9-nN!_^8kCdVHa?nxn@FzkI6(87Z#b4W-s!l>1(mK4!I|ycuMV<-7K4PRgD4M%Sc@`=@dgnjm;8O_&0r zE)6zai?ALo9qM}uc1X9TgE8}zHKSd1{3o#m2#XwM?bm4Kl4@i{ha=K|(ek1@O8cfm z)yAZi2=K#E zt{3_&rIBrCzPH6-E zV7}x%EK(tewPrzCb=U~YQo-g4UV_argW-e#Q9B_kr8BRlBciEL|Dq?KXZ1E`P97P| znfP8QwfqyZmd6vPSg}(3R9`;?cv-9!HCRszN$c3bC*rKwhL)Hg_LNW_Ywgv4^f*WI zPb|;zV-sqwrN}URd&9sS28_bw{#xX%Fxm$LFznTSf%fs2eg*Ro-PR)p1xR6l$4KQT zi574F%k2ZbN2OQOd^8CRpor9ckd9huSAIvym{wb0)JU-XP+qaf1tuyGU_0D9!75mZ zFl$oMC#_UMeLEXy4tqi3{s-jI+99LDNqyRw6_T7J3-Fa;(33$PJf1xNfcA zc`oeC;Zb3@d*-3NXN5ZQBZ~wpwpVeo0^hK0RXreQeQ8{h=|iRok3y3?JP#v1^7KTH zwc-S)xNuva?}eBx6CZ!BWW-4y$$y-K=W8=$KYzud#_n}KI!wK7mjp(q-y2=o$C^ro zVEyi>w+0V#Pv-v(pVHPj)IB_K;og^1v63$Difq4KYri;l@a=0iRc{WDNA{mTo+pJG z`_we2_EUIz4N3sSh8gvZx#s#yWBm71G$UzejH$=l0iVseu8gZZdIYXD%T!8q#}(e= zA-OP%*%weU6g9;*y;lIEoA9S#e^DRGLXj<0`4cTc_$%OzRYxLfP;B=aV<`T*uApQb z8m3rJBrq{xI9}p`1p$wB0`N|+v~sz}DAj#w(&@`p6)xxgEj3*cw3co;!IlaZkWnX{ z#~~jx@8u}t`*jDL`t5c-uQto94)EZdI3ShXn%43y(Dl2!fNDJx$Jtevq!f~FoV1ruSG6_p*v4V0O=#K5-%Z18pxjT z4M&ean4g|9wM6Ng9&a?#pH5G3eN7~E@;n-sAkvXoM;s#!Og!eH8BYQKN3sFL!J@?% zd8AEYpnttNYDVT9S?PX8)r$4oUQe+}@>+bHYm#b4_hPPen4O9oCW*vhx+^tVyiHd} z=U4$9mA@P1IW1)Cij%!ccYTf;tkq6Z(Z|m6n@ezx@RLry&5gpE%^tp)*f+HwEq=~o zAM*&k;kkXSpC4i;70LItUf*BIfu_g#b1|G_mfpS=2Z*iIT3E_`7_IY$uvW@1r|#G8 z_xK*;X%5Evb&izpD7?*`V3YMKV+8=Xj)`#pi-w;&v)!Gt_;jI~t%3nCbFx`omRXgw zMI+re>-2i@PKgP~RMCw%?dkxGwH&F0?$N=NZR_ut&gucN5M$>}kF38BUK& z;5t6T^_N3;#pG)ni}l5cg1M6Z=9%uyRIMc0y6DXi4xdxv1NRm3oUFg*ng6Wb8pI5n zXv(fzNKCxEjub?fdH{TGMv_U)kh@iAA)#jW^8qcnZRekDm@Is3@cQ9L4-$LkKYtJ5 z5X2p}>&Y^x9^^f=Z}~9LgU@fEGAfsK%dO%agMXCt+h2eMCb9hGdcf*PCVpAXL5CP; zR}#B5YqlGaf4kv{kHFkmm>m0M1IE+;R^ZIsfW z>^_#&ck5TOQIw^nrPF|8LlbX|F}IOz{sFX=sRW;PhCA*~8?(gbkHUcUT(g;vr2ZEH zLcW+0as8xb{4tcrcw>0Ch+y^F=!^iSiaaOt7bCwOnOrYsRBnAdvTirq=m!PseZL}y zVOh73oi_1dW1*{h1a&cLe{}0-@H5RBS5w|7gdAF)7cr=pKTGxwK>11ZSu*E|r75{x z1N+Kf^)p)=CJi-fpM)%WO)xY&dD9&(6IHg~E=bH|q`V8-sb_I$45VbR_^csLlM~6| zJ|2#ei9Qo9GVlIQyluw&1dCnK)%(6E3bIk47{=ZheJt0{Hsoz!_q5Gx%Ltn$NPS#p z-hhIP#{}n0$v#}ZI^>z^I99(n5~lRX><&uT#5y@$apAy4{D1IGR<_o3aB1lu~Z#>}^|cI=^ta z&N;|Ne_Fay{hSrMX&B2r7bDvzX4M`)!n_GJ`WSa=ZJsw@t@Lsg`qMYLK+|{^t1o+$ z^o#SbfNmeKytwz9c07;(jy(xi754b%dRPI^7+-$>%|1KAlKy0XQKs3WqmT0dORc9J zynpYvPpTwXCab~YqI+z%#WUcxZ(KTlXz#Zpe5C)oZb);$TZa0a@ZVa1x#C_6hyw-v z_7%qq=w>2nyHeFs!J=Jdj<;j1n=Co=+?GB1k)iOfTyO7cVdG&^FddqP}Rtu*5d@Wpp(8 zwW*&0em#n_SeIYZgr4j;twB{2GddjB0(`Gf8i3>sHxvv5?fsap11?T!``(%!hb8%s zuAL!%V@Qk)6(9P#ciWyE6P7ohX9=w9^mofYMHkp5B~36Hs~kaNg1Zd31LqH>>OY3t zvHIhaJn%34wNYy-f6cj?SoWrnOU@qqx8H&rhiN-NFm_NI%esvkJboqjFqgA}1Rai) z9XkXQIuu=R&_D;(gDEeX5bVV1yk8n!#p{Q!5(q7P&gE=%s_IH0o@PQGs@Xsf$k9BF zn620p2<_S)Q79}+vp=5ZCu$i|y44bqcFACT0+x7&9xeWIKbB>Leg-nYc{}TPmxEX- zg=t;xK>JfrTGaAtHcH&C7^P{clF1&Js&^bt-Dn|mB>=mJqF=42BM7Yv3~Oqwv#HX zj*34Q#u~zCcZ`bfMd|41G$OI~n^lr!kbQg*@CD}%d`At|aC15D-WyF;2@mpV6Yah1 z?(WWcD{81YihqBdE~Uxt+-l8kRs8+;lm+0F$-3gsnLjl4S)cI7>sFo_gaChlTmSsK zEli&^U#zry!GPCNo747kZ_AHwg_cOd37h>&oS5DCyUZLay>DmkFyfkBetgaMf3&;a z;oF=NCd=GtL~EBam0^hOJ?dd?{ni*j$U1SS>Gh)Bn)Nn^hd#0psV+E;UpA=naLMbE zTWS>!SekL0uUu-s`J?bo87U#HE^^LI#VXV#*{uQ!@E1;bXy9vGDo%?OwRAZ z6ug92KD)L64u;Z|gt*q>yTgFemDA3^>#m(KmYHmeW6JvB;=-m(pkR0Vi#R_hb$1ic zEwapI^AEvIK}@EnCVGAz~CWrV91STpyDC`3;n@#`Z)z}(#`iEPW3 zXwe+(?D8_;>%9e#B0L>($q}!#%l~w=PL!Aj53u}MOU?xL-Gy)WGPC#jXR0svxd>us zMZK#0b7syL_x0ju8E~cwzN3%%#*?24Qn~IwDrkJ{*;R-5&n#OIah67WXI*x^R|oa) zw7&AkhZfQSDU-$tQCt7SA8QogT{gF1i4+2fa{6M8y~-{zT`t=(redg0_D<`ub;$4b zlkSZ3$x-HDROoS&J#%)09!XLd`#hQ)@to=91!MGXgWL`mg7$M-hSKso%cRdAB+y_a zzb^;0z_t}&lXOPqOV__?Tm=kd@4@+W7AVziYf+Twsa^Ew}$V{%$UzoSXqtE#McVxnL%%u09o zE8*<<$BU3WEh#e@0li9Nm;9I>M_NNw)nLg(a~$QO@mGN=gMrVi0BTV5h63mj{^!Hz ze-v8(Z@G4cs98G9#o|zz&qa+Dr2Lt7F-Bx?98Ivlh--Zam?n{r2`&Bw9h5U1nPYbB z!*>dQNWL$ts!}>USxRBOBt(Z(`Lu@R|Glmu{A%l9XT|fTF&`hSUAhTHsy}|&=-0(9 z&cDpO2lC86jL035L#-J`g3nziJ(XG|PY8bh7QehXL~)4qZX^2CZ$)CQCJC11*gHHB z0*=<5$x5MTONV_bxcITZrHuXrNEMy$bkm<9t}jisK%CIyL6CSF1InO1sUu2}&kvs> zoXO=}b<~B}slu|Cq4gEp1US<$i`kM+))5Ou!%`^i-rMizg&#t?GDq zB4C33RKRdAPD47q?!@h^0QB*H%0RJY_ztLIMp`sn0jU_bR{Y^l<^6p&PU%^)1R3W| z-n?GQ?9?K9v)V`@m7$45A&DB;)>zrSL=bfhN{ju{^p^mAt5){pBHn&3p$v>7pV{&5 zexblbTtw&hXMhNnpb;R>ETxLh1B&hmfGsFxMdyLTbLz8BR~@Slwfz1*2tlXTx0X6A zA*Wb;YPOZUQPJR%Sq;e11;daLB^o^;N_nb0JI2)^ zyLr}VzPjCZBgz_qmP`REoU$omLhBo3a<()#TL3)Lg>$iySowO}a;~p<5fGV2KKnZ= z-IvD8#-2w?EmU5IjQsQ&VprF-a^NBZa!D%JC*$^a?o5i;II^d2OMVYzc=#YDCZ;9J zpzsakfA6UVd#yEU3Se3HpFspEUZE>!0uYKdKMFf!NmHgjr&DAuLLHvd@PpQOE#Tns z3yLL!uKn`=5|h*Uy-c!cS;Si1ji=fZEb)I`s++GRrC_D=`ib8UkaG64eh&hC1<~U| zlX5#vQ3#ZQR3`_XO|~cS^CdV(NN@f8un75qKHzP9NG2E&aTqYZdz_nsCO9%Q$GMyG zc}lqrkfSkgVRqK18V;{QG2IB+2S1Wh5@&n0Hdf}I;=L2PiTq0llJ^n7*N)!1LV?x8 zKATO|oAWH^HlW^|*vpd$0Ti@{J{l|+Ue}aR3O>YUC_r@Kz!>Qh96#zZ{)D8HT2_Sc z#2bRHvBIj$ozJ=I3^4tRe^37g@U9k6`PVI5N4ZzH&ONjt)NFL`3H%DSSNdDts78*1 z^`fB|7E8yQG(bXj{wwcSNZkTvmprP>9=_-0HAzDJQR~2jR zQ%kReJ|ce$VglTr2?!s9=J{Wp+wO`RJ!7_|EH>mecCO9(I>|mqWQ*8-J*U2;ZCA44sFdL<@-7Z)*2z}zg}8TkPh+tzq_(n1s_hfAvzT!4 z&GC^uvB|UI8;Ba*WuEw~5SU0?%yDaPk1HvFVp0Fz@8AtZ(J5}Eh57bs6lyp#K9Pfz`OaTD*sO8=y3kr zNbyv37xwV(mC)b8nag><65@L9cEYyZiDLd;hagcI+3@&eP+e~Gi^7AP6!d^P?g&I( zcI>}<;CJ|C8{K8kZxTp|Af}iVXPOZq%8*8d_)wq?3}QLhl9?Xj3neJQljQtILA5TX zP)D!1)_*^Z0qRc__zKg$Ux9I>-=RhT9@Wjo#X4bGb#sk=*TkkkfTz^_vWu zPw_Md5Vw6kh@1GTmbnXN1i}eu8~#&-D3Tv8xMbAibINTU4blDUb78kWPA9JT2w z5GiC`_*}d%5rQMYzS8g||Bnz2KH?iZZUx%c!r(uVw>u072!jI0ERxCyAyac?AKhg@ zKC}*cXYm1?S^3-N%5x$R%XwmcB8bL*?yZgg%mGJ}nKl5!;N;iOX`Pj7(C@rlyu9B7Sc`4@O4P5kQ2Uyy42B7`f%X-_qq-nP_}YGH^e!2* zNZ)126+%yEMiPt!vQ)LU;B0^&hF%1X$#QZHP054CF$L*rDUVh z5H{CWtd1Y)FFpS?)SczrA=WDKG@F#`O9su0m!QDZJS`+dyIATlY)WJX z#h2Lkf&oNGRMhGam>7LUY1ZmpVD&s+rwqbW6l@P}x{W`@P>%~$c`Q=} z`uwb;XwmXnj2xNzoURpfHAVRV2dc*eYt!1{vm*TML5EC$D;Nrsca7uX{l5+}i(GyV zn7YJ>-~KmQKQ?FIpk(?iT0CrEhCW|tp!YC5!R zG1az^@A^|?ph3D*Y5+Wc*u4ShIx}j!ktggW$2LKwuEQnOw@a0;3Fg#Tfq)B=^WE9H z$(R!|w4K9&LNIg)$PVK}o(oX`ovQ%L!sPWzp3r&HsK*F&T8YsT@D$hH-rZIY#WM*Q z9?6Q>-I|hXIcj9fCCL>gIg@b@J1bUBRWfr-%=Q(+Cv@`@y;r{R-N>K)1?d3UVr~_> zX5=CD!&fpZUsFt<412Ev?6I?c$t+DHu0GncXgzwm2S~}4z( zU)+q!>ixjs^|NkdH^&glz4@m?)fc}C_A+jQri#fnR^J4$+=Uo3ANM?y9PuK%;%+?` zQ-xlEt*3&x%TV>7q-GL4STeBeeKXV%0S*X&9MPa-G~;{7nSNr3Z+&O0si6=wn>&QceR8~SBB zY%;&cjEGlgx>Y&OBLNp8;-j3kDZmXXADKf1M=fjoj79tqRwd3M);<)}4TdK#qP5gg zlb3~c(YX$Hbd}N7gqwo$D;OX zgWu6eZ*KqrwD=JuHUDo7{{OXW@7V!`!=_wVWtjiKy*1)>(xdb;QM+kP{bt^mTi z4oH9^tLkEqX<8kHYW??XZxkcT>YKuv+ey$Fi4 zZpY`;LY3Mp!@j=L-I+0Ct#4XlY7xvDoO0x`2K(f&}DNpG^d}xA7(~ zp^W%sa_z!|l00uti~?~d2|%Y)nKOsoeq`1f~A4(1kAPZ zUq;f%;Y;$mX6iX7S`IQv_wQjWZ!`-Cp^o|{E>Wz`_)AVuQC)0Ojj*8PBucN*a>yF{ z>?|dzbtK9J5MZ@jh794u3=eH|jshLdCb`6`LvFWH8nE2Dkik%~zQ*Whcc;jT#6VIT zCER}TgS-9Vqlu8&2dsmOKW1y7J2)ZhOwg8qKS%|37g-FvkdjBF3G@QF_-;YKy6eqj zf#aQ;D8fV?pri+KReCB0mea~0@~9k=UAxJ*t{QO`78u{Ik$t(+&dzELMW+h8`x{o5 zFIU~~aJT*$Ek<@&+F_`2WY#wGkoSeaI2Ai%fzFMuBT#a&piGh!deaa2thbo;WQ6m| z@Bgk#2KrmQ{p7ZD5B8_I z1{Vw0ev$dSu|xh5lV*EInLs~-1BEm)tClSSr7y7xA>`qg`S#VaYOE_vKj-C$7$^+1 z_EM+Ev6MjXR0B+y;?8oeuWHC4HaZV7d-FJMV&0qgr2*D%dgey&Mb5q@%-t&tO~jV* z(0Md&_^waHIDKN&ZwyyqKMkr~K{RcXz!l*gZDlNDj)3|H$0uD>X;<$m**wLk{CYRY zj13t{H<|<5m1AN&QY$*QX2%e)8a7br7=1apg?)DAEXMQIvzQxCIaL#%Z5 z)esR6q*7;Fq6H!m5f8%CC=eL}vP+r$SItf+ zI&1?q1Gb@^3ENM{gJ|3A$3yUJ&<6DDy&~cN`JsudTflbnYsoCXl!kCs09p_0o~+n- zx6#LY6k&KIpH_*kAK~7B?`Ttp}b)sker-vG0-C%*xK%LHh3q5(Gyw2$)@O%4xJcqO41 zIp3ipeVpFIs~B3+z(>&fY;Uf{ATHjp_+AixX++-)g~p&5uoWRq(Vn*InTKIMZw0dZ z4@1>F4t)xll>mq#!I?bVmRg16Rmy2JrlFu(?nSG<)NMUrip}M|H2hwKT(cfX+4StV zFd}A&f}%|y=RAE_Q8WJHc?ck$iW^n|ER!HTyzB<@;i1H14#S-mncA;WTu(U{qxGne)20dU2BM zz>)NA^;r$a!3qpUJ9|{aAL9Eqi1gV9CaS>=7EB~k)NG)?I$=;tAv)Gp?;d`sXo!^6 zdEv2I#%^2Qpih&7?f=RR(+t%D^v)ehZ;Nz^DA$-*o}PUqXa^f>wv$?w)NVN!?ZFQg`%Mu*8VA%um&V|haT6=1nQ zlz!+YTPz)prP5dd^WnVy(H!g)chPqci?hg;41{j=&}db7u_oV-J~O8d9a>3LSwLsB zTp>e?>qRg^j~~A?2D%6v>LVCEZ138fxD#YQhQP`UVr#seGU%_?SlXO_#2S5r& zR{KKZo-fk{TZM=H@`Xjh0^4_rMZA5&*#gglvT@(RhXTRP-rUk+L$rd1m&dC@S14{W2kDiSgih*QiR;x1v0=TP$(XG+ z-fueWaJyGrt2n7|_zmq``igj{3Zw>~zuGx$Ji{wQ--3D!VR5GM*Z_cvG9>RoX22!9 z)~&8D3;rP9EuCmMoV@*-e4Bt|3Onj?VgkQ*l%`44Q}9&1VjAkptE!uEL~Mh1|GoYP8iVsN0F9Q%X&P;Dz#UQ0&6w7sGT#4ZoPDtVPtC_(ySroKU zt}dMu0LT02%HaJEG?y~#0w{8OA%h|*gQSO@q96f#ztcKG>wCu6_LnEqfGV;HofO2d z08S7v3;@k(DAnRc?&AMaZW)G(@50Smzb`<0rOCZ4Ic-{Y_Z7}60r@La-$47@j}R?7 zbRk2Cua$gn{`w#!9aGPdq~o{VRzVi&#FeR)j^%dtJPjgTu0K+4MB$>fUM6QFef*nK zSbG%Up?^DqxKUeZ0uD7Z={%ot%hn)nPB#Z+^&=ii>GV8VVs@}S^VJA};AvhZ`o(5SKZ?1*Q9_G)=O z!aV6@(-CaHn*YCgcxZfeZ*JH&7;9>T(Q;r|tLP{c^unAlniqrjsuvobGhej|<>P_H z$q1PGpR4Fn(mgf)piGTdEZjZ!0DOP%4FoXI%56{97+vA%=YBznuyPH$0u=VT0z$!% z^fwb19esP;E)-0#C-581cg9-s0=C276kS2X36^WYcz#75=Mg^T0c?stSD_&QF&MOh zBd-T3p-o+M#h#^aw;+w+;3Oyh*DSU;$nJ_f4mXitO#iPuJ&XL_BM&aM#GE#oUop&^ zK+LJIxcTpns-W|@?6)kU014*$A4^inNb2kTdG?Tu@qa5v_CVb+kK_DTr9-fJGnLHQ zwvGP$y=;_gtu0>S`k6Cl#;4PhqCw`vL!@hcFGjf(a=|v|O@FGjXsk$P-jo)@^+5KL zcc?+lck>6KKKb^Kb1ZnywR9hWuyka5>Rf31S$)N05Fwd94aivqCB}6I8*&m+TQi3@ zz)jd#oZ71eE}(ndUgy|f<+f>_=@`7LnOfv-=OWD)_QFMJ_V9X%zBS!d$S!!0Ub*32 zDRmw?Mt|!Q##rVM^LI5`8=g_fcJ3SAcpjXoc!lZ2a7S~&VS{hUcZ5KPA1hL=lLTj9 zoH8?k6A`Shg&qViaTcfXikN@5CM`Mh$;P3%loiowh0P4_?i7GJL~+7)eMKX_A4CkJ zZZe1Jzv?+hqj1_V&Lvh)$#r2!#_+IVFP!4RqyFfe(Y*CH*Rei}!1ud&k>0@%=YrnS za!h`{sFiu=5G*aeZ^#qo`Tg*ru(N467xUpj zg!%QlqMz!S?Ts3aVk@xU9IA4)EL&ulK@<9qS7&*pJjR$N%KwkS^C#@bb*19vUOxAK zLbkwxuV`2vd2TE2Wj+%;hBKhUd4lt5d?|ook>AnoTg#XEk;tJ=-2oqnx6V(9dw!8)17cQLvqm@mx_PbWZkrWUnj0;ss#D z{N01Us#Az@-O1EpZ)gMOs{wGN_$={YvJsC}m;ja~+unUPyY$M^WZOhW%5!L&lz8m* z41BGp-#LMcpWiXK&h}(;PPNad(s?{@_F3-Mcd9$U)Cl~8-r%*|rI}`L1YHE7PH!VV zyQ!xuxrqDM`UUstg9dpXj#b-tulDKSM5kZ6$uVV_a!1DaFcVWioLF${(~}Wq+tz40z9| zi;JKgdXV?I`xerE41(BbpmfNyJERt*CDuj)EOVL9q>aQ@^{KQW$HW#Q{@r*^o{(gf;1XQ~q)+49ufe-O=QM-Z z@%Yxf@5(o;y6Ykv`!aJ(D*6sHnCJiys4}qwdcRaaX}Yougv&u;x{ovgS_{~h&v~1; zPp8IMY_0ur`eqrU3I`-1z%)R+;nn_bUAMh=-y`x(2@t|qgvqSXF?IsNIlkB;wE8Aw zdbS>(p)1wXD*3L z)jEObO}8AKbp*G?Dl>C%SM00TCplB9x26y&tX@oN>T-?!m(FS7SY?M2HgS97naFx%Y6o^MeS)cl>73!##pN(yYe zx6h$^{mwZ)AmmN99YEHMbjgtSe`M{XY)z6gLlVmog^2lf8V*_MwVg+x)e-Qx!2RSk z2ru4jZG>D)vg_>*v!~IDzjzgzF-}7&)UiI5#NicwNQm^p!!52YFnc)C$B|RB;~`Gj zbeOITSm=NjCXh$I0BS*oPLhHw8L-)_k3W4eb$H|nduG3Xu5tM_BEJzdmjvNME2A=Z zusS&#msB0b4KXg(>SoU0J!rNO`S#xmQVOFFK>VfJf`nA5;r)c)ay6NE?}1fJ*&9Qz zaylHJs2Ow?>}i!bR0eU0B?K!gyF@y<}|=SULc9S03y)N zxQkH>dql9M8ng;%2X830`0gxmAVjmQ+l)8I#+@sNP>P`cNWmuyAd9(yjJUJE%GC$d z73AVaXGC4L{oYhK;|_F?`a^ptoM%xK0E?V%KdJZOF<_crLU|+Hm@_=$R)5@zEG++* zH~o2%j{8>v6TgpM5JAb;`tB3H)A|C)1i`WsI@hjohcb&&&0qZr+irV7T80SHxYc*8 z&g6e^Y7W4uImDCyV9%zo1Wcm>+V|KY60${vIT%wu@_WzK@`D;C(+Pk44~p#rPvmX@i*2`hP+e%nF~m)w_0POV+}aP$D8kSi29Q9pVb?q_XY(1XZ|E$3-n zKul+Y@@{^48mOYj{nhbFw`KhC!D5^P*_&S3T^y2DUuFq8sYaa%PFX;OMxv6COV z16)HSG?bYlR24jK7$@b^Po%|w73gr340aUQoKly> za&S15%Ng^Zx%cdO4UPdzFLSGQ-G&_$(-g_4mZBVL0ip|e0wv=Nz~XP0S^+TA$^i8e z|4-+W4`9wFue|=@hv?qmn3BY2>@tS-6?0;p-OyCo^o0z|_n~UVz}>bjO!A0=5S_<) zopQh1tWYN-3OCnpmP|nUsTbp?I+BDqyopyyJrD1`MTB9{k<-oBrFKxZ>c*sl@1{`# z-62WBUu)kLFDfW0DTVd`weXm3&i6BP`DubcaN1X8+I$AA_az3OL@K>H@L&;<>c8Mp zc&M4p@4U^E@JZY+o1X}GTf2Uc-u*{@!^{sY=!vbGv4R6r-fgCEJStdGzGQ;!-NBFQ zk`mPK0I}Kn^1{0RK^8G}Sy1!M=+1&l?hV93gt=;@IrH~{l3INLtG~zG*>5#2h(Xrv-*(2ZVK+^=hoqQq|AV3gYc!8V+S_b*>Y$uL@8 zc@v3}q5lyt5&$zo{&Z&S1syI-_g9J*YA{R^|C9*C>~yaA8D+nJ4*Y+qDX`)^H!9uo z2cR~Ev?iC#yAK%b38V)U&LC8$!--oi=J22fDKMu|<0-@$%HJ#If)g*J8Z1A!SEWM4x8&ZBq8!SRg!(T|DS4-6&uO7tmneLN( zK@V<}Cx~cwjQZ%=7k`d(9M`YeU_`HG%d;<2U_EsX;v(+Bx4I{ma+jdfCIVRFM^sfR zVeC$j@~9z5-cY6cA|%o4z2*vGfb`x|%rz`-ev$2_P}uGW4vE%>;vy%VIP_DCf9Gzi zahkZ|j$naEpAsS&MSAr>57lub6iH_h2Q8BZM-Qn&t7}^QjYoC1Ad%@#zv|O`UQGp* zyQ!*?Ck>bn-~RQ-fll|ptp$3`e5;_h$wHF=qJV5JA}Dfzfj%i{H196YL$=Qah*x!L zD>7(-eR`9(py^~BnS>d_Vng@&LzQn3C7$CG!rS$@0~517F1#K`^y6Qx=34=YzarR!eZ)n73WL}%HdFl7>66Wsivl8Sus~aeEd!L1qVs4>eumAT1e)WudzdvhIrSm!mmQ zXF(SgOv7>#VFUr@)_-t`piYmR6wZvo6zb&Gw)=kKbeJpdXHI=J*$J? zdEP0^SaaWD*qIE0NyXRY;P_gkjj^Zfs(M4lZd%8iS(60=NkqADI}47g`kq!MP4%M? z|6khs%D1Z4Z*5tE5+V(XbStTdG%RUB2_-kB;ueDrfdva#h*Hui4T6G{fFiLMA*G0P zcPK1agwi2$#?<}3=Q@AD`EstGA92Eb=A2`UXT*Kq&-$qj4ENZ#l>i>u4-j;233azz z^%wP!{Ln6dCOj7vJt_UdoqMU*j zb64kcJtd@WET=q6(@$oxJpASwc_wTAt{N42AiRb~{p|4P01D%6w?hS{5BFSngMv+v z?3h*ID^)`CU%O+o8icCT-6#|yr7ID4&jwPPmjZ~5Ep1MrN&Cz zm2?;fjko@2sGt>3@Q)+`@cTbY{@;GfYCPW&p}CLIyniE<8Gy2JfdH_IsbM%B#vneW zp#^fpR`U0!ZYV>l`Y$o3D%H8=v=;?blGcg+1tujyju0K<%E~S{zJY<5(eL^u19m?x zsBfeXbaXUn0Vu4ljD?;IwnV>e4``9ApCaT}gbug;4h2=8p7^9g0CsR9_+63o8qi)1 zS*0F)rKSs9c?mNQYR$6W>h`y}B@o~h;K2%>)VeKP2QsdnN*WQuMBxoW5SvRd09=CF z41zTWT6%|OC zkQ_w%_{b49OXQ3IaX^1j_v2WsJhM7Px1q7oDx5VqA!=HBTRrbbcb)*Q&=rAn=R#Q) z$Brrmn=j=R>tN_(#sHfDG#ZL!8xy>p`%}7Gpa^Vjt;mz)-N+X6%V_{n*vfk+a2POc z0ZkE75fxxv78gRgfcJfOzgHlkb}j|}!WzGc=cpS|9VV38PW%&VA+ed9CJ+{5a{tt-$}gm0 zEyz5L8eN7)tI^8!9zp#Ps7ccY5#s-Uq2Ftbx_jL`z~TPI3lR6Umy_h<*Ut6`xpB_F zNO=&&Uj#S)OW5SjLHc={r_WfWv=hWE&jHr@z4Qycu&&>vdLRhQM8yu4>os03Xy>hSCn zZrNg}y)*(Sj6Zzy#TNuHKgXTDp*Gp_61DbC>v5O6d+|@h5pcHz;o?da-}RKq-`hCM zFsl$%0pHC6YyQxS)GB(7K3Crcrz$u@82v%tg{vkBunYYxe>TNCyFP+X!bKApn|kJ>eu>i z=rLhieW5Lv^Y*PFg0LNS>%GQsi&);(*wG5FRboi-0aVgFCuGkewpuTbLSSRi+8m(W z2Brm*-5G>%-UFRoR&4D`HSsIbbpjR~qmPIZ6?SWB*ai4+pAkTQVaK}?DD0yr4^}+Z zKt;fk16l%ATO$wuei42t2D%Xl_g=j@x#^3u5|v`RPpXV__6Y!v!WH7X&;vEcW~k7M zQ2o-Wr@%u%#-Al)AEqV2Z;jUZ`R#)GPIbDIn~@uoBF6^28^+%vIm zBIpe?6OV77wQ%cJ?}0LZ%Fh*@sgJmkmMaGX4*Gful{J>{CkGYXh?UlLzH8qbX-vWh zpbV<{hNnLTKcnQsg6ZFJC*sY@@8T{RrSF~Cgie3K4~4alybU(?)yad)yLAW4j+f6^ zIvZb6)=jw2uvfiqFrPkAn9rH;Is$ ziX~sNXSFat?2hzhw0LMz$_Z&*8E_AqLoe8?lq5&OyyV2tf|yqSJ6F8;We@bmQ`Li; z`H4yhy88ZDrSlu6jIXn}Qs(HdArL@968%q_k|P>O^jNVSAYQ6E3BGsmI0@Yq<6?`` z7LJ3Ww%F&P6IWSU)5h*IU@Qwus^(aMd*kI~Z^>zMquWH0HP1y3VeoGsiHnan(|*@5 z^p*nuKmrk*B0R91H|fu^>9#%GTsVP^K`Se4E{{ql`2hjdPC^-cl{jP?Q|XEH*NU(L z8pY<#)lxsfWaLeaI6TIj8xl%uwZ4H0$;o068Sc?(=mhrav`_nemc6km*TUL zDd4KS_zJOt%6QSJ^?WNELm?V^)}l0u8~ShB3J)q|g@@i!;!j#;e__R#FGqm_OO76O7DP_XL!%7gQ(HG7~SnjsUQ#oTuA&AUMS!Osc}o zqc{5ZNjBDktdx3;6#id7yn8|zg&DW7wys`zVOOm^sGPjFTD{k8JG{A9Q!KWr!H=IS z7Ty_&totVUMuZ$Y?o3>~{yx%sgTVcpr2|TC4ME(N@x)ltYN?U}-Gkv*8NRH6i@Z)F z9cAIEOj%IVM$%c#To`TBVfPp_WoOYB8-i5vF6Y>MsraQ3$) zcL4~X>vx7o%vITXbl?YS!gd4YajTm%;bl3*JXJCTIrbuXwRMtv7@{Gyfb* z8nr6g(GUZ|5CKN|qZRfAsvA#bu~s|a_cXtH?Qb)cX6pYA1=XU}O){!;e?rhD6W>NS3JsMfaodxA%2U0Wmmg0R`RrX%!Ve7t(ZmOE-Raf^A*V*XDf-C{VAEJYMY@5^gcEB6Ud_&J>pJc@FMkJ%oUEs*KKOw`tzT+EgBT9{SY`_yyE9X>uABV3zc%7DEr9S9fBfrbPT| zk2KGs`TT3E&Vs`Z65I%~S7zU%APiI&N4b3~^1u^k9o(_<2@{n$;>Uh0cn`&jB|9_{ zdyk%DE?%FrrpBMYVKPaau*<8tyf=NlilFT7VE9W707c_-R3FlNR`P=3lNnMX}K`-xTXNOXM%BN=@ze>6K6pFZP^ z*S=rMZlrhEXT0s*FFu_pgROL_@>*ML$Ex{5{OT&d)=8U4MD3_cZZW4Sy5p%lYxfwb zWa;f05e5^vfCW4HQ@W@zo1CK^>5B5Vct0D^Y_nYsQL8QgD+A> z@``~uoxoGGo3?rpMtOe{68AVV6XmUcW0WmHBx8ebkrx z4yW><=^|*Xd9g#rIi1(O;Cxy^@9fsPci55s5gF#0=~$VQV>I^}JrE7-vB#Gv3`rT? zR>>$%pfk^Z3BPxzLdLArM0T(+U1pN6KU~!3sQ6O<}{JsnMrc450&bnFY= zku$BDkK^AKiP(NYpE`H2vRIPoG3X;Za*}q6Dt<$x<3hnx66)?2Qo(7O$gmL@x6k~H zRS_^8Wfi(zd$e(z*E{$KO^jOI_U7hh;vM^1g;WBwxD{KgN(F{azl$g}X|?P{&!xwn zC}XGliR|u^z$!|nmhVA=^rvH)Pzy5aeD`#FQgl{zKT8e5aPV0+NT?L zf?8CMG`Jy2aizcrCec4&qQ;dNPYqJ3$tq&NHS+aznJvFY7moWm9inviVY*S=HPo^| z{gy)a8XE~6X`7e)Stprpv*x1l^6rVw8(pKHNA-x@sH3}$u~vaY<=L%nWGvMnEZ7{n z2nojdM10U(U7t=v;7e_rMwyT{d(zHZ{GSg#($UvwBE;DI#Hq@TSpNXu^rv%JZ#C zPgacQP49p_DdWb(bDff$M$(UTRv>vXpbBJsqIKJjmxK%-{^lTW zLO?(MF8_zL+pKZ5U)y7tsffQi-%If)3M>ZP4v{ zNb&y8S>b!rD+F9QA`%b@Lml0xUr=#8G-e$I4 z$T7Rlco$Sh7XVrisSJ9rMvNjKsJjQS@N!mCBsDE0a3FCeVL$PYY&fT~lAT;>sC{8h zzk=I2`)R?>#IvL8cAv`GL;ZYgCcGOGm%6I`kI1Vk*zqidN3WdXWtVl~Q%jv>VCsD6 z{8HZhfdz|&i)c_@=Ag?6o?uMJb;@D5>~DkbPyA(S*~}@v$O9P9FL}hzD#WUsffq!rN{d?JfEhjY zWyFWK?o)gx3)Y&QYu?(0PATJPQfj{RC9Bq9{(Lo`{2p3Ammvzn866e_!HlH3f~Qr~ z-!3>-PCs1<`o`q;?8r9f=yGA-nS-fM2J=bxpvH2ZbP>0Ls-yI_Hrimm3y>gy3<f@UV)$k7TwwiP9?oOS*N^m%Ul*dxXav!=)T~3 zsL6QK!d1j_sHDQA3S3pLV--88Ntt6vZ$A#=`4I{kCm-tM}FXZ0mK+zQ3 zx#JXR?6qRg@sd-ToP=!LTouL6Q_sAQ$eo%egwH=GZN0@FmSXabeGdUh__NzC<}?rU zby1?4T#-{FO8X;X$I#)Hxj>m}a)>SxK~ZAN)~D}1(8}CZh+WtAnfx*J@`pFiycv_T zSSRyO@XXla%9&6%AZ-jpB_%3Ykjl`{+;RaD_W~%wgz<7#j2vG_?*QRpMk_ezT1Ve| z`_TlYUpuo}HBGiS@16l!xWoL={wMlVQT3qEl9D%MjLn}}*@S6QGqYd|XPg7S(8~Ae zM%z<8!G@?RQri0$#5`r1w$pqz8dz^f?zl!4o4*%B%?~9jgPd^F<2Pj)61P-VXnhVO zAnpcHPE|EjXa+sJS{q49 zzUBiE71hc!k^UMHY^R+(zc;NVdG`&RhIQIj?&s6X2$S>#X|c>u#W69wD=J;#qkJCh zRWa>+FtcsiUdH4Yix#HPFYtdBp5jn__J?D|;MtAqQWcYC%M42psoaO172dv!gb=PY z;2T3)M)AE_OH6J?H zUmtyqka2TiFH`R8Y6FQx$~Y11&!;5(+Ie>L~40aB#iMb@BUZ z&E>a&)2y~5#Py3&a7M)HcvIG-3guqc>AjQmQU0WSU20P>bqQv?R53&m!E0j!42Am; z45tG>cEY@s-FD^6GH4znNA76@y(-}$gayT;3F7hat6Vr&K{P(#_0rG! zqe)IxOr5P8F|B1Hn(@qqJVUsU`|no{0S98*AZ;S5upQku8&8Q*oEt8PL+($9iX*%0 z9#QFP98u1FTgkN1in&$x990F;5==T1My2zgBGz`gM1%X0;t3Y8l?8@Yxir`ESDy7FbJ|2s0o{wgAHbL(vjr!->;VLY6c4u$Jm zU@bLmDGK{`%-)w7xE0dAKMFb9@6SYk?00eU8V;2FE-e2&dZ4~BubRT@-z?a-yoy0jmeVPsZF7KQ4cv8fq@mKvZi!kh? zS@rl8e*T)ZwKYf&n1GKb?meERedLQM93N&JwG=PE|IZ~dyqM&&`)@nBjZ(wM26a@) z7HmfIYCa{7WvhpM2#FBghE}Lh5p246=xR}7SUTUSCjPc*R$6pli0`Xu$kF!z0NDeL zH#Vyur2V%z&0FUv@e$=KQaXqMlAz8=J6!Fvu!b})?oKWpxAh>87$t^gtj{U{F)}&& z`gtr6mJJ%Hw`JS!p1W1TOGEbGzs`*^w3P>O(d6?s8Z?$hzjB2LyX{Ndf9ygi!au-j zEKY_Cd2%o}C2+co=ZbuP-hML#`>+)H<9vTE{s^u=FIgT0H-#T$%0TdTzA@wf@5Q^Y z$@<*gLR=mGn^6;eS=>RJE$Yw3Tp9iW>7DHyzas$`ZiZZl(0ncAXw09BzcT1|tv?@D zg%!XL^w}UGs66Y8{`X=ZxQ~*g_wNPzlZHavVv*)QsrBdLC_VJ$PTRXQ|E}K|7BTa( viR23MH2$P(P)q&iVgK`G|8JWy&X1(;jiYaPgyPL3@b8Mcu3E9m&4B*`E(>GW literal 31296 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%0DRN(_|?3f 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 From d14cf2b8cc2e0143f3aa6442e30bd369977bf57f Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 13:46:44 +0200 Subject: [PATCH 4/8] Make test "should rotate labels to avoid overlap" more lenient for float and update expected angle --- test/jasmine/tests/axes_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 8a9ff54d1f0..b15a17eaeaf 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4902,7 +4902,7 @@ describe('Test axes', function() { var t = d3Select(this).attr('transform'); var rotate = (t.split('rotate(')[1] || '').split(')')[0]; var angle = rotate.split(',')[0]; - expect(Number(angle)).toBe(exp.angle[i], msg + ' - node ' + i); + expect(Number(angle)).toBeCloseTo(exp.angle[i], msg + ' - node ' + i); }); } @@ -4920,7 +4920,7 @@ describe('Test axes', function() { }) .then(function() { _assert('base - rotated', { - angle: [90, 90, 90] + angle: [30, 30, 30] }); return Plotly.relayout(gd, 'xaxis.range', [-0.4, 1.4]); From 89fa7bba18a7a8f5c6c0486fb5f167baa7339930 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 14:18:04 +0200 Subject: [PATCH 5/8] test "should rotate labels to avoid overlap": Fix toBeCloseTo call and deprecation warnings. --- test/jasmine/tests/axes_test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index b15a17eaeaf..fb12e49f99e 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4896,13 +4896,13 @@ describe('Test axes', function() { function _assert(msg, exp) { var tickLabels = d3SelectAll('.xtick > text'); - expect(tickLabels.size()).toBe(exp.angle.length, msg + ' - # of tick labels'); + expect(tickLabels.size()).withContext(msg + ' - # of tick labels').toBe(exp.angle.length); tickLabels.each(function(_, i) { var t = d3Select(this).attr('transform'); var rotate = (t.split('rotate(')[1] || '').split(')')[0]; var angle = rotate.split(',')[0]; - expect(Number(angle)).toBeCloseTo(exp.angle[i], msg + ' - node ' + i); + expect(Number(angle)).withContext(msg + ' - node ' + i).toBeCloseTo(exp.angle[i], 2); }); } From 4665dde727a3ce86d4224d5f945ecdf9ed94dab3 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 14:40:51 +0200 Subject: [PATCH 6/8] test "should rotate labels to avoid overlap": Fix next failing test --- test/jasmine/tests/axes_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index fb12e49f99e..04173c70326 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4934,7 +4934,7 @@ describe('Test axes', function() { }) .then(function() { _assert('narrow range / wide ticks - rotated', { - angle: [90, 90] + angle: [30, 30] }); }) .then(done, done.fail); From 12ff3e9b42ab250a47610fa62d6cc129b69dedad Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Mon, 15 Apr 2024 16:02:56 +0200 Subject: [PATCH 7/8] Update test "drag to wide-range -> rotate labels" for autotickangles --- test/jasmine/tests/cartesian_interact_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/jasmine/tests/cartesian_interact_test.js b/test/jasmine/tests/cartesian_interact_test.js index 1f9524e7a6f..c2b97c67071 100644 --- a/test/jasmine/tests/cartesian_interact_test.js +++ b/test/jasmine/tests/cartesian_interact_test.js @@ -779,13 +779,13 @@ describe('axis zoom/pan and main plot zoom', function() { function _assertLabels(msg, exp) { var tickLabels = d3Select(gd).selectAll('.xtick > text'); - expect(tickLabels.size()).toBe(exp.angle.length, msg + ' - # of tick labels'); + expect(tickLabels.size()).withContext(msg + ' - # of tick labels').toBe(exp.angle.length); tickLabels.each(function(_, i) { var t = d3Select(this).attr('transform'); var rotate = (t.split('rotate(')[1] || '').split(')')[0]; var angle = rotate.split(',')[0]; - expect(Number(angle)).toBe(exp.angle[i], msg + ' - node ' + i); + expect(Number(angle)).withContext(msg + ' - node ' + i).toBeCloseTo(exp.angle[i], 2); }); var tickLabels2 = d3Select(gd).selectAll('.xtick2 > text'); @@ -813,7 +813,7 @@ describe('axis zoom/pan and main plot zoom', function() { }) .then(function() { return _run('drag to wide-range -> rotates labels', [-340, 0], { - angle: [90, 90, 90, 90, 90, 90, 90], + angle: [30, 30, 30, 30, 30, 30, 30], y: [430, 430] }); }) From 8648bb53da91cc97550714e1e75a54531cf891ad Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi <33888540+archmoj@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:28:04 -0400 Subject: [PATCH 8/8] Update draftlogs/6967_fix.md --- draftlogs/6967_fix.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/draftlogs/6967_fix.md b/draftlogs/6967_fix.md index 8518c7595e3..ff57fc8ba27 100644 --- a/draftlogs/6967_fix.md +++ b/draftlogs/6967_fix.md @@ -1 +1,2 @@ - - Apply autotickangles also on axes with tickson='boundaries' or showdividers=true [[#6967](https://github.com/plotly/plotly.js/pull/6967)] + - Fix applying `autotickangles` on axes with `showdividers` as well as cases where `tickson` is set to "boundaries" [[#6967](https://github.com/plotly/plotly.js/pull/6967)], + with thanks to @my-tien for the contribution!