From d8e6a9ea8fabf35ad6d982c5d29d23f539ac4361 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Tue, 4 Aug 2026 16:00:11 +0200 Subject: [PATCH 1/6] Fixes #7875 by adding an additional major tick at the end of the axis range + all minor ticks between the last visible tick and that helper. Previously, there was already code that added one major tick and one minor tick before tick0. Now the behavior is symmetrical to the axis range end (1 major tick and all minor ticks between that and tick0). We need all minor ticks between the first/last visible tick and the major helper tick so that walking ticklabelindex steps from that helper tick lands on the correct minor tick. --- src/plots/cartesian/axes.js | 86 +++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 1661d8c115c..bf76e5d7272 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -1024,6 +1024,7 @@ axes.calcTicks = function calcTicks(ax, opts) { // the labels are placed at minor ticks (even if invisible) instead of major ticks. var calcMinor = hasMinor || ax._useTicklabelIndex; + var majorDtick = ax.dtick; // calc major first for(var major = 1; major >= (calcMinor ? 0 : 1); major--) { var isMinor = !major; @@ -1041,6 +1042,7 @@ axes.calcTicks = function calcTicks(ax, opts) { axes.prepMinorTicks(mockAx, ax, opts); } else { axes.prepTicks(mockAx, opts); + majorDtick = mockAx.dtick; } // now that we've figured out the auto values for formatting @@ -1067,9 +1069,11 @@ axes.calcTicks = function calcTicks(ax, opts) { var exRng = expandRange(rng); var startTick = exRng[0]; var endTick = exRng[1]; + var visibleEndTick = endTick; // for period axis, there will be an additional major tick after that + var dtick = mockAx.dtick; - var numDtick = isNumeric(mockAx.dtick); - var isDLog = (type === 'log') && !(numDtick || mockAx.dtick.charAt(0) === 'L'); + var numDtick = isNumeric(dtick); + var isDLog = (type === 'log') && !(numDtick || dtick.charAt(0) === 'L'); // find the first tick var x0 = axes.tickFirst(mockAx, opts); @@ -1113,7 +1117,6 @@ axes.calcTicks = function calcTicks(ax, opts) { ) / _dTick) - 1; } - var dtick = mockAx.dtick; var tick0l = (type === 'linear') ? mockAx.r2l(mockAx.tick0) : undefined; if(mockAx.rangebreaks && mockAx._tick0Init !== mockAx.tick0) { @@ -1125,11 +1128,11 @@ axes.calcTicks = function calcTicks(ax, opts) { } if((major || ax._useTicklabelIndex) && isPeriod) { - // if major: add one item to label period before tick0 - // if minor: add one item for ticklabelindex positioning. positionPeriodTicks requires - // at least 2 ticks to calculate the period length, so we add a dummy tick, ensuring - // that if a tick is labeled, there are always at least 2 ticks. - x = axes.tickIncrement(x, dtick, !axrev, calendar); + // add an additional major tick and correspondingly many minor ticks + // before the first major tick to be able to label the period before the first visible ticks. + x = axes.tickIncrement(x, majorDtick, !axrev, calendar); + // same after the last major tick to be able to label the period after the last visible tick. + if (ax._useTicklabelIndex) endTick = axes.tickIncrement(endTick, majorDtick, axrev, calendar); if (major) majorId--; } @@ -1160,6 +1163,11 @@ axes.calcTicks = function calcTicks(ax, opts) { var obj = { value: snapToGrid(x, tick0l, dtick) }; + // mark ticks that were only added for period label positioning as "noTick" so they aren't drawn. + if (axrev ? (x > startTick || x < visibleEndTick) : (x < startTick || x > visibleEndTick)) { + obj.noTick = true; + } + if(major) { // mark first major tick, for showexponent/showtickprefix/showticksuffix 'first' if(x === x0) obj.first = true; @@ -1199,14 +1207,15 @@ axes.calcTicks = function calcTicks(ax, opts) { // check if ticklabelIndex makes sense, otherwise ignore it. // It makes sense if in addition to the always present dummy, there are at least 2 minor ticks // with the required distance to each other. - if(!minorTickVals || minorTickVals.length < 3) { - ax._useTicklabelIndex = false; - } else { - const diff = (minorTickVals[2].value - minorTickVals[1].value) * (isReversed ? -1 : 1); - if(!periodCompatibleWithTickformat(diff, ax.tickformat)) { + const visibleMinorTicks = minorTickVals.filter((minorTick) => minorTick.noTick !== true); + if (ax._useTicklabelIndex) { + if(!visibleMinorTicks || visibleMinorTicks.length < 2) { ax._useTicklabelIndex = false; - // remove previously added tick before tick0 for handling ticklabelindex positioning - minorTickVals = minorTickVals.slice(1); + } else { + const diff = (visibleMinorTicks[1].value - visibleMinorTicks[0].value) * (isReversed ? -1 : 1); + if(!periodCompatibleWithTickformat(diff, ax.tickformat)) { + ax._useTicklabelIndex = false; + } } } @@ -1223,10 +1232,6 @@ axes.calcTicks = function calcTicks(ax, opts) { const labelTickValsAscending = tickVals.concat(filteredMinors) .sort((a, b) => a.value - b.value); - if (isPeriod && tickVals.length) { - // first major tick was just added for period handling - tickVals[0].skipLabel = true; - } tickVals.forEach(function(majorTick) { if (!majorTick.skipLabel) { ticklabelIndex.forEach((labelIndex) => { @@ -1236,18 +1241,26 @@ axes.calcTicks = function calcTicks(ax, opts) { const labeledTickIndex = smallerTicks.length - absLabelIndex - 1; if (absLabelIndex < smallerTicks.length) { const tickToLabel = smallerTicks[labeledTickIndex]; - allTicklabelVals.push(tickToLabel); - if (isPeriod) { - tickToLabel.periodEndTick = smallerTicks[labeledTickIndex + 1]; + const periodEndTick = isPeriod ? smallerTicks[labeledTickIndex + 1] : undefined; + const labelVisible = !tickToLabel.noTick || (periodEndTick && !periodEndTick.noTick); + if (labelVisible) { + allTicklabelVals.push(tickToLabel); + if (periodEndTick && !periodEndTick.noTick) { + tickToLabel.periodEndTick = periodEndTick; + } } } } else { // labelIndex >= 0 const largerTicks = labelTickValsAscending.filter((minorTick) => minorTick.value >= majorTick.value); - if (labelIndex < largerTicks.length) { + if (labelIndex < largerTicks.length && !largerTicks[labelIndex].noTick) { const tickToLabel = largerTicks[labelIndex]; - allTicklabelVals.push(tickToLabel); - if (isPeriod && largerTicks[labelIndex + 1]) { - tickToLabel.periodEndTick = largerTicks[labelIndex + 1]; + const periodEndTick = isPeriod ? largerTicks[labelIndex + 1] : undefined; + const labelVisible = !tickToLabel.noTick || (periodEndTick && !periodEndTick.noTick); + if (labelVisible) { + allTicklabelVals.push(tickToLabel); + if (periodEndTick && !periodEndTick.noTick) { + tickToLabel.periodEndTick = periodEndTick; + } } } } @@ -1267,9 +1280,9 @@ axes.calcTicks = function calcTicks(ax, opts) { if(!allowedToOverlap) { // remove duplicate minors var list = []; - for(var k = 0; k < minorTickVals.length; k++) { - if (findOverlappingTick(minorTickVals[k], tickVals) == null) { - list.push(minorTickVals[k]); + for(var k = 0; k < visibleMinorTicks.length; k++) { + if (findOverlappingTick(visibleMinorTicks[k], tickVals) == null) { + list.push(visibleMinorTicks[k]); } } minorTickVals = list; @@ -1369,6 +1382,7 @@ axes.calcTicks = function calcTicks(ax, opts) { } else { t = { x: _value }; } + t.noTick = tickVals[i].noTick; t.minor = true; minorTicks.push(t); } else { @@ -1377,24 +1391,14 @@ axes.calcTicks = function calcTicks(ax, opts) { if (tickVals[i].skipLabel) { hideLabel(t); } - + t.noTick = tickVals[i].noTick; ticksOut.push(t); } } - if(isPeriod && ax._useTicklabelIndex && minorTicks.length) { - // drop very first minor tick that we added to handle ticklabelindex - minorTicks[0].noTick = true; - } - ticksOut = ticksOut.concat(minorTicks); - ax._inCalcTicks = false; - if(isPeriod && ticksOut.length) { - // drop very first tick that we added to handle period - ticksOut[0].noTick = true; - } - + ticksOut = ticksOut.concat(minorTicks); return ticksOut; }; From d162f017acf8c8d6aeb76a50e8d45d8185e7beb8 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Wed, 1 Jul 2026 13:22:39 +0200 Subject: [PATCH 2/6] minor tick text: If not labeled, set to empty string This is just to be consistent with the way major ticks are set. In axes_test we test for empty string, instead of for undefined. --- src/plots/cartesian/axes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index bf76e5d7272..b6c43e5fca4 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -1380,7 +1380,7 @@ axes.calcTicks = function calcTicks(ax, opts) { if(ax._useTicklabelIndex && allTicklabelVals.indexOf(tickVals[i]) !== -1) { t = setTickLabel(ax, tickVals[i]); } else { - t = { x: _value }; + t = { x: _value, text: ''}; } t.noTick = tickVals[i].noTick; t.minor = true; From 9571c2b360ceb17ddecca8e4f2b8d71bafed69ef Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Thu, 6 Aug 2026 15:53:03 +0200 Subject: [PATCH 3/6] Extend ticklabelindex-2 example to test fix of #7875 (labeling of last period) --- test/image/baselines/ticklabelindex-2.png | Bin 16221 -> 39004 bytes test/image/mocks/ticklabelindex-2.json | 41 +++++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/test/image/baselines/ticklabelindex-2.png b/test/image/baselines/ticklabelindex-2.png index 312a7f077098d6cf281dcbd7aa00059c692eef55..9858e71441b465befc3d71e9e31eb3e3bb6c87d7 100644 GIT binary patch literal 39004 zcma&OcRbba8$ZrLL>Wbja8$CXgzO_BWMq%bY!2Dk=TIqv%^T^hqvUBWR8QC(k zfA@>y{ds>r-|z4D`2FL-@p|3ky081Xp4aobuJcMoN%kx$9Vs3j-dVZ(_f+xlVA^)@6H+4ZpdXED=qtaNU?gx99<2U+3W9`C4~54$ zuqZoAg?k_XMyM@rOC9(OMGKom1nKMt0e;|3wg!Nb=adSQ0zco^`25O|=a zs)YLZgXdI61!zimBk4W9hxbq32?y_l>IRiwL7j{{`3THB^Ev-$UEoLBbp(p0;=)#1 z{qeM5g_np(if^snIFDPt-<63h$8$#8Is9y7xVfL*1%ptx-)DjL$4mH?0H3h-9K3N= zKHLkpV?4AWAxW_hdV&b|f9UhmltyxB{1d6Hs5DyOM+fj<L_l+Vs^C2@76e6fQJnwB zqe&u3Z}=flK)kS#r_>BMLF}<3P*a_*sp`0S!N5ddOB|G)_T*-(4^2v zQQ)9+3F(54Mun@~$M0M8#fNbnR#LIt!@Yw7(k9CPz{Yd39~8n4%;KCn|jK*sfRFsrF*&-JZoUxVM9HgYjf|_`Rhab)Q z+SCuXIFdaM1ZpFX=<$CxL~;@T0zE!X)bNQC)FF&3g!8^DZXOh(9xQE@yJP2Q78pAs zl`8usI7aF6`#~q8nlgj65uK9**NF^&6_Rk;RiL|xn9NMvFrlnqL!y$NC3Hvs24kU( zNPraHC9<&`&+S8#@`xQMgKEl+(cc931R6#)|DC%zz}67#a$}4BjG5?GVOU1~{asQ@44`aDU^W1Hn5Q z>aW+2=b<)0o%;*!bnDF7dw)*O=qY&TgAJejYrK*)rf%0L_6!aYIwu#w5^dgH3BhzcoAJ4nKSq+ZfRGaBb#ZOr9tv zNhB2z)u#{igte6LBdtPblTjK;dy}Oc-~=;Kh2kaP>a>x2aUv-MBXs&N+jEakpBwRm z>MOX8oHiWiuAB@!2;^-xbC2WXjPTGe!Fr|BQ**B47Cfm8Uh(ZS$bSWn@JPOJJRk>r z%WHwqrG}$W4Mc4ErCq&Y z8hIrIXuR)`U-eG@wLn%=i3v2gZ6gMNU|Q^rRsR{523Uq%O4?V)>t6}Nn_4LYYf07% zD8(5E1RT5r8?>dS14jAy4B%Q|=BjWOL)b*;K@?PS}B~86XtRuP#R`;Zz15%@gk1S<_b5E@$7WgDsJ#lGW>>9+Ev+{?*AOP zJ5Zz+GCod8XcUqFyb1(d1dO|oaQ`_@ek7(~lqi0h(^UVl2yig&bIr^*C*x{?S85$S zOKzQ51pEdd;_bTUY&dr;Ntu1`5-rao%eCqDywBkphNj>b0h7-pB7Z)gFRe!LNB+;6Kfk^V`w@}lzEzmI;QK3B z&~|fS(DiVCYdBbN%u-o=JKcM0)Gex&t4Wnmn_cA`EBi+Ve(T7y7jHDakvMo-^Y>>E z^5^GQujDR5?(XRDyjWK@N-O&QY@T-ggJl|MFY>Y$WAgdZ;koLq+#=+@YU;VstF`#& z3sYq)Pfc6>!Hx~Rm`8ct%11JRCld&fo!{>gCln;R3=dXmYksE%E$ppzR=SP3XF2Z& z(eh&Q3aeY*h%DV<-QU|@OLT9USt#qolywNV8u;$JSm>@MSB`nKdTcEr72|G~^cCn0 zpJq)kBK;eV)z}on*A#Np!`POjrCp&H_j;f6z4szCFmk9oCxIpQSjSNfgw4&KX-jll zRc0cOcG`$Bw(T!&MLpg4wY*SGE8ZbYQ7|9GEP)KT?D(>7Z?&~AO`0svu%Vt^yL+nEXMbn#YKUl>X(oB7r2nZw*I}f^9EtmM ztVO>2+O$&WZRF7HnbqVsqsn3%>MgCIlkh7I!2_;4A~8Y3_3<)r*DZ-f_45!9Z{?5^w!_< zZJn9a4eyet^LU(Q&3|5jZI{@MRttR@`KveV@Pz?6ljzo$eLgg&U*2B)aL)<*-lK-v zl;5(eQAoUDdpf@Foh(J3MqYGpfnL9`>w=|P=7aB7%wF{7Y3VsQILwv{yUY!MTc$9s z>V5y&2>CQgmcysNPwniJrNKmrtkd+ecRKwxE{R~~P-mqC~ z^d*8*u^4=Pr9Pd9nYY^>)02J_NFnG_me~I+-pRV_y>&-DtiRAxu%flPyu;(7&rrRl z>Z5mU9B&4lWOs*|w%ULO*l#UjiM6X~SRIH;wDZ>s{8&akdvi57YbN~27S^%KyovqA z#!_mb8p1zf!eoN!21A*p66}fQ;?Z+n~Igkf|~ISr@g9jkMPzcV*yl6}Ww z%YF7eSm7dnC;St)4EC5Cb5UtLWJ?W)2bksh-MFODhiGZJV`K`f`CMoiysox}IHJAE++`@15BH?Zx$IiB&H9dm5u&Ws-j z5t_azG8L(o;92VIU&})=M<3wP>zKnsb+F{t;FLt3LO-*+KKodf(LH^!qTirpC<2X_ zce$BGA^NRdx>~8reBYoflecNI*XpYZ8t&4|}p zdq?on6jzJwi8IRv&P?d+_Ke|f`Cq-WsD99`yNe)SkYAn+isIABSA z2?Aqy__8R8dK%z#_{TZf~9)^Qn2Qmo+0h;^$h*ZUUv_HWAl2u^ z46pCDLL7Be@&lBHyGZmgh==dN=C$Iy_i6`wsLa>KSIg^veF>=~BD?T3&H@w5ty})J zuzHTe26$pjkUAR!zUK4y_g^D6Vd>E8Fy3OX)WK2Dc(L*Eh2W>WonL>oCoL|@Ra{q2 zvfVlR;R}=R2v5zzt=*mZB1H+=t&e291C3~c#ozBjT>Xj$%PitO-ttucz9MqCx3-w* zHpZ@h__HY}5kC9=*Bhtq&SZ)4*etIO@m*Vy`TVkljebM7OqRnzyPCy?K+eKqv8@q4 z_h{DT)5W63*UleH;x5~b{hMX{3ay$85wz_Gf>{gY^0gxCT~f&9x-HCDo#!yH{2Dv- z4dAwx&&s|v^w~DE`JVQ?x5#junk)F?&5t`9^A;hZt1oBAr`zL^T`7{82&y%|y*bb`dOqs4YprRsn!mH{X_D{F~oEarC z%WaFtb0qVUFLPaykS7LM6&B%D*}kYpi1Y`kqen1N>fKK`bJb^ zhBIQ5gk7FzE|s?Om>tP+HnAF9`-N|;$y|w*&aSbD@ISg&g#BfMt!WX@{-xf$8%{^mZ6N~K6T`1?M9WFIfh|PFhqCM+L zq)@$;tC6Sa`hkdcU^Xk+K)A^G(~C@ap7TfEtHE^qrOZ+<2HrdTk|*A9+`lDa&r7K7 z{?1&Q1P-tzF9?FE(Wm|>IK{NxoB;6a~Ikp*dcQHRnzT3#AKpMLCc>vtB>@;5- zAvr`Np*7M5W8qdtP8+-E_%iGHGB9wndVX~t8>Q;#=%oVT+4P79ow;-44GqB2ev7+p z^)pg3=9GQa)PERIiw z(V1g|1A+!%O!5L>GkMpg1qv140ctTpx&kbVF#x)`CJL@K%gCC8CLN6RXfwz3=byOq zrMv(TECCe*nTF2&G3})xG7HF)Y zICceJ0t$UnTyz&z`kNDmKiDmgbB@TYXXyGs2x6bceG)MWax?N2_`E5GA|~1=S&os(Bs{MH{WB2z42B1xoF;^2-k1 zjg|Ra9WP_jEa-eJr%i)%7L%&r`Iu^}RlD!m14(pGQi6Y16(J3aq80zzmbfqqd~?4d z8qy)}-)u_gcpcFUP6D+B#5xvlp7^-GE`I14r?AelziSCozrC{$ws`(!<-#v}P18hT z5D`I96Qa=wACDMHgJA9E16M|r{%;$J6HN+AU4QL^={x1HHku`5R&R@!}9%BWAxo0wk0GF zU1Dmm9jH=#Jkz`tlyuN|qIiR!|A_*RsE%T*Tl=W>o#1$HZIeL2uB1|@r~)R_3aGC< zcFO0&r!7m{^QT-LJt_o{gC?KG_eQEmga$J^^uu?f%1+@5dMWg%2;!(55nX7stbM*LlZ?29zPUEe}n?&@J;0ZMNt^UZNqc4 zY<^91Gv~1M;+T(%u&}em0=5H2?_`2Y4eC4wp~$Ur#4)Hqw}Qhg4?=9fuf%l!01=;3 zEKl-zY(d`qm?H8cO=A9*WX(WzaJ=o;yyU^}pRxwNjOX94B*C8O)MND5Q`+{}ME6!cv17N*OzMVukxwcy0-GQG z3y@gkVo;NWZolU^X5KKtEUyo_u5gq6nEm=onEjm>TKimIflXGTYaDQ0?SVl-1pw3u z*pJm3YPZyL>0#RF1Z=fkP4LDR2lMNL>wZ(x11poKUl%7Pj;wciV<>Q0#OWcPyfW4C zqDcx7rUdzu*W-npG9i@vEh2HtroXV_$EN@&ShJutc$!+byHwM$4&VDhobKNxA4!EK z#FwE$z^Q>2{V{*^{z+=^CBA0h=&5`wHxAJR#6utqv0eZD-E}fdc4*>*Kk{36vM+^7 z44wat+qvh zO10FD4f?n&&jDDI=mz#Z6gZ54>;;bBsTluRh#bg zS5P!r#as^{y1?V+Gpvi5it$|crM`?REKIHWTI>ri*zVxZda`<3eHj&LKiF?NglUAF znXbSkv=yZtm-C1NVGv%gyR z7cP#>&&)WgVoZjz@03Zl$MF|{IQvf2ugId#@HdiY4rm618&~ah#JFSq^74x6hdeeH ztN`lbjHv85tt1(&Dx~!3o$QEf>O4hk zR33dYh^zWqb=pAi)7o#qt#TZ5t1JG{iGPb=9gZ>du>v%P&FosidVZcxnfYKGzm4r& zPfjNML2&vPzTfUT`ZcaDjI$|?4?>=H)uvFCXb&=l_C3B_=<5*e!te)NX@>RYj6ITP z4^VS(%4?AN&sC^SM2eOphx-6Zw15JRQJakBS^$3(Dd>C4Q>6lQYg`v^3#m)t>_Xq$ zHQ|Advq8wdv?$m0QMCl(sKU`=c6FDGTgTRCQWsu|uUTm9A149k>xpj797#W-zP`o) z6H}i~P@bgQ8?*rI$Kd-`iVAXW`oT)hKAppd%Q_8V%Y$iC^Dy=Efw-X282CDl3C4JYThLM84DMUI~tET$wQeR)Q!PDXjWOade$zNHKZFG)n?;6u! zDL?(5wrR^TXO8#)(bzIfZ8XcVD+Jvx*6L;dc=A(aGLdxnd<0M?Xhj=P*N?l{Otq-_ zL}t381r7q0`hXwNV_g2As@yjlQu~-JI{y_6-vt*Ey#vyaVKg^CXE~ID5$oH+^DOVg z?@RYV#tXZ>a;b7EJ?rcAreOTN5H_vtn1DQD&{OTk_SBbF#OQ{fp%W7f3KaD)p9%6i z6A=pdT0ZiPxlDUXK+Y+{_t_jMx&K4#cFh&jXSvqP|J z+`FUF8`W~m$*LrQ1-ajCD+2g`l6!-y-Xg5XQcC=YhV6wM!;r9=OPBkn&MoU@PDpC@Tuf%a0NxG}~ zuEto}TcH>-m%(DE_-2e(`>C3_?U02@;;f;BW#2Oz`Z-5g7zE@#KaMw}bAN1ZSPwq- zrYM%(y*#mpT7ON{y70Ru>&}*C!3=RaL2ooQNcN<0AnE|s&q8!+{Pg8|*~jrWiX#%8 zEETeBDHM}z^p_HB0U&l5TO&R?og;j@UFCAcK)?qf{F5H>EKj)?_=mq>s~_w?b@iw8 zlDi<=su&hFmlpFS9nN}MO<$Q8wGCgp_qSc|uAw)_Q4)d@0iX_^fG%~=qY|djH))hE zN2wri%>aq7>t7nlsd8@lLpAqU1pjm`ImYReNqmK6hD+VnKe2&h49IdF322-0{w1TS z$4&VJ=v{E3$@BMu?K%1kWBV zLx>s>^~^jvGg|OJ#OZ>zW3~`(1LvMDFu@H?jW7VVVD)30{3=Vz_^lp$x;J$zMmEFF zdMDvPV)CdC#$2jC@Po(EJ-osL@&zSlQ9bxn17$ki^q$|DGr>*hFT*yJetMyFyUy;% zpboy3bl@wXp@dpMIo~5?zqL|L5U01|n+O1{y^qTMCpRlf+ZDVVvLV*Uxafr9&oLY} z=h8Np9T#hQ@yjdS_k;_m-H9z2E&jH)5q8A+LYX65f-tK48wB0Bi}mI;K8+%8<7Eg} zD}Z2#m;YPq77Vg%l3&V8`gvw8cPrRR{s-=Fd2h4BkA!do2*K~W5U$ z+*13Q#{E?Gg8-U+Rk);m`e=qXM5K{o_?qYmodRD%`JZCil}(0yv zYX~NzzXA*_UHC2Mi8NvL(rC~1N8i7BFqH=(2WkgjG=M7wjCNgvk&bjJ^Rc>oCiDX@ zMc4T4Dt;9af1uz0+QYzcgoK zk7z z&;rPz6ax(Tq1tWP&Ub&_uuMDf+C$1aULnl_#zw4=UsG~niWBV@rbsmXC857iYglPq z*1qE!wf3Ia0_JnctLwiyj}G-z|%b@X7YM6t6J^+Ri(4)S>UH4 z@|s0$)#~7DZ@dnq_PQN|g`YO@R+ZK5RoA5#uS^N3*0>^PG+(7e3NB1N7^%FmByn_B z_dfJ;SB{trRVDZyY@0>1ad6x^btb$L?d`@>GD_diT~_eBJ!`zM^y*Ta$>Gkjo2{Ui zE3E45XOj{{w8%Ce-HWYe2}3|VL}5iq3tybM^pjAl-@vn=>@m9qmHDn@N~2k}CUu!_ zf>Wrz<5SN0_nuPo+cnbyX*2bk0i*On<7~CRXDJfm$7s1;ZCTR1&p!^O8$H3|93M37 z%yGuwwhFI1*qMjo1l<@O{RCqWG)!@QTgWE6J(QWL-M5^RlcT3MU+t#mY2Aoc zO39e9oXyWSlON9GVy^$GI~Uruz(m5UiK@H)1O>ie>QLqNZP+ zv%t81%B1WG<$%=nJ4A>*(JRA)Rnh$W4s`@F{`(HiP(W4>bqJjP-ndNU4L{f{AT!3l zZrOs^nTk5K1rQ5`c&9-H4r(fII^_mQB#q_&gbvreFazXF0^fS_DjfLSKE(9?gpkt& z6I4o5PQ)S!&p>dQyUOoQ3ph*|yISvQY(1W>&wm%7T(U*WrBHR|JSR)zU1$*&z!oGu z45tDsX8Rv{>3=b@V~wNZ5!T8M1%d&LeZoUjtUJ{}gY>K5nmv`8^_P8`Wx8QvBKw>o zw!iPq@beNGu^c(tDc}#H6z;(Y_gGc_i()z^y=JXe_E6=ALqX@5Q3zuq(h^r#{@v^{ zB|_12mj9v+W`%Tj#H98Mf2;`33;-rZOqXo%$VjLI3!ax|k}lgA00RS2(6gvZr-A51 z^85Dk{F zC|}@pJ+$-Z0xm*l9Z>Ds015Lx_knAkUPE5LzUyq;p6&xL;Ib-eTV15oO>K~CP<)>j z;bMm!&@33X>~FZ!TK(o}tN4MrwB@{F6J#tKNC>Yru9DGCA>i7u>OcD>^~3}3yvd8N zZ`cg~!)-+~YSZNpspvws`VKgs4_2J=frt#EbH0dbwhO=&tP*rbO`A#*`p_7iLEi>X zSQ)*2jTj)D>&Z6ve`EFdB+wl%)VA1{t+UvdskaDzF(A5NYr zD8z%Yf=l=Qx&p@yd#Y?dgq*|KngUM|dK^7@qCc6(Ac@A&{2{cXA+X->cD~jjsH>r~ z#Oal`4&f^hQq2xU^qfDBE4bOa0u&`o-{T%9z1wzbU#i(vTwL{yLa9P%{P3>=hryBa zDTRtHWM17SxpyDFO`L9lLrBgc5TDg~7VQF5DimBazY&i}2J~f8=h2#+wQEnssC=CE zgns}!R5wP1b-1TW!STIjDTHW0LWbmxYx)It!nf)!Xh1-UG+5oi(Lcx^-TbaQSC4A!w)e{Cww-J?X05m z0VXG@AmBChN(yjwLSi2Zit1YqluVYDP3 z$R_@`#>@|$jZX-OU=;HT1Q2Nuhf|*EfD6`EpfF0whJvC_JZH^Ujl8hhzp?;>NgyTV zC`qCk54hzM#`$ai*POVJX`Pko?NbL#JqBbmhlZZ91B(}iSOM~W7Z`CCMsm*pjJ_I= zhetALkRtug1oB9bzssDlJfX^+LZX*?Tf9$eL#GyM2u^L!Bftl#PKka1)8DeQ_BdCY zMA9JSlc+L&YeCdGJowPrA+zZ%geeG>!01mDWzbY47zE&NeQQh-H<&h(Ht4sL)-D$q z^}p!``B!D4RRb&Q$2-A1I)_gQU)325O;1L6rNxznlN-yH6%u+fU= zvrro17yU2dH9q<*tjmP%RLH+lYhfkLR>QAWf#Xbn6*BiVj zlkLdC%qqqU3<7@jW=E<6$CfiT!JpFC3*5XYY3yz5p06OMXmXbBcJX3qx}Or0wQgQt{r~$B{_;=Ub9SAX}opmjswMTp`GHc(GSOYkHgzFQ&Gyu z?GT%l%>ljLOANnhjI0t;S9Td@;GdbG?1x60mAt%sK1h#tgnO7}&p(|A9ZCgkDWJD+ z2Kt&imISZ=-M53F#`FPdeLTzCj8*i`=-9sX*=ff3{zCoXT&`}I zlql~!p!pr@-L>;Hx!X;E4`w=@4)pyWGEs7m$ckxDl^S@Uw_uQwc~GuYqFJEZ^u_1E z5X3X|BCh#PMNyfL+^3>41A?uGx>BVI0Pz~v1}%@8Eil&UKW5$a({%_G9y!WCf}CE* z$s%JwG>|^dQ)Sgc^^=geFONE zYNPf1i|G4grsTy}6s4xX16;=;yw0yf!V@mwU*SB+*!>qzqMa)z2I7BNFsiuqnLtqT zTtx$D2dDY?&Ji72m=CD>T=gV-C=TwwI-=o?3&4(<78Z$gzWY{Kb8w$$`ldR*f&1Or z&^0kj`VAz9udoA8`OQ458>~?E(I>n4v5upd-TqPk1s?rhk8ai8@tIYLp`?ObMeY^g zDrm%_rSZ^>WWR~i4Qt9D&r;lPxa|}MlkH+T_|^TjKjX}kRev>P$Ckv4th64$2drKPw?WWa6EL_wwEqJc`7Usk zy<1NDDVnWL!L{MJ&CUcfKjrtY3g^A65I2~~`e94ll6LrVgHm?#(Cm@vU!NIg-B6Ze z2PDN`4d9@PxTUHn5h*ud4fz!Yi*o|+_4MdHe|+e}%wjed16}%jdp!H>Cp|Hi+tr4u zf1slBbl|Au7eA^41JU>oBcxQEkz(`FB4}~NIO0K_F1?@=ZLR-jCPK;qc@&-v=eg_Z z4^d52B#DTJZNP3HQ-_(mB`*Nc!*J|Qb$-t&JO?Y81Ba<0c#Rn7|4Wpem+}GrYy{I= zYbfQ%tyji;g;f1KI)!wyas+77hB*?56NdhDoTw~yB1c;F{v6foR61-Srx*UdPUkoG zkO-VU0_>FFUMVnrzfWH~M6ItrrHJ+@{kTWa{oTgQ`ZZz-peYXfFW~^$qbi0{3xkC! z{YS^@68YH*e;ntF{>D4m?l-rS0O)lOJbYznMZJa+md}?D`|p%@vH%jK?0xJ=%R!#> zT%WZXFR;rH2E`B10iz?N|KWlFGZL5`b^-l_l#rv5)Z)Af=)53_hmZnb6GVnGWXmye zy@61MG=HsF4uV6?@5(;*4fPPCp(=D-yM($Ne3at88^fO?`kG^^{o_$fi!F$=Drioh zhw$Vwq3&%COxCH(mRCKNY&_od;Xpa$ZXFr5=O8!+3dpX3$SkWbg^T2#1{}7r1fpMT z#KgwEry5$2qdlTZ@+;2(dEbI?AwOF$K+A`uzbnsd<69kKC|IO$JRDgJt&I#G8t?Q; ztfBTV-B?Kd=7hZJ_JKH?g`ER73nbY+d;>ztUttp#ZQJZ;2IY>960;z3^VedQe~lo7bYtMRIw)-0;|&G+6)#}#P;d5? z;{I;KA{#U89GhUH>XoD1Ir<|>r`&et!t&f>^*!Mu#!X=6Y9%oN`Ri9XWz^r1wd2* zK1Ff=7;pt%AgquEfhnPOls)xPc^oN^N|CDzK>uHG$tb5^yVANPZv~@MEl&?0mTT4MSCdcCNUitIuKH-dqL$oq@ln!fcWiyB98x#-+srKsFD-j zh2qER>lt^UW9fr|>H*y?Yh)dv8YM|8f-&zNDoWN?6AH|!RpA%-L^8ac;_s~75aB#RTsAq+BtUNIu*Lv4i6n^8vY%Fk@+^9S00cXa;yLTIJeN zb;9*xfbBdNyWgB(yZDts6Da!u<>Q+~DnDxK&-o(^fU1^GCQ10#Z_Hx90Dw@%6$8Hn z10muwR3~9BZPQPD&3__QtowuG<-O%r*aZk*fcny_ zK|R-?Ali>Lv>ikfb+!fGI}GEZXAI_5f8He_Hm@ePcNuW5Bf%@3E|e%Wzr0iYh~0OrdRMBH%)6$wz0 z-*qLE%fNz=6d>x-0oh%;!@6rd8`r&4_z2|oyni%gEME%4BY>HK{kC|h{~ZMdc(3vO z9}G8w6us@nT(2#wmnN+8Z217@Ytmdz$f8QowC1jiSn)cx$cN-n;w^7Ye*ybE8Dqa9 z;KFkUF1yV2+&p#W7Lq_(T3QqEpqL0pan9H?v0Cpt2Lzg2Y-41GZ7Z_40%Q4+<=n$A z_?7bobk9%ML%kvugN)5%edb_5oT z76NQ*;lt0i4#0b>TAu2ux4EEv@}$hfGf-><@hcIVNb7)#v5sxzr`^sGUO~>QT7-82 zB%uj^kxmEs8lIz=dep;2uV$-9Y!TA(QQcmrD&bY~2*kblyC@Cxi)B#7xAFV?JD5T! zt{;yujSY;^q?y$LZ2dL-7BDM5g!PQxJv0SAADk}bN+n2;H4F!IyZ_UCHwi_-ofG*` z$PYd9kvCKkMdL$ceUxYesFLI<7nV7~v}`;)Q2)U5y0{)*7>wV#r+BEsMm8l=oeG@`-qRQjy-fL)?a8?J*5KB-Z}QEv zeBP`Gv?|HoR>NV%Op+&0)8*^Hdz`c>t!Phx5^@Z`P2bZ5&Ozo-Uo@!N8KO1x3Ol4J zlOcpbf@_o^yBEfO4XhO`jtXFjwV8~9%&%<;f~ z0jbftrFaj&4%e0j;4T2(AYkjGkwYu+RDE_Garkn-FHt@~Aq9jbePtG%Pc#CD;GtL1 zX$z|?pkz;7)2LHy3+l{JcXf!CY7~T>r57lV=GNQE6s0CS$q%#9Lo!5|<4<3iPy>5O z7C6&%(m*-^DO=?to6vuhjT}-olzcR9`;>KZV}DRq+X8i`uqHh58wKV3 zkYaUrLq)c(pwmToZK-Z+ta}!;Zd8CGUhNP@v4u!Ar4rDdv7E66iluC?%DgTXR}YwK8k%B^Z*qoCyQ@_u8FAF4thdI z_8SgA?}==UI4%DD6;cV+Jb_{wo$BgN@!hsq5aWLt?A0zR0CD+27d!{WaY5LXPQTYi)d>$%3!u@L)Ibb;JIqp65czmjr?k16pofQ~Ubu zOul767L-Ym3w;)v5Ct{in@zNa12#o<(`}x(Mk*z7!Lg_B#I`3RGS@pE9KbB8`E`pY=HDchh68^8rLGxhmgYB6PpRIw%AuiKfi^KiqZEua|>RQT`JJ+|rY9(qb zZ-bpo(G%TjYK!GV7S(M!wiK2z5Xp7K|78lU`JlCjj6G!XUJpC}(&{I$O7?&%>CNV| ztg3RF5&pF&2~UOrISbm2{Jz}iY?4~KRE|~3^p9>Xqrd+gRHP1VaeVE6Rb0q(P5jxN z3qeBYXph?P{)G3+%1JSQx9=x?+5HGW9ZiS0g^dBOj;^Xmp7Z-)xOf{~f6AY!))<@e zwi{+G)M_{SQl*G3JXRe&w5LJ)Q=&VV+z=Ku%ERQfBDwpC>0sh=@v4SqpFiR{8fr}` zHvW|0X%@xf&Xi|0)LE!qa`#<^)T(%$vy9iZ?KP_8&%VhJ$V+Fg<#++hvMH=;K6U1z z5hz)AEgdzFN6OnL^bmSy_v#loxcvn>t|-`G=r-!Ys`-2HgbUDAUtcp1vldcxieX=l z+9pxg04Fvjaqx!%Te@>uz2Xd42xzU}=?-10?Dp1NLS7n5t`@AQneWQ@^f{?deb-sA z0P|;ZA0rad|B-CZ>l(M05F45pwgaD|=h%@+S^D5u){`OTB3-lGD_!@AT;#p|VuZ5z zP45-^_dj0TiXrTENgU89@YK0o;4CRa`85?`R;e(0Ki|G~Zny+^g*M~U-{?SmLH%ep zezd}-AG6je(csKH>X({#YUvp`$Jou@r30Z+as64WxA^Ul)JN#rYfxjQ(~?#iMOyvO z;W7*5d63|ZrE#6@ZW;sG;qEU2uNg%8Mp{ujp<|%2&ULL_Fy1cV!6TIr&!<4q66JPe zg2;83Vq^HifCk@(G?@O;s7t?oNBbus4#vSNp%o}UPNH4X!u58|EmHI?%ii25g@v-k({Pp1%G+BtlcZOjQ2#y6yp8{%qbD*@UEAurr@@-b&PiEa$2;pL!i7X~O!C2aH1)`YK=H`}%TV0V30oJlt+bp^6R_5|{j zV))jer5j)pN8lzx1#k48z?eNULcYe9hVwSZRdT=qmjWEn5*PUF*s+*iFyes~0zb<6 zffMKB0qGC^mJKxpULV(dPDu`ieNuk4;>d%8A57rhZfD=DWh4FPs}z0!OiMa`DiZSX z07e&+-7EAV)MmDF-0x}s`{$RFZhVefmhO1HH(%i|AR3I8p*R2IxX-a6;yc;1Gv4R2 z+;4)OI^CHp)o31lP+Bq>CTRq!L*G>Rh;U1l`n7?|fCx2=eZ#)M)J~_!vS{n3(^?|| z#Q^9)ioKO=d%aZA{M|h|!jBMc2*vb-aC2Uq9j&Qc+eJY|yr489sLRB`VX#ZAE7ioEAXwZ>tS+($k-(u^-0fqmsNg2hB|FLL1Po$caYuCa467VgI_j++c5!=n@SP+?lR>fJE05ZpdwoF^@D) zukHKqgW z+gwhTFmZzwHgl@r8t|h5i@NO%eFt!x7G81L~Z%3h!~FW{lrFK{!vuINwqxc1IA|ZMGQ+cT91CLKgkJ@7U}y;2z3;mPnqTV+s4;f4q=u|1vWdn zM17@X@lo&j+PSv1sTf1o=7_^RFmtA%UqAUia63*gi7nam2<+TGR4SdA=W|=vtg96C zVPW&TjTZ(=1l*P$&Fq6lwMBd1-FWt8U`q!J>o#@ufaBp)7P|wEsCa*)$d`YAXD|6+ zoz)Zg>DHbva(`QsL8bX1ICmuII&$ntx3B#pgGI}g0m%0V8=KucYW(rp>Ff4eb-UHz z;tv81_(6CFY8!T08W}uT36Rh>2|>qe7I9>GFsZu|eaYPgLY^nInq%m$rpfo-naz?n z5Pr=lHq;~Hy7%Xc2r?7nWWmwpN}&>$>8jwDy*ZNgbD!Gd(#d&%om>18vJF6iuJe~8H0&{au!g0J9J9^{NAlqunC>5 zrP21Y!o8Wfd2^1yW{V7eII|`T^r1b^8uiv^xYfb7N}l&PG=t+ zkDf7Ra~OKGl!v#1<` zl+KjjW8*zcK6;WEc3(1&UlOOAlL z49nCsC(=C)$wgNXP?vy0nR-_WLDlrAQ>WNwhsg3B7hc8C8&Fvi)TEe0JCPc|=;%kZ z&GwB-_Ofxrb;WMWSqRk3_vEO}?moEM8qHmHT`?|QakX24H4{IrR6vNy#n7 z+yIqU8==J8>?j4Lm^}mhDFEpTfZ6Kc+DNygcNp7Sl|}9VoWHkPxS*gB!y7-`w|q{5 zLRd#N#KxpfT{Fskp2asQ{C#ca?|WGQ?$H&jhQ6(&HB;bGF**3Q_LNBsy+Dxvd+={= z^PF)P{ymH8A$ML-7nQfl05mz%NK)+4kb@0t-mYb&iik&@79y?8F!9ISsqw?D!vn+S z6vfs|I%mpcQTI}Ik}iBj;!K5K7K1q*jiXaE@LX1F5T@`&Nm>9(7vpSUzmXfC6$Bbl zz}F2ZJxMn}LmAjitl6zZDjUC!5t?jE29IP>(2V-Y`FhdDY-4))68?SjIc8Pm&}i(w z-5g8H^+r`hP7Rrz>#>r^A>maLR!)Z z!sZIcgf{Nyu)@Xj+I&Yn-@&ycBZd&$oD-@yGFpA?euBFck4X&=KW8)YzC=W5UMn_R zR=p0H8w9(t@%EZ|%A#7`V^Zq!M5`pb1x?huMr~vcqjr0L?Ig1reU(+k*_u{PI2Mzh zqP%97ij?{A2n1}3#8cwlJ8xl3?VaXqo%+plAF!Ll7^EKdeNFppS>}ZF7UG+%S+77I zW9Fnwt0~~JGLZR0zFx+EXgT^1a9;*Z@; z^Dp$AUg|UW;4f0x4?^#^c z{jk#GXYJ(Ht2OG{oPfI@{5|TOSL73ljF|t_kqd*bg79u3$n{I1{}n^DySX_3Nd9|< zdar)#yiqzq!!R}_NsQs|&hVoV#{ux%rTYG zFB$MQ#dLwNDi6yZ&rAa)H-lB1OaVu1?$%d^{=9{r_;(K8YEQtIM+j`s)t%DU#M%f* z2`p8|u-)YK&Ma^LCWA~(G6CC8VU!uL1I+GUHT&eF8kq?zSe9!y2WZ2y41GE7@!Zq>gd z)P?CKj{}PjzX85d^<1_a^Jwh@Y=l3ZAd+iyO-Y~lf?J${OC#1Mm-)i3d+cZT*ltd3 zHI;PFu;d+v3z2GP|FWq9jKtt zRwc~C;#X46=xt^Ej3G{k`&x!X8#`y*76!g=Yi4^Kb|bO5p&oPPqjQXnpHuV;?Lu>$ z>Bd>v`Z{E1@{*Q%M@dD%HMsz&G6d!YFRV?Z!VtRjQj0a z7N)xEV+yGR`5sia#d=fB&S5!&J+jy1tW=6#!Q{6lrZN=`VmuH%pQwVO#JwAZf2yh3eH zytUXXEEsW3QE|gG$4xmV_S{U(uc7O`1lf3;Rr)UO4?jczY_!w;e3OcZkwG?Y_uCzeUo2p%pj6m?I4Pquk|^oXX3;|=9CRV-$PUWuKR=9 zR{!sF;Y%X&^`>Ek!lXRTc3)kMNoTY!kQR637Q9}QAZ${$q zCXtPN@*PvG%&S?o;CUY|qV(!ZhEv#?dy;awdsHk6op= z&XKgonJIHx%f(&j|EcS}U7S1-S>50*Xz2j*K@oS*5=#m?eNMy zCh5%q3Mx!WMF}l7m|?;wrr!;9WmqInB5K=kmY42uY;0~t1>U%Lc2-N2c{&BasbS@q z(IY#&O)m9!v_JYPd($?Kyi406@%!vOIO9i6eQlHfciFSNsy+|H(aSw3iubZ{Tg-Fz zv@LVbW|IA~RF@Zt@yv3BooL)hB!82J->cj4d&{zeH!K`IZrquYXeGa`Vs`M_Z)kwT_>}i;|9}x9@6VI&hL` zWG>dpOS{mPxep>lBVKTDd0Tw932oMH98C0p6=1Impl1t_ z(M}3YE#5(|TPJ_ZSXR$FE%+P(BYVqGt<%Vys7hq({ZN-O3+nhg}Gr&pYq7FWp44J z7aK?B67vO)6Wx;2h5R(yTu#QE6~oCMzkhyIjO8we6BnD2ie?no`TrO_^LC|Ev4Y+bt%op3snL9HjCTZvhb_}a{ol&*%}b_4Sb&sEOj z>piYfsa`jkV}V&PaK6`VI+?+BWS1bmT(jtDJ>EhKt1I?o#J;7ZiZiMNbHj9@k#Hf4 zoHXhq5aKcy@{~@t*CvC<@b!a^EDW2p#y7m@_1HF|=k{YhrW26k3m~E}+;T?GjgEMT~yBr^DSvW>2(pyj&ix0UxQ+b34ZT z8@@Pj$fb0;*R5Lt>yjdi6WOz+%^~8(Tx*p&pURY1CC;JSspu2Q8zOceTEIkVi7z5U zX)wFk4~|Oo?`()@))w9@+_1L0?E;1rir?L4J^FJzj+}!L^bNn?c1K4kQVi>CnU3i_ z(_w-z6GW}{8%ooWAT`%kcU)eV4h%|iU0sVs1(u4wm3>JP+cUOp7IG&a^WN_?C_Rkf zSlF3mgK8$v9=Yo|MC6$Kn6GmTe*1abVX?%9XJv$}j4$I{C#r9cwKW9u#a}IZ=21h- z@U!Uovvuhs55Q;aDg(YvTU{bvP6b}7dX<$g)V{y$_P$;d)(2~=kLv43!W)L!7|DHy ziDpltYlq8f5pk+gq8&UQdhW9A2H3^I7^^h3L)|aj>v9Jbtow%*@G!#wJ+nX9P$T>( z%KQ1Iu_OvKsQ5Ql!ke}~JSC~2 z(#fp{0qzO(SEN8WettKgoj#*bR;o{?ANan4{;?$pMfE^kMYIWdi!;d*o93(Zkhc@O zw&jKA#v>&kV#zVyV{sl|nYAvCg6!XrGE7$H+HAT%_}wPGodV#|0$$B@@vM&ereCH1 zD&)b3KSmW%QNTM}1=%dl*WSfZ06h?_Ld!S_&K>I?{5(8($eY+&>z|O_Z|INU$(;eiIq&4MK@blk~-;|&z!PvBp8Lc6W@t{eGK zc-b;YzVpQKE(%JkG!MT>?i?W?+7}AS831>(?ckM7z;d${YO{=Y^r34DHPqg(BfBuZ zwCR+0zhJWd;7LImY5X5TyZb$!BXkagTSb5IiQj(Oy(Sb%COpDR$f|x!v;wX(dLIvP z%9MD<;3vw?%JokuZ>I`|O45R|tbrY}~chAD>&qxfX5jyio15JfE z72zVor@#TB3n2h+*|zfq;KF^PRX;6bPF=T@Q9FT5h}vM9DDYoYf@iO{&4hESp^nbe zUEB&^FgL%_k3*WY*JCuU7*60|ZwE5T_3k|foIHGNM4o<5G@Rxdio33GAlkDc=l(tk zM@X!JRLQ}dNt=ITJR;%-H0=;1PP)M2=`v!|2Q~zWbZViSSpHG%RvIByDQmK4w{1pO zmra7>?_WQvC&778O#F%TMx)Sm$?!IkFWmcX6Yuc>xEwO&WE_41Jdp~({Ym1i-NtJg zGVm)pG$01Ek*P57k40Mdo4Y%NUL3td?HpC4a|#zjdDSKW|G1%>WAds=VR`Jx3M5jp z9eawKB!2OLk5 zS8x0C!y}HKlqU*yptmY`dHG}X?VQTRZlU+O>XeB=yA|>BT<-F(-grDvz!>wf zNhzF{w-f?~ph(T_r$BDKzj};@GK?8-B6P4K{-s0Ib{V%KuB|PfRK8MPOwAK$#>atO zto|GrDzArRVBvylrnSJ565se(!ViF4B`qzBk1`;Kz*JetnUKx+XXY}(Wt6Y-)>D}s z{=iUSLb>V~QlE#$-xNaAu<`R%>X2}u3kRBm&AGdj4`}?E0L(xKJ$Sc%BUS8)7K}eH z0x3Y{k+KeDy7L@FdgZE$oj=tr`)`nB;{i(GE4g>}&+^z)5$1d-qH zoh50TN0dkY8?B+-@H$8OeZ|Gi-Ug#8KeXsS+o`U(AWsK&Bzsy%I+ceK!XHv_oi01J zHT1+^Ggk;FqE(4J;>Lw_A&#V3{dbu14IXU|=CuqUCL8eRX;7O1iFHMr?9IrZqcY`j;N8HoE4S{xr9 zSUz2Mc7Z{|b^&I@@u_U~^}z3+$#gEcZ>!xyWZM=2dHly22TIBz2Iqk`NKmbxV`IlT=NAKOUkO21+jJ12Y6e68X^(x8N z(2@n}oIed3S^NZf;Q7>E6A>bbyw_qOh$F%e^#BIwig>`hZ<+_drp1GpKx)tEfpiLT z2y8c@8bK*p2qFC$#-~*b3hg$h%7u=$Q4^ApLBW+z`S4OcL*`vW`T0B0G02PIfv3`R zgp=(#=^y6kk0C`g+c(~6&_i&F5neDBxTcB#yY{dMuE+SPqPB=@!{G+eTv9k&078n~ zCrv+o+{^`Z+nz*tqex8Kis6xF4|4De=g@T7+#fc=?ib*03VSb5sZc=0hFSL6_}MaLJy3d0f94+xcGIVHln-d=wnJpu{_n$$$uN*a zV{{(&u0n4fAyyRY7v_=(>ED=p(PhuPIw48Hll@O4;dOuPI@@alE&d553>x|;&jJ~Cqh;i%LF*uKe}b}! z1Bxi@AG5!7g^E);>KrN&)I#SfGpTzIM4(HnUwZE7`Xv}cXwILn+29XtW7=>U1A9Cq z*6Z2p?xVU{)A$P_M7pSuos^bo{PUq{Yx#vT$B(GhbN>2%%?+XvL{sbS=TH7wWv;?5`g}@U7R64UF_pFU zwHv6s5<{t4ikltWJPp9Rc}}vZ$ev`}K2h62bk0S@~q=bl0N(BKw{!Kzz1+f6XQ2z+80y zB-!~H+;A~hd~*A(aF@T8fhX2C!goN{)MHJroUX;H8!WzK!g(VIY(^!+?t@nmLr~HL z!akD#BG=;r#5bxV*UUs#tn-NZt?zfuTGVV+HAeJPgvfGyZJ2`sD4`DR%ZGwS%%XbVAkH7gOA+n1u~xB5-S;? zTR}knvZin$gKlKIhqaqGBS)5A$*Y*X9|vaC zO%(t|zH*a=!%v7&BLAGj$YE`LC5Cpy192RAz>A@wy zA}8;0I9=1EL&y}9W>sJv&h2%DaHsW{sqDvQ?gNxdWk1Zn#wy z-3xQPg9HHE2tmbm=qJ$HWc)KR#14cfcm)xB%D`M6ra7@< zKs!k&3M2Zb0?DrUlT?o(V62nK83I;P8M#HEOGY)_k<0@QWx88*#LWv6BcCfgTscnP ze1R+^Q%6V94ELt1fA^6%@dkPE2$H}3jl$1?EjCp)zPeV=G&p12-It`3P_vUv2AZmG?^b!~No_UUGvE zMkWv+=&AXKTv&omN22nU9^hxFzwSR2c+gU;>SuBR<`V)Tx4R>Bi^-~$sbY)QbT*i8 z3F;)mcv@HxpvH#4(TcOstxO1R7_~I@kL$>2j;1?IzZ55nb@9|Aa-?Cwr~Wg+HG?(& z+c(ScmZSg?vocgc{Z8XWU`>d7Yli1;IOv_`dqmDy9=Eb7pDZo_!|0ff$;KgOkTxJ& zuiCeb=ltJ4*caoOTsWv1oBJK1GDaMvvE|F*!o|6F*U8ihn0-qmb(ivKf}=T(Ez$N1 zC)*u?#OwW|WXT>`L6-L6eP)*T-&>}~m!qtiTsYgq<3t^JHn0=z?>u98^nrJA8RC|`84EDadzut~-@4(VpSSCq z{BH95Xjv>S4CCJ;H(e3-T{kwYB|x#O<2tx^ESC4LHMs*Iu9_psh|RwGo^S=WZLXfj zi?TiQ*{(vLfW6#hA^q%Y{Ua0Tp5)@XA@*9cxzG$naQsdmIMTZ~nXaW7X{tih`k_!t za$Q&k{!4RluX|5Ue&@1et7HeS)`C)LyDkQv3Q431&StjM}4;SD2;C-xGAY!SEZ2Qtz zV%@}oJulQ771kFNWTiN*{%ZF9HE8-KdxGim3E$3_$qTw-!RuT`@Mn2ZP~v%r$U&-D z8h#?mnNBWRwJx?116s1Ghm5*(sZgz|>C-9mWgzIpiCsCWsl}xgE?WAS>7s;)hf!WX zes`I0LTsMsdwgWqt}4QgEHzKrLoLHPX5UtT7#F(FwQsy2N9@_y4nZfeB68^GdpL6s z<;*an*T11^1`|}GLI0FuRNwB#{lHVet=-u&3G3moJWoPA(vNAni|!zQu+->`x*ioZ zT+!-p+~3spT3Nbf+(i$krZ8-!_qD5waJ?<{Qo8fUEE}aC=Dpw?zDUOB$@X{PYMItd zKi(&teH~uq0eXtbla=9RZs}_3P8iu4Jg4=9W&;su6;pQLOWmj6W#8TBHEkxl2ArE~ zRZG&aiAHP$N%KQb-AHcRCBBDd0EAIEG+gPE=f%AcrPgHNUoAQf(W1@hrC}r6aT1qA zZ%eKc&TT~ONOZchANhhuZ@@x>RXeY8QPc`1l3}jZXKMN8d7fGbYsyZQrz0!jRMJF? z>SrQE<(Dt(q+Ez{@*}PZkq=$t&PudU|MBM5Y#pD#bl~;K=6T#ouG^7Yubg@tD_5Ti zc%w(H^;CMZbMgku1FHPp8&7hyRU($9& zV*dGd@1`##PvZ7>AjL6T{(KLTDYDWH_FS-)wnBCy6K}s9rCsPAi&9*^Uvisi(hr-G zw?e$NpgT6=tkK!^;`Z)^nK9k-y88S3?MlIxyLqZ=#c93D#ptS)Y0cZHVPY#DeK+Z` zx%WbNmdZ5nDQ<|4;(8@Bom_Nh(nk3OSafERy!<8PI|HgXGiyxE^IHlCsAKZEN8*j8vW9#tLtpPjxrj*0!t3^ONP%8s4PG{`UDfOt(J& z7Z~MficQe@HawZLXPes_*!(#l+_X8X8w>UHg$LN=xaqQwY}g6z9=-2YrzFo>cJAK? zYo3=KpWCT%zHN;zyWuoc`_z_Oa?iZ+6zJX4`8^>{xS^Z~Dk?>yLI`Z!*`7d=2 z-QHJR`;NEc`|Ldp-BA08m#{nRIU~g+yvDQ(ZgAg!HF&DPx1ZCw^KD~C-cB{4Uk6V; z{vFdbniu6gbEj+2S7PNbrt<~i+H%U3=EV~$W87B~DjgQP6Fy-wKj#VGxqI7_CxjV} z2~2|H%3hwyB`Y~H@(e-$6{LxOP7WY0qpiaSr(eBmPHh)qEhOO{ydOuUhkpNo^J*c7 z=2n>eT8ZsSPv!H=GqQ{s)l}_SB+bqa&!^2bR>fn|w=Z02c-Z>Bu*(%= zj<8#k&Ht}8yRad({$q1HD$?A3ar`-XYShIb)q$gWZK(4;@58miu|e&^!S1{(#|Y%k zRuRR<-RIW`9gEd6)%uN`J^5Ywz8vwgxOkldU#<)hk)xkc@q;F%dH&l{j@^de!lD;e zyml^##3|=U1!l12b}fE}<{BFE+R>4ya8&P_@yPuM{D*imJ#?#GU@GUUu0h6vXzVN8 zWu2JIXA9!Gr@jw{@!g~H0%VVMzVLCyciz%^LVoU}sNFjGXuiwnm^9z?8UQ@u=e_t# zR2NL_jf7Q0&32!#@2}2&`^)!aPo-Lyt+G!>S*B(%Ryz*;t0#WJZs#2!xUFf++i;C23!^{9btFMVzu|8dGW_9ql7YnT=p zI={4;^_Ybd^q(pOG<3O2&&{{Lc=M%kbM^30D{I9Hv5I zH3*5jn8aT~t=kA9NZ6RUB&o(zGYz)>g4+zA7N^WoKJZggg*o_4SbaUY!dOUiS0%9q z9)RA7MxTlieFcn&$vj5)$X{6x$UUHGpPZ*WGmSqAev^f&cz$6s>wy&Bs+E#wU(ZDc zCDUM=pir5-G$p1e0SdRPuAlF;9C3 zrK|n_SllhP&H9%zSpJ46 zH^9RhWQ0{Y>}8??Cd#l~VR9MQao_AF+Ga?%oaW;_OL^v?G9}`c?93gyzSK_OxdgYn z{m!fPuKvoBxEB=J&`lxB*;Fv+3}OaSeoLOrEKB$+iGr}hyoeq zM&>OV?yc3~hTS@vz+y&g7mw6~IL%W)E!-Cr0mGoMJEr?j9nfbWpg`|t`G3m_QaTb6 zn@PwcV&`;aDED8BsVRR(g|s(Pk^_wA6ly%-Jdb2_q->fFG8`o)@WtPJQwDWRWMhFL zkQI6YnN2|z;3vg1Q=pW(B^%k#(q+S@Xf6Bc$n@-R15(Kaj<2U|Zo)38J=Ka@f{@2z zFNtOxgt3)o-U~#1$m%}qd6RG5kPW25{q0bo)Ol+y{d$6LCt@3fm`XwgsW0xPIt@-r^=xe+9WXIMQ-fhL(QwY(Vy98F`O)b+DNm$B=Wp+}As-*^tgh{MT*j7REa{wrq3Q zvhg?UuqB>bi0U$g4o(*k5O@jNaalETcv9}5|CZew-&^Y0M*UKFvMnr6L#BI7D{j6N z{{eauH_U_tmmlvj zvVSxt5Ngu23ICNXhf#5=4#91Kp@09$+G;g8dP=!Z7>;6uG)n&;^YW`(hN-jYG_*Cm zJ(@`EK|%j(nn%Dwq+FL;yp=x@h8XR4Bc#CO1}5b98wToX=dou9kcW&^I)vsivn}=K zpCQ%<(bHr65@4e1;GmzM#~zEXRFn_K3m%f@d3ztOkNrDpe%*+P&)@JN3nP3(-_Rt& z^AHt?VniYQ0$m5;4I^@h+#9>l!S@F@;dVx7_WX<1to4DWM4->~&4sz^BBK6_aw9A< z&`hnQ3_Ez)Q6_jT;Bn!X0zIg=s>F-LN&gRr|2)lC1Os#K(G{mmn9NK+6%tfHx_y*` z8UkwID=xe@*ZXxNvQWq`h`Z-{9}J`c;uRS^baxYjWVs19QzLzdePg1WXF=W8ah9Nn@c8i6E?6m7&Newh3~tf53!XRDcRtviG^&# z)D(XW5-HQOD){*~Bc%ddWj3i%mKta(l^921DR`liwTBuh^`Wz0{8|SODUs3!rip?* z%YCYv{532vOgxB>z$%xNT0cn?k-S5 z1Ru)TQ%58VvL=;W&pJST9zUh`a8*I44|_J>5K_SR;b~0cQL2=D-QS8}9J}Fp&%;A| zFBV3^@UzH9>P7tzRn&8UkxsRcXD0WAJ!I_a^g!6(~My3S-(Gb7~WV- z0^R?O<;UxNMi}cz-80x1#Q|{S-cjxAt2dJxRSlreB43R8d=96+^&+>4)*JB-gRnWs!JSZ9j- z{->P2z6{`(&tP>DcYRG~04!(ZA4Tlu_Fa8R8uy6fPn7E)=OyrC1Xo2`~~S@|^9<60o6`?daVzJyzrh)+ZB zwYR&hMYm4@_?OP{t@qB3y~4*eT>Iw`$0`_c;m+rf9dFGmI;Py*s%5*;>r6;V8NDV^ zv$D^BGLF$+`?X&a5i}2K_Z5)t{dh;ea4`@8<)TuZ1;{6MP3`*LbPjpqQo6ovhQqm! zx313<43m2N>8_>4{+w5Rc1)RH{sTt~WEWUIY<%V=H5UMiM8}zd*XaXlku(cmgmTPj zpLu3A!2oL;ek{Le_$j}CZR!T105t*CWH#7sAim%ceW#|64lvU(QfWZQT>H($e@&NJ zZ?*;GR~an;*TnP!da?-MYP4q=Qej8kU?9BWA(tw-@!{`Q@%;InBJw8VP%!n0*7ikT z)hGY6raFv*d3b+G&X$5fn>!2be_-a`zxos@eZC(4YLO*i$5FA+jbh{wQ_dk83|U7F zjg1xZ;@$yo=nk+7S3@d#AVCKX9CX=Z#qyGH>ZF9Oix45g>F!>le8W!(4L`vpf6V{0 zS4x7pE0}RL`dvj1+)pNbf3GBDEL{mR%C|Yx5USyk5;6jmLYHDvu35Qk&s_x-(4Fhq z62WETDgq_P0gT;r+-*!7$S``ORh+1Kw9c)g<_UQ}ac#e}`YyB|v$~K;f0)}s;JGKj z6ceFpq9@iy^g(#<2!Q!cvlMQmpfW7hOJx{Yj%p|^t)ZxG5_EeC>`)K{1%?pkYSCM* zMmLyZFW{(g`g-W-AbDXKmPZF9^G^gRAJ9w&p2JbnQXsz>~d^qqPhdvU^1^`ws; zFAatH-s|!#`2POkt2r=_Aks+r&;VwIYnrCL>;R(%EW){~3rb$wKy=T8dZ*1?K0p7n zaYskqIC<&k;QLXbz4!_=&QT)i=EDmYq0&_c)FgF4B0L1Kexv{x6q9`go*3DU#}d_U z7?@ta+y0gaanuWFImOXPfo)m2f8&x6qgefHL!Iagkz}{JT(>i~h7b%GylP|=iWh!E z!#x1MI%OpIl#w24FM-b6as1A9J>VtfuM7Dr4027Qj(0jx$ zfc=hrqHZIkMm@PI5DVwIFAYcbAOiCCrW4;C+W)tHyk0O6IY_!fNBSUev-s4nr`BNp zuWo%Uqckr%UA)@ib}SerbR)bca2$y&IIFlo(2Endnk*selMj(Q^Adn!YVWkzG>$M+ zV_loBck3!IKp_04-pNhhU2iaW0HsewTA8yg z?y)6YpE?s)372ywQPW`zj%v8G;A0fq9IU`V4%U(FR8RQNC=Mz+G+m0W&s{oTg>G$r zsa}+m`Q_xrFACu{=}8sVMa->>>*fXX9y%sReR7HV-TN{f34K6*t1B#P^MC_#A$Tf$ z>~aPNG7%hnn&uj z=_syD6d)FLei zxEL8(pR8ub6!Gi(6W`~%8OtW3MAx81`nUN#B)_DUlbb5`Frlk0{-$%N1gO^jG0V&L z_MNBQ-#uSlZGGd$;{&`7bvZ7Oup{XZWBvAd%v&&J$$?!Cl%Bg>DI(6_LaaE+Dqf+} z9MY}D@CZ?mgRV+WhhCo?Mc~~||3LOyN!QqfzT7el)i&4<*x2zEB>}WVEOh8bGkk7V z{QX6yhW`aNvJ>z57~@Ie&0x4B)$Nf^E^PyiUJGLO@(bwVJsYZZX+2RzW+p3al!5Yh zWd_dqxpzB#u`J^p(~oi>b#V_>-PD%mvLKuJ34IUoPTGDBqU9h#qvzpnmZ&LnU9U{( zOLDG`z7PVWi9Kcy+?R0~jaZVde_^*8*0mkXkUkQmWLan zWb&U96%f$bn-_0o zhIB8=lcbjL->xp7$KlS!JsEAsn1@C1lUlToZ!0+3GZBdPdAHbhVh{`D=2x8T? zqzOHnG+BQ8kKdf$1y6L>kzIm3OWgbjf#(@m(^`4|b)1ncv17>CQnkBLcFbq7%SKiA zt1@lEZC>xsz-Tbxv#{&Rx9-063}cHePC4m5)^cc&mp{&XT;*e?R)Dl z$2b;W7o7xSw0huf;xDCh8bX#(_$4RdF;h0`2B#nKNcg{gGCMx}w(7~1WwhsLqdkpo z`L|hc(3dk6dn_-WjnnUdq@7injo|e|jtOK=y=fd>|2q%NWBZu)C@)Y?a9*pSO%Iq7 z$cX)xovaxro9=j6@5%jQdiwpwN*=3UnSGDHQc+nzy-4yD402-WUnGR3Z7EB)-@l8z zR)JJ)giS&L^gJd^@bqdm_zuMOS>>1~aC`d5!ZoMYC$VySYf6aqhDzJlQ8{P1Gy(o7rFWR`c;V{WGU`KU|b zUlmp+^p=gZn=|QF!B``;P}-P}tJ|Oslfd9uz|>gy3wkIj!WSH);<6iHP}wOuJ~`02 znB}NF-r{v{b^9IJn)-V>a$0fzb}IPzy_{}gN4&j*_RO`tzMy~l_VPCx*? zz0Z4$kdpj^os;bai6*SXbav&PM|TomvzDlJV~P> zgWoI~ve+{2Oqy+J-!04NbfvkC>_&69{P#_wvn?*-r=XX}C@`eFvWyo9ulY*jyNmZY z*YrbiboFuUTxKI)fmzls-9-O&LDLLYCL3sQq|hkOH*BAAHfRR9g)&~J9%F5W^Oa=* zi(7J^l4Dm()qSQ#Gdk}(Bp|Zif^1J-*2vcFAqt({zX~hI_f(QeyUAbmIrl^gIGaWu zB#LKp`Nn02M=E&upd+=Kn!WSF6mOX3f$_V0+se?PuyA#&behJZHih$iXPCOf=GwfB z_!HZ0lp^0?)$Y?J!m-$(K!Z;dmZB%(xy9PYhevV@7H-;Bs%rP$O4HFw!}KaIU=<%s zNnl*XSe9rScsrsBoBG^JFGZHPg}so|q79deU&S$lPS&B1k3llH;hm*Pg3kDs(C5dl zpWcf%^qh2HVU0=8*pfQ_hq2Ep@ z&r|!vz;!dx);yCHYlcJ3r17ZR7CJ4UgsP#5Qw33Z66`s75&z8~1v%B z_3K}O@O{#>(%gy8`>LCMuG-G%^f&F-U&cabmsoNW-3G?vZ$m^H7_7SyCK z7}{rMTDhHxzn2p)XC_ZGRe~X^rD5M$Doz_pXatA`W}23U3=_0J~Uh&DBVWS@{ z6}`r}4)q2k1zdHJ;}aX~{DI4$D|y#YB#0L+tur3%+8uQ|Jg}IEijUq0u}_R^%pwgt zu5d&{iwmW>kZSAIy4`=bXV(<#mkQMA&|=%@`?!Qv=eWeAJW&ow9U#ReARng&lEIoY)MoNdRIRm{$~)LNynqKGQWI%U{n z&MDnKi;!n(_tE~iV*z6ujrk3So##`|ZeA~j(i{(&^$ma0dUddUPK<>_qh_OCb_vbx zPJh1pD>)neW5>}O|76%7z%Gz?YV;p&-EHU}UbQ_#jh4xxFt!Op@EYW@BCKsB{ds_xSlA=QB+V2J8CIpsJ=4=gTINygZ)el_g^JGUODO&`V_9xZ4T~ z1X9mk*`N}V+Y>+0z^m~JW3ms3Q5DF(X?H$2&Wuc5CCH_&n15NC!cXmr0zPV(CWG(| z&noj?&am5pL^J7{47v7(bh84H>L&H!IKfI$9g@p^rw}xckZZ4D_N2}*;iM;;C40r2 za5gdDzD%7@{duBJKXaLi<`40#8-@wuL_PC?mg4kfgH*c5qhkHqYDKYA4PJ=fpP1no z^z$~^Oo1F>$;{JC#@PMB=$4c%)l-~p!~cq8H2Z6^NW@PjHm50+FIQO4$>i29Mw#Ao zh(OZ}`{WkM*Y~fPHlVN_8a>_I{J(*k8}7rZJ>9;m>|O4PCVL2ZD_Xu|Dsk;8-FCCb zH=K8N)}>X=B&wN58xV)v!|{Uc;zqU!NgTCBBKFnUgF$rX=(VO~hXpSGsKl@P6PsGgHx;T4B(t4Q&d3MpDkKoml5^+0+#r=wlY}mI!586b;@Fg zzn1w~1D3SDY?O6vx|yCxq+N8kshs)#G^U`!g7#rL?*cVj)@rtp=LxV6DU#K;ExUcS zmo4`@&rZZBVQyEQ+*HY1kL*A?=C~F@o_Y0|_mMisw0a-rE}~~rr3_xAZLyeDE$kKg zxBUAD4iS$k1wGjlEoB6!WhqOSW_1^zy6J@_Tj1G$xPYSef|)_Xh8 zch{VcA!9swD@`byNmsYFXBD|aKb9TFkE*@m$h0|rU0W=w&AvL3Mzg1EF>sc6SwaF- z>_W_WfwS3&^=7vi*`%Y}TyU(_hbR(Q95dvIqK#N(N0pN1cRA5(E`NI@r@=R|Y&!PN zoViBd}%aD)2=L5jx#iCpIkq=(A=C_-0!Q#>}MXk?sA%*?)1e+GL4y5zlga(o4#o#kL>oNCBi_@dJnR^NuX#A4hHD zoQ%Cgz@xx(BEbD|e%tC$KJJIIjkT(fN?fV!{xmEDJ-&=B>11j9$;x{D*T(4*Wq}tW zf^AWnMBeMso_oz~7U%>R(MDM22(V$*o}6Hfy#BGl-hlJkg2rKK?=pkoJU^3h;%mjy ziP=`=QQ*o-$#bhs=BPbCQ24NzdpJi**Mt2aUfS)~>QcHhhb<;uSw4pR^65_-5A&POECQ^=E%5*p_z$2a5{W#@|DET=kp{nTRso zn`SVOI(ha--PqO|vnL7+!I4?mM8fC=>vosmfT|aVe0Pz%TKzSZU$mtfXQYphc+fi? zFz`YTxtg|u$CT1kRTdn>b8!0vV03sL?`4lRRDXRDs+1e+xu%+6 z*YZn=RLJEm6`rvz{4C!IWR8ccd<&`I%=%=;CmpA7xx2Y!n$^7ErEVA2B})a9*|%)@ zY*Eokp{^%0eS9vluv-c?hnmkNG-%`c$^*Lf5}08xY~GXaS(+b}H_JC2IiI=5%;S}tcVHn(_EjA&B%1TzwauONsgCMx^e z=XNMpLC#X?7yX-p3m||hOcS$Du2JomKuw1?g{&D~G`rHyd$>0w+v%2K#EDXM*|+Fv z(^I>vvefI21=p1|AKv>QO4NU;D3pA=v)OFSM_AsXJ#RSG6xcIL2OxtU z2r#c=_iO32i`ccQ{JZUIvP>8^<~vUDISvY?7)`Kz!Eh4giIt~HF^Ws;4QwJY8;UX{ z`HBKo6P|o;h>E*0KKp0pbd6w`obyIL7qH>Kv2GS+THM2R8~)k)PxX|q@GwDMSm&xW z`A=RL)N!=>9jK!eXqbw$)IC6LLSFv>9((`dSv`%7%(3o{%UtSp7~8n pL-YH$V!yvF4GqmUWWnA-^G{oNj#~^z4SYg#>AdE-+%p!p|37$lCu;xz literal 16221 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 Gp#KLe%80lC diff --git a/test/image/mocks/ticklabelindex-2.json b/test/image/mocks/ticklabelindex-2.json index 047fb3485a3..c4afe33f13c 100644 --- a/test/image/mocks/ticklabelindex-2.json +++ b/test/image/mocks/ticklabelindex-2.json @@ -1,21 +1,52 @@ { "data": [ + { + "x": [ + "2020", "2021", "2022" + ], + "y": [ + 3, 2, 1 + ] + }, { "mode": "markers+text", "texttemplate": "%{x|Q%q %y}", - "textposition": "top center", + "textposition": "middle top", "x": [ "2019-07-01", "2019-10-01", "2020-01-01", "2020-04-01", "2020-07-01" ], "y": [ 2, 2, 2, 2, 2 - ] + ], + "yaxis": "y2", + "xaxis": "x2" } ], "layout": { "width": 600, - "height": 400, + "height": 800, + "grid": { + "rows": 2, + "columns": 1, + "pattern": "independent" + }, "xaxis": { + "dtick": "M12", + "insiderange": [ + "2020-03-27", + "2022-07-21" + ], + "tickformat": "%Y", + "ticklabelindex": -1, + "ticks": "outside", + "ticklen": 20, + "ticklabelmode": "period", + "type": "date", + "title": { + "text": "Should display 2 major ticks and labels 2020, 2021, 2022" + } + }, + "xaxis2": { "dtick": "M24", "insiderange": [ "2019-03-01", @@ -28,9 +59,9 @@ "ticklen": 20, "type": "date", "ticks": "outside", - "minor": { "dtick": "M12" }, + "minor": { "dtick": "M12", "ticks": "outside", "ticklen": 5 }, "title": { - "text": "Should display 1 major tick and a label 2020." + "text": "Should display 1 major tick, 1 minor tick and a label 2020 in between." } } } From e460ea62f3725aa47a38fdf01e039b5271405b08 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Thu, 6 Aug 2026 16:12:48 +0200 Subject: [PATCH 4/6] Draftlog for PR 7937 --- draftlogs/7937_fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/7937_fix.md diff --git a/draftlogs/7937_fix.md b/draftlogs/7937_fix.md new file mode 100644 index 00000000000..e016d31f8dd --- /dev/null +++ b/draftlogs/7937_fix.md @@ -0,0 +1 @@ +- Fix missing period label in last period when using a negative ticklabelindex [[#7937](https://github.com/plotly/plotly.js/pull/7937)] From f933e2eb83faf60596d33ba67831b1eaa66d7d86 Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 7 Aug 2026 13:52:19 +0200 Subject: [PATCH 5/6] Fix textposition value in ticklabelindex-2 mock --- test/image/mocks/ticklabelindex-2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/image/mocks/ticklabelindex-2.json b/test/image/mocks/ticklabelindex-2.json index c4afe33f13c..9321d4923ea 100644 --- a/test/image/mocks/ticklabelindex-2.json +++ b/test/image/mocks/ticklabelindex-2.json @@ -11,7 +11,7 @@ { "mode": "markers+text", "texttemplate": "%{x|Q%q %y}", - "textposition": "middle top", + "textposition": "top center", "x": [ "2019-07-01", "2019-10-01", "2020-01-01", "2020-04-01", "2020-07-01" ], From e6c7a5b16e422a90e4e9b8aac98c9bee9c7f3acf Mon Sep 17 00:00:00 2001 From: My-Tien Nguyen Date: Fri, 23 Oct 2026 12:14:02 +0200 Subject: [PATCH 6/6] Don't skip hidden minor ticks, they can also be labeled. --- src/plots/cartesian/axes.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index b6c43e5fca4..e60e4110aa5 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -1207,9 +1207,9 @@ axes.calcTicks = function calcTicks(ax, opts) { // check if ticklabelIndex makes sense, otherwise ignore it. // It makes sense if in addition to the always present dummy, there are at least 2 minor ticks // with the required distance to each other. - const visibleMinorTicks = minorTickVals.filter((minorTick) => minorTick.noTick !== true); if (ax._useTicklabelIndex) { - if(!visibleMinorTicks || visibleMinorTicks.length < 2) { + const visibleMinorTicks = minorTickVals.filter((minorTick) => !minorTick.noTick); + if (visibleMinorTicks.length < 2) { ax._useTicklabelIndex = false; } else { const diff = (visibleMinorTicks[1].value - visibleMinorTicks[0].value) * (isReversed ? -1 : 1); @@ -1280,9 +1280,9 @@ axes.calcTicks = function calcTicks(ax, opts) { if(!allowedToOverlap) { // remove duplicate minors var list = []; - for(var k = 0; k < visibleMinorTicks.length; k++) { - if (findOverlappingTick(visibleMinorTicks[k], tickVals) == null) { - list.push(visibleMinorTicks[k]); + for(var k = 0; k < minorTickVals.length; k++) { + if (findOverlappingTick(minorTickVals[k], tickVals) == null) { + list.push(minorTickVals[k]); } } minorTickVals = list;