From 65bfacd9a59a1dd3ee6b67f3968aa9e12423fec6 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 22 Feb 2021 00:30:37 +0200 Subject: [PATCH] Add outerRadius option to doughnut/pie (#8487) --- docs/docs/charts/doughnut.mdx | 1 + src/controllers/controller.doughnut.js | 10 +++++-- src/controllers/controller.pie.js | 7 +++-- src/helpers/helpers.core.js | 5 ++++ .../doughnut-outer-radius-percent.js | 28 ++++++++++++++++++ .../doughnut-outer-radius-percent.png | Bin 0 -> 16258 bytes .../doughnut-outer-radius-pixels.js | 28 ++++++++++++++++++ .../doughnut-outer-radius-pixels.png | Bin 0 -> 28091 bytes types/index.esm.d.ts | 20 ++++++++----- .../controllers/doughnut_outer_radius.ts | 14 +++++++++ 10 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 test/fixtures/controller.doughnut/doughnut-outer-radius-percent.js create mode 100644 test/fixtures/controller.doughnut/doughnut-outer-radius-percent.png create mode 100644 test/fixtures/controller.doughnut/doughnut-outer-radius-pixels.js create mode 100644 test/fixtures/controller.doughnut/doughnut-outer-radius-pixels.png create mode 100644 types/tests/controllers/doughnut_outer_radius.ts diff --git a/docs/docs/charts/doughnut.mdx b/docs/docs/charts/doughnut.mdx index a9b929eb4..b2b69e30f 100644 --- a/docs/docs/charts/doughnut.mdx +++ b/docs/docs/charts/doughnut.mdx @@ -164,6 +164,7 @@ These are the customisation options specific to Pie & Doughnut charts. These opt | Name | Type | Default | Description | ---- | ---- | ------- | ----------- | `cutoutPercentage` | `number` | `50` - for doughnut, `0` - for pie | The percentage of the chart that is cut out of the middle. +| `outerRadius` | `number`\|`string` | `100%` | The outer radius of the chart. If `string` and ending with '%', percentage of the maximum radius. `number` is considered to be pixels. | `rotation` | `number` | 0 | Starting angle to draw arcs from. | `circumference` | `number` | 360 | Sweep to allow arcs to cover. | `animation.animateRotate` | `boolean` | `true` | If true, the chart will animate in with a rotation animation. This property is in the `options.animation` object. diff --git a/src/controllers/controller.doughnut.js b/src/controllers/controller.doughnut.js index c283a266a..2f013c0cf 100644 --- a/src/controllers/controller.doughnut.js +++ b/src/controllers/controller.doughnut.js @@ -1,6 +1,6 @@ import DatasetController from '../core/core.datasetController'; import {formatNumber} from '../core/core.intl'; -import {isArray, valueOrDefault} from '../helpers/helpers.core'; +import {isArray, numberOrPercentageOf, valueOrDefault} from '../helpers/helpers.core'; import {toRadians, PI, TAU, HALF_PI} from '../helpers/helpers.math'; /** @@ -138,7 +138,8 @@ export default class DoughnutController extends DatasetController { const spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs); const maxWidth = (chartArea.right - chartArea.left - spacing) / ratioX; const maxHeight = (chartArea.bottom - chartArea.top - spacing) / ratioY; - const outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); + const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); + const outerRadius = numberOrPercentageOf(me.options.outerRadius, maxRadius); const innerRadius = Math.max(outerRadius * cutout, 0); const radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal(); me.offsetX = offsetX * outerRadius; @@ -350,7 +351,10 @@ DoughnutController.defaults = { rotation: 0, // The total circumference of the chart. - circumference: 360 + circumference: 360, + + // The outr radius of the chart + outerRadius: '100%' }, indexAxis: 'r', diff --git a/src/controllers/controller.pie.js b/src/controllers/controller.pie.js index c88a3cbc3..f0162ef2d 100644 --- a/src/controllers/controller.pie.js +++ b/src/controllers/controller.pie.js @@ -13,12 +13,15 @@ PieController.id = 'pie'; PieController.defaults = { datasets: { // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 0, + cutout: 0, // The rotation of the chart, where the first data arc begins. rotation: 0, // The total circumference of the chart. - circumference: 360 + circumference: 360, + + // The outr radius of the chart + outerRadius: '100%' } }; diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 159c1335c..f670065c3 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -85,6 +85,11 @@ export function valueOrDefault(value, defaultValue) { return typeof value === 'undefined' ? defaultValue : value; } +export const numberOrPercentageOf = (value, dimension) => + typeof value === 'string' && value.endsWith('%') ? + parseFloat(value) / 100 * dimension + : +value; + /** * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the * value returned by `fn`. If `fn` is not a function, this method returns undefined. diff --git a/test/fixtures/controller.doughnut/doughnut-outer-radius-percent.js b/test/fixtures/controller.doughnut/doughnut-outer-radius-percent.js new file mode 100644 index 000000000..28dd46da0 --- /dev/null +++ b/test/fixtures/controller.doughnut/doughnut-outer-radius-percent.js @@ -0,0 +1,28 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: ['A', 'B', 'C', 'D', 'E'], + datasets: [{ + data: [1, 5, 10, 50, 100], + backgroundColor: [ + 'rgba(255, 99, 132, 0.8)', + 'rgba(54, 162, 235, 0.8)', + 'rgba(255, 206, 86, 0.8)', + 'rgba(75, 192, 192, 0.8)', + 'rgba(153, 102, 255, 0.8)' + ], + borderColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 206, 86)', + 'rgb(75, 192, 192)', + 'rgb(153, 102, 255)' + ] + }] + }, + options: { + outerRadius: '30%', + } + } +}; diff --git a/test/fixtures/controller.doughnut/doughnut-outer-radius-percent.png b/test/fixtures/controller.doughnut/doughnut-outer-radius-percent.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f0dcdff6f37b8225030fbc5ca9cf05dfd39730 GIT binary patch literal 16258 zc-rlHhf|YX_iYHFi(sKBRi!CXUO+%<6agVL6+voHklv(A3lRkyMUWCYQUrlSdI`+} zNQcm*2Bh~E2oRFo$Jg(7zdQFIxN~P@h9S(HoPGA*>#V)@^Xykf2HLF5=b1qu5UbAZ zTX#VqFzEL$BR%kk5HNTI0tte2Zrv~ruwI{Jt+0F?vbl{%WLD3`#y)=zVb{BPQ|_kV zono=rF2_|^-|G^SlIqhNGE5JO`q0C^SQBx-lBw~1YfONPFq6rLklpoR$Mzc)BeFDw z<}HxZCpLxZo8n{Vgsv}kQSgSSfBwG(vN;XmKV0?`PD zYdZX3{C6QcD4F)pCp)7sQ0$ivvUY#AVgz;lXHyw5DCmbx|2Y}(zY8It1<;>Q=gta( z>^?7@IQM5E7~~E5_Y?92GdoD;fltKSKMQHXuK#&9O<{<`tkjlXXEb>shAH~PMUN33Rc$6lvc@IP8h zaetR6LT$PiDKh`7dtkAJsA86UjrhJvW%bu&5Vj6+H_#(>lYFRc@8RBgp+8(_k!i|Hu31NH;IM zaJid0b*bH=RY?I64FW%8VF!Ihvo&Z;Ga`9R4ha;42LFTb&_a|~o3Pg&Oi5)$RWtr5 zj=GsY5Z5G?Ubo$%uDCfVnu2|8Pl`uywvP*?1|NHq(D6$9lY5H}$FuPs8D+C?s@5zl z|FLPj*mn!?T;vL;Rd;^#mclWy!?)0NX@`6Ylg)P6I2S&t&oF9^i%W3uX=(X2Q?UM6;8$t!z?@Z_NN2-%cilxNU9UCYUChv`VU5SZM58uZ z|8=pTriJV1i2vjAM{my~7XUcOX{RqeZiS#p$%|b+s6s+EVlFRuBm)=O@IKhWkYZgN z@ev2|EcVX)IjpcA`Gy)W)0Y|4WT#Dzm>!=qF*+N9ls3|Tp-7KB0&=~w+Btfv;DKQ6 zL#fxkC|Hr}67hJZcNnK|%w;zQKT>Vf!n~pnW67Vow#ee$L$fWD589aa`;?dYE!$L{DeHZdfhNJ^~@q$5rEyHP-Qj z7hHKt5H#5Ou3S*s9f@OT^64({AZaG;C$C;l+K(bVpH;E>Kw~p`+$&+__ch!to3L1GM_gs!;H|oZ&*3w#sbFMm>E@M7rjAEWLhz8J2V=;&2Bbm7EdcG@uDsq=s z5RFyj@_X0nb+hM!?EGqh1m%xaeHjHfM*KIAIg7;xuU3C>7gNVA;=JQB3Py5*&nyR4 znu2dQ8`iKCyzDuI;vYtB0&Kbtyeq<4xw}Yb+nz7gv%zG;8)f z>N%*W+T6<=px)lj-9uC#SF4-#m)0}UK%&I~vU?^deFHh8O>*bnvp|&LCeg8y#3mej zC(ZOmOEuesytjMX+^^<%hH<56vI=!ehcY*ak)o`ls{I7G(<(NfSA`P|Vm-RP!3ph? z0_t1YEkX5If_0Mnnm4uKrdsdoXSOTb^pI%pbXHyndx3RU#hsWz<((4s!)eTnSHlp| zb?p*hiwjo8wVCYaJf0gc{Z8Xf+kh?Kp&<*^YxJv5j5fm?z8Hh(qs;TGmUjF*I ziA=VhRmBw*HY_P9Xy>V)V49e8n}Z1uaFm29ZDv8UZ&AqoTma|;b7PD7lNTt%h~g(E zXFvw7b#1QHddN||Z?CEMt^R8k&~z`3^sG0ZwbaW_%EwWNo#*g$Vd z|H)e}?c0oYcYq4j@=11qiKQ4m+ddm&nxMuI&qKDz=jp~a-yj|c#m{{)9t~110LSBnDGt8qd|9hZCsI_Owz_x zKfeW!&`t~I1YSAlk?rsd zz2~>&S8>hvA{)s4|Mc`pmX`|&Kb)TVKzhBoxT{Z$?>cxNpa4F@B?!`+h?T9VX+GtD z#5Or2aC|8=;e9SIh(h`BuHj{L&^`E5+N@BI80Bl9E92x_Nf~yi??t3ghtcqs_#B<{ z+=_GS93`^T_V09b7?b0QYaH!syTwh`cs)q<0?4aO?4UAZw^k*0WKQFu!hCmV+j&9& zEmU6tq@?vxp1;wiznX-XzIJy_5>UUCgQ1=4`|I!hC1Zc%kQn z>Rm(><+!<|0vYgAwXf80d}&I2c5s)nI8TzjUdW^aB1uu%%fi+b&1-w* zYV4>_lJ(p1al|@_%gVT)v+c6Jc*+eyZeSnjysS$XnBM#Ch&#KKH5-#K0bo21=Xxa+mva0a-x;O`6tcV5CWW9LZZsdIFb7&Mo)NG_FLH)Rm2eeX4 z)3@GY+Dp;H2ld=eG+r5;4kw2mi=MiIF2i1a&B==A4uEBn#+eU~zlUqK@J&ZCJ_ksi z5vxX!e2nxhBAd&G=%Q)cz2~z%mSj(5^sCcUv}v+xxwQo|XVudf!Ao5X{e225F2W_O zNkc95fStehnB&-IvV ziL>Nd(Kis*7hxxB;SJX_oBS>=&OU&cYleaPt|Zv;o;fWxx$SX2uxhfh9A$b?boK)d zWCU#GE|K9o1}8R<2kk1GsuUX?jP7_1 zjH+k#QC=rg8KNv=Y0ZH<-uH;^vEnS37@iI9kRvPe1fPjB2UxUGy$L6iJ`MsT1bB1WHVm)3}iKzx9|#!jkPIWEisz6AsZv zb6M44+*#=YegV6cD1gR%4kqZ}8%+U$LjFm9HAOo^6p^K+yF%qHd8yz${CfL5Yih#e>^_Dq z413XL_4APRs=kpKW_#A70I#l#q;KGQgS=|tF2?GPTu3cIzMU^L9A`cAps5uTM>xD{ zeI%7*dK%;mV0YwXlT*I}sW)>h|B=@+B5182`b`9i`)pQryU#dDZ7jZ%tf4`=Im;*q zbP0VRpA^?(=&%$yMieyYOq)e|E!umK(@4xb*D2S|;3sgm?Faw&s1(-rBar>Rl8zLw zXD0l|qDx)Vjht3ZETi!iD5${rHL>z7AS4^_;2xVb5a35U7UmZWVewQlkxR9xJ)D-| zWR?F!h|fEhQW~SC5ButhTiL=fEwUfn_XL)9ld1;_+UM;*qI^EVGB<&6f4)P`vVxok zh}rSElAFAqjolZ45w#@eo!b`Q=)Kb-;@JX{@;e6I(CxZvTajvqANfNboCaw%>H5#7 z9vN%~?r$|^?4hndaeaMNZ9(RXZ4?z2nJBe!?g4JH@Jmg>QqKnqFJ&mVRQX&J(xJ1V z;b;F7c?*WfJDh>Ds>ybOx{0n>%^P51eu`ktDXDwkc@- zSJ))Cwcw9QkJa`?DP}anhY_g+koO9t)9Krpnho2GHy8IlB{Y&#>$-f)V6t6=9fe;7sJ;rU`;{QU#qEef3i&044_x*soV{BsnXuNNozWk^c#s*GR|H0QFY&?L z&pr5gU5BIX6{ zgDgLd`c+k~K78zOgl2G8$NtO5O`VEjuQyu)s5<+)lqQ??iY{C8;J+QUu26d$h09-PaK3785dOT z-{j4;Gxg$=dt;t9-I6BfUt%-{5MKa}(nx{X45m|+tyWy}r&68jEO&L2NLEv5>*LW9fx)z8=)eEN!l^;q@4#szuxRx~zSV3BafyRT2%fnqB ziTi{o<-ZcLh4qs+qb?>d6K2#9zU%ZB9D&sMAPA*qQ-d0^*nHXaBysP_(`BtM3r|t$ zmkNuxH5Wq=hdT>(&-zt52y!5xqJuQESoY3{VUD=4eyM|7^A6(tg)UPC%EuUM>=$&& z!B5asKzpJ@(`BMv(d33*;pE)LQT8O_8=_XOtt&3-8KqVqZ0&NIXg+iY*Jr1}EnOHv_e~tfv5;`go>i4!xSO*vLIk&=9C|!kK2Fcz zq37QC-ls2*)YVYR1G+CQm~;^(@sGc5kZIf_9SNjK6SF{%sa-lo#n=$WIH)UUZ`tO9Wp0!5$GqMoKE z3|~tYUXD-ou5EJD6LsW39{naEhfWlan6&dGHA{+`l(Cz{dE#CJ#?0fOsA5o@vG^g0WR3mUZVUvcPHD-ZBfj|` zi~3U(CUZiEhJEG%RCsK_-^+;+vAPJhy~kC?cgMpfix0hE6a@&f^Vg!8 z%(Gr?P~bB4^&a=G?%eDAfVp}$)b6hJM!PQZf>f`Hp}p)Rxg#Su)JlR?kqaEf3Dng( za0T2O&|V?&s5mzl0Z-G|UQcaYp}UfV*_8kKUZRRuKs&JngP6G1jv>?d1rS--Ipa)u)a&%-RyIqi^$R5{I>EU;L#=1L` z7|6HUYuZ|AP=JGWb;l(N2SC?;UMG`je_Q=t(o?4|nR*D4RBydMaerZ=xZ3AizK`ik z7#-FpAJy$y9z!U8u-#ii^kBWz@d>DEMF}4LPm&N+Hoskg0hM@r-HwSUL|clNcu-K2 zyS;!9(Lpazv7&ITj$Q* zGP5D4WJ@?q`UW{(5lKg9-=`kzBaEMza57V!a6H1QVnjRE$j{dHokE%n6CXKu4#^LF zqo)Lo(gA2FDMT|HWih#fuBs9}(2q;%COj$!e#PCqP+LI}uH8)VK~ydljz78MlQ?1c zwtMQyz-tZ-@pC&jv)X?*3)av&Y8><_8Bv?zwcMZOYF&5SmhHdNTgQfc9xt{mqZ3oNS{VDFgNNdINd0-gHrMDN zF_$Ph(>)RXDHG=1b#?UfGGc$u3vn7Z@j;5wSR7zFljzxJfLa@4ktvB?wNBc9F?b`M zvt90*pH=AmULu6UTARtzt5YILEZW0|s3AgEDIE(N=)O8yu{;jkR5l|Oi1`gbt})-Y zJE36;G9j6u5<55sPln|sP~$>{i`oe;t@At*KjvTYs6|cWBv@3bJjAU%sFU>)a16+d zP?p{i3L~wj?jG)HEOU{eHWz_%`D*Ejs}VR`jYhg`9wR;=PQ5Q<24n)b>;7@~dAn89 ziWKeJ5#sPo+^%Y^Wmz<>6ePtOI0Hf04)hplMBDrW*MxHzasO)>7N(IU>Jdkx~^Vi7po!o^T+bLX}RA@4fC zJKc9g1FuIwf4G3&PTcE#l>!0@sQ#V>042|)Q?H~qZ?3I36m+kd_~RY2-4^70&P)>? zoh2U;lccDKgy>hq3+%tI#$ZPu<_XhVW>Ao2pp7NN$YJ+9s2L2k)u1jIB9uM`EcL~2 zsM*{t&vDrSC&SCz6 znC$QK%alv{WS>4FGLPH5R=HOv?0klqxB^QT?4v(|9 zVDX8y6$2BbPwMyFVtmR6^i#f7HCOu1yGES>c&;ZS(M62i6(lA_vo_YSADC+T?Lzfh zq2%SW?g>739Am(BqfR2}D>wwuwzxZvf~7xq0c<35Z)KR@v4EyIw@^mnv~X>}48$IQT(W))eM3(izTya+e;NEhT(Eh(_;X_21~P*k8yh zO~;3hyOk@`(`R@QZ^S<{cOU7tevG?(6(Z-y_f*>(h+;~P0m178@{Tx-+B`1j0MP3>ZXf6XXLq?_AEeRUz2LLr#v3qw{e0nmyOcW?`X zIw{+XG}_Ui=;aVyBBLj3cASf^o^5=H+Y~a?PbPUM2$)g*>neV9<$o$!&+X=dAKxTf z$u5C=qoCbuFdX5Rf#@M$#>k~ zYiM8@@80lsYMuxmW0I!vDHo302l%f%75v`dqI3j^ChRg!2E1w-bR(Z5n=T9zFsB6_ znK!le;IW`@h@dqy6SH*3nNF-deKQ;B9I#@Z_DSC!Hc55>fI?TPcwrIxzvaD)$Y=LT zxJ$layDtVta`yXmKJ5n}d(tJBi(C|bemb94Hg8Z`W_0jcCkYn#V59fB95g9EdDLYh zB*ah+p?Nzb=l|qmF)8}9fRH7)8u0}?nKrAsV5-mE*prCuDF%oG-^E!&5cgK+zFn<5 z$!$j0_eXU6Ut2Ifl?a1$<_gRBmI?NCe(b?kxtej-QgL}23!$ct@txg0(oTMBl!ert z!_0_b^`r3r&4Rc8=bab(ubi-NG}At;vcaiEtAic~<%u76ytf39LSL9KmeQog{V6jV<4W zd(z5x%Q}ge(pZ1$0sxY!f8<&Ayu4PO!?HWq50$>SfnRE0R6lD&T{;cE4@k#Pk7l!s z=!P-dMM5EJKX_;&Lm8H2E}I$UOGGC$?R1(j4#`A?Hmp{SbKat*Z7-|SOsYx^D&z1p zlKRaD6Az9E`n3~y$k27A@MZ{bsn0ae_H9Ari}&-~$F7)qrh*eHJ7BcfBF~n+L^i{J z8u&}Do<%Dx+ipvKil$u-OPefOSugOjBQ0u$01 zV40zgCzhYVt0p87*@lrkJ}V_EmTzp)Y}?vlrdW6cPFl1;r8yus7=qi{%=3>OdP~ z0f2MGVM(YFAmSqNQf)1tY9Z6MKOP(B72rw$VwjAJ2y65VSTJ zJlCUgCsJ13Ec$Bh`$>+BE9Z^7Vs&;c|LsP0j0<@e?7dwbX+QS5_RLc*CTKZ9kY|C& zUw$-T90<+{rT;mLqg}4Fd<^@>0uffA^V@S7o#$~gOmJY{`3!S!@QvVlqb|K1?5}Qv zo4n!YWBhSq%{5-6g^!QLqi*Z#)}ql;7C}l8=$AZ&vo$JDJ0@n*XtlbSTh>W6SC)7~ z4^5b8HXHYbP20l5)ph-j?v*L!kQ&;*s#kvUw(7CyqB9op6Y?X#->|eBaYYt5EB>SEo*B(&S~tU7 zFesC2t5HZmq2rzGsiqpp1qe1h?7Ni?Ef&)T;7JjRm%*&R zo1q$z92}0^S%7}oVD&7XX{vCFo$wvv7#ZhU5x+lPjyXEoH&pfR@YaaAmZFML3@xaV z7~FF$x05%;;ei{VW;T+jcpc1o7TAhCGk;aesPSB%ReN>K`kqIrpTzsjlec?*UVTHy z3is9Fd|2m`WoxAVbUa;Z4YmC%yz-vTjGleFz5ZnQ`ugHTaKGjaNzwFYV0}9%z%|H= z4k0i9lmV~FRa~R}4!5D4+Z>V!rjLJ`lf~SQFQra!5*A*wO zvCk<{wR`ClQXk?_lH@GWq#$kCZjPhZ%>e*hW;tfb`l7#^;Va9^UhCeMYiSz_t@A`_ zbLnJ!Pr_NnYF5j$A;`HaZ#aCzQC`9iM)*+~SGBfX#(w?aM-c~SN<5}&a{wom#=AtG zT8z`F0tK|(en~duR+c#co=Pv?5o4fykt9(I^0W8DWC&Y^;EyMz_$-gin#T#Fzxh_{ z?4{Ab>xpU!69tMBp*xOvNkcF+j&^MJ9OpP{Az!(ti8wmxpxTH%MdsB`6>WEIgsHEz z&rium&jyHt^#Kv-*iqKMyv_X9mHq4i1!Nl~{?xcHcho&aR*CTzuJzi;cw%WZrX>>t zpG~TD8Tz3>$@U<(=fezn$+<01hbN(n&~cr1GDy7}f7r|-3qSD`nd5CY+)_<7?>gPn ze*%E6eZlFF;#bhaE6@SeQ(L+@3cfl@L%FC+h_$g*oPU?`(%Oi>OJ%H)mo0wAujKRX z>q(OOi939Ut($?v`n|j!9qPRqJFc+8H;BtzTTOoyEe}1xrbI zJX4zvJLCVT$n}4xAU@n~kmO4&x*QtM?@h>;+{Il~mhB)izK?lgdVz_S-^IdCBWb>^ zPB%9AC!5bw{m*Nvhs{aiq64@~M>8uid7>AWU+4~-cs`A+K8&;3WRQkYlmnu34ZMFp zJ>zQiS!89b2m=%r-RmFhSGdH~PuZZ`;@L_&VqBm3i#&v;NRG&%^7*UV&~`D;v-Kk* zhIz#hMTq%tmL$ErRI&J?6CtxhTk@IiXu3QS%~Sxs9LuG~i6etPcDhEx)E|#DZJQ(# z70Lk%s3L8An?&qH%|d>OMo_hD805#G94e^TRms+mPSvfj{W!KQ1geryd&oK zrVM)grY^73!K=-8m>D&`K;2i=r#ucSUDawxG+lA52m{Y$pdp(O81^boV?p)-7a-g8 zC1uFcCcw9OF4elsrki%YZP&PJ4>YbJH7ef9j?0i7~sxiGvYIBK~JuFE!|;2~ZUSe-ES- zcGiY-a#!B+v_~*I8Y9n#s)w0*4b1BKQ?(4$sM%WA`y|0pzscinW);sB>7$Qfi4S

kDY#Icj}Tgqn!aj5Vdi#)BWI_eI~IwCkJzd zZ+BkUZ8sA}7(5H_*}u_u_9qevbGr(6Ss-Ospr9Yl^XG^!o9l)e+x0fxhP$7o)V|lA zVB2ybs#XVmvE6GBun8!F`%|$Q!IU%IuG;uh$ps)9n-9-;@dWU5)boXZ~*M|NMd671y4&FFz5_~MkgA_!a3A9BL2=9r*po7;WcMV-3EfOfSM( zvr#g{9I&_IA)ZcrNupU$8*SQ?@b|zB9Za~E)i!C_yB%-9#qakFFay`sq~M}$0SfRh zv;?Il%%wm#tXElfCaO`uW}Ig;gfjCYM%{SyU0Y~Us_$)G_ahjEg6giFfa?*`cw_$i z6v`f)9}aLMivJE&XNcBTjd@ig&@2ueThGOBn|2HlD&gPr7PRq zw&SWEomIWtO$KQQP#knpR&XYWp`xka0W$|aez<6W0=Ps9AV%_e*{@gV7-{Z*9h#Q* z*mYVkcXU7BO9n}5+9w7d7``KH**GkgrQ&xI7hU><4Uo`IAnfMo+!F6o|{RC3)cb9#~p8onB zq+Pb40!K#?UCQ#QjFZU)&U9_2e(F$cgxayFXwxCl5EVxy?)Ks>zKlL)0srUO-ic5Z zaQg<5(`8_5fF{H}Ft$6q_0ogMAi$yxZi^XVwGnDDK3M2Mt={c5ga5 z@Hzq3|NV09wM>6|A4JRK#QX14G|R@K8)6xg@;^=L1g5LtO|vK@`pc+JrzF`45P0gi zWx5i-W6Ed6+4>DnD1<| zXtTe54J-llN{*vAna^?%Ej+K-h?>IsLSxv`kAGin*g0bn+uwpV&5vx*qM3M;%wa|G z|0Z3DY&mJc~#{+mW^?}yJ0 z@6Zww!YV$R(`NA*?JK&^v=LiapUAell@2M3vPG~IguUQ*UF&I1<45Mu>9Q~i6B&{h z5-C@QX*2^xYE1=Mcut_4^0D@*34R-}#_i4MJQsBRRGg?-z=bfVF5uVuEGPQkUyWg{ zLtjz-N1AX$aT?9lt*daNYM27fm-J3w%SU}vASOueb^1ue>}_w-gQI>QvNhf06!$4^ z-*TI>XlU6N{hgWQHTjy62sE?YV{S2tY1xWEeAhcXF*0Kw|Ghipm?aE43$RHPhDH^d zB@|mM7Eqv(#J|1UY{V^A=Mtki#&z5aY2PJTo0ocg8ud&*SGT==GG5+q-{n&8j_k}S zMh!rdXz?x4fwdV=z&UCL^X|{5(rZr{H7W`6C9c|NVAzF{_VX@#>H7^B4{U87<){&6 zZ>I*lk70_21^}LJIp2(7SG<`O{J1$6*8QI65M@Ka#znofB+Ky0C4{OiVdiZkzO8Qi zllmT$=N1}t;_9?j%QFe~7%a1-TZ&wke(-?9#Y^l}K&f9l>QjbTi^QrJaBG@haVmtt z;C?Trmo5d{&14I4e@}=_aq0L$>gZi;IK#tuy{0*Wp6}PzC-QF?VoYCfgXyltmXaBhHZL z=BwTG>%pZrn-!@2EgE=roaZCRGaxOHd(2AD{tOfc0zMOpotXa29oqnX=a=`-qW?1j zodGzZ>SBKL&xrB=4Ey|owSX4C@Wu6KEf@y}rMGC<9^@_gYx^Ur@x w{x$j6bdD)8^U#0u5if8vpUwc|91f>Atn`&>eJ*@!g&4N*gJid(S4@gMk+aBMH-C^0v+O{G9Mi z2C)(t#>x;yM*oN~8t;)byX*lyY%FDiiigU=!oJu(>9D2ov$Sy6jP>J2(c5zg35lN)OQhoQb0WoVyPS3r7R+;`y7(hx6aR zfMfXoH}-#H|2Ou3WB)hy|L>UV29cg`nOY^Migue8KnlTwYkUopUQ<7e>Jhz7zq;ph zYk*?t-#*qW^K8M-?WaUDQ_y92HTnGFqOQ7!rXYT+8px@kbYrW3aNpjWGpmKuNc-mm zt*HA^*(gI_QZ&jF8;ryJJJmLZ_`74xg$G`zrQ5qYa?O(Ylq)T573l?h6Cj{$48h!T zTN~OMksRnWAj!ucTQtX31ux>3UD1c^RKrhqBbHj2hiPi~`7P{Kp^tbpU@QP;m_Ro} z;5E@JM6tK438pFUw_WwN>}wg#NAw}AM8TgDv9kp;p^SBOnZa*p_U>T42~co`lmCt1WB=-)slryX8^mnGZohD`3#@!(!mYyLaz_+3uG zU+52Nqczd{m8v#!dfYZnJU-F|?gxcwEq=@5KA})N42DcU-kKr?Np!=`lAj3vIa(aub5;M%L$KI+G`ewdBT zrcQMd^?V`Gt8}X5d)=c8YO*@%k{PQhI@$qODvyT{l1V}c0^lMfaYmt6U%&arq7%AA z#S$50dPZBlCfdZ}A+s0HHV+-yMn{XJOeO$l=ST0>Z~RA>q~rD{4UAgQnj(as+tGDQ z#?_|UgW}{y9;OOkJ8Gd%guOpY=U%0iHNc|{O#cXW91H5ZTu1s{%3nTOgo9}{4&ht> zD;&6~^Li@fN5!b1`dN?#@L;b@TEIJY!OZaj@L0Qa_ZK9c1!L}){8(QQ_LsJ@YFZ!U zGCAj;njFj>rn3&Pnfi6WIU2hssp;4`zco>Z_gQRIIQNvU^0TDo;}q)Mz@8_1KGYQ4 zX9+#QYq$HLT)cPxEP8yk)uN4(Vuq;Z*ZkhRMX1!b`)soGb{$f!>X;4p zqHCnC5c(d=xaUU+wMv=4!0!9s5XJj`V-RH~^xEblgLAyp8C z2Y-W2CQH90RE`PQehg+hJ07muyLct>Hs67SxW;__gC@ zW315IMf~lz2i$$H!FY$bQTlHtLJ9->ytc-!!MSjexD8&RJw|HJq$;gAm;1olT<>eZhC2s zImGXI;Nhv*c5!bW^CVZY-*iCnFOTGHW#AXLh)b`mZ1+VU={}_|$L;31se}E+qd-wg ze~%!m1@R#s)l@8VI*qXIZ&Vh{u> zh>)0O04vb)iE*b8?2HO#rBUGBNodOdY=u04%@GWfUn=ZAb@TZ2|9P?lVjA^N6t) znABcHb%N)4KYi_WbXXjv1V5X}y{nm|g$x>9_h$2oD;Hx{0In4gGvyx}acs*WDVPFWN*)5~05 zeeBVQS9&@&t|X~x!_+8YC$;$>M(w?>h1)jWirFh0;r;8&fsE(-`U)jtPPQfzKUQx0 zyN|b(T8%Y?wlc^YmjfN%`Tbl!;C&h?h{YI;3MrH|eUDDt(_ioXEV)wp#60q*N)*RZ z9wbb5`z@^y7?-HR`kCLWpv>CgRy7u54NZ@PiB{stOMG<7O<0u$!Q~|6bBW<2Z&F}l zu*G@m%fZCg?h|oMuKgQ03c>m89epCU;$y94qIxQi2~VreK|}Rm3f7BQaHx2r?1qDmcM^OHHZzJLag-3Af!6A+ zT5l5(dUpstv-RI-e5D=y#Mu-h4OO3&;l8R(C+D6ggVCthAORZ64hOn1I{yi_`}CGE z3B7*VYstOVM$W@(CBz;kq!3VMIJ(^m#wg3S-up=S#JzS{?G;!|Q>mwcW~XXrZMntW z9y5Vn!Il~T%be0`vC(eKPaL9%f1~l`H+UYW0sGZb@xoJs+8}t8Ev+w3ff{Mk8*w$ewWH3oOWgEDWu~9~ zA=DQag)iG3B^=O;qlppvou>NATWPq_qf0%WR^zy7RS%LGVZEhi5v%RY0USobJDIR0 znET5vb1WW?5aHkf;4VN=0}QDQric?cjPFlT7MC23&#Ac+TwDBYdbVf!=AnypKbSw= z%tG8_K@gOSS`9#NR2~`vJ+_`>mAV8mg_D|WFXJ-cqgh>o@Vg>4m629BQOK+}j;e#} z;_^V7S$#9qDYpN_Jq~P!qiG)If4ck^l+&HiZLv>lve;IF->T5PI<6kkU_bpeHpheh zIn(oQ_=mBZJO}kRkF=PiI-D+ME!1C&cy&housyYrC2U?|_&hWimjqdy%%>09!d zmC}U7)UEGK!$hW;!&Jj8J0*+>h$anyE8DH6UdiNYS1l{#?=dU*gW-|W>cRxhC-!?e zfkSeOHEirpD&VLGi*bD&yV<)b?heC&&AsnFpTB$aF)X#7i>gUP+vFw{HcKxBS;TaY ztT%zGnmu-(;eNl=pJ$!{bqZxNIbUZKYS#TxSqGfWonhqNnE%dt$hQ1*hs$ItN6pRF z#JR1Ct+;y|Dy62*ZtG-W{$>!KR-B&_P%dR}P?sEpc#(FM)uV3k`gLn!LZIyzm@617 z8bi#(JsnNH{`c%VVSxXo7hQ$YWAECGgdeaI3ZON;$+F98jNrb`y(o8&b7+*P$m~Fv zs%&}MaZVCk6XN&X<5J-8=G3g#^O5@ zH|JN$$iP%k$gI4NN=th*GMUMq`MrKO!8)I9;B?H9xjVDe6MKsjNY3NPa9{mJE?Z>2 zZ?3J#LCO^A0@M)WcDHg5aH=vOMkdFM`on8`p)5*x|n_OQGn*-Z@amuUXAl7 za%#54rAE8x3IS=T2x%tJbB_UESUPiGOk5r|A)}Fp_BfiqI(+eI2q!?ftqZK}(G9HO z^9-f%VysRJr|lDXx~pp>rCO8EAD73c@s!Sx%#yrIQ@^F2a?cFmDKd2yg*Tc}m^a%F zabaI@cu1ufwMdE1bzVDc6Ar4im0(&ilQ@Tf#VJc~%Ona##O3*1X~0Ybqtu~I+32;c zl1g2sySz#!d7m{=GjS9YJ(FA5`qr1;+o4lbD>QI^Ql(^N5S|5S6csjIAF3T+O8z{L zkvG`3E0p?HY=9BfY-7_;qMi1Lr|^C3gvp=7v}vCXVinUkK^MU{$za?uIa_WA=tOGa zyC>|~V30Mu)8rcRK(X8jsmM_S1`a}BXthdS=X$^Dva4&V#sRCr^g z;UsN_=8mk4gC1c4(tVpX=02baXc|bF=q#SqY81S2Mdr4BQbqi?8`?F~LHf^sUSq-{(d<*-NEcNe2vOk{s|WJM#G$MqK6DYa{%w7Bc2=o8WdoDY{mE$XM6F_mif?C;?6` z2xIg#&+M0}0{b_QmnkZKr|x1^)NmJPSe)3hyuHKR;RhOZXFGplugLe$*yki#EiQS= zQeA$I!nL{e<~&R_gXO|+6xSyj)eMhJ{me7*Ttwsjjx&B(OT@SUT`2{udo{JDdmlFx zqB)i5g+PR_-?!Kmz%i_Q`F7^DGb`#a%X(PAcT6sw%AchG{44H-xLr2%3ZlQ zpN!t>T}(#*)bU2{`$et#K4e~gn?_jV@Ar#w%>Qw{0)~f3wl^#9*87Z&$w_;{(u?6C z!r|@bty<6C_$JVJ38wkm*6^la3^GHsanZZQcCRIUniY|yE%tIyeNadCkUVJos(_xo z>K>9w!H$HEd=1MFw0taS%tZ=fYHG{U7pq}{`wW5auT=)B=HIk8yLHdf9i>5SyCN&<0O5_dbjByHs~Y<=Ctct5L|Uf> zhpzqpl~d3?IdciH$=<2~F}Ctku!yQy_)u$jS)#YYu(Yha7H18edck;HaMCX$xuVP` z)JW^70ZHGY;;5U=Fmllso|d>IJ*i;I*9ImZ;zNDK&pp}p9y#6EqNveKU^!`H1-v=` zeIUIzbz*_zvWBUPfTPl@6$ow&*Z=9e)a1%!mwV0xQXW2Fa#L}xMSr2{A}zXahZ}4> zc$g@#D-9M9EuK$HzTcc3=Zqj;-BI%i=qw&aov)_&teu=v0Cd7f%l)44J~PH6vzgDS zl4Ap9vjRs#{Nas2H0#k}{f;JOYc!RaHa*3r&aG@x>`>E3s1=frTB<%dNH0+8)tuQ! zk>oU9xAMuH|G814boGV7TR~zNWN&TPRqRCQ3PjV2heHOmb$%Mur{OCt1_8$*J-@gk zgy5(?U$(E8G0>;`>18!X4+KvGa+ERkHDdqn5^J;Dn0Q66g$D5zP4Q5+b(>bN;oOH84TDwX*H>8Y(d%ZHq zPhOc@=cV&i1bJrXe*EXORFAlS1|?v40OId6iH`G>Oqs8RwAMcsp0BNCi2a*L*@)65 zCi=?_2vVaAHbW$`4q}+1KA7SpBOX{&(5*aZL+tiDbIh^qQ6_g-Z!*+)ze=0 zO@@tVX1w$!0u0K3#706CQ?J2^;j9Vr=SO;xU&x;P>TgDSU{HjFT=1r;rd|MI@eoXw zW5mh2egI@|F`D+tAJ<(>hsM!sTE1g7xePE+Cz zH*llRZ}uynf=04lEJpE2uLaBXUWFbmP}51FQePq}Jlb@@J$5$s{J1#|_oLs5cIHdD zfpj2T8+NGF@XbLJ_~PMr$k!Nucw{=$?&Bs`=u{VAV~m;ovxx-E){_tFG?!m7B9k=C zx|ipchBs2KrQgv}zwP~Xn@*)pC>4z+MFADd{} zAzqV{-3FP`l9jV+eCsqi=qyOwI-vxFKBe(*T)GA2u#^6Lm7r}6GyXlnop0Q5w%Ddl zrV7cFluH=CQXOtP=RS&k{F97Eo(Y5MYf&TQ!H|96In>C)MQ?wqPc=Nb0WuEIRx+#T zRXYAINpFgf&tbfCHkL9;t)WLV`*gaU%K&B-{j(dUHJAQtIGQ{*VbCt!V==nV>y2kZ z`Btd?&s4#KNL$K?%jLZxIsI>a|9UqxWojjIXLiHVW!G<58-A6_NNzMF`HK=~Kyg*> znQ33|)@uBf9NQg;H+}?~fX)INo^^52o2rCizFS)@1AJL}<88F7#RD|r>joDJRwD$gFq?*a% zhCNM#%ZX5eI?KWb+G9!0NImIvq79S3`6QtI7<3qxtt~kiR}aKN@=>5YOyoP8QV1l@ zYWzOQH+HImdHcScAhdfacs=*pkp$5M={)qNj`(2203zU(^KatATQPrsD=V?u(tgUG zqBl;JWWa^h#3khwqeOW-mVra3EP}QEXdE%{nDITi-U0>Q?}jS0@T)eE$XU*a>X$*B zXvJS_ZxLv<)=U)P8Z3T~eMAW?q>~zYZBB};#_j+84O%4JDV4*?^-MJ>$2c^W_^Ajkr3^KVPZ^)XRP&CVyrcgSqj3lH-PKkkyk;RiN<`M zs48zgW}@3Bs*1(W1YW+M`}}jPSzaF>eJin>mkGle+WsH8Ki&Rlid87#o`gzW<6dha z8yb}{^qo8gsA{Qc8$`OT)j{1Y&9p+9NnlCN1ms??Lo z_`>_-I<~O(q*qpcPft_hwsBu9NwtLU+KhobvTR-ql5&-+hx@(7HcY>#&C7IQU0rGz@-hrTylj+jA%2~S8}YE;@D zs2d|xh+|@a9Xou?sJ%xpwF{%W8#eSKWWRGDvzYXd&KyKX$k!traNp^~{zj~pYvX;8 zjPXJ`p7S**C8uoC;7YWX^!0@;4LPLRX`Vf|r=_MWbS&Y(%58~#G z1R?F`$J81>1${=p+G|Cbl86)k0lK61ief|wprJ&5;li^f$n%RN3CDEPaojdWBc!mI zX2rlhj|B+hG$**6(JK$2XbS~A3Xq#*6$Fj)ZWvNvmh`;OMEZUGAR$YT$4)_f-__`j z>ufV>nMKZymRh?aEzJC0$8e0BC9*(>wgy$>9`-^ zUbCd@n10l(wapjC-XaEUrX^b>zaPwg%|--UasW4C>(u?-aSjSm+W~oovz)-M9EnZR zG#d`@L0a?3D|gQXy)3$Xo%pZ_O4HP$n`Tb3C$p@L-!u)utqx;1j`RleBuUh!OYVgm zmj8fXMOI$cGz!pjxZe6>K`6cn^w*k&$Hf3t)RQ{rt!}L%3m*!;o?zB7-}a}ET(!!r z>&Clg(J4@cCoWv$LcT~JAN|(&dm1_UH6|M=1<}y@{Q7x>^Pl0dIu^0y;{=dDJ66*8?nwmM&M z9xc-^n-L{tq1U#ptoUzsM`UrAjy}9Q%qb)TS0eUZF8SXv0(;0TX<-z%C6W0_CP@$i z&h}MzW&4r@Pf$|0>`E7G5W*jP3-1|H7INGT0XMNdqxzLrfj^#y>a_m4t7UTMLw3c! zIR?8T&&a3Xf1SJf_ zT5LReWN~YGyj0pDouJ?0#2X;9YokRI_KJfc(0FsQ*X+D9wL zwG_ObdbptdS7B8;SX-k8n=iCis#etzn@r#In~9<2&~{DDF#gKfgMK5>S?wIq?fs{HA zo6D=eRh(}UtFQ_F4xZMYHT5QVGzWZn{teQR5m}f){gPkLij7YiRjF}p@S5d~ zC8p8Tw;oX1l6eFCF0J*(ueFJIyKm(774z1c`R|20xG~d1`*rZ@P+4qLqqiIL_VZfu zawt(b=eqh0Apzz2SYgg)*L9YR@wXv*KG^hFw-X)ggyPndZ+!!-y>KfQg2IR~ysyiy z8gz8unxEctQ_aeFCg=IayJSRtrx;JF6+f`{-#_=P5&XO23j$eFV~@dgsI99)f(`8l z7nH8-6zTuALInwA3^U{D=7-CUoIY#a{r0pG8<`#Qt8P)6*VfmtMN9Y6S(4zRIk{XU z7SHY+S0OPlqp~JaaOlm{G60fW2|!**Z2Ck9_9UqKRRp+N)dE+yZ>%LY08f3Zuh!)W zuwwnWISrXvVQTj3Ade7l?l8ApDxc*ByY1GVHmcRwD+}*$@v(hgKDAmhRFCd`-#!rx zvf(Qlt-`lQp|yb0b3*F7JgM9K@ON}W_w>QbhtT7xQ0C=5$E=K5#gk)-B#g|LfpoR- zcP4HfOrOXE?ryXZMDY(9QEAr;=bji61&^74_xd&F;--o5*&y>G^%($)K8o>qB0_n(jxd>++usU_WT)AVXW zDQvuYdBvoHN>%-Fc*(9f%%@^R~;&=H0CC1 z>s(7Hg~Bz9=P>@BipvKxQar_=!ay%f^n5XM+-Ke!b1VO%`|OkIZVF^U1eFRmwUgvE z6+|XaAMHLd{@!{{eeB$}qnRM~I_fCyA;s?V*5Y%lXRJDGd1n6<(OKby zfV*8@D$eF!-BmUZ3t&l?+SPY7<{}~rEKHs8U8aOx81g8r`~R$_PI!AUy^>e|xkbg_ z-(K&UL8=APR^`c5yjJ>)edL!?q5s_5z0^&M{$f=JgUO2m{N4f|GbM~67gq#c%=|1c z<5?UT^v%;%#IpFqvxj!x-PH67`7N*)N6QKa()h_y&nU(3A+RO#E*;n!)Zk^-o}cG9E0d8V+1#nU&I@AX&c_K! z94r{ix^UIz5nlC)iRhCR-6q&xjRNJ<&18dPJ-CU)ZTV!A1fA7oqAR>uFsdA=ru$$} z`xQy^gCHjX0bJ7YEep=SA7XWZ`12jVAdyr8Rayptl*`YT7+l+BX#ocI47k^L9SaYM zHCYNC6xq~%kh$e2l68&vpPt3C?8qqn-B)zKDf#MzPz)!yceLv@fSpLz{FZvI=py~% z){)tHhq;XGw~_k0)_Ko9Vw5{MjQ{hXw#hqVjw(tJc)nrC06OGHDLL@)Hiq8B8|-ZE3FAX~FnpFepW*s>^3rv$bBg8Hry1 z!P)+zSYPg$P)Q3_G;a3ZpQbdrPC=UYAhvkgqV26$<7}V^4w4vvV{`I%9J^Ehp|ij) z6qJ6HnS>qDzEw9`Dn{Nn$2#ecOd4-g8yjH_e=oJm2 zPzM#(IUB9Lw#TaN>RjH7MicXnk@&{!=sinmcFhfqniV(Z6^PX|lXi#S(0#1Mi{GYu zzrKl9nLWQF#xS0*yDL`fuRq11DSlcOPJTQVAJWWsis4*{MP=4S*zNAOyq0tJm#xlC z`x$A;&+Pom$nz6-cy~FLbAfj$WABQz-2vuaA0b3iZomL|q-8UEAHloo>Mz`A9tTB} zZ=F+v5W7Y-?g`n_uv*G!ilI;;H+>H^g8G$Y=?|!eP5?xDrT;b~M z`ozY)j(rAC#8BEf3;0>9;p?BX=Ud?BS6%yN_Tu=kv-Tl0;zg!`mTEg=7^)=n##e#- z9v50b`+5O%^|A!Xd90KmKYzzw=*{B3yP}|}2#(A_C z`5oF88HW;c$?HH%^j&^F%Z0m1qqMTzw9)%T@DguqVi&_$`r}v*6p{)C+%PB@`*EGKUM_am2+W?Cm7GY*0r*(brTfD{ZUm zwj)&|Wnom&v)9AmKL!yq)wPPKGN7@jlfOQublckG3e={dVU|9QBC0f-p&o1jJjK~= zerj7*0{#Z>qYWA%`DS6lxnzL+1F>Zvi)LevAY853^_%)j$vQ8c5L06lvy5^!H`odh6?xKZg4>_h;DQO=csk3tNHYOv5ul!6f$I1A z=kdQ})Z~*%#p2~B>T6#p2Naxa7iOrFSE$Q=qDmfU!P_M&?Vo zHI_YR1D@|J%KTe8z}=xOJ@!;X1@k!}84jGb=QqJ6qvw@6W#-es1i0SF2nW-!WH|{^ zgEDlM9gV06GTnK;T}q^9ZSXtDon5!;%6&)9s8R~Di14t%bSRnN4q0T@u-DY2PSe$a z!KiTB$d2OGB)(_q3tC!*q#=^gMWVZ@WuYB8$QOA<>LF}G1J-nvp+xsAiv0tOSdKnz z4OZl*fEP8Jo3T9k$!wd*^y{=2L6Cz;@}b>nUF&7>(%9>lD=*4}_S&0tYw7|hkdnK~ zlmpBY_V2h}z)jPYqQ@!l)P{cJUDhjun`m^SALZXE@(_R6=;)In>o-*cMQBpC8N`A%(BpH&TiPX+Aj< zQ98AHd_kqC!cS49`s@>y z4xu#Rk!Y6~#b&rbv0YS%Sf5r~(#H{sdk#s-xJ9jw_`wqC_3#tt6abEzA?`81^0d0e zpw(KfUsK`TQ93S0->;0K2;5gXU@=VT7Q<5`|a}wT_c&HC|ai zO`G~o54I4Q92K8i_Nv(1R);@Mf+LIwN6S9E43Ps}PLxRZgE}(YcFuNnmLxuoz!Ud? z+e@+zb9Ee3>0@Fh>^@`xQW-dFU}smj+0J}7-_s6l{H_S*UjA%~U{0@mfw-+MbF#$G zwf8}eX%?`mVfbqVX)-hm_wALPL9BRZ^cB&Y-A2(?H{SbIR zVOdxfoatU9hTYdnV<(EX{ehbV@{{MtM7&OAE8c-8mv$RNeF)JwSRmoN`^2Iga{qG? z0mZliX>DER#V~U?vjD50+NyAK^@$&_d45a774{Dq!;Nr`fr`oG?zanUbRvF z35V!janXV;ZZMZhE44v`Dmc|PwxzJYMe{sM&@F1o_HdBz$IiS%3-fCEQaE@~`Sb9$ zq*ltit%O3jYPAB=IB+NbJ3hBueL_uG z_^5bd|CzKDxh!Y@RZx416>r4yPykobTjIZ>#CvR7?3outzz(sJMIno6XwM5x)54ls z52DXAP%m-}a0kpoUSvci_{n|zLfB5gLV^&}kSlB4{-;8Wr`=gM@vX;m&f~)}C0AfW zWMsd*JHCoPzP7))GQSqvsDYO9F&ZRz6I%}p{)9Vzdw^2;;8Zs8P6r>5u)pC-s0Eu_8X6(#ZR8BNgwmV%||aOP`dYFWQiQeoXm^*-x_}@ZQq#1Lg_(k z1xPDS1m{)wf9_!t7UV3FZ+ zY89vyuSY!Og`WOpQZ*ro7xy=3g4(8!e5=0x4?zEb06NEl=3t@Krqz6=q>ch$;Xnsl zqlVjWr}sF9(WCdm|GJf`a!f$v%Mx(K%gU)4NjSE5{)(os|sy>as{*7RdbLq@gHPu$= zR?@i6fjWh;@jK>8s|5xlUvMF-oeE3evVG#RU*ZETL;^4ueY@=tAHG>(|$^Yfbn14K;#6*^#+t@#Uz3 zw3(y#;;x%)TqYjYeVN5g7kTMH^x^OU2X zY_=imF_ocFiOcEd1yFC0Z0GsBg$2RIpove>Wbt}>MJS{3U1 z`-mYg1+EAZOT7^)2N1*8)>)WUkI?F1Mw7(mmT*!%c#is$tL#e*&hnY@r`AGB#Cs87 z6g$y8NRJA4kr_mvQDzW*O0XYH%-@JBuWS}I=&Jry%O{+0S8RYLZ7$2KMhXu;{T!)mvG}U%%v? z^@@?wfkhg$`hT&SG0>yoQT0Re19+s1xduUPl3%C72Mv*+%po~b`QRX?zS$vD%r+pT zC=r~CVn*{}=T_m4&jN|P&n#x%5*LKa855hPLJ32Qym7lX#j#m=IE5LPG_AtM!$DC60$=B=Y6`upfeouch~adWi4kZY<-rp% z+nnP8t_ux{0ocFa<&ygLGhbr;NjdOS*|>f%@Tmqa)WF}_CxRjw}06YC3%BHBPDWRGhxN0=4=oBa~7dRiwt=#fvNxCB-{we&&-$_pL@w>T$8zw59k6gpbdKFU-gFGkOKx!X4{kQ&oH0~U zp@0829m$2SX`}B9l(4X`;cL823@FEkCEl-qB6+2F3c#Gcz`~LGC5$2<{WJO?;F_Js zW1_48+Gl~f?EZ>kL@GnJ?C~)_=DzR8EF%Fe9eIGyJE7oM>Zo|>{qNAUjpGCBV)1T( z)MenhBkmwqh}HSG8p#=2{4}EA@4xAyA{+><^Qec?G>Lwh6bQKj`AlBqJRq__3DjDJ zfK$+_LFr3P8A%}!z4;LimFdqEe1g+-f!f>KxC{psMIN|&EVj);5b{cxp4})@U9il! zrS|0AYD6WJcJFT<(-JqSKTi7S=Slp1D=*wlPGj&T;P@f)TUS}QTqMb&hxQyRx@$B! zt-AVo3?J`h9BLhG6WgJe`H%BK*cMh5AUwJM?%av8Hka4QE5E<_R1o8A zeMGy^(Aek~wd$Cr6i6uOU3y~xTA@8+@Eg#-(JJZ$-#vd&v0S~5k2XRIM?mR6nd0Q( zYCH_nZ09`a7VxRS!P!bc7ez*L%N{EfT_gkC#1sBFc!50}a7PDR%&3RO?RUrPllxN- zf#2ba*zolC=DPn`Nvs^teRTf)RS_dfz4((ZgQ;uEb*J2OE(!{neM8xB6>ikt&tN382FSK~A$Z!0 z{?BW|{hoNcn*_2V`9?9@H-p;Zn+TpR|M$^rvm1PY;NwHUAJHiY|BfpHKM+3#1fxFg zw&Mo3Rvfm7HkV~%)O#IsWWwz-=R!ZI)n@0r|>xhFnn4)Y92R%q8>Rokr zO0$oCCIhE>*}J$oQ?J1KMH^@^y(v2D7jfE`{Iqx)24A-0y!0E zW?X4o=J}iUV$_`kaCW}HLA?WJ@iP_3qsRjL9UCW8aM4{Kf0xAFy3gE;G--nA$RigZ zdz_$wM-Mv{A`8(_;=&58^|=R#qzIX8IeoXS_}GXT+lCVgIIQCc=8^1uJ^Z5sPmqdNe`?v`mc*c=Qs~uxecr0641g zYK*p-wPcOyM3o8S8DWx0I9?l`_H1RIyhOAycP%o|^Un6D{8l|=yCg0+;D1rn$-qZ} zh85g=e@u4qtZ413{_@VZL`lD-1JAe~0@c__) zVAJSny&CJ%Z(kQ;Ih)n)JjX=Vg}C-xqv(>hHgD!uE37Xy(svmQK{H&$Jj1z_2sre>As zr$9qRX#d>{O$1U6KW^=7bO?&1^OZ1Ri~jNl>Y&_Rq%uTuv+7-xdq*lz|!o8^jLZYKhvaYgcrPDGJ|I)9i7@4Krm%_W|~A;!_6KDVfeT+ zZUxNKHEou)g?i0Cx@E=MCi|#q)&yqhI3X5WK^ezn zf>VxU0P*BeppOCY{`e!%l8rdzOetp>`;=jtm}nP=;081Rbh1YR81Ip7E0^ zxs;Mk*nXJT0g3asSAp^DeZ*UaK}Y-lcZ!?zePl9|Ib?~6#e;oMj_GalybcOZqy?OL z$yQ%YZ;A=uf-U&6)t}t{GQK7CcECKLcZn#8AhV0&e6nGB`ZeE1U+vDF6iEo^%DMf= zK|@@C)`=xj48*@jz31_f7zwI#&DY6RwRO*(Pp9n=FMOm6mXq>p)Bl`>EvuwRxlu!fiK+KP^RtE~Q4_LhIavNy(POR_rwj&|US zaa@5d7XTpWI3EJ1eEKNeQMZ;|9NKo`aZ4YQ4^as$>Mh;3-WcQy;C~Tgnav6R4LSq& zbL!CeLunM0o=)q~zPi$QB4p7u9&-rsP0G|*KfZX09rQch`ub-1pXn=X)+IA;s&Ut6 z7*T=4;MOHr+5|Vx-dPih^9NlH_9LCyUZ^-o^?Q~A3R42Ixp;G(>zCfF%F0_h9Wb@C ziPoYmqehjj*MJy&ye`b^$YhUX(+1vRm>Og(8P^k~098UDS=-zBw> zSQE+z0OwBe{364OMOUt;+`1+ze&Jj`j3Hn0b?VXKhKl>(1MkG2@tQI6Y?@Sh@F7h| z_9VKUP6Stdu?1O*$RxVX=KoPBb5uR{$u9^2eiOINVAXyK7oE8>PIor>$**F4gWaGg z!nDzfnI0Yiv`O15+;S730`1S$UW=*#>n+zC|5zmIo`h(nnyBI~K6tMBZ~AWZxV=rP zt1`hqeAmWtpc~SdTqnA1`{q8xp>T;e;C-Ls1-s~jEhJ?mG>N@Cqcey|>;@f+$p$-B zDd3#==5eEZMYXrBp1;Gs>sN*n*uxOghKQ#W8{zPQmWRysw`pgXpi6=!% zZqZxWu3b00YC&YsUezV>D{@+Xe^!nk)P^=)l|XwZ0?*VruF3e{_qkzc(j!pI*>(gn z6LkEN#&d1Kp5pI3^d_d3Nvt$&ATIFhjRDkc=N8ew(XJ|gE5<*U)wmuMtaEF`TEE_b zi@cIqPtLt3atNf+@w{Ihz^1b6PL-!R^Ju*kkn|kE-R?Cy zZ!7jR`bNB@!6oq2J&;JG^C7575ocQKOq?@BAtw+>IFT3ra1`IN7C2h$SqWd`>z7Bi zspoTK#pD^!yM5$)^av(+Y20s_gI3;LwC<|5@W4yRA32tD-DQr0ubeo11CJa!38z0Y zUN8r8#4J8AA_zakB^PdCby_EQ#{j2%m2@?S4O5Y;xEdKnWcgt=}ZvDbr8?CxvQCjGE z6&vkL%uC~?p$_A^Q7?9a4A22fYMRd;1xZ^@-2Ak8#QD{&VHy*0BSP@Rr8|GO_{B^^ zG}>2{4!G)Qv%Rs_p#b3XC7tfsd25IKBuMC9)w&L^Ky$L6(_bGhz~Pecfo)i;cR z6&~K7D`k2etwVgl7qxkTO$+bXyUJGPdr0JYq5#yJ^V{Fjx}$A_9Xrm-dnOLjE71{A zI@-mlBJ#{p;fJBZiCLlHE4Y#6dCG^PBz_M~_D09!_ltP@ zwxHm@8Kb;Y=UTupdk;^bQ*GrM}!{V?QL{FZNIR z`!v40aHjo%VMSLKNH%=z*-S4&{;158oRTh{{;HZ%p*OC-a6ju@(Gk0?>J{Gx3wb`Z zodZLv+ffyOF<4DE1vrCq zs@2xteyZ*m&V3qIplkyYDI)G5GS}HF6a1AE-uD+aC^UVa>7pAq z12YA}!)=u6c30VVNO2a|Gw3fYU1u+fHr`S42rv3*vdS`BK6L2jz#bF+1qFD?>O-kb zOAUOE)>>bsK7lW`J~SKd8}o^*)q5<(x=neFnFu4)1@~u_IEKI-EzFps7)69;g{4&9 zgJqdupJvO5zeT-BQ2q zSH)NC=(h_84>p|(Jvi*386AmTLb4jGSeps!TsSwRnr25zYF*cDQ9QIYmL`N zik%V8^~=BWqk6}_1njo!j=U|j_9S+bCQ7uR=<=G5v);5_nE6G z4<6harn+wHhxSN6D?TxwgkWF#?mumL9aMQY7&%&nE8Q}2hK^ZfNDU=c+K<9Y+ZPI? zJ*dySs=nuW(pns>8fNS94WDrM=7C!I^C+)2{$#y#)Rcj-eNPnEbEqyNV7tgCOB$i1 zrPZ*r$6XVMsDCbX$NprNSxkg8ItKZ(f_=iNnkgj^jqpN4y2Qt6C!TC&iN~= zIvNAw>4GXZ${b_$2`oRK5dp_skna-a0DEYUVlH94;*ngr+`CP-Vt}wjB5K zQ9u}&FTUDhh_2I6L}?Jq&XPPDo!pT1y3!Br_}jkfxXRoUzRWY^@s1;4QLB1;(#n%< zs=Op4w`xlQ*XuUZ>I`+v2)&_WU56g>+`GvpD@ouVU!;NW*_1>>lSRckQhUJi_%pG27Y=#4kF!MqIcRnjyJ-QAlnLOW?0tv>|XI@%CBgbAs@$< zd7(>T*o@HmN7kuDGWPim)?t*IYzByYN??zfEe(%~djZL5qG{z#mby=iVbu5ST~hEJ zZt)pxKAhc?NSYsSsH?Z%w5JzCorZ0OkHPEBNHM_yJun}WdHufQ@X zjk>Y4UDw;b)mTq&yg!$XPtGDRZ+6-|gH>z__6)*9wvcntN=BuQqb>^6+C~sGE?ih)J2}zKa{#du<;BRizjPn3Kk+?sK4ebkdD67YXyEPn@=|~i zStBRI3QO&ttZ6P?>y$Vqb_-?{5Air=p1F;AbC%usQSf8cQ1a=u%D?AYJ@Zf3%}2`d zz$+9x*%9;9N+U<+^>@~amGp%r-bBV8r1aE3nQTvdIqq5d@?GeOPS_K>_r6(d-Tl#^ z=Z<9s(WbW)aJze|Q5F<*?~bJJb8D^o6l4L^B~2QKUtVM9nQGZYb&CRp5Fcmn(wpR@ zh)RJ~jGU{zcroXfDGzK|(t}oBva6{gIW@P$@3lQ2`tA4h>Z(@U${vkoX4Lqb#}@Rx zearHk#6R@jHoD}Tqk#Bko$`YwFP*=Hb({Av9m z{s$PK=_`gW7bn*(2*dDY+CyLX$uU%+<+kQsoiKSyaE*z)C0G&kp&g5IKx3SXIdX=7e&k;ef&&+WBozV#5BF>iR zurfb9jKy10tQ)@8ZQcM|O^};rzVZSZYjUn>UZ-XJPn4Md@HRd9m7cN(MoyTmhSh7v z6WGlBujIRyytbf92b~N``kS)^LsBbzRDLK4M>&snGZnhx4kNsf zh|}z=T5-cwFhRhL(xN5gHv{r}D|xUT*SWs5O1XG5a7oH(w4G%_2MdJKGpJ@Lx^4&j zWmxGK&CTJWOQK8TY{vGzMu<#)rN5>ryT&v{X@F>M^P*B$0oN9E(anNaLJCt@cK)Kb znZM2fi>A%GU|zu*cP36&2j~~>1J3UEOkH5PC9@&};@FbaJX#aJX936_w=gXZ^Nws= zQ>D7O4=SZ+`Bt%hNpjwivXy&_4Hc^p{>f(&GlN}=i)4>;?D~bRDHn3g!IPXS0gq0Fb8rez4~VuI<&7>3Ad^`Q8%DMM-^^$FRrfh5&G5k*D7y(Aw`3R-XrM`HIII(iH~5w<;Ti3 zz}u5F$?^IaD!yQO0(qn~&Z{ZTnc2@|v22FcN8v>rT(Te?mBK9^K)yIaErg#6)YHGf z-$}X)`r=1I6M`cc-|=?Uwg0c|(`d3U{RJ+CZMy~{D=thlRTJWJ26kcWj05W5J5^~V z_%lf$9F=rgIVWJ#)T}_M?&{2kO%7(MbQVrXY8rflYzfk7BRnxEu@7TlvFA0qrQXegWP#Sa}1vMa63%_;TYgsWwnQKaKw=k=#LzH03hjbL~PEPCGP1!C9whw zQvWsJ@8&l5+wXndze18&W-^s-;Sh(GLV-x-%eO8BCoC(|v_r(Gc#T~r5;)@Ow@lC> zGa0^0Vsw0<_egNvjyco)etR1a#!V>MT+gqNCmLUGsX5lWdl= zYLH+zD37dbyoiw`}@i&OkZwnf*+H`C~#wqN4)SJ(Op|w_7r@DoF%l3egrLkd8DcS z4l4!@-XG4hQ{TNd#?$YT^9I1fXAe8{JY|NYF115jJtaQuu$)%weqbu?eyMA}vOHwl zafdgD=M(O-SYV>T!+DM_J4{m^vy0uH97U1f;IPp+?>_qH|K?_YFgH2X#4 z7}_$dkn+>crnh13$_~7G93N-eQe^-ZQkr|o|MzFyLIqmjj)aN9Oc$!K3{sUPIAs^a znhP3~+SwKC&W<};v40XrHZQpjy4Ddcd^-ku)OJL5{W|msu1_@MT8AL(=1 z?fco=Py%{~Nc?KLl^uSY?=JTl{x!JDiByv$ z{t?GcI$RxIkleN;+}|OB7Vh+)w}I270OTG1H<9nfVFm%a-0RJ_{!JG?O6n8n6NiKy zOWTYFRa7QTL8T?I^|PcS00Q;SRs?6(w|O7U0eKwOaP$DQ`-LG2j;@2d z77Qb#xd%yDze_eA$7o>E)7S#bj5*SFFvcyql}l{z%l)hQbDx08URS3;?oonMdzHhf zYu-#OD%fMonmBoU@r0X!2NNQ^!11okoANU|s{KB=G-agF49RR@k2-Q6%F2xOj6Rk? z<+laFD6eb=4LkvY9%>UTO8-;neN ztJmd4z?eG@Tib#jS;hEq>8Z`GVV5=2(P^iKUFzOzk%h&x1yu&^>Fgc(omFj(h4lxa zQW27HAj6Sp$2ohRe(QKhPB;dRN`$n?@1F|U|L~D+i7JKK)GqfOR_<&)>YMSO@*o?& z6?pZ2!K!ZDjJh{*1`i50z7`X@-5&qWz4dq7usi1b?7)YywX92dKi)- zq(bIR#(b>NYod>I@6fOA1q#s9IZp+l4vw5#KB0WeAp=$q_1-m%E*q#1XH_YeLAjF3v<6rkiYuwuoeFeG!fT8LM-+uvh zO=*Q7gi{CIB*pp@i>u)Vsi%7JO6H%?1W(1Q%ccH7P0;+fhT#5Y3e`{;u?s}E zGESi7+TAhH=5<>`EgZGRz7KWsR>;+_6Y(m>IRlUt4E1egUf5`hQ9fZw`!j{GN&9&* zwghvL8R7uu106CQ<9#8(45|$+hVe^@cH&E<%Wy7Z-sLZK{n1Tw+>Fo$y2Cu0(s!q! z;N|(;WiY_S5a}jiBlo6nNy^^LMyS}rM(s8fP0HKP6p~b}%#VjwNM$OJ_wEP|b!q1$ zxv{t`XOhGq0a8E>yGhNhP!z5|t9e5hgkdJE$-TvHfNBo!-ZAGA_Err!Y zIZM_eU&fSRR_-ctp1277(L7+Z=sB@_h?$Ge)w@VF9w>Q4rVVGVj%J-c+Mjn_>4XuH z6s$*$)RM^F{%Bj@;xKq*!aHVu$yKq$eEPA$7$4xLfThL1om_$SBy6}C-6wdz8iu*a zZ$3JWmrzSRYV5%WLFRkT=@{l4>0w|s-roDzua|!IytR*?Eh&))rcht^-iItA?oRb_ zc8mv#FG=-~x1mG1J6?WR=T*wpT57OmrYgTz@*9cLix zQYtL{%{T)azWGS5{%XCjpYXAx?oaB=N8$B!hy$1lM(Yam595ML0~ybX+&zC{ekv<| z=B!7X2nd{VT6;G7hXFJ@dHEsZS%L$P!#vL)jkzBN8JF9Njky%|Cv7Yla)>=f2}`4b z;x;5^!BkM+)z#Q|6!yPhGEcza*M;l(>Tl-1--}M@kVq(p_SVr~z`2dSh5Gg(mwE{F z)VK|?qFX=|L)@fZ;%k3oE%){D@+UZo02z1p(Q)yAHtF7X(=8=6scyn5?)38T3@TTz zABX#jtOwPxdBKdX)DgGq=#J1DLMTQXvj4i)oQ#MbRV|~}Ndts=>DKJI%rh!Fi$2)A zqzroVhLp#E)T7>dRKYu|$D?O^838Q%V`YhmS<70wlGLiycX(kPpyjhdGA)IPn5 z%{R)US(rcCnMOI#gPq+61tWuE=9WBSLFB07ByOdQzL|#usT>XJL+;h${?DvX)dDWZgi+6{xdoCM zH{4V6a_ii`RMx#l)f9wG-yg6d%JpuD)%v~3n|n8dV5Sb7qNtN8;bL2P#X(g8VauFi zra8s{x#(PY^XQlOe>7ARKiv|EF2%(TkV58{Cf04|_OT_eUGRv{>6PxkXb)~G(4HI!bo>&Xw0(pWHPVjzq zpDuU{Bb+7Y&FcjHUO_?4=8v>h)tFj^_jt>VZSd$yGR>CB3r531rU8LYeT1vQ(IuA*gfS0kphrls*1mq9rE@X*^%wXNB$9 z@|$^b%qlu1N-uBUw)uNsn2IP*;pNxMwz?rM86OuI*!@!%**@W{Wp^_S^`)Z;RiM2I z$;8w(Puw8Yj9_Xq)omzahCpsglwXt7weaw2vk50V&!ce-J#VP66pX|rbH_p#oT7hyJ%sZetTWnYu9r%lP!jEOxa;`!;{#khi6GUD zz5yTNPz!il`4z6OfT?`b9;K*%it2H2D=r8s{e4@smTG};SsZi@L>D($r=n0{5#Lf| zR?Yh8JZ`!d0tgYC}FGMGI3 zKLtO&-j3*2wNH{KDC);XHOojOTw%rO22UD3qip5Eo)q~=o+_HWAQYNyMYi2{HhIIfed}1r)97^7j`Y2+tWIcR&^I34sm< z49?^NqT%~zVRc|2-XIcK&bl!O1Pp)@{so+Sw8FXz7yv=0f#UZ~5DXGJc-}dHqpx-8 tsGbJ~cpm-N(0>j6*U*0r{r_iZoekay(PSs1Dj6W)2Q{(2hBxwf@IN?9ip2l` literal 0 Hc-jL100001 diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index cee5be46e..a2933237c 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -279,10 +279,22 @@ export interface DoughnutAnimationOptions { export interface DoughnutControllerChartOptions { /** + * Sweep to allow arcs to cover. + * @default 360 + */ + circumference: number; + + /** * The percentage of the chart that is cut out of the middle. (50 - for doughnut, 0 - for pie) * @default 50 */ - cutoutPercentage: number; + cutoutPercentage: number; + + /** + * The outer radius of the chart. String ending with '%' means percentage of maximum radius, number means pixels. + * @default '100%' + */ + outerRadius: Scriptable>; /** * Starting angle to draw arcs from. @@ -290,12 +302,6 @@ export interface DoughnutControllerChartOptions { */ rotation: number; - /** - * Sweep to allow arcs to cover. - * @default 360 - */ - circumference: number; - animation: DoughnutAnimationOptions; } diff --git a/types/tests/controllers/doughnut_outer_radius.ts b/types/tests/controllers/doughnut_outer_radius.ts new file mode 100644 index 000000000..2c1dd73b7 --- /dev/null +++ b/types/tests/controllers/doughnut_outer_radius.ts @@ -0,0 +1,14 @@ +import { Chart } from '../../index.esm'; + +const chart = new Chart('id', { + type: 'doughnut', + data: { + labels: [], + datasets: [{ + data: [], + }] + }, + options: { + outerRadius: () => Math.random() > 0.5 ? 50 : '50%', + } +}); -- 2.47.3