From 050231b0cf9ab23f126a7c9c59dd79bae7b9a978 Mon Sep 17 00:00:00 2001 From: James Saunders Date: Sun, 17 Sep 2017 23:09:48 +0100 Subject: [PATCH] v1.6.5 Finished Multi Series Line chart. --- Makefile | 3 +- d3.ez.css | 41 +++--- d3.ez.js | 194 ++++++++++++++------------ d3.ez.min.js | 2 +- d3.ez.zip | Bin 30941 -> 31106 bytes examples/MultiSeriesLineChart.html | 44 ++---- examples/TabularHeatChartExample.html | 12 +- examples/TimeSeriesChartExample.html | 63 --------- src/d3.ez.js | 1 - src/js/multiSeriesLineChart.js | 23 ++- src/js/timeSeriesChart.js | 188 ------------------------- 11 files changed, 164 insertions(+), 407 deletions(-) delete mode 100644 examples/TimeSeriesChartExample.html delete mode 100644 src/js/timeSeriesChart.js diff --git a/Makefile b/Makefile index 3a79f47a..2478e679 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ JS_FILES := src/js/header.js \ src/js/tabularHeatChart.js \ src/js/donutChart.js \ src/js/punchCard.js \ - src/js/timeSeriesChart.js \ + src/js/multiSeriesLineChart.js \ src/js/htmlTable.js \ src/js/htmlList.js \ src/js/reusableComponents.js @@ -21,6 +21,7 @@ CSS_FILES := src/css/global.css \ src/css/tabularHeatChart.css \ src/css/donutChart.css \ src/css/punchCard.css \ + src/css/multiSeriesLineChart.css \ src/css/htmlList.css \ src/css/htmlTable.css diff --git a/d3.ez.css b/d3.ez.css index 54ddeba0..16783efb 100644 --- a/d3.ez.css +++ b/d3.ez.css @@ -137,6 +137,27 @@ } +/* === Multi Series Line Chart Styles === */ +.multiSeriesLineChart .line { + fill: none; + stroke: steelblue; + stroke-width: 1.5px; +} +@keyframes circleTransition { + from { + transform: scale(1); + } + to { + transform: scale(1.5); + } +} +.multiSeriesLineChart circle:hover { + animation-duration: 0.2s; + animation-name: circleTransition; + transform-origin: center center; +} + + /* === HTML List Styles === */ .htmlList, .htmlList ul { margin: 0; @@ -217,22 +238,4 @@ table.htmlTable { background-color: #eeeeee; } -/* === Multi Series Line Chart Styles === */ -.multiSeriesLineChart .line { - fill: none; - stroke: steelblue; - stroke-width: 1.5px; -} -@keyframes circleTransition { - from { - transform: scale(1); - } - to { - transform: scale(1.5); - } -} -.multiSeriesLineChart circle:hover { - animation-duration: 0.2s; - animation-name: circleTransition; - transform-origin: center center; -} + diff --git a/d3.ez.js b/d3.ez.js index ed55c2b3..cb9c0349 100644 --- a/d3.ez.js +++ b/d3.ez.js @@ -48,20 +48,6 @@ d3.ez.base = function module() { function init(data) { canvasW = width - (margin.left + margin.right); canvasH = height - (margin.top + margin.bottom); - // Init Data - if (!data[0]) { - // TODO: Can this be done better? - // If 1 dimensional data - categories = d3.values(data)[1]; - } else { - // If 2 dimensional data - categories = data.map(function(d) { - return d.values; - })[0]; - } - categoryNames = categories.map(function(d) { - return d.key; - }); // Init Chart chart.dispatch(dispatch).width(canvasW).height(canvasH); // Init Legend @@ -1647,20 +1633,17 @@ d3.ez.punchCard = function module() { }; /** - * Time Series Chart + * Multi Series Line Chart * * @example - * var formatDate = d3.time.format("%b %Y"); - * var myChart = d3.ez.timeSeriesChart() - * .x(function(d) { return formatDate.parse(d.date); }) - * .y(function(d) { return +d.price; }) - * .width(600) - * .height(350); + * var myChart = d3.ez.multiSeriesLineChart() + * .width(400) + * .height(300); * d3.select("#chartholder") - * .datum(data) - * .call(myChart); + * .datum(data) + * .call(myChart); */ -d3.ez.timeSeriesChart = function module() { +d3.ez.multiSeriesLineChart = function module() { // SVG and Chart containers (Populated by 'my' function) var svg; var chart; @@ -1668,63 +1651,64 @@ d3.ez.timeSeriesChart = function module() { var width = 400; var height = 300; var margin = { - top: 50, - right: 40, - bottom: 50, + top: 20, + right: 20, + bottom: 30, left: 40 }; - var transition = { - ease: "bounce", - duration: 500 - }; - var classed = "timeSeriesChart"; - var color = "steelblue"; - var xValue = function(d) { - return d[0]; - }; - var yValue = function(d) { - return d[1]; - }; + var classed = "multiSeriesLineChart"; + var colors = d3.ez.colors.categorical(3); + var yAxisLabel = null; + var groupType = "clustered"; // Data Options (Populated by 'init' function) var chartW = 0; var chartH = 0; + var minValue = 0; + var maxValue = 0; + var maxGroupTotal = undefined; + var xScale = undefined; + var yScale = undefined; + var xAxis = undefined; + var yAxis = undefined; + var colorScale = undefined; // Dispatch (Custom events) var dispatch = d3.dispatch("customMouseOver", "customMouseOut", "customClick"); + // Other functions + var line = undefined; + var cities; function init(data) { chartW = width - margin.left - margin.right; chartH = height - margin.top - margin.bottom; + // Group and Category Names + seriesNames = data.map(function(d) { + return d.key; + }); + // Convert dates and calculate min / max + data.forEach(function(d, i) { + d.values.forEach(function(b, j) { + data[i].values[j].key = new Date(b.key * 1e3); + var value = data[i].values[j].value; + minValue = value < minValue ? value : minValue; + maxValue = value > maxValue ? value : maxValue; + }); + }); + // X & Y Scales + dateDomain = d3.extent(data[0].values, function(d) { + return d.key; + }); + xScale = d3.time.scale().range([ 0, chartW ]).domain(dateDomain); + yScale = d3.scale.linear().range([ chartH, 0 ]).domain([ minValue, maxValue + 10 ]); + // X & Y Axis + xAxis = d3.svg.axis().scale(xScale).orient("bottom").tickFormat(d3.time.format("%d-%b")); + yAxis = d3.svg.axis().scale(yScale).orient("left"); + // Colour Scale + colorScale = d3.scale.ordinal().range(colors).domain(seriesNames); } function my(selection) { selection.each(function(data) { // Initialise Data init(data); - // Convert data to standard representation greedily; - // this is needed for nondeterministic accessors. - data = data.map(function(d, i) { - return [ xValue.call(data, d, i), yValue.call(data, d, i) ]; - }); - // X & Y Scales - var xScale = d3.time.scale().domain(d3.extent(data, function(d) { - return d[0]; - })).range([ 0, chartW ]); - var yScale = d3.scale.linear().domain([ 0, d3.max(data, function(d) { - return d[1]; - }) ]).range([ chartH, 0 ]); - // X & Y Axis - var xAxis = d3.svg.axis().scale(xScale).orient("bottom").tickSize(6, 0); - var yAxis = d3.svg.axis().scale(yScale).orient("left").tickSize(6, 6); - // Setup the Line and Area - var area = d3.svg.area().x(function(d) { - return xScale(d[0]); - }).y1(function(d) { - return yScale(d[1]); - }); - var line = d3.svg.line().x(function(d) { - return xScale(d[0]); - }).y(function(d) { - return yScale(d[1]); - }); - // Create SVG element (if it does not exist already) + // Create SVG and Chart containers (if they do not already exist) if (!svg) { svg = function(selection) { var el = selection[0][0]; @@ -1738,30 +1722,43 @@ d3.ez.timeSeriesChart = function module() { width: width, height: height }); - var chart = svg.append("g").classed("chart", true); - chart.append("path").classed("chart-area-path", true); - chart.append("path").classed("chart-line-path", true); - chart.append("g").classed("x-axis-group axis", true); - chart.append("g").classed("y-axis-group axis", true); + chart = svg.append("g").classed("chart", true); + chart.append("g").classed("x-axis axis", true); + chart.append("g").classed("y-axis axis", true).append("text").attr("transform", "rotate(-90)").attr("y", -35).attr("dy", ".71em").style("text-anchor", "end").text(yAxisLabel); } else { - chart = svg.select(".chart"); + chart = selection.select(".chart"); } // Update the chart dimensions chart.classed(classed, true).attr({ - width: chartW, - height: chartH + width: width, + height: height }).attr({ transform: "translate(" + margin.left + "," + margin.top + ")" }); // Add axis to chart - chart.select(".x-axis-group.axis").attr({ - transform: "translate(0," + yScale.range()[0] + ")" - }).call(xAxis); - chart.select(".y-axis-group.axis").call(yAxis); - // Update the area path - chart.select(".chart-area-path").data([ data ]).attr("d", area.y0(yScale.range()[0])).attr("fill", color); - // Update the line path - chart.select(".chart-line-path").data([ data ]).attr("d", line).attr("fill", "none"); + chart.select(".x-axis").attr("transform", "translate(0," + chartH + ")").call(xAxis).selectAll("text").style("text-anchor", "end").attr("dx", "-.8em").attr("dy", ".15em").attr("transform", "rotate(-65)"); + chart.select(".y-axis").call(yAxis); + var series = chart.selectAll(".series").data(data).enter().append("g").attr("class", "series"); + // Line Generator + line = d3.svg.line().x(function(d) { + return xScale(d.key); + }).y(function(d) { + return yScale(d.value); + }); + series.append("path").attr("class", "line").attr("d", function(d) { + return line(d.values); + }).style("stroke", function(d) { + return colorScale(d.key); + }); + series.selectAll("circle").data(function(d) { + return d.values; + }).enter().append("circle").attr("r", 3).attr("cx", function(d) { + return xScale(d.key); + }).attr("cy", function(d) { + return yScale(d.value); + }).style("fill", function(d, i, j) { + return colorScale(data[j].key); + }).on("mouseover", dispatch.customMouseOver); }); } // Configuration Getters & Setters @@ -1780,19 +1777,34 @@ d3.ez.timeSeriesChart = function module() { margin = _; return this; }; - my.x = function(_) { - if (!arguments.length) return xValue; - xValue = _; + my.yAxisLabel = function(_) { + if (!arguments.length) return yAxisLabel; + yAxisLabel = _; + return this; + }; + my.groupType = function(_) { + if (!arguments.length) return groupType; + groupType = _; return this; }; - my.y = function(_) { - if (!arguments.length) return yValue; - yValue = _; + my.transition = function(_) { + if (!arguments.length) return transition; + transition = _; return this; }; - my.color = function(_) { - if (!arguments.length) return color; - color = _; + my.colors = function(_) { + if (!arguments.length) return colors; + colors = _; + return this; + }; + my.colorScale = function(_) { + if (!arguments.length) return colorScale; + colorScale = _; + return this; + }; + my.dispatch = function(_) { + if (!arguments.length) return dispatch(); + dispatch = _; return this; }; d3.rebind(my, dispatch, "on"); diff --git a/d3.ez.min.js b/d3.ez.min.js index 46b9d857..7cd5e221 100644 --- a/d3.ez.min.js +++ b/d3.ez.min.js @@ -1 +1 @@ -d3.ez={version:"1.6.5",author:"James Saunders",copyright:"Copyright (C) 2017 James Saunders",license:"GPL-3.0"};d3.ez.base=function module(){var svg;var canvas;var width=600;var height=400;var margin={top:15,right:15,bottom:15,left:15};var canvasW=580;var canvasH=380;var chartTop=0;var classed="d3ez";var chart=undefined;var legend=undefined;var title=undefined;var creditTag=d3.ez.creditTag();var description="";var yAxisLabel="";var colorScale=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){canvasW=width-(margin.left+margin.right);canvasH=height-(margin.top+margin.bottom);if(!data[0]){categories=d3.values(data)[1]}else{categories=data.map(function(d){return d.values})[0]}categoryNames=categories.map(function(d){return d.key});chart.dispatch(dispatch).width(canvasW).height(canvasH);if(legend){legend.width(150).height(200);chart.width(chart.width()-legend.width())}if(title){chartTop=title.height();chart.height(chart.height()-title.height())}creditTag.text("d3ez.org").href("http://d3ez.org")}function my(selection){selection.each(function(data){init(data);if(!svg){svg=d3.select(this).append("svg").classed(classed,true).attr({width:width,height:height});canvas=svg.append("g").classed("canvas",true);canvas.append("g").classed("chartbox",true);canvas.append("g").classed("legendbox",true);canvas.append("g").classed("titlebox",true);canvas.append("g").classed("creditbox",true)}else{canvas=svg.select(".canvas")}canvas.attr({width:canvasW,height:canvasH}).attr({transform:"translate("+margin.left+","+margin.top+")"});canvas.select(".chartbox").datum(data).attr({transform:"translate("+0+","+chartTop+")"}).call(chart);if(legend&&(typeof chart.colorScale==="function"||typeof chart.sizeScale==="function")){if(typeof chart.colorScale==="function"){legend.colorScale(chart.colorScale())}if(typeof chart.sizeScale==="function"){legend.sizeScale(chart.sizeScale())}canvas.select(".legendbox").attr({transform:"translate("+(canvasW-legend.width())+","+title.height()+")"}).call(legend)}if(title){canvas.select(".titlebox").attr({transform:"translate("+width/2+","+0+")"}).call(title)}canvas.select(".creditbox").attr({transform:"translate("+(width-20)+","+(height-20)+")"}).call(creditTag)})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.chart=function(_){if(!arguments.length)return chart;chart=_;return this};my.legend=function(_){if(!arguments.length)return legend;legend=_;return this};my.title=function(_){if(!arguments.length)return title;if(typeof _==="string"){title=d3.ez.title().mainText(_).subText("")}else{title=_}return this};my.yAxisLabel=function(_){if(!arguments.length)return yAxisLabel;yAxisLabel=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.discreteBarChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:40};var transition={ease:"bounce",duration:500};var classed="discreteBarChart";var colors=d3.ez.colors.categorical(4);var gap=0;var chartW=0;var chartH=0;var maxValue=0;var categoryNames=[];var xScale=undefined;var yScale=undefined;var yAxisLabel=undefined;var xAxis=undefined;var yAxis=undefined;var colorScale=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){chartW=width-(margin.left+margin.right);chartH=height-(margin.top+margin.bottom);yAxisLabel=d3.values(data)[0];maxValue=d3.max(data.values,function(d){return d.value});categoryNames=d3.values(data)[1].map(function(d){return d.key});xScale=d3.scale.ordinal().domain(categoryNames).rangeRoundBands([0,chartW],.1);yScale=d3.scale.linear().domain([0,maxValue]).range([chartH,0]);xAxis=d3.svg.axis().scale(xScale).orient("bottom");yAxis=d3.svg.axis().scale(yScale).orient("left");if(!colorScale){colorScale=d3.scale.ordinal().range(colors).domain(categoryNames)}}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("x-axis axis",true);chart.append("g").classed("y-axis axis",true)}else{chart=svg.select(".chart")}chart.classed(classed,true).attr({width:chartW,height:chartH}).attr({transform:"translate("+margin.left+","+margin.top+")"});chart.select(".x-axis").attr({transform:"translate(0,"+chartH+")"}).call(xAxis);chart.select(".y-axis").call(yAxis);ylabel=chart.select(".y-axis").selectAll(".y-label").data([data.key]);ylabel.enter().append("text").classed("y-label",true).attr("transform","rotate(-90)").attr("y",-35).attr("dy",".71em").style("text-anchor","end");ylabel.transition().text(function(d){return d});var gapSize=xScale.rangeBand()/100*gap;var barW=xScale.rangeBand()-gapSize;var bars=chart.selectAll(".bar").data(data.values);bars.enter().append("rect").attr("class",function(d){return d.key+" bar"}).attr("fill",function(d){return colorScale(d.key)}).attr({width:barW,x:function(d,i){return xScale(d.key)+gapSize/2},y:chartH,height:0}).on("mouseover",dispatch.customMouseOver);bars.transition().ease(transition.ease).duration(transition.duration).attr({width:barW,x:function(d,i){return xScale(d.key)+gapSize/2},y:function(d,i){return yScale(d.value)},height:function(d,i){return chartH-yScale(d.value)}});bars.exit().transition().style({opacity:0}).remove()})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.groupedBarChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:40};var transition={ease:"bounce",duration:500};var classed="groupedBarChart";var colors=d3.ez.colors.categorical(4);var gap=0;var yAxisLabel=null;var groupType="clustered";var chartW=0;var chartH=0;var groupNames=undefined;var categoryNames=[];var categoryTotals=[];var groupTotals=[];var maxValue=0;var maxGroupTotal=undefined;var xScale=undefined;var yScale=undefined;var xAxis=undefined;var yAxis=undefined;var colorScale=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){chartW=width-margin.left-margin.right;chartH=height-margin.top-margin.bottom;groupNames=data.map(function(d){return d.key});categoryNames=[];data.map(function(d){return d.values})[0].forEach(function(d,i){categoryNames[i]=d.key});categoryTotals=[];groupTotals=[];maxValue=0;d3.map(data).values().forEach(function(d){grp=d.key;d.values.forEach(function(d){categoryTotals[d.key]=typeof categoryTotals[d.key]==="undefined"?0:categoryTotals[d.key];categoryTotals[d.key]+=d.value;groupTotals[grp]=typeof groupTotals[grp]==="undefined"?0:groupTotals[grp];groupTotals[grp]+=d.value;maxValue=d.value>maxValue?d.value:maxValue})});maxGroupTotal=d3.max(d3.values(groupTotals));xScale=d3.scale.ordinal().rangeRoundBands([0,chartW],.1).domain(groupNames);yScale=d3.scale.linear().range([chartH,0]).domain([0,groupType=="stacked"?maxGroupTotal:maxValue]);xAxis=d3.svg.axis().scale(xScale).orient("bottom");yAxis=d3.svg.axis().scale(yScale).orient("left");colorScale=d3.scale.ordinal().range(colors).domain(categoryNames)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("x-axis axis",true);chart.append("g").classed("y-axis axis",true).append("text").attr("transform","rotate(-90)").attr("y",-35).attr("dy",".71em").style("text-anchor","end").text(yAxisLabel)}else{chart=selection.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+margin.left+","+margin.top+")"});chart.select(".x-axis").attr({transform:"translate(0,"+chartH+")"}).call(xAxis);chart.select(".y-axis").call(yAxis);var barGroup=chart.selectAll(".barGroup").data(data);barGroup.enter().append("g").attr("class","barGroup").attr("transform",function(d,i){return"translate("+xScale(d.key)+", 0)"}).on("mouseover",dispatch.customMouseOver);var bars=barGroup.selectAll(".bar").data(function(d){series=[];var y0=0;d3.map(d.values).values().forEach(function(d,i){series[i]={name:d.key,value:d.value,y0:y0,y1:y0+d.value};y0+=d.value});return series});if(groupType==="stacked"){var gapSize=xScale.rangeBand()/100*gap;var barW=xScale.rangeBand()-gapSize;bars.enter().append("rect").classed("bar",true).attr("class",function(d){return d.name+" bar"}).attr({width:barW,x:0,y:chartH,height:0}).attr("fill",function(d){return colorScale(d.name)});bars.transition().ease(transition.ease).duration(transition.duration).attr({width:barW,x:0,y:function(d){return yScale(d.y1)},height:function(d){return yScale(d.y0)-yScale(d.y1)}}).attr("fill",function(d){return colorScale(d.name)});bars.exit().transition().style({opacity:0}).remove()}else if(groupType==="clustered"){var x1=d3.scale.ordinal().rangeRoundBands([0,xScale.rangeBand()]).domain(categoryNames);bars.enter().append("rect").classed("bar",true).attr({width:x1.rangeBand(),x:function(d){return x1(d.name)},y:chartH,height:0}).attr("fill",function(d){return colorScale(d.name)});bars.transition().ease(transition.ease).duration(transition.duration).attr({width:x1.rangeBand(),x:function(d){return x1(d.name)},y:function(d){return yScale(d.value)},height:function(d){return chartH-yScale(d.value)}}).attr("fill",function(d){return colorScale(d.name)});bars.exit().transition().style({opacity:0}).remove()}})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;return this};my.yAxisLabel=function(_){if(!arguments.length)return yAxisLabel;yAxisLabel=_;return this};my.groupType=function(_){if(!arguments.length)return groupType;groupType=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.radialBarChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"bounce",duration:500};var classed="radialBarChart";var colors=d3.ez.colors.categorical(4);var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var capitalizeLabels=false;var colorLabels=false;var tickValues=[];var tickCircleValues=[];var domain=[];var numBars=undefined;var barScale=undefined;var keys=undefined;var labelRadius=0;var categoryTotals=[];var groupTotals=[];var maxValue=0;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){keys=d3.values(data)[1].map(function(d){return d.key});numBars=keys.length;labelRadius=radius*1.025;maxValue=d3.max(data.values,function(d){return d.value});tickCircleValues=[];for(var i=0;i<=maxValue;i++){tickCircleValues.push(i)}tickValues=tickCircleValues;tickValues.push(maxValue+1);domain=[0,maxValue+1];barScale=d3.scale.linear().domain(domain).range([0,radius]);colorScale=d3.scale.ordinal().range(colors).domain(keys)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("tickCircles",true);chart.append("g").classed("segments",true);chart.append("g").classed("spokes",true);chart.append("g").classed("axis",true);chart.append("circle").classed("outerCircle",true);chart.append("g").classed("labels",true)}else{chart=selection.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});tickCircles=chart.select(".tickCircles").selectAll("circle").data(tickCircleValues);tickCircles.enter().append("circle").style("fill","none");tickCircles.transition().attr("r",function(d){return barScale(d)}).ease(transition.ease).duration(transition.duration);tickCircles.exit().remove();var arc=d3.svg.arc().innerRadius(0).outerRadius(function(d,i){return barScale(d.value)}).startAngle(function(d,i){return i*2*Math.PI/numBars}).endAngle(function(d,i){return(i+1)*2*Math.PI/numBars});var segments=chart.select(".segments").selectAll("path").data(data.values);segments.enter().append("path").style("fill",function(d,i){if(!colors)return;return colors[i%colors.length]}).classed("segment",true).on("mouseover",dispatch.customMouseOver);segments.exit().remove();segments.transition().ease(transition.ease).duration(transition.duration).attr("d",arc);var spokes=chart.select(".spokes").selectAll("line").data(keys).enter().append("line").attr("y2",-radius).attr("transform",function(d,i){return"rotate("+i*360/numBars+")"});var axisScale=d3.scale.linear().domain(domain).range([0,-radius]);var axis=d3.svg.axis().scale(axisScale).orient("right");axis=chart.select(".axis").call(axis);outerCircle=chart.select(".outerCircle").attr("r",radius).style("fill","none");var labels=chart.select(".labels");labels.append("def").append("path").attr("id","label-path").attr("d","m0 "+-labelRadius+" a"+labelRadius+" "+labelRadius+" 0 1,1 -0.01 0");labels.selectAll("text").data(keys).enter().append("text").style("text-anchor","middle").style("fill",function(d,i){return colorLabels?colors[i%colors.length]:null}).append("textPath").attr("xlink:href","#label-path").attr("startOffset",function(d,i){return i*100/numBars+50/numBars+"%"}).text(function(d){return capitalizeLabels?d.toUpperCase():d})})}my.width=function(_){if(!arguments.length)return width;width=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.height=function(_){if(!arguments.length)return height;height=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.radius=function(_){if(!arguments.length)return radius;radius=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.capitalizeLabels=function(_){if(!arguments.length)return capitalizeLabels;capitalizeLabels=_;return this};my.colorLabels=function(_){if(!arguments.length)return colorLabels;colorLabels=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.circularHeatChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"bounce",duration:500};var classed="circularHeatChart";var colors=[d3.rgb(214,245,0),d3.rgb(255,166,0),d3.rgb(255,97,0),d3.rgb(200,65,65)];var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var innerRadius=50;var thresholds=undefined;var radialLabels=[];var numRadials=24;var segmentLabels=[];var numSegments=24;var segmentHeight=0;var maxValue=0;var colorScale=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){radialLabels=data.map(function(d){return d.key});numRadials=radialLabels.length;segmentLabels=d3.values(data[0].values).map(function(d){return d.key});numSegments=segmentLabels.length;segmentHeight=(radius-innerRadius)/numRadials;d3.map(data).values().forEach(function(d){d.values.forEach(function(d){maxValue=d.value>maxValue?d.value:maxValue})});if(!thresholds){thresholds=[Math.floor(maxValue*.25),Math.floor(maxValue*.5),Math.floor(maxValue*.75),Math.floor(maxValue+1)]}colorScale=d3.scale.threshold().domain(thresholds).range(colors)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("rings",true);chart.append("g").classed("radialLabels",true);chart.append("g").classed("segmentLabels",true)}else{chart=svg.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});var arc=d3.svg.arc().innerRadius(function(d,i){return innerRadius+d.ring*segmentHeight}).outerRadius(function(d,i){return innerRadius+segmentHeight+d.ring*segmentHeight}).startAngle(function(d,i){return i*2*Math.PI/numSegments}).endAngle(function(d,i){return(i+1)*2*Math.PI/numSegments});chart.select(".rings").selectAll("g").data(data).enter().append("g").classed("ring",true).on("mouseover",dispatch.customMouseOver);chart.selectAll(".ring").selectAll("path").data(function(d,i){for(j=0;j=0&&i<=4?"colLabel mono axis axis-workweek":"colLabel mono axis"});var rowLabels=chart.select(".y-axis").selectAll(".rowLabel").data(rowNames).enter().append("g").attr("transform",function(d,i){return"translate("+(i*gridSize+gridSize/2)+", -6)"}).append("text").text(function(d){return d}).style("text-anchor","start").attr("class",function(d,i){return i>=7&&i<=16?"rowLabel mono axis axis-worktime":"rowLabel mono axis"}).attr("transform",function(d){return"rotate(-90)"})})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.thresholds=function(_){if(!arguments.length)return thresholds;thresholds=_;return this};my.accessor=function(_){if(!arguments.length)return accessor;accessor=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.donutChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"cubic",duration:300};var classed="donutChart";var colors=d3.ez.colors.categorical(4);var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var innerRadius=70;var values=[];var categoryNames=[];var colorScale=undefined;var pie=undefined;var arc=undefined;var outerArc=undefined;var key=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){values=d3.values(data)[1].map(function(d){return d.value});categoryNames=d3.values(data)[1].map(function(d){return d.key});pie=d3.layout.pie().sort(null);arc=d3.svg.arc().innerRadius(innerRadius).outerRadius(radius);outerArc=d3.svg.arc().innerRadius(radius*.9).outerRadius(radius*.9);if(!colorScale){colorScale=d3.scale.ordinal().range(colors).domain(categoryNames)}}function key(d,i){return data.values[i].key}function arcTween(d){var i=d3.interpolate(this._current,d);this._current=i(0);return function(t){return arc(i(t))}}function midAngle(d){return d.startAngle+(d.endAngle-d.startAngle)/2}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").attr("class","slices");chart.append("g").attr("class","labels");chart.append("g").attr("class","lines")}else{chart=svg.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});var slices=chart.select(".slices").selectAll("path.slice").data(pie(values));slices.enter().append("path").attr("class","slice").attr("fill",function(d,i){return colorScale(data.values[i].key)}).attr("d",arc).each(function(d){this._current=d}).on("mouseover",dispatch.customMouseOver);slices.transition().ease(transition.ease).duration(transition.duration).attrTween("d",arcTween);slices.exit().remove();var labels=chart.select(".labels").selectAll("text.label").data(pie(values),key);labels.enter().append("text").attr("class","label").attr("dy",".35em");labels.transition().duration(transition.duration).text(function(d,i){return data.values[i].key}).attrTween("transform",function(d){this._current=this._current||d;var interpolate=d3.interpolate(this._current,d);this._current=interpolate(0);return function(t){var d2=interpolate(t);var pos=outerArc.centroid(d2);pos[0]=radius*(midAngle(d2) "+min:min+" - "+max;return rangeStr;break}var rangeIncrement=domainSize/rangeLength;var ranges=[];var range=[];var rangeStart=domainMin;var rangeEnd=domainMin+rangeIncrement;for(i=0;imaxValue?d.value:maxValue})});maxGroupTotal=d3.max(d3.values(groupTotals));xScale=d3.scale.ordinal().rangeRoundBands([0,chartW],.1).domain(groupNames);yScale=d3.scale.linear().range([chartH,0]).domain([0,groupType=="stacked"?maxGroupTotal:maxValue]);xAxis=d3.svg.axis().scale(xScale).orient("bottom");yAxis=d3.svg.axis().scale(yScale).orient("left");colorScale=d3.scale.ordinal().range(colors).domain(categoryNames)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("x-axis axis",true);chart.append("g").classed("y-axis axis",true).append("text").attr("transform","rotate(-90)").attr("y",-35).attr("dy",".71em").style("text-anchor","end").text(yAxisLabel)}else{chart=selection.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+margin.left+","+margin.top+")"});chart.select(".x-axis").attr({transform:"translate(0,"+chartH+")"}).call(xAxis);chart.select(".y-axis").call(yAxis);var barGroup=chart.selectAll(".barGroup").data(data);barGroup.enter().append("g").attr("class","barGroup").attr("transform",function(d,i){return"translate("+xScale(d.key)+", 0)"}).on("mouseover",dispatch.customMouseOver);var bars=barGroup.selectAll(".bar").data(function(d){series=[];var y0=0;d3.map(d.values).values().forEach(function(d,i){series[i]={name:d.key,value:d.value,y0:y0,y1:y0+d.value};y0+=d.value});return series});if(groupType==="stacked"){var gapSize=xScale.rangeBand()/100*gap;var barW=xScale.rangeBand()-gapSize;bars.enter().append("rect").classed("bar",true).attr("class",function(d){return d.name+" bar"}).attr({width:barW,x:0,y:chartH,height:0}).attr("fill",function(d){return colorScale(d.name)});bars.transition().ease(transition.ease).duration(transition.duration).attr({width:barW,x:0,y:function(d){return yScale(d.y1)},height:function(d){return yScale(d.y0)-yScale(d.y1)}}).attr("fill",function(d){return colorScale(d.name)});bars.exit().transition().style({opacity:0}).remove()}else if(groupType==="clustered"){var x1=d3.scale.ordinal().rangeRoundBands([0,xScale.rangeBand()]).domain(categoryNames);bars.enter().append("rect").classed("bar",true).attr({width:x1.rangeBand(),x:function(d){return x1(d.name)},y:chartH,height:0}).attr("fill",function(d){return colorScale(d.name)});bars.transition().ease(transition.ease).duration(transition.duration).attr({width:x1.rangeBand(),x:function(d){return x1(d.name)},y:function(d){return yScale(d.value)},height:function(d){return chartH-yScale(d.value)}}).attr("fill",function(d){return colorScale(d.name)});bars.exit().transition().style({opacity:0}).remove()}})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;return this};my.yAxisLabel=function(_){if(!arguments.length)return yAxisLabel;yAxisLabel=_;return this};my.groupType=function(_){if(!arguments.length)return groupType;groupType=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.radialBarChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"bounce",duration:500};var classed="radialBarChart";var colors=d3.ez.colors.categorical(4);var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var capitalizeLabels=false;var colorLabels=false;var tickValues=[];var tickCircleValues=[];var domain=[];var numBars=undefined;var barScale=undefined;var keys=undefined;var labelRadius=0;var categoryTotals=[];var groupTotals=[];var maxValue=0;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){keys=d3.values(data)[1].map(function(d){return d.key});numBars=keys.length;labelRadius=radius*1.025;maxValue=d3.max(data.values,function(d){return d.value});tickCircleValues=[];for(var i=0;i<=maxValue;i++){tickCircleValues.push(i)}tickValues=tickCircleValues;tickValues.push(maxValue+1);domain=[0,maxValue+1];barScale=d3.scale.linear().domain(domain).range([0,radius]);colorScale=d3.scale.ordinal().range(colors).domain(keys)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("tickCircles",true);chart.append("g").classed("segments",true);chart.append("g").classed("spokes",true);chart.append("g").classed("axis",true);chart.append("circle").classed("outerCircle",true);chart.append("g").classed("labels",true)}else{chart=selection.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});tickCircles=chart.select(".tickCircles").selectAll("circle").data(tickCircleValues);tickCircles.enter().append("circle").style("fill","none");tickCircles.transition().attr("r",function(d){return barScale(d)}).ease(transition.ease).duration(transition.duration);tickCircles.exit().remove();var arc=d3.svg.arc().innerRadius(0).outerRadius(function(d,i){return barScale(d.value)}).startAngle(function(d,i){return i*2*Math.PI/numBars}).endAngle(function(d,i){return(i+1)*2*Math.PI/numBars});var segments=chart.select(".segments").selectAll("path").data(data.values);segments.enter().append("path").style("fill",function(d,i){if(!colors)return;return colors[i%colors.length]}).classed("segment",true).on("mouseover",dispatch.customMouseOver);segments.exit().remove();segments.transition().ease(transition.ease).duration(transition.duration).attr("d",arc);var spokes=chart.select(".spokes").selectAll("line").data(keys).enter().append("line").attr("y2",-radius).attr("transform",function(d,i){return"rotate("+i*360/numBars+")"});var axisScale=d3.scale.linear().domain(domain).range([0,-radius]);var axis=d3.svg.axis().scale(axisScale).orient("right");axis=chart.select(".axis").call(axis);outerCircle=chart.select(".outerCircle").attr("r",radius).style("fill","none");var labels=chart.select(".labels");labels.append("def").append("path").attr("id","label-path").attr("d","m0 "+-labelRadius+" a"+labelRadius+" "+labelRadius+" 0 1,1 -0.01 0");labels.selectAll("text").data(keys).enter().append("text").style("text-anchor","middle").style("fill",function(d,i){return colorLabels?colors[i%colors.length]:null}).append("textPath").attr("xlink:href","#label-path").attr("startOffset",function(d,i){return i*100/numBars+50/numBars+"%"}).text(function(d){return capitalizeLabels?d.toUpperCase():d})})}my.width=function(_){if(!arguments.length)return width;width=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.height=function(_){if(!arguments.length)return height;height=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;return this};my.radius=function(_){if(!arguments.length)return radius;radius=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.capitalizeLabels=function(_){if(!arguments.length)return capitalizeLabels;capitalizeLabels=_;return this};my.colorLabels=function(_){if(!arguments.length)return colorLabels;colorLabels=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.circularHeatChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"bounce",duration:500};var classed="circularHeatChart";var colors=[d3.rgb(214,245,0),d3.rgb(255,166,0),d3.rgb(255,97,0),d3.rgb(200,65,65)];var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var innerRadius=50;var thresholds=undefined;var radialLabels=[];var numRadials=24;var segmentLabels=[];var numSegments=24;var segmentHeight=0;var maxValue=0;var colorScale=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){radialLabels=data.map(function(d){return d.key});numRadials=radialLabels.length;segmentLabels=d3.values(data[0].values).map(function(d){return d.key});numSegments=segmentLabels.length;segmentHeight=(radius-innerRadius)/numRadials;d3.map(data).values().forEach(function(d){d.values.forEach(function(d){maxValue=d.value>maxValue?d.value:maxValue})});if(!thresholds){thresholds=[Math.floor(maxValue*.25),Math.floor(maxValue*.5),Math.floor(maxValue*.75),Math.floor(maxValue+1)]}colorScale=d3.scale.threshold().domain(thresholds).range(colors)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("rings",true);chart.append("g").classed("radialLabels",true);chart.append("g").classed("segmentLabels",true)}else{chart=svg.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});var arc=d3.svg.arc().innerRadius(function(d,i){return innerRadius+d.ring*segmentHeight}).outerRadius(function(d,i){return innerRadius+segmentHeight+d.ring*segmentHeight}).startAngle(function(d,i){return i*2*Math.PI/numSegments}).endAngle(function(d,i){return(i+1)*2*Math.PI/numSegments});chart.select(".rings").selectAll("g").data(data).enter().append("g").classed("ring",true).on("mouseover",dispatch.customMouseOver);chart.selectAll(".ring").selectAll("path").data(function(d,i){for(j=0;j=0&&i<=4?"colLabel mono axis axis-workweek":"colLabel mono axis"});var rowLabels=chart.select(".y-axis").selectAll(".rowLabel").data(rowNames).enter().append("g").attr("transform",function(d,i){return"translate("+(i*gridSize+gridSize/2)+", -6)"}).append("text").text(function(d){return d}).style("text-anchor","start").attr("class",function(d,i){return i>=7&&i<=16?"rowLabel mono axis axis-worktime":"rowLabel mono axis"}).attr("transform",function(d){return"rotate(-90)"})})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.thresholds=function(_){if(!arguments.length)return thresholds;thresholds=_;return this};my.accessor=function(_){if(!arguments.length)return accessor;accessor=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.donutChart=function module(){var svg;var chart;var width=400;var height=300;var margin={top:20,right:20,bottom:20,left:20};var transition={ease:"cubic",duration:300};var classed="donutChart";var colors=d3.ez.colors.categorical(4);var radius=d3.min([width-(margin.right+margin.left),height-(margin.top+margin.bottom)])/2;var innerRadius=70;var values=[];var categoryNames=[];var colorScale=undefined;var pie=undefined;var arc=undefined;var outerArc=undefined;var key=undefined;var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){values=d3.values(data)[1].map(function(d){return d.value});categoryNames=d3.values(data)[1].map(function(d){return d.key});pie=d3.layout.pie().sort(null);arc=d3.svg.arc().innerRadius(innerRadius).outerRadius(radius);outerArc=d3.svg.arc().innerRadius(radius*.9).outerRadius(radius*.9);if(!colorScale){colorScale=d3.scale.ordinal().range(colors).domain(categoryNames)}}function key(d,i){return data.values[i].key}function arcTween(d){var i=d3.interpolate(this._current,d);this._current=i(0);return function(t){return arc(i(t))}}function midAngle(d){return d.startAngle+(d.endAngle-d.startAngle)/2}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").attr("class","slices");chart.append("g").attr("class","labels");chart.append("g").attr("class","lines")}else{chart=svg.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+(width-margin.right+margin.left)/2+","+(height-margin.bottom+margin.top)/2+")"});var slices=chart.select(".slices").selectAll("path.slice").data(pie(values));slices.enter().append("path").attr("class","slice").attr("fill",function(d,i){return colorScale(data.values[i].key)}).attr("d",arc).each(function(d){this._current=d}).on("mouseover",dispatch.customMouseOver);slices.transition().ease(transition.ease).duration(transition.duration).attrTween("d",arcTween);slices.exit().remove();var labels=chart.select(".labels").selectAll("text.label").data(pie(values),key);labels.enter().append("text").attr("class","label").attr("dy",".35em");labels.transition().duration(transition.duration).text(function(d,i){return data.values[i].key}).attrTween("transform",function(d){this._current=this._current||d;var interpolate=d3.interpolate(this._current,d);this._current=interpolate(0);return function(t){var d2=interpolate(t);var pos=outerArc.centroid(d2);pos[0]=radius*(midAngle(d2)maxValue?value:maxValue})});dateDomain=d3.extent(data[0].values,function(d){return d.key});xScale=d3.time.scale().range([0,chartW]).domain(dateDomain);yScale=d3.scale.linear().range([chartH,0]).domain([minValue,maxValue+10]);xAxis=d3.svg.axis().scale(xScale).orient("bottom").tickFormat(d3.time.format("%d-%b"));yAxis=d3.svg.axis().scale(yScale).orient("left");colorScale=d3.scale.ordinal().range(colors).domain(seriesNames)}function my(selection){selection.each(function(data){init(data);if(!svg){svg=function(selection){var el=selection[0][0];if(!!el.ownerSVGElement||el.tagName==="svg"){return selection}else{return selection.append("svg")}}(d3.select(this));svg.classed("d3ez",true).attr({width:width,height:height});chart=svg.append("g").classed("chart",true);chart.append("g").classed("x-axis axis",true);chart.append("g").classed("y-axis axis",true).append("text").attr("transform","rotate(-90)").attr("y",-35).attr("dy",".71em").style("text-anchor","end").text(yAxisLabel)}else{chart=selection.select(".chart")}chart.classed(classed,true).attr({width:width,height:height}).attr({transform:"translate("+margin.left+","+margin.top+")"});chart.select(".x-axis").attr("transform","translate(0,"+chartH+")").call(xAxis).selectAll("text").style("text-anchor","end").attr("dx","-.8em").attr("dy",".15em").attr("transform","rotate(-65)");chart.select(".y-axis").call(yAxis);var series=chart.selectAll(".series").data(data).enter().append("g").attr("class","series");line=d3.svg.line().x(function(d){return xScale(d.key)}).y(function(d){return yScale(d.value)});series.append("path").attr("class","line").attr("d",function(d){return line(d.values)}).style("stroke",function(d){return colorScale(d.key)});series.selectAll("circle").data(function(d){return d.values}).enter().append("circle").attr("r",3).attr("cx",function(d){return xScale(d.key)}).attr("cy",function(d){return yScale(d.value)}).style("fill",function(d,i,j){return colorScale(data[j].key)}).on("mouseover",dispatch.customMouseOver)})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.margin=function(_){if(!arguments.length)return margin;margin=_;return this};my.yAxisLabel=function(_){if(!arguments.length)return yAxisLabel;yAxisLabel=_;return this};my.groupType=function(_){if(!arguments.length)return groupType;groupType=_;return this};my.transition=function(_){if(!arguments.length)return transition;transition=_;return this};my.colors=function(_){if(!arguments.length)return colors;colors=_;return this};my.colorScale=function(_){if(!arguments.length)return colorScale;colorScale=_;return this};my.dispatch=function(_){if(!arguments.length)return dispatch();dispatch=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.htmlTable=function module(){var tableEl;var classed="htmlTable";var width=800;var rowNames=undefined;var columnNames=[];var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function init(data){rowNames=data.map(function(d){return d.key});columnNames=[];data.map(function(d){return d.values})[0].forEach(function(d,i){columnNames[i]=d.key})}function my(selection){selection.each(function(data){init(data);if(!tableEl){tableEl=d3.select(this).append("table").classed("d3ez",true).classed(classed,true).attr("width",width)}else{tableEl.selectAll("*").remove()}var head=tableEl.append("thead");var foot=tableEl.append("tfoot");var body=tableEl.append("tbody");hdr=head.append("tr");hdr.selectAll("th").data(function(){return[""].concat(columnNames)}).enter().append("th").html(function(d){return d});rows=body.selectAll("tr").data(data).enter().append("tr").attr("class",function(d){return d.key}).on("mouseover",dispatch.customMouseOver);rows.append("th").html(function(d){return d.key});rows.selectAll("td").data(function(d){return d.values}).enter().append("td").attr("class",function(d){return d.key}).html(function(d){return d.value})})}my.width=function(_){if(!arguments.length)return width;width=_;return this};my.classed=function(_){if(!arguments.length)return classed;classed=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.htmlList=function module(){var listEl;var classed="htmlList";var dispatch=d3.dispatch("customMouseOver","customMouseOut","customClick");function my(selection){selection.each(function(data){if(!listEl){listEl=d3.select(this).append("ul").classed("d3ez",true).classed(classed,true)}else{listEl.selectAll("*").remove()}listEl.selectAll("li").data(data).enter().append("li").text(function(d){return d.key}).on("click",expand);function expand(d){d3.event.stopPropagation();dispatch.customMouseOver(d);if(typeof d.values==="undefined"){return 0}var ul=d3.select(this).on("click",collapse).append("ul");var li=ul.selectAll("li").data(d.values).enter().append("li").text(function(d){if(typeof d.value!=="undefined"){return d.key+" : "+d.value}else{return d.key}}).on("click",expand)}function collapse(d){d3.event.stopPropagation();d3.select(this).on("click",expand).selectAll("*").remove()}})}my.classed=function(_){if(!arguments.length)return classed;classed=_;return this};d3.rebind(my,dispatch,"on");return my};d3.ez.title=function module(){var mainText="Title";var subText="Sub Title";var height=40;var width=200;function my(selection){selection.selectAll("#titleGroup").data([0]).enter().append("g").attr("id","titleGroup");var titleGroup=selection.select("#titleGroup");titleGroup.selectAll(".title").data([mainText]).enter().append("text").classed("title",true).text(function(d){return d});var title=titleGroup.select(".title").text(mainText);titleGroup.selectAll(".subTitle").data([subText]).enter().append("text").classed("subTitle",true).text(function(d){return d});var subTitle=titleGroup.select(".subTitle").text(subText);var titleOffset=1-title.node().getBBox().width/2;var subTitleOffset=1-subTitle.node().getComputedTextLength()/2;title.attr({transform:"translate("+titleOffset+", "+15+")"});subTitle.attr({transform:"translate("+subTitleOffset+", "+30+")"})}my.mainText=function(_){if(!arguments.length)return mainText;mainText=_;return this};my.subText=function(_){if(!arguments.length)return subText;subText=_;return this};my.height=function(_){if(!arguments.length)return height;height=_;return this};my.width=function(_){if(!arguments.length)return width;width=_;return this};return my};d3.ez.creditTag=function module(){var text="d3ez.org";var href="http://d3ez.org";function my(){var creditTag=this.selectAll("#creditTag").data([0]).enter().append("g").attr("id","creditTag");var creditText=creditTag.append("text").text(text).attr({"xlink:href":href}).on("click",function(){window.open(href)});var xPos=0-d3.select("#creditTag").selectAll("text").node().getBBox().width;creditText.attr({transform:"translate("+xPos+", 0)"})}my.text=function(_){if(!arguments.length)return text;text=_;return this};my.href=function(_){if(!arguments.length)return href;href=_;return this};return my};d3.ez.labeledNode=function module(){var color="steelblue";var opacity=1;var strokeColor="#000000";var strokeWidth=0;var radius=8;var label=null;var fontSize=10;function my(d,i){var r=sizeAccessor(d);var node=d3.select(this).attr("class","node");node.append("circle").attr("fill-opacity",opacity).attr("r",r).style("stroke",strokeColor).style("stroke-width",strokeWidth).style("fill",color);node.append("text").text(label).attr("dx",r+2).attr("dy",r+6).style("text-anchor","start").style("font-size",fontSize+"px").attr("class","nodetext")}my.color=function(_){if(!arguments.length)return color;color=_;return this};my.opacity=function(_){if(!arguments.length)return opacity;opacity=_;return this};my.radius=function(_){if(!arguments.length)return radius;radius=_;return this};my.label=function(_){if(!arguments.length)return label;label=_;return this};my.fontSize=function(_){if(!arguments.length)return fontSize;fontSize=_;return this};my.stroke=function(_width,_color){if(!arguments.length)return strokeWidth+", "+strokeColor;strokeWidth=_width;strokeColor=_color;return this};function sizeAccessor(_){return typeof radius==="function"?radius(_):radius}return my};d3.ez.colors={categorical:function(scheme){switch(scheme){case 1:return["#5da5da","#faa43a","#60bd68","#f17cb0","#b2912f","#b276b2","#decf3f","#f15854","#4d4d4d"];case 2:return["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"];case 3:return["#3f51b5","#ff9800","#8bc34a","#9c27b0","#ffeb3b","#03a9f4","#f44336","#009688","#795548"];case 4:return d3.ez.colors.lumShift(d3.ez.colors.lumShift(d3.ez.colors.categorical(3),-.8),5.5)}},diverging:function(scheme){switch(scheme){case 1:return["#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e"];case 2:return["#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850"];case 3:return["#0000ff","#8052fe","#b58bfb","#ddc5f7","#fffff0","#ffcfb4","#ff9e7a","#ff6842","#ff0000"]}},sequential:function(origHex,count){var lumStep=.1;var lumMax=lumStep*count/2;var lumMin=0-lumMax;var lumScale=d3.scale.linear().domain([1,count]).range([lumMin,lumMax]);var result=[];for(var i=1;i<=count;i++){lum=lumScale(i);origHex=String(origHex).replace(/[^0-9a-f]/gi,"");if(origHex.length<6){origHex=origHex[0]+origHex[0]+origHex[1]+origHex[1]+origHex[2]+origHex[2]}var newHex="#";var c;for(var j=0;j<3;j++){c=parseInt(origHex.substr(j*2,2),16);c=Math.round(Math.min(Math.max(0,c+c*lum),255)).toString(16);newHex+=("00"+c).substr(c.length)}result.push(newHex)}return result},lumShift:function(colors,lum){var result=[];colors.forEach(function addNumber(origHex,index){origHex=String(origHex).replace(/[^0-9a-f]/gi,"");if(origHex.length<6){origHex=origHex[0]+origHex[0]+origHex[1]+origHex[1]+origHex[2]+origHex[2]}lum=lum||0;var newHex="#",c,i;for(i=0;i<3;i++){c=parseInt(origHex.substr(i*2,2),16);c=Math.round(Math.min(Math.max(0,c+c*lum),255)).toString(16);newHex+=("00"+c).substr(c.length)}result[index]=newHex});return result}};d3.ez.legend=function module(){var sizeScale=undefined;var sizeLabel=null;var colorScale=undefined;var colorLabel=null;var title=null;var width=100;var height=150;var opacity=.7;var fill="#ffffff";var stroke="#000000";var strokewidth="1px";var spacing=5;function my(){height=height?height:this.attr("height");width=width?width:this.attr("width");var legendBox=this.selectAll("#legendBox").data([0]).enter().append("g").attr("id","legendBox");legendBox.append("rect").attr("width",width).attr("height",height).attr("fill-opacity",opacity).attr("fill",fill).attr("stroke-width",strokewidth).attr("stroke",stroke);legendTitle=legendBox.append("g").attr("transform","translate(5, 15)");legendTitle.append("text").style("font-weight","bold").text(title);var y=10;if(typeof sizeScale!=="undefined"){min=d3.min(sizeScale.range());max=d3.max(sizeScale.range());diff=max-min;step=diff/4;var range=[];range[0]=min;for(var s=1;s<5;s++){range[s]=range[s-1]+step}sizeScale.range(range);numElements=sizeScale.range().length;elementHeight=(height-45)/numElements;sizeKey=legendBox.append("g").attr("transform","translate(5, 20)");for(var index=0;index "+min:min+" - "+max;return rangeStr;break}var rangeIncrement=domainSize/rangeLength;var ranges=[];var range=[];var rangeStart=domainMin;var rangeEnd=domainMin+rangeIncrement;for(i=0;ilXKoboNJ2O}!C;s1WRrO=~H83E_mVY*ohoGO;)z#J2Rn^tI zj~;!&9%5rx48~*;UT>Ng2f=Qe#I@72) zqgumsw#ee~dBI+)Z_Sr2w%6@FvD%{YNj!|EdBnbZ`{u(wr0jkX?suZ!*$MmKFBp72 zK*2bj9 z>4zW(c&9}WPZ7P%x9M!21Vt3G!Gb-UEFP+MS{xri#((k;<7eu}klJ`An|>9If_YM~ zpJrGG8hn{fNAY-`1%o7FAL4-JQBgowWpkHtSeygEhuv=3?0G~;J7EWU>Lkd<@l;I? zeu{K<%zFJDl^`&$Ck@h~NGE1m5{;-7C498U^9%IRKkC}auOWHgNXChIpUxm%Pfdb6 z2Na&LMt`^;{ob(3Lpsj=2v8oDSxGdGrlCKth>IlhXAQF`jEncd7_#~NtCVJ|EEY!j zFpFtY5G)O(#n)GH{w5eiiIxE~`7%w?Ij$1f5&X{H4Few_IPq~l3yR@6YYyi*V4FoB zqG_Q`b0`ZCobp$*!HfTp&hzLeSZ$3RW+csvGJoYItdfg{7?q;$cp4YYFerkSMi%8X za`I}kCMTW_PCR=oNU1~AB3dl#;XDfpEGq(~mGwADX%ztl-vc0gsg}**uX3>RORGar zH3gKd4)09-e(h=Y4N-?mjz_G?2}U0@r)x|V?f3d!)%ISutF>DKCm_+jw_wmlGcB#+ zM}G&j_eh)uWJInuVA@ildB;dLX#p|bNIOMvIrP3 zF==RU0;`BM0jn^UFolg{niedAC0no{fq#L z3PK&e1~1VN09Lh7Q5WfIkX~(8o3D+Hs}l`xT$|HyW%Z9hGqC-;Gi4xD%zvXJkbh`5 zVw2?GXCabgaURKb!Wak>C8PWcx0fnv5tJgho=Yo|P6Qh?VXCCTA`7PZD9vDlZ_sy? zUz&}QR|}5c*wNBBGjFsSRwvGC{5lLRp016v#G@prRtGROpYWxr)_S87LD~85Ft1&W<=-?Yc$$yGBSm{kE zm+p1TnQAJbQ>0d{d@0E25|AORkN_`EUL>@9$B$j?OZJX`qhgaqM;^bFxbmw$dn8T( z%bcSek^{L;$HjSzWl=HDrhE=c5M)!omPw)@N*d4fqZV|mj(D5&%qy4usK)B`Eze<_ zbWL@&6N6}~UdQT`w@J^ua(~&6YOG%0@)WsA*HrhJQCP6kUpWKKi!7dw9rlUR_(%v2 zNfN=q9)yP(KOP5cmIQE|=T%V+0q4I01>GWrOb%{3_zhND$7oazgr9fmSF_cbKwIxo zuK%^w$>#(5+R#NCuWTgS(op!Z4l<2n^ClQA8z_4=8m%#@fPgF-#D5?pP8K`rgbn9q z+{kzlQFXF-rYn@-v<^H3M7kGnG8f{FqgW!1%i^V=Z;tFxRD^nz(QIK!{D^($0FId| zN$ffMdK$68n6UM~Q9vrMK??YbK%fl;w?f5CxBIcIMEiZ-#G?ytw!j68Xq;w?UKb`F z8XSxL_mOtGX*{5%d4HZJVU#t>wlo2)Y#+I*7%R0Sm1*{PYbw^L==Jn!C6~FLTJ6BA zR@<+mR@>`3YBfDcs@3!~u2wtf>QqV^EH&#!Hx>b?^pX&O4(zsc^_n$3x~h#xrqqhj zPf0j2OnCD^(~pe%Q}&Cc3dFS6W`EiwxcWzs%pp|eo+}wey7}091Wk~=pira3V;N?MNBpzy))=>)~wOVMYQmD0WK<7h1%tAD?a3CRlYS`aX5N8A=SHC78+_>scavpU2y2r@#v zT7O?gA#s*@7yphsHy2g-ZjG`PoK<&OuiJ%VFBE#_)P%Nw@mFihR=t&SYqt5^LWZ1I zO|-Q}g|(eY&7ci6H8i!2WfHNDL!up61lVxHMyP0U6emgD1~p3qwQY01Rjdk8>N2XU zW3Bfc7FTV}0*EUe02rN|;a#@pF*>;2Eq^3StY(>AdsqNjV}b{-l%K`qIjv(I(|q%3 zEC4*?H_H_I4P+rs_+~bGfp(1!mvS4vF0Vj>Zkf}` znV}0qItzwzvG7n*7EOSLbVrY^tzsQpg;Zp1WUQddnqojUwnpFb9Jq1+)PMzpY=5+- z=|Wc@Ze+hu4V3*Ejn;!hQ(bKWh0=9tYe8%BHZ}g=W$Antg=;JP$GqMr*7sAd?-w(W zy7D3zUPN5fx^eZsHM*^K|4wQ5t=YL5<-VgApU#s+D=R4v0T?DA>qHq)-zPB)P~TEz z>r=chF%ihT_i(sL>`Xo=Uyk1v0e`9AsVWtwgAGj*e@c^su1IJb7Kdd92Tj$`Hth|D z`kH1+`15lbU_>CQj6qg(61%SMzlsoPaj($F_zZ`( z)L7v`6JHU|sGNnOkm${Emk^<0pOC=)0EO+P(>p`&*g# zTqPc>#A=O={@rG$(%z?xavGE^lWNyCv8^_yNpnrf7V6p8e0DU$=%#I*W$N}CS0PMA9AnMcvD7rQ=G^79 zQkyM!rZw%hz8+eFsu=rVKLseTJ5~yhuuV+}*Fcx-@ zEGn$49DOx}4ZrmcKYv%ptb$6G7%=hUH)84#)wB6(V>Rr)IBcH<&69Sk_D}p=4~whE zui-$M5Es2FQFZxzY}i}3rQ0v7JHI2dy^fU>KNXfzF#y+EN*P=(^zfrnM_t8{u6k>z z3Oty{(Na3U>gljlQv6z!cGat%WkU9r3DsjlcYkYgHsdx`?h#A++K9c? zcg&!k?+6in65i%0O}Bm_HTqU|-A(%Dm30-hXslk}cjERVz@b}fHvvP{w+%hK$@}G; zvUL=?&kj022Voo}Yy0P9RIPN+d3J+dG8B4_LJb_Vw-GR0;K%6&6H$_aX*@yK2Qv5$ z)6V>2SM#hf;eXmX*3@yV+51$EHRj}O>{o-$%th%5Spn@kmOS*Kp|fr6)Vop%$Bxn$ zmwUL(;vz`m-=jDD_5sjT0EZ$AdSB*-emg}xydXoR?KOiLFXL>OMBZ$ETCx(S^T`XY zKlJ#wfULE|XXYYWRMeyU20zPb@Z2W8wmZ<>^R5Ai5Py;Cx4_OVTyZU@4Eqp!#WNic zf%=qR$;7J%{ANtKu#E{43+55)b-H_fqa`sNKLl4hEGmYYV0Mewgt1@1JL9y>evYT( z67(fRPLq^otckN96S2UbuTDz82o^tnY(r!>*qP1q^JZKX#n0)#8K%>R1-qE0mxS&x z9*v?b0)G|=gN40o@w{aKufVojdgdv{fl=6g%z7rCUeTH^Ijvga#&u(;#?Fj-rt^Td z&MPl4^FO7(1+*{d#&VaqIrju4?>p|5a4Vq@w~h!~M}*BB5lWV_nIl3Tjp+cgS>;)J zv0=aKcuovye0uG44#F}Y_C~$)&2iJK$bWjzhkvH!PwbPfjfi+n+n1Qj)`r7`s^MP@W=1A%UjgKnu8`Rf zT7QbCP?$@n&2Fnh%Uk@c>!nc+-mB04h%*5+@bz>IW$HE>gNVEb|NRgY=bg9T1BD7v z+{N!ST(9Y7OtM|w4jdf6ZN*Qh@mr5{~qZ=y1)0q8Ld=)36Gk<4R>}^g-02_Mel!IQj0#vD+v3xZ`01(!R zhX!c>btjyXJ=4v%Yh$ue=$DgC(zi38qJ;1^+(UOmehj#lPnB?G#LWR0+5Ta-qxcK#ob;r`v5h=Uc5>U*1uK33kuzRnH-o<4n7Rjv$3$wxtWJeAX0^jp6&Z%n zsNpaf4q%K6gv)eoBZJZ>U4~TF)-@pLITT>3o#;#JvffUQwY!~ek98}c)K-*m-(9kz zLRW^{%WR%*4^w;`Ny#{W}aadx0+U`>u>s0kX+Rd1cS2wzlJYXUF##x;DXz)r^K4w}Uli>UuzxEq_>ZwI(R{ z*U*n*-aG-h>~$0rYuWmTq9#_nW9EJbw5`SePFeh&`SBV3Pl>3C>Cbf z{kdxoX6zl58A4rARq0)+K7aDmdM)X5bzJd#6*|L0tA^kVVE-bzuB@_qM zth3h#Hdc|hBjy?VD zj8o$Yi(Q86?sb)6?D%w7S?EpU^7TTJ2g6~M=O7wN?+e%cqJPR3?@aUGr}4i*wv0oN zg@KC)1+j9p_%MW=!O4*e)pK4DjvqM|fs}v^NUOpwg9T1ln3BHixx>8T&>Mb4*G@Dj z2B3Wg5-^HOGF67oJb>mq-JVmA-zp<6!UA09PF>h_-&EL1jSab`H=AlsA1Ak^(n`?V zbSY(((Y3z0zklq8%!+9C4{;Z2(^rRBO4?l61tATWioxHBEq3-=%Q?CZ;shbdBoEEu z2m;ec0bW?!$Qq`3nHBIXX*Ju*^MEu(Gixq7hfWZmS; z64I@yVrA(fCAT%BTI!j*iX4K_lrN8*-QR82Z4$~FX|}HGL{Qs5fCOW)7wX4$qj9s*k4go)^(@$W z7HmBWZp*X4w8LxyfYw6UquK1%$>F{^IrzBs8c@jUWnWr@|LGnC?}Nc+4g>|ScuW2R z(igz)<$wOU0vvi>0S@c90vx!m00$mdfP>HXs)jv1pV$-NmMrkFzxp4t@T7u>`Z7&& zC-LX>(n=g>aVVlWnkIGM6C7E3>3x~wUK!x)JSd@!|E3J|Vm@Tc?p^yw{OkMkh>g-D zNiR`RH;4EVt)woJ|-n6m8J;S3s!)?6i;=8;RCsm@y3u}Xvx*Uw@t zJXDE58>f;n?I<|Ttmipaxz-?oeegxk_(VQ8AGFvORTnhC3zK49XB8#4mlVmztrMjU zj`qed*ipU6bk1~)40Mhfl9I%6j3V918h`FnT1isD zcni)8FUpNIr$SWpqW$V?>Gk}CR?Ge+5R&y3aX}a2*D%-mUSX*qu4REdgx0Le?62Nq zGB}JVFS(55gq7CvYgnPRHPF>*bsb}QCFw7FJIwPoS-AzY4{6_1j9&ShR=@YM3e3Nq zurB-ZOCH3=k3O6F-_rrE`16kRmfv9HjI4M%8Ct0sKmn{ZiPx$Fo= z_U#fo2oeE;nC_u(r4a6X8KUi1C_ zQuBQ|FZU#Fzv-#<giVS|w%9BBtpuVokMf2`GF!L)sZXPy& zNnCk*LT({8Kc6>fIDZKiFe4rKjnM&9;IJ5BO)I(L!km7G-nif zdFpG8XOvBr;Wv3SLyy^IB-{uT8J`EaVJR6z(Ui@IKiHMY#;#fClwq!89?5U&Nqd?k zO%_))2-E1CK;#^kp-xZZvvR_%768@n;ect;ihO?nfR6FhH-Ag%poUw0=hxvp%V3Sc z)~+_GbC?uiRvEEz;$z6w$L$4s5{r9=D4)~f1{lv=MUtOTd#_WJ!DzJC9X=)_2+lL{q!E};ps zvhO_e45^(&@qa`Zo$SkBRDbzpVUvbc@+L8Ag+0L8blr=?);;BDwYQPIx4Np!P2+!a z9NkDnXodsMLWA z_pBCeOQBwPmLj3ab4iCD=SbtQ8SYh7f(jr9G3_O?W+|cWp(mz{WbvH!I(zJxwc$@i zV}1h(!sPKWz|Ti#-pQ09C*H7UY^T0@>ZMk)YUYG32(2?{H>@!celD|u0n$c^$4YMh zd4rOU%YP0r)x!^#4m_BjE~w_gYRj4YL>?Q{iZFY z-a3=&Jni2It2)Ik-+*Ap57-Vt?Kv>6S~;93s}{~3wN&1fYs%ZJ=e0(U`+4I)C@IG@9RLW1NAoqnVI_mq@d-mKa=# z#NN{~6^`=XCFvkYxXMAQ?QYyqtp@q0vQvBRnIGM)kn?I@Y&$h(=0y}G1CZ;r%sl=* zT4Jfi>{q^*)fM?cdhbX}m$b@GbbB=F7J`D_y{2`-e>WRl_{iml%{< zn}1)Jd6yj1UNhsp^$nW7`kKF2=E2+55}dBGj>FN5qr6PY(n~$0+ubv5D=b@jWV#(< zYL%avm2ettT{6l)mSVZAg%bRn$4R6+3Gq}tN?u?r#JmF^RhqmClEnL(y1?v9SZrEU ze_C#+JzIU-Q*T&(mv?kS|67u>!^e-^BYz4Xp3l1ix$aegZ|M2m-K z&x}@=d2HDE@6#ekd**{tHOZKl8zo=R&cdnK=3wYfFxC_D0Fyin9Y{EHz{C`ob z)UzGd^LJ}JH7Qw~?>)#X>oG{aP|?pC*oOUjgB0k@bzJ{OuJf$r4Pw8198-i)ArM-f z0r4wTb?sO=VUS&5x_UzMmOKO~sy+qT$YXL*NC&?`13T<83ucsuH?=(1vQU~9j|NS1 z*h7Z}hyZ^%IbmO8(H7^N6mkZ?SbsW~t#88CH{n0gH=+K;=s1 zanEiC1?~;BwLt9>U_u1&0maX_w9i=pQfPBz9a?yE;;AAUN>zAsiV&-a*r(sQtpuIe7B<=0quvR@qa^+yp#<} zTZaCkLwbi9MUAm;pBl>Nnbo~-14r(?v!VH(^AHX2V)omboQE$6v|&acX=#tk@2dJ$ z9aj%+Ca#35$7usZ(}oW(%E@E3!BuNl%~!LW>t&5A3mho~-px|&5$0OgS+%}(7nT*B zZ|G_wiGbqXTNI#&WUev)hJRPa^(Oxo=f3J4Y~eMM!YT`BbDzn5h|CWeUBH6;#t0i>B%!Nf&ZA>0H$>d()e&2ZUqM*aQ-@k+NT> z@&9yV><{y#h=B!WF@KyD(D`kx8^IH-%`0Qw_3j2gy9G0<51>DlMYZP5-~AeqyEQAQ z53Orm+}+nqk_%J~aBs^KhSwa+tT6^{evbix@wM*+&NxvPNz>~s+AG(My$z`pUz#jC z>l-W=OY)Z3Ko`|ncP%_O^!XFUSyuCrtFBPauNXvJ#L}2`mw&9ID?^Frv@&iqnmCtN z0p$g@C!$T4A!&hF*)Eb{xnKA#te#VLb@biA4*Sh_7Nz4>e5SoH$S;Uv7`s=f6dX{( zBZfh~{F;alGQ_RZlqcF2ezfJt>wZ-xJ!k5XZIR@uUoKqFGu<0M()~|3F#OB5B;pKt z%$TOZu8uXWntvX2V{SO3fDVK4-ecm zl$8oYH)HhtmV33xF-s?xzlQC<4jQ_(WwE4(h1CNxiH5z@YTHd$TqxIA!R=ZyxAw%X zJ@LVevHeQ0~XZ{0t9(!=|QOMjyrlAf{@b+`7=du9)<3Q+0V zKMjkg$I`Mo7G{Wg^G3UKL{w!^TCcCAd8zfV-?E9KD)J=3x$szK`4gq21Mt0U%(GU% z*=^tR7S)_-Aw7ftad>e$5c@d(f%^MnBV2La-MGmYt~C4z zIB4h#U6jLQ@&sJVXh9Hula$)w^(_^eZ9oC583g18aMZotg&^&z zHoww)KAGCLFYex5p7k!+Xk)$+O|l#89HM7r$%s8JO~ z#neG?n`MB!LAIhsf$6>{cSdPi_{w9tulyhl7ryeC?m2Iw8i2|YVDWTpszT1gjI2UI zShkee%|IdJY=7>Yf+`*YdLIlg7{>l&gMTELUa(=5BrM?UU=V@8I0b-QZ3+cGjdQ%L zf_~Fj8r2@@NPC%-udI$!R|N`bG}xKEKBp~1_nhH)ed6$tvv2sk!;&e$IWl<+e;X6i z4Gd??6%LeN^-jdn1F0`|*M^R^a%9$&;5126WAYXmoTXdNz&FOYZxofVk!gzd9)Hfq zT`+XS*L>t^-2;9R-sFU>gQ^t|`rNw{b18jobV}g0H3>mA_o-y_H?UP!isqPUNamPO z3g$k^+!4a@J?C{~aO}bn!37|zBycLWmH>{>-KhMHAZT7PpH2L|A(>4Vz6iSy=gH=R z7ss}bLGYXx zZW!_iOj^*Uc={d}LgO_Yt5Wt$nkAvO<>&JO&wek?QUNQXyl^E3^3zZnIqcgI2MPh( z5?Nq_U0gzs+c@>9#}VR?V}I7W`GDEk%Fc11xur@ea!;z=*4UUex_v;SC9g-xi%z*O zShdkN4#`ZeRV?X)i0bU$aa#?9uX3PXU@jWA*h#wTJVnauZ*{L*3J@9Rfzu zg#)MtC3PZUTs=6PcyoM`6lx4lRlczi$`&gIsXzxl+#|HZ*ObMIOgiO?0d6`aTa}dc9fH%Ymn^x>c-mk|;rP@D5 z2cBNc#Kd0Ta!k?DsUTacA8U}RtNm_8SL<#i8W-Bk3d*aOb`x#Wnhdf=%0p0d{^0H=%d;U;9d}4lc#H)^}i)x#k9})qCda zjSobX@;>N`|MU9mHLj9)dU1?HZXDCdHQr+g!<9PmOOP7V%YRM^y*9CdYDfE@X&L=D z9RA|b!reNq-cmsBF1|6PUm?@*=6d4!_Z3YFR!CZpMH4W@n7cQ?kBiM&VPWvWVl5`f z33($H2vs!($Q#<23z72*97XU(c_kmhOvQx~UgJlaT|4&cgKxj(F)>vJ9Px&6v1oQX zTJ%@$NZ0I@DSy;zvq3$HH@fZDO#2p(B3jd!6xKCZlm_XIGpVIfNyV5^MAD8JH0GDG z-h(cE8g_wS#J-{(G*k#{El_FVz0o&Hrv<$%4n2DgCAPho8pjg?RQX!G#cODMu)tJJ zzNxe`-7c||&IR#zm9rr_@U;bwpsx6)yCP<;%cX`sD}S>sZLS&uZD&Cq_^tvxogEWi z4Nu_=Z;Bg!!kBWn>P>aoKg>uQ@r!&~&JHlI*_G?Mia>E#Hq=sluAAy5y>HUBs9p9{ zHdn9v&lxX1xrRq!VmcEhYxxmsOMR2RW%aTzt-+e-2wHAN|NO23`;{-Z`ezD_^QjY; zw&1nHhJV2$f3+kElg0jO(R9^N6o)j}pn*$Sm1}k-iJ)RvR&KE8A{}cU8)Wry*(reE zg?k$$xR!Iz7F>DDyQlWUGCzzzMCcYf_U7i%zvqDeI6$FyG@|`yhduR_Oy-k!=kbUx z16K78@)v(R<&l0YkWQE!d0LHQ?S|U$Jen9U*MB0DD~l5Q0j%(HISVp=#U{mffr|5> zpp-ePP>U4y=2?)T1uHJ1Nse#Kqk*%-v*jma0&}=x$%q&SgwSJQp?`MIN!< zu_2#gFoPnR;cL0yMwcKMzdKJa*$*7hALo++vgj9SdSTb1&kM8+@Xt?lvyr}jhmrGn z>VI31{Y8N{>_wJdQu^C@hE`qtyz2Z5k9U{w^=H5XlkEmWv&YgqJ`BpBxVM=xZ1aNBbjDwtv(=psxoZ{?oufeKyke z9HjBp`67!hqYSVnPI5#x14`Tj8k+2Sv45rw^i4;hP{&${9}TSvQLMzIfnjK2QH8Y8 zU~mvb91;7&FxscDz$FI5zQoBO;)obU;nU!de}&I*NMECVcr*xkY8VC)PaW;yKVGEm zJ4pL3O)-4#t0<4h(-Lc!mzSL}Wf9Io%HGXq(Quc<4~|x{u6yzMs-p-|L)V**!hfiS zPYsD0?zI_tRaPS`S0QwN)b9=Y0!dGgx}4sQ2E+XWPLNNBdrt%vjz-a7e?VWm`@z$Z zK=Z-D{ys-@xBK+)h!gLVr~UrHkr$x{$39?cFuc`la39!UyK@Bp?|1t8`I>Wn?rEmD z@+uzqN*45SK;n1ko%Zi}08G39X@Bqo_i^p8zvpu}1T9!`nQGpy=eqL|xwr*|048Fi zES<1`C3N!V-R&snw_z3+#EBI!6>RC zpQB;F*X4vV7#;QY_`(WDKr~{F9Y#k(zDh@Z{D&{tCs7dbuSeZsIPB5a{eS+`Cr6y0 zb$f@0{b(~L_Vd@@Re>8m+3)T>5oCK99tgmI4IK6a&xpE51I0529GdWHG!m)7Vfge= zuW;4p<*-=i0`BIyy+bY z%$cP>$f6u|E2cBN3Qio8k_7&Ib;4VQ?`~XTXj%-CF7d^#@8v&&B&Ms_7-(UNkt@gv z9VVZn-*np*bOCL?D}OSSmPG=35X?Y?ikiEp|F7GA8nj1eyW<$>&-N+71C6L8PBZK) zcIb0?DEkuM@S(!T{vW-{AA9Bx6By@Ox(sFmdSn(OqeJr{zs!sC zhq|zbmVu*2TU5?zj7zt<*4``??*~6D(pj5=r#&>S7k_eWH*2`4@nV`kTHva8zsi9- zRi)pKnJO*lJ#YNQUSCTsHNu@InzbWN5?X^KM~)m*$}%&H?7Y#NUFn(F(G-ou{pB`g z1*iD(Tz)y`=4Gzh=V>~_l>PF*&&6M(5;td<_E|ybFVZpu9SLoe45>b=w#r=7s;$-2 zl+!X%Re#H%qlW+5n>l*G?;LI2nGPYuZ<^147g?8D2E0gj;nKBW6D4o9v?lh_d*PNd|a@eB#@W;PJ^Okb{ zx;T9WKuID&;Fj%#_R#77*6?8_#BG*bSYi!i$=6zpI^u3d`RJR9v3bx(S39lEXAVIB zLw~^}H(LpNT_^fcd6L8ZUWh#O^(zAoo>=|l41iVn3JRKGdrypjGB&?xkREHCMTL_uc;2aJMc-fFAy4SJs<6nQO>XJpc^g4}bwt6U@_Eyh*jdhOHaEl9FIhwqVl7E>N zMw$ZosVK-e5rEO$5Eir>&Z?G)cH|Q~OdfZP>kz_dfF(R81I{l^Wj5WXB%E_?rabc^ zGLr?Je04@Gr^gf2K(s=ViaaoH+KOF4-=tfUETk1w@ZH`mR8~6wVK!r52q3 z8h;~amkB+nhyTZGe{G(otLUi>>9NF{@(x}8ESI=K=J(TK#_#l==rgjbqxzX!&HL=M zN9b1R?+Wo~g*&;b%r{(Xqp0+;1)^ms&{SzUus)@l0!;&Er|i^sO31ke*MBFS8v~M! zc#81xXr-$Mx7aW$7@-XC2k$xLrMPaks(g?#T*wYKT$~A*t)^#fUTo67-u(%2+u7ioP0Sk(CaADuhT+3x1>y~}Urs{P2sqPKAJ%5s0 zLsqw@x8VN=P)h>@6aWAK2oC_!xG_uq5KpPwAOHY2y_3K)7YFL`zFF$=zLVZE8-H*m z1&9xUl&A+`tSj+m!H**VFR`1|%p`e(WkviNIjG zr>CcdCXM=M>~G zf+BG4INxwAIyU8cm$0_Qu78p9j>j2Fhe_0g;o%kO$UsfPNJ%HZaJtxr&02K26cf9D z;dsf!ru=s9=r0544O~&V@4CDJhE2J4IvSkgYyc&W7W9*kKi+e692X}=y>U8vRc9jx zwOhoug^jY)O|z*51wr+}IIXpR$MA~M*?IK&nP^Ty|`wkg0#J_FYpCSF(@PYLK zi9o2Lv*>e+;$yXIY7+L1)7vI>=}0xKj04fIE*&IUc@xj__)h60W1-b$9fNUY=oD5l zA?3_sGP>dXEV5vcPk+*EKD6+178J20^7Y z+62X0>6sMoT|J{3z3RF zi=ZhstnEqhe}6*+J}hH!p7e4RA?LUIqD(259mi4d1*7mPQSa@r) z2G_XZfFG+gbxo7vyys z{|+)5{S+*s+`e|(lvSg4w+Fo}p_{>21)0PK)p=J(44HjRdDwPGKn@N+0Vg&eTmvX# zvMHes5SV~^ur110i!s&+vMzy;;j^gWDn$y0T7Qa{fen;KI-hEovN^0REvhM)h_r*` zh!T()A~po>yLi@3KP=+x)jxjuc@`7p`SBx^6~UB{hZ>w%;e6x;4yvQerMl_9+1Mr1 z-th>Zg-wf2YIB1g6>YsekJ^k|(r8N=>)m$9I3JNe4Qj6|wVB~9h|!H+Vs=xbaHrcs zMSowI;wZBaWpD5*U*?&qsr}r22qR3@Sq{(J$ahmKLN}oh#Sj{kGOtyK_3=cM;rL z-HTp4C)5>dnC;k1Cs>3xDbe}RvLz^z%YQ78g&wj=C2qtD`3fv}pK2Vc0En`)os*vH z9>Zg-HV(2s40SpToY%=UrcxF{F=wBm=pBz#uW&B|Fu?`np=DkYU<_IoY0}~%XibvY z%vf9TcM#Co=z>i;*S;M}$aW%NZ&kP!>+VT^(_XU~z~_StNCDQGlZ7|MrI@eM-G9;| z&HAp56S0SES%UY#HD(v7Pk7lu`e3ZT=Jj!?oDJ`yu`=aCrwp^<1AGg5-_iR@MffgV z24PaHk#ku*2cFsAfcHZU&&KW#R`(cG4LZ6U?}ZXUJO$d|3`uLdu}368JO#RnT9~3u z5es|O@dWIrxHHo%T`lA2+w*2hgn!@DnNiH^#cDRAPYLGN;K}-+H$mUTSsYnATpxs? z#&pREF*!lJ@HH%0Gf_(0)rv|U72N(JDwVyW#*WoD<3A}TPe*m1O5T&SggTn@*WrgrZQC9f#~YHA%0jF43M97Q=RB_4dHb%^2;sB!7h!xGVbWvEm;_qd4Fk+p+Vg`fAx1tATpAyOFCZkqdgcy|wLD{K%V)%>UAzWTMU$2Ca%<%Z6-=@X z=?~L_KkJI*$jce``Toj)m!Tm0RMYpZy`QZJF(>s;L775Vl1F#MCCN)8Z)GA_Rm5r4WJcE4xM?exFzZX~Nk&pgZqsE_&5LU-wMj zxuKrxbTpt(>FB;LJ<)(iWg(J23KgT=PqNCM4231A(P_LK)wVbp~F$)M!!hY81)VC9& z`{Hr5EQpd|_C>;I{Z9#_>2&WEMI)dqtTrbOs{YO!iB&CTr@ixK_sBWvv-sFD0e2Rx z8JtWYf#8D2lD0}|k%aHi@fBttDS4h`;Vjn6>H5a+7OVMB#DBch<6EF9O<^xE0n0V< zHPP>s4|>wWzM;JbjHw~r`@iDnydmIh@_1^0>F^)-x^91P|3n1SIDt)W6P_f%o8+m_ zaeGOtMY4%>fbMdY-`I(>QDmT8$CJ-!b&j&tgXzyCLZ%qBdLvKBKy6L}{ShG>n4idy z(Y?YVgvpQ5kbln{4UuBfBpQ;(Q(Q=zR9&X;8sV%D#DqwfS~p#R`Ax}ffEj11F>&FG zgidTNqF-GcSiY#OhxF;Xpu}0Q9)?$3-Q`LVpp?%|dvZEMS6D{cXEW7e$KQ z8ed6E61nq17y#Vj_&!NcR>|J&c`zA~u0xFZjeOkF%JN z+91Qqd1K6y;MFTb%OJFY)u|MzUpX@$Jl*(rcezZk z>5tM4%5&c}x+4~8j=}i8L!g$gJWyxBR7aQ+gVeBWfKgdRS(huTdR$QuoH<7QB5ch{ z(@f7h)HIVjNWe<9Dk4rBOJKz5`q0tJN%7o0vVU3~#msA2M}gJS3(EKIQLo)Q>bPCE zcjQV^6lr0v3${oLt6_W}Fi)bWs(Z~jG}1kIRx>$=$G{vV9@TJpO;FmF4O|oZJ!U|e`oZ- z(K5xT_Xm`B1*~5AO*)Ip0V^8rW3nWJV1K`3aqjoeRExV(?G?Ag^?EPpz?nAzeSsu0 zt&>eMzZ4FrusrIevqO)hk?b%2Qh9ePf`J;!Qag;DHkFu;GQ7@-q;!wOu&wD}d!|eg z#UiE4xl<(V8r`?aEKM^JU_0*i2Tt4gpsxJF`~W<}(Z&>66BJ0ZUm;Krw>?JKK7Vh7 zjqCtz5(iUfUGq@f%i0*%r)goMlWMOq+&rcXyXl++9j>x8h#> z;80u+?ph8McXziUrMMi5ySuwXVf%iY-TgM3Y%>2QcV?1Ft~@jINP z_nC~unS4;RPr?v(otBPHVk}Di^LW!^|7S%nu6;pUjSf%0k_@19tMI}=!L7&(CK_>dzxGEOa6VZEWGi(qHd~K{!aiI40ckqK2Nbp0Nm;1!*K} z(t*l)X@n30J~WfvpbdB5RTOXASSuT!JhqH8WanmglFN_UmAVyG%h<%6Lj`m)X!uRv z$}HVCtqU&=Bl-iLkH5kso!^uD!*JRyXBbq+j{0Dn5MGYj>dBI;6O{T!BzTO^(YdADp(eWOOI{>N~R{-m@^8<5>@l=FyW?LvjP4P}u zd!pg(6n%ydm~Q39E}B^=v8BJn5vF1#nvP%BKtXA+UNG0pXx8|>kD3K~#eMG+=u=hP z6c8cYsj5av`zRL8H|O4}lk!iS06vyI88>!Uw&fY364*a%_dUwf;m zKztE_(Y8{OB^ZGS@!Kmss{P5O=Y#q6d|bz5j0Z79Ao_cAJ4Flw9hr&L5ce$H)WAXC zMXR$oGN4sAp`I0DbZ(c<^r%H@D76Md3Bn29Z$&`q#MSlC@UpqZ*_Ow(LnS$a-tApc z{Mo8|guXb&MvAD&GWs7p5)IW26j=olkbQ`G;EQ9B+sfv86n&tbR0rjGTBXQ5W>J5l zXi4(VhS+>NF&Gktv$7UXX<URq#9*HP?<=IO^02qS~-l<33|H{M{>*>DW}oK z;c7NzXWN+y{X_U=X}_U{toujqc+O9%h1m(D;aJI# zs;+D|OYbHq1KjBR-s8GjEXsf3t!}Rf4vBXAq7}JFaa_)V2MC9^*Ppm!JXia7Xwrv% z?f~(huXSpKTip-ML49(u!nQ~NteC1wOw30x|id{PXc>>$p8L3`7xIM zFPgv%cso-m!gIMdj|_aikxTc^YWB&wDw4Bmfw8`OI43*xI&|kXW?UGJ*F4!l7}O>$ zwWSj%1YuXXS@>m>kRWQ1Ur;DdE|#Qe`gX9&XPF1(woxv%zef#635F4`H_GSf_Zn8i zG*gCoSdMBz_HD1l$Q;MF3DO$fc=wz|d*+ zH<6@=CF|V3y&^eLaa?zBEXGD44&SMr$o+C55 zy3lcFSTjrjW5z9EF3?f7L;EGAFEygfC41vnvT>V`e%~Y!?i?aVp|BONa8HL&qFzn_tGuqVBgtaZjV_2LksUB;u*C$a!;>&rnQ^Ol#$L-+&9}T!p@14Zi@d&WtfnB})kz$?rd^mNS#3PM zCFl`UkzfBDQeBPh9QrxCe;F)mRb*fOv@I$@apoPu4dpGLmVqxDDQPk#x@-CXNZ zegLROp{-^46i+MPF5xA+b!fYWz6NgGLD?pb(#qc<=stWw)T08K0CeM`SwWGM9=DRMXll#_O=Kl`Rqy z5rk+gC2+s*but8mAtEsw!&gphNNR~gb<5FS6F3nkMvm7y?~IUW-k3SMXVt*=Bh@h= z29DU5G$?Nx4@AzMQNQ1+TG-u1jcOzYXjCP{kX%uDT`b$bbhGMa4ww7UVK=b+Y# zeA45AbNu$amZl(&b|C)%BNZ6GC%Sd_fKR$6#G9VQ#7xPeI|F}&`PH#caWXZRop-;f z30p2yL!R0}bxpr_oW2bu#pz^oji%fQNI+yOZm;o(ML=M#=_-8uZ^|WPrYmQsjhSX2xrtcIHOrp^e8@IrP(s>am?G&i>xm=Qa3VifgC?IsgV}RNPlI?V+TI> z;%$Onxzgd4D=cw3(fO&{M0{$j&A_*HNlnW4wlt^gVYOH676{SOGWS5QLtJ%uMa_CpA3B+nQ#M!Lz zRzxW`*g~X>oFfP}KQMFnT|kR3mK|NUvKS#~W&l_gmaoa+I1191B6gobr^Kn)%Usm8 zYAVRIhGEZmP*c6D8q>p||7elh^_!tU7B#7#gt-TXds5v&JR%MKgyC}n2z#|jy{=t5 zM#}@+J|!IBW(~=^q3>BYUWpQrP)6vgh250aJCX$9yqZg((wK4epsa$R8_|T}K*Mo} zWwRR>bEkLktPSN_w+DLdRIzN_kW7Wzt!Nj3qhF;-M#Q`D>F(7JQ32Lk>JO>^UY||a zDT&2h2DG+z1VB@Fzjw~$Fqv;YmHvtRy8@~mUDznzyNbp%D!lh&Q%166IG^L5ISUw9`$XMIR;mVnYW%ta*uxGeEn;Nx6%e zFjgT8**5WS*YFF&%sZXIT*JFuDk|t>I5~5&J^w-8{_$w79KjHBGnKsSl#5#=%7tqv zh8zv@4^8=eA5FqZPrIZmm){V9^&=F8+haSDE_*gIMNmA)|8k|&+I2?Y&`tj)D&}2p zG+A8jr_mi&m}2{bMz=;zQ4GxQtCOR#5?279JjbJYmVkGPYyD?xRDt$+W)~{}bR>j{!k2 z@qe!p({;!BL>~Z0D^>iTBU{)5HDHc#s*$QoCsd+mG)uV#YBgy~iutfNkhr4+8Dkef zo0-l~C&a8F9g;rHz52UL#6^Cxkw#|Qy*1Af{!Exs}ENs%wsN@ zvKVr3qh_a&=g`y>ed-&4c}I*^1fPkR5(3}?HmYDgur!|UnkEgq@oTIG%6 zZtuXHsk6rjsSv3vtPTV^qk6yA@f-3!#wpX>P1thwdGQRzSH#WLpd0v{dmcTI(gVfd znDeAteaOy;Wo<%dG{dCMX!Fe@msGqe!Y<|Y8x6*n&W^8rfYYSPnclepdW^CaVR6d- zaI;u8m9;ncy*cl%GD*MEvK|gM2hR7>FxQFHrFE`CQ{fM$<^)sf+!8rL&){{w!!B^d zTBv6!0sKSWLKP-9T}325tK(sS7zjJ_kx3_=xx~z2DNWS!bFxfw?vC);8fi`4DBj)R z-Ne;PQPGBPrTtJ*A;8`i%H%EP?c$B%O1{-M*0wvnBTj9L97Jz0%TLz=cdw;*!?zO( z2M0PXLqHDSz^`wQjRGbRls^V%qSw_Pp~aLyM5x?WYsUB?p`9M4VI5_V*M=OKnIP(~ zMX~lb@m4qduMCCBw$m*vXlHf$O4NT}ea;0)?oq?-$DEhAjqm3a(GXd;G2znhLM^*e zS`4zLl?n2D&>BSEP71K#g1BLT^8voAP7m207pqsFd|X{*TGW@kahKR?L`1 z5W)q{-b^=MiwSu5^r#4*P;$)XlnD~ zyBhkb;C?)?|4lq^HUioyka2QEK#Z zNFTss1nGTbMgN$KUHeiyqD@ZX?@c(fTe@+TFP&}O0ruX@u}x2!tmeM^xaDq_ z7v9|2+~c?eTJ~yAJBKmX8?Bq|u%y<8|1`gSzYst(MLZeydLs|-RCCXBkuxY_L z;e=5EL}>Yaubsj#1)slGE^CIr?#Q~%PufM%Nv-~D?jEOJ=w$)NJG0Q-PWVLw)gTL> z#!FPSiJdYPX%TR1-K5VZ8(dU^e`NA)MWDebg0o4Zyi}X%#>efE+>h?#P~G|WGA1e! zWP?GUM?7WxtAJYtEY%=3+IemSkM3FO=A)NI5K2j3r?15@#^rvJsRrBo$vgCa_fGt) zbpp1A61WNn1*L=q1%>?I#!z#&|5q8Bt>fUd!iV*CZX&_+bJ`+l`#T-EJ)G_i-Uxyx zfWVycJ`Tq=28kYpE(J8mdcEOEN1xtcvyhF}|JMewy5`1S#Qqx*yCb(h_bu!qA!Q;o zi{|Dv%B^A&w+7`?aWJGE!2hk98~x=>*hgGka%byM(j=f)LmvQ~qUdHRkQX7#GQmLj zesFkyPax`?WE!7y8y=FQ7X(RDI^@6g51drM6Vl(xx`N^2#DV<3?iC1gT!vRXfUnZj)h{vewc^cxHY8>`F0P%m0iaF&%uvDVc&{1YbO6E?3hV zJFO`*mn-R|1mkCnF7XA=iV?I2b@$;wxLNX>&eLIdl&9E-aXyadv4fhCYy|1$HOU!u zKQSz*l(t&>12qNffAjsA(vkU!K>Z`~!640QJ4}c}eH#R}1(#rj8nCvOIifM;|+ ztKqx7tV7TT7jL3XZTLQLZW0$-CKkiT!FiA{jBC*awAj-K7 zW@Iv3B_PeuwIL^?C+O9p*&S!%NY&eFlnHnz&Phehkx7f1P!0f3{(ao&{f_fsF@0PO zQwr+-@^G-s=Ag+;SmKbpNYRs+`_Qe#S<=)ScCljCYoPiWT}#Uuom@Sg z5norI8D{27(mkIlRu8{!m)E(p`WbR)T6G5l9B3nLI)3HZ5i*Fo0sQ6iyqaKZsAK1O z{fJ;c<WwCgvp7g$|@%=5t?D|Z5{IQJU)zAepiA(lk zYHoIj`YoH3lhHCXV_(p(SAYkc$@Kgu-BEjby<@e=K%otp6C!1n1Z@!A8Ni#s_rgr= z2KuSWS$ZLB&Hdxa>K*8!#@Fpwym2qJw|e<46pKwaK28z4yvVQzIaKznrF+(KIZj4XH1@%E^FiN;6 zQthJ(`92VrSQXVcp;dDQN0p9H)P)gTfF2f0*;>pl$H=B`rfc@A{N2x-Bhl$b5U4gYOZr-|#omIahrFVSZ@mhir&Z6N{kypJt`IE@{&9*;3dAw5n9Gs6?s^^PHI5yY zI+b6|>-Qaf6H7~{*RCnD{2&wKU>e${Xi_VTJUb3{q?14_$7pPe4ZsxWrzv)K%{6G9 zf8vgE+pA|omJ8I7#CP&Y6TBg`!W@G02<q@-#102V7~b z5G!*OeI{b<6!%6B8Gi!Zyvuf5k~-yO^?q>s8c6_#wa}iDZ04IRJpYj4Ul>FTck+4V zQ;gK#_ulNY#So4P&yU@oxoKV<)V|D6h+qpM!HtlGWH-Rt&3SGY3M+KFqT6egwt$86 z>17(17^SB=4;+T4;a5etQP9pJmgu!)^-u=YkJE{{eHH9|6;5zLD+LbNtfWFwgM;+e zwvdCECk?hXU8}v|oiIc{XC?cxBI|8V&Vv{p_B6v1=^)D-R?DA191%|@vl7yVKh2Iw zr?c$qZsRZ;-vqWzuWe35rxc6m%?egt`{;qQbmR#V&(m*NeHiNfs6*4tGZ?khql=gt zi%2B3WYAcH{7cS3Ld>6g?X)?KT|RJ({S_6R1U{CvAYt0zxo-%1x$_;!OL%E%F!cB_^4px0M?Z&w<%l(*bVVUgyg4o?b;khy>dH98f2zot=aGz7~>!K7bc zlZ5Mxj_6l*VZpCmeYsRXJ)|2(&UT+YR1#?Jdyj7>BpR{rbD#Xhv6p-wt8qdv)l`Hj zLDS`1*>ULtPr!+^NR*NN33iZIbhj9ZQJSjyu`++&ErR0jNvB=`N0RXReHFA8cw*NM zahoP9C)vTE_8q*%k5<*qXgb~KRc=ghdq%XbU7C+H-`8o|G)U0y5vma{LgId=FAUAc zEY|MYaEPc(FHCM+qJ@w=P?KvsuH?#;z8xV&Kq}!=9 zwh?U?r$1DuG2*eUetY^o^C=rrBOjT9TDcS7f}mx1g04iEz9EER322<0s*CFV?ojO! zAmGbG1?Nzn>tFxJDI{F~BqjX0CR;27X1yT*m~3;;{tsZ1{k@2i^9=D}|I(we%`lDx z<9~bHlQli5|1q~Gk9d;t{WJAHy{=GDXi!9d)$dSHe^u^KML|h_#qa+qe0Q*Q{Fn3{ z{$JAff1=#~ME`fK_wUgL&Hsx2tMdD|-2X-2zvrfOp`iW^gnx5?LHN&l$st}8FdvMP O3%z&{);<5(<9`4pAp3{_ delta 24106 zcmafaQ*7W5&~0sPZFk$PZM)stwr#h++V;w&26%7 z9o}DW&xNAWX0j1liIK%Q$3PED5cFMv=$IR@Z&S=qyT^o$02S0X39{;ayG!%z-^FY3 z{q)_B_4!Y~uc}p&<$0%%b9}ACfE~7w*4(^j|K@vq=w{21F*Zre8x`Y3#X4RNOOv;q zY8C#e`mJE-nP*D^la@MnFvucN;&N$&g9wS(^rrGQkKk)Kr|$bJvhM^OJ$hjb*4hQw zkhsz_4pZW?i?E|NHh z*fZ09;fxkGlFH-@vO_>`Q{6!;i%pmO7;q8qqIi)i(XhI1a5T6BKA+Nkx}4 zb?_-W8;426FJF#V?v9jCZVnNz8jx zYZip{&7XZV7st4P%QGpNfnf@a!>3cEAzF3(HD}sx|p*$Zs*XE4#ZgE z62of^v=~&4c;F1`e%sX_!X!w+rYn2*gY5UFHs*l|rgPLygR27h42EzzJW}wO0UmT3 z@q%LxbIhQH9{x*<9G1j?K`m^dkX6L$4g`f#K{ZnH1mrhzS%?QIh?NV0_=>w#AX!5T!8XC-;$uXe3Z{ zfAk=mMgyhzWmpu3aUTg>r_2g<)Q8SDSLfzm`!_7us>HL_UTG2N{?t4*6cw73so_zv z;XRah@edP(l%l5b(;99j2LF~27+!V?$aNYs*zo~p_F@8J=JQcn+6kW_SlNHI<6ge( z{840%1EPE&wfQ|otc9xGe46gaQuFKe7NAV3z#@e!70WM2on%y+N+3&q60#p8*PE0_ zS07`Si?mud8&NpVJu;%_Q>RN?V9-E--KV!*(~y2F`{~c5U~kqP=s@p)A1OUIG!$6l zH{tR zcFI;g=2Epyi)%g$;t0#ph?&jH!VY_Dk`x{165kn@=oI7g{C*{g3N5nAJ=rp`Ry7}F zHcrx{T~Qf4t*3e)%Vw0cuV2ggSFF^nC)m$3*XjVxh5k#{+SjifmKoqd#(ez(+B{$Rn8DK*tA?Gnv8IWdl9>Jycn7`t-U4#abjuk_t1QfsnOjcK`8M zhYg4?t7ZdeEcxw1z3<V^*$p`rTplZyISF;ekaN$o)vFMt~Y<2A$ zYNq43-$Fv*1;LMadI@Omu-q&x_e}U{n9K%9Yh(nf^-Gjfze_t5?JZo}%aT!Hbmbs6 zCNrbhD>)i%z@Gz|P5YQ?_Oe>i!5}Vi{rGfmdyB)5)kHwsOk2j=wj?I#O<)$V zGEHf;Q8qs@-R|rcmu_A*^=#+8JDgzxq?X_w9CRzMqIe9OQVQ!!=G2fjGuX9*4x77F zTBNOXK!$d)Qhpq{YanWqV?1e-*_t^aws08Ueo|T_eH#tJ7UKxsRiG|gVh*FF+t+c( zIVRZQuEM^3p@sY3a>2}WdJc2*IIRNH?iwAHNh<+4APSL$Wv#!s~?Og}vP`WN$Par9Q$S}XWHc&Y#e?!;XM3Lz70r2)&g3o6S} zb$`~!quPF*&yO3BVqFL_eAxUPz`@n|i|n|=YGuc$*!3@5w53iB$hqBWW@^m3G8$zn zb7Z2#W5b_{5Iqgs@}E;h>+8VpP;&dJH~Mj;(C>}1e@3cbR?dHye=Ur+rT$INQ(22_ zqp+s~f*Oez_Ui`yWeT=MA6VAoEKw9z+ucm;M3W(o54vi&%9U}W^%U}HfZdFkDq!s$gPZvmktjl9KtYT^)l~%@;ug%p20qQ>+5)qb)G%-eWhX zV=S6E;H=o?`7mMBCaIW`&08bcspPK4pg0}Sd~Ym+J2B6NcC6yTQIJ)ei;H%QI66f| znZggxIw+i0+MAf}Y|GAOxyyzne(^u{mOh!`BDy9!UO9By+A8|htrx2eYTHNJvyp7P z^JmMI(G0#XYny5Ey=Z`=Ws8TuAqZSG8CKR$aMnCQ8K4MktgMYOrnrCQMD_{NAz)e! z(NqNShozLT@{TQuSDPQTDJtTNYVtC2Evj$oTCFTGB_~}W^4y(*Usk(E&UV>b;z|E% znYdlrfttlI*>x&)VhbJDxY%Hg{b)U z3(o&)mJ<9$xLmeyC~w?*a6-a$nZTE$N6^Kew`2^D3JFW9w?N=6g7&iU#khE-E+Vle zGlx`NMgT`$#kHOA-5tI{1A&KzZ7jJE<{+{=>`?$2e@4iAx}B9#&os!l(OuV>72GZv z`c_SyE>Uc4?gN0q3tuB|fu?sqCdg_UhQL14LDgzJjvMW+4Xu}(WY-`bO>9=E$O zTB*kR#0QiBA+UD2WY8C1)De&-I@xCafe%!yfJtxU%*?^*!|eN`SKlA;@6xK}4g@x* ziLWB<_%0&-HG7U4#}2bHh#e(8eT@1Gk`WD9S3!$RbtUtVFc}|l&Mv2)k)#D2BiX{Dq2Q!oap36PX{n{w zZav~_i&t=<=n7W74m{4{APJJpFw?m)B}QyrxR<{!>d*kqID&cj`#rQ3<)i#FoJVbu znW;M?Gc2HTZjjl>B@Lfp;Gfb@e$@y{>c8tog+R+t`Qyv4(yUO^iNp0KU7N~m%XwYp z$Pll8Y`H{J4(*n|DIp;oyAV&!p1(z3raig6CGZ{3TTx59ffpx&mDOdEX4mky0Pb?_ zu+=NBK^ysgIv#{pfxJ!ss;hYAESHx}Ck&g$;1Hl$uPyU_92S&6v4f9Hztyr8PG_$o zUuH}H05`Zi{GbYlD<>lqYC2nvrg}}-Ol!by;{p^_MnW5OW6{=-YlT`Wd_A~8G^D}0 z%_v7=zv$wRIYyza!^o!8Xxyfvq`-Q;?hvW~sD18Ddc{gLENwES58l2$7H6}6Z-h!z zEgby35{I$(k9pKr3hj*$TZ~tMaUg|K0A|H>GLi zxp&|E53(wq?`U3$a%YaQYN5uecyrlpjnn;-0{iDS&*!AP24otoqrv{j&EO(a#mU3c zyVa}j-wl4`49Y9DuiV!*LJaj6{lWkz5_+Irwc`B#ZndsS?)Qtn8i${RxHkdAFF$JD z;sWrRmSpBuz0(AV;+S@6(y0#XbU5C`6CcyyQmI&1$T=ncTz6L;YA!!IxlH#;i9g|8 z7{X7%vs<`XQ$@0>9)pR^?5Orn;4EcFJpH1%qRm|53${9vG0iFZ?n%v_rdy(P{!4)M zhg_B)1h0$z)lZAE_vXT|pwIe1<>mlkeJB5Ec_D1*vGqGH995bDXE}RD>ChV3qDm;a z)eRU3`q6{O#0c%gKq=ngS!kzMr1|GdC;6xih7Gn?i#$rO8?nroX%axI%mJz7{!RhM=OgH?3P>g?ytn>ws3VUUZ!5V( zF#%f;4#U1pyy&(~w{|@$Wy77boxtN@i+@cMx!EzZmdaw`1C+p+;ceE>Za2=^t*9E% z==k{amb_^?d`G%4gbftyq4L;pV&CyNll?hxKjxCG)nSkb*av^tjqI-+P$>XmnLQ#Gd~4X?RF?r_lmy>vy+JdgIl&VG?wAD@FS@-r;X$3p9F zkpF7E^+&Dc2&(heI!w9(o0^1d@3kd}3_KpF7AKB5N>cdxphFzUMFTL*30>WAPF-Q%h9@=c`!}beC7E!NV zT^_5n9G-N6YxHQ3ybUE5o4C?^C=9p5dtaPnJinxD$mAEYbz0kvifaX&2Cb{iW}opE zo{7)WC8N@p%4UIKT25ZozlPX|c(L(&FvFZet#U2aCJOJZ1Mw4XuJAD8NRa7Pl<)K0 zRUHea9ocTB6WkaYRxHxNH}roL3xWkW-SNZnB^=9m{<T5xbN2zmbli=ji>)vQ ze6%=TO8}erxtC-LO4VO2v=oMwxj3tBTF|abS9Emiw|D4*pK6`P*M87V)g#|>o}bxw zcU)gH;pKqD*RkJ=L)aD3^KJN4tn_8y&GlSD=Id+1pXGpp$yEVbmf*I6iusOtpTqJet^1R6@1dTuN)}q- z?NM8dVVF}yPC{RA$;ouE&P?H)u6EF@Mo{+k>V7~P(NkHbNH=>#+vnydx0c#)c2eiT zA06TyXy<3-gXE%^!+!h?785GQ&N)RNMb$wE-wpL*!f=&Z!55DW=BW};ECl#-y8B{|#?rxWj zukWdMkq!Uh<|mR-1Br54`PQxMTYT~K5vxOz-(iJ#Rsj0}-JP+gMJoyuei+$7B-D*5 zLMTFe&4p^-udnT;(|c=_S271xyQ`Ezj1_=!uuk?*!!ZI!?K>GobULKuCNyvMIC{c6 zO`P~wimx>Swex}@lnz* zZ$&%GR=9@F*_FGQCe0!gcIGrrU25&?4y+-xVa#0-?Nc}Y)+aFg<>_pSCd!&c9qL2* zcXivIF71>%(s+VUINYezJN$ft5@rvHd)pfyQNbB03nLiu=eIZ=00 zd2j2w--+sPivlCxNoAcV?|{GIgXl(GQe_vi z>Z8z`xdb;nT2UCN3ae;I%Tmzru?5>-S+U|s0FFJoJBa*lUuy5Y5G!mw=N8FFsRqa@#@f-(Ux+C7r_|XL`3_*j6g4O-FGh5mDiKla(?tgBiXK_oGtO0T)k07oyB&N7XhWMmv)9dK+<9k2 z=QFsfg>=V8_+92CTOEp>L(NRwxdP(mA9dlMHUqA&Cw3thoBac%)=NYXnyp>fL3N+_ z@`1DbG`KqL0RK;Z#^b^#4X3f+IO)14DF~p);(DY0zU+J)q%ZPHBd9Z`yi`j?xM7{; z;5m3qw3E81sDB;qgh4`sh?vj$;y`WQd>O@D?V-I{@Z>GFcJur43}gyu=A(svj0J{B z?2W~9Pkwg}t15VWP9*c}aV=?_o7>hnFFUwhE%LJerG46iZVbnNP)_cR%Ts~zXF4P{A)rqY zoH>y*K+%Lplgvk&M(QWFeV^tYMH|z}A_m6RY2LerR~KjgQacb4jP5I@GaK;Aw%OFJ zu0fq{4XlX~_FJhPJ*(d^;h>5qrzwd`_eFbTK>E``z=|(Wx9F=MJAvh7--A>Bbm|3tM_?Z5xAxV(?LL`1jDho+l|mVW zB*a%aF7|SbwR^1YviZ6GN%1ni0qz9v{_x-k-YZq-|HE>?zLS6v5;lsX%927IKYd|l z77u!JaLb#5*mjpDzZ~!1Mx5`ghd69K(CL@7V|MD;fgpw*U~~{g%)v|XMU_$aYYe)B z`M=q@$#R-(nxcD?<+GFzDmvSbgf_&^CJ4trxUX1fcNlnR)Wc*A@mZidDIU*K;)t4+YydqkZihMuhC_iqomh}BJRu2tRI>!i_`iXXF+pqf! zFS48(xz|Vav~?GbN?rhG+^tcdYg;EO{;NPAgRFkP`3uoryLsmI4gop$lF?mbuxUgU z8iY@&lGh=YFjD*@4=aX-UisNOw==kLa%JMJMtY#ZLl!~Cm*(%3-Lbt!mx#LF17i6+ z`ic@k<@!>kJMWP?bqcrBUN_|2Gx~W*=`ZGt&9ufd$5>XR%soFbiZT$u3uQr%)H)US zoL}5%Jd-x3-p)HWyH5928Fcc7SSX8^3F`IjG@7T4`LGx7U-Z?iI&xQ|v|3EoEo8ns z)K@4QR6m2M8jPS8m8169mw>&(g5wZLiB}PcdQ`L+i!5gP=JJksnH~phV22GHv7gxF z4<86)#J1A0a!cHYm&|4$%j-h8;;Yr2tl%6W%?CV)K){G6xXFB=)#})xq$-2ceNov{ zJ@%J?CqW^&=!0F13$HD&o0&Y2bt{NIW56o>n#7f@XnT9 z9EXZ010KgD!iC2=qECn1jVP_WE(J&_`Xb)@32oWj;V98`eh3ha%U^Ms`}wrgWT_t* zeUvk?FceUo1?knA9^cu|p~};l^*nY})vO}VcZ_JYAF4i!zDN|>l2Dy)S!Ymwx;M-P z#AW$uOdsm2Y&EPsZ6{H7zy0}RKE`y##KZ1Jq86w7j8a)ZE7oEJr1E%8bv` zd`Y)-oUE&59~fF zmXXwws5jQ|8n=cJl>u=YS2TFobLqALs6Xbo)Ti@PXkxvdOoM>;7y$Qx z>64#5xaFel=K?+zCl?C_SyZ!Ei`34H;=(*0uaXyXKbejLdZmb4>53UBkL&vp@ z07EC3ao>^FBbMZhGO-eFJme1YdDS6SVJK+SfIsrD?vY~GY2o-9c8R%sU3)oZ)y+^P z*RHm|=Jo8X@@yFU!E=GMc5``0_bbkS1&?ALROOI9X*HL}3EyST-8!h668LPg`ND_2Ewbv(x<+k|DV!1^-n zCLSBZg*CPX@dc`ZA0N4iZ#IH618RotBxB5<)W51VvlkvhY*BwfRO2Mu6Fa01D*VkM*9`*Sm3?0Y z+jt%MjP@cte4nMyoo8&VX|j9kK;l6cL+g-zK4^}*&MOT+!o~tEp{S|Qg6t>dmV{6H ze8dOkM$ktoMN3E~-=_$dqxTa%{EhGMME}%W`Ng>E^q(V!zf>Ki%dZ7yOEsELsk-%m zB-Y6mw{^Olzdz&)>Mq49Bn(*e`)GkB<`E;l4$n|{3Zon*5=gry-oI=?fZqW!V^MGo zkt}^F?{U!c2l65XW}By=S}PUr_0SO|(e$9`?mTkk09=r&8$>1#PIJJdarq}D)%JHi zpHm{T>kK{}>!!f*o$8(Vg|5)yE2WD>%JJxf&PAh!<$42MTvNh1w>b@vDt4!d2`M*GH-yj_ zx`)NeTkHOmTu0q>0=bV0_oq-43)n($=ZL93GurIt?|!2Gk7=s3 z565_74&^I0+|$dw>yEc$VrNBL2i(1Kxl4T7CS2$?bfS)9d39$1424VAO5H_kiC4cJ z)9w|m?XS6x>NRO^v8$U((3ZR_iy|NLBfeq}0be0WXKv)i~C zvUOSI{gXE`^}F%{kjGJLt2x8TW$sFCN8 zB_D)c*d>;GG;wF$_g}0!uj9t;x_TDtDyb+@lw{5wjz7#y<`Mf*mCS+ygvIgw=U>sm z)p&>Q__1{W=1$+Zrz8WXF(}2vI{&C3KZuGE2oxs{+KeWQsVWUzcg!;dZ@l=Ks%B;N zKXQ18ZuH1?77Md%SDcROt9;3qD}E;1IAHi>%EPxSXN+5U4rZOm2Lb-Fhnf;-D2kk=9+&FjmV8byIE3qm!QY0t$Mod~s$^Kykei+lY(^%Sf;i(~ISCENU!6MNMIl zF3I-0|H`3v%qaCkmd~=^MoK)R5e8-ijbv89_1JM>9dW97ZVTpC$&w?aqR)6yJeX&Sx ztT$aOSiMf(N?f_8!Sxc6b4o-4{3;=w816v;-GX}fV|KUJT}suZ@~rIML5uC|;&xX; zKw=!U4KzoG`4X(q_2jXneFUo1+CL+GlrphRsFDSUF7deN1Rgjr%Yae z^EmyN=YYBSBOg$>gz#{NdpUO!*C)WzBWVKmXaZ$Dm7X@NS`N0eP6 z<$%x5b4I^GhHaZJY33Yu5gn%z8Ks;pOFbp(6%Ob8+V1K%Hn~1$xRr(y8S2PV_CNr~ z2c>4d_>0OB-bH?}#+($Qww3g*l`aC{AC^rTibMb8hmYj!W!pI6<{8Pm!4w&JGPA(t za}eESzP+WeZ{{B#ft!qV=D`h~g8#!qB(ctNt9y9kiBqLgx0n0=(Tw1yn|G>+DrITE zO|@HC=N3w;I1q*;%tM{x7uEA2TKh_?z|L$pE~}w&$+zX`&pT7R*3PNRbo)15QCYc zTP`Z73Na+J843K_2g}arrl#jPpPfLr-BL|IK=n8SzE16CaRv7#ochRD3GMp?k=}AL z$-~JrP}eR?VTNtZm}($}{f-8h#a*a$gR5r$;XeXL8G1&UA^we++2hgbkQV!<-HzH4 zRNHwvLdDwNRvPe4^5qBUZyPk! z8)HJ-Mb$c})w--`H^P3biMCgM4}%7kaT9K! zpO`%@LV?a)FSLCr$VF~TUK+TWGI#)a_V9sTPF&)6NydCbX57{!(@L(I=J=MS$M==#SswIut5Lj0 zTWBHzLuj&MtV1u<-k0>zv)d$+Hg2$Eygs%2i&$WM8b~iP<7xIG8Klh-(8-|#<59na%+}ROmB`BEPy(Rb7)E$&y}u6pEb4UvV;p+ZAF#B zQgP9k=k@ST+R7g(l`vk6m#!atLPaAZ1k?5-UwwTf=A$D)UlM`vVFP8rY-w$F(C(c= z{M+sAu76V7f~SwmD(uS%GYQi6%@*xAoFnjpgX^2oq0Q;qHOiw{(09wbeT65aZfFfxAuN=qKfsHjbP zu`y;{u-m`RHUf-K_R;-7@;gqXv#mUW_(pXP4;*`YjG? zKpbT#C&fpWf#5)6GtJMm0@Y3p3e0 zNc@5T2a#6o@U}YfA=<^k(L4mbDZl9KOLV!0vi0c9P|h3fd#NEV_Or_l+D;hF(tZx2 z9iMA9f*Pp25He;??9H{$br`+f>cT-6jFOu-JXwwD`jm(tbSXlZNs+%*190Gk!}?AR zIR@My^+6`x#X{HXC3|54f0ZdHI^SG=ySfoUcMLpqDI$EDk0kGgimRY@;5^gu+=uWc z+eX-b;^)0cwA_z$zYT~EbG`qn%>i)(dxF5`B56mUw@85I9!~o2($TCK7tJ?^G1BB% z>v(>MG)cZgPz#;H(XmhS2)K;QxF-oG(C0oGE-VjDK)twQ^BXTW)gr~ap4~MfFqqiS ztNV~g0JRl7_7fo7Mq!=ug2nQ#`4ms^vL=q8G7V!)OK)b0vr?B0B(yLhKsWra5MtVD|9m#q z?>S|mF~m-)yaSjRygxsCJq5L9Cd1#V{==;#8*Vp61L?m+^C28ZJVL>Jkgpobokhk? zv^lB_6#>GbhTkg?UyGfnM^in>gq^&*>a%r3XE^@Q$dg8gE*9G-3_<&^`E-}vN4sU9 zQR7^_t!|mtw;XX$0Dvg+_vdii|N z_LH8(@|9(Iu~_Su#%ikV8FntA2%zt1bygGL#ZC1#7V zJ%MMlXT9z@jhQbp2ANO+=CO-oCawBTQKW6=lJP6CHP0^``>BIX@VyP|wjz|jVkPiW z?(aHd+Z^w|pbTK#dl1|f#U1n8E(Sf4Nd5t=mC2YII@7xt`9mfuvQQ2F+lPqQ9CskW zgp;Cnd6yCZBtKGgTG{+ObR`rSJV!FCLCjGDpRr?0m*ZVf6JfNaJgMENmMV6OLUfJ9 z5YLv;1%FPKy-(RJA&-lz()KT9%6{bH2X#+^JZZYmG8u_n!(l&~HOlYqG=s$-<}BlYdDt{Eic+L z51sZ0jk{CpHhfB0x1aTHA6g}mFGwTx4v8R#%}c@^Z2%nuuE_|l>0EA^Mx4_Kk0 z%3o3C4-I!|9%C{U{5T{EBO!V+KY?+1m2Q&FUL8btnl%;1Ybyy1R-G{ZpDexQq~#Fn2kxS$$??Te0uzsjG=Pc1 zjbmipy)rfp%Rbq+OsQ0=T!>e)lrWSPP$6|cJ*+C^ei zPfauhR*q!ItKfzT(?o(Jh%PxIo)MDZ1(4q!I#4=#8N)W*@=~lP%Q9^zVn#pV*Wb3U=q&o;bq)u;(X)g>jI~a~sqE zA{6So)nX-1$C*X@TGjUazx|p@SXXS)RD0LFV&MuT2z=EIbl}p$K*}LMdWQ9>R!wE( zwf4U6R(I&-7i1qHM8s(w6}D?8a*xo}2S4qYM_>PJQ@)2^o)z)CR(cZoJyC5@f9aB3 z2f0J5r@Ya$tW(kZTI5@J!m%o6#8%A!WhDv=@oT^Eo~}@x?E0Q8PsGE>QRIJY6IHvo zhVhaOyagU8IT7l;DHj1zCyJ|=jjY2CaBfe5HI7reX|6$V0&hGh#y?;!_{HvyaUI<% zx+D5C$31wkAO~KX9DRz#pusI{X=_9xQ2j%OxEt%_&1*22<6I}$$;-H>{3@IQ5xa@p z!^QZeDjd4kZ_xj#hN%uUJm@C|0qJQ20YUixY8YEfyZ=oQ!)NWhA)dH%qfRAh3x`4k z_Dd1DUq^j^V#xbss>EpLI4JT23^ra^<_9kT(m0gzwo_Z`ozv?NW;_0uAy%1`@$~x7 z*?(sDh)}R#_gOplwZS=&_%k=E>{g_kJXH(s;qML2UHoN@++KXLfPa=r0{-w*Xjl zh3nq@vrQ*BvOfX+$PS%oF^o;SNi1u{$^PKq-Wsf$pTp_tLTvD?$KS#_vs%S#EO&HZ zl8PejGF6ZA7?y6vUE2{4`mNsq@N;9la2Tp}N~@Fkb-+CE#)`|i;C@diqL3{QY1T)R z(P|Gqc;KYKMHOib7S~&1N=V&NX902HKkm1mZavXY7HBn@nxpY6>>s{#6MJAN?}U?O z7Q`~TvO+P=6%%Xwjl2fJqpVl{)Hv@B?kujP#2xIaF-FY2&1mLHe{6V)v z$IN$Ucnvk4bBwsq9bU)m5uf%BFrY$A3J%`;;m^vf7eBdak9}tiOrB!h@d8tcoaQkA z9{sYToT~oI@P2@fMI_pwQ=LaqQ^4dMs{;D=Ij6K)QLi-)igg{9?CyD{XCGxeg2 z9dDC~gub@Oe&Ni|s7Y?Ygi8i;bA{#bh{lPm2r@s*&UgH*V^u;7a0G~P`{#*&88CsG zP;$X%)8Al6(@>WFjf5{Zz)YK~-Zf7Mnea(9YY~BFz+&XmDJ_<_RY0V(1>?yf^Q>kQ za+tj6_o%hETy$68C$l7(5ygJ5*NA_$dN}R4*)(d1T)_FYT~qQYP9_19{qU~~G==gz zvQm&R{HW>&7nk>va|;knd~6ov1a-oW{B|VeuA+X4zW%thiG;|aNw{1;IrjpU})ZBu1-owhUxx#tA ztTNpLG%lGzM8yT2^1Yy?5*Pz6wPF%xDeiCD~EV`^=l zT1ZFtg2$>-NE}NmTfq=e-2qb&{0#Lbu#uNJ76}nSD>cyYcJ)3(saY#}9QyLN^Ny`n zWWg&NPKB%orIr)u(s_ny@9?q{`%++$FK!E%QQjMd&Z;2WcEL?>GeU!ruVIYdX3_dF zN0Egk2rDcL4gg;hc8zZ?UX4Q^qI#?Fz|$n<07j`;VCbGNK69a0qA-h5DM58ZdLC(xfe=@z4jYsB0c?~&QQk3dzF5tc(ZXy#{E zCHo+WN=GJZ*ja^K4OOg%unbTYFm>KwqrPn?u6=k_kDogYbHF*eZrb^&7PGNM_*gG$ z2WpIA7K!U0RTIm_^pfGR3Kd2|oM3P|c^qUdC?-wMws^tJ1Hf{JzMeY_Ybml*ptJiR z;nYYM0S09$9-6Cywnc9$1Ibs0wwACZibnHDiDbV8&C*vHJMH(yIDA{88`8c%&ql;1 zlTSWg6x4#9mw6X=C*iQj7%bys>C-YwKHM%+WxN>-d{Wuzyk@5my;K^Xo_VcU45bR` zOhY;@>Kyrv09-+P>eP%mF>Es(HD^Fy&P6OL zWL`%00m(ZyANW+^eB@oQGd*nSE(g6&AE;gGJr`xKc@c>?=~h*OMqkSDYvE0yflRvy zNY%8!^crPPX-%Oy{9U&zQRFBI%4mAxMaj1#5IO?G4%@Ip%SaGQZ{QSEJ}69udAWez zg~fOa_rffgq$5bk{Y(KmoOe`5O+XSjO{+;;HJi~B6u!NTZnNC>yrp2+j27WtdeG$I zF8{vq96AHSMC3yZ*E&t7?V+p_IYhk$(9z9z-VAdxd5@}6cp&Q>xF!4(O(rNpR(p-{ zAIZOOE{IYy*cUF1ZomNdf%e*A`H&{{$*t+PRI-V8*7Skrb?yPV2}76}zD5p&#;**; zryKE35KR^wXyz0dU$?vbA@yHelbBj!q1->O_XHO4!E`;z`+KF5^ZmZ_kJ11jF#Bh2 z^5V$rZ(eEiJ`CG&Y&hf7ji3qxX7@}80=pzp@LfsS`Bzj=_gzUQyIT*~KZo;UziC_f zvUk~!Jt9B%Rr~w{({;FJC_t_Ih<=rH$DhmZosV4MWax;F70+W{XXhB+O+RDcx*{X` zSY7Q%ny#~Ph!Ln_aPW+_1lr-n?>?J z#ya&3Iq4Tah&x{w99ezAJ~iK1#*9Yt^UWB&R0Sd|A3n;v3+fB7CXwJ#mj8N#m-C~QckEmB1bdFaCi+5G3n6{bWZ=d>yC&s$^D1$f(l z)fdrtNmb;F&GaX2&NpNj9HfbB$ci5(9vJsDo=Qa7P02sP9`4PkPA=Ey;vfPa*zc12 z*I!Mp^>bvSVjX3?+VS)^TMKL5eV?I^Hl@=#F@6@XRMtuz{nOQ~?oV}S;8d%J>gqU& z2TbctBTu6sdkopVWc`A4to)2G37XG)p-a&HrhClwsF;>QUH46V(Gm^vq9)_gkJ3S6 zK3Y5@6*c8$Qv=;NYdB%XkqZ5yYR&SD3(q(imZl(xDwR^weHBeGGPw(p5i0YcmVXHg z=N4vw-UJt1cB-aA_e-4D)wbfu&3hM_KATt)=D&7>uto=%ix2+|^2mzzl^l`6&7e}Y zBa;AakY8w{&;FAc5``J96Cb1^2%r_=L(62vJK)VvM)T>4? zvf6sXGLR?fSSfw)brGUm2^ZEJP_>=qw- z+Q|q|SKDu%<%j3O47Xp;Zy^6(hU4(*7NXzh{5{lr&r^1aqRQ~=3LJ>iC@>&CFrt75 z#c!FGRvH6_5DL3~zS4jOd$4!##L;Lu_OZ`-&b))jva~TImc-%up26QoVb%!{HEORvd+xR79OI$VS#P5@UpQzV!!=JC zf?Ba}5V}~Nhj-e=yMx~(k7%eLOtJF*{9Ff@vQ=M+SuaPV4;b=&N$u^r(OBTezR%(6 zzhz5x6bw9=_w6Ej8#6#@DkNV1U6iL=fx{$C5AfC&x1X?!n)D*Yz)~#Q?WM(Hf3sk5 zV`Y@N$_B)peatK_(46|U->e?DByktA?W|4#069*KZ@KhMjOC}Nd$t&2Dy^odptS8~ z`~=LYB}yqWAWe3gKaeY!CsU2InT1pVnOyDx>22M{%{FA1?8Q3TuxB7k1AGO8rq8$XGUt$;zYDy`j@;GkBPJ|t0}*1 z(pAN3GJ2k1Tdy?76~u96XSA^cMs zy#pPUNakIF=Rxj~j6upI~TFj4%PMKUA&V5wS(gdvZLH zLwmtLqf1-#W}KT=g_A{+{xWZi^(PE5dYIZ|zff|~gm7_&(dp~K#@HYS=HSJCvtmcN zE%!$azMOaZ?Ic3Ot1$F}XjZbz!MIw5Yy%5`L7!BmF;U}rp$K_G&i}H-%4IxgMH*OJ z&BDrb;eq~Yo(ym%5Vu!^wS9y?cA?>aCv#IZc1+}EWYQk5VFDkL*)}<eoISrAS=} zcOEw=MO!!?d{r4;_qGOBh8mE66Pirz$MW87R`AU}UEatn_2k+l6;879I5H43m;+U) z5tL^wu;aGAZZwHd*_h@+tJU(Zt)z=sQg=y9Fd4=uIz;3?m|ornD-k@}U%ImAYju6o z?QC5m?TCnrEZdRMeuLX}&^9czAnR8@b?bIfJ?%32I2`YXIGpDvyleCDzY5$vgsi?;AkYTlex)}N zvxYGg#}G!0sto=r6ZADU<)cC^Ch5E+jQdDVcaYK@T{aHfMZNVp_D<6c|(GdSqX!Er3U1d5HmQ0NBbp#D?*4 zQj5s?V3>_PPdz%go|73^Q5VwtCB0uo-^>U?p)4_NyfAed4Ifv`RT~+57Lb3ne^~%q zgf&3;(fOiU%c;7!JDn=6VAL;jNeGY`SyhFtE1~gE2FVeTtpQlL0N@4|OVy(r#akr= znOBKmZDGbK!Mny>obe$GCk$&LQSw_vAkr=C{3koxG_%x;#OJ4~Vr_3+^?b-5KpcPq zA6n9G#rk1MchH(6OWqg#7z0-k!JlrF!U-xmb+?%EZAE^|H5j<^1R2J1g5s9+zE5~UQ3QFo< zd%nkP(A=S~I?u`SUQUFs<$r?vA-r8Dc^$3(qeUqzAzxxg4De8&nITrLUerD-G0r;| z*lPMA=eG8@3K|f}?@xn&&!ge5N5_-LmzXIK>E~^8EN~wdh!6fj&P`rf@7nd#&R8?b zfQv(=d9eyo(Oy0wuNtI0r$RhY^77HUZUB4I=yyDI|2vMeMIw*t}RVi{o-F+>`^AIT?UM6o$034UEcNmN;1d6t&BM&;sOrGo!lQHJEEW| z9|}cz5%HACuXV8}%4h;sWVh-ww*L8|>yn$v*U>M4ILN@b4`>H-4SzwCag;qJi(%pm z++xIM4tHyFJR}L-;8pBL8+Hso&GK>=+vNw2Uw;tJ26*AMBM6esCgenXp+WWdldTMk zm@qZD^B>|XK3WB_3!W?_|0Z>a;UMW!TqmWeO}cf-8}34VzSqpS>U5m1BCO;Sb~RG9 zTye*EqbCrl^8cM&jVEwjBy$3d-kV38Y=ntzm})d$F8X46LQII=QKdgJ59}fjih*tj zCLydG%S?V)1MGWt4N>(;$(EB!#a{zh)9VbEDge@Jjaa_zK!$iEcD23S;h>{>DWbG!DDu0(Nx;s>9!7fnTS5Ii{trH_QlEoW^(2hwLFI7v%ZZ}TE(|sger1G9Hdy$;n59;k%hi(t~9l0Hm1V%*QP7Q zIPiQ@PA39(MR~IG^E3{=ceh8m#$yd|)3{L*U^5uH#^4}aUz>kwF=rzwXJE$Q8E-Q* zVJ*2Tf-I>l*pq}Hh2s{SY3-6%mL%+iKDkNe<~15{9ujHyI^PWQWSG;k^loOG^_DGy zmUACkfkh##1#lRrNJ8Q@8vBZaJ7); z2vxAD421gYNnnrsEkR%QUfV4YRh_zcgezBp;r``QyevdJEf+J8K9~m0yE}dCEOxIj z5^lA?6dG&8z^lSd>o!7W(sV)Qkelq)G#KxD-=#1cbOx)w&#y)Knd)#ivg*qfZ=+z@ zpBHBLf9|%F?b|z9q?Bly$8v}OqEjVy=Fm8=)M_ zZ1P1jlC{4He|2M$lsvM~$DkI_PktS;x^C%@dmwmSrLA^P&VPj02%0X4nC?0`X=5Bt zh5UN!?3#&z&82WpmLid7QewYHnCR#_I4YhEm$$NLZZL;)6GytvXPAiqxh!QVGS3J1 z^dV_?s=H)|x$YdTZk`I4_r}=p;sfAH_ct@aqFaEF_Um=?&&1cosTj~;K0WcU*QIlQHkD>jr;rlMyu3tKC}%Rh3-R+ zMyXUuB;L?jvj4Z*G$q-rkoCBI zvMjc~(GCJ8>afRhvn4`OmEGoHg>u)dblffaNEt52NSoRU!|+w^wJ?ErYQWHz?W%H@ z7&VgkkxgL@o${|HLD@XtRDPhk_5`+UjjF|W;3e9TEE7~n8B5`5!2PMV)tvqJPRTUYhLKDe7=?xkd2+bw>lQ@uFh~81 z=M41@N<=V}M|$h#8(-*m?)^ykb0d@V%zada6fx!&>J!3)r+x^2M_p!6AmY;K)Y2-i zgFd`4F-za2!Mx*jp;^Bg-G&5`PV+T>ZQ3G&g5?aRMB)HyO%G2kbb2vM_h4nQ5{>P# zZqs#}=ZWh_md$VBRs|C0PI|eu#6QV;P*jT!M9O9CRgjXyV9i_+`pC8SvydYQVz@+} zoso=Um(Z5{-`PF z;ur0mXM89Vd{lAZLJaZni+=|%8lF@WZN-=eMNHQJ?W;e_{&rBCUIiw@b1BJR>kZ70 z9jSO4Pt=}bQ5#PWnYjXwsIaRG_fmQ#)~b|1eM>@1%Ej^dl(7?|~hs-qz1&^~-mpQYgKb%-hcO2cC{&cbz zJOr20W{k_4!f-bdr&X7NgZ?=7zf+x6!x^KF1+$91FPxzjG*;`39QxTQA!G1~H8i*M zg1B{Stmk%x{uv3zZ$*p= zsell~`|nT9fg~0|-|-=L-K8Vmwgh7JwBshT?ZSXq40~hRXp}Ox3_KWFVJZy$;3pSo z8=6!vN`7LTW#Z|l|HujcV%orKOF&cR!3->%(O>>{Uw@Of9X`~h3mo9mVm4oe$mW$~ zJ>2Dx?Y+Zdoey9KG z$ngWqW;#I|<03qY$c8$xejP$#wVT5qA%3DQ{N*iqZE``-{TVF5-w|CR zO=h?Gk#^7Ett{i02u#4SeHX-*KYFAzT$mA|s-G|bXyMifZ-#lLH~~Uu4bQqQ&S$Vn zym=gkeAL>lMp{n?6s?Yb?rJ#&-~wDu|NhwY4vun=Wi_%8x9q(`2bCAo9LV)4R#7F) zMCZVqBJN5>)?2gH#Y0V#9!r;_p(B|znragYX2I)jsPMOr_mFntJ$!$1-O?!)?=pf226wc)+3oHK52)TK7&hp9<2vnJ_bAWyS$eyB-Uf>Di*(c7O8}h>ZPVAD*uIt z`T%Z2_5kE$Bm~o8k9+w;xg&I>?XMDHXW1}D&7s7K9d;R7cP!>|4@OdxVq87@0?|Md zwQ;b!83d`!Sz4w~OWCROU(hXKQ>O}c3Ag7U&B$TKR6UZ%3I6JM2(VNqm48HX*t7g! zW+eQJD(*JdGrIVt{>C{?qA`)BecfOw)$lEkn+KwIgaUx9r~_0 zSp_wvthDqup{EBPmXu$@d^c7y>{hji@V~^8$f6|5!e(##P`r>4%ZRp-Rk=szoO;vy`KwIx6_n<7 zyE0(vlg}>M9bmN!MvTXwWvlRPA$w~W7m6PfEtXMY{r+;5!3zjDXv)7U_4D`r{lKpJv-`PDE!!+}umXdN9gf7kxF_q-!^(eJe_g=A z0N&+#kk&l$_3nRhMMvOg6?9;rpc>Gipb-DtNnz;d2>k!ZqUmZb*ECKvJUM3^%ijp_s`pCMTp!Inx*RD(5RCI4gw88 zw$=Ka603-%BGL)vR~URo^E~T6r;1_JK%o6m(Ahn~6;JR$6`zqVo5$>LgK|LRFojy^ z$E-48x@`lZVu^aD%=xyR*I3VY_&}N{)(^L$h0tNf}v@cfb8 zV-97#{IzvJDuQG(H95U%{{hiLSAs4r_M?hchT$Y`dsbM}VUZZz9EEi>KSj@7v=^$F zasy|;HKHwPQ+B|}s+iZLqT{orcRJO@i#Y<`*RTy(a+bl_?z?xmh*o(ejZ)FHEssNo z#he3jCgdlIGJa(#1<78ls(utTO5$bk&V{K1g_`Jqh^kX4b5aa~yx=V}&kkQ@&DfV6N z%vh_ucc0_gR|$yj8Qb#A%y%q3+&t=p`Wl}vb0$d*4JWjt;%~IX_2~Vx{Qp$ST+dT0 z9}=ogc>ZC(E)#&bantL4q_qt5Ve+>*UA{*+bO|BcvbuZb@itzxH(YW~`+j#tKd_c4 zxY^h=`&w)GD*3S!_Fj1oct-yp&(~x=t(3*cy2d3m6qE(Re^x3*QDG4oQD$qS|0q;R z*EJe6cQyYTfgGAkEaT1ee%nIeGPZbFhA0w52odW5*q4%VVCD>nTG-+j5CxAQ${20cT_RC zVXLB&&?fvA^8>;FNvj({jOg4iQKRgO^xU7z|56JU6m~Ogd@cMvr*P^Qoiu8aiEVtH zajc$?+~{Evhu@42mO6@Xhzl#6X6IA6Q&;z3Ja(SXo(YNwZxcD*!!gz9!5it5WNuR5 zor~EPg>t`eE`Ff~>-HU61S5aF2~Cn4Wm{OHYXV-5Bm?%KkC++0Y+9_jsSl>; z2BL`_1hy9I)NlSb7VigL>&p(qk0@fF7aTscvC2Mn0dCZ#sJIjykKbwsF)CC@fr?IY zG3Zo9$H3XQ9|s;RL$@zwl-kQw%*~5urP&+iJUG0kWcqtv zSmqcFBFgP(Qp)4D5DEWDzpv*w?Tf}iLD|Z1p}wMcoq>(wn~V>+Xw-Meu$p0sp-E_K zm}mNvz$TisI*;J@ox~6KLzliULt`pQOwEBu7rW6VOgH$-A3QE{RY>|e^l(?P@JP5~ zIC0!}fylcG#(B0ZLZsJJqA}+nq~0hf{5uj0yVIm8Vo?i(&?~4f4r*!>*$0N zqWwETJ@&zw{2yj|tc?pX*FTT`-A;=C23?1OdV{D#<#`vqA=m#Cwf}W3hG~K+nesKw*B+ISXx(-_kP;3-(5N2 KK+gZ{@&5o%i|`l# diff --git a/examples/MultiSeriesLineChart.html b/examples/MultiSeriesLineChart.html index 89084caa..411a2301 100644 --- a/examples/MultiSeriesLineChart.html +++ b/examples/MultiSeriesLineChart.html @@ -20,37 +20,21 @@ return dateUnix; } - d3.tsv("data/data.tsv", function(error, data) { - // console.log(data); - - var data2 = d3.nest() - .key(function(d) { return d.date; }) - .entries(data) - .map(function(group) { - series = group.values[0]; - return { - key: group['key'], - values: [ - {key: "New York", value: series['New York']}, - {key: "San Francisco", value: series['San Francisco']}, - {key: "Austin", value: series['Austin']}, - ] - }; - }); - console.log(data2); - - data3 = [ {key: "New York", values: []}, {key: "San Francisco", values: []}, {key: "Austin", values: []} ]; - d3.map(data).values().forEach(function(d) { - data3[0].values.push({key: dateConvert(d.date), value: parseInt(d['New York'])}); - data3[1].values.push({key: dateConvert(d.date), value: parseInt(d['San Francisco'])}); - data3[2].values.push({key: dateConvert(d.date), value: parseInt(d['Austin'])}); + d3.tsv("data/data.tsv", function(error, tsv) { + // Convert tsv to d3.ez data format + data = [ {key: "New York", values: []}, {key: "San Francisco", values: []}, {key: "Austin", values: []} ]; + d3.map(tsv).values().forEach(function(d) { + data[0].values.push({key: dateConvert(d.date), value: parseInt(d['New York'])}); + data[1].values.push({key: dateConvert(d.date), value: parseInt(d['San Francisco'])}); + data[2].values.push({key: dateConvert(d.date), value: parseInt(d['Austin'])}); }); - console.log(data3); var colors = d3.ez.colors.categorical(3); - var chart = d3.ez.multiSeriesLineChart().colors(colors); - var legend = d3.ez.legend().title('Cities Count'); - var title = d3.ez.title().mainText("Cities").subText("Count"); + var chart = d3.ez.multiSeriesLineChart() + .colors(colors) + .yAxisLabel('Temperature (°F)'); + var legend = d3.ez.legend().title('City'); + var title = d3.ez.title().mainText("Average Temperatures").subText("Per City"); // Create chart object var myChart = d3.ez.base() @@ -60,11 +44,11 @@ .legend(legend) .title(title) .on("customMouseOver", function(d, i) { - d3.select("#message").text(d.temperature); + d3.select("#message").text(d.value); }); d3.select('#chartholder') - .datum(data3) + .datum(data) .call(myChart); }); diff --git a/examples/TabularHeatChartExample.html b/examples/TabularHeatChartExample.html index 9fb2871f..19391754 100644 --- a/examples/TabularHeatChartExample.html +++ b/examples/TabularHeatChartExample.html @@ -14,11 +14,11 @@
Value:
diff --git a/examples/TimeSeriesChartExample.html b/examples/TimeSeriesChartExample.html deleted file mode 100644 index 5eb456fb..00000000 --- a/examples/TimeSeriesChartExample.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - D3.EZ : Time Series Chart Example - - - - - - - -
- - - - - diff --git a/src/d3.ez.js b/src/d3.ez.js index 081a5c0a..e7888fcf 100644 --- a/src/d3.ez.js +++ b/src/d3.ez.js @@ -10,7 +10,6 @@ include('js/circularHeatChart.js'); include('js/tabularHeatChart.js'); include('js/donutChart.js'); include('js/punchCard.js'); -include('js/timeSeriesChart.js'); include('js/multiSeriesLineChart.js'); include('js/htmlTable.js'); include('js/htmlList.js'); diff --git a/src/js/multiSeriesLineChart.js b/src/js/multiSeriesLineChart.js index 060e012e..b45cdeb0 100644 --- a/src/js/multiSeriesLineChart.js +++ b/src/js/multiSeriesLineChart.js @@ -17,7 +17,7 @@ d3.ez.multiSeriesLineChart = function module() { // Default Options (Configurable via setters) var width = 400; var height = 300; - var margin = { top: 20, right: 20, bottom: 20, left: 40 }; + var margin = { top: 20, right: 20, bottom: 30, left: 40 }; var classed = "multiSeriesLineChart"; var colors = d3.ez.colors.categorical(3); var yAxisLabel = null; @@ -26,6 +26,7 @@ d3.ez.multiSeriesLineChart = function module() { // Data Options (Populated by 'init' function) var chartW = 0; var chartH = 0; + var minValue = 0; var maxValue = 0; var maxGroupTotal = undefined; var xScale = undefined; @@ -50,10 +51,13 @@ d3.ez.multiSeriesLineChart = function module() { return d.key; }); - // Convert dates + // Convert dates and calculate min / max data.forEach(function(d, i) { d.values.forEach(function(b, j) { data[i].values[j].key = new Date(b.key * 1000); + var value = data[i].values[j].value; + minValue = (value < minValue ? value : minValue); + maxValue = (value > maxValue ? value : maxValue); }); }); @@ -65,12 +69,13 @@ d3.ez.multiSeriesLineChart = function module() { yScale = d3.scale.linear() .range([chartH, 0]) - .domain([0, 100]); + .domain([minValue, maxValue + 10]); // X & Y Axis xAxis = d3.svg.axis() .scale(xScale) - .orient("bottom"); + .orient("bottom") + .tickFormat(d3.time.format("%d-%b")); yAxis = d3.svg.axis() .scale(yScale) .orient("left"); @@ -108,8 +113,7 @@ d3.ez.multiSeriesLineChart = function module() { .attr("y", -35) .attr("dy", ".71em") .style("text-anchor", "end") - //.text(yAxisLabel); - .text("Temperature (ºF)"); + .text(yAxisLabel); } else { chart = selection.select(".chart"); } @@ -122,7 +126,12 @@ d3.ez.multiSeriesLineChart = function module() { // Add axis to chart chart.select(".x-axis") .attr("transform", "translate(0," + chartH + ")") - .call(xAxis); + .call(xAxis) + .selectAll("text") + .style("text-anchor", "end") + .attr("dx", "-.8em") + .attr("dy", ".15em") + .attr("transform", "rotate(-65)");; chart.select(".y-axis") .call(yAxis); diff --git a/src/js/timeSeriesChart.js b/src/js/timeSeriesChart.js deleted file mode 100644 index b6641d8a..00000000 --- a/src/js/timeSeriesChart.js +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Time Series Chart - * - * @example - * var formatDate = d3.time.format("%b %Y"); - * var myChart = d3.ez.timeSeriesChart() - * .x(function(d) { return formatDate.parse(d.date); }) - * .y(function(d) { return +d.price; }) - * .width(600) - * .height(350); - * d3.select("#chartholder") - * .datum(data) - * .call(myChart); - */ -d3.ez.timeSeriesChart = function module() { - // SVG and Chart containers (Populated by 'my' function) - var svg; - var chart; - - // Default Options (Configurable via setters) - var width = 400; - var height = 300; - var margin = { top: 50, right: 40, bottom: 50, left: 40 }; - var transition = { ease: "bounce", duration: 500 }; - var classed = "timeSeriesChart"; - var color = "steelblue"; - var xValue = function(d) { - return d[0]; - }; - var yValue = function(d) { - return d[1]; - }; - - // Data Options (Populated by 'init' function) - var chartW = 0; - var chartH = 0; - - // Dispatch (Custom events) - var dispatch = d3.dispatch("customMouseOver", "customMouseOut", "customClick"); - - function init(data) { - chartW = width - margin.left - margin.right; - chartH = height - margin.top - margin.bottom; - } - - function my(selection) { - selection.each(function(data) { - // Initialise Data - init(data); - - // Convert data to standard representation greedily; - // this is needed for nondeterministic accessors. - data = data.map(function(d, i) { - return [xValue.call(data, d, i), yValue.call(data, d, i)]; - }); - - // X & Y Scales - var xScale = d3.time.scale() - .domain(d3.extent(data, function(d) { - return d[0]; - })) - .range([0, chartW]); - - var yScale = d3.scale.linear() - .domain([0, d3.max(data, function(d) { - return d[1]; - })]) - .range([chartH, 0]); - - // X & Y Axis - var xAxis = d3.svg.axis() - .scale(xScale) - .orient("bottom") - .tickSize(6, 0); - - var yAxis = d3.svg.axis() - .scale(yScale) - .orient("left") - .tickSize(6, 6); - - // Setup the Line and Area - var area = d3.svg.area() - .x(function(d) { - return xScale(d[0]); - }) - .y1(function(d) { - return yScale(d[1]); - }); - - var line = d3.svg.line() - .x(function(d) { - return xScale(d[0]); - }) - .y(function(d) { - return yScale(d[1]); - }); - - // Create SVG element (if it does not exist already) - if (!svg) { - svg = (function(selection) { - var el = selection[0][0]; - if (!!el.ownerSVGElement || el.tagName === "svg") { - return selection; - } else { - return selection.append("svg"); - } - })(d3.select(this)); - - svg.classed("d3ez", true) - .attr({ width: width, height: height }); - - var chart = svg.append("g").classed("chart", true); - chart.append("path").classed("chart-area-path", true); - chart.append("path").classed("chart-line-path", true); - chart.append("g").classed("x-axis-group axis", true); - chart.append("g").classed("y-axis-group axis", true); - } else { - chart = svg.select(".chart"); - } - - // Update the chart dimensions - chart.classed(classed, true) - .attr({ width: chartW, height: chartH }) - .attr({ transform: "translate(" + margin.left + "," + margin.top + ")" }); - - // Add axis to chart - chart.select(".x-axis-group.axis") - .attr({ transform: "translate(0," + yScale.range()[0] + ")" }) - .call(xAxis); - - chart.select(".y-axis-group.axis") - .call(yAxis); - - // Update the area path - chart.select(".chart-area-path") - .data([data]) - .attr("d", area.y0(yScale.range()[0])) - .attr("fill", color); - - // Update the line path - chart.select(".chart-line-path") - .data([data]) - .attr("d", line) - .attr("fill", "none"); - }); - } - - // Configuration Getters & Setters - my.width = function(_) { - if (!arguments.length) return width; - width = _; - return this; - }; - - my.height = function(_) { - if (!arguments.length) return height; - height = _; - return this; - }; - - my.margin = function(_) { - if (!arguments.length) return margin; - margin = _; - return this; - }; - - my.x = function(_) { - if (!arguments.length) return xValue; - xValue = _; - return this; - }; - - my.y = function(_) { - if (!arguments.length) return yValue; - yValue = _; - return this; - }; - - my.color = function(_) { - if (!arguments.length) return color; - color = _; - return this; - }; - - d3.rebind(my, dispatch, "on"); - - return my; -};