From be27613d924f00a1026a2a038a456fd9da826d00 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 14:04:35 -0400 Subject: [PATCH 01/16] feat(line-chart): add nullability --- .../chart/line_chart/line_chart_painter.dart | 93 +++++++++++++------ 1 file changed, 64 insertions(+), 29 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 1a81b1542..ee41fed07 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -17,7 +17,6 @@ import 'line_chart_data.dart'; /// Paints [LineChartData] in the canvas, it can be used in a [CustomPainter] class LineChartPainter extends AxisChartPainter with TouchHandler { - Paint _barPaint, _barAreaPaint, _barAreaLinesPaint, @@ -101,6 +100,7 @@ class LineChartPainter extends AxisChartPainter continue; } + // not here _drawBarLine(canvas, size, barData); _drawDots(canvas, size, barData); @@ -139,7 +139,10 @@ class LineChartPainter extends AxisChartPainter } } - void _clipToBorder(ui.Canvas canvas, ui.Size size,) { + void _clipToBorder( + ui.Canvas canvas, + ui.Size size, + ) { final usableSize = getChartUsableDrawSize(size); double left = 0; @@ -166,19 +169,36 @@ class LineChartPainter extends AxisChartPainter } void _drawBarLine(Canvas canvas, Size viewSize, LineChartBarData barData) { - final barPath = _generateBarPath(viewSize, barData); + final List> barList = [[]]; + + barData.spots.forEach((spot) { + if (spot.x != null && spot.y != null) { + barList.last.add(spot); + } else { + barList.add([]); + } + }); + + barList.forEach((bar) { + print('bar g'); + final barPath = _generateBarPath(viewSize, barData, bar: bar); + _drawBar(canvas, viewSize, barPath, barData); - final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath); - final completelyFillBelowBarPath = - _generateBelowBarPath(viewSize, barData, barPath, fillCompletely: true); + final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath); + final completelyFillBelowBarPath = + _generateBelowBarPath(viewSize, barData, barPath, fillCompletely: true); - final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath); - final completelyFillAboveBarPath = - _generateAboveBarPath(viewSize, barData, barPath, fillCompletely: true); + final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath); + final completelyFillAboveBarPath = + _generateAboveBarPath(viewSize, barData, barPath, fillCompletely: true); - _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); - _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); - _drawBar(canvas, viewSize, barPath, barData); + _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); + _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); + }); + + // final barPath = _generateBarPath(viewSize, barData); + + // _drawBar(canvas, viewSize, barPath, barData); } void _drawBetweenBarsArea( @@ -188,9 +208,17 @@ class LineChartPainter extends AxisChartPainter final List spots = []; spots.addAll(toBarData.spots.reversed.toList()); - final fromBarPath = _generateBarPath(viewSize, fromBarData); - final barPath = - _generateBarPath(viewSize, toBarData.copyWith(spots: spots), appendToPath: fromBarPath); + final fromBarPath = _generateBarPath( + viewSize, + fromBarData, + bar: fromBarData.spots, + ); + final barPath = _generateBarPath( + viewSize, + toBarData.copyWith(spots: spots), + appendToPath: fromBarPath, + bar: toBarData.copyWith(spots: spots).spots, + ); _drawBetweenBar(canvas, viewSize, barPath, betweenBarsData); } @@ -266,15 +294,16 @@ class LineChartPainter extends AxisChartPainter /// and we use isCurved to find out how we should generate it, /// If you want to concatenate paths together for creating an area between /// multiple bars for example, you can pass the appendToPath - Path _generateBarPath(Size viewSize, LineChartBarData barData, {Path appendToPath}) { + Path _generateBarPath(Size viewSize, LineChartBarData barData, + {Path appendToPath, List bar}) { viewSize = getChartUsableDrawSize(viewSize); final Path path = appendToPath ?? Path(); - final int size = barData.spots.length; + final int size = bar.length; var temp = const Offset(0.0, 0.0); - final double x = getPixelX(barData.spots[0].x, viewSize); - final double y = getPixelY(barData.spots[0].y, viewSize); + final double x = getPixelX(bar[0].x, viewSize); + final double y = getPixelY(bar[0].y, viewSize); if (appendToPath == null) { path.moveTo(x, y); } else { @@ -283,20 +312,20 @@ class LineChartPainter extends AxisChartPainter for (int i = 1; i < size; i++) { /// CurrentSpot final current = Offset( - getPixelX(barData.spots[i].x, viewSize), - getPixelY(barData.spots[i].y, viewSize), + getPixelX(bar[i].x, viewSize), + getPixelY(bar[i].y, viewSize), ); /// previous spot final previous = Offset( - getPixelX(barData.spots[i - 1].x, viewSize), - getPixelY(barData.spots[i - 1].y, viewSize), + getPixelX(bar[i - 1].x, viewSize), + getPixelY(bar[i - 1].y, viewSize), ); /// next point final next = Offset( - getPixelX(barData.spots[i + 1 < size ? i + 1 : i].x, viewSize), - getPixelY(barData.spots[i + 1 < size ? i + 1 : i].y, viewSize), + getPixelX(bar[i + 1 < size ? i + 1 : i].x, viewSize), + getPixelY(bar[i + 1 < size ? i + 1 : i].y, viewSize), ); final controlPoint1 = previous + temp; @@ -1159,7 +1188,11 @@ class LineChartPainter extends AxisChartPainter /// find the nearest spot base on the touched offset LineBarSpot _getNearestTouchedSpot( - Size viewSize, Offset touchedPoint, LineChartBarData barData, int barDataPosition) { + Size viewSize, + Offset touchedPoint, + LineChartBarData barData, + int barDataPosition, + ) { if (!barData.show) { return null; } @@ -1169,9 +1202,11 @@ class LineChartPainter extends AxisChartPainter /// Find the nearest spot (on X axis) for (int i = 0; i < barData.spots.length; i++) { final spot = barData.spots[i]; - if ((touchedPoint.dx - getPixelX(spot.x, chartViewSize)).abs() <= - data.lineTouchData.touchSpotThreshold) { - return LineBarSpot(barData, barDataPosition, spot); + if (spot.y != null) { + if ((touchedPoint.dx - getPixelX(spot.x, chartViewSize)).abs() <= + data.lineTouchData.touchSpotThreshold) { + return LineBarSpot(barData, barDataPosition, spot); + } } } From de1ba3e8c1671a4727e22e0bec7f7cdf13ea9ca4 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 14:04:47 -0400 Subject: [PATCH 02/16] feat(line-chart): update sample --- example/lib/line_chart/samples/line_chart_sample8.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/example/lib/line_chart/samples/line_chart_sample8.dart b/example/lib/line_chart/samples/line_chart_sample8.dart index f363f36fe..60053fb65 100644 --- a/example/lib/line_chart/samples/line_chart_sample8.dart +++ b/example/lib/line_chart/samples/line_chart_sample8.dart @@ -175,8 +175,9 @@ class _LineChartSample8State extends State { spots: const [ FlSpot(0, 1), FlSpot(2, 1), - FlSpot(4.9, 5), - FlSpot(6.8, 5), + FlSpot(3, 3), + FlSpot(null, null), + FlSpot(5, 4.5), FlSpot(8, 1), FlSpot(9.5, 2), FlSpot(11, 4), From 635c2a2bd14b65f2a9cfadebc1f77a145274c6be Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 17:29:01 -0400 Subject: [PATCH 03/16] feat(line-chart): use individual bars instead of bardata for area paints --- .../chart/line_chart/line_chart_painter.dart | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index ee41fed07..4c707a1b5 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -171,34 +171,38 @@ class LineChartPainter extends AxisChartPainter void _drawBarLine(Canvas canvas, Size viewSize, LineChartBarData barData) { final List> barList = [[]]; - barData.spots.forEach((spot) { - if (spot.x != null && spot.y != null) { - barList.last.add(spot); + // handle nullability by splitting off the list into multiple + // separate lists when separated by nulls + // and ignore nulls when they're first or last + for (int i = 0; i < barData.spots.length; i++) { + if (barData.spots[i].x != null && barData.spots[i].y != null) { + barList.last.add(barData.spots[i]); } else { - barList.add([]); + if (i != 0 && i != barData.spots.length - 1) { + barList.add([]); + } } - }); + } + // paint each sublist that was built above + // bar is passed in seperately from barData + // because barData is the whole line + // and bar is a piece of that line barList.forEach((bar) { - print('bar g'); final barPath = _generateBarPath(viewSize, barData, bar: bar); _drawBar(canvas, viewSize, barPath, barData); - final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath); + final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath, bar: bar); final completelyFillBelowBarPath = - _generateBelowBarPath(viewSize, barData, barPath, fillCompletely: true); + _generateBelowBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); - final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath); + final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, bar: bar); final completelyFillAboveBarPath = - _generateAboveBarPath(viewSize, barData, barPath, fillCompletely: true); + _generateAboveBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); }); - - // final barPath = _generateBarPath(viewSize, barData); - - // _drawBar(canvas, viewSize, barPath, barData); } void _drawBetweenBarsArea( @@ -368,13 +372,13 @@ class LineChartPainter extends AxisChartPainter /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, Path _generateBelowBarPath(Size viewSize, LineChartBarData barData, Path barPath, - {bool fillCompletely = false}) { + {List bar, bool fillCompletely = false}) { final belowBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); /// Line To Bottom Right - double x = getPixelX(barData.spots[barData.spots.length - 1].x, chartViewSize); + double x = getPixelX(bar[bar.length - 1].x, chartViewSize); double y; if (!fillCompletely && barData.belowBarData.applyCutOffY) { y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); @@ -384,7 +388,7 @@ class LineChartPainter extends AxisChartPainter belowBarPath.lineTo(x, y); /// Line To Bottom Left - x = getPixelX(barData.spots[0].x, chartViewSize); + x = getPixelX(bar[0].x, chartViewSize); if (!fillCompletely && barData.belowBarData.applyCutOffY) { y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); } else { @@ -393,8 +397,8 @@ class LineChartPainter extends AxisChartPainter belowBarPath.lineTo(x, y); /// Line To Top Left - x = getPixelX(barData.spots[0].x, chartViewSize); - y = getPixelY(barData.spots[0].y, chartViewSize); + x = getPixelX(bar[0].x, chartViewSize); + y = getPixelY(bar[0].y, chartViewSize); belowBarPath.lineTo(x, y); belowBarPath.close(); @@ -406,13 +410,13 @@ class LineChartPainter extends AxisChartPainter /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, Path _generateAboveBarPath(Size viewSize, LineChartBarData barData, Path barPath, - {bool fillCompletely = false}) { + {List bar, bool fillCompletely = false}) { final aboveBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); /// Line To Top Right - double x = getPixelX(barData.spots[barData.spots.length - 1].x, chartViewSize); + double x = getPixelX(bar[bar.length - 1].x, chartViewSize); double y; if (!fillCompletely && barData.aboveBarData.applyCutOffY) { y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); @@ -422,7 +426,7 @@ class LineChartPainter extends AxisChartPainter aboveBarPath.lineTo(x, y); /// Line To Top Left - x = getPixelX(barData.spots[0].x, chartViewSize); + x = getPixelX(bar[0].x, chartViewSize); if (!fillCompletely && barData.aboveBarData.applyCutOffY) { y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); } else { @@ -431,8 +435,8 @@ class LineChartPainter extends AxisChartPainter aboveBarPath.lineTo(x, y); /// Line To Bottom Left - x = getPixelX(barData.spots[0].x, chartViewSize); - y = getPixelY(barData.spots[0].y, chartViewSize); + x = getPixelX(bar[0].x, chartViewSize); + y = getPixelY(bar[0].y, chartViewSize); aboveBarPath.lineTo(x, y); aboveBarPath.close(); @@ -1202,7 +1206,7 @@ class LineChartPainter extends AxisChartPainter /// Find the nearest spot (on X axis) for (int i = 0; i < barData.spots.length; i++) { final spot = barData.spots[i]; - if (spot.y != null) { + if (spot.y != null && spot.x != null) { if ((touchedPoint.dx - getPixelX(spot.x, chartViewSize)).abs() <= data.lineTouchData.touchSpotThreshold) { return LineBarSpot(barData, barDataPosition, spot); From 4d0230f56f0f0410d02e21a69875366d618297c3 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 17:29:08 -0400 Subject: [PATCH 04/16] feat(line-chart): better sample data for nullability --- .../lib/line_chart/samples/line_chart_sample8.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/example/lib/line_chart/samples/line_chart_sample8.dart b/example/lib/line_chart/samples/line_chart_sample8.dart index 60053fb65..b299618a4 100644 --- a/example/lib/line_chart/samples/line_chart_sample8.dart +++ b/example/lib/line_chart/samples/line_chart_sample8.dart @@ -173,14 +173,18 @@ class _LineChartSample8State extends State { lineBarsData: [ LineChartBarData( spots: const [ + FlSpot(null, null), FlSpot(0, 1), FlSpot(2, 1), - FlSpot(3, 3), + FlSpot(3, 4), FlSpot(null, null), - FlSpot(5, 4.5), + FlSpot(5, 3), + FlSpot(6, 2), FlSpot(8, 1), - FlSpot(9.5, 2), - FlSpot(11, 4), + FlSpot(9, 2), + FlSpot(10, 3), + FlSpot(11, 3.5), + // FlSpot(null, null), ], dashArray: [2, 4], isCurved: true, From e58e029d2fedcc252bdea2cd0869fe0821813e5e Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 22:34:13 -0400 Subject: [PATCH 05/16] feat(line-chart): cleanup sample --- example/lib/line_chart/line_chart_page2.dart | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/example/lib/line_chart/line_chart_page2.dart b/example/lib/line_chart/line_chart_page2.dart index b58b46a55..c7ce74b48 100644 --- a/example/lib/line_chart/line_chart_page2.dart +++ b/example/lib/line_chart/line_chart_page2.dart @@ -24,16 +24,6 @@ class LineChartPage2 extends StatelessWidget { LineChartSample4(), LineChartSample7(), LineChartSample5(), - const SizedBox( - height: 22, - ), - Text( - 'Range annotations, dashes, image annotation using svg', - style: TextStyle( - color: Colors.black87, - fontSize: 12, - ), - ), LineChartSample8(), ], ), From 079ed63e962f0ca75e3dc7b72ffbde5a75da31eb Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 22:38:24 -0400 Subject: [PATCH 06/16] feat(line-chart): update sample image --- .../images/line_chart/line_chart_sample_8.png | Bin 32277 -> 29699 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/repo_files/images/line_chart/line_chart_sample_8.png b/repo_files/images/line_chart/line_chart_sample_8.png index d380364e6ade2c21dd0fad348334bcd44d88f845..de31701d11b69154a8e2f84f80f59730b4bb3157 100644 GIT binary patch literal 29699 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

()?;kB;jDFtHU$ z&OJ->Jh`O(bP;oBes+d7bg@J?P16`{83^JyJ76+dQH1hrfTniuC-yYkcxd=cy<^_R zuZh+;&@k@(s`C_g1&S01DZ z3?WdE`$M>R2H#Ei3hjrQ(~$&G7ZfO5;r`lx`jFqD;;7lhZ(NYyp~}_ARh;o~)@E>1 z&Pbm-kS?ahFo8Chf;HfRs5egtT71Mw*b_>{0;ZiBgq(4*Y|enpMRY${NmZdGR5`AU zZORq=kzj-ZuS@$zN%ygS^$Ux5KZjdVkn2~3CSFK;3li39blcNCa(DA$N35n`k)rHT zwWRFjs!VKc)Amp+(A<|{1gCt_n2X)$s^w`wYA*W|3s7DnQZ{o35^<}iE8%J%aJp$T zMW<+MY^RukfYBFAesc{a&@wyjs6)SCxmK>Luo}tCwn-RT7yRd@zDR7bCa;1tPoEYK zm=^`symOlC^F6mJj(xB8@SmHaT^#f29K$;fIy-l?;n;QAMlVwMOHy zIRWV#Pk=66`S*)qu@;i&T7*Doy=@3_|QhO=XanL&+}MqVFN zpR&GM$6eQVH+t74j6okn18>5CB3%I<$?@7jD4FK)ufXyk3L_`=;I}}Bf*iA(4QQlj zo`7y2>Fegx`j9Ca)T5!X?Ou1U)Yd+CoO z2hT5a(7pGUZ0SbamH-Xqc6y~39fsXQo6FLa#Nl#b-%k$>N3u>z7$7a<3dV?521WMTd@4q!Vs`cc_Cm?@i0TN@y`Celmz%IK7 z{a>Dmy6g-e$)pw=)W&@qNXla~Q^tl@RPdi|6_#cLInxS|zjJ88VP7_PvvFm_D0~43 z#1-jS1BIiHn7)l3ns?U?3 zGDk+(w_a*{oi1Tmk7W8^9LBfyZ@i9iKxTf)Ou6)ve27BKGWjETh~w`M0d3}ZLDTa& zu@wo;3u@AUd#K|jMoAlhiLvaBf}elhxD-G`JRL7OkXR51r1uUw0fkB{UJVRU6BCH- zOUay%sHpT)rnL1iyiKO$ecUC`Uh?WZkRXx2uc260H(^5adgvD5KuwFa<#ZWmA@M+Tkw$MBXy2#;&IL=5ZwO=!tr^e9S_4u_^9~^`JcA<80)Y;Lx5}0pZ1BfpMNVOhugv}J{ zl*R!OxX=Grj3p_{4+lf(y`}}esYZ!ucynt)>%*4t)j_?yT2@FDr;Ii(8`Ji z&{NM|{0lYmkM%1u9mB|vNUg|VS~Ld8)ah0|qPYCISdf<*1*Y1KfqAh3)aUkD*oCMn zh%WZ3dusbpw-1v3aS2c;g!Y8dkxZj7VFkOeY}xYwprjV;It}<*nlk6=Du%B{iFUho$x)~q<1yMZp zRA2v|hZebjd{x^EMy^SkJ&qNvc;m3D5)wMz{ys|U1Slf0?($@2U?gnj0$(W8LHs2U z7v36Tgy}*xM2ZWazRk_LKWvi#pxW=|5o)R^)ic01Eaz&C92Y-V}68wt6#l8o5>asf^w#HI9%H8O#yU#GepU2Gi?1dCpNM^~Jq^!AZE6|>(um6zJ@i*?DF;I>cE?Atv8RDvck z>|1G+4aYym)Yv~179LBo!`%R8U{e*{t@0E6eK+SbWf=UZYQ8?kd>nJSQ}LENK_jWaIMv9i8fg0bKaXl{C?`fQNv?Q`t{lASr>dV>0~Kryf&M26R=)8oDu zMiI1WH|q((3f{B8SzDK_U+Z>uXh17gFM$_e_z9G z%>8!2uVm!lFb{Jq;*rhuPrG5}-3om`+2?tPe+A;S6-|bOs3?Vb5`JvUBEY}@< z*hm*vBS0q;&^O9tr5sNImU}we59`hYSJ1ZD-uz3T(^IKq15$!2$z#B_u0I&%#agb!m zkeu}`vuM~RT|NNX*V|2e0mGPHXw0oB=)&LAtXMlwEn&>b66oqQ`Dw#!Xsr8LfX#QuVLL|Ns1xfMsGgHUYg== zT&y0RZ>|e(bkKk z_5|;P?{BYW1nWoc2bUvo2O;W7$R(1|$qifW_#`3wqLDnqYq~g-? zj7O7!@i_Yv$;L@)m2=~UVw$ ziOT(b69QXSMLT`yg*z9w8^xVo}D96p2qEO-Z`v z+#fES#|X0?tc|F}(-8!PYPduhJukGI0sY&`eBg!@Z8usD&INupON@snNV6iA?D2E~ z8%Lu@ZQrFh7o7OIg&gx7e1XE<$nHv)u)y=A6;a<$GA`{_#jeB=F6*SPlB1Cc1SwDcMas8x&}$<#*NH+jk5kiJBg$`p&_ zMLS~Qy+`YrA%G=4%^$rjcR)KZRpd3aEE=&#FekAIX+_z@%%SfIr=1i%=+fot|5jVG zpZhIFeqYo?u1lOJC5fqnfuTDf7w2@KEdnW&wYrj`JHKN*0kvaswhLDfD1v-3z$*Uj z;DBpR(tZHSoVF61bQQycVS-E=`lf<5UJ_4IefDrlbBf`w&+*2~WrV_NsfG4CZG|cu zQ4P(3)JG5?QVXt8k9)4vg*)hObhlG7=EWIuQHcIdoF0AentU<>!}{&=wp*5xn@h-! zj@r}`#S7zNL7Y+>zQ=#Ts84s_rf_;g($B?Cd*>9y?zC3EO3D?nV&(F1J7olsO=-Xx zm3<56^V=-VU(bE`O6)$zaC}=WpLcm7jY_&NlNIdT#MW>*5`h%&p#6G;?YBL94P&lp zzys3Rm%3#8U`Rp|Dz|AC`%aIzj+F;4JF(Uo~&kJTPo_2nWI@=B0?(q-@g4?`EARyg@&Zew~ zfW?cEZ|9@u)r!XjKB{!HAOT_vROy>Tj6cjw(75-zgrs*?rci%MfAd}<-%l_h0mq+G(buS0AQ|&;afh!{#(z1%xlDrudR$jjZjO&fP$HSa9co+D( zLC;zVbe^B$Nm20GdaLb-HX|};7(R~jv>B1Iu~OG`vg;#KW)~*chyv@JAVheWZdCqU zw|!ZmCjccS`e3|6sZzj>t0HfY%A$H{$%7uFfx`uM|*x(>Y?l-23M^aFp=BM*;uehW%d~1^mB0+5fdA|7%6ypNH{( zwj}qQwuXkx<;ixs)CU698kg;CnPAc%IIkkJGc#qo^YZgUbSrFMz-ipSY49ZY|Lf-d zocqUTC`5B-lh#E8egFpU+V$z|=?9N7ndJ4Q?jSCfJEK($<)mf zy=+KIXE>8uo@T+->UT7Zf6784sytRZp~Te}OaiD}o#$z0FlY5gq{t5JVj-9-``fqo z^|v>k9#{MA>oLa2VvXGE%hRE~`Q~y`*}lVZ!1!}UZ@l185D8nh-E6(nn1QRRu5MgG z?SG5RL+y9p{ERIvSqxl%J4eLE$_JBiWiq~qJ4>Icapf{_=w#q~JN~44zm4j8Rcd>9 zbo8aF>Q~I5Jgp)E53xG4UdlLO=iJfUi6Wy06`eWJ{}E&efRXZ)93u<|*)MS``rB#f zMN2YMvX?{pld69DQ*Y6WwR9>2-sCy0VSh~gw24ylpZ3Q_E- z%iYlrDhM2K7u{DA;l^ztsRA~W<0T6NaN3M2$5kt|w+9CYl)p<~H)FE0vwthM9(x(h zX+UY$vu&n+5anTiZd_5F!275ff5RGo`SN6asGaqb@hT(~DNo@j zi$!qtl!Qd0%}c^o(FS91XlQ+}`FCvFX1Z97UyImH_5(ivX+MXL@mzuMrTh6KQ{16% z@|+~ZE#e$WB^YF+mC|mCl(4AiXtl9I1ODK`sufC`4QgBOVL_h^QLABQN*cBYjl4dN|>Gd>2J9{nBlZjwHnyd{s~tY_MC6}(?QOc_L=M1p?5ER z({T*tL%4bAfka`~veO^*lV`Kj^}K6QGzPx`wEIU-p^v5C71ayL&H5NceKD`v|KeAx zZ#9;gL8U{lOob!2^6}d{`c0Qs5-p2@_gr;H_nmj9tG-55OgjXRGJVw}a$j<;4Ao-} z4h~+gJDoYae$HwU5rNgZm$$FdZ{;KfWqM3S122xKCIRNMBMcV&FknHY(pA0?WS0&j z>#I)aS9L_~_Kzux<*vx1pIEdirJxAMW;Q>pcr3fI+3^%+zaWjn4-33h?n@8~KZ|ts z@$pGF7jl1AGOrY+=3oecckXn2#-C%JrC%pPg=UC677_n5=~8FiZq+J{jmhyRrlj!> znIypT>!n2fUK4JMH?qk_#APc*fvYZJr}j{(`eGx`KTK0y{ny$+`X{(ek#0HbS{xNt z7`|(I?fpY^*mEbD#25&2!;OI-JWqA=;g1SD@W&)jcT@5t&tkm_TgtuVm6Z!>@5NBT zkC);~F;CvvR?cJIy3fp4QHNeXI@kC1t^)*q6DaQQu)GcpBdyV14-P(4 z_Ud$e8mOleXr$+8SW7Ch`4Nx2(UA{)arR)9(L~54Ir>38blK7@qTq!zPLXe*{r#<`8U>^NL(ou2%4;%tD$i@brDz%cX z6de{+CKH=7jSe@Jewt#>0zrf*)JHVv{5>k^zej=6s?8vv;+w8*9dS?b?;+3r4~GD; zDgS>=6Pu!r-mWZu{$AL1C!b@$qmv<8+v@r=aOK}8dZ=jAH=QKrshf%IdSG;WL6+z= zC?6&7b2&9T$P4s~8oT#;Idny^9Q~3aj8(R77frTfFV-=OY6*w5KMvY`2Ul3R=bMg8 zqF6G|NvvfO1%ZG4!Tca1Xs%;{01Ep;AaRB8I2wR+l-Hlmc&@K!C1<+MxMvNN6hsNe zDDe#MmlRl!6*3&^*VHyXD>AH8bk(NiF>%=%SJhklnE))54Ji$+9PlS=ZIjPs#~Jsv zc00=N&eZAUwHNo%bHvg^kbNU0fKnL#Dc1TvwQqVmzDt!`uHT}XvY1SBAbxsL!;LPQ zT)N_&hv_!D36uRyLw$IV$5p$B`rG^TcMF?aYiXj#Mvhaz*r`f()PUPTlml1e00onw z`!Y#2Fz1K6R@yH<{oKPG+7=0C{hjq7AA zdeL}pac{RzfS&I;oZ6WfpH@79Q8`KRF3cF=c+@Wso|UoO)SHHf6MN$d8Ka31c==Tr zX+iGX*@%{rWdW2>^vrx?#`s~mUA!#yBtMYfRBqZ$x=petaeJ<8qoZZuX!v^bazNOyPRaY5gXo4|$+uUlUo7biUisP#e#5T2x!C-n$4tM>vM&s7M(aKb5-*TL z@5eVV2GY5qP5^Gsf9S4h6&b#WHu4eTFszNaI9ivY1+I!QOWUE2c##nid{!BRSpaB4 zAh1A3&Nk~X{LjU5UB59A>U}(_C<^H99J|8fSFoz`;yk`=y@(6T`&}qGw_lRif&5(nw6-d7>#j{36dY_h zTkp+h-Us#AET|~+tTbY%cqm{EjIwXlU9^HRk=oP`8%r>n1EZT9?}PFoWr@Ty+|er> z{RZW7W#4pOBm*i`;`Yk1fInQ~v-rhY4C?JcH&;2W*>swO_k|Nc16tgSo!>P>hy4=D z(FQKDw_e|6eE!vl#7T%xE%75NIMdt0p2pCnpuSy_|KLwr`iY;y&1^ z*&U=XPe?7Vt*{uN%WM>UJN}f+z=`PkwBa_xWqT51ncHDW&gyqHzt~BS(SCBEEU`M zstAoIay6Q2^|1urGtp+^d)U2|^=c{?DCxOtPjhzbZ7KM!N))RP2Jvp45Bt76lKR-t z;qHsyP`_vcMk%@yoIA!R;Jv@}@Tfljkz#xu>HhllquI>BSa#BjMO{ZI`jA?3bWi*e0JHsS#j?!8h4gs$0iMV7hFd%J(0Y5x z@8R4bhl@8xVj5oFWXon-nZIczsE@2X$Cp@j8*&8XY<&uP3u5pxR<`Yc%lOf*j-t#^ zs#DJ;u2lpY`O(od-QoNP+Cd%jM3Uhq9X&mT>x<(dT_3alqyi?blLvEaAcTq~<=IZ?Bg9Glv1|G8%k>v=rtJMORvk!j}jxGrIp!N9d2OC*Pe9G0uog( z0SJ7b^b^4^8^n^@Cw+2&Xn2YAF43o1;JF&#yy=%;t`p$r|DyXab(Rh~txw z*K^t$FOCQgmjY$}cCC%dZWz4!3Gs6s1t0N?KA<&P5HEe8u4-$JImye*%K=TpWSNNQUjeU? zSmg)_w#7Dx$lI4B`;AnC%4?eQ{uePcYEo| z-D{uo;)xno#I;8uWs6=#y}`kLMtS(u!s`D00k~wCrmaP2cj4W3@K-(9ai~%6{-!wn z!;ON}70Y*S!1ISU3pD&z#P*wCH>f~Qg5`|B8^foYafdd`bmfs7xXlN&6s0xWbVqZI z=`vG1?Y;Ig?~Tj2<~V3McM-g^uVtHWh}Xe*UWPkD2?wD*S^o`dml4K!P?uDHTtBBe zh!=v^*KILu#7*-E^!k!uY&cRf*LQpIiqtVl6!7(BI+^)l6F>SPWd3W#>u8MA#HFag zfd@%ht^)XJ@malT-07H>MMvc5Mb#UuZ&a2wNxVI8uTRUD@!elRDjsj>$;boaLe8ah{7K$C*)sXg3|X>+LxYCf4=_1^zLZoexA9l{3D+3-yraeZ3U0LeLwnB zJ$6I&?RdLlL#n+u@1OXHiTZeyk5l!zYFUk_v>hWyFmP46Q z6Z;)zH-n3#e;He+3hj52XLWLQ~EAmZD&?}x$ z9dkkf zy+CW!aNcWIMk_ttbPK}!0T6$e)yHZJF(#l@%0k+gv`~GG55!c2{Inat8tosjSp>2l zwxx%M4sFF0(M!W1TMztut^P8uWE3Ez$$UwdS<*uYY@pKvGRQK zGs-3VXdG{0>OeS+Q?tJz$RJ!*9EQc#qT&@jX;vVn6trDlmEUqlkSQCq^5W~eFGo(Q zi;Bu|#J%8wr?hfYGTCHCzOC$~V@}4K%dQQO=XhE+2ResyjlvN#n!SUSlSIi*52x+> zPVDEtdM{T2_WXUqlmX-GS5gmdePn~O9?3T(~xA6zWk=-$j`K^loh9@1buc0_OFrZJbAW}Ddi z>yhUUU*mvd6l2-b)J9cWj^3YOq%~sEh+EOdEge90ZxI6l;F)7uAGJmwALa3)Dli2q z?2cGN;6=jmF%Ea3bULo{)BlDYB(MXE^@Xs;tKgOTU>Dp~a9_?9A1+55R!HT2WQ=&& zoUwW#(Cr(Uhl!D>f1-h9?Sxg(JedzfR8h}mhiK5D@%zzNq~IsN%sAc#crm*{g=2m^ z+1ot_d!^36ExJKfR8Z%l<1$XFEmkllj)F9F`X2IHVZ#vG5=Io7fZFrokqdUXJ zMmLuzA1giL&tb48{Npf)sD_!6&3}bO;&Z$)4!n{x5FSxmMcTBqhlb5MR;(158_C$z29OWKV|o8615)aGwDM2y-k(_>i|Fyf*hT6KVhf3 z8Avkt(Y1OcT)r~)D%DS}eD#OL%fFrn#q`~(*f)-PyA^W8K4WxHGsl#{l*NQEj@DX= ziItjs-dFFqR=*T+NUIgC8;EkJs+Eonf|*YGF}>Y#*8jH;&33h zajp<&_1$gz7j2GvsRv-zw(fStRJ`~Rwb{!W&?!27VP`Tu%GsTo^t-7!ox2X_Qgbf* z*|bN9l5ctvnRvR^Qy%y$b>|}=*;=WRc_RN)IaJ?tc!=UlZU}M*yZ@TX(@<63Xbac3 znrzh_9agRN;pHRqyTHgP74x~kbihJT&;2>(!KiQOt@K%1g`ESsq-1^U_*Oc2B!4vm z+z~u|3A2A78IEE!|4yzVD`%GjqvNA02sD5^)q?!ahOIrz2zy(J+e#A4(5U*21Dnw5 z#LrA}Xgh@BrKGV}Q3kyY=)iGW0q@og-G!e#Vl`Rqbs@%A1F&SY#sT*iYAo=-pNH|E z&+{JBG*A}sfi-fcl72gCh9FsNfa!og?xb?tCgGh)GZlQZmlp!JyRfQI7hPM9EfK*LwQlI~^_9U|ZuxyXnv)>uxTHM}JX1abNr4*9$ zHEzm3kjO^JlGr!EXJ*_4K2#^AoE(Wl;0@*DpCnQKp#7h}p2ZMD`;_IfSzOG+b|7&=F8!bFg!4$1}un$9<*N`R?Koo*xtt2)Ik+m3h^cb(;>9J%QS^K~ZphAtKI18zI3y=(@C6?o+6!y!p z`SB=7p!4MnRe$8)&MoF2_S~MGndXY;An+>XDo(HQ|LEh}DZ($!5LVH2=V6 zTlXI&>3Jx~{gD9m2ED(fAn_kk&{~}0mL!{0G*BrtGTGr?jg7RkowdY^{}TWuY+!BP z0J;iO61nL&tESAjp<9m{xks!Wyq5n6;aP2YtzOA|6pH8GQ?oBvmfljZKFZ<~Ov!#I_ zfT`7LLZECP@f`VML4r3bkU4UHz@oCX=+7Zu*f`k2OXm9`U%Dtk;1f43R0b1|jBW*I zKU&eqZ@0W6cLe3El&(`~Mf~%X(e2@2q^Au&LQyGkze|k)jCuwFbQvcQWI=2^3cl%b zdJ)(-b1`0dl|_qtEcm|(aSjI8{G%Pqob$tJW9#lgkS9*hSgkQ019#t?EUoN&E+AUy z$Ku4>sQRds?tPaxWprWBh%Q+>-uXbWe0{SR=^VLIVv9Z-XHF&<{R}^s35Zo!kBN-= zAhJj7n~p}8i6H&kQnW_=!&0bXnI^fI_k6*j1$jTB$Vs}8Vc3~BJw?8 zI5n|o#9r#bD(%usP$Z+@zxew0@9jKi{>OIGaDpzm365UWG$&t-=6Uk}cD0W6S({{P z9N@RKG51O-OF{~ZxLsRCYKEb}CVx<3a}a;I6Dr*11u=$+J-6=6u4@QfBcTKt{@UKp zu8Z2%p3hdPZv?RD8LK5k@Uev@Ebb5Gt>uteT@z}pJM%XV*ipH>QTd}^#!vVLIY4@n zxJIiG4LaiD&^c69W@5T$-6>s{X|@bO@@#yz_r-%dEoV@GRL+l(IXY>O_j~vk=Ld~H z6Ey3RP04fywrkQI@1VkRS7W&s@{0PilwGj^U8)DiLAsxRzCa8ozf<jiIT}Kx)lo!3W~SZ5~em#U?_e5fG19u5F{7b z9xaBiI&677qs&~CPoc(euNp3V(Ty%n^qGhCk8H|jK_{c%R!YebC*wD&*2(}xXiJuE zm7nRk7{+ULyjzZx7$Gp>95btx0Mhp1qu)6%|Ac&MoKy#2-&Q_SRNh5}irExx2B5*J zIg3|mA&8^e)k3aaUi~)F<1R> zVc`J2{6kuzB=_TnO3C%R;X0e=E&fjOGOFAnLo{<)h^A08~cb??*_0l=zv3z|M*P`QR8acOQ*;3s<`XeF0 zC0XgBLvXwmm2}kzJd=hX@E+kQO}+ecQ#Lx}26UZ)aIO2!YG}}9&-U-IgFvr~gU!Zh zAijBXt*R9(j7GGPd!3XIrx6c1xax!s6DawMDeZ4bNq;hE`x3Oo9R3^Y5aa>%(z=V= zB=usT)`%?scRTe)Q3^LnL&|M;Hn%W0;|r5rGyodD?K|0jXK=viKI$I^a38BxZCmlE zE=|DJA4`33n0vWRO@0aJ{*FV69(1&Q(if+nKtu;~0*s!%>EvweXgXDl zA87O^hk;P0bDuXelDGCHt`KCWOXI~kYk>hiqU_`^^KF(tODuvZO6dnoO2g`jyygV> zG@|24O%fTCKWwOe1Gm?A1kvR#755wT7fGVAAZ55Lv3i0uY5vVw6LE!te3|ea>3=Cm z+Sf4@Me=qAC`+O_l}wMwaf7|_O)t0W6t8*XTu?Nle%{Os(*0>ob2|h#!SXXGFvbZ; zD=k+neT(nnOr57?$CpP=8#!6`(M-zbDuG)cN^!5s(IyyT?x`@CBDXwT=`DNHinB3Q z!F9*|MnpwLeaU@1vG@Mo!?{NgI0~cmy?68b#JiDgQq$MHtW*w7urk)xLNhYRw0pz8gYD(T~af*WR|svqt~8w3%t{TnzL1=K#c ze6qavQ3Ko8IKOLNToaVSkC67&Bu}Jm{kfTLl>W zex*v57gkrtwIQh$jJ%IY3XB@W*W&c<(!+T@g9jL}E{FG7(>m2W(UVYB1>->V4xBzZ zO5gMVW*A8%Dx^Jo>Dilb)G$DZZhfv29OVK)`WXVZ6TSP{*D_{^wMZHW|c?1J6lxR^70hvJA5s zlKQ_gp+)~dfo2G$X^Msk(dEo_JQOtTBKBB`HD5a#QXbO}&1kg;X&*{Ho`nMO;K^E^bA4@ntvp)0UBk6zyzK|9rfIju zP#-;Gl=k(Ztf43ly)`feR}K~GEy{McO1>k_t5$)eO(0571Ol&!C{G5{g7uoV8B0E) zwcj2#3xIMeFGG@keSB#aJd2cmicP}MIKAh2V=*npa znAVZl{hqul#TYlqjRFySQWxzQMi-Vrd zYA*j`skhAfW+QKDza$=7=W#rU*?P3|TSPA0AB*sQ#lwS^-yjQ}rIaYF`gnYZiGYwF zW_EtC%;&hGxS%z9ets_5@3;uoU#$h^4lH9MLX@}!Ujhs9>0kAr#|4$yA$>xnx)Q|K z>x{7aDsOX@2~Q{IhFRxdXkre(ZsVR$9w;R?@ckW3I$Q{&La#?(G5MiRFQjHu;nksB<&Pm}{BfTlXqb10Vbf86DbsTu(XFfIIRIoe1`M@MH8 z@R-caWnFO252Y%y?;YCSGnwV8KcfRHhx&k6qkzM?SkvyP0io4|MTy-Ng2sUt&fCkN zY0i4^QilzKC>xa-)VWDp=F<1RjI?|5vwB(R;`N{e3R1q}=_g3Oq3YqQqMs7I#J=K4 zfwy>L?e?IS1AMmAFdH$eL$;mW`b#BioBX`IAzkKkl2hxVx=aosx9#$=!54zRO%~Vt z9;3j7(~U(zV7RDCc!~-g$wq4%8yS?<1Y@FXsZQh|9#XV?IBjAAI3R`qWre+UTXfQ2GmbL7_RTZzkK(-ah`B2N#kH_@;NRKOZGYM1fX5%KZXT*g>x zfV{x;&o@DRV6d$1*@O1_;F{l5q#u;U~1&HC+Ii)6>`R3Zm(v!0Zq1w-B=Vo4rMVdLnx3NU^PGPL2A{ASGqS)klKZ0>Z{6QJ@23UkxUWoy zF{CxnHx4kAlJrGIKY%`Aee$5OGLI*xlDWG?`tGqTEOop9CU8=t&fzL5aMGeE(L@CW zP0T2dMFtE7vq)C4CxMY@FviRq*l`3Y6UL}`G*2=(C5vm_S3<%i;VQem$Fmprtn%*v zLC=xK_DSJy-4bNfR$P3I-{kZBfE|SS;d=jao8~V68nzxU)D18hq zPSil&k;?-C9-v41FPH^#y1FT%FUt|KkrEanMm;wzoZEM|q51P|C z;E-bwAH_ZUnaZDJj#iNNO!k(rfxTIfMA>6cCYb(iJ7rJUXVgG^Qt>u-nh@bM!?M#2 z+dmNn+6-e{+KtGEKuhuXBkG5XO)J}hc^0L>^ZJzVs?=8Q*o{2k7L@Bds>laagukhx zwR{fEyyoos{8z952y%Y-t7qt{BYTHJvnY~4`#ovW?lGCWuZPsx zzOPjSxqJVUaSY$|(m+xY!K|@c8d21}`PdAnNqPKmPLa#9rBzIXVm($a+?NzSLLI{4 z6W9hA`ctl0FVS+_iN-&8AbKZ9#&4bJw+zDY38^YSaH2vJd52(H=}DV0k4X5;EM5(o zUe{{fk>d6|?#mDuqw=MRcx>udz4~L0>5V5IlzGa3PQ-z|&k;P4Qj4x>0)$f^Yu?D~ zq!`y>f4VWh-(Hf$!cg_x-N~Y<_yzx%kwPU+O@vYiKmqK%FDcbJ&<^-#crQ z*jO9I))_93huucQznXM12Fx?hsKGtq z^A+jgBSLx=@&V`r-3qjfW4`IJl3x0pD*kxA^2C`xvshMmpa16}>NpOg`7+E$SI~d2 zEswnR!?6+ui7#~3tuL2xk)o=b@e*7HdKGb4osT`Ff{oKil&22^m2=XZ0eq(qADs)^ z5JY!C`oAk;+Sk~D#h*{K^tJwS8k$3iB5d;9UdI%yI z>qCBF>IM_!)8Ou>SAKW*8Ht$n`V)z5|5$CxejX zdrVp>DlF&++zWA6CnAIQ1+GO%ZXkcv`RnXwcQMy3>Hcd{YzUGxjoBwRyE4v=!)d0? zATkHP)*(;skBjx&{2$&=_D29#%U;w*L9pg?6lj6E>SlubUs7pIs93OE4WljDJA}FW z;oiCImiahP$B^lCHvxHg#=KqFTeq{0I!BT@@)-qhXL2Qe@4-hKfT6}2)ypl`Mpf_T zbKH7_Y>MISMu?Mcg{WIKi=YCi&}s&|tA8p5Ifo_wheef|YT^i`x9ea^+S8kLbBy|3lAYzyF^j(w!=CctIdmSq51CYGq09w(PKD_3z8LKxrJH;(rxm zr&DE55)@1AI8{Gry^+80EbK)Vr~*|QCSTjyOE zj?k@tUmN2a^=Nlxz_O7R5siFGjtecnTq#kBSD|yTLKVr2ykKzQ@T|1gGK#jt)bzuA|@;wS==nz>-wWsujJN;Zm=EOJ1|TvLxp zalh2o&p1dSo~IR*1@m(IBtTZ|B1~t3Z;Qt@Yi1zX^y-gkO;;n>E}dVmzZtW9Cz(gE z9P)OHRYi;JtkvQ)NnQSQp6NJZS1;;f)kama**z(Vz`JSP-+G>8uc<*Y=R|O?CO*$% zansqy7>?hWB4XEZK+EKiHFHX$xr&<;Cr|fHt6O%7TM0jzrb#>b9AzbYECi9`HH0k?TKb+dD z3f;+?Fb z`fsCwC8K_tFT^q`>hI#sG>3AX@rMo&WTApd%F{SJLC*ufV=zMy#IK&EJp+C1b4yXC z2voe_tF8b*XmhHXsbt_FJNR9H#LHJ}XRH^OKc3E(XFV^GDPzuvz(&RGmS8-amD}l# z+11mLo5Z}U=MDzzxebWPbf#X;nHk}Bmr4NT-`51M9F3730QC554;y3p<*O}@pZ+wq z$#L@OA22nQ9X6{vvC_CNGzsu$< zUCzjksmGWq(p_5`zd~>-zcmhKSzD}JVamZq435fb6r8s^hJ!_ojnBWx*}|h10sn9Pcr)+ohNhFxwP3P@?Z~g7oB-O+UcS2mgKt@W<-w; zi6r60)ixt&UFGmGJPZsehEL-G1&(9z%f?p2@&yr)c48jASE`{!uiYN=f6i{h#CU0d zve>b~3&biZb2a5{sOLS<{O$JmmI@o8m`aI*P<&JxK&nCeB6Q^Sd&>9U?-xS)`SuQ! z^Ze%8)ti>d_MaA_iFtD%FQ_Q6!@WK{zyvvb>dyvX?Rk$1G1i}!FaSd|6>@4{Yi@|2 z=0!hx|9tM#H=6Eo$jLe|0*Iasj2 zVLCnt1~py&!34~&3_S&lga%eti%HAT2I+7=v-x5l)Y*I=(GRWl7#(78)7XwUv^=iw z&FT4~><@a+Ve|@;HNmtn7oYoQL*8AdpBHqpUaOZ+Rnr5;NL2ixj>w%o{`x))X z{x+N#tw7atIKM8G>T+`e%zF0gvSq%y%Js;$+crq*AT{!O^R}3zqp#l;BV*H{2OE?k zgcge9?5iV3C#_xSRog4o-d`OYp`wfLgW}Z@R{#V8xxEd}e|rOVEfU{#Ep8`bCyWgL zz5#ffSy4#^(OavvFlK?#`m~~;n~WfwY+_YnX@OQh=0XgdO5$IV(~^G?ORD^Zp|72< zU_ew6Wb?Cbv|u3+7jG_q8c0&)4PRnBWpoYmR1RD966X~ZT3uR7*xh}6T4m1h+)`-` zm0|CCC4!g?EAH_FdK5V7?Kvxh=Z@+UxvVljcI|2BWmE`tZGREKzAB0x-B?3w8%?vS zHTrw0hlau7@O_)}s^~`nlyTQ_+B}oPsED5WoKH|^H>ZY>3Ollisz{IBQ#zdXIokW+ zf3Z9=_dnvI;IudC9VE<09$ZXKWh^7pg4=A{qlv}UdQh;(@2S8heOt~Wnz;K$ITR;; zl~g*JhC*|$J&?cw*ILsrwar3eq}BLhdHK}x7qp;n8Vbj{PQwpd^oipj0mi8uU)nF# zU@Jr}sJ0jb9}CNSP0Q1tYxddEeSnhx-ibz!VK*jXf$}cAeu(YHh-j}Hai}@@FfSZz z#`o#>cWNAXzs92ra6r19ROEBWz(;$Lz{MDLe`!7m7ATNzDY&A`fvQkO6O+fJIbw<< z#{Ji4dk12qeTi9Ai3-dNrR7yW`kpmqLvF9_Xhd5Rw~iUzfN&-vB&se(@A%%h47~$+ zJMAzra$}_KmxJ^?Ipw4@!`tNRPff{A`o-dEPgEbi(bUF)^Wz1j(rPK^Mr9f057fZ8 z(cdppk9-GSWa`7}$hbS#9~G2y+e*1HLwQHu#{{Ut+ImtjSo@Og^1`Zutv7a%(Tf}K z_=D~Oq#Pe1Gj!xT75XB`0@nyL>5s|@;mSRPpq_9lJE`3+ z#%7{?>v`Pt7*dm%UM?JEL-eWC0$mEH{fTwh8%s41?)_!<0bR})9eNMy@}`ROX~;uP zXTbD}%IyPV^+j>U$R^cm4{~h+7ATrj=X-FR+(SOp<{NF6{#tbjL(Uxz?bLU8+^@Ix zhU#rpw?-|F{6d-ra5G|BQV}7a9v$lAIsKedz~jwY6cBmR&+IO8e^0tmyzlGcN3qx4 zdXMvm?op+h5_NxRwMSKCj3GwGuC=g-Gy&XZn7vZ=4=MZWDxc3%V{&!MxbkPZ^`N=V z_@O^RlK0axY9lnug^z#!6)KAit0blfNPm5e?)4JJ*w}$WN@VQ(T?Fq3Dc^K9E@h|b zBrP@e7YO#_P+tSSv@8G1sI_qP@D{%&ZpqP1gyNTCH0InPg)sjkG)VVjaD#O4MxY*# z0tc~&B6EQ{YoCl~EJzxVo+ua6&jK}mJM9~6X7rxClW9NNxlub7iv8s&I(EufM)xio zyO46O1v)woTtP!lVxo}f0&IoIsIJx(c3OMLz);1tb`JJWbOz#6ebXs58!R*sx#qn_ z&Y!Em0^0>_S*FaL7Z|FnP{zW7f%rrnn)?q??9h?h8jp;83`E{C73yJo&`Zv*b>)DK zv^x#AKJH-q%X0c>@xeuqjWpzW)d->Bv-rY=qGM>t33ld%iR{*v?)YHQdVSY-nJ{%& z_{21N9^n0So?Kx5?3*1aQXY_RYtLnuAHJ88fh#5ZJ(60JuTh1lx(Td*k!DcTwkkLN zI_>phQJS;a_=|aPx@6PQr_ok0dD8_p53*?)x@SP$m%di3-1U+!jq2G&64A@9-DE28 z(9AgYi@nsVfz;;s4P%_I*MDTC)}AX zn&!_rYrd<#t>_DCU;uQQm>*PL&sbGSUGhT59Qow-O242pL#fvqz&2EeNz1HGuwMHi zn7u1+sRTO`O~5vqgN?kRF0lW=4BJsyr^clq!Fg1N$K%L?Lg1~oK?K+q+Iha3%=IE( zAQEhtRR|{K*l21JPC?)Wvkx(#+<*9P4tx4krChPL&Je~3*sn*=<(MfGy}359nO#?v zQmDL&LF2@MV=;p*zEOI%RWcwG&QP;e63l>!e%I)lW>C{CZ>$g?-UKH)qq5U@bM z{ggzSuZIilAV9D1m`kFo__xa-G17%jr!U#(!jb|^=VfuOsIxLKB_R9~9J*L|%z9$V zBD%Y}mc|-x%0s}0!azKVFjAT_tN`O*(u?6Vy8L@3qH20?$#DsWzCy6GC4Db7SKA3( z1}vr{6~0hB-T=+*rjChNZf@?N3_bcIUF>+iPC!(}9jtr4IO_oUZq3~&m+GJLOo@-d z)~X1_1lRxzOhw{edm7!>HvI-6l|rBUdD;0m7dxE432dT&a+J&Z^FTYW=6JHrL9>4vnAXr3k<)PY_K>YsJ!fZO z0irTr_+8(h(r0uyp=Di4B;1_!pLoavV#ywzCS-t-HL{IYKwMZmBjmw0Fyb;5ErK$DTqx$Ufxgmte&X+LLQo&9nN5sW% zGZU`;WMX7zK5BEjM%SuQ=C{?|=O$;qf#p9`VVPr(YG4v8K(OgNUr?LVOFGugdl~QP zqx!0@4!VzbmVB-+go>SxF2NQVVCf@0@(cC@#x-k+N%~Zh2b(Y&*J*pdovrVQU6_P5 zTe;tg!Vn2g=D0e?wdGW17cD$Owdu#v6|7q^ghV*-QNO_ZDF`RV@!i4aI>-8;2X7tf?emjKnSR(o#2CT zj_Esw;z40gI7BT7aoSTpT_`Iv%#Ux^CbAcVN?k^E|8g8&mpxS$ywOsDwavD@j{efb z{kCae$;gyC6|841*6#zeiyUB6)>p0p3w7#yeS))IYBcUkL}2-U=zIY{nMREJUP?c3 zTV23y+*FIfJM#VF!ZPq;8F}gQYv5|-msOQ@n833HB}-Id_hui0N+}RlF|G zBb_X?@|`cE5qRnSx_Ko?=1PQqsaa^fbYI6;`s2hmLBXYjvW5Biit(1A_DHY;g7lle zMDuHwB+xu+O;*@(k)y@h1pcr$kP_DraFgmH$*|VAkDU8)Pz6jDS}6s7lI6frgB9wW zCSf!UBoh2cIQ+JUuGvs!U?#4@VNlk|z4o%Vl|cvgCcz?FoMaNcb&`A9Se7r0n|_>Q zJBubKpB{%5I_q<3Q@2?OHpO`;7^lmw6EdF^2yj8ffg7(XFt=s$(+|V%NvR%~gc9#7 zR!$c8TXy}f2=s%k&P$7*C88JDNW2$gxvAQ3S z9&Ulo_517~C0HRtE&fBABu{s~)k3FuQqyaB5a*Q3Gf?dzQh<6PkF z-d5FTc*rwsxRbncl4cF9u-Oaa6F!3@FlLtRHN#IF~}de?FF>RHukl zas&NZvoTdbga}lFGrnTDsQBUl2+JH?*P3Xbjqi?L$Z>zA<&dMaF(`edI6E>T7lo^mIN(G(KM8Z9c!n+4A5>ob-I< zK@tBTpuW8$qCM@oT$_pc%;(~9N(nLrab&5;HJ~9-8GY6MNU1(xF=h~;Ud|XRD8;PG zc;#e$Kfu_@hD^F|TO>gR=8+Xt=+l$CGuG`5i#;6%XA*W!j07w!LFJu4xit;#X|O4^@9Mt?+LMr!0pf0l=>YobjN(y-ljA<; z0)DnSG=pPjV9xB;-2#5v93>Nb}Zsn$N4cFyEM*5b&fyIFf>e zYEOzhDZIkkwV)H@Ly;$gg2IU&V2p4nRFF6IA2a0vRr;zpiRfK|AjH+nCDD5iDTE+8(WBQ#k9tM)E^7GdE<%*Jk$WRb zwCF@H5d?`|=1BbJ_s&}HteJUdX05yY@wguQ?6c4A`*T9EpFgg+#TOp^Q}cpWo`2D* zF&iNeOIm5eVZFzbGLKl;;8%MT2;o~rp{j$h%-s$~xgH9-%GMdPO4t4~e~Yo2ip@$h zV=6{f6CN^7ax>Tb59KmSqMZ3P?L7xEJ1+XD{$?SPeV3q3uVD}kdX0;u=&lcKS$A2E zD&oKEv~YEyK_{`xi#%4DI8F`UMLIWdTp_+)zC|a zfjwlDjhtD95#c>}Q=aM*nPSJq?T_JyosPzaqjMaLre5Zetc zdr#OCNDSZ-4xABLrpZ0i9dtu#!-3(JU}dJqb8f#=2e=yz4L#7#`Xes0S(-8TN4~&` zlqspFc5NV+MVxOHMWi=n{zz9uWO?KpduKbXd0%RzGh@lRYzr{c#8m?VhH!Mh+)XLq zQf*aR%Bu$xvKSre`%*Q#>0utiMH4wI_muv;Vx=d%)vUzc+2m5B^FnUee1F?nSQvf- z1#%{0iZIOlhsJm=4wJ7{SlL-_fbOR#s8MrqlBh(v3c;9lW$##L7E2WfFICv_;gbeiPq!`?G}v?sEU;8Iev}Y(q-k`^mpWBJ+KJ`DOT48hviZi##{Hkogeob5d1$r@WdD+NMX-G5BR9jO zIA&|-iaZ=0N3Oo06o~4NB{^v!kH~X&OUH}Y_MsbGO#&D#Y=2dNmApyy1JSpY!3yx_ z@}W?Ezh=lu(Pp|n$K@aQDNM<`eR#p)aea-p>&DCDU~I65y_%+}qxMT@GGyox-u5i} zdxn|cT%6%XB4v4D`Y?%R^E!=@4mP72pf@?XrW+HfiOsC(muW?2ZJ@m%LPc|45w=vj zKg?_&9eow`8Nb0o7|jVa5-1nbEIVB-PkzS%g6_AaaOzl8KN+#42+q<;y1+Eq+~-b3 zO?bd>hw99dIyn7CjHAeSul^nS;^S_iztT*QBzwWoU$+^j(7Vp%O6)xhK1H_}<&_!7 z7=F<{V5vNY9Sz*op+N8xcwh{go6~ZO7o&(3#~YwJUU}-r`HKAWz(*p&T;oo>IOD5& za0%GYo;vy@VFzPD#o1Jv?)c_N?+HoD_YP|NpArAx^%^T!4Y}bvp(Qj<<3c0=4x|&^9|JGEL^D`9U17MJZr=G>YM9@ zi2R2Y{jPYXdDn65(M`%&wRGXiv^?kT+Z&&z%I-HjKaevV?042GM{pBkItL9_)&^M5 z94WB47_Y2RFJ0*Cta}&w`h-ZCow!|tDh62d_CDn~^ir0^OK4WBjT<1`3~lgOQp!A> zwV{qxGEV6ozv=tqk+dVlDJ23w3*}c@#s--AhJu^nZs;6$ngz#f#PG+IX&WAld&L}m zteQdPPe2w=^OXl*g1pbZzd^z!B9$7Fz#kDC;{LH^EJIf=^x%Ldd^}~+<*=~aA}F;4 zY9=T6>-iM&D0@nbKJQJix%R&1t`PNuuIX{(Uf|_ubs?X@5WAk&1)IP#q0S<6Ry=%8&>Ai8qm|J zkw+%_G}_$MF7LAh1QdH{)9adc`CApQRL8^SGe7oN^vd@PZhxl62;cnG2gJFCUN|xE z8H$Y9kF>ctNeY`k!$x6@i;=+qm)@i0+%#01*1I>Y{ip_q+zMd>W|XD`Fmy^|8-`qW^Fd|f^0gb2QNc5ZEsgq-p68v{rotOO8kuI!?*x!OWy;+`8BO*w*BK-Az-O9Vi73bOg(UD@nb@Q4Kiy0Ve zVC|6H7H71Ax`tWP3Sd8C_cF&~>1#9(v#q99(Tp1&8nY`(9MVAk4ra?bjJo+qBha(B z^tKS?%LD$a3P-?LZXcv@i7%c#R2j+tN^g=#ir=iv5BL!>n_BST=jp1OZkYYFZd*Rd z=bSh~uWPZml{STEGNMAtq+lu4AN#v+a$|u1p;P?;>j3GgcSDun6N9qYa1%@o=Pho6 zGiw#_q6E$Sl4cei-ipMX+AwY>;Q5gOA1W+5{!AUq?#?dl16#7V#`^t(pl2q}E|16w zCnKivoVZpvVQjpHj919R4ho!kNcMs!-S^+BJ^uA}XJ6c2HLSd3C72ECH9fT6?A6yEUI~k2JTh9Ph-wsJ^EN z;t$I&CgImDAe_lUdL4+0&q4J|maNQBQ>k){6W7@xQXzPJC=gX$_3$P5al8}YNy|9@ zgj)I$8|gF1#9l>puY$eiXYb*|qj;`kL8EaSbWR8{sWi& zcr270nZ!^}ODs-sNB;CP6ZXnG3x4WDlF?W$e9Gvipi zXv}~&TVIJ`BX2j^yL^uK)>@8bwe??0ca!PO<7HsjAUF*TCwC@C>{dsts7V0>mFXiF zHeW>_(IFlU2HO*rrcumLl>F>yAAMid+PXxZX~`vDk(7DD*LTA`>C*<` zcsB&~x*br3ey4T}Rp}+`AkAa6el!2fXYKm6#oIam^rMiE3->Z z=O+l^gqY~M4GW&`^@ShmdosdiMaYbNXE!zqQix9??;bnY!XT)bCM3U*tafu4dMPDE z`q%&@8FDWPmR$9FB-vo(n5pxw8PSeC)n~4xKf)!1>IN~t75&{^b)YNw1keo>V0pK5 z>{t`(>Zr3OffXGVDpgqX`l^Kr@2`-TtO%w`MPsXUwXx{UXW@$BN?T?C3^%3%B2T552z56uR!&AvIJS@a z%I4OcHMsH)YECIxAg$;d-In3gW=t-T_o7oTtXhaeq}olDf#(O{2GFp3@_-wpFtj`C z3=ii+4}Lmx;gw)DX)FNjcY|p0 zzuYX!w6cG3uk8J+P?d20V~wLpLyETDP8ls$I+q)7))QhTf&E`m3O_Xls@&&w2Rx0y ziwu!g!RJOBW^M|*7LFh&RiH%3#tRoxgtzw>N}Bnt=hYM$uD;NkYS8~~{X_HNVJJCL zgSklaZP3bhuX{SO98%+@+!^}2%B#tRu*3DlPpp^t^m-3pwTsw$GJvSD-`w}o|VHa>s!2p^@G__2H1 z_8cP+eC_GVhI_gfu1mu~TXeE~jE~Eb-;B=_YbUDEwn3k0r9)%RX4}3c?O}dhwR_j0<&Aqo8nDEGuzaIb zR)01=xW{*n7tl)tNtGc5m=Rip;+W7*8PErrx(-;~+1#tZ!QdLF7=cs&Kq4+ePR zJ1N7=Ei?-4mADv_L^N*-7X3B(L?st)I!I}yvkL+zEheTUvFBD;eoaxN0{X!)^e3KX zx$w$Mh6*%rwBEY|?p(}KLFf1JZDfN%359Kbn@RD@l+_uS|ETT{XfhEUO3l)?ZWC7Ku^%p-RH{CAyT%~q=<|GiMeyXS?+(nq0s-M9kuC0ZOwm4|8z*2 z-W6WSuxfeQn5UmEHdS%G!OjqNv}wfhg82b6ZQL*{L;a|}jetjzV<9f^kN?}B1C#vt zXly2%=vs&hB|?DT3_Dt8R$pdcpwayrYHNAh%=;jgdV6~fhKCt@vST$-*cESBsJ>ht zJRc4x!i4wP?brR;*6;~2*rlW^*~w$6J|IUsROQY6C>153tvKUAq>=j?<#KYl$6|}( zjyHMCZl0WQ_OwGSBeW$w@k2Hn)Y~NUiP(Wd4*YSvgn#~1skM<0ogd_@ODs0AADgL> zh3`t96lV^+cJ3xLd`k0&)wn{g{(#xdQYl+fK-3%jKkzbznU99f=LA%s$jW1!PR(Du z$6DlO1~pD0SuMhnG6-yttDx;tG!WaRObjO|kxSL{D5wIzT2|6{uUio=$1exRUvFa4 zrROH2bxfojp%j79xN7Ed zc#|wb`GdpPrM8$>*@bU83{t&04j!fP(ni~{uDKz6Vfna;cOf6ZxWsD+FtbxX>9^Cf z4N!T%rdhrZ#D2b7n4*>;>hS%znei?dDH8;hiUTlA^m_$nfb1KjyX#ezn3(9Ln%C|E zco#xU6Ax?%o7pYJT96)lW6GKclScL1*|90iw=xZ|G?HygqGUCRIP6G*5p0#wp!+M?1@HBemU z0El<7Wd?Ph$(P)MsXv1%&L>bM=6=ECk;+bl*2<%*F=-2U4vMx0C=^_0Y{oQE@1rmm z<3psH+cs#FU@|O8hwfLRwqE3@Eri>qVSepNGL_;V6dJkRk6woTsP#wFwZC*A% zbNff@@Q!-8ePYXmo`ED&FQ^9RF7&Ja;RFGh=b)z8ITDwr?Ue^>+Nf*@iH7ZmX;Zo6ZPe3c`K$l{$mP7Q^lGo9xf|I0Sk^PGMAkQ zlnGSCmfas`TlJ)?uMMX$*iUZAp3M;anEX7!7&o(#Dp?pzgz3*$UdtoH>F=a70!8RA z$=^;kJhgP(+5iHdH~{*z-2XZI{OdzKaR}`@6Lfh2oVuhGV;@yeE83*xRMC#Y+^{{= zwgZ4}uhcBBW9FqTjpOlfQseZVWad1ief3@_(o&9%ACRI6 z1J%=n(;ji3g!tZJuDhzn9zQ$#aeyj#a2%L-n-QBzkqLcG}kn@(1O1v6(K3}G9HWm^S zaOH@55jqm&pOR!`!{#OTCfN!L3w`#^=c)!j2dWCtX6!E{Xnzj6%$!Q?xce4BeHMVZ zJ3(_aNv-FUz(&a9ua!{iVW}nB-3X5v^lhAfWU>h@C=g@Gv(?sO8P1vi^z@?T=G<<+ zyd4C}IRvP9Hsz>^g;a3%36lq8Q{3yPOo}wpSX1rKA$%pY5bgS^!tX$FOH%JqGvW`$ zfp|FV_a3tk*uC+6CF}Xnyt%-8nQrfnP$*s|A>{)IUSZN^+zX#4@&7Rk+6J6DS>TDaKZz0XgO{j#Lf5%2fKL3~iB)j%8SDe|ve@({DD6#$s#kW3q2* z<+8vZc3}}x24iv5KGluRIFc@hSp>fjjkBK``fzAho-v;O((Pv7HJnRSh)??f>+gn* zLkEvO4?ZHx=*D(ct{56NZVjoLzar-7dTN{1vOC_T>tRkU8oC59WGkG+BR1?}k~&6} zkrD%-o#1?L0-xda>Fzs(Te|TMD14)%Yei)n!Je<#@9BC^`J*K-g};=61qBl;Tg(GU z_mKudVUGw|I~KGQfT`to@W%jXR6?{=??w4f_>R=xq$}iOpwB?QkXs*Y6QoCn*KE`*MMUhxAy84dBaoLeZaxrkGcVNyU4FgZAL;UtUqtZCjY4d zVZp*}#7V|wZH!$X_mv2?6p-Ijf^&Su;t{*xFD;%Df=2eX*}bb2W<|%5LM0({oo+!GS28N~>uaYd%U%OH#%q*m_!sZNQ^7K47VzkIu+6e> zm`g>U2Pn6(AtKC^&Mk=xdI;jNJd$MB%!@>r*Bdr}-Hwm$rI4i&VImAY_lHSJH4^?M z(yW1xFd|NoWrJ2)ZKW_uN2f4_6yaf?y9P(|75vz;)`Atl8XNWV|2?&Tf43#SHi@kq)q^w%LSTwlCnI;xvaTm#|4))6!ztQ9)VN(oBT)BhpW1vtou&b58sb1 z;qzy;la^}twMPKtRx$_sjDW%KT(?{WjHMWaNm^Sa>Fiw zBpg2oxhA^evpTcT&K^;3(llF7P6E)t0%@A_DeX4xt+eQTO}~4CPx~!dssPOEgSLPZ zUC@{0H1!QMVr2|4AM)rGU6uwY{UsGf?}iHpLC@3>(1QsBtucdagUXyg&#~~sNv|7Y zNIcH*Kjs2;*DFf^GU*hmS~-rn1XymgKmdpK_)UteU;OnD+=^^$-+inNf?C3K zd|kQ%j@CKBwFSulxl*mcacZGyts)^WFOR2W2*2`itr9*7?Tz9rkMv(Z#_p$!Iq_;s z{!YBRKNBM8{{4aMq1z*zwUNpcprk(=`>q$(uJyeRng0GJ(%}FA=voYyJ+3)BJu>8b zE>1j<%-ayrvZoH_k8gr;>12Q={qP*J*c;r_P-u=pWOwygzZWWPiU6Gp6{n8y*-(mw z#QR$DxL4sat^0GtX#(cqHYQci0TN{w=vuf>BRz{=_y5T~?>itO1W-FOtFR03V^l!JJ>o)V^yKyB|w-Mq2Nd)4a{RWUHQH*fDKL z@ttcOqx%dMN>~Dr610{#i$BJH2|VMj0d{eyaXC9Uq1Uj__C<@PPfo+X1Vf=3GyWmxs12* zE_*b4H^Ot(FDJPIs03Snhd=YSz)f-LmxP5gA!Qk>PBAq%j#e46>J6>X$%Hjbs%nDykAT1f10!xQdUDV=2llH6Uegx@Vz#bgkN_ z`xt47s1KkkXmz%c1d`_8rueN*f^ArBrdSI4Ezevj5CHU8@jLKbv~1@Y2BTt3ncixx z^{5lq`u1^nuuk`aR%d6qOG=lH_vho7%x#SneBfwv3s^u37+wg8!AU94a4Q{r)z2UIB7~m2e;v(-wZR|CBsRgnD1yCv6Q@f824O2yNk)j5# zKX-MxSFb3(8Qnx%zt`%R5I4XU$R>-uWOZ4``*5|m*s*buy0&3WpjG)NN#k!_Q$}`_ ziSN3|i0~ZqQ|jPraWke)E*-Ujo4TVPJ6|U;kJwI~YPC~Kk9P!r*Z~!A{0HEYj|O9G z9kQ%RlT&D$M)C^S1Q;t4z zT{WQ9zPr^yX`n}foe=H3AT-nVXeKLYIO!bn;Vkd&N^Zz6pEyE~DvX|q|Dw2#6mGW8 zV^+B*xt@fuFq=BX+k8!GrZgJQw#Mc5LC5S`eF!Au_8jy(mN2)vt?CxfbR0AiDmTad z+)(}yoAKd@XliN6?E#Np56?ljFae=17ASrI+K_q2f9zydDaxo#I5yCU9yGdz;7P&4L(N3Kw5|Gsos( z2ekjp0Vi7ut&?%%1F7r+R zcm-ip=%@&-yngY^ZtL{3T=)xa!_wg;p`qIZZUi{LGiN~B1+i$-7dZ2gjzaqMWD~lhB-W%aFdW|t8Nr_k z4gB_eWtbv8YAQ$3%2^{mev^S^*_lY$nzxBB;Ol&$1GA?o0udGclT>Q|{f~7olGh=1 z1XGL(?D(e3f*zf)p0@|{deQ-ld#i(-4#~dtHTbq&_Ipw4@K7SFojmocQ%Y9Ldhj^| zDO{`IX+&%t!_>4uYJaq&9iRLYXrIK(+z}CWeH&vJd)cPEj`T4~{LvH^pnQ#yA%*3E>584mvf$n&}xs|aa}7#6EVyPdu}{Y=CD}_((KdC>FMVfBM^UaA1>kA z@4wYWPBrB4oP?Vf)q?c1UDI5x-JCSwW8tpO<;xPnj_~BM3~gUA#!y0O_kl59a+~+F z=V^4sFnO-v9&X8Z?tciy8uE`I+c%xm5ye>FV0iuOXSF%zd*)O!wLnL1N;Z)c?y6ty z0qy+g6q>yiTvgKK-^?QsJGSX%#jo1gNmqX4h#FW;haUlX_IqJQ!p1QnF7BrnSX z*34{O?vK{*Bh{?h?7LX#)(Fjh*owZ`Bq4#l*MG?AYf5t0J{IZ}bK5Zb`cw$?Pq#em zZ*Ap6@$Zr`p1Ub?!uk1{f^#lc&g(r10~k>=Bd)S)n;fKBOsq^w*3=k=m4&e_xQd_4 zYB>#b$X6D-%%ckt;!CMW-_b$MIdQc2>pKMIF_Q)X>rXQGLtJ_5k;PdBu5M6p+hESt zb0u{W)H)>3lWG4R=<@aUpCoSYW}^pMvFhrh<4!NFA{k>SAfOr#7=*F}5JSC`%PUvI zRI2xaQ@?F3y)#1#&rRrs@T1qk4LnnflKmJ*7$OkI*v7s(4qSADEzJMa_RhN&n}nHC z3edfnyssD%6=7sj#Y-7F2QCY!)H5i4JYbUrb)?cBMdLLHSeeS-ol7aJx6Ei&AT_?Z zLjJmzJkYs4FyLp<+u?d|w_~Bo{76S;0)MyK@hlU=@ycay$si4La1w`HiRM1hs>iwD|0iKsnP0lOkta(5ohleY7%6>vRoTgz!XVgICS&@SSnN#|;&MW8QIktn z<9ec!?(xqs8~!i9Y^`D|*nWu450R5N20->{l)a6KLJ2^bza;MO9om{Gqw}sP zz6728svtLEG-xJcg=0X2bWA9MG&9bVoCR;+j&9+McaW)TWm6)=P3IN=9VETH3mSqu zYsJ+y{zUnI!X|N0tnVgd;A8z8r=EwZ3+MIw?4HMF7qJ|OUq3~H0+iOM7uiJ!2x91) zap2LmeJ^>!-;f$QPkCs8Sj`oMj=spToTpj5!J`Cg*W}cTfDioYIq0oSr4Th%_%|7y zY=62xYdih}wG^QEm07jL`foB+n8Blku}pT3e^Z+YN|{Tcu{6*{Xn#(|Hh9MIWr^os znFT=Zf&z#;IqjPx{!PX!W$?&b)H+i2zsHt0I01+LYfOXwOI-VZ$290~5dZT3jBEb| drp=t;+T%82Q#)(_111x(R28)pD&(F9|2H&dF%AF# From ab9fc7c9f96f08dac85254c3e5c6859e939e02dc Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Thu, 19 Mar 2020 22:41:16 -0400 Subject: [PATCH 07/16] refactor(line-chart): fix formatting --- lib/src/chart/line_chart/line_chart_painter.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 4c707a1b5..cad692701 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -100,7 +100,6 @@ class LineChartPainter extends AxisChartPainter continue; } - // not here _drawBarLine(canvas, size, barData); _drawDots(canvas, size, barData); @@ -139,10 +138,7 @@ class LineChartPainter extends AxisChartPainter } } - void _clipToBorder( - ui.Canvas canvas, - ui.Size size, - ) { + void _clipToBorder(ui.Canvas canvas, ui.Size size) { final usableSize = getChartUsableDrawSize(size); double left = 0; From fc5974d31fb264d654aec9df98c884cadb462d18 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 02:26:47 -0400 Subject: [PATCH 08/16] style(line-chart): fix formatting we need a linter contributors need to follow instructors --- lib/src/chart/line_chart/line_chart_data.dart | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 80c6b2092..b1fbc4c28 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -12,7 +12,6 @@ import 'package:flutter/material.dart' hide Image; /// It holds data needed to draw a line chart, /// including bar lines, spots, colors, touches, ... class LineChartData extends AxisChartData { - /// [LineChart] draws some lines in various shapes and overlaps them. final List lineBarsData; @@ -225,7 +224,6 @@ class LineChartData extends AxisChartData { /// Holds data for drawing each individual line in the [LineChart] class LineChartBarData { - /// This line goes through this spots. final List spots; @@ -521,7 +519,6 @@ class BetweenBarsData { /// Holds data for drawing line on the spots under the [BarAreaData]. class BarAreaSpotsLine { - /// Determines to show or hide all the lines. final bool show; @@ -563,7 +560,6 @@ bool showAllSpotsBelowLine(FlSpot spot) { /// Holds data for showing dots on the bar line. class FlDotData { - /// Determines show or hide all dots. final bool show; @@ -615,7 +611,6 @@ bool showAllDots(FlSpot spot) { /// [LineChart] draws some [HorizontalLine] (set by [LineChartData.extraLinesData]), /// in below or above of everything, it draws from left to right side of the chart. class HorizontalLine extends FlLine { - /// Draws from left to right of the chart using the [y] value. final double y; @@ -667,7 +662,6 @@ class HorizontalLine extends FlLine { /// [LineChart] draws some [VerticalLine] (set by [LineChartData.extraLinesData]), /// in below or above of everything, it draws from bottom to top side of the chart. class VerticalLine extends FlLine { - /// Draws from bottom to top of the chart using the [x] value. final double x; @@ -716,7 +710,6 @@ class VerticalLine extends FlLine { // Shows a text label abstract class FlLineLabel { - /// Inner spaces around the drawing text. final EdgeInsetsGeometry padding; @@ -734,7 +727,6 @@ abstract class FlLineLabel { /// Draws a title on the [HorizontalLine] class HorizontalLineLabel extends FlLineLabel { - /// Resolves a label for showing. final String Function(HorizontalLine) labelResolver; @@ -766,7 +758,6 @@ class HorizontalLineLabel extends FlLineLabel { /// Draws a title on the [VerticalLine] class VerticalLineLabel extends FlLineLabel { - /// Resolves a label for showing. final String Function(VerticalLine) labelResolver; @@ -794,7 +785,6 @@ class VerticalLineLabel extends FlLineLabel { labelResolver: b.labelResolver, ); } - } /// Holds data for showing a vector image inside the chart. @@ -809,7 +799,6 @@ class VerticalLineLabel extends FlLineLabel { /// } /// ``` class SizedPicture { - /// Is the showing image. Picture picture; @@ -833,7 +822,6 @@ class SizedPicture { /// Draws some straight horizontal or vertical lines in the [LineChart] class ExtraLinesData { - final List horizontalLines; final List verticalLines; @@ -867,7 +855,6 @@ class ExtraLinesData { /// in a simple way, each chart captures the touch events, and passes a concrete /// instance of [FlTouchInput] to the painter, and gets a generated [LineTouchResponse]. class LineTouchData extends FlTouchData { - /// Configs of how touch tooltip popup. final LineTouchTooltipData touchTooltipData; @@ -938,11 +925,11 @@ class LineTouchData extends FlTouchData { /// length of this list should be equal to the [spotIndexes.length], /// each [TouchedSpotIndicatorData] determines the look of showing indicator. typedef GetTouchedSpotIndicator = List Function( - LineChartBarData barData, List spotIndexes); + LineChartBarData barData, List spotIndexes); /// Default presentation of touched indicators. List defaultTouchedIndicators( - LineChartBarData barData, List indicators) { + LineChartBarData barData, List indicators) { if (indicators == null) { return []; } @@ -973,7 +960,6 @@ List defaultTouchedIndicators( /// Holds representation data for showing tooltip popup on top of spots. class LineTouchTooltipData { - /// The tooltip background color. final Color tooltipBgColor; @@ -1053,7 +1039,6 @@ List defaultLineTooltipItem(List touchedSpots) { /// Represent a targeted spot inside a line bar. class LineBarSpot extends FlSpot { - /// Is the [LineChartBarData] that this spot is inside of. final LineChartBarData bar; @@ -1071,13 +1056,12 @@ class LineBarSpot extends FlSpot { this.bar, this.barIndex, FlSpot spot, - ) : spotIndex = bar.spots.indexOf(spot), - super(spot.x, spot.y); + ) : spotIndex = bar.spots.indexOf(spot), + super(spot.x, spot.y); } /// Holds data of showing each row item in the tooltip popup. class LineTooltipItem { - /// Showing text. final String text; @@ -1092,7 +1076,6 @@ class LineTooltipItem { /// [indicatorBelowLine] we draw a vertical line below of the touched spot /// [touchedSpotDotData] we draw a larger dot on the touched spot to bold it class TouchedSpotIndicatorData { - /// Determines line's style. final FlLine indicatorBelowLine; @@ -1112,7 +1095,6 @@ class TouchedSpotIndicatorData { /// You can override [LineTouchData.touchCallback] to handle touch events, /// it gives you a [LineTouchResponse] and you can do whatever you want. class LineTouchResponse extends BaseTouchResponse { - /// touch happened on these spots /// (if a single line provided on the chart, [lineBarSpots]'s length will be 1 always) final List lineBarSpots; @@ -1126,8 +1108,6 @@ class LineTouchResponse extends BaseTouchResponse { ) : super(touchInput); } - - /// It lerps a [LineChartData] to another [LineChartData] (handles animation for updating values) class LineChartDataTween extends Tween { LineChartDataTween({LineChartData begin, LineChartData end}) : super(begin: begin, end: end); @@ -1135,4 +1115,4 @@ class LineChartDataTween extends Tween { /// Lerps a [LineChartData] based on [t] value, check [Tween.lerp]. @override LineChartData lerp(double t) => begin.lerp(begin, end, t); -} \ No newline at end of file +} From eb0de4d65236ba370e4dc5e4d3a618a053961082 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 02:27:18 -0400 Subject: [PATCH 09/16] fix(line-chart): add nullchecking to max --- lib/src/chart/line_chart/line_chart_data.dart | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index b1fbc4c28..bf24c5c45 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -131,20 +131,22 @@ class LineChartData extends AxisChartData { final LineChartBarData barData = lineBarsData[i]; for (int j = 0; j < barData.spots.length; j++) { final FlSpot spot = barData.spots[j]; - if (canModifyMaxX && spot.x > maxX) { - maxX = spot.x; - } - - if (canModifyMinX && spot.x < minX) { - minX = spot.x; - } - - if (canModifyMaxY && spot.y > maxY) { - maxY = spot.y; - } - - if (canModifyMinY && spot.y < minY) { - minY = spot.y; + if (spot.x != null && spot.y != null) { + if (canModifyMaxX && spot.x > maxX) { + maxX = spot.x; + } + + if (canModifyMinX && spot.x < minX) { + minX = spot.x; + } + + if (canModifyMaxY && spot.y > maxY) { + maxY = spot.y; + } + + if (canModifyMinY && spot.y < minY) { + minY = spot.y; + } } } } From 864568d99b866326de8c754758de773ff48e149c Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 09:24:17 -0400 Subject: [PATCH 10/16] style(line-chart): revert fix formatting we need a linter contributors need to follow instructors This reverts commit fc5974d31fb264d654aec9df98c884cadb462d18. --- lib/src/chart/line_chart/line_chart_data.dart | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index bf24c5c45..48c1dbe81 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -12,6 +12,7 @@ import 'package:flutter/material.dart' hide Image; /// It holds data needed to draw a line chart, /// including bar lines, spots, colors, touches, ... class LineChartData extends AxisChartData { + /// [LineChart] draws some lines in various shapes and overlaps them. final List lineBarsData; @@ -226,6 +227,7 @@ class LineChartData extends AxisChartData { /// Holds data for drawing each individual line in the [LineChart] class LineChartBarData { + /// This line goes through this spots. final List spots; @@ -521,6 +523,7 @@ class BetweenBarsData { /// Holds data for drawing line on the spots under the [BarAreaData]. class BarAreaSpotsLine { + /// Determines to show or hide all the lines. final bool show; @@ -562,6 +565,7 @@ bool showAllSpotsBelowLine(FlSpot spot) { /// Holds data for showing dots on the bar line. class FlDotData { + /// Determines show or hide all dots. final bool show; @@ -613,6 +617,7 @@ bool showAllDots(FlSpot spot) { /// [LineChart] draws some [HorizontalLine] (set by [LineChartData.extraLinesData]), /// in below or above of everything, it draws from left to right side of the chart. class HorizontalLine extends FlLine { + /// Draws from left to right of the chart using the [y] value. final double y; @@ -664,6 +669,7 @@ class HorizontalLine extends FlLine { /// [LineChart] draws some [VerticalLine] (set by [LineChartData.extraLinesData]), /// in below or above of everything, it draws from bottom to top side of the chart. class VerticalLine extends FlLine { + /// Draws from bottom to top of the chart using the [x] value. final double x; @@ -712,6 +718,7 @@ class VerticalLine extends FlLine { // Shows a text label abstract class FlLineLabel { + /// Inner spaces around the drawing text. final EdgeInsetsGeometry padding; @@ -729,6 +736,7 @@ abstract class FlLineLabel { /// Draws a title on the [HorizontalLine] class HorizontalLineLabel extends FlLineLabel { + /// Resolves a label for showing. final String Function(HorizontalLine) labelResolver; @@ -760,6 +768,7 @@ class HorizontalLineLabel extends FlLineLabel { /// Draws a title on the [VerticalLine] class VerticalLineLabel extends FlLineLabel { + /// Resolves a label for showing. final String Function(VerticalLine) labelResolver; @@ -787,6 +796,7 @@ class VerticalLineLabel extends FlLineLabel { labelResolver: b.labelResolver, ); } + } /// Holds data for showing a vector image inside the chart. @@ -801,6 +811,7 @@ class VerticalLineLabel extends FlLineLabel { /// } /// ``` class SizedPicture { + /// Is the showing image. Picture picture; @@ -824,6 +835,7 @@ class SizedPicture { /// Draws some straight horizontal or vertical lines in the [LineChart] class ExtraLinesData { + final List horizontalLines; final List verticalLines; @@ -857,6 +869,7 @@ class ExtraLinesData { /// in a simple way, each chart captures the touch events, and passes a concrete /// instance of [FlTouchInput] to the painter, and gets a generated [LineTouchResponse]. class LineTouchData extends FlTouchData { + /// Configs of how touch tooltip popup. final LineTouchTooltipData touchTooltipData; @@ -927,11 +940,11 @@ class LineTouchData extends FlTouchData { /// length of this list should be equal to the [spotIndexes.length], /// each [TouchedSpotIndicatorData] determines the look of showing indicator. typedef GetTouchedSpotIndicator = List Function( - LineChartBarData barData, List spotIndexes); + LineChartBarData barData, List spotIndexes); /// Default presentation of touched indicators. List defaultTouchedIndicators( - LineChartBarData barData, List indicators) { + LineChartBarData barData, List indicators) { if (indicators == null) { return []; } @@ -962,6 +975,7 @@ List defaultTouchedIndicators( /// Holds representation data for showing tooltip popup on top of spots. class LineTouchTooltipData { + /// The tooltip background color. final Color tooltipBgColor; @@ -1041,6 +1055,7 @@ List defaultLineTooltipItem(List touchedSpots) { /// Represent a targeted spot inside a line bar. class LineBarSpot extends FlSpot { + /// Is the [LineChartBarData] that this spot is inside of. final LineChartBarData bar; @@ -1058,12 +1073,13 @@ class LineBarSpot extends FlSpot { this.bar, this.barIndex, FlSpot spot, - ) : spotIndex = bar.spots.indexOf(spot), - super(spot.x, spot.y); + ) : spotIndex = bar.spots.indexOf(spot), + super(spot.x, spot.y); } /// Holds data of showing each row item in the tooltip popup. class LineTooltipItem { + /// Showing text. final String text; @@ -1078,6 +1094,7 @@ class LineTooltipItem { /// [indicatorBelowLine] we draw a vertical line below of the touched spot /// [touchedSpotDotData] we draw a larger dot on the touched spot to bold it class TouchedSpotIndicatorData { + /// Determines line's style. final FlLine indicatorBelowLine; @@ -1097,6 +1114,7 @@ class TouchedSpotIndicatorData { /// You can override [LineTouchData.touchCallback] to handle touch events, /// it gives you a [LineTouchResponse] and you can do whatever you want. class LineTouchResponse extends BaseTouchResponse { + /// touch happened on these spots /// (if a single line provided on the chart, [lineBarSpots]'s length will be 1 always) final List lineBarSpots; @@ -1110,6 +1128,8 @@ class LineTouchResponse extends BaseTouchResponse { ) : super(touchInput); } + + /// It lerps a [LineChartData] to another [LineChartData] (handles animation for updating values) class LineChartDataTween extends Tween { LineChartDataTween({LineChartData begin, LineChartData end}) : super(begin: begin, end: end); @@ -1117,4 +1137,4 @@ class LineChartDataTween extends Tween { /// Lerps a [LineChartData] based on [t] value, check [Tween.lerp]. @override LineChartData lerp(double t) => begin.lerp(begin, end, t); -} +} \ No newline at end of file From 9220070e58d1a03038878b9368b444b549803190 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 09:27:41 -0400 Subject: [PATCH 11/16] fix(line-chart): fix order of painters in barlist --- lib/src/chart/line_chart/line_chart_painter.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index cad692701..4382c712c 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -186,18 +186,17 @@ class LineChartPainter extends AxisChartPainter // and bar is a piece of that line barList.forEach((bar) { final barPath = _generateBarPath(viewSize, barData, bar: bar); - _drawBar(canvas, viewSize, barPath, barData); final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath, bar: bar); final completelyFillBelowBarPath = _generateBelowBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); - final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, bar: bar); final completelyFillAboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); + _drawBar(canvas, viewSize, barPath, barData); }); } From 199c53e3f06b26529ec3d2bbca22cebad144405d Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 10:11:19 -0400 Subject: [PATCH 12/16] style(line-chart): revert formatting changes --- lib/src/chart/line_chart/line_chart_painter.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 4382c712c..99bc0b89f 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -17,6 +17,7 @@ import 'line_chart_data.dart'; /// Paints [LineChartData] in the canvas, it can be used in a [CustomPainter] class LineChartPainter extends AxisChartPainter with TouchHandler { + Paint _barPaint, _barAreaPaint, _barAreaLinesPaint, From 2442cd7f160bf6a09c234a273d16732d38a20339 Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 10:34:39 -0400 Subject: [PATCH 13/16] refactor(line-chart): better readability and naming --- .../chart/line_chart/line_chart_painter.dart | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 99bc0b89f..dd66be7ec 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -185,20 +185,20 @@ class LineChartPainter extends AxisChartPainter // bar is passed in seperately from barData // because barData is the whole line // and bar is a piece of that line - barList.forEach((bar) { - final barPath = _generateBarPath(viewSize, barData, bar: bar); + for (List bar in barList) { + final barPath = _generateBarPath(viewSize, barData, bar); - final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath, bar: bar); + final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath, bar); final completelyFillBelowBarPath = - _generateBelowBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); - final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, bar: bar); + _generateBelowBarPath(viewSize, barData, barPath, bar, fillCompletely: true); + final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, bar); final completelyFillAboveBarPath = - _generateAboveBarPath(viewSize, barData, barPath, bar: bar, fillCompletely: true); + _generateAboveBarPath(viewSize, barData, barPath, bar, fillCompletely: true); _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); _drawBar(canvas, viewSize, barPath, barData); - }); + } } void _drawBetweenBarsArea( @@ -211,13 +211,13 @@ class LineChartPainter extends AxisChartPainter final fromBarPath = _generateBarPath( viewSize, fromBarData, - bar: fromBarData.spots, + fromBarData.spots, ); final barPath = _generateBarPath( viewSize, toBarData.copyWith(spots: spots), + toBarData.copyWith(spots: spots).spots, appendToPath: fromBarPath, - bar: toBarData.copyWith(spots: spots).spots, ); _drawBetweenBar(canvas, viewSize, barPath, betweenBarsData); @@ -294,8 +294,8 @@ class LineChartPainter extends AxisChartPainter /// and we use isCurved to find out how we should generate it, /// If you want to concatenate paths together for creating an area between /// multiple bars for example, you can pass the appendToPath - Path _generateBarPath(Size viewSize, LineChartBarData barData, - {Path appendToPath, List bar}) { + Path _generateBarPath(Size viewSize, LineChartBarData barData, List bar, + {Path appendToPath}) { viewSize = getChartUsableDrawSize(viewSize); final Path path = appendToPath ?? Path(); final int size = bar.length; @@ -367,8 +367,9 @@ class LineChartPainter extends AxisChartPainter /// if cutOffY is provided by the [BarAreaData], it cut the area to the provided cutOffY value, /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, - Path _generateBelowBarPath(Size viewSize, LineChartBarData barData, Path barPath, - {List bar, bool fillCompletely = false}) { + Path _generateBelowBarPath( + Size viewSize, LineChartBarData barData, Path barPath, List bar, + {bool fillCompletely = false}) { final belowBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); @@ -405,8 +406,9 @@ class LineChartPainter extends AxisChartPainter /// if cutOffY is provided by the [BarAreaData], it cut the area to the provided cutOffY value, /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, - Path _generateAboveBarPath(Size viewSize, LineChartBarData barData, Path barPath, - {List bar, bool fillCompletely = false}) { + Path _generateAboveBarPath( + Size viewSize, LineChartBarData barData, Path barPath, List bar, + {bool fillCompletely = false}) { final aboveBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); From 9804b3ec834b17780de6edd9bdc9c77de7f3cc5c Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 11:25:50 -0400 Subject: [PATCH 14/16] feat(line-chart): better nullability sample --- .../samples/line_chart_sample8.dart | 14 ++++++-------- .../images/line_chart/line_chart_sample_8.png | Bin 29699 -> 32552 bytes 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/example/lib/line_chart/samples/line_chart_sample8.dart b/example/lib/line_chart/samples/line_chart_sample8.dart index b299618a4..acb9fa6e5 100644 --- a/example/lib/line_chart/samples/line_chart_sample8.dart +++ b/example/lib/line_chart/samples/line_chart_sample8.dart @@ -173,18 +173,16 @@ class _LineChartSample8State extends State { lineBarsData: [ LineChartBarData( spots: const [ - FlSpot(null, null), FlSpot(0, 1), FlSpot(2, 1), - FlSpot(3, 4), + FlSpot(4.9, 5), + FlSpot(6.8, 5), + FlSpot(7.5, 4), FlSpot(null, null), - FlSpot(5, 3), - FlSpot(6, 2), + FlSpot(7.5, 2), FlSpot(8, 1), - FlSpot(9, 2), - FlSpot(10, 3), - FlSpot(11, 3.5), - // FlSpot(null, null), + FlSpot(10, 2), + FlSpot(11, 2.5), ], dashArray: [2, 4], isCurved: true, diff --git a/repo_files/images/line_chart/line_chart_sample_8.png b/repo_files/images/line_chart/line_chart_sample_8.png index de31701d11b69154a8e2f84f80f59730b4bb3157..9246cdf9474ba857506f553d918b9f35df987126 100644 GIT binary patch literal 32552 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

()?;kB;jDFtHU$ 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 Date: Fri, 20 Mar 2020 11:36:29 -0400 Subject: [PATCH 15/16] refactor(line-chart): bar param renamed to barSpots --- .../chart/line_chart/line_chart_painter.dart | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index dd66be7ec..9304091f9 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -294,16 +294,16 @@ class LineChartPainter extends AxisChartPainter /// and we use isCurved to find out how we should generate it, /// If you want to concatenate paths together for creating an area between /// multiple bars for example, you can pass the appendToPath - Path _generateBarPath(Size viewSize, LineChartBarData barData, List bar, + Path _generateBarPath(Size viewSize, LineChartBarData barData, List barSpots, {Path appendToPath}) { viewSize = getChartUsableDrawSize(viewSize); final Path path = appendToPath ?? Path(); - final int size = bar.length; + final int size = barSpots.length; var temp = const Offset(0.0, 0.0); - final double x = getPixelX(bar[0].x, viewSize); - final double y = getPixelY(bar[0].y, viewSize); + final double x = getPixelX(barSpots[0].x, viewSize); + final double y = getPixelY(barSpots[0].y, viewSize); if (appendToPath == null) { path.moveTo(x, y); } else { @@ -312,20 +312,20 @@ class LineChartPainter extends AxisChartPainter for (int i = 1; i < size; i++) { /// CurrentSpot final current = Offset( - getPixelX(bar[i].x, viewSize), - getPixelY(bar[i].y, viewSize), + getPixelX(barSpots[i].x, viewSize), + getPixelY(barSpots[i].y, viewSize), ); /// previous spot final previous = Offset( - getPixelX(bar[i - 1].x, viewSize), - getPixelY(bar[i - 1].y, viewSize), + getPixelX(barSpots[i - 1].x, viewSize), + getPixelY(barSpots[i - 1].y, viewSize), ); /// next point final next = Offset( - getPixelX(bar[i + 1 < size ? i + 1 : i].x, viewSize), - getPixelY(bar[i + 1 < size ? i + 1 : i].y, viewSize), + getPixelX(barSpots[i + 1 < size ? i + 1 : i].x, viewSize), + getPixelY(barSpots[i + 1 < size ? i + 1 : i].y, viewSize), ); final controlPoint1 = previous + temp; @@ -368,14 +368,14 @@ class LineChartPainter extends AxisChartPainter /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, Path _generateBelowBarPath( - Size viewSize, LineChartBarData barData, Path barPath, List bar, + Size viewSize, LineChartBarData barData, Path barPath, List barSpots, {bool fillCompletely = false}) { final belowBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); /// Line To Bottom Right - double x = getPixelX(bar[bar.length - 1].x, chartViewSize); + double x = getPixelX(barSpots[barSpots.length - 1].x, chartViewSize); double y; if (!fillCompletely && barData.belowBarData.applyCutOffY) { y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); @@ -385,7 +385,7 @@ class LineChartPainter extends AxisChartPainter belowBarPath.lineTo(x, y); /// Line To Bottom Left - x = getPixelX(bar[0].x, chartViewSize); + x = getPixelX(barSpots[0].x, chartViewSize); if (!fillCompletely && barData.belowBarData.applyCutOffY) { y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); } else { @@ -394,8 +394,8 @@ class LineChartPainter extends AxisChartPainter belowBarPath.lineTo(x, y); /// Line To Top Left - x = getPixelX(bar[0].x, chartViewSize); - y = getPixelY(bar[0].y, chartViewSize); + x = getPixelX(barSpots[0].x, chartViewSize); + y = getPixelY(barSpots[0].y, chartViewSize); belowBarPath.lineTo(x, y); belowBarPath.close(); @@ -407,14 +407,14 @@ class LineChartPainter extends AxisChartPainter /// if [fillCompletely] is true, the cutOffY will be ignored, /// and a completely filled path will return, Path _generateAboveBarPath( - Size viewSize, LineChartBarData barData, Path barPath, List bar, + Size viewSize, LineChartBarData barData, Path barPath, List barSpots, {bool fillCompletely = false}) { final aboveBarPath = Path.from(barPath); final chartViewSize = getChartUsableDrawSize(viewSize); /// Line To Top Right - double x = getPixelX(bar[bar.length - 1].x, chartViewSize); + double x = getPixelX(barSpots[barSpots.length - 1].x, chartViewSize); double y; if (!fillCompletely && barData.aboveBarData.applyCutOffY) { y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); @@ -424,7 +424,7 @@ class LineChartPainter extends AxisChartPainter aboveBarPath.lineTo(x, y); /// Line To Top Left - x = getPixelX(bar[0].x, chartViewSize); + x = getPixelX(barSpots[0].x, chartViewSize); if (!fillCompletely && barData.aboveBarData.applyCutOffY) { y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); } else { @@ -433,8 +433,8 @@ class LineChartPainter extends AxisChartPainter aboveBarPath.lineTo(x, y); /// Line To Bottom Left - x = getPixelX(bar[0].x, chartViewSize); - y = getPixelY(bar[0].y, chartViewSize); + x = getPixelX(barSpots[0].x, chartViewSize); + y = getPixelY(barSpots[0].y, chartViewSize); aboveBarPath.lineTo(x, y); aboveBarPath.close(); From b6abf5dd59d76f9af3210f6f1092d6aee43ced7d Mon Sep 17 00:00:00 2001 From: Timothy Shamilov Date: Fri, 20 Mar 2020 11:42:15 -0400 Subject: [PATCH 16/16] style(line-chart): format removed --- lib/src/chart/line_chart/line_chart_painter.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 9304091f9..1003ebce3 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -139,7 +139,7 @@ class LineChartPainter extends AxisChartPainter } } - void _clipToBorder(ui.Canvas canvas, ui.Size size) { + void _clipToBorder(ui.Canvas canvas, ui.Size size,) { final usableSize = getChartUsableDrawSize(size); double left = 0; @@ -1190,11 +1190,7 @@ class LineChartPainter extends AxisChartPainter /// find the nearest spot base on the touched offset LineBarSpot _getNearestTouchedSpot( - Size viewSize, - Offset touchedPoint, - LineChartBarData barData, - int barDataPosition, - ) { + Size viewSize, Offset touchedPoint, LineChartBarData barData, int barDataPosition) { if (!barData.show) { return null; }