{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///britecharts.min.js","webpack:///webpack/bootstrap b0253ca21a6a1a4c2341","webpack:///./src/bundle.js","webpack:///./src/charts/bar.js","webpack:///./~/d3-array/build/d3-array.js","webpack:///./~/d3-ease/build/d3-ease.js","webpack:///./~/d3-axis/build/d3-axis.js","webpack:///./~/d3-color/build/d3-color.js","webpack:///./~/d3-dispatch/build/d3-dispatch.js","webpack:///./~/d3-format/build/d3-format.js","webpack:///./~/d3-scale/build/d3-scale.js","webpack:///./~/d3-collection/build/d3-collection.js","webpack:///./~/d3-interpolate/build/d3-interpolate.js","webpack:///./~/d3-time/build/d3-time.js","webpack:///./~/d3-time-format/build/d3-time-format.js","webpack:///./~/d3-selection/build/d3-selection.js","webpack:///./~/d3-transition/build/d3-transition.js","webpack:///./~/d3-timer/build/d3-timer.js","webpack:///./src/charts/helpers/text.js","webpack:///./src/charts/helpers/exportChart.js","webpack:///./src/charts/helpers/colors.js","webpack:///./src/charts/helpers/constants.js","webpack:///./src/charts/helpers/serializeWithStyles.js","webpack:///./~/base-64/base64.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/charts/donut.js","webpack:///./~/d3-shape/build/d3-shape.js","webpack:///./~/d3-path/build/d3-path.js","webpack:///./src/charts/helpers/common.js","webpack:///./src/charts/legend.js","webpack:///./src/charts/line.js","webpack:///./src/charts/helpers/timeAxis.js","webpack:///./src/charts/helpers/formatHelpers.js","webpack:///./src/charts/tooltip.js","webpack:///./src/charts/mini-tooltip.js","webpack:///./src/charts/sparkline.js","webpack:///./src/charts/stacked-area.js","webpack:///./~/lodash.assign/index.js","webpack:///./src/charts/grouped-bar.js","webpack:///./src/charts/stacked-bar.js","webpack:///./src/charts/step.js","webpack:///./src/charts/brush.js","webpack:///./~/d3-brush/build/d3-brush.js","webpack:///./~/d3-drag/build/d3-drag.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","colors","brush","step","stackedBar","groupedBar","stackedArea","sparkline","miniTooltip","tooltip","line","legend","donut","bar","undefined","_bar","_bar2","_donut","_donut2","_legend","_legend2","_line","_line2","_tooltip","_tooltip2","_miniTooltip","_miniTooltip2","_sparkline","_sparkline2","_stackedArea","_stackedArea2","_groupedBar","_groupedBar2","_stackedBar","_stackedBar2","_step","_step2","_brush","_brush2","_colors","_colors2","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","__WEBPACK_AMD_DEFINE_RESULT__","require","d3Array","d3Ease","d3Axis","d3Color","d3Dispatch","d3Format","d3Scale","d3Selection","textHelper","_require","exportChart","colorHelper","PERCENTAGE_FORMAT","NUMBER_FORMAT","_selection","each","_data","chartWidth","width","margin","left","right","yAxisPaddingBetweenChart","chartHeight","height","top","bottom","_cleanData","cleanData","data","dataZeroed","buildScales","buildAxis","buildSVG","drawGridLines","drawBars","drawAxis","enablePercentageLabels","drawPercentageLabels","isHorizontal","xAxis","axisBottom","xScale","ticks","xTicks","valueLabelFormat","tickSizeInner","yAxis","axisLeft","yScale","yTicks","buildContainerGroups","container","svg","append","classed","attr","percentageAxis","Math","min","percentageAxisToMaxRatio","max","getValue","scaleLinear","domain","rangeRound","scaleBand","map","getName","padding","colorList","shouldReverseColorList","d","reverse","_ref9","name","color","colorSchema","_ref10","colorMap","item","filter","_ref11","select","originalData","reduce","acc","valueLabel","String","nameLabel","concat","wrapText","text","containerWidth","wrapTextWithEllipses","yAxisLineWrapLimit","selectAll","drawHorizontalBars","bars","enter","bandwidth","_ref12","on","handleMouseOver","handleMouseMove","handleMouseOut","merge","_ref13","_ref14","_ref15","drawAnimatedHorizontalBars","_ref16","_ref17","_ref18","transition","duration","animationDuration","delay","interBarDelay","ease","_ref19","drawAnimatedVerticalBars","_ref20","_ref21","_ref22","_ref23","_ref24","_ref25","drawVerticalBars","_ref26","_ref27","_ref28","_ref29","_ref30","_ref31","labelXPosition","_percentageLabelHorizontalX","_percentageLabelVerticalX","labelYPosition","_percentageLabelHorizontalY","_percentageLabelVerticalY","_percentageLabelHorizontalFormatValue","_percentageLabelVerticalFormatValue","percentageLabels","percentageLabelSize","isAnimated","exit","style","remove","drawHorizontalGridLines","drawVerticalGridLines","maskGridLines","xAxisPadding","drawVerticalExtendedLine","baseLine","drawHorizontalExtendedLine","e","dispatcher","mouse","_ref32","darker","_ref33","singleColors","aloeGreen","percentageLabelMargin","horizontalLabelFormat","verticalLabelFormat","easeQuadInOut","animationStepRatio","dispatch","_ref","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","format","_ref8","parseFloat","_x","arguments","filename","title","apply","hasPercentage","usePercentage","global","ascendingComparator","f","x","ascending","pair","a","b","tickIncrement","start","stop","count","power","floor","log","LN10","error","pow","e10","e5","e2","tickStep","step0","abs","step1","NaN","bisector","compare","lo","hi","mid","ascendingBisect","bisectRight","bisectLeft","pairs","array","n","cross","values0","values1","i0","i1","value0","n0","n1","values","descending","number","variance","valueof","delta","mean","sum","isNaN","deviation","v","sqrt","extent","prototype","slice","constant","identity","range","ceil","isFinite","sturges","LN2","histogram","xz","x0","x1","tz","threshold","shift","pop","bin","bins","push","_","thresholds","quantile","value1","freedmanDiaconis","sort","scott","median","numbers","arrays","merged","j","permute","indexes","permutes","scan","xi","xj","shuffle","t","random","transpose","matrix","row","zip","bisect","thresholdFreedmanDiaconis","thresholdScott","thresholdSturges","linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","sinIn","cos","halfPi","sinOut","sin","sinInOut","pi","expIn","expOut","expInOut","circleIn","circleOut","circleInOut","bounceIn","bounceOut","b1","b0","b3","b2","b4","b6","b5","b7","b8","b9","bounceInOut","exponent","polyIn","custom","polyOut","polyInOut","PI","overshoot","backIn","s","backOut","backInOut","tau","amplitude","period","elasticIn","asin","elasticOut","elasticInOut","easeLinear","easeQuad","easeQuadIn","easeQuadOut","easeCubic","easeCubicIn","easeCubicOut","easeCubicInOut","easePoly","easePolyIn","easePolyOut","easePolyInOut","easeSin","easeSinIn","easeSinOut","easeSinInOut","easeExp","easeExpIn","easeExpOut","easeExpInOut","easeCircle","easeCircleIn","easeCircleOut","easeCircleInOut","easeBounce","easeBounceIn","easeBounceOut","easeBounceInOut","easeBack","easeBackIn","easeBackOut","easeBackInOut","easeElastic","easeElasticIn","easeElasticOut","easeElasticInOut","translateX","translateY","y","scale","center","offset","round","entering","__axis","axis","orient","context","tickValues","tickArguments","tickFormat","spacing","tickPadding","range0","range1","position","copy","selection","path","tick","order","tickExit","tickEnter","insert","k","epsilon","transform","getAttribute","parentNode","tickSizeOuter","tickSize","axisTop","axisRight","extend","parent","definition","create","key","Color","trim","toLowerCase","reHex3","exec","parseInt","Rgb","reHex6","rgbn","reRgbInteger","reRgbPercent","reRgbaInteger","rgba","reRgbaPercent","reHslPercent","hsla","reHslaPercent","named","hasOwnProperty","r","g","rgbConvert","o","rgb","opacity","h","l","Hsl","hslConvert","hsl","hsl2rgb","m1","m2","labConvert","Lab","Hcl","deg2rad","rgb2xyz","xyz2lab","Xn","Yn","z","Zn","lab","t3","t2","t0","lab2xyz","t1","xyz2rgb","hclConvert","atan2","rad2deg","hcl","cubehelixConvert","Cubehelix","BC_DA","ED","EB","bl","E","C","D","cubehelix","constructor","brighter","reI","reN","reP","RegExp","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","displayable","toString","Kn","A","B","cosh","sinh","Error","Dispatch","parseTypenames","typenames","types","split","indexOf","type","get","set","callback","noop","typename","T","that","args","formatSpecifier","specifier","FormatSpecifier","match","re","fill","align","sign","symbol","zero","comma","precision","formatTypes","defaultLocale","locale","formatLocale","formatPrefix","prefixExponent","formatDecimal","toExponential","coefficient","formatGroup","grouping","thousands","substring","join","formatNumerals","numerals","replace","formatDefault","toPrecision","out","formatPrefixAuto","formatRounded","","%","toFixed","X","toUpperCase","prefixes","newFormat","valuePrefix","prefix","valueSuffix","suffix","formatType","valueNegative","maybeSuffix","charCodeAt","decimal","group","Infinity","currency","test","percent","precisionFixed","precisionPrefix","precisionRound","formatDefaultLocale","d3Collection","d3Interpolate","d3Time","d3TimeFormat","ordinal","range$$1","index","unknown","implicit","has","band","rescale","paddingInner","paddingOuter","ordinalRange","pointish","point","deinterpolateLinear","deinterpolateClamp","deinterpolate","reinterpolateClamp","reinterpolate","bimap","d0","d1","r0","r1","polymap","source","target","interpolate","clamp","continuous","piecewise","output","input","interpolate$$1","unit","invert","map$1","interpolateRound","linearish","nice","interpolateNumber","pow10","powp","base","exp","logp","log10","log2","reflect","logs","pows","u","raise","quantile$1","invertExtent","quantiles","quantize","date","Date","number$1","calendar","year","month","week","day","hour","minute","second","millisecond","format$$1","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","formatYear","tickInterval","interval","tickIntervals","durationYear","every","durationSecond","durationMinute","durationHour","durationDay","durationWeek","durationMonth","ramp","sequential","interpolator","time","timeYear","timeMonth","timeWeek","timeDay","timeHour","timeMinute","timeSecond","timeMillisecond","timeFormat","utcTime","utcYear","utcMonth","utcWeek","utcDay","utcHour","utcMinute","utcSecond","utcMillisecond","utcFormat","UTC","category10","category20b","category20c","category20","cubehelix$1","interpolateCubehelixLong","warm","cool","rainbow","rainbow$1","ts","viridis","magma","inferno","plasma","scalePoint","scaleIdentity","scaleLog","scaleOrdinal","scaleImplicit","scalePow","scaleSqrt","scaleQuantile","scaleQuantize","scaleThreshold","scaleTime","scaleUtc","schemeCategory10","schemeCategory20b","schemeCategory20c","schemeCategory20","interpolateCubehelixDefault","interpolateRainbow","interpolateWarm","interpolateCool","interpolateViridis","interpolateMagma","interpolateInferno","interpolatePlasma","scaleSequential","Map","object","createObject","setObject","createMap","setMap","map$$1","Set","add","property","clear","keys","entries","size","empty","nest","depth","createResult","setResult","sortValues","rollup","keyValue","valuesByKey","result","sortKey","sortKeys","proto","basis","v0","v1","v2","v3","exponential","hue","gamma","nogamma","rgbSpline","spline","color$$1","one","parseCss","cssNode","document","createElement","cssRoot","documentElement","cssView","defaultView","getComputedStyle","appendChild","getPropertyValue","removeChild","decompose","parseSvg","svgNode","createElementNS","setAttribute","baseVal","consolidate","interpolateTransform","parse","pxComma","pxParen","degParen","translate","xa","ya","xb","yb","q","rotate","skewX","scaleX","scaleY","tanh","hsl$1","hue$$1","end","lab$1","hcl$1","cubehelixGamma","cubehelix$$1","basis$1","basisClosed","rgb$1","rgbGamma","rgb$$1","rgbBasis","rgbBasisClosed","nb","na","setTime","reA","reB","string","am","bm","bs","bi","lastIndex","valueOf","degrees","atan","interpolateTransformCss","interpolateTransformSvg","rho","SQRT2","rho2","rho4","epsilon2","zoom","p0","p1","S","ux0","uy0","w0","ux1","uy1","w1","dx","dy","d2","coshr0","hsl$2","hslLong","hcl$2","hclLong","cubehelix$2","cubehelixLong","samples","interpolateArray","interpolateBasis","interpolateBasisClosed","interpolateDate","interpolateObject","interpolateString","interpolateZoom","interpolateRgb","interpolateRgbBasis","interpolateRgbBasisClosed","interpolateHsl","interpolateHslLong","interpolateLab","interpolateHcl","interpolateHclLong","interpolateCubehelix","newInterval","floori","offseti","field","weekday","setDate","getDate","getDay","setHours","getTimezoneOffset","utcWeekday","setUTCDate","getUTCDate","getUTCDay","setUTCHours","milliseconds","getUTCSeconds","seconds","getMinutes","minutes","getHours","hours","days","sunday","monday","tuesday","wednesday","thursday","friday","saturday","sundays","mondays","tuesdays","wednesdays","thursdays","fridays","saturdays","setMonth","getMonth","getFullYear","months","setFullYear","years","setUTCSeconds","getUTCMinutes","utcMinutes","setUTCMinutes","getUTCHours","utcHours","utcDays","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcSundays","utcMondays","utcTuesdays","utcWednesdays","utcThursdays","utcFridays","utcSaturdays","setUTCMonth","getUTCMonth","getUTCFullYear","utcMonths","setUTCFullYear","utcYears","timeInterval","timeMilliseconds","utcMilliseconds","timeSeconds","utcSeconds","timeMinutes","timeHours","timeDays","timeWeeks","timeSunday","timeSundays","timeMonday","timeMondays","timeTuesday","timeTuesdays","timeWednesday","timeWednesdays","timeThursday","timeThursdays","timeFriday","timeFridays","timeSaturday","timeSaturdays","timeMonths","timeYears","utcWeeks","localDate","H","M","L","utcDate","newYear","formats","pad","pads","charAt","newParse","newDate","parseSpecifier","w","W","U","Z","parses","parsePeriod","periodRe","periodLookup","parseShortWeekday","shortWeekdayRe","shortWeekdayLookup","parseWeekday","weekdayRe","weekdayLookup","parseShortMonth","shortMonthRe","shortMonthLookup","parseMonth","monthRe","monthLookup","parseLocaleDateTime","locale_dateTime","parseLocaleDate","locale_date","parseLocaleTime","locale_time","formatShortWeekday","locale_shortWeekdays","formatWeekday","locale_weekdays","formatShortMonth","locale_shortMonths","locale_months","formatPeriod","locale_periods","formatUTCShortWeekday","formatUTCWeekday","formatUTCShortMonth","formatUTCMonth","formatUTCPeriod","dateTime","periods","shortDays","shortMonths","formatRe","formatLookup","formatDayOfMonth","formatHour24","I","formatHour12","formatDayOfYear","formatMilliseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekNumberSunday","formatWeekdayNumber","formatWeekNumberMonday","Y","formatFullYear","formatZone","formatLiteralPercent","utcFormats","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekNumberSunday","formatUTCWeekdayNumber","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","parseDayOfMonth","parseHour24","parseDayOfYear","parseMilliseconds","parseMonthNumber","parseMinutes","parseSeconds","parseWeekNumberSunday","parseWeekdayNumber","parseWeekNumberMonday","parseYear","parseFullYear","parseZone","parseLiteralPercent","utcParse","requote","requoteRe","names","numberRe","percentRe","getMilliseconds","getSeconds","getUTCMilliseconds","locale$1","timeParse","formatIsoNative","toISOString","parseIsoNative","-","0","isoSpecifier","formatIso","parseIso","timeFormatDefaultLocale","timeFormatLocale","isoFormat","isoParse","creatorInherit","ownerDocument","uri","namespaceURI","xhtml","creatorFixed","fullname","space","local","Local","nextId","filterContextListener","listener","contextListener","event","related","relatedTarget","compareDocumentPosition","event1","event0","__data__","onRemove","__on","removeEventListener","capture","onAdd","wrap","filterEvents","addEventListener","customEvent","sourceEvent","none","EnterNode","datum","_next","_parent","bindIndex","update","node","groupLength","dataLength","bindKey","nodeByKeyValue","keyValues","keyPrefix","attrRemove","removeAttribute","attrRemoveNS","removeAttributeNS","attrConstant","attrConstantNS","setAttributeNS","attrFunction","attrFunctionNS","styleRemove","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","propertyRemove","propertyConstant","propertyFunction","classArray","classList","ClassList","_node","_names","classedAdd","list","classedRemove","classedTrue","classedFalse","classedFunction","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","nextSibling","lower","previousSibling","insertBefore","firstChild","constantNull","dispatchEvent","params","window","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","Selection","groups","parents","_groups","_parents","namespaces","xlink","xml","xmlns","namespace","creator","matcher","selector","matches","element","vendorMatches","webkitMatchesSelector","msMatchesSelector","mozMatchesSelector","oMatchesSelector","matcher$1","element$1","mouseenter","mouseleave","selection_on","current","ownerSVGElement","createSVGPoint","clientX","clientY","matrixTransform","getScreenCTM","inverse","rect","getBoundingClientRect","clientLeft","clientTop","changedTouches","querySelector","selection_select","subgroups","subnode","subgroup","selectorAll","querySelectorAll","selection_selectAll","selection_filter","sparse","selection_enter","_enter","child","next","selection_data","bind","enterGroup","updateGroup","exitGroup","previous","_exit","selection_exit","selection_merge","groups0","groups1","m0","merges","group0","group1","selection_order","selection_sort","compareNode","sortgroups","sortgroup","selection_call","selection_nodes","nodes","selection_node","selection_size","selection_empty","selection_each","selection_attr","getAttributeNS","selection_style","selection_property","splice","contains","selection_classed","selection_text","selection_html","selection_raise","selection_lower","selection_append","selection_insert","before","selection_remove","selection_datum","selection_dispatch","html","touch","touches","identifier","points","d3Timer","init","schedule","__transition","state","CREATED","STARTING","self","elapsed","SCHEDULED","timer","restart","schedules","STARTED","timeout","RUNNING","ENDED","tween","ENDING","tweenRemove","tween0","tween1","tweenFunction","tweenValue","_id","value00","interpolate0","value10","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","removeFunction","styleRemoveEnd","styleTween","Transition","_name","newId","inherit","timing","defaultTiming","now","emptyOn","emptyTween","interrupt","active","selection_interrupt","transition_tween","transition_attr","transition_attrTween","transition_delay","transition_duration","transition_ease","transition_filter","transition_merge","transition_on","transition_remove","transition_select","transition_selectAll","children","transition_selection","transition_style","transition_styleTween","transition_text","transition_transition","id0","id1","selection_prototype","selection_transition","clockNow","setFrame","clearNow","clock","clockSkew","Timer","_call","_time","timerFlush","frame","taskHead","wake","clockLast","nap","poke","pokeDelay","taskTail","sleep","clearTimeout","setTimeout","clearInterval","setInterval","performance","requestAnimationFrame","TypeError","timeout$1","interval$1","total","wrapConfig","lineHeight","smallTextOffset","smallTextLineHeightRatio","smallTextRatio","valueClassName","labelClassName","defaultTextSize","defaultFontFace","xOffset","fontSize","availableWidth","words","word","lineNumber","smallLineHeight","smallFontSize","tspan","getComputedTextLength","xpos","limit","getTextWidth","fontFace","getContext","font","measureText","d3svg","img","createImage","convertSvgToHtml","onload","handleImageLoad","createCanvas","addBackground","config","styleBackgroundString","serializer","serializeWithStyles","initializeSerializer","formatHtmlByBrowser","prependTitle","canvas","svgHtml","Image","src","imageSourceBase","b64EncodeUnicode","drawImageOnCanvas","image","drawImage","downloadCanvas","defaultFilename","extensionType","url","toDataURL","link","href","download","body","click","navigator","userAgent","search","constants","lineGradientId","preventDefault","svgWidth","colorSchemas","titleTopOffset","titleFontFamily","titleFontSize","encoder","btoa","encode","str","encodeURIComponent","fromCharCode","styleClass","chartBackground","britechartGradients","greenBlue","orangePink","bluePurple","britecharts","blueGreen","colorSchemasHuman","colorGradients","colorGradientsHuman","axisTimeCombinations","MINUTE_HOUR","HOUR_DAY","DAY_MONTH","MONTH_YEAR","timeBenchmarks","ONE_AND_A_HALF_YEARS","ONE_YEAR","ONE_DAY","computeDefaultStyleByTagName","tagName","defaultStyle","computedStyle","forEach","getDefaultStyleByTagName","defaultStylesByTagName","elem","cssTexts","elements","nodeType","Node","ELEMENT_NODE","el","noStyleTags","cssText","cssPropName","outerHTML","BASE","HEAD","HTML","META","NOFRAME","NOSCRIPT","PARAM","SCRIPT","STYLE","TITLE","tagNames","freeExports","freeGlobal","InvalidCharacterError","message","TABLE","REGEX_SPACE_CHARACTERS","decode","bitStorage","buffer","bitCounter","base64","version","webpackPolyfill","deprecate","paths","d3Shape","_require2","calculatePercent","buildLayout","buildColorScale","buildShape","drawSlices","initTooltip","highlightedSliceId","initHighlightSlice","colorScale","layout","pie","padAngle","paddingAngle","getQuantity","sortComparator","shape","arc","innerRadius","internalRadius","padRadius","externalRadius","quantityLabel","quantity","percentage","percentageLabel","totalQuantity","sumValues","dataWithPercentages","percentageFormat","cleanLegend","drawLegend","legendWidth","slices","newSlices","storeAngle","reduceOuterRadius","getSliceFill","pieDrawingTransitionDuration","tweenLoading","filterHighlightedSlice","highlightedSlice","tweenGrowth","radiusHoverOffset","hasFixedHighlightedSlice","pieHoverTransitionDuration","outerRadius","startAngle","endAngle","_current","highlightSliceById","d3Path","acos","arcInnerRadius","arcOuterRadius","arcStartAngle","arcEndAngle","arcPadAngle","intersect","y0","y1","x2","y2","x3","y3","x10","y10","x32","y32","cornerTangents","rc","cw","x01","y01","ox","oy","x11","y11","x00","y00","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","Linear","_context","Radial","curve","_curve","curveRadial","radial","lineRadial","angle","radius","linkSource","linkTarget","argv","x$$1","y$$1","curveHorizontal","moveTo","bezierCurveTo","curveVertical","curveRadial$1","pointRadial","p2","p3","linkHorizontal","linkVertical","linkRadial","_x0","_x1","_y0","_y1","Basis","BasisClosed","BasisOpen","Bundle","beta","_basis","_beta","point$1","_k","_x2","_y2","Cardinal","tension","CardinalClosed","CardinalOpen","point$2","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","_l23_2a","CatmullRom","alpha","_alpha","CatmullRomClosed","CatmullRomOpen","LinearClosed","slope3","h0","h1","s0","s1","slope2","point$3","MonotoneX","MonotoneY","ReflectContext","monotoneX","monotoneY","Natural","controlPoints","Step","_t","stepBefore","stepAfter","stackValue","series","a0","a1","da","a01","a11","a00","a10","da0","da1","ap","rp","cornerRadius","rc0","rc1","oc","ax","ay","bx","by","kc","lc","lineTo","closePath","centroid","areaStart","areaEnd","lineStart","_point","lineEnd","curveLinear","defined0","defined","area","x0z","y0z","arealine","lineX0","lineY0","lineY1","lineX1","arcs","pa","curveRadialLinear","lineRadial$1","areaRadial","lineStartAngle","lineEndAngle","lineInnerRadius","lineOuterRadius","circle","draw","tan30","tan30_2","diamond","ka","kr","kx","ky","star","square","sqrt3","triangle","wye","symbols","_x3","_x4","_y3","_y4","basisOpen","_y","bundle","cardinal","_x5","_y5","cardinalClosed","cardinalOpen","x23","y23","catmullRom","catmullRomClosed","catmullRomOpen","linearClosed","_t0","px","py","natural","none$1","stack","oz","kz","sz","sij","ki","si","expand","diverging","yp","yn","silhouette","wiggle","s2","sij0","sij1","s3","sk","skj0","skj1","sums","descending$1","insideOut","tops","bottoms","radialArea","radialLine","symbolCircle","symbolCross","symbolDiamond","symbolSquare","symbolStar","symbolTriangle","symbolWye","curveBasisClosed","curveBasisOpen","curveBasis","curveBundle","curveCardinalClosed","curveCardinalOpen","curveCardinal","curveCatmullRomClosed","curveCatmullRomOpen","curveCatmullRom","curveLinearClosed","curveMonotoneX","curveMonotoneY","curveNatural","curveStep","curveStepAfter","curveStepBefore","stackOffsetExpand","stackOffsetDiverging","stackOffsetNone","stackOffsetSilhouette","stackOffsetWiggle","stackOrderAscending","stackOrderDescending","stackOrderInsideOut","stackOrderNone","stackOrderReverse","Path","tauEpsilon","quadraticCurveTo","arcTo","x21","y21","l01_2","x20","y20","l21_2","l20_2","l21","l01","t01","t21","ccw","decimals","isInteger","drawHorizontalLegend","drawVerticalLegend","adjustLines","lineWidth","lineWidthSpace","centerLegendOnSVG","splitInLines","legendGroupSize","emptySpace","cleanFadedLines","isFadedClassName","markerSize","getId","horizontalOffset","verticalOffset","labelWidth","textSize","getLineElementMargin","markerYOffset","getCircleFill","textLetterSpacing","getFormattedQuantity","valueReservedSpace","numberLetterSpacing","fadeLinesBut","exceptionItemId","classToFade","marginRatio","legendEntries","numberOfEntries","newLine","lastEntry","numberFormat","clearHighlight","highlight","entryId","_require3","getXAxisSettings","_require4","getLocaleDateFormatter","_require5","formatIntegerValue","formatDecimalValue","dataByTopic","dataByDate","buildGradient","drawLines","createMaskingClip","shouldShowTooltip","drawVerticalMarker","drawHoverOverlay","addMouseEvents","adjustYTickLabels","getFormattedValue","dataTimeSpan","yTickNumber","minor","major","xAxisFormat","xAxisCustomFormat","_getXAxisSettings","xMonthAxis","singleLineGradientColors","minX","dates","maxX","maxY","minY","yScaleBottomValue","getTopic","topicColorMap","memo","flatData","topic","topicName","topicNameLabel","topicLabel","dateLabel","topics","kv","cleanDataPointHighlights","verticalMarkerContainer","maskingRectangle","monthAxisPadding","lines","topicLine","curveMap","lineCurve","getLineColor","grid","horizontalGridLines","verticalGridLines","overlay","overlayColor","verticalMarkerLine","findOutNearestDate","getTime","getMouseXPosition","getNearestDataPoint","mouseX","dateFromInvertedX","bisectDate","dataEntryIndex","dataEntryForXPosition","previousDataEntryForXPosition","nearestDataPoint","xPositionOffset","dataPoint","dataPointXPosition","moveVerticalMarker","highlightDataPoints","nodesById","topicsWithNode","marker","circleSize","getPathYFromX","pathYCache","maxIterations","lengthStart","lengthEnd","getTotalLength","getPointAtLength","iterations","midpoint","verticalMarkerXPosition","tooltipThreshold","aspectRatio","lineGradient","_defineProperty","enumerable","configurable","writable","_slicedToArray","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","done","err","_typeof","_settingsToMajorTickM","singleTickWidth","horizontalTickSpacing","minEntryNumForDayFormat","formatMap","daymonth","localeTimeMap","settingsToMajorTickMap","getAxisSettingsFromTimeSpan","timeSpan","settings","getMaxNumOfHorizontalTicks","dataPointNumber","ticksForWidth","timeUnit","options","formatter","Intl","DateTimeFormat","firstDate","lastDate","dateTimeSpan","_settings$split","_settings$split2","majorTickValue","minorTickValue","getValueSize","limits","small","medium","integerValueFormats","decimalValueFormats","large","drawTooltip","hide","cleanContent","tooltipBody","tooltipTextContainer","tooltipWidth","tooltipHeight","tooltipBorderRadius","bodyFillColor","borderStrokeColor","tooltipTitle","titleFillColor","tooltipDivider","textFillColor","valueFormatter","valueFormat","getTooltipPosition","mouseY","tooltipX","tooltipY","tooltipOffset","getValueText","valueText","missingValue","resetSizeAndPositionPointers","ttTextY","ttTextX","updateTopicContent","tooltipRight","tooltipLeftText","tooltipRightText","elementText","tooltipTextColor","textWrap","tooltipMaxTopicLength","getBBox","circleYOffset","updatePositionAndSize","xPosition","yPosition","_getTooltipPosition","_getTooltipPosition2","mouseChaseDuration","updateTitle","tTitle","shouldShowDateInTitle","formatDate","dateFormat","defaultAxisSettings","localeOptions","monthDayYearFormat","monthDayHourFormat","_sortByTopicsOrder","topicsOrder","orderName","_sortByAlpha","entryLineLimit","updateContent","updateTooltip","show","colorMapping","tooltipBackground","backgroundBorderRadius","getMaxLengthLine","_len","texts","_key","textSizes","parentChartWidth","parentChartHeight","hasEnoughHorizontalRoom","hasEnoughVerticalRoom","positionX","positionY","hideTooltip","showTooltip","textLineHeight","valueLineHeight","valueTextSize","valueTextLineHeight","defaultDy","temporalHeight","tooltipValue","tooltipName","nameTextFillColor","valueTextFillColor","valueTextWeight","tooltipValueFormat","mousePosition","parentChartSize","chartSize","createGradients","drawLine","drawArea","drawEndMarker","metadataGroup","areaGradient","clipDuration","assign","uniq","arrArg","pos","getDataByDate","buildLayers","drawStackedAreas","dataSpan","dataByDateFormatted","entry","dataByDateZeroed","initialTotalsObject","totals","formatOrder","stack3","layersInitial","layers","otherIndex","other","getMaxValueByDate","categoryColorMap","yTickTextXOffset","yTickTextYOffset","areaAnimationDelays","areaAnimationDuration","areaOpacity","verticalMarker","eraseDataPointHighlights","maxValueByDate","vals","setEpsilon","accumulator","maxAreaNumber","areaAnimationDelayStep","keyLabel","func","thisArg","baseTimes","iteratee","overArg","arg","arrayLikeKeys","inherited","isArguments","skipIndexes","isIndex","assignValue","objValue","eq","baseKeys","isPrototype","nativeKeys","baseRest","nativeMax","otherArgs","copyObject","props","customizer","newValue","createAssigner","assigner","sources","guard","isIterateeCall","MAX_SAFE_INTEGER","reIsUint","isObject","isArrayLike","Ctor","objectProto","isArrayLikeObject","propertyIsEnumerable","objectToString","argsTag","isLength","isFunction","isObjectLike","tag","funcTag","genTag","nonEnumShadows","prepareData","drawGroupedBar","handleBarsMouseOver","handleBarsMouseOut","transformedData","ret","yMax","yScale2","getGroup","xScale2","groupLabel","barOpacity","animationDelays","horizontalBarsTween","verticalBarsTween","getMousePosition","adjustedMouseX","nearest","found","find","getNearestDataPoint2","adjustedMouseY","_getMousePosition","_getMousePosition2","moveTooltipOriginXY","originXPosition","originYPosition","maxBarNumber","animationDelayStep","drawStackedBar","stacks","dataInitial","getStack","stackLabel","dataByValueParsed","stackedArray","_this","_this2","nameLabelFormat","drawSteps","yTickPadding","yAxisTickFormat","getKey","xAxisLabel","xAxisLabelOffset","yAxisLabel","yAxisLabelOffset","steps","d3Brush","timeAxisHelper","cloneData","buildBrush","drawBrush","drawHandles","_timeAxisHelper$getXA","brushX","handleBrushStart","handleBrushEnd","gradient","dataToClone","JSON","stringify","chartBrush","handleFillColor","handle","dateExtent","dateExtentRounded","move","setBrushByDates","dateA","dateB","dateRange","d3Drag","d3Transition","nopropagation","stopImmediatePropagation","defaultFilter","button","defaultExtent","__brush","brushSelection","dim","brush$1","brushY","initialize","cursors","handles","redraw","started","handleSize","emitter","Emitter","moved","point1","shifting","lockX","lockY","moving","noevent","point0","mode","MODE_SPACE","MODE_DRAG","signX","e0","e1","signY","N","MODE_HANDLE","MODE_CENTER","flipX","flipY","emit","ended","touchending","dragEnable","view","keydowned","keyCode","keyupped","altKey","metaKey","signsX","signsY","shiftKey","beforestart","dragDisable","listeners","selection1","selection0","starting","BrushEvent","xy","XY","nw","ne","se","sw","yesdrag","noclick","MozUserSelect","__noselect","DragEvent","subject","dispatch$$1","defaultContainer","defaultSubject","touchable","nodrag","drag","mousedowned","touchstarted","touchmoved","touchended","gesture","mousemoved","mouseupped","mousemoving","mousedownx","mousedowny","clickDistance2","gestures","sublisteners","clickDistance"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,YAAAD,IAEAD,EAAA,YAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAAUL,EAAQD,EAASM,GAEhC,YA2DA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,QAASF,GAzDvFG,OAAOC,eAAepB,EAAS,cACvBqB,OAAO,IAEfrB,EAAQsB,OAAStB,EAAQuB,MAAQvB,EAAQwB,KAAOxB,EAAQyB,WAAazB,EAAQ0B,WAAa1B,EAAQ2B,YAAc3B,EAAQ4B,UAAY5B,EAAQ6B,YAAc7B,EAAQ8B,QAAU9B,EAAQ+B,KAAO/B,EAAQgC,OAAShC,EAAQiC,MAAQjC,EAAQkC,IAAMC,ME7D3O,IAAAC,GAAA9B,EAAA,GFiEK+B,EAAQtB,EAAuBqB,GEhEpCE,EAAAhC,EAAA,IFoEKiC,EAAUxB,EAAuBuB,GEnEtCE,EAAAlC,EAAA,IFuEKmC,EAAW1B,EAAuByB,GEtEvCE,EAAApC,EAAA,IF0EKqC,EAAS5B,EAAuB2B,GEzErCE,EAAAtC,EAAA,IF6EKuC,EAAY9B,EAAuB6B,GE5ExCE,EAAAxC,EAAA,IFgFKyC,EAAgBhC,EAAuB+B,GE/E5CE,EAAA1C,EAAA,IFmFK2C,EAAclC,EAAuBiC,GElF1CE,EAAA5C,EAAA,IFsFK6C,EAAgBpC,EAAuBmC,GErF5CE,EAAA9C,EAAA,IFyFK+C,EAAetC,EAAuBqC,GExF3CE,EAAAhD,EAAA,IF4FKiD,EAAexC,EAAuBuC,GE3F3CE,EAAAlD,EAAA,IF+FKmD,EAAS1C,EAAuByC,GE9FrCE,EAAApD,EAAA,IFkGKqD,EAAU5C,EAAuB2C,GEjGtCE,EAAAtD,EAAA,IFqGKuD,EAAW9C,EAAuB6C,EAItC5D,GEtGOkC,IFsGOG,EAAMnB,QACpBlB,EEtGOiC,MFsGSM,EAAQrB,QACxBlB,EEtGOgC,OFsGUS,EAASvB,QAC1BlB,EEtGO+B,KFsGQY,EAAOzB,QACtBlB,EEtGO8B,QFsGWe,EAAU3B,QAC5BlB,EEtGO6B,YFsGekB,EAAc7B,QACpClB,EEtGO4B,UFsGaqB,EAAY/B,QAChClB,EEtGO2B,YFsGewB,EAAcjC,QACpClB,EEtGO0B,WFsGc2B,EAAanC,QAClClB,EEtGOyB,WFsGc8B,EAAarC,QAClClB,EEtGOwB,KFsGQiC,EAAOvC,QACtBlB,EEtGOuB,MFsGSoC,EAAQzC,QACxBlB,EEtGOsB,OFsGUuC,EAAS3C,SAIrB,SAAUjB,EAAQD,EAASM,GAIhC,QAASwD,GAAmBC,GAAO,GAAIC,MAAMC,QAAQF,GAAM,CAAE,IAAK,GAAIG,GAAI,EAAGC,EAAOH,MAAMD,EAAIK,QAASF,EAAIH,EAAIK,OAAQF,IAAOC,EAAKD,GAAKH,EAAIG,EAAM,OAAOC,GAAe,MAAOH,OAAMK,KAAKN,GAF1L,GAAIO,EGvILA,GAAO,SAASC,GACZ,YAEA,IAAMC,GAAUlE,EAAQ,GAClBmE,EAASnE,EAAQ,GACjBoE,EAASpE,EAAQ,GACjBqE,EAAUrE,EAAQ,GAClBsE,EAAatE,EAAQ,GACrBuE,EAAWvE,EAAQ,GACnBwE,EAAUxE,EAAQ,GAClByE,EAAczE,EAAQ,IAGtB0E,GAFe1E,EAAQ,IAEVA,EAAQ,KAbN2E,EAcC3E,EAAQ,IAAvB4E,EAdcD,EAcdC,YACDC,EAAc7E,EAAQ,IAGtB8E,EAAoB,IACpBC,EAAgB,IA0CtB,OAAO,YA0EH,QAASrF,GAAQsF,GACbA,EAAWC,KAAK,SAASC,GACrBC,EAAaC,EAAQC,EAAOC,KAAOD,EAAOE,MAAoC,IAA3BC,GACnDC,EAAcC,EAASL,EAAOM,IAAMN,EAAOO,MAFf,IAAAC,GAGNC,EAAUZ,EAA9Ba,GAH0BF,EAG1BE,KAAMC,EAHoBH,EAGpBG,WAERC,IACAC,IACAC,EAASrG,MACTsG,IACAC,IACAC,IACIC,GACAC,MASZ,QAASN,KACDO,IACAC,GAAQtC,EAAOuC,WAAWC,GACrBC,MAAMC,EAAQC,IACdC,gBAAgBvB,IAErBwB,GAAQ7C,EAAO8C,SAASC,KAExBT,GAAQtC,EAAOuC,WAAWC,GAE1BK,GAAQ7C,EAAO8C,SAASC,GACnBN,MAAMO,EAAQL,KAS3B,QAASM,KACL,GAAIC,GAAYC,GACXC,OAAO,KACLC,QAAQ,mBAAmB,GAC3BC,KAAK,YAHI,cAGsBrC,EAAOC,KAAOE,IAHpC,KAGiEH,EAAOM,IAHxE,IAKhB2B,GACKE,OAAO,KAAKC,QAAQ,oBAAoB,GAC7CH,EACKE,OAAO,KAAKC,QAAQ,eAAe,GACxCH,EACKE,OAAO,KAAKC,QAAQ,qBAAqB,GAC9CH,EACKE,OAAO,KACPE,KAAK,YAFV,cAEoC,EAAMlC,GAF1C,QAGKiC,QAAQ,qBAAqB,GAClCH,EACKE,OAAO,KAAKC,QAAQ,kBAAkB,GAO/C,QAASxB,KACL,GAAI0B,GAAiBC,KAAKC,IAAIC,EAA2B5D,EAAQ6D,IAAIhC,EAAMiC,IAEvEvB,KACAG,EAASpC,EAAQyD,cACZC,QAAQ,EAAGP,IACXQ,YAAY,EAAGhD,IAEpBgC,EAAS3C,EAAQ4D,YACZF,OAAOnC,EAAKsC,IAAIC,KAChBH,YAAY1C,EAAa,IACzB8C,QAAQ,MAEb3B,EAASpC,EAAQ4D,YACZF,OAAOnC,EAAKsC,IAAIC,KAChBH,YAAY,EAAGhD,IACfoD,QAAQ,IAEbpB,EAAS3C,EAAQyD,cACZC,QAAQ,EAAGP,IACXQ,YAAY1C,EAAa,KAI9B+C,EADAC,GACY1C,EAAKsC,IAAI,SAAAK,GAAA,MAAKA,KACTC,UACAN,IAAI,SAAAO,EAAShF,GAAT,GAAEiF,GAAFD,EAAEC,IAAF,QACGA,OACAC,MAAOC,EAAYnF,EAAImF,EAAYjF,WAG/CiC,EAAKsC,IAAI,SAAAK,GAAA,MAAKA,KACTL,IAAI,SAAAW,EAASpF,GAAT,GAAEiF,GAAFG,EAAEH,IAAF,QACGA,OACAC,MAAOC,EAAYnF,EAAImF,EAAYjF,WAI/DmF,EAAW,SAACC,GAAD,MAAUV,GAAUW,OAAO,SAAAC,GAAA,GAAEP,GAAFO,EAAEP,IAAF,OAAYA,KAASK,IAAM,GAAGJ,OAQxE,QAAS3C,GAASmB,GACTC,KACDA,GAAM9C,EAAY4E,OAAO/B,GACpBE,OAAO,OACLC,QAAQ,wBAAwB,GAEvCJ,KAGJE,GACKG,KAAK,QAAStC,GACdsC,KAAK,SAAUhC,GAQxB,QAASI,GAAUwD,GACf,GAAIvD,GAAOuD,EAAaC,OAAO,SAACC,EAAKd,GAIjC,MAHAA,GAAE3H,OAAS2H,EAAEe,IACbf,EAAEG,KAAOa,OAAOhB,EAAEiB,QAElBC,OAAApG,EAAYgG,IAAKd,SAGjB1C,EAAaD,EAAKsC,IAAI,SAACK,GAAD,OACtB3H,MAAO,EACP8H,KAAMa,OAAOhB,EAAEiB,OAGnB,QAAS5D,OAAMC,cASnB,QAAS6D,GAASC,EAAMC,GACpBrF,EAAWsF,qBAAqBF,EAAMC,EAAgB,EAAGE,IAQ7D,QAAS3D,KACLiB,GAAI8B,OAAO,sBACN3B,KAAK,YADV,gBACuCjC,EADvC,KAEKpF,KAAKqG,IAEVa,GAAI8B,OAAO,sBACNhJ,KAAK4G,IAEVM,GAAI2C,UAAU,4BACT7J,KAAKwJ,EAAUxE,EAAOC,KAAOE,IAQtC,QAAS2E,GAAmBC,GAExBA,EAAKC,QACF7C,OAAO,QACLC,QAAQ,OAAO,GACfC,KAAK,IAAKjC,GACViC,KAAK,IAAK,GACVA,KAAK,SAAUP,EAAOmD,aACtB5C,KAAK,QAAS,SAAA6C,GAAA,GAAExJ,GAAFwJ,EAAExJ,KAAF,OAAa6F,GAAO7F,KAClCyJ,GAAG,YAAa,SAAS9B,GACtB+B,EAAgB3K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,YAAa,SAAS9B,GACtBgC,EAAgB5K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,WAAY,SAAS9B,GACrBiC,EAAe7K,KAAM4I,EAAGvD,EAAYM,KAEzCmF,MAAMR,GACJ1C,KAAK,IAAK,GACVA,KAAK,IAAK,SAAAmD,GAAA,GAAEhC,GAAFgC,EAAEhC,IAAF,OAAY1B,GAAO0B,KAC7BnB,KAAK,SAAUP,EAAOmD,aACtB5C,KAAK,QAAS,SAAAoD,GAAA,GAAE/J,GAAF+J,EAAE/J,KAAF,OAAa6F,GAAO7F,KAClC2G,KAAK,OAAQ,SAAAqD,GAAA,GAAElC,GAAFkC,EAAElC,IAAF,OAAYI,GAASJ,KAQ3C,QAASmC,GAA2BZ,GAEhCA,EAAKC,QACF7C,OAAO,QACLC,QAAQ,OAAO,GACfC,KAAK,IAAK,GACVA,KAAK,IAAKjC,GACViC,KAAK,SAAUP,EAAOmD,aACtB5C,KAAK,QAAS,SAAAuD,GAAA,GAAElK,GAAFkK,EAAElK,KAAF,OAAa6F,GAAO7F,KAClCyJ,GAAG,YAAa,SAAS9B,GACtB+B,EAAgB3K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,YAAa,SAAS9B,GACtBgC,EAAgB5K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,WAAY,SAAS9B,GACrBiC,EAAe7K,KAAM4I,EAAGvD,EAAYM,KAG5C2E,EACK1C,KAAK,IAAK,GACVA,KAAK,IAAK,SAAAwD,GAAA,GAAErC,GAAFqC,EAAErC,IAAF,OAAY1B,GAAO0B,KAC7BnB,KAAK,SAAUP,EAAOmD,aACtB5C,KAAK,OAAQ,SAAAyD,GAAA,GAAEtC,GAAFsC,EAAEtC,IAAF,OAAYI,GAASJ,KAClCuC,aACAC,SAASC,IACTC,MAAMC,IACNC,KAAKA,IACL/D,KAAK,QAAS,SAAAgE,GAAA,GAAE3K,GAAF2K,EAAE3K,KAAF,OAAa6F,GAAO7F,KAQ3C,QAAS4K,GAAyBvB,GAE9BA,EAAKC,QACF7C,OAAO,QACLC,QAAQ,OAAO,GACfC,KAAK,IAAKvC,GACVuC,KAAK,IAAK,SAAAkE,GAAA,GAAE7K,GAAF6K,EAAE7K,KAAF,OAAaoG,GAAOpG,KAC9B2G,KAAK,QAASd,EAAO0D,aACrB5C,KAAK,SAAU,SAAAmE,GAAA,GAAE9K,GAAF8K,EAAE9K,KAAF,OAAa0E,GAAc0B,EAAOpG,KACjDyJ,GAAG,YAAa,SAAS9B,GACtB+B,EAAgB3K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,YAAa,SAAS9B,GACtBgC,EAAgB5K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,WAAY,SAAS9B,GACrBiC,EAAe7K,KAAM4I,EAAGvD,EAAYM,KAEzCmF,MAAMR,GACJ1C,KAAK,IAAK,SAAAoE,GAAA,GAAEjD,GAAFiD,EAAEjD,IAAF,OAAYjC,GAAOiC,KAC7BnB,KAAK,QAASd,EAAO0D,aACrB5C,KAAK,OAAQ,SAAAqE,GAAA,GAAElD,GAAFkD,EAAElD,IAAF,OAAYI,GAASJ,KAClCuC,aACAC,SAASC,IACTC,MAAMC,IACNC,KAAKA,IACL/D,KAAK,IAAK,SAAAsE,GAAA,GAAEjL,GAAFiL,EAAEjL,KAAF,OAAaoG,GAAOpG,KAC9B2G,KAAK,SAAU,SAAAuE,GAAA,GAAElL,GAAFkL,EAAElL,KAAF,OAAa0E,GAAc0B,EAAOpG,KAQ1D,QAASmL,GAAiB9B,GAEtBA,EAAKC,QACF7C,OAAO,QACLC,QAAQ,OAAO,GACfC,KAAK,IAAKvC,GACVuC,KAAK,IAAK,SAAAyE,GAAA,GAAEpL,GAAFoL,EAAEpL,KAAF,OAAaoG,GAAOpG,KAC9B2G,KAAK,QAASd,EAAO0D,aACrB5C,KAAK,SAAU,SAAA0E,GAAA,GAAErL,GAAFqL,EAAErL,KAAF,OAAa0E,GAAc0B,EAAOpG,KACjDyJ,GAAG,YAAa,SAAS9B,GACtB+B,EAAgB3K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,YAAa,SAAS9B,GACtBgC,EAAgB5K,KAAM4I,EAAGvD,EAAYM,KAExC+E,GAAG,WAAY,SAAS9B,GACrBiC,EAAe7K,KAAM4I,EAAGvD,EAAYM,KAEzCmF,MAAMR,GACJ1C,KAAK,IAAK,SAAA2E,GAAA,GAAExD,GAAFwD,EAAExD,IAAF,OAAYjC,GAAOiC,KAC7BnB,KAAK,IAAK,SAAA4E,GAAA,GAAEvL,GAAFuL,EAAEvL,KAAF,OAAaoG,GAAOpG,KAC9B2G,KAAK,QAASd,EAAO0D,aACrB5C,KAAK,SAAU,SAAA6E,GAAA,GAAExL,GAAFwL,EAAExL,KAAF,OAAa0E,GAAc0B,EAAOpG,KACjD2G,KAAK,OAAQ,SAAA8E,GAAA,GAAE3D,GAAF2D,EAAE3D,IAAF,OAAYI,GAASJ,KAQ3C,QAASrC,KACL,GAAIiG,GAAiBhG,GAAeiG,GAA8BC,GAC9DC,EAAiBnG,GAAeoG,GAA8BC,GAC9DhD,EAAOrD,GAAesG,GAAwCC,GAE9DC,EAAmB1F,GAAI8B,OAAO,mBAC/B7B,OAAO,KACLC,QAAQ,0BAA0B,GAClCyC,UAAU,QACVnE,KAAKA,EAAK4C,WACV0B,QACF7C,OAAO,OAEVyF,GACKxF,QAAQ,oBAAoB,GAC5BC,KAAK,IAAK+E,GACV/E,KAAK,IAAKkF,GACV9C,KAAKA,GACLpC,KAAK,YAAawF,EAAsB,MAOjD,QAAS7G,KACL,GAAI+D,SAEA+C,KACA/C,EAAO7C,GAAI8B,OAAO,gBAAgBa,UAAU,QACvCnE,KAAKC,GAENS,GACA0D,EAAmBC,GAEnB8B,EAAiB9B,GAGrBA,EAAO7C,GAAI8B,OAAO,gBAAgBa,UAAU,QACvCnE,KAAKA,GAENU,GACAuE,EAA2BZ,GAE3BuB,EAAyBvB,KAG7BA,EAAO7C,GAAI8B,OAAO,gBAAgBa,UAAU,QACvCnE,KAAKA,GAENU,GACA0D,EAAmBC,GAEnB8B,EAAiB9B,IAKzBA,EAAKgD,OACAhC,aACAiC,MAAM,UAAW,GACjBC,SAOT,QAASlH,KACDK,GACA8G,IAEAC,IAQR,QAASD,KACLE,GAAgBlG,GAAI8B,OAAO,qBACtBa,UAAU,2BACVnE,KAAKa,EAAOC,MAAM,IAClBwD,QACE7C,OAAO,QACLE,KAAK,QAAS,sBACdA,KAAK,KAAOgG,GAAapI,MACzBoC,KAAK,KAAMjC,GACXiC,KAAK,KAAM,SAACgB,GAAD,MAAO9B,GAAO8B,KACzBhB,KAAK,KAAM,SAACgB,GAAD,MAAO9B,GAAO8B,KAElCiF,IAOJ,QAASA,KACLC,GAAWrG,GAAI8B,OAAO,qBACjBa,UAAU,wBACVnE,MAAM,IACNsE,QACE7C,OAAO,QACLE,KAAK,QAAS,mBACdA,KAAK,KAAOgG,GAAa9H,QACzB8B,KAAK,KAAMjC,GACXiC,KAAK,KAAM,GACXA,KAAK,KAAM,GAOxB,QAAS8F,KACLC,GAAgBlG,GAAI8B,OAAO,qBACtBa,UAAU,6BACVnE,KAAKoB,EAAON,MAAM,IAClBwD,QACE7C,OAAO,QACLE,KAAK,QAAS,wBACdA,KAAK,KAAOgG,GAAapI,MACzBoC,KAAK,KAAMvC,GACXuC,KAAK,KAAM,SAACgB,GAAD,MAAOvB,GAAOuB,KACzBhB,KAAK,KAAM,SAACgB,GAAD,MAAOvB,GAAOuB,KAElCmF,IAOJ,QAASA,KACLD,GAAWrG,GAAI8B,OAAO,qBACjBa,UAAU,wBACVnE,MAAM,IACNsE,QACE7C,OAAO,QACLE,KAAK,QAAS,mBACdA,KAAK,KAAOgG,GAAapI,MACzBoC,KAAK,KAAMvC,GACXuC,KAAK,KAAMjC,GACXiC,KAAK,KAAMjC,GAQxB,QAASgF,GAAgBqD,EAAGpF,EAAGvD,EAAYM,GACvCsI,GAAW1N,KAAK,kBAAmByN,EAAGpF,EAAGjE,EAAYuJ,MAAMF,IAAK3I,EAAYM,IAC5EhB,EAAY4E,OAAOyE,GAAGpG,KAAK,OAAQ,SAAAuG,GAAA,GAAEpF,GAAFoF,EAAEpF,IAAF,OAAYxE,GAAQyE,MAAMG,EAASJ,IAAOqF,WAQjF,QAASxD,GAAgBoD,EAAGpF,EAAGvD,EAAYM,GACvCsI,GAAW1N,KAAK,kBAAmByN,EAAGpF,EAAGjE,EAAYuJ,MAAMF,IAAK3I,EAAYM,IAQhF,QAASkF,GAAemD,EAAGpF,EAAGvD,EAAYM,GACtCsI,GAAW1N,KAAK,iBAAkByN,EAAGpF,EAAGjE,EAAYuJ,MAAMF,IAAK3I,EAAYM,IAC3EhB,EAAY4E,OAAOyE,GAAGpG,KAAK,OAAQ,SAAAyG,GAAA,GAAEtF,GAAFsF,EAAEtF,IAAF,OAAYI,GAASJ,KA9iB5D,GAAIxD,IACIM,IAAK,GACLJ,MAAO,GACPK,OAAQ,GACRN,KAAM,IAEVF,EAAQ,IACRM,EAAS,IACTK,SACAC,SACAb,SAAYM,SACZmB,SAAQO,SACR4B,EAAclE,EAAYuJ,aAAaC,UACvC7F,SACAS,SACA7B,EAAS,EACTN,EAAS,EACTgB,EAA2B,EAC3BvB,GAAyB,EACzB+H,EAAwB,EACxBpB,EAAsB,GACtBqB,GAAwB,MACxBC,GAAsB,MACtBzH,GAAmBhC,EACnB2B,UAAOO,UACPyG,IACI/H,IAAK,EACLL,KAAM,EACNM,OAAQ,EACRL,MAAO,GAEXC,GAA2B,GAC3ByE,GAAqB,EACrBxD,IAAe,EACfc,UAEA4F,IAAa,EACb1B,GAAOtH,EAAOsK,cACdnD,GAAoB,IACpBoD,GAAqB,GACrBlD,GAAgB,SAAC9C,EAAG9E,GAAJ,MAAU8K,IAAqB9K,GAE/C6F,GAAa,QACbE,GAAY,OAEZiE,UACAH,UACAhF,IAAyB,EAIzBsF,GAAazJ,EAAWqK,SAAS,kBAAmB,iBAAkB,mBAGtErG,GAAU,SAAAsG,GAAA,GAAE/F,GAAF+F,EAAE/F,IAAF,OAAYA,IACtBb,GAAW,SAAA6G,GAAA,GAAE9N,GAAF8N,EAAE9N,KAAF,OAAaA,IAExB2L,GAA8B,SAAAoC,GAAA,GAAE/N,GAAF+N,EAAE/N,KAAF,OAAa6F,GAAO7F,GAASuN,GAC3DzB,GAA6B,SAAAkC,GAAA,GAAElG,GAAFkG,EAAElG,IAAF,OAAY1B,GAAO0B,GAAS1B,EAAOmD,YAAc,EAAM4C,GAAuB,EAAE,IAE7GP,GAA4B,SAAAqC,GAAA,GAAEnG,GAAFmG,EAAEnG,IAAF,OAAYjC,GAAOiC,IAC/CiE,GAA4B,SAAAmC,GAAA,GAAElO,GAAFkO,EAAElO,KAAF,OAAaoG,GAAOpG,GAASuN,GAEzDvB,GAAwC,SAAAmC,GAAA,GAAEnO,GAAFmO,EAAEnO,KAAF,OAAawD,GAAS4K,OAAOZ,IAAuBxN,IAC5FiM,GAAsC,SAAAoC,GAAA,GAAErO,GAAFqO,EAAErO,KAAF,OAAawD,GAAS4K,OAAOX,IAAyC,IAApBa,WAAWtO,IAkxBvG,OAzRArB,GAAQqJ,YAAc,SAASuG,GAC3B,MAAKC,WAAUzL,QAGfiF,EAAcuG,EAEPxP,MAJIiJ,GAYfrJ,EAAQ6G,uBAAyB,SAAS+I,GACtC,MAAKC,WAAUzL,QAGfyC,EAAyB+I,EAElBxP,MAJIyG,GAWf7G,EAAQkF,YAAc,SAAS4K,EAAUC,GACrC7K,EAAYvE,KAAKX,EAAS6H,GAAKiI,EAAUC,IAS7C/P,EAAQgG,OAAS,SAAS4J,GACtB,MAAKC,WAAUzL,QAGf4B,EAAS4J,EAEFxP,MAJI4F,GAefhG,EAAQyN,WAAa,SAASmC,GAC1B,MAAKC,WAAUzL,QAGfqJ,GAAamC,EAENxP,MAJIqN,IAafzN,EAAQ+G,aAAe,SAAS6I,GAC5B,MAAKC,WAAUzL,QAGf2C,GAAe6I,EAERxP,MAJI2G,IAaf/G,EAAQ2F,OAAS,SAASiK,GACtB,MAAKC,WAAUzL,QAGfuB,EAASiK,EAEFxP,MAJIuF,GAaf3F,EAAQiK,UAAY,SAAS2F,GACzB,MAAKC,WAAUzL,QAGf6F,GAAY2F,EAELxP,MAJI6J,IAefjK,EAAQ8K,GAAK,WACT,GAAIzJ,GAAQgN,GAAWvD,GAAGkF,MAAM3B,GAAYwB,UAE5C,OAAOxO,KAAUgN,GAAarO,EAAUqB,GAU5CrB,EAAQoI,yBAA2B,SAASwH,GACxC,MAAKC,WAAUzL,QAGfgE,EAA2BwH,EAEpBxP,MAJIgI,GAYfpI,EAAQ4O,sBAAwB,SAASgB,GACrC,MAAKC,WAAUzL,QAGfwK,EAAwBgB,EAEjBxP,MAJIwO,GAaf5O,EAAQ+I,uBAAyB,SAAS6G,GACtC,MAAKC,WAAUzL,QAGf2E,GAAyB6G,EAElBxP,MAJI2I,IAaf/I,EAAQiQ,cAAgB,SAASL,GAC7B,MAAKC,WAAUzL,QAIXiD,GADAuI,EACmBxK,EAEAC,EAGhBjF,MARIiH,KAAqBjC,GAiBpCpF,EAAQkQ,cAAgB,SAASN,GAC7B,MAAKC,WAAUzL,QAIXiD,GADAuI,EACmBxK,EAEAC,EAGhBjF,MARIiH,KAAqBjC,GAiBpCpF,EAAQ+J,WAAa,SAAS6F,GAC1B,MAAKC,WAAUzL,QAGf2F,GAAa6F,EAENxP,MAJI2J,IAaf/J,EAAQ0F,MAAQ,SAASkK,GACrB,MAAKC,WAAUzL,QAGfsB,EAAQkK,EAEDxP,MAJIsF,GAcf1F,EAAQoH,OAAS,SAAUwI,GACvB,MAAKC,WAAUzL,QAGfgD,EAASwI,EAEFxP,MAJIgH,GAafpH,EAAQ8F,yBAA2B,SAAS8J,GACxC,MAAKC,WAAUzL,QAGf0B,GAA2B8J,EAEpBxP,MAJI0F,IAcf9F,EAAQ0H,OAAS,SAASkI,GACtB,MAAKC,WAAUzL,QAGfsD,EAASkI,EACFxP,MAHIsH,GAMR1H,IAj5BfW,KAAAX,EAAAM,EAAAN,EAAAC,KAAAkC,SAAAmC,IAAArE,EAAAD,QAAAsE,KHggCM,SAAUrE,EAAQD,EAASM,II//BjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAgC7B,SAAAoQ,GAAAC,GACA,gBAAArH,EAAAsH,GACA,MAAAC,GAAAF,EAAArH,GAAAsH,IAeA,QAAAE,GAAAC,EAAAC,GACA,OAAAD,EAAAC,GAuKA,QAAAC,GAAAC,EAAAC,EAAAC,GACA,GAAAtP,IAAAqP,EAAAD,GAAA1I,KAAAG,IAAA,EAAAyI,GACAC,EAAA7I,KAAA8I,MAAA9I,KAAA+I,IAAAzP,GAAA0G,KAAAgJ,MACAC,EAAA3P,EAAA0G,KAAAkJ,IAAA,GAAAL,EACA,OAAAA,IAAA,GACAI,GAAAE,EAAA,GAAAF,GAAAG,EAAA,EAAAH,GAAAI,EAAA,KAAArJ,KAAAkJ,IAAA,GAAAL,IACA7I,KAAAkJ,IAAA,IAAAL,IAAAI,GAAAE,EAAA,GAAAF,GAAAG,EAAA,EAAAH,GAAAI,EAAA,KAGA,QAAAC,GAAAZ,EAAAC,EAAAC,GACA,GAAAW,GAAAvJ,KAAAwJ,IAAAb,EAAAD,GAAA1I,KAAAG,IAAA,EAAAyI,GACAa,EAAAzJ,KAAAkJ,IAAA,GAAAlJ,KAAA8I,MAAA9I,KAAA+I,IAAAQ,GAAAvJ,KAAAgJ,OACAC,EAAAM,EAAAE,CAIA,OAHAR,IAAAE,EAAAM,GAAA,GACAR,GAAAG,EAAAK,GAAA,EACAR,GAAAI,IAAAI,GAAA,GACAd,EAAAD,GAAAe,IAoTA,QAAAvN,GAAA4E,GACA,MAAAA,GAAA5E,OA5hBA,GAAAmM,GAAA,SAAAE,EAAAC,GACA,MAAAD,GAAAC,GAAA,EAAAD,EAAAC,EAAA,EAAAD,GAAAC,EAAA,EAAAkB,KAGAC,EAAA,SAAAC,GAEA,MADA,KAAAA,EAAA1N,SAAA0N,EAAA1B,EAAA0B,KAEAlM,KAAA,SAAA6K,EAAAH,EAAAyB,EAAAC,GAGA,IAFA,MAAAD,MAAA,GACA,MAAAC,MAAAvB,EAAArM,QACA2N,EAAAC,GAAA,CACA,GAAAC,GAAAF,EAAAC,IAAA,CACAF,GAAArB,EAAAwB,GAAA3B,GAAA,EAAAyB,EAAAE,EAAA,EACAD,EAAAC,EAEA,MAAAF,IAEAlM,MAAA,SAAA4K,EAAAH,EAAAyB,EAAAC,GAGA,IAFA,MAAAD,MAAA,GACA,MAAAC,MAAAvB,EAAArM,QACA2N,EAAAC,GAAA,CACA,GAAAC,GAAAF,EAAAC,IAAA,CACAF,GAAArB,EAAAwB,GAAA3B,GAAA,EAAA0B,EAAAC,EACAF,EAAAE,EAAA,EAEA,MAAAF,MAWAG,EAAAL,EAAAtB,GACA4B,EAAAD,EAAArM,MACAuM,EAAAF,EAAAtM,KAEAyM,EAAA,SAAAC,EAAAjC,GACA,MAAAA,MAAAG,EAEA,KADA,GAAAtM,GAAA,EAAAqO,EAAAD,EAAAlO,OAAA,EAAAtD,EAAAwR,EAAA,GAAAD,EAAA,GAAArO,OAAAuO,EAAA,IAAAA,GACArO,EAAAqO,GAAAF,EAAAnO,GAAAmM,EAAAvP,IAAAwR,IAAApO,GACA,OAAAmO,IAOAG,EAAA,SAAAC,EAAAC,EAAA7I,GACA,GAGA8I,GACAC,EACA1O,EACA2O,EANAC,EAAAL,EAAArO,OACA2O,EAAAL,EAAAtO,OACA4O,EAAA,GAAAhP,OAAA8O,EAAAC,EAQA,KAFA,MAAAlJ,MAAA2G,GAEAmC,EAAAzO,EAAA,EAAkByO,EAAAG,IAASH,EAC3B,IAAAE,EAAAJ,EAAAE,GAAAC,EAAA,EAAsCA,EAAAG,IAASH,IAAA1O,EAC/C8O,EAAA9O,GAAA2F,EAAAgJ,EAAAH,EAAAE,GAIA,OAAAI,IAGAC,EAAA,SAAAxC,EAAAC,GACA,MAAAA,GAAAD,GAAA,EAAAC,EAAAD,EAAA,EAAAC,GAAAD,EAAA,EAAAmB,KAGAsB,EAAA,SAAA5C,GACA,cAAAA,EAAAsB,KAAAtB,GAGA6C,EAAA,SAAAH,EAAAI,GACA,GAIA/R,GACAgS,EALAd,EAAAS,EAAA5O,OACAxD,EAAA,EACAsD,GAAA,EACAoP,EAAA,EAGAC,EAAA,CAEA,UAAAH,EACA,OAAAlP,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAF,EAAA9O,OACAmP,EAAAhS,EAAAiS,EACAA,GAAAD,IAAAzS,EACA2S,GAAAF,GAAAhS,EAAAiS,QAMA,QAAApP,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAE,EAAAJ,EAAA9O,KAAA8O,OACAK,EAAAhS,EAAAiS,EACAA,GAAAD,IAAAzS,EACA2S,GAAAF,GAAAhS,EAAAiS,GAKA,IAAA1S,EAAA,QAAA2S,IAAA3S,EAAA,IAGA6S,EAAA,SAAAnB,EAAAjC,GACA,GAAAqD,GAAAP,EAAAb,EAAAjC,EACA,OAAAqD,GAAAxL,KAAAyL,KAAAD,MAGAE,EAAA,SAAAZ,EAAAI,GACA,GAEA/R,GACA8G,EACAE,EAJAkK,EAAAS,EAAA5O,OACAF,GAAA,CAKA,UAAAkP,GACA,OAAAlP,EAAAqO,GACA,UAAAlR,EAAA2R,EAAA9O,KAAA7C,KAEA,IADA8G,EAAAE,EAAAhH,IACA6C,EAAAqO,GACA,OAAAlR,EAAA2R,EAAA9O,MACAiE,EAAA9G,IAAA8G,EAAA9G,GACAgH,EAAAhH,IAAAgH,EAAAhH,QAQA,QAAA6C,EAAAqO,GACA,UAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,KAAA3R,KAEA,IADA8G,EAAAE,EAAAhH,IACA6C,EAAAqO,GACA,OAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,MACA7K,EAAA9G,IAAA8G,EAAA9G,GACAgH,EAAAhH,IAAAgH,EAAAhH,GAOA,QAAA8G,EAAAE,IAGAiK,EAAAtO,MAAA6P,UAEAC,EAAAxB,EAAAwB,MACAnL,EAAA2J,EAAA3J,IAEAoL,EAAA,SAAAzD,GACA,kBACA,MAAAA,KAIA0D,EAAA,SAAA1D,GACA,MAAAA,IAGA2D,EAAA,SAAArD,EAAAC,EAAArP,GACAoP,KAAAC,KAAArP,GAAA+Q,EAAA1C,UAAAzL,QAAA,GAAAyM,EAAAD,IAAA,KAAA2B,EAAA,KAAA/Q,CAMA,KAJA,GAAA0C,IAAA,EACAqO,EAAA,EAAArK,KAAAG,IAAA,EAAAH,KAAAgM,MAAArD,EAAAD,GAAApP,IACAyS,EAAA,GAAAjQ,OAAAuO,KAEArO,EAAAqO,GACA0B,EAAA/P,GAAA0M,EAAA1M,EAAA1C,CAGA,OAAAyS,IAGA5C,EAAAnJ,KAAAyL,KAAA,IACArC,EAAApJ,KAAAyL,KAAA,IACApC,EAAArJ,KAAAyL,KAAA,GAEAxM,EAAA,SAAAyJ,EAAAC,EAAAC,GACA,GAEAyB,GACApL,EACA3F,EAJAyH,EAAA4H,EAAAD,EACA1M,GAAA,CAOA,IAFA+E,IAAAsJ,EAAA3B,IAAAC,IAAA0B,GAEA,KAAA/Q,EAAAmP,EAAAC,EAAAC,EAAAC,MAAAqD,SAAA3S,GAAA,QAEA,IAAAA,EAAA,EAIA,IAHAoP,EAAA1I,KAAAgM,KAAAtD,EAAApP,GACAqP,EAAA3I,KAAA8I,MAAAH,EAAArP,GACA2F,EAAA,GAAAnD,OAAAuO,EAAArK,KAAAgM,KAAArD,EAAAD,EAAA,MACA1M,EAAAqO,GAAApL,EAAAjD,IAAA0M,EAAA1M,GAAA1C,MAKA,KAHAoP,EAAA1I,KAAA8I,MAAAJ,EAAApP,GACAqP,EAAA3I,KAAAgM,KAAArD,EAAArP,GACA2F,EAAA,GAAAnD,OAAAuO,EAAArK,KAAAgM,KAAAtD,EAAAC,EAAA,MACA3M,EAAAqO,GAAApL,EAAAjD,IAAA0M,EAAA1M,GAAA1C,CAKA,OAFAyH,IAAA9B,EAAA8B,UAEA9B,GAsBAiN,EAAA,SAAApB,GACA,MAAA9K,MAAAgM,KAAAhM,KAAA+I,IAAA+B,EAAA5O,QAAA8D,KAAAmM,KAAA,GAGAC,EAAA,WAKA,QAAAA,GAAAjO,GACA,GAAAnC,GAEAoM,EADAiC,EAAAlM,EAAAjC,OAEA4O,EAAA,GAAAhP,OAAAuO,EAEA,KAAArO,EAAA,EAAeA,EAAAqO,IAAOrO,EACtB8O,EAAA9O,GAAA7C,EAAAgF,EAAAnC,KAAAmC,EAGA,IAAAkO,GAAA/L,EAAAwK,GACAwB,EAAAD,EAAA,GACAE,EAAAF,EAAA,GACAG,EAAAC,EAAA3B,EAAAwB,EAAAC,EAGAzQ,OAAAC,QAAAyQ,KACAA,EAAAlD,EAAAgD,EAAAC,EAAAC,GACAA,EAAAT,EAAA/L,KAAAgM,KAAAM,EAAAE,KAAAxM,KAAA8I,MAAAyD,EAAAC,QAKA,KADA,GAAA9T,GAAA8T,EAAAtQ,OACAsQ,EAAA,IAAAF,GAAAE,EAAAE,UAAAhU,CACA,MAAA8T,EAAA9T,EAAA,GAAA6T,GAAAC,EAAAG,QAAAjU,CAEA,IACAkU,GADAC,EAAA,GAAA/Q,OAAApD,EAAA,EAIA,KAAAsD,EAAA,EAAeA,GAAAtD,IAAQsD,EACvB4Q,EAAAC,EAAA7Q,MACA4Q,EAAAN,GAAAtQ,EAAA,EAAAwQ,EAAAxQ,EAAA,GAAAsQ,EACAM,EAAAL,GAAAvQ,EAAAtD,EAAA8T,EAAAxQ,GAAAuQ,CAIA,KAAAvQ,EAAA,EAAeA,EAAAqO,IAAOrO,EACtBoM,EAAA0C,EAAA9O,GACAsQ,GAAAlE,MAAAmE,GACAM,EAAA5C,EAAAuC,EAAApE,EAAA,EAAA1P,IAAAoU,KAAA3O,EAAAnC,GAIA,OAAA6Q,GAhDA,GAAA1T,GAAA2S,EACAxL,EAAAoL,EACAe,EAAAP,CA6DA,OAZAE,GAAAjT,MAAA,SAAA4T,GACA,MAAApF,WAAAzL,QAAA/C,EAAA,kBAAA4T,KAAAlB,EAAAkB,GAAAX,GAAAjT,GAGAiT,EAAA9L,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoE,EAAA,kBAAAyM,KAAAlB,GAAAkB,EAAA,GAAAA,EAAA,KAAAX,GAAA9L,GAGA8L,EAAAY,WAAA,SAAAD,GACA,MAAApF,WAAAzL,QAAAuQ,EAAA,kBAAAM,KAAAlB,EAAA/P,MAAAC,QAAAgR,GAAAnB,EAAAnT,KAAAsU,MAAAX,GAAAK,GAGAL,GAGAa,EAAA,SAAAnC,EAAAlS,EAAAsS,GAEA,GADA,MAAAA,MAAAF,GACAX,EAAAS,EAAA5O,OAAA,CACA,IAAAtD,OAAA,GAAAyR,EAAA,SAAAa,EAAAJ,EAAA,KAAAA,EACA,IAAAlS,GAAA,SAAAsS,EAAAJ,EAAAT,EAAA,GAAAA,EAAA,EAAAS,EACA,IAAAT,GACArO,GAAAqO,EAAA,GAAAzR,EACA6R,EAAAzK,KAAA8I,MAAA9M,GACA2O,GAAAO,EAAAJ,EAAAL,KAAAK,GACAoC,GAAAhC,EAAAJ,EAAAL,EAAA,GAAAA,EAAA,EAAAK,EACA,OAAAH,IAAAuC,EAAAvC,IAAA3O,EAAAyO,KAGA0C,EAAA,SAAArC,EAAA7K,EAAAE,GAEA,MADA2K,GAAArK,EAAAhI,KAAAqS,EAAAE,GAAAoC,KAAA/E,GACArI,KAAAgM,MAAA7L,EAAAF,IAAA,GAAAgN,EAAAnC,EAAA,KAAAmC,EAAAnC,EAAA,MAAA9K,KAAAkJ,IAAA4B,EAAA5O,QAAA,QAGAmR,EAAA,SAAAvC,EAAA7K,EAAAE,GACA,MAAAH,MAAAgM,MAAA7L,EAAAF,IAAA,IAAAsL,EAAAT,GAAA9K,KAAAkJ,IAAA4B,EAAA5O,QAAA,QAGAiE,EAAA,SAAA2K,EAAAI,GACA,GAEA/R,GACAgH,EAHAkK,EAAAS,EAAA5O,OACAF,GAAA,CAIA,UAAAkP,GACA,OAAAlP,EAAAqO,GACA,UAAAlR,EAAA2R,EAAA9O,KAAA7C,KAEA,IADAgH,EAAAhH,IACA6C,EAAAqO,GACA,OAAAlR,EAAA2R,EAAA9O,KAAA7C,EAAAgH,IACAA,EAAAhH,OAQA,QAAA6C,EAAAqO,GACA,UAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,KAAA3R,KAEA,IADAgH,EAAAhH,IACA6C,EAAAqO,GACA,OAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,KAAA3R,EAAAgH,IACAA,EAAAhH,EAOA,OAAAgH,IAGAiL,EAAA,SAAAN,EAAAI,GACA,GAGA/R,GAHAkR,EAAAS,EAAA5O,OACAxD,EAAA2R,EACArO,GAAA,EAEAqP,EAAA,CAEA,UAAAH,EACA,OAAAlP,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAF,EAAA9O,OACAtD,EADA2S,GAAAlS,MAMA,QAAA6C,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAE,EAAAJ,EAAA9O,KAAA8O,OACApS,EADA2S,GAAAlS,CAKA,IAAAT,EAAA,MAAA2S,GAAA3S,GAGA4U,EAAA,SAAAxC,EAAAI,GACA,GAEA/R,GAFAkR,EAAAS,EAAA5O,OACAF,GAAA,EAEAuR,IAEA,UAAArC,EACA,OAAAlP,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAF,EAAA9O,MACAuR,EAAAT,KAAA3T,OAMA,QAAA6C,EAAAqO,GACAiB,MAAAnS,EAAA6R,EAAAE,EAAAJ,EAAA9O,KAAA8O,MACAyC,EAAAT,KAAA3T,EAKA,OAAA8T,GAAAM,EAAAH,KAAA/E,GAAA,KAGArF,EAAA,SAAAwK,GAQA,IAPA,GACA9U,GAGA+U,EACArD,EALAC,EAAAmD,EAAAtR,OAEAF,GAAA,EACA0R,EAAA,IAIA1R,EAAAqO,GAAAqD,GAAAF,EAAAxR,GAAAE,MAGA,KAFAuR,EAAA,GAAA3R,OAAA4R,KAEArD,GAAA,GAGA,IAFAD,EAAAoD,EAAAnD,GACA3R,EAAA0R,EAAAlO,SACAxD,GAAA,GACA+U,IAAAC,GAAAtD,EAAA1R,EAIA,OAAA+U,IAGAxN,EAAA,SAAA6K,EAAAI,GACA,GAEA/R,GACA8G,EAHAoK,EAAAS,EAAA5O,OACAF,GAAA,CAIA,UAAAkP,GACA,OAAAlP,EAAAqO,GACA,UAAAlR,EAAA2R,EAAA9O,KAAA7C,KAEA,IADA8G,EAAA9G,IACA6C,EAAAqO,GACA,OAAAlR,EAAA2R,EAAA9O,KAAAiE,EAAA9G,IACA8G,EAAA9G,OAQA,QAAA6C,EAAAqO,GACA,UAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,KAAA3R,KAEA,IADA8G,EAAA9G,IACA6C,EAAAqO,GACA,OAAAlR,EAAA+R,EAAAJ,EAAA9O,KAAA8O,KAAA7K,EAAA9G,IACA8G,EAAA9G,EAOA,OAAA8G,IAGA0N,EAAA,SAAAvD,EAAAwD,GAEA,IADA,GAAA5R,GAAA4R,EAAA1R,OAAA2R,EAAA,GAAA/R,OAAAE,GACAA,KAAA6R,EAAA7R,GAAAoO,EAAAwD,EAAA5R,GACA,OAAA6R,IAGAC,EAAA,SAAAhD,EAAAlB,GACA,GAAAS,EAAAS,EAAA5O,OAAA,CACA,GAAAmO,GAGA0D,EAFA/R,EAAA,EACA0R,EAAA,EAEAM,EAAAlD,EAAA4C,EAIA,KAFA,MAAA9D,MAAAvB,KAEArM,EAAAqO,IACAT,EAAAmE,EAAAjD,EAAA9O,GAAAgS,GAAA,OAAApE,EAAAoE,QACAA,EAAAD,EAAAL,EAAA1R,EAIA,YAAA4N,EAAAoE,KAAAN,EAAA,SAGAO,EAAA,SAAA7D,EAAAK,EAAAC,GAKA,IAJA,GACAwD,GACAlS,EAFAtD,GAAA,MAAAgS,EAAAN,EAAAlO,OAAAwO,IAAAD,EAAA,MAAAA,EAAA,GAAAA,GAIA/R,GACAsD,EAAAgE,KAAAmO,SAAAzV,IAAA,EACAwV,EAAA9D,EAAA1R,EAAA+R,GACAL,EAAA1R,EAAA+R,GAAAL,EAAApO,EAAAyO,GACAL,EAAApO,EAAAyO,GAAAyD,CAGA,OAAA9D,IAGAiB,EAAA,SAAAP,EAAAI,GACA,GAEA/R,GAFAkR,EAAAS,EAAA5O,OACAF,GAAA,EAEAqP,EAAA,CAEA,UAAAH,EACA,OAAAlP,EAAAqO,IACAlR,GAAA2R,EAAA9O,MAAAqP,GAAAlS,OAKA,QAAA6C,EAAAqO,IACAlR,GAAA+R,EAAAJ,EAAA9O,KAAA8O,MAAAO,GAAAlS,EAIA,OAAAkS,IAGA+C,EAAA,SAAAC,GACA,KAAAhE,EAAAgE,EAAAnS,QAAA,QACA,QAAAF,IAAA,EAAAtD,EAAAuH,EAAAoO,EAAAnS,GAAAkS,EAAA,GAAAtS,OAAApD,KAAqEsD,EAAAtD,GACrE,OAAA2R,GAAAqD,GAAA,EAAAY,EAAAF,EAAApS,GAAA,GAAAF,OAAAuO,KAA0DqD,EAAArD,GAC1DiE,EAAAZ,GAAAW,EAAAX,GAAA1R,EAGA,OAAAoS,IAOAG,EAAA,WACA,MAAAH,GAAAzG,WAGA7P,GAAA0W,OAAAvE,EACAnS,EAAAmS,cACAnS,EAAAoS,aACApS,EAAAuQ,YACAvQ,EAAA6R,WACA7R,EAAAwS,QACAxS,EAAAiT,aACAjT,EAAAyT,YACAzT,EAAA4T,SACA5T,EAAAsU,YACAtU,EAAA2W,0BAAAtB,EACArV,EAAA4W,eAAArB,EACAvV,EAAA6W,iBAAAzC,EACApU,EAAAqI,MACArI,EAAAsT,OACAtT,EAAAwV,SACAxV,EAAAkL,QACAlL,EAAAmI,MACAnI,EAAAqS,QACArS,EAAA6V,UACA7V,EAAAmV,WACAnV,EAAAiU,QACAjU,EAAAgW,OACAhW,EAAAmW,UACAnW,EAAAuT,MACAvT,EAAAmH,QACAnH,EAAA2Q,gBACA3Q,EAAAwR,WACAxR,EAAAsW,YACAtW,EAAAmT,WACAnT,EAAAyW,MAEAtV,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OJygCxC,SAAUpB,EAAQD,EAASM,IKllDjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAE7B,SAAA8W,GAAAV,GACA,OAAAA,EAGA,QAAAW,GAAAX,GACA,MAAAA,KAGA,QAAAY,GAAAZ,GACA,MAAAA,IAAA,EAAAA,GAGA,QAAAa,GAAAb,GACA,QAAAA,GAAA,MAAAA,SAAA,EAAAA,GAAA,KAGA,QAAAc,GAAAd,GACA,MAAAA,OAGA,QAAAe,GAAAf,GACA,QAAAA,MAAA,EAGA,QAAAgB,GAAAhB,GACA,QAAAA,GAAA,MAAAA,UAAA,GAAAA,IAAA,KA4CA,QAAAiB,GAAAjB,GACA,SAAAlO,KAAAoP,IAAAlB,EAAAmB,GAGA,QAAAC,GAAApB,GACA,MAAAlO,MAAAuP,IAAArB,EAAAmB,GAGA,QAAAG,GAAAtB,GACA,SAAAlO,KAAAoP,IAAAK,EAAAvB,IAAA,EAGA,QAAAwB,GAAAxB,GACA,MAAAlO,MAAAkJ,IAAA,KAAAgF,EAAA,IAGA,QAAAyB,GAAAzB,GACA,SAAAlO,KAAAkJ,IAAA,MAAAgF,GAGA,QAAA0B,GAAA1B,GACA,QAAAA,GAAA,MAAAlO,KAAAkJ,IAAA,KAAAgF,EAAA,MAAAlO,KAAAkJ,IAAA,QAAAgF,IAAA,EAGA,QAAA2B,GAAA3B,GACA,SAAAlO,KAAAyL,KAAA,EAAAyC,KAGA,QAAA4B,GAAA5B,GACA,MAAAlO,MAAAyL,KAAA,KAAAyC,KAGA,QAAA6B,GAAA7B,GACA,QAAAA,GAAA,QAAAlO,KAAAyL,KAAA,EAAAyC,KAAAlO,KAAAyL,KAAA,GAAAyC,GAAA,GAAAA,GAAA,KAcA,QAAA8B,GAAA9B,GACA,SAAA+B,EAAA,EAAA/B,GAGA,QAAA+B,GAAA/B,GACA,OAAAA,MAAAgC,EAAAC,EAAAjC,MAAAkC,EAAAD,GAAAjC,GAAAmC,GAAAnC,EAAAoC,EAAApC,EAAAqC,EAAAJ,GAAAjC,GAAAsC,GAAAtC,EAAAuC,EAAAN,GAAAjC,GAAAwC,GAAAxC,EAAAyC,EAGA,QAAAC,GAAA1C,GACA,QAAAA,GAAA,QAAA+B,EAAA,EAAA/B,GAAA+B,EAAA/B,EAAA,QAjGA,GAAA2C,GAAA,EAEAC,EAAA,QAAAC,GAAA7K,GAGA,QAAA4K,GAAA5C,GACA,MAAAlO,MAAAkJ,IAAAgF,EAAAhI,GAKA,MARAA,MAMA4K,EAAAD,SAAAE,EAEAD,GACCD,GAEDG,EAAA,QAAAD,GAAA7K,GAGA,QAAA8K,GAAA9C,GACA,SAAAlO,KAAAkJ,IAAA,EAAAgF,EAAAhI,GAKA,MARAA,MAMA8K,EAAAH,SAAAE,EAEAC,GACCH,GAEDI,EAAA,QAAAF,GAAA7K,GAGA,QAAA+K,GAAA/C,GACA,QAAAA,GAAA,MAAAlO,KAAAkJ,IAAAgF,EAAAhI,GAAA,EAAAlG,KAAAkJ,IAAA,EAAAgF,EAAAhI,IAAA,EAKA,MARAA,MAMA+K,EAAAJ,SAAAE,EAEAE,GACCJ,GAEDpB,EAAAzP,KAAAkR,GACA7B,EAAAI,EAAA,EAsCAS,EAAA,KACAG,EAAA,KACAD,EAAA,KACAE,EAAA,IACAE,EAAA,KACAD,EAAA,MACAE,EAAA,MACAC,EAAA,MACAC,EAAA,MACAR,EAAA,EAAAD,IAcAiB,EAAA,QAEAC,EAAA,QAAAL,GAAAM,GAGA,QAAAD,GAAAlD,GACA,MAAAA,OAAAmD,EAAA,GAAAnD,EAAAmD,GAKA,MARAA,MAMAD,EAAAD,UAAAJ,EAEAK,GACCD,GAEDG,EAAA,QAAAP,GAAAM,GAGA,QAAAC,GAAApD,GACA,QAAAA,MAAAmD,EAAA,GAAAnD,EAAAmD,GAAA,EAKA,MARAA,MAMAC,EAAAH,UAAAJ,EAEAO,GACCH,GAEDI,EAAA,QAAAR,GAAAM,GAGA,QAAAE,GAAArD,GACA,QAAAA,GAAA,KAAAA,MAAAmD,EAAA,GAAAnD,EAAAmD,IAAAnD,GAAA,GAAAA,IAAAmD,EAAA,GAAAnD,EAAAmD,GAAA,KAKA,MARAA,MAMAE,EAAAJ,UAAAJ,EAEAQ,GACCJ,GAEDK,EAAA,EAAAxR,KAAAkR,GACAO,EAAA,EACAC,EAAA,GAEAC,EAAA,QAAAZ,GAAAxI,EAAA3P,GAGA,QAAA+Y,GAAAzD,GACA,MAAA3F,GAAAvI,KAAAkJ,IAAA,OAAAgF,GAAAlO,KAAAuP,KAAA8B,EAAAnD,GAAAtV,GAHA,GAAAyY,GAAArR,KAAA4R,KAAA,GAAArJ,EAAAvI,KAAAG,IAAA,EAAAoI,MAAA3P,GAAA4Y,EASA,OAHAG,GAAAF,UAAA,SAAAlJ,GAAqC,MAAAwI,GAAAxI,EAAA3P,EAAA4Y,IACrCG,EAAAD,OAAA,SAAA9Y,GAAkC,MAAAmY,GAAAxI,EAAA3P,IAElC+Y,GACCF,EAAAC,GAEDG,EAAA,QAAAd,GAAAxI,EAAA3P,GAGA,QAAAiZ,GAAA3D,GACA,SAAA3F,EAAAvI,KAAAkJ,IAAA,OAAAgF,OAAAlO,KAAAuP,KAAArB,EAAAmD,GAAAzY,GAHA,GAAAyY,GAAArR,KAAA4R,KAAA,GAAArJ,EAAAvI,KAAAG,IAAA,EAAAoI,MAAA3P,GAAA4Y,EASA,OAHAK,GAAAJ,UAAA,SAAAlJ,GAAsC,MAAAwI,GAAAxI,EAAA3P,EAAA4Y,IACtCK,EAAAH,OAAA,SAAA9Y,GAAmC,MAAAmY,GAAAxI,EAAA3P,IAEnCiZ,GACCJ,EAAAC,GAEDI,EAAA,QAAAf,GAAAxI,EAAA3P,GAGA,QAAAkZ,GAAA5D,GACA,QAAAA,EAAA,EAAAA,EAAA,KACA3F,EAAAvI,KAAAkJ,IAAA,KAAAgF,GAAAlO,KAAAuP,KAAA8B,EAAAnD,GAAAtV,GACA,EAAA2P,EAAAvI,KAAAkJ,IAAA,MAAAgF,GAAAlO,KAAAuP,KAAA8B,EAAAnD,GAAAtV,IAAA,EALA,GAAAyY,GAAArR,KAAA4R,KAAA,GAAArJ,EAAAvI,KAAAG,IAAA,EAAAoI,MAAA3P,GAAA4Y,EAWA,OAHAM,GAAAL,UAAA,SAAAlJ,GAAwC,MAAAwI,GAAAxI,EAAA3P,EAAA4Y,IACxCM,EAAAJ,OAAA,SAAA9Y,GAAqC,MAAAmY,GAAAxI,EAAA3P,IAErCkZ,GACCL,EAAAC,EAED5Z,GAAAia,WAAAnD,EACA9W,EAAAka,SAAAjD,EACAjX,EAAAma,WAAApD,EACA/W,EAAAoa,YAAApD,EACAhX,EAAA+O,cAAAkI,EACAjX,EAAAqa,UAAAjD,EACApX,EAAAsa,YAAApD,EACAlX,EAAAua,aAAApD,EACAnX,EAAAwa,eAAApD,EACApX,EAAAya,SAAAtB,EACAnZ,EAAA0a,WAAA1B,EACAhZ,EAAA2a,YAAAzB,EACAlZ,EAAA4a,cAAAzB,EACAnZ,EAAA6a,QAAAnD,EACA1X,EAAA8a,UAAAzD,EACArX,EAAA+a,WAAAvD,EACAxX,EAAAgb,aAAAtD,EACA1X,EAAAib,QAAAnD,EACA9X,EAAAkb,UAAAtD,EACA5X,EAAAmb,WAAAtD,EACA7X,EAAAob,aAAAtD,EACA9X,EAAAqb,WAAApD,EACAjY,EAAAsb,aAAAvD,EACA/X,EAAAub,cAAAvD,EACAhY,EAAAwb,gBAAAvD,EACAjY,EAAAyb,WAAAtD,EACAnY,EAAA0b,aAAAxD,EACAlY,EAAA2b,cAAAxD,EACAnY,EAAA4b,gBAAA9C,EACA9Y,EAAA6b,SAAApC,EACAzZ,EAAA8b,WAAAxC,EACAtZ,EAAA+b,YAAAvC,EACAxZ,EAAAgc,cAAAvC,EACAzZ,EAAAic,YAAAlC,EACA/Z,EAAAkc,cAAArC,EACA7Z,EAAAmc,eAAApC,EACA/Z,EAAAoc,iBAAApC,EAEA7Y,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OL4lDxC,SAAUpB,EAAQD,EAASM,IM31DjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAc7B,SAAAqc,GAAA/L,GACA,oBAAAA,EAAA,UAGA,QAAAgM,GAAAC,GACA,sBAAAA,EAAA,QAGA,QAAArJ,GAAAsJ,GACA,gBAAAxT,GACA,OAAAwT,EAAAxT,IAIA,QAAAyT,GAAAD,GACA,GAAAE,GAAAxU,KAAAG,IAAA,EAAAmU,EAAA5R,YAAA,IAEA,OADA4R,GAAAG,UAAAD,EAAAxU,KAAAyU,MAAAD,IACA,SAAA1T,GACA,OAAAwT,EAAAxT,GAAA0T,GAIA,QAAAE,KACA,OAAAxc,KAAAyc,OAGA,QAAAC,GAAAC,EAAAP,GAWA,QAAAM,GAAAE,GACA,GAAAhK,GAAA,MAAAiK,EAAAT,EAAArV,MAAAqV,EAAArV,MAAA6I,MAAAwM,EAAAU,GAAAV,EAAAhU,SAAAyU,EACAxN,EAAA,MAAA0N,EAAAX,EAAAW,WAAAX,EAAAW,WAAAnN,MAAAwM,EAAAU,GAAAlJ,EAAAmJ,EACAC,EAAAlV,KAAAG,IAAAf,EAAA,GAAA+V,EACApJ,EAAAuI,EAAAvI,QACAqJ,GAAArJ,EAAA,MACAsJ,GAAAtJ,IAAA7P,OAAA,MACAoZ,GAAAhB,EAAA5R,UAAA6R,EAAAvJ,GAAAsJ,EAAAiB,QACAC,EAAAV,EAAAU,UAAAV,EAAAU,YAAAV,EACAW,EAAAD,EAAAlT,UAAA,WAAAnE,MAAA,OACAuX,EAAAF,EAAAlT,UAAA,SAAAnE,KAAA2M,EAAAwJ,GAAAqB,QACAC,EAAAF,EAAAlQ,OACAqQ,EAAAH,EAAAjT,QAAA7C,OAAA,KAAAE,KAAA,gBACAjG,EAAA6b,EAAAjU,OAAA,QACAS,EAAAwT,EAAAjU,OAAA,OAEAgU,KAAAzS,MAAAyS,EAAAhT,QAAAqT,OAAA,gBACAhW,KAAA,kBACAA,KAAA,kBAEA4V,IAAA1S,MAAA6S,GAEAhc,IAAAmJ,MAAA6S,EAAAjW,OAAA,QACAE,KAAA,iBACAA,KAAAsI,EAAA,IAAA2N,EAAA3W,IAEA8C,IAAAc,MAAA6S,EAAAjW,OAAA,QACAE,KAAA,eACAA,KAAAsI,EAAA2N,EAAAb,GACApV,KAAA,KAAA+U,IAAA9W,EAAA,MAAA8W,IAAA7W,EAAA,oBAEA8W,IAAAU,IACAC,IAAAjS,WAAAsR,GACAY,IAAAlS,WAAAsR,GACAjb,IAAA2J,WAAAsR,GACA5S,IAAAsB,WAAAsR,GAEAc,IAAApS,WAAAsR,GACAhV,KAAA,UAAAkW,GACAlW,KAAA,qBAAAgB,GAA0C,MAAAmL,UAAAnL,EAAAwU,EAAAxU,IAAAmV,EAAAnV,GAAA5I,KAAAge,aAAA,eAE1CL,EACA/V,KAAA,UAAAkW,GACAlW,KAAA,qBAAAgB,GAA0C,GAAAlI,GAAAV,KAAAie,WAAAxB,MAAgC,OAAAsB,GAAArd,GAAAqT,SAAArT,IAAAkI,IAAAlI,EAAA0c,EAAAxU,OAG1E8U,EAAAlQ,SAEA+P,EACA3V,KAAA,IAAA+U,IAAAnX,GAAAmX,GAAAlX,EACA,IAAAoY,EAAAK,EAAA,IAAAhB,EAAA,QAAAC,EAAA,IAAAU,EAAAK,EACA,IAAAhB,EAAA,IAAAW,EAAAK,EAAA,QAAAf,EAAA,IAAAU,EAAAK,GAEAV,EACA5V,KAAA,aACAA,KAAA,qBAAAgB,GAAwC,MAAAmV,GAAAX,EAAAxU,MAExCjH,EACAiG,KAAAsI,EAAA,IAAA2N,EAAA3W,GAEA8C,EACApC,KAAAsI,EAAA2N,EAAAb,GACAhT,KAAAqF,GAEAiO,EAAAjU,OAAAmT,GACA5U,KAAA,eACAA,KAAA,gBACAA,KAAA,4BACAA,KAAA,cAAA+U,IAAAlX,EAAA,QAAAkX,IAAAnX,EAAA,gBAEA8X,EACAnY,KAAA,WAA0BnF,KAAAyc,OAAAW,IAjF1B,GAAAN,MACAD,EAAA,KACAE,EAAA,KACA7V,EAAA,EACAgX,EAAA,EACAjB,EAAA,EACAY,EAAAlB,IAAA9W,GAAA8W,IAAAnX,GAAA,IACA0K,EAAAyM,IAAAnX,GAAAmX,IAAAlX,EAAA,QACAsY,EAAApB,IAAA9W,GAAA8W,IAAA7W,EAAAmW,EAAAC,CAgHA,OApCAQ,GAAAN,MAAA,SAAAvH,GACA,MAAApF,WAAAzL,QAAAoY,EAAAvH,EAAA6H,GAAAN,GAGAM,EAAA3V,MAAA,WACA,MAAA+V,GAAApJ,EAAAnT,KAAAkP,WAAAiN,GAGAA,EAAAI,cAAA,SAAAjI,GACA,MAAApF,WAAAzL,QAAA8Y,EAAA,MAAAjI,KAAAnB,EAAAnT,KAAAsU,GAAA6H,GAAAI,EAAApJ,SAGAgJ,EAAAG,WAAA,SAAAhI,GACA,MAAApF,WAAAzL,QAAA6Y,EAAA,MAAAhI,EAAA,KAAAnB,EAAAnT,KAAAsU,GAAA6H,GAAAG,KAAAnJ,SAGAgJ,EAAAK,WAAA,SAAAlI,GACA,MAAApF,WAAAzL,QAAA+Y,EAAAlI,EAAA6H,GAAAK,GAGAL,EAAAyB,SAAA,SAAAtJ,GACA,MAAApF,WAAAzL,QAAAkD,EAAAgX,GAAArJ,EAAA6H,GAAAxV,GAGAwV,EAAAxV,cAAA,SAAA2N,GACA,MAAApF,WAAAzL,QAAAkD,GAAA2N,EAAA6H,GAAAxV,GAGAwV,EAAAwB,cAAA,SAAArJ,GACA,MAAApF,WAAAzL,QAAAka,GAAArJ,EAAA6H,GAAAwB,GAGAxB,EAAAO,YAAA,SAAApI,GACA,MAAApF,WAAAzL,QAAAiZ,GAAApI,EAAA6H,GAAAO,GAGAP,EAGA,QAAA0B,GAAAhC,GACA,MAAAM,GAAA7W,EAAAuW,GAGA,QAAAiC,GAAAjC,GACA,MAAAM,GAAAjX,EAAA2W,GAGA,QAAAvV,GAAAuV,GACA,MAAAM,GAAA5W,EAAAsW,GAGA,QAAAhV,GAAAgV,GACA,MAAAM,GAAAlX,EAAA4W,GA/KA,GAAA1I,GAAA9P,MAAA6P,UAAAC,MAEAE,EAAA,SAAA1D,GACA,MAAAA,IAGArK,EAAA,EACAJ,EAAA,EACAK,EAAA,EACAN,EAAA,EACAsY,EAAA,IAwKAle,GAAAwe,UACAxe,EAAAye,YACAze,EAAAiH,aACAjH,EAAAwH,WAEArG,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,ONq2DxC,SAAUpB,EAAQD,EAASM,IOliEjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAO7B,SAAA0e,GAAAC,EAAAC,GACA,GAAA/K,GAAA1S,OAAA0d,OAAAF,EAAA9K,UACA,QAAAiL,KAAAF,GAAA/K,EAAAiL,GAAAF,EAAAE,EACA,OAAAjL,GAGA,QAAAkL,MAiLA,QAAA3V,GAAAqG,GACA,GAAA7O,EAEA,OADA6O,MAAA,IAAAuP,OAAAC,eACAre,EAAAse,EAAAC,KAAA1P,KAAA7O,EAAAwe,SAAAxe,EAAA,UAAAye,GAAAze,GAAA,KAAAA,GAAA,MAAAA,GAAA,SAAAA,GAAA,GAAAA,IAAA,KAAAA,EAAA,KACAA,EAAA0e,EAAAH,KAAA1P,IAAA8P,EAAAH,SAAAxe,EAAA,SACAA,EAAA4e,EAAAL,KAAA1P,IAAA,GAAA4P,GAAAze,EAAA,GAAAA,EAAA,GAAAA,EAAA,OACAA,EAAA6e,EAAAN,KAAA1P,IAAA,GAAA4P,GAAA,IAAAze,EAAA,WAAAA,EAAA,WAAAA,EAAA,WACAA,EAAA8e,EAAAP,KAAA1P,IAAAkQ,EAAA/e,EAAA,GAAAA,EAAA,GAAAA,EAAA,GAAAA,EAAA,KACAA,EAAAgf,EAAAT,KAAA1P,IAAAkQ,EAAA,IAAA/e,EAAA,WAAAA,EAAA,WAAAA,EAAA,OAAAA,EAAA,KACAA,EAAAif,EAAAV,KAAA1P,IAAAqQ,EAAAlf,EAAA,GAAAA,EAAA,OAAAA,EAAA,WACAA,EAAAmf,EAAAZ,KAAA1P,IAAAqQ,EAAAlf,EAAA,GAAAA,EAAA,OAAAA,EAAA,OAAAA,EAAA,IACAof,EAAAC,eAAAxQ,GAAA8P,EAAAS,EAAAvQ,IACA,gBAAAA,EAAA,GAAA4P,GAAAzN,YAAA,GACA,KAGA,QAAA2N,GAAAhN,GACA,UAAA8M,GAAA9M,GAAA,OAAAA,GAAA,UAAAA,EAAA,GAGA,QAAAoN,GAAAO,EAAAC,EAAAzP,EAAAD,GAEA,MADAA,IAAA,IAAAyP,EAAAC,EAAAzP,EAAAkB,KACA,GAAAyN,GAAAa,EAAAC,EAAAzP,EAAAD,GAGA,QAAA2P,GAAAC,GAEA,MADAA,aAAAtB,KAAAsB,EAAAjX,EAAAiX,IACAA,GACAA,IAAAC,MACA,GAAAjB,GAAAgB,EAAAH,EAAAG,EAAAF,EAAAE,EAAA3P,EAAA2P,EAAAE,UAFA,GAAAlB,GAKA,QAAAiB,GAAAJ,EAAAC,EAAAzP,EAAA6P,GACA,WAAA1Q,UAAAzL,OAAAgc,EAAAF,GAAA,GAAAb,GAAAa,EAAAC,EAAAzP,EAAA,MAAA6P,EAAA,EAAAA,GAGA,QAAAlB,GAAAa,EAAAC,EAAAzP,EAAA6P,GACAngB,KAAA8f,KACA9f,KAAA+f,KACA/f,KAAAsQ,KACAtQ,KAAAmgB,WA+BA,QAAAT,GAAAU,EAAAjH,EAAAkH,EAAAhQ,GAIA,MAHAA,IAAA,EAAA+P,EAAAjH,EAAAkH,EAAA7O,IACA6O,GAAA,GAAAA,GAAA,EAAAD,EAAAjH,EAAA3H,IACA2H,GAAA,IAAAiH,EAAA5O,KACA,GAAA8O,GAAAF,EAAAjH,EAAAkH,EAAAhQ,GAGA,QAAAkQ,GAAAN,GACA,GAAAA,YAAAK,GAAA,UAAAA,GAAAL,EAAAG,EAAAH,EAAA9G,EAAA8G,EAAAI,EAAAJ,EAAAE,QAEA,IADAF,YAAAtB,KAAAsB,EAAAjX,EAAAiX,KACAA,EAAA,UAAAK,EACA,IAAAL,YAAAK,GAAA,MAAAL,EACAA,KAAAC,KACA,IAAAJ,GAAAG,EAAAH,EAAA,IACAC,EAAAE,EAAAF,EAAA,IACAzP,EAAA2P,EAAA3P,EAAA,IACAvI,EAAAD,KAAAC,IAAA+X,EAAAC,EAAAzP,GACArI,EAAAH,KAAAG,IAAA6X,EAAAC,EAAAzP,GACA8P,EAAA5O,IACA2H,EAAAlR,EAAAF,EACAsY,GAAApY,EAAAF,GAAA,CAUA,OATAoR,IACAiH,EAAAN,IAAA7X,GAAA8X,EAAAzP,GAAA6I,EAAA,GAAA4G,EAAAzP,GACAyP,IAAA9X,GAAAqI,EAAAwP,GAAA3G,EAAA,GACA2G,EAAAC,GAAA5G,EAAA,EACAA,GAAAkH,EAAA,GAAApY,EAAAF,EAAA,EAAAE,EAAAF,EACAqY,GAAA,IAEAjH,EAAAkH,EAAA,GAAAA,EAAA,IAAAD,EAEA,GAAAE,GAAAF,EAAAjH,EAAAkH,EAAAJ,EAAAE,SAGA,QAAAK,GAAAJ,EAAAjH,EAAAkH,EAAAF,GACA,WAAA1Q,UAAAzL,OAAAuc,EAAAH,GAAA,GAAAE,GAAAF,EAAAjH,EAAAkH,EAAA,MAAAF,EAAA,EAAAA,GAGA,QAAAG,GAAAF,EAAAjH,EAAAkH,EAAAF,GACAngB,KAAAogB,KACApgB,KAAAmZ,KACAnZ,KAAAqgB,KACArgB,KAAAmgB,WAiCA,QAAAM,GAAAL,EAAAM,EAAAC,GACA,MAGA,MAHAP,EAAA,GAAAM,GAAAC,EAAAD,GAAAN,EAAA,GACAA,EAAA,IAAAO,EACAP,EAAA,IAAAM,GAAAC,EAAAD,IAAA,IAAAN,GAAA,GACAM,GAeA,QAAAE,GAAAX,GACA,GAAAA,YAAAY,GAAA,UAAAA,GAAAZ,EAAAI,EAAAJ,EAAA5P,EAAA4P,EAAA3P,EAAA2P,EAAAE,QACA,IAAAF,YAAAa,GAAA,CACA,GAAAV,GAAAH,EAAAG,EAAAW,CACA,WAAAF,GAAAZ,EAAAI,EAAAvY,KAAAoP,IAAAkJ,GAAAH,EAAAxf,EAAAqH,KAAAuP,IAAA+I,GAAAH,EAAAxf,EAAAwf,EAAAE,SAEAF,YAAAhB,KAAAgB,EAAAD,EAAAC,GACA,IAAA3P,GAAA0Q,EAAAf,EAAAH,GACAzP,EAAA2Q,EAAAf,EAAAF,GACAM,EAAAW,EAAAf,EAAA3P,GACAJ,EAAA+Q,GAAA,SAAA3Q,EAAA,SAAAD,EAAA,SAAAgQ,GAAAa,GACA/E,EAAA8E,GAAA,SAAA3Q,EAAA,SAAAD,EAAA,QAAAgQ,GAAAc,GACAC,EAAAH,GAAA,SAAA3Q,EAAA,QAAAD,EAAA,SAAAgQ,GAAAgB,EACA,WAAAR,GAAA,IAAA1E,EAAA,QAAAjM,EAAAiM,GAAA,KAAAA,EAAAiF,GAAAnB,EAAAE,SAGA,QAAAmB,GAAAjB,EAAAhQ,EAAAC,EAAA6P,GACA,WAAA1Q,UAAAzL,OAAA4c,EAAAP,GAAA,GAAAQ,GAAAR,EAAAhQ,EAAAC,EAAA,MAAA6P,EAAA,EAAAA,GAGA,QAAAU,GAAAR,EAAAhQ,EAAAC,EAAA6P,GACAngB,KAAAqgB,KACArgB,KAAAqQ,KACArQ,KAAAsQ,KACAtQ,KAAAmgB,WA0BA,QAAAc,GAAAjL,GACA,MAAAA,GAAAuL,EAAAzZ,KAAAkJ,IAAAgF,EAAA,KAAAA,EAAAwL,EAAAC,EAGA,QAAAC,GAAA1L,GACA,MAAAA,GAAA2L,EAAA3L,MAAAwL,GAAAxL,EAAAyL,GAGA,QAAAG,GAAA1R,GACA,YAAAA,GAAA,eAAAA,EAAA,MAAApI,KAAAkJ,IAAAd,EAAA,aAGA,QAAA8Q,GAAA9Q,GACA,OAAAA,GAAA,aAAAA,EAAA,MAAApI,KAAAkJ,KAAAd,EAAA,iBAGA,QAAA2R,GAAA5B,GACA,GAAAA,YAAAa,GAAA,UAAAA,GAAAb,EAAAG,EAAAH,EAAAxf,EAAAwf,EAAAI,EAAAJ,EAAAE,QACAF,aAAAY,KAAAZ,EAAAW,EAAAX,GACA,IAAAG,GAAAtY,KAAAga,MAAA7B,EAAA3P,EAAA2P,EAAA5P,GAAA0R,CACA,WAAAjB,GAAAV,EAAA,EAAAA,EAAA,IAAAA,EAAAtY,KAAAyL,KAAA0M,EAAA5P,EAAA4P,EAAA5P,EAAA4P,EAAA3P,EAAA2P,EAAA3P,GAAA2P,EAAAI,EAAAJ,EAAAE,SAGA,QAAA6B,GAAA5B,EAAA3f,EAAA4f,EAAAF,GACA,WAAA1Q,UAAAzL,OAAA6d,EAAAzB,GAAA,GAAAU,GAAAV,EAAA3f,EAAA4f,EAAA,MAAAF,EAAA,EAAAA,GAGA,QAAAW,GAAAV,EAAA3f,EAAA4f,EAAAF,GACAngB,KAAAogB,KACApgB,KAAAS,KACAT,KAAAqgB,KACArgB,KAAAmgB,WAwBA,QAAA8B,GAAAhC,GACA,GAAAA,YAAAiC,GAAA,UAAAA,GAAAjC,EAAAG,EAAAH,EAAA9G,EAAA8G,EAAAI,EAAAJ,EAAAE,QACAF,aAAAhB,KAAAgB,EAAAD,EAAAC,GACA,IAAAH,GAAAG,EAAAH,EAAA,IACAC,EAAAE,EAAAF,EAAA,IACAzP,EAAA2P,EAAA3P,EAAA,IACA+P,GAAA8B,GAAA7R,EAAA8R,GAAAtC,EAAAuC,GAAAtC,IAAAoC,GAAAC,GAAAC,IACAC,EAAAhS,EAAA+P,EACAxC,GAAA0E,IAAAxC,EAAAM,GAAAmC,GAAAF,GAAAG,GACAtJ,EAAArR,KAAAyL,KAAAsK,IAAAyE,MAAAC,GAAAlC,GAAA,EAAAA,IACAD,EAAAjH,EAAArR,KAAAga,MAAAjE,EAAAyE,GAAAP,EAAA,IAAAvQ,GACA,WAAA0Q,GAAA9B,EAAA,EAAAA,EAAA,IAAAA,EAAAjH,EAAAkH,EAAAJ,EAAAE,SAGA,QAAAuC,GAAAtC,EAAAjH,EAAAkH,EAAAF,GACA,WAAA1Q,UAAAzL,OAAAie,EAAA7B,GAAA,GAAA8B,GAAA9B,EAAAjH,EAAAkH,EAAA,MAAAF,EAAA,EAAAA,GAGA,QAAA+B,GAAA9B,EAAAjH,EAAAkH,EAAAF,GACAngB,KAAAogB,KACApgB,KAAAmZ,KACAnZ,KAAAqgB,KACArgB,KAAAmgB,WA/dA,GAAArgB,GAAA,SAAA6iB,EAAAhjB,EAAA8T,GACAkP,EAAAlP,UAAA9T,EAAA8T,YACAA,EAAAkP,eAWAvU,EAAA,GACAwU,EAAA,EAAAxU,EAEAyU,EAAA,sBACAC,EAAA,gDACAC,EAAA,iDACAjE,EAAA,mBACAI,EAAA,mBACAE,EAAA,GAAA4D,QAAA,WAAAH,OAAA,QACAxD,EAAA,GAAA2D,QAAA,WAAAD,OAAA,QACAzD,EAAA,GAAA0D,QAAA,YAAAH,MAAAC,GAAA,QACAtD,EAAA,GAAAwD,QAAA,YAAAD,MAAAD,GAAA,QACArD,EAAA,GAAAuD,QAAA,WAAAF,EAAAC,KAAA,QACApD,EAAA,GAAAqD,QAAA,YAAAF,EAAAC,IAAAD,GAAA,QAEAlD,GACAqD,UAAA,SACAC,aAAA,SACAC,KAAA,MACAC,WAAA,QACAC,MAAA,SACAC,MAAA,SACAC,OAAA,SACAC,MAAA,EACAC,eAAA,SACAC,KAAA,IACAC,WAAA,QACAC,MAAA,SACAC,UAAA,SACAC,UAAA,QACAC,WAAA,QACAC,UAAA,SACAC,MAAA,SACAC,eAAA,QACAC,SAAA,SACAC,QAAA,SACAC,KAAA,MACAC,SAAA,IACAC,SAAA,MACAC,cAAA,SACAC,SAAA,SACAC,UAAA,MACAC,SAAA,SACAC,UAAA,SACAC,YAAA,QACAC,eAAA,QACAC,WAAA,SACAC,WAAA,SACAC,QAAA,QACAC,WAAA,SACAC,aAAA,QACAC,cAAA,QACAC,cAAA,QACAC,cAAA,QACAC,cAAA,MACAC,WAAA,QACAC,SAAA,SACAC,YAAA,MACAC,QAAA,QACAC,QAAA,QACAC,WAAA,QACAC,UAAA,SACAC,YAAA,SACAC,YAAA,QACAC,QAAA,SACAC,UAAA,SACAC,WAAA,SACAC,KAAA,SACAC,UAAA,SACAC,KAAA,QACAC,MAAA,MACAC,YAAA,SACAC,KAAA,QACAC,SAAA,SACAC,QAAA,SACAC,UAAA,SACAC,OAAA,QACAC,MAAA,SACAC,MAAA,SACAC,SAAA,SACAC,cAAA,SACAC,UAAA,QACAC,aAAA,SACAC,UAAA,SACAC,WAAA,SACAC,UAAA,SACAC,qBAAA,SACAC,UAAA,SACAC,WAAA,QACAC,UAAA,SACAC,UAAA,SACAC,YAAA,SACAC,cAAA,QACAC,aAAA,QACAC,eAAA,QACAC,eAAA,QACAC,eAAA,SACAC,YAAA,SACAC,KAAA,MACAC,UAAA,QACAC,MAAA,SACAC,QAAA,SACAC,OAAA,QACAC,iBAAA,QACAC,WAAA,IACAC,aAAA,SACAC,aAAA,QACAC,eAAA,QACAC,gBAAA,QACAC,kBAAA,MACAC,gBAAA,QACAC,gBAAA,SACAC,aAAA,QACAC,UAAA,SACAC,UAAA,SACAC,SAAA,SACAC,YAAA,SACAC,KAAA,IACAC,QAAA,SACAC,MAAA,QACAC,UAAA,QACAC,OAAA,SACAC,UAAA,SACAC,OAAA,SACAC,cAAA,SACAC,UAAA,SACAC,cAAA,SACAC,cAAA,SACAC,WAAA,SACAC,UAAA,SACAC,KAAA,SACAC,KAAA,SACAC,KAAA,SACAC,WAAA,SACAC,OAAA,QACAC,cAAA,QACAC,IAAA,SACAC,UAAA,SACAC,UAAA,QACAC,YAAA,QACAC,OAAA,SACAC,WAAA,SACAC,SAAA,QACAC,SAAA,SACAC,OAAA,SACAC,OAAA,SACAC,QAAA,QACAC,UAAA,QACAC,UAAA,QACAC,UAAA,QACAC,KAAA,SACAC,YAAA,MACAC,UAAA,QACAC,IAAA,SACAC,KAAA,MACAC,QAAA,SACAC,OAAA,SACAC,UAAA,QACAC,OAAA,SACAC,MAAA,SACAC,MAAA,SACAC,WAAA,SACAC,OAAA,SACAC,YAAA,SAGAtsB,GAAA6e,EAAA3V,GACAqjB,YAAA,WACA,MAAArsB,MAAAkgB,MAAAmM,eAEAC,SAAA,WACA,MAAAtsB,MAAAkgB,MAAA,MA+CApgB,EAAAmf,EAAAiB,EAAA5B,EAAAK,GACAiE,SAAA,SAAA/E,GAEA,MADAA,GAAA,MAAAA,EAAA+E,EAAA9a,KAAAkJ,IAAA4R,EAAA/E,GACA,GAAAoB,GAAAjf,KAAA8f,EAAAjC,EAAA7d,KAAA+f,EAAAlC,EAAA7d,KAAAsQ,EAAAuN,EAAA7d,KAAAmgB,UAEA/R,OAAA,SAAAyP,GAEA,MADAA,GAAA,MAAAA,EAAAzP,EAAAtG,KAAAkJ,IAAA5C,EAAAyP,GACA,GAAAoB,GAAAjf,KAAA8f,EAAAjC,EAAA7d,KAAA+f,EAAAlC,EAAA7d,KAAAsQ,EAAAuN,EAAA7d,KAAAmgB,UAEAD,IAAA,WACA,MAAAlgB,OAEAqsB,YAAA,WACA,UAAArsB,KAAA8f,GAAA9f,KAAA8f,GAAA,KACA,GAAA9f,KAAA+f,GAAA/f,KAAA+f,GAAA,KACA,GAAA/f,KAAAsQ,GAAAtQ,KAAAsQ,GAAA,KACA,GAAAtQ,KAAAmgB,SAAAngB,KAAAmgB,SAAA,GAEAmM,SAAA,WACA,GAAAjc,GAAArQ,KAAAmgB,OACA,OADyB9P,GAAA+C,MAAA/C,GAAA,EAAAvI,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAAsI,KACzB,IAAAA,EAAA,gBACAvI,KAAAG,IAAA,EAAAH,KAAAC,IAAA,IAAAD,KAAAyU,MAAAvc,KAAA8f,IAAA,SACAhY,KAAAG,IAAA,EAAAH,KAAAC,IAAA,IAAAD,KAAAyU,MAAAvc,KAAA+f,IAAA,SACAjY,KAAAG,IAAA,EAAAH,KAAAC,IAAA,IAAAD,KAAAyU,MAAAvc,KAAAsQ,IAAA,KACA,IAAAD,EAAA,SAAAA,EAAA,SAgDAvQ,EAAAwgB,EAAAE,EAAAlC,EAAAK,GACAiE,SAAA,SAAA/E,GAEA,MADAA,GAAA,MAAAA,EAAA+E,EAAA9a,KAAAkJ,IAAA4R,EAAA/E,GACA,GAAAyC,GAAAtgB,KAAAogB,EAAApgB,KAAAmZ,EAAAnZ,KAAAqgB,EAAAxC,EAAA7d,KAAAmgB,UAEA/R,OAAA,SAAAyP,GAEA,MADAA,GAAA,MAAAA,EAAAzP,EAAAtG,KAAAkJ,IAAA5C,EAAAyP,GACA,GAAAyC,GAAAtgB,KAAAogB,EAAApgB,KAAAmZ,EAAAnZ,KAAAqgB,EAAAxC,EAAA7d,KAAAmgB,UAEAD,IAAA,WACA,GAAAE,GAAApgB,KAAAogB,EAAA,SAAApgB,KAAAogB,EAAA,GACAjH,EAAA/F,MAAAgN,IAAAhN,MAAApT,KAAAmZ,GAAA,EAAAnZ,KAAAmZ,EACAkH,EAAArgB,KAAAqgB,EACAM,EAAAN,KAAA,GAAAA,EAAA,EAAAA,GAAAlH,EACAuH,EAAA,EAAAL,EAAAM,CACA,WAAA1B,GACAwB,EAAAL,GAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAM,EAAAC,GACAF,EAAAL,EAAAM,EAAAC,GACAF,EAAAL,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAM,EAAAC,GACA3gB,KAAAmgB,UAGAkM,YAAA,WACA,UAAArsB,KAAAmZ,GAAAnZ,KAAAmZ,GAAA,GAAA/F,MAAApT,KAAAmZ,KACA,GAAAnZ,KAAAqgB,GAAArgB,KAAAqgB,GAAA,GACA,GAAArgB,KAAAmgB,SAAAngB,KAAAmgB,SAAA,KAYA,IAAAY,GAAAjZ,KAAAkR,GAAA,IACA+I,EAAA,IAAAja,KAAAkR,GAEAuT,EAAA,GACArL,EAAA,OACAC,EAAA,EACAE,EAAA,QACAI,EAAA,KACAE,EAAA,KACAH,EAAA,EAAAG,IACAJ,EAAAI,KA6BA7hB,GAAA+gB,EAAAS,EAAAhD,EAAAK,GACAiE,SAAA,SAAA/E,GACA,UAAAgD,GAAA7gB,KAAAqgB,EAAAkM,GAAA,MAAA1O,EAAA,EAAAA,GAAA7d,KAAAqQ,EAAArQ,KAAAsQ,EAAAtQ,KAAAmgB,UAEA/R,OAAA,SAAAyP,GACA,UAAAgD,GAAA7gB,KAAAqgB,EAAAkM,GAAA,MAAA1O,EAAA,EAAAA,GAAA7d,KAAAqQ,EAAArQ,KAAAsQ,EAAAtQ,KAAAmgB,UAEAD,IAAA,WACA,GAAA/D,IAAAnc,KAAAqgB,EAAA,QACAnQ,EAAAkD,MAAApT,KAAAqQ,GAAA8L,IAAAnc,KAAAqQ,EAAA,IACA+Q,EAAAhO,MAAApT,KAAAsQ,GAAA6L,IAAAnc,KAAAsQ,EAAA,GAIA,OAHA6L,GAAAgF,EAAAO,EAAAvF,GACAjM,EAAAgR,EAAAQ,EAAAxR,GACAkR,EAAAC,EAAAK,EAAAN,GACA,GAAAnC,GACA2C,EAAA,UAAA1R,EAAA,UAAAiM,EAAA,SAAAiF,GACAQ,GAAA,QAAA1R,EAAA,UAAAiM,EAAA,QAAAiF,GACAQ,EAAA,SAAA1R,EAAA,SAAAiM,EAAA,UAAAiF,GACAphB,KAAAmgB,aAuCArgB,EAAAghB,EAAAkB,EAAA1D,EAAAK,GACAiE,SAAA,SAAA/E,GACA,UAAAiD,GAAA9gB,KAAAogB,EAAApgB,KAAAS,EAAAT,KAAAqgB,EAAAkM,GAAA,MAAA1O,EAAA,EAAAA,GAAA7d,KAAAmgB,UAEA/R,OAAA,SAAAyP,GACA,UAAAiD,GAAA9gB,KAAAogB,EAAApgB,KAAAS,EAAAT,KAAAqgB,EAAAkM,GAAA,MAAA1O,EAAA,EAAAA,GAAA7d,KAAAmgB,UAEAD,IAAA,WACA,MAAAU,GAAA5gB,MAAAkgB,SAIA,IAAAsM,IAAA,OACAC,EAAA,QACAjK,IAAA,OACAC,IAAA,OACAF,GAAA,QACAH,GAAAG,GAAAE,GACAJ,GAAAE,GAAAkK,EACAtK,GAAAsK,EAAAjK,GAAAC,GAAA+J,CA2BA1sB,GAAAoiB,EAAAQ,EAAApE,EAAAK,GACAiE,SAAA,SAAA/E,GAEA,MADAA,GAAA,MAAAA,EAAA+E,EAAA9a,KAAAkJ,IAAA4R,EAAA/E,GACA,GAAAqE,GAAAliB,KAAAogB,EAAApgB,KAAAmZ,EAAAnZ,KAAAqgB,EAAAxC,EAAA7d,KAAAmgB,UAEA/R,OAAA,SAAAyP,GAEA,MADAA,GAAA,MAAAA,EAAAzP,EAAAtG,KAAAkJ,IAAA5C,EAAAyP,GACA,GAAAqE,GAAAliB,KAAAogB,EAAApgB,KAAAmZ,EAAAnZ,KAAAqgB,EAAAxC,EAAA7d,KAAAmgB,UAEAD,IAAA,WACA,GAAAE,GAAAhN,MAAApT,KAAAogB,GAAA,GAAApgB,KAAAogB,EAAA,KAAAW,EACAV,GAAArgB,KAAAqgB,EACAhQ,EAAA+C,MAAApT,KAAAmZ,GAAA,EAAAnZ,KAAAmZ,EAAAkH,GAAA,EAAAA,GACAqM,EAAA5kB,KAAAoP,IAAAkJ,GACAuM,EAAA7kB,KAAAuP,IAAA+I,EACA,WAAAnB,GACA,KAAAoB,EAAAhQ,GAAAmc,EAAAE,EAAAD,EAAAE,IACA,KAAAtM,EAAAhQ,GAAAmS,GAAAkK,EAAAjK,GAAAkK,IACA,KAAAtM,EAAAhQ,GAAAkS,GAAAmK,IACA1sB,KAAAmgB,aAKAvgB,EAAAoJ,QACApJ,EAAAsgB,MACAtgB,EAAA4gB,MACA5gB,EAAA0hB,MACA1hB,EAAAoiB,MACApiB,EAAA8iB,YAEA3hB,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OP4iExC,SAAUpB,EAAQD,EAASM,IQnjFjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAI7B,SAAAiP,KACA,OAA8CmH,GAA9ClS,EAAA,EAAAqO,EAAA1C,UAAAzL,OAAA6Q,KAAkD/Q,EAAAqO,IAAOrO,EAAA,CACzD,KAAAkS,EAAAvG,UAAA3L,GAAA,KAAAkS,IAAAnB,GAAA,SAAA+X,OAAA,iBAAA5W,EACAnB,GAAAmB,MAEA,UAAA6W,GAAAhY,GAGA,QAAAgY,GAAAhY,GACA7U,KAAA6U,IAGA,QAAAiY,GAAAC,EAAAC,GACA,MAAAD,GAAAnO,OAAAqO,MAAA,SAAA1kB,IAAA,SAAAyN,GACA,GAAAjN,GAAA,GAAAjF,EAAAkS,EAAAkX,QAAA,IAEA,IADAppB,GAAA,IAAAiF,EAAAiN,EAAAtC,MAAA5P,EAAA,GAAAkS,IAAAtC,MAAA,EAAA5P,IACAkS,IAAAgX,EAAAnN,eAAA7J,GAAA,SAAA4W,OAAA,iBAAA5W,EACA,QAAYmX,KAAAnX,EAAAjN,UA6CZ,QAAAqkB,GAAAD,EAAApkB,GACA,OAAAtI,GAAAqD,EAAA,EAAAqO,EAAAgb,EAAAnpB,OAAqCF,EAAAqO,IAAOrO,EAC5C,IAAArD,EAAA0sB,EAAArpB,IAAAiF,SACA,MAAAtI,GAAAQ,MAKA,QAAAosB,GAAAF,EAAApkB,EAAAukB,GACA,OAAAxpB,GAAA,EAAAqO,EAAAgb,EAAAnpB,OAAkCF,EAAAqO,IAAOrO,EACzC,GAAAqpB,EAAArpB,GAAAiF,SAAA,CACAokB,EAAArpB,GAAAypB,EAAAJ,IAAAzZ,MAAA,EAAA5P,GAAAgG,OAAAqjB,EAAAzZ,MAAA5P,EAAA,GACA,OAIA,MADA,OAAAwpB,GAAAH,EAAAvY,MAAmC7L,OAAA9H,MAAAqsB,IACnCH,EAhFA,GAAAI,IAAYtsB,MAAA,aAuBZ4rB,GAAApZ,UAAA5E,EAAA4E,WACAkP,YAAAkK,EACAniB,GAAA,SAAA8iB,EAAAF,GACA,GAEAtX,GAFAnB,EAAA7U,KAAA6U,EACA4Y,EAAAX,EAAAU,EAAA,GAAA3Y,GAEA/Q,GAAA,EACAqO,EAAAsb,EAAAzpB,MAGA,OAAAyL,UAAAzL,OAAA,IAOA,SAAAspB,GAAA,kBAAAA,GAAA,SAAAV,OAAA,qBAAAU,EACA,QAAAxpB,EAAAqO,GACA,GAAA6D,GAAAwX,EAAAC,EAAA3pB,IAAAqpB,KAAAtY,EAAAmB,GAAAqX,EAAAxY,EAAAmB,GAAAwX,EAAAzkB,KAAAukB,OACA,UAAAA,EAAA,IAAAtX,IAAAnB,KAAAmB,GAAAqX,EAAAxY,EAAAmB,GAAAwX,EAAAzkB,KAAA,KAGA,OAAA/I,MAZA,OAAA8D,EAAAqO,GAAA,IAAA6D,GAAAwX,EAAAC,EAAA3pB,IAAAqpB,QAAAnX,EAAAoX,EAAAvY,EAAAmB,GAAAwX,EAAAzkB,OAAA,MAAAiN,KAcAqH,KAAA,WACA,GAAAA,MAAiBxI,EAAA7U,KAAA6U,CACjB,QAAAmB,KAAAnB,GAAAwI,EAAArH,GAAAnB,EAAAmB,GAAAtC,OACA,WAAAmZ,GAAAxP,IAEA9c,KAAA,SAAA4sB,EAAAO,GACA,IAAAvb,EAAA1C,UAAAzL,OAAA,YAAAmO,GAAA6D,EAAA2X,EAAA,GAAA/pB,OAAAuO,GAAArO,EAAA,EAAkFA,EAAAqO,IAAOrO,EAAA6pB,EAAA7pB,GAAA2L,UAAA3L,EAAA,EACzF,KAAA9D,KAAA6U,EAAAgL,eAAAsN,GAAA,SAAAP,OAAA,iBAAAO,EACA,KAAAnX,EAAAhW,KAAA6U,EAAAsY,GAAArpB,EAAA,EAAAqO,EAAA6D,EAAAhS,OAA+CF,EAAAqO,IAAOrO,EAAAkS,EAAAlS,GAAA7C,MAAA2O,MAAA8d,EAAAC,IAEtD/d,MAAA,SAAAud,EAAAO,EAAAC,GACA,IAAA3tB,KAAA6U,EAAAgL,eAAAsN,GAAA,SAAAP,OAAA,iBAAAO,EACA,QAAAnX,GAAAhW,KAAA6U,EAAAsY,GAAArpB,EAAA,EAAAqO,EAAA6D,EAAAhS,OAAmDF,EAAAqO,IAAOrO,EAAAkS,EAAAlS,GAAA7C,MAAA2O,MAAA8d,EAAAC,KAuB1D/tB,EAAAiP,WAEA9N,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OR6jFxC,SAAUpB,EAAQD,EAASM,ISxpFjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YA4G7B,SAAAguB,GAAAC,GACA,UAAAC,GAAAD,GAKA,QAAAC,GAAAD,GACA,KAAAE,EAAAC,EAAAjP,KAAA8O,IAAA,SAAAjB,OAAA,mBAAAiB,EAEA,IAAAE,GACAE,EAAAF,EAAA,QACAG,EAAAH,EAAA,QACAI,EAAAJ,EAAA,QACAK,EAAAL,EAAA,OACAM,IAAAN,EAAA,GACAzoB,EAAAyoB,EAAA,KAAAA,EAAA,GACAO,IAAAP,EAAA,GACAQ,EAAAR,EAAA,KAAAA,EAAA,GAAAra,MAAA,GACAyZ,EAAAY,EAAA;AAGA,MAAAZ,GAAAmB,GAAA,EAAAnB,EAAA,KAGAqB,EAAArB,OAAA,KAGAkB,GAAA,MAAAJ,GAAA,MAAAC,KAAAG,GAAA,EAAAJ,EAAA,IAAAC,EAAA,KAEAluB,KAAAiuB,OACAjuB,KAAAkuB,QACAluB,KAAAmuB,OACAnuB,KAAAouB,SACApuB,KAAAquB,OACAruB,KAAAsF,QACAtF,KAAAsuB,QACAtuB,KAAAuuB,YACAvuB,KAAAmtB,OAuJA,QAAAsB,GAAAjQ,GAIA,MAHAkQ,GAAAC,EAAAnQ,GACA5e,EAAAyP,OAAAqf,EAAArf,OACAzP,EAAAgvB,aAAAF,EAAAE,aACAF,EAvSA,GA0DAG,GA1DAC,EAAA,SAAA5e,EAAAxP,GACA,IAAAoD,GAAAoM,EAAAxP,EAAAwP,EAAA6e,cAAAruB,EAAA,GAAAwP,EAAA6e,iBAAA7B,QAAA,mBACA,IAAAppB,GAAAkrB,EAAA9e,EAAAwD,MAAA,EAAA5P,EAIA,QACAkrB,EAAAhrB,OAAA,EAAAgrB,EAAA,GAAAA,EAAAtb,MAAA,GAAAsb,GACA9e,EAAAwD,MAAA5P,EAAA,KAIA6U,EAAA,SAAAzI,GACA,MAAAA,GAAA4e,EAAAhnB,KAAAwJ,IAAApB,QAAA,GAAAsB,KAGAyd,EAAA,SAAAC,EAAAC,GACA,gBAAAluB,EAAAqE,GAOA,IANA,GAAAxB,GAAA7C,EAAA+C,OACAgS,KACAR,EAAA,EACAuK,EAAAmP,EAAA,GACAlrB,EAAA,EAEAF,EAAA,GAAAic,EAAA,IACA/b,EAAA+b,EAAA,EAAAza,IAAAya,EAAAjY,KAAAG,IAAA,EAAA3C,EAAAtB,IACAgS,EAAApB,KAAA3T,EAAAmuB,UAAAtrB,GAAAic,EAAAjc,EAAAic,OACA/b,GAAA+b,EAAA,GAAAza,KACAya,EAAAmP,EAAA1Z,KAAA,GAAA0Z,EAAAlrB,OAGA,OAAAgS,GAAAnN,UAAAwmB,KAAAF,KAIAG,EAAA,SAAAC,GACA,gBAAAtuB,GACA,MAAAA,GAAAuuB,QAAA,kBAAA1rB,GACA,MAAAyrB,IAAAzrB,OAKA2rB,EAAA,SAAAvf,EAAAxP,GACAwP,IAAAwf,YAAAhvB,EAEAivB,GAAA,OAAAnd,GAAAL,EAAAjC,EAAAlM,OAAAF,EAAA,EAAAyO,GAAA,EAAiDzO,EAAAqO,IAAOrO,EACxD,OAAAoM,EAAApM,IACA,QAAAyO,EAAAC,EAAA1O,CAA4B,MAC5B,aAAAyO,MAAAzO,GAAqC0O,EAAA1O,CAAQ,MAC7C,cAAA6rB,EACA,SAAApd,EAAA,IAAAA,EAAA,GAIA,MAAAA,GAAA,EAAArC,EAAAwD,MAAA,EAAAnB,GAAArC,EAAAwD,MAAAlB,EAAA,GAAAtC,GAKA0f,EAAA,SAAA1f,EAAAxP,GACA,GAAAkI,GAAAkmB,EAAA5e,EAAAxP,EACA,KAAAkI,EAAA,MAAAsH,GAAA,EACA,IAAA8e,GAAApmB,EAAA,GACA+P,EAAA/P,EAAA,GACA9E,EAAA6U,GAAAkW,EAAA,EAAA/mB,KAAAG,KAAA,EAAAH,KAAAC,IAAA,EAAAD,KAAA8I,MAAA+H,EAAA,QACAxG,EAAA6c,EAAAhrB,MACA,OAAAF,KAAAqO,EAAA6c,EACAlrB,EAAAqO,EAAA6c,EAAA,GAAAprB,OAAAE,EAAAqO,EAAA,GAAAkd,KAAA,KACAvrB,EAAA,EAAAkrB,EAAAtb,MAAA,EAAA5P,GAAA,IAAAkrB,EAAAtb,MAAA5P,GACA,QAAAF,OAAA,EAAAE,GAAAurB,KAAA,KAAAP,EAAA5e,EAAApI,KAAAG,IAAA,EAAAvH,EAAAoD,EAAA,QAGA+rB,EAAA,SAAA3f,EAAAxP,GACA,GAAAkI,GAAAkmB,EAAA5e,EAAAxP,EACA,KAAAkI,EAAA,MAAAsH,GAAA,EACA,IAAA8e,GAAApmB,EAAA,GACA+P,EAAA/P,EAAA,EACA,OAAA+P,GAAA,UAAA/U,QAAA+U,GAAA0W,KAAA,KAAAL,EACAA,EAAAhrB,OAAA2U,EAAA,EAAAqW,EAAAtb,MAAA,EAAAiF,EAAA,OAAAqW,EAAAtb,MAAAiF,EAAA,GACAqW,EAAA,GAAAprB,OAAA+U,EAAAqW,EAAAhrB,OAAA,GAAAqrB,KAAA,MAGAb,GACAsB,GAAAL,EACAM,IAAA,SAAA7f,EAAAxP,GAAuB,WAAAwP,GAAA8f,QAAAtvB,IACvB4P,EAAA,SAAAJ,GAAoB,MAAApI,MAAAyU,MAAArM,GAAAoc,SAAA,IACpB7rB,EAAA,SAAAyP,GAAoB,MAAAA,GAAA,IACpBtH,EAAA,SAAAsH,GAAoB,MAAApI,MAAAyU,MAAArM,GAAAoc,SAAA,KACpBte,EAAA,SAAAkC,EAAAxP,GAAuB,MAAAwP,GAAA6e,cAAAruB,IACvBuP,EAAA,SAAAC,EAAAxP,GAAuB,MAAAwP,GAAA8f,QAAAtvB,IACvBqf,EAAA,SAAA7P,EAAAxP,GAAuB,MAAAwP,GAAAwf,YAAAhvB,IACvBuf,EAAA,SAAA/P,GAAoB,MAAApI,MAAAyU,MAAArM,GAAAoc,SAAA,IACpB5rB,EAAA,SAAAwP,EAAAxP,GAAuB,MAAAmvB,GAAA,IAAA3f,EAAAxP,IACvBof,EAAA+P,EACA1W,EAAAyW,EACAK,EAAA,SAAA/f,GAAoB,MAAApI,MAAAyU,MAAArM,GAAAoc,SAAA,IAAA4D,eACpBhgB,EAAA,SAAAA,GAAoB,MAAApI,MAAAyU,MAAArM,GAAAoc,SAAA,MAIpB0B,EAAA,uEAMAJ,GAAAna,UAAAqa,EAAAra,UAoCAqa,EAAAra,UAAA6Y,SAAA,WACA,MAAAtsB,MAAAiuB,KACAjuB,KAAAkuB,MACAluB,KAAAmuB,KACAnuB,KAAAouB,QACApuB,KAAAquB,KAAA,SACA,MAAAruB,KAAAsF,MAAA,GAAAwC,KAAAG,IAAA,IAAAjI,KAAAsF,SACAtF,KAAAsuB,MAAA,SACA,MAAAtuB,KAAAuuB,UAAA,OAAAzmB,KAAAG,IAAA,IAAAjI,KAAAuuB,YACAvuB,KAAAmtB,KAGA,IA6HAuB,GA7HA9a,EAAA,SAAA1D,GACA,MAAAA,IAGAigB,GAAA,oEAEAxB,EAAA,SAAAD,GAOA,QAAA0B,GAAAvC,GAgCA,QAAAxe,GAAApO,GACA,GAEA6C,GAAAqO,EAAA1R,EAFA4vB,EAAAC,EACAC,EAAAC,CAGA,UAAArD,EACAoD,EAAAE,EAAAxvB,GAAAsvB,EACAtvB,EAAA,OACO,CACPA,IAGA,IAAAyvB,GAAAzvB,EAAA,CAYA,IAXAA,EAAAwvB,EAAA3oB,KAAAwJ,IAAArQ,GAAAstB,GAGAmC,GAAA,KAAAzvB,IAAAyvB,GAAA,GAGAL,GAAAK,EAAA,MAAAvC,IAAA,UAAAA,GAAA,MAAAA,EAAA,GAAAA,GAAAkC,EACAE,KAAA,MAAApD,EAAAgD,EAAA,EAAAtB,EAAA,QAAA6B,GAAA,MAAAvC,EAAA,QAIAwC,EAEA,IADA7sB,GAAA,EAAAqO,EAAAlR,EAAA+C,SACAF,EAAAqO,GACA,GAAA1R,EAAAQ,EAAA2vB,WAAA9sB,GAAA,GAAArD,KAAA,IACA8vB,GAAA,KAAA9vB,EAAAowB,EAAA5vB,EAAAyS,MAAA5P,EAAA,GAAA7C,EAAAyS,MAAA5P,IAAAysB,EACAtvB,IAAAyS,MAAA,EAAA5P,EACA,QAOAwqB,IAAAD,IAAAptB,EAAA6vB,EAAA7vB,EAAA8vB,KAGA,IAAA/sB,GAAAqsB,EAAArsB,OAAA/C,EAAA+C,OAAAusB,EAAAvsB,OACAyE,EAAAzE,EAAAsB,EAAA,GAAA1B,OAAA0B,EAAAtB,EAAA,GAAAqrB,KAAApB,GAAA,EAMA,QAHAK,GAAAD,IAAAptB,EAAA6vB,EAAAroB,EAAAxH,EAAAwH,EAAAzE,OAAAsB,EAAAirB,EAAAvsB,OAAA+sB,KAAAtoB,EAAA,IAGAylB,GACA,QAAAjtB,EAAAovB,EAAApvB,EAAAsvB,EAAA9nB,CAAsE,MACtE,SAAAxH,EAAAovB,EAAA5nB,EAAAxH,EAAAsvB,CAAsE,MACtE,SAAAtvB,EAAAwH,EAAAiL,MAAA,EAAA1P,EAAAyE,EAAAzE,QAAA,GAAAqsB,EAAApvB,EAAAsvB,EAAA9nB,EAAAiL,MAAA1P,EAAqI,MACrI,SAAA/C,EAAAwH,EAAA4nB,EAAApvB,EAAAsvB,EAGA,MAAAhB,GAAAtuB,GArFA4sB,EAAAD,EAAAC,EAEA,IAAAI,GAAAJ,EAAAI,KACAC,EAAAL,EAAAK,MACAC,EAAAN,EAAAM,KACAC,EAAAP,EAAAO,OACAC,EAAAR,EAAAQ,KACA/oB,EAAAuoB,EAAAvoB,MACAgpB,EAAAT,EAAAS,MACAC,EAAAV,EAAAU,UACApB,EAAAU,EAAAV,KAIAmD,EAAA,MAAAlC,EAAA4C,EAAA,SAAA5C,GAAA,SAAA6C,KAAA9D,GAAA,IAAAA,EAAAtO,cAAA,GACA2R,EAAA,MAAApC,EAAA4C,EAAA,UAAAC,KAAA9D,GAAA+D,EAAA,GAKAT,EAAAjC,EAAArB,GACAwD,GAAAxD,GAAA,aAAA8D,KAAA9D,EAuEA,OAjEAoB,GAAA,MAAAA,EAAApB,EAAA,KACA,SAAA8D,KAAA9D,GAAArlB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,GAAAwmB,IACAzmB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,GAAAwmB,IA2DAlf,EAAAid,SAAA,WACA,MAAAuB,GAAA,IAGAxe,EAGA,QAAAuf,GAAAf,EAAA5sB,GACA,GAAAgP,GAAAmgB,GAAAvC,EAAAD,EAAAC,KAAAV,KAAA,IAAAU,IACA7f,EAAA,EAAAlG,KAAAG,KAAA,EAAAH,KAAAC,IAAA,EAAAD,KAAA8I,MAAA+H,EAAA1X,GAAA,KACA4c,EAAA/V,KAAAkJ,IAAA,IAAAhD,GACAsiB,EAAAH,EAAA,EAAAniB,EAAA,EACA,iBAAA/M,GACA,MAAAgP,GAAA4N,EAAA5c,GAAAqvB,GA5GA,GAAAQ,GAAApC,EAAAQ,UAAAR,EAAAS,UAAAF,EAAAP,EAAAQ,SAAAR,EAAAS,WAAAvb,EACAod,EAAAtC,EAAAsC,SACAH,EAAAnC,EAAAmC,QACAtB,EAAAb,EAAAa,SAAAD,EAAAZ,EAAAa,UAAA3b,EACAsd,EAAAxC,EAAAwC,SAAA,GA4GA,QACA7hB,OAAA+gB,EACAxB,gBAQAH,IACAoC,QAAA,IACA1B,UAAA,IACAD,UAAA,GACA8B,UAAA,SAUA,IAAAG,GAAA,SAAA/vB,GACA,MAAA0G,MAAAG,IAAA,GAAA0Q,EAAA7Q,KAAAwJ,IAAAlQ,MAGAgwB,EAAA,SAAAhwB,EAAAH,GACA,MAAA6G,MAAAG,IAAA,IAAAH,KAAAG,KAAA,EAAAH,KAAAC,IAAA,EAAAD,KAAA8I,MAAA+H,EAAA1X,GAAA,KAAA0X,EAAA7Q,KAAAwJ,IAAAlQ,MAGAiwB,EAAA,SAAAjwB,EAAA6G,GAEA,MADA7G,GAAA0G,KAAAwJ,IAAAlQ,GAAA6G,EAAAH,KAAAwJ,IAAArJ,GAAA7G,EACA0G,KAAAG,IAAA,EAAA0Q,EAAA1Q,GAAA0Q,EAAAvX,IAAA,EAGAxB,GAAA0xB,oBAAA7C,EACA7uB,EAAA+uB,eACA/uB,EAAAguB,kBACAhuB,EAAAuxB,iBACAvxB,EAAAwxB,kBACAxxB,EAAAyxB,iBAEAtwB,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OTkqFxC,SAAUpB,EAAQD,EAASM,IUz+FjC,SAAA6P,EAAApQ,GACAA,EAAAC,EAAAM,EAAA,GAAAA,EAAA,GAAAA,EAAA,IAAAA,EAAA,GAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,KAGCF,KAAA,SAAAJ,EAAAwE,EAAAmtB,EAAAC,EAAA/sB,EAAAgtB,EAAAC,EAAAntB,GAAoG,YASrG,SAAAotB,GAAAC,GAOA,QAAAxV,GAAAxT,GACA,GAAA8V,GAAA9V,EAAA,GAAA9E,EAAA+tB,EAAAzE,IAAA1O,EACA,KAAA5a,EAAA,CACA,GAAAguB,IAAAC,EAAA,MAAAD,EACAD,GAAAxE,IAAA3O,EAAA5a,EAAAsE,EAAAwM,KAAAhM,IAEA,MAAAgpB,IAAA9tB,EAAA,GAAA8tB,EAAA5tB,QAZA,GAAA6tB,GAAAN,EAAAhpB,MACAH,KACA0pB,EAAAC,CAoCA,OAlCAH,GAAA,MAAAA,KAAAle,EAAAnT,KAAAqxB,GAWAxV,EAAAhU,OAAA,SAAAyM,GACA,IAAApF,UAAAzL,OAAA,MAAAoE,GAAAsL,OACAtL,MAAAypB,EAAAN,EAAAhpB,KAEA,KADA,GAAAK,GAAA8V,EAAA5a,GAAA,EAAAqO,EAAA0C,EAAA7Q,SACAF,EAAAqO,GAAA0f,EAAAG,IAAAtT,GAAA9V,EAAAiM,EAAA/Q,IAAA,KAAA+tB,EAAAxE,IAAA3O,EAAAtW,EAAAwM,KAAAhM,GACA,OAAAwT,IAGAA,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAA4tB,EAAAle,EAAAnT,KAAAsU,GAAAuH,GAAAwV,EAAAle,SAGA0I,EAAA0V,QAAA,SAAAjd,GACA,MAAApF,WAAAzL,QAAA8tB,EAAAjd,EAAAuH,GAAA0V,GAGA1V,EAAAiB,KAAA,WACA,MAAAsU,KACAvpB,UACAyL,MAAA+d,GACAE,YAGA1V,EAGA,QAAA6V,KAcA,QAAAC,KACA,GAAA/f,GAAA/J,IAAApE,OACA6E,EAAA+oB,EAAA,GAAAA,EAAA,GACAphB,EAAAohB,EAAA/oB,EAAA,GACA4H,EAAAmhB,EAAA,EAAA/oB,EACAzH,IAAAqP,EAAAD,GAAA1I,KAAAG,IAAA,EAAAkK,EAAAggB,EAAA,EAAAC,GACA7V,IAAAnb,EAAA0G,KAAA8I,MAAAxP,IACAoP,IAAAC,EAAAD,EAAApP,GAAA+Q,EAAAggB,IAAAjE,EACA1jB,EAAApJ,GAAA,EAAA+wB,GACA5V,IAAA/L,EAAA1I,KAAAyU,MAAA/L,GAAAhG,EAAA1C,KAAAyU,MAAA/R,GACA,IAAAoI,GAAAxO,EAAAyP,MAAA1B,GAAA5J,IAAA,SAAAzE,GAAmD,MAAA0M,GAAApP,EAAA0C,GACnD,OAAAuuB,GAAAxpB,EAAA+J,EAAA/J,UAAA+J,GAxBA,GAIAxR,GACAoJ,EALA4R,EAAAuV,IAAAG,QAAA/vB,QACAqG,EAAAgU,EAAAhU,OACAiqB,EAAAjW,EAAAvI,MACA+d,GAAA,KAGArV,GAAA,EACA4V,EAAA,EACAC,EAAA,EACAlE,EAAA,EAoEA,cAlEA9R,GAAA0V,QAgBA1V,EAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoE,EAAAyM,GAAAqd,KAAA9pB,KAGAgU,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAA4tB,IAAA/c,EAAA,IAAAA,EAAA,IAAAqd,KAAAN,EAAAle,SAGA0I,EAAA/T,WAAA,SAAAwM,GACA,MAAA+c,KAAA/c,EAAA,IAAAA,EAAA,IAAA0H,GAAA,EAAA2V,KAGA9V,EAAA5R,UAAA,WACA,MAAAA,IAGA4R,EAAAhb,KAAA,WACA,MAAAA,IAGAgb,EAAAG,MAAA,SAAA1H,GACA,MAAApF,WAAAzL,QAAAuY,IAAA1H,EAAAqd,KAAA3V,GAGAH,EAAA3T,QAAA,SAAAoM,GACA,MAAApF,WAAAzL,QAAAmuB,EAAAC,EAAAtqB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAA8M,IAAAqd,KAAAC,GAGA/V,EAAA+V,aAAA,SAAAtd,GACA,MAAApF,WAAAzL,QAAAmuB,EAAArqB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAA8M,IAAAqd,KAAAC,GAGA/V,EAAAgW,aAAA,SAAAvd,GACA,MAAApF,WAAAzL,QAAAouB,EAAAtqB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAA8M,IAAAqd,KAAAE,GAGAhW,EAAA8R,MAAA,SAAArZ,GACA,MAAApF,WAAAzL,QAAAkqB,EAAApmB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAA8M,IAAAqd,KAAAhE,GAGA9R,EAAAiB,KAAA,WACA,MAAA4U,KACA7pB,YACAyL,MAAA+d,GACArV,SACA4V,gBACAC,gBACAlE,UAGAgE,IAGA,QAAAI,GAAAlW,GACA,GAAAiB,GAAAjB,EAAAiB,IAUA,OARAjB,GAAA3T,QAAA2T,EAAAgW,mBACAhW,GAAA+V,mBACA/V,GAAAgW,aAEAhW,EAAAiB,KAAA,WACA,MAAAiV,GAAAjV,MAGAjB,EAGA,QAAAmW,KACA,MAAAD,GAAAL,IAAAE,aAAA,IAeA,QAAAK,GAAAniB,EAAAC,GACA,OAAAA,GAAAD,MACA,SAAAH,GAAqB,OAAAA,EAAAG,GAAAC,GACrBqD,EAAArD,GAGA,QAAAmiB,GAAAC,GACA,gBAAAriB,EAAAC,GACA,GAAA1H,GAAA8pB,EAAAriB,KAAAC,KACA,iBAAAJ,GAAwB,MAAAA,IAAAG,EAAA,EAAAH,GAAAI,EAAA,EAAA1H,EAAAsH,KAIxB,QAAAyiB,GAAAC,GACA,gBAAAviB,EAAAC,GACA,GAAAwP,GAAA8S,EAAAviB,KAAAC,KACA,iBAAA0F,GAAwB,MAAAA,IAAA,EAAA3F,EAAA2F,GAAA,EAAA1F,EAAAwP,EAAA9J,KAIxB,QAAA6c,GAAAzqB,EAAAwpB,EAAAc,EAAAE,GACA,GAAAE,GAAA1qB,EAAA,GAAA2qB,EAAA3qB,EAAA,GAAA4qB,EAAApB,EAAA,GAAAqB,EAAArB,EAAA,EAGA,OAFAmB,GAAAD,KAAAJ,EAAAK,EAAAD,GAAAE,EAAAJ,EAAAK,EAAAD,KACAF,EAAAJ,EAAAI,EAAAC,GAAAC,EAAAJ,EAAAI,EAAAC,IACA,SAAA/iB,GAAsB,MAAA8iB,GAAAF,EAAA5iB,KAGtB,QAAAgjB,GAAA9qB,EAAAwpB,EAAAc,EAAAE,GACA,GAAApd,GAAA1N,KAAAC,IAAAK,EAAApE,OAAA4tB,EAAA5tB,QAAA,EACA4E,EAAA,GAAAhF,OAAA4R,GACAsK,EAAA,GAAAlc,OAAA4R,GACA1R,GAAA,CAQA,KALAsE,EAAAoN,GAAApN,EAAA,KACAA,IAAAsL,QAAA7K,UACA+oB,IAAAle,QAAA7K,aAGA/E,EAAA0R,GACA5M,EAAA9E,GAAA4uB,EAAAtqB,EAAAtE,GAAAsE,EAAAtE,EAAA,IACAgc,EAAAhc,GAAA8uB,EAAAhB,EAAA9tB,GAAA8tB,EAAA9tB,EAAA,GAGA,iBAAAoM,GACA,GAAApM,GAAAM,EAAAkS,OAAAlO,EAAA8H,EAAA,EAAAsF,GAAA,CACA,OAAAsK,GAAAhc,GAAA8E,EAAA9E,GAAAoM,KAIA,QAAAmN,GAAA8V,EAAAC,GACA,MAAAA,GACAhrB,OAAA+qB,EAAA/qB,UACAyL,MAAAsf,EAAAtf,SACAwf,YAAAF,EAAAE,eACAC,MAAAH,EAAAG,SAKA,QAAAC,GAAAb,EAAAE,GASA,QAAAV,KAGA,MAFAsB,GAAA1rB,KAAAC,IAAAK,EAAApE,OAAA4tB,EAAA5tB,QAAA,EAAAkvB,EAAAL,EACAY,EAAAC,EAAA,KACAtX,EAGA,QAAAA,GAAAlM,GACA,OAAAujB,MAAAD,EAAAprB,EAAAwpB,EAAA0B,EAAAb,EAAAC,KAAAiB,MAAAzjB,GAfA,GAIAsjB,GACAC,EACAC,EANAtrB,EAAAwrB,EACAhC,EAAAgC,EACAD,EAAAnC,EAAA6B,YACAC,GAAA,CAuCA,OAxBAlX,GAAAyX,OAAA,SAAA1X,GACA,OAAAuX,MAAAF,EAAA5B,EAAAxpB,EAAAoqB,EAAAc,EAAAX,EAAAC,SAAAzW,IAGAC,EAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoE,EAAA0rB,EAAAvzB,KAAAsU,EAAA/B,GAAAof,KAAA9pB,EAAAsL,SAGA0I,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAA4tB,EAAAle,EAAAnT,KAAAsU,GAAAqd,KAAAN,EAAAle,SAGA0I,EAAA/T,WAAA,SAAAwM,GACA,MAAA+c,GAAAle,EAAAnT,KAAAsU,GAAA8e,EAAAnC,EAAAuC,iBAAA7B,KAGA9V,EAAAkX,MAAA,SAAAze,GACA,MAAApF,WAAAzL,QAAAsvB,IAAAze,EAAAqd,KAAAoB,GAGAlX,EAAAiX,YAAA,SAAAxe,GACA,MAAApF,WAAAzL,QAAA2vB,EAAA9e,EAAAqd,KAAAyB,GAGAzB,IAgCA,QAAA8B,GAAA5X,GACA,GAAAhU,GAAAgU,EAAAhU,MAmDA,OAjDAgU,GAAArV,MAAA,SAAA2J,GACA,GAAA9H,GAAAR,GACA,OAAAhE,GAAA2C,MAAA6B,EAAA,GAAAA,IAAA5E,OAAA,SAAA0M,EAAA,GAAAA,IAGA0L,EAAAW,WAAA,SAAArM,EAAAmd,GACA,MAAA9Q,GAAA3U,IAAAsI,EAAAmd,IAGAzR,EAAA6X,KAAA,SAAAvjB,GACA,MAAAA,MAAA,GAEA,IAKAtP,GALAwH,EAAAR,IACAmK,EAAA,EACAC,EAAA5J,EAAA5E,OAAA,EACAwM,EAAA5H,EAAA2J,GACA9B,EAAA7H,EAAA4J,EA8BA,OA3BA/B,GAAAD,IACApP,EAAAoP,IAAAC,IAAArP,EACAA,EAAAmR,IAAAC,IAAApR,GAGAA,EAAAgD,EAAAmM,cAAAC,EAAAC,EAAAC,GAEAtP,EAAA,GACAoP,EAAA1I,KAAA8I,MAAAJ,EAAApP,KACAqP,EAAA3I,KAAAgM,KAAArD,EAAArP,KACAA,EAAAgD,EAAAmM,cAAAC,EAAAC,EAAAC,IACKtP,EAAA,IACLoP,EAAA1I,KAAAgM,KAAAtD,EAAApP,KACAqP,EAAA3I,KAAA8I,MAAAH,EAAArP,KACAA,EAAAgD,EAAAmM,cAAAC,EAAAC,EAAAC,IAGAtP,EAAA,GACAwH,EAAA2J,GAAAzK,KAAA8I,MAAAJ,EAAApP,KACAwH,EAAA4J,GAAA1K,KAAAgM,KAAArD,EAAArP,KACAgH,EAAAQ,IACKxH,EAAA,IACLwH,EAAA2J,GAAAzK,KAAAgM,KAAAtD,EAAApP,KACAwH,EAAA4J,GAAA1K,KAAA8I,MAAAH,EAAArP,KACAgH,EAAAQ,IAGAwT,GAGAA,EAGA,QAAA1F,KACA,GAAA0F,GAAAmX,EAAAf,EAAAhB,EAAA0C,kBAMA,OAJA9X,GAAAiB,KAAA,WACA,MAAAA,GAAAjB,EAAA1F,MAGAsd,EAAA5X,GAGA,QAAAxI,KAGA,QAAAwI,GAAAlM,GACA,OAAAA,EAHA,GAAA9H,IAAA,IAgBA,OAVAgU,GAAAyX,OAAAzX,EAEAA,EAAAhU,OAAAgU,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAAoE,EAAA0rB,EAAAvzB,KAAAsU,EAAA/B,GAAAsJ,GAAAhU,EAAAsL,SAGA0I,EAAAiB,KAAA,WACA,MAAAzJ,KAAAxL,WAGA4rB,EAAA5X,GAsBA,QAAAsW,GAAAriB,EAAAC,GACA,OAAAA,EAAAxI,KAAA+I,IAAAP,EAAAD,IACA,SAAAH,GAAqB,MAAApI,MAAA+I,IAAAX,EAAAG,GAAAC,GACrBqD,EAAArD,GAGA,QAAAsiB,GAAAviB,EAAAC,GACA,MAAAD,GAAA,EACA,SAAA2F,GAAqB,OAAAlO,KAAAkJ,KAAAV,EAAA0F,GAAAlO,KAAAkJ,KAAAX,EAAA,EAAA2F,IACrB,SAAAA,GAAqB,MAAAlO,MAAAkJ,IAAAV,EAAA0F,GAAAlO,KAAAkJ,IAAAX,EAAA,EAAA2F,IAGrB,QAAAme,GAAAjkB,GACA,MAAA6D,UAAA7D,KAAA,KAAAA,KAAA,IAAAA,EAGA,QAAAkkB,GAAAC,GACA,YAAAA,EAAAF,EACAE,IAAAvsB,KAAAya,EAAAza,KAAAwsB,IACA,SAAApkB,GAAqB,MAAApI,MAAAkJ,IAAAqjB,EAAAnkB,IAGrB,QAAAqkB,GAAAF,GACA,MAAAA,KAAAvsB,KAAAya,EAAAza,KAAA+I,IACA,KAAAwjB,GAAAvsB,KAAA0sB,OACA,IAAAH,GAAAvsB,KAAA2sB,OACAJ,EAAAvsB,KAAA+I,IAAAwjB,GAAA,SAAAnkB,GAA8C,MAAApI,MAAA+I,IAAAX,GAAAmkB,IAG9C,QAAAK,GAAAzkB,GACA,gBAAAC,GACA,OAAAD,GAAAC,IAIA,QAAAW,KAOA,QAAAqhB,KAGA,MAFAyC,GAAAJ,EAAAF,GAAAO,EAAAR,EAAAC,GACAjsB,IAAA,OAAAusB,EAAAD,EAAAC,GAAAC,EAAAF,EAAAE,IACAxY,EATA,GAAAA,GAAAmX,EAAAb,EAAAE,GAAAxqB,QAAA,OACAA,EAAAgU,EAAAhU,OACAisB,EAAA,GACAM,EAAAJ,EAAA,IACAK,EAAAR,EAAA,GAgFA,OAxEAhY,GAAAiY,KAAA,SAAAxf,GACA,MAAApF,WAAAzL,QAAAqwB,GAAAxf,EAAAqd,KAAAmC,GAGAjY,EAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoE,EAAAyM,GAAAqd,KAAA9pB,KAGAgU,EAAArV,MAAA,SAAA2J,GACA,GAGAoP,GAHAlX,EAAAR,IACAysB,EAAAjsB,EAAA,GACA0K,EAAA1K,IAAA5E,OAAA,IAGA8b,EAAAxM,EAAAuhB,KAAA/wB,EAAA+wB,IAAAvhB,IAAAxP,EAEA,IAEApD,GACAmd,EACA7H,EAJAlS,EAAA6wB,EAAAE,GACArf,EAAAmf,EAAArhB,GAIAnB,EAAA,MAAAzB,EAAA,IAAAA,EACA0Q,IAEA,MAAAiT,EAAA,IAAA7e,EAAA1R,EAAAqO,GAEA,GADArO,EAAAgE,KAAAyU,MAAAzY,GAAA,EAAA0R,EAAA1N,KAAAyU,MAAA/G,GAAA,EACAqf,EAAA,QAAuB/wB,EAAA0R,IAAO1R,EAC9B,IAAA+Z,EAAA,EAAAnd,EAAAk0B,EAAA9wB,GAAgC+Z,EAAAwW,IAAUxW,EAE1C,GADA7H,EAAAtV,EAAAmd,IACA7H,EAAA6e,GAAA,CACA,GAAA7e,EAAA1C,EAAA,KACA8N,GAAAxM,KAAAoB,QAEO,MAAYlS,EAAA0R,IAAO1R,EAC1B,IAAA+Z,EAAAwW,EAAA,EAAA3zB,EAAAk0B,EAAA9wB,GAAuC+Z,GAAA,IAAQA,EAE/C,GADA7H,EAAAtV,EAAAmd,IACA7H,EAAA6e,GAAA,CACA,GAAA7e,EAAA1C,EAAA,KACA8N,GAAAxM,KAAAoB,QAIAoL,GAAAhd,EAAA2C,MAAAjD,EAAA0R,EAAA1N,KAAAC,IAAAyN,EAAA1R,EAAAqO,IAAA5J,IAAAqsB,EAGA,OAAA9U,GAAAsB,EAAAvY,UAAAuY,GAGAhF,EAAAW,WAAA,SAAArM,EAAAmd,GAGA,GAFA,MAAAA,MAAA,KAAAwG,EAAA,WACA,kBAAAxG,OAAAppB,EAAA4K,OAAAwe,IACAnd,IAAAqgB,IAAA,MAAAlD,EACA,OAAAnd,MAAA,GACA,IAAAmN,GAAA/V,KAAAG,IAAA,EAAAosB,EAAA3jB,EAAA0L,EAAArV,QAAA/C,OACA,iBAAA4E,GACA,GAAA9E,GAAA8E,EAAAgsB,EAAA9sB,KAAAyU,MAAAoY,EAAA/rB,IAEA,OADA9E,GAAAuwB,IAAA,KAAAvwB,GAAAuwB,GACAvwB,GAAA+Z,EAAAgQ,EAAAjlB,GAAA,KAIAwT,EAAA6X,KAAA,WACA,MAAA7rB,GAAA6rB,EAAA7rB,KACAwI,MAAA,SAAAV,GAA0B,MAAA0kB,GAAA9sB,KAAA8I,MAAA+jB,EAAAzkB,MAC1B4D,KAAA,SAAA5D,GAAyB,MAAA0kB,GAAA9sB,KAAAgM,KAAA6gB,EAAAzkB,UAIzBkM,EAAAiB,KAAA,WACA,MAAAA,GAAAjB,EAAAvL,IAAAwjB,UAGAjY,EAGA,QAAA0Y,GAAA5kB,EAAAyI,GACA,MAAAzI,GAAA,GAAApI,KAAAkJ,KAAAd,EAAAyI,GAAA7Q,KAAAkJ,IAAAd,EAAAyI,GAGA,QAAA3H,KAKA,QAAA0hB,GAAAriB,EAAAC,GACA,OAAAA,EAAAwkB,EAAAxkB,EAAAqI,IAAAtI,EAAAykB,EAAAzkB,EAAAsI,KACA,SAAAzI,GAAuB,OAAA4kB,EAAA5kB,EAAAyI,GAAAtI,GAAAC,GACvBqD,EAAArD,GAGA,QAAAsiB,GAAAviB,EAAAC,GAEA,MADAA,GAAAwkB,EAAAxkB,EAAAqI,IAAAtI,EAAAykB,EAAAzkB,EAAAsI,IACA,SAAA3C,GAAwB,MAAA8e,GAAAzkB,EAAAC,EAAA0F,EAAA,EAAA2C,IAZxB,GAAAA,GAAA,EACAyD,EAAAmX,EAAAb,EAAAE,GACAxqB,EAAAgU,EAAAhU,MAqBA,OARAgU,GAAAzD,SAAA,SAAA9D,GACA,MAAApF,WAAAzL,QAAA2U,GAAA9D,EAAAzM,QAAAuQ,GAGAyD,EAAAiB,KAAA,WACA,MAAAA,GAAAjB,EAAApL,IAAA2H,cAGAqb,EAAA5X,GAGA,QAAA7I,KACA,MAAAvC,KAAA2H,SAAA,IAGA,QAAAoc,KAKA,QAAA7C,KACA,GAAApuB,GAAA,EAAAqO,EAAArK,KAAAG,IAAA,EAAA2pB,EAAA5tB,OAEA,KADA8Q,EAAA,GAAAlR,OAAAuO,EAAA,KACArO,EAAAqO,GAAA2C,EAAAhR,EAAA,GAAAM,EAAA2Q,SAAA3M,EAAAtE,EAAAqO,EACA,OAAAiK,GAGA,QAAAA,GAAAlM,GACA,IAAAkD,MAAAlD,MAAA,MAAA0hB,GAAAxtB,EAAAkS,OAAAxB,EAAA5E,IAZA,GAAA9H,MACAwpB,KACA9c,IA2CA,OA9BAsH,GAAA4Y,aAAA,SAAA7Y,GACA,GAAArY,GAAA8tB,EAAA1E,QAAA/Q,EACA,OAAArY,GAAA,GAAA0N,UACA1N,EAAA,EAAAgR,EAAAhR,EAAA,GAAAsE,EAAA,GACAtE,EAAAgR,EAAA9Q,OAAA8Q,EAAAhR,GAAAsE,IAAApE,OAAA,KAIAoY,EAAAhU,OAAA,SAAAyM,GACA,IAAApF,UAAAzL,OAAA,MAAAoE,GAAAsL,OACAtL,KACA,QAAAQ,GAAA9E,EAAA,EAAAqO,EAAA0C,EAAA7Q,OAAoCF,EAAAqO,IAAOrO,EAAA8E,EAAAiM,EAAA/Q,GAAA,MAAA8E,GAAAwK,MAAAxK,OAAAR,EAAAwM,KAAAhM,EAE3C,OADAR,GAAA8M,KAAA9Q,EAAA+L,WACA+hB,KAGA9V,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAA4tB,EAAAle,EAAAnT,KAAAsU,GAAAqd,KAAAN,EAAAle,SAGA0I,EAAA6Y,UAAA,WACA,MAAAngB,GAAApB,SAGA0I,EAAAiB,KAAA,WACA,MAAA0X,KACA3sB,UACAyL,MAAA+d,IAGAxV,EAGA,QAAA8Y,KAOA,QAAA9Y,GAAAlM,GACA,GAAAA,KAAA,MAAA0hB,GAAAxtB,EAAAkS,OAAAlO,EAAA8H,EAAA,EAAAiC,IAGA,QAAA+f,KACA,GAAApuB,IAAA,CAEA,KADAsE,EAAA,GAAAxE,OAAAuO,KACArO,EAAAqO,GAAA/J,EAAAtE,OAAA,GAAAuQ,GAAAvQ,EAAAqO,GAAAiC,IAAAjC,EAAA,EACA,OAAAiK,GAdA,GAAAhI,GAAA,EACAC,EAAA,EACAlC,EAAA,EACA/J,GAAA,IACAwpB,GAAA,IAmCA,OAtBAxV,GAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoQ,GAAAS,EAAA,GAAAR,GAAAQ,EAAA,GAAAqd,MAAA9d,EAAAC,IAGA+H,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAAmO,GAAAyf,EAAAle,EAAAnT,KAAAsU,IAAA7Q,OAAA,EAAAkuB,KAAAN,EAAAle,SAGA0I,EAAA4Y,aAAA,SAAA7Y,GACA,GAAArY,GAAA8tB,EAAA1E,QAAA/Q,EACA,OAAArY,GAAA,GAAA0N,SACA1N,EAAA,GAAAsQ,EAAAhM,EAAA,IACAtE,GAAAqO,GAAA/J,EAAA+J,EAAA,GAAAkC,IACAjM,EAAAtE,EAAA,GAAAsE,EAAAtE,KAGAsY,EAAAiB,KAAA,WACA,MAAA6X,KACA9sB,QAAAgM,EAAAC,IACAR,MAAA+d,IAGAoC,EAAA5X,GAGA,QAAA7H,KAKA,QAAA6H,GAAAlM,GACA,GAAAA,KAAA,MAAA0hB,GAAAxtB,EAAAkS,OAAAlO,EAAA8H,EAAA,EAAAiC,IALA,GAAA/J,IAAA,IACAwpB,GAAA,KACAzf,EAAA,CAyBA,OAnBAiK,GAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoE,EAAAsL,EAAAnT,KAAAsU,GAAA1C,EAAArK,KAAAC,IAAAK,EAAApE,OAAA4tB,EAAA5tB,OAAA,GAAAoY,GAAAhU,EAAAsL,SAGA0I,EAAAvI,MAAA,SAAAgB,GACA,MAAApF,WAAAzL,QAAA4tB,EAAAle,EAAAnT,KAAAsU,GAAA1C,EAAArK,KAAAC,IAAAK,EAAApE,OAAA4tB,EAAA5tB,OAAA,GAAAoY,GAAAwV,EAAAle,SAGA0I,EAAA4Y,aAAA,SAAA7Y,GACA,GAAArY,GAAA8tB,EAAA1E,QAAA/Q,EACA,QAAA/T,EAAAtE,EAAA,GAAAsE,EAAAtE,KAGAsY,EAAAiB,KAAA,WACA,MAAA9I,KACAnM,UACAyL,MAAA+d,IAGAxV,EAWA,QAAA+Y,GAAAnf,GACA,UAAAof,MAAApf,GAGA,QAAAqf,GAAArf,GACA,MAAAA,aAAAof,OAAApf,GAAA,GAAAof,OAAApf,GAGA,QAAAsf,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAmCA,QAAAhZ,GAAAoY,GACA,OAAAU,EAAAV,KAAAa,EACAJ,EAAAT,KAAAc,EACAN,EAAAR,KAAAe,EACAR,EAAAP,KAAAgB,EACAX,EAAAL,KAAAM,EAAAN,KAAAiB,EAAAC,EACAd,EAAAJ,KAAAmB,EACAC,GAAApB,GAGA,QAAAqB,GAAAC,EAAAjmB,EAAAC,EAAArP,GAMA,GALA,MAAAq1B,MAAA,IAKA,gBAAAA,GAAA,CACA,GAAArD,GAAAtrB,KAAAwJ,IAAAb,EAAAD,GAAAimB,EACA3yB,EAAAM,EAAAqN,SAAA,SAAA3N,GAA4C,MAAAA,GAAA,KAAe2B,MAAAixB,EAAAtD,EAC3DtvB,KAAA4yB,EAAA1yB,QACA5C,EAAAgD,EAAAgN,SAAAZ,EAAAmmB,GAAAlmB,EAAAkmB,GAAAF,GACAA,EAAAlB,GACOzxB,GACPA,EAAA4yB,EAAAtD,EAAAsD,EAAA5yB,EAAA,MAAA4yB,EAAA5yB,GAAA,GAAAsvB,EAAAtvB,EAAA,EAAAA,GACA1C,EAAA0C,EAAA,GACA2yB,EAAA3yB,EAAA,KAEA1C,EAAAgD,EAAAgN,SAAAZ,EAAAC,EAAAgmB,GACAA,EAAAX,GAIA,aAAA10B,EAAAq1B,IAAAG,MAAAx1B,GAlEA,GAAAgb,GAAAmX,EAAAf,EAAAhB,EAAA0C,mBACAL,EAAAzX,EAAAyX,OACAzrB,EAAAgU,EAAAhU,OAEA4tB,EAAAD,EAAA,OACAE,EAAAF,EAAA,OACAG,EAAAH,EAAA,SACAI,EAAAJ,EAAA,SACAK,EAAAL,EAAA,SACAM,EAAAN,EAAA,SACAO,EAAAP,EAAA,MACAQ,EAAAR,EAAA,MAEAW,IACAb,EAAA,EAAAgB,IACAhB,EAAA,IAAAgB,IACAhB,EAAA,MAAAgB,IACAhB,EAAA,MAAAgB,IACAjB,EAAA,EAAAkB,IACAlB,EAAA,IAAAkB,IACAlB,EAAA,MAAAkB,IACAlB,EAAA,MAAAkB,IACAnB,EAAA,EAAAoB,IACApB,EAAA,IAAAoB,IACApB,EAAA,IAAAoB,IACApB,EAAA,MAAAoB,IACArB,EAAA,EAAAsB,IACAtB,EAAA,IAAAsB,IACAvB,EAAA,EAAAwB,IACAzB,EAAA,EAAA0B,KACA1B,EAAA,IAAA0B,KACA3B,EAAA,EAAAoB,IAyEA,OAnCAva,GAAAyX,OAAA,SAAA1X,GACA,UAAAiZ,MAAAvB,EAAA1X,KAGAC,EAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,OAAAoE,EAAA0rB,EAAAvzB,KAAAsU,EAAAwgB,IAAAjtB,IAAAG,IAAA4sB,IAGA/Y,EAAArV,MAAA,SAAA0vB,EAAAr1B,GACA,GAIA4U,GAJApN,EAAAR,IACAqZ,EAAA7Y,EAAA,GACA+Y,EAAA/Y,IAAA5E,OAAA,GACA8b,EAAA6B,EAAAF,CAKA,OAHA3B,KAAA9J,EAAAyL,IAAAE,IAAA3L,GACAA,EAAAwgB,EAAAC,EAAAhV,EAAAE,EAAAvgB,GACA4U,MAAAnC,MAAA4N,EAAAE,EAAA,MACA7B,EAAA9J,EAAAnN,UAAAmN,GAGAoG,EAAAW,WAAA,SAAArM,EAAAmd,GACA,aAAAA,EAAA9Q,EAAAgZ,EAAAlI,IAGAzR,EAAA6X,KAAA,SAAAwC,EAAAr1B,GACA,GAAAwH,GAAAR,GACA,QAAAquB,EAAAD,EAAAC,EAAA7tB,EAAA,GAAAA,IAAA5E,OAAA,GAAA5C,IACAgH,EAAA6rB,EAAArrB,EAAA6tB,IACAra,GAGAA,EAAAiB,KAAA,WACA,MAAAA,GAAAjB,EAAAkZ,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,KAGA3Z,EA0CA,QAAA+a,GAAAvF,GACA,GAAAzf,GAAAyf,EAAA5tB,MACA,iBAAAgS,GACA,MAAA4b,GAAA9pB,KAAAG,IAAA,EAAAH,KAAAC,IAAAoK,EAAA,EAAArK,KAAA8I,MAAAoF,EAAA7D,OAYA,QAAAilB,GAAAC,GAKA,QAAAjb,GAAAlM,GACA,GAAA8F,IAAA9F,EAAAkE,IAAAC,EAAAD,EACA,OAAAijB,GAAA/D,EAAAxrB,KAAAG,IAAA,EAAAH,KAAAC,IAAA,EAAAiO,OANA,GAAA5B,GAAA,EACAC,EAAA,EACAif,GAAA,CAuBA,OAhBAlX,GAAAhU,OAAA,SAAAyM,GACA,MAAApF,WAAAzL,QAAAoQ,GAAAS,EAAA,GAAAR,GAAAQ,EAAA,GAAAuH,IAAAhI,EAAAC,IAGA+H,EAAAkX,MAAA,SAAAze,GACA,MAAApF,WAAAzL,QAAAsvB,IAAAze,EAAAuH,GAAAkX,GAGAlX,EAAAib,aAAA,SAAAxiB,GACA,MAAApF,WAAAzL,QAAAqzB,EAAAxiB,EAAAuH,GAAAib,GAGAjb,EAAAiB,KAAA,WACA,MAAA+Z,GAAAC,GAAAjvB,QAAAgM,EAAAC,IAAAif,UAGAU,EAAA5X,GAp3BA,GAAAlK,GAAAtO,MAAA6P,UAEAqgB,EAAA5hB,EAAA3J,IACAmL,EAAAxB,EAAAwB,MAEAqe,GAAgBhpB,KAAA,YA+IhB4K,EAAA,SAAAzD,GACA,kBACA,MAAAA,KAIA4C,EAAA,SAAA5C,GACA,OAAAA,GAGA0jB,GAAA,KA4GA7W,EAAA,SAAA3U,EAAAsI,EAAAmd,GACA,GAGAU,GAHA/d,EAAApI,EAAA,GACAqI,EAAArI,IAAApE,OAAA,GACA5C,EAAAgD,EAAAgN,SAAAZ,EAAAC,EAAA,MAAAC,EAAA,GAAAA,EAGA,QADAmd,EAAAppB,EAAAmpB,gBAAA,MAAAC,EAAA,KAAAA,GACAA,EAAAV,MACA,QACA,GAAAlsB,GAAA6G,KAAAG,IAAAH,KAAAwJ,IAAAd,GAAA1I,KAAAwJ,IAAAb,GAEA,OADA,OAAAod,EAAAU,WAAAnb,MAAAmb,EAAA9pB,EAAA2sB,gBAAAhwB,EAAAH,MAAA4sB,EAAAU,aACA9pB,EAAAmqB,aAAAf,EAAA5sB,EAEA,QACA,QACA,QACA,QACA,QACA,MAAA4sB,EAAAU,WAAAnb,MAAAmb,EAAA9pB,EAAA4sB,eAAAjwB,EAAA0G,KAAAG,IAAAH,KAAAwJ,IAAAd,GAAA1I,KAAAwJ,IAAAb,QAAAod,EAAAU,aAAA,MAAAV,EAAAV,MACA,MAEA,SACA,QACA,MAAAU,EAAAU,WAAAnb,MAAAmb,EAAA9pB,EAAA0sB,eAAA/vB,MAAAysB,EAAAU,YAAA,SAAAV,EAAAV,OAIA,MAAA1oB,GAAA4K,OAAAwe,IAwFAoG,EAAA,SAAA7rB,EAAAquB,GACAruB,IAAAsL,OAEA,IAIAsC,GAJAzD,EAAA,EACAC,EAAApK,EAAApE,OAAA,EACAoQ,EAAAhM,EAAAmK,GACA8B,EAAAjM,EAAAoK,EAUA,OAPA6B,GAAAD,IACA4B,EAAAzD,IAAAC,IAAAwD,EACAA,EAAA5B,IAAAC,IAAA2B,GAGA5N,EAAAmK,GAAAkkB,EAAA7lB,MAAAwD,GACAhM,EAAAoK,GAAAikB,EAAA3iB,KAAAO,GACAjM,GA4RAyuB,EAAA,IACAC,EAAA,GAAAD,EACAE,EAAA,GAAAD,EACAE,EAAA,GAAAD,EACAE,EAAA,EAAAD,EACAE,GAAA,GAAAF,EACAL,GAAA,IAAAK,EAsHAM,GAAA,WACA,MAAAhC,GAAA7D,EAAA8F,SAAA9F,EAAA+F,UAAA/F,EAAAgG,SAAAhG,EAAAiG,QAAAjG,EAAAkG,SAAAlG,EAAAmG,WAAAnG,EAAAoG,WAAApG,EAAAqG,gBAAApG,EAAAqG,YAAA3vB,QAAA,GAAAgtB,MAAA,YAAAA,MAAA,YAGA4C,GAAA,WACA,MAAA1C,GAAA7D,EAAAwG,QAAAxG,EAAAyG,SAAAzG,EAAA0G,QAAA1G,EAAA2G,OAAA3G,EAAA4G,QAAA5G,EAAA6G,UAAA7G,EAAA8G,UAAA9G,EAAA+G,eAAA9G,EAAA+G,WAAArwB,QAAAgtB,KAAAsD,IAAA,SAAAtD,KAAAsD,IAAA,YAGAx3B,GAAA,SAAAiY,GACA,MAAAA,GAAA4U,MAAA,SAAsBxlB,IAAA,SAAA2H,GACtB,UAAAA,KAIAyoB,GAAAz3B,GAAA,gEAEA03B,GAAA13B,GAAA,4HAEA23B,GAAA33B,GAAA,4HAEA43B,GAAA53B,GAAA,4HAEA63B,GAAAvH,EAAAwH,yBAAAz0B,EAAAme,UAAA,UAAAne,EAAAme,WAAA,WAEAuW,GAAAzH,EAAAwH,yBAAAz0B,EAAAme,WAAA,aAAAne,EAAAme,UAAA,YAEAwW,GAAA1H,EAAAwH,yBAAAz0B,EAAAme,UAAA,aAAAne,EAAAme,UAAA,YAEAyW,GAAA50B,EAAAme,YAEA0W,GAAA,SAAApjB,IACAA,EAAA,GAAAA,EAAA,KAAAA,GAAAlO,KAAA8I,MAAAoF,GACA,IAAAqjB,GAAAvxB,KAAAwJ,IAAA0E,EAAA,GAIA,OAHAmjB,IAAA/Y,EAAA,IAAApK,EAAA,IACAmjB,GAAAhgB,EAAA,QAAAkgB,EACAF,GAAA9Y,EAAA,MAAAgZ,EACAF,GAAA,IAUAG,GAAAnC,EAAAj2B,GAAA,qgDAEAq4B,GAAApC,EAAAj2B,GAAA,qgDAEAs4B,GAAArC,EAAAj2B,GAAA,qgDAEAu4B,GAAAtC,EAAAj2B,GAAA,ogDA+BAtB,GAAA0I,UAAA2pB,EACAryB,EAAA85B,WAAAnH,EACA3yB,EAAA+5B,cAAA/lB,EACAhU,EAAAuI,YAAAuO,EACA9W,EAAAg6B,SAAA/oB,EACAjR,EAAAi6B,aAAAlI,EACA/xB,EAAAk6B,cAAA/H,EACAnyB,EAAAm6B,SAAA/oB,EACApR,EAAAo6B,UAAAzmB,EACA3T,EAAAq6B,cAAAlF,EACAn1B,EAAAs6B,cAAAhF,EACAt1B,EAAAu6B,eAAA5lB,EACA3U,EAAAw6B,UAAA9C,GACA13B,EAAAy6B,SAAArC,GACAp4B,EAAA06B,iBAAA3B,GACA/4B,EAAA26B,kBAAA3B,GACAh5B,EAAA46B,kBAAA3B,GACAj5B,EAAA66B,iBAAA3B,GACAl5B,EAAA86B,4BAAA3B,GACAn5B,EAAA+6B,mBAAAvB,GACAx5B,EAAAg7B,gBAAA3B,GACAr5B,EAAAi7B,gBAAA3B,GACAt5B,EAAAk7B,mBAAAxB,GACA15B,EAAAm7B,iBAAAxB,GACA35B,EAAAo7B,mBAAAxB,GACA55B,EAAAq7B,kBAAAxB,GACA75B,EAAAs7B,gBAAA9D,EAEAr2B,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OVm/FxC,SAAUpB,EAAQD,EAASM,IW54HjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAI7B,SAAAu7B,MAkDA,QAAA5yB,GAAA6yB,EAAAnrB,GACA,GAAA1H,GAAA,GAAA4yB,EAGA,IAAAC,YAAAD,GAAAC,EAAAj2B,KAAA,SAAAlE,EAAAyd,GAA+DnW,EAAA8kB,IAAA3O,EAAAzd,SAG/D,IAAA2C,MAAAC,QAAAu3B,GAAA,CACA,GAEAnb,GAFAnc,GAAA,EACAqO,EAAAipB,EAAAp3B,MAGA,UAAAiM,EAAA,OAAAnM,EAAAqO,GAAA5J,EAAA8kB,IAAAvpB,EAAAs3B,EAAAt3B,QACA,QAAAA,EAAAqO,GAAA5J,EAAA8kB,IAAApd,EAAAgQ,EAAAmb,EAAAt3B,KAAAs3B,GAAAnb,OAIA,IAAAmb,EAAA,OAAA1c,KAAA0c,GAAA7yB,EAAA8kB,IAAA3O,EAAA0c,EAAA1c,GAEA,OAAAnW,GA2DA,QAAA8yB,KACA,SAGA,QAAAC,GAAAF,EAAA1c,EAAAzd,GACAm6B,EAAA1c,GAAAzd,EAGA,QAAAs6B,KACA,MAAAhzB,KAGA,QAAAizB,GAAAC,EAAA/c,EAAAzd,GACAw6B,EAAApO,IAAA3O,EAAAzd,GAGA,QAAAy6B,MAoBA,QAAArO,GAAA+N,EAAAnrB,GACA,GAAAod,GAAA,GAAAqO,EAGA,IAAAN,YAAAM,GAAAN,EAAAj2B,KAAA,SAAAlE,GAA0DosB,EAAAsO,IAAA16B,SAG1D,IAAAm6B,EAAA,CACA,GAAAt3B,IAAA,EAAAqO,EAAAipB,EAAAp3B,MACA,UAAAiM,EAAA,OAAAnM,EAAAqO,GAAAkb,EAAAsO,IAAAP,EAAAt3B,QACA,QAAAA,EAAAqO,GAAAkb,EAAAsO,IAAA1rB,EAAAmrB,EAAAt3B,KAAAs3B,IAGA,MAAA/N,GAnLA,GAAAiD,GAAA,GAIA6K,GAAA1nB,UAAAlL,EAAAkL,WACAkP,YAAAwY,EACAnJ,IAAA,SAAAtT,GACA,MAAA4R,GAAA5R,IAAA1e,OAEAotB,IAAA,SAAA1O,GACA,MAAA1e,MAAAswB,EAAA5R,IAEA2O,IAAA,SAAA3O,EAAAzd,GAEA,MADAjB,MAAAswB,EAAA5R,GAAAzd,EACAjB,MAEAwN,OAAA,SAAAkR,GACA,GAAAkd,GAAAtL,EAAA5R,CACA,OAAAkd,KAAA57B,mBAAA47B,IAEAC,MAAA,WACA,OAAAD,KAAA57B,MAAA47B,EAAA,KAAAtL,SAAAtwB,MAAA47B,IAEAE,KAAA,WACA,GAAAA,KACA,QAAAF,KAAA57B,MAAA47B,EAAA,KAAAtL,GAAAwL,EAAAlnB,KAAAgnB,EAAAloB,MAAA,GACA,OAAAooB,IAEAlpB,OAAA,WACA,GAAAA,KACA,QAAAgpB,KAAA57B,MAAA47B,EAAA,KAAAtL,GAAA1d,EAAAgC,KAAA5U,KAAA47B,GACA,OAAAhpB,IAEAmpB,QAAA,WACA,GAAAA,KACA,QAAAH,KAAA57B,MAAA47B,EAAA,KAAAtL,GAAAyL,EAAAnnB,MAAyE8J,IAAAkd,EAAAloB,MAAA,GAAAzS,MAAAjB,KAAA47B,IACzE,OAAAG,IAEAC,KAAA,WACA,GAAAA,GAAA,CACA,QAAAJ,KAAA57B,MAAA47B,EAAA,KAAAtL,KAAA0L,CACA,OAAAA,IAEAC,MAAA,WACA,OAAAL,KAAA57B,MAAA,GAAA47B,EAAA,KAAAtL,EAAA,QACA,WAEAnrB,KAAA,SAAA8K,GACA,OAAA2rB,KAAA57B,MAAA47B,EAAA,KAAAtL,GAAArgB,EAAAjQ,KAAA47B,KAAAloB,MAAA,GAAA1T,OA0BA,IAAAk8B,GAAA,WAOA,QAAAtsB,GAAAsC,EAAAiqB,EAAAC,EAAAC,GACA,GAAAF,GAAAL,EAAA93B,OAEA,MADA,OAAAs4B,GAAApqB,EAAAgD,KAAAonB,GACA,MAAAC,IAAArqB,IAYA,KATA,GAGAsqB,GACAv7B,EAEA2R,EANA9O,GAAA,EACAqO,EAAAD,EAAAlO,OACA0a,EAAAod,EAAAK,KAGAM,EAAAl0B,IAEAm0B,EAAAN,MAEAt4B,EAAAqO,IACAS,EAAA6pB,EAAArP,IAAAoP,EAAA9d,EAAAzd,EAAAiR,EAAApO,IAAA,KACA8O,EAAAgC,KAAA3T,GAEAw7B,EAAApP,IAAAmP,GAAAv7B,GAQA,OAJAw7B,GAAAt3B,KAAA,SAAAyN,EAAA8L,GACA2d,EAAAK,EAAAhe,EAAA9O,EAAAgD,EAAAupB,EAAAC,EAAAC,MAGAK,EAGA,QAAAX,GAAAN,EAAAU,GACA,KAAAA,EAAAL,EAAA93B,OAAA,MAAAy3B,EACA,IAAAvpB,GAAAyqB,EAAAC,EAAAT,EAAA,EAGA,OAFA,OAAAI,GAAAJ,GAAAL,EAAA93B,OAAAkO,EAAAupB,EAAAM,WACA7pB,KAAAupB,EAAAt2B,KAAA,SAAAmO,EAAAuK,GAAiD3L,EAAA0C,MAAa8J,IAAAb,EAAAjL,OAAAmpB,EAAAzoB,EAAA6oB,QAC9D,MAAAQ,EAAAzqB,EAAAgD,KAAA,SAAA7E,EAAAC,GAAwD,MAAAqsB,GAAAtsB,EAAAqO,IAAApO,EAAAoO,OAAgCxM,EAzCxF,GAEAoqB,GACAC,EACAL,EAJAJ,KACAc,IA2CA,OAAAV,IACAd,OAAA,SAAAlpB,GAA6B,MAAAtC,GAAAsC,EAAA,EAAAmpB,EAAAC,IAC7B/yB,IAAA,SAAA2J,GAA0B,MAAAtC,GAAAsC,EAAA,EAAAqpB,EAAAC,IAC1BO,QAAA,SAAA7pB,GAA8B,MAAA6pB,GAAAnsB,EAAAsC,EAAA,EAAAqpB,EAAAC,GAAA,IAC9B9c,IAAA,SAAA9V,GAAoC,MAAdkzB,GAAAlnB,KAAAhM,GAAcszB,GACpCU,SAAA,SAAAnf,GAAkE,MAAnCmf,GAAAd,EAAA93B,OAAA,GAAAyZ,EAAmCye,GAClEI,WAAA,SAAA7e,GAAqD,MAApB6e,GAAA7e,EAAoBye,GACrDK,OAAA,SAAAtsB,GAAqC,MAAZssB,GAAAtsB,EAAYisB,KAsBrCW,EAAAt0B,EAAAkL,SAEAioB,GAAAjoB,UAAA4Z,EAAA5Z,WACAkP,YAAA+Y,EACA1J,IAAA6K,EAAA7K,IACA2J,IAAA,SAAA16B,GAGA,MAFAA,IAAA,GACAjB,KAAAswB,EAAArvB,KACAjB,MAEAwN,OAAAqvB,EAAArvB,OACAquB,MAAAgB,EAAAhB,MACAjpB,OAAAiqB,EAAAf,KACAE,KAAAa,EAAAb,KACAC,MAAAY,EAAAZ,MACA92B,KAAA03B,EAAA13B,KAmBA,IAAA22B,GAAA,SAAAvzB,GACA,GAAAuzB,KACA,QAAApd,KAAAnW,GAAAuzB,EAAAlnB,KAAA8J,EACA,OAAAod,IAGAlpB,EAAA,SAAArK,GACA,GAAAqK,KACA,QAAA8L,KAAAnW,GAAAqK,EAAAgC,KAAArM,EAAAmW,GACA,OAAA9L,IAGAmpB,EAAA,SAAAxzB,GACA,GAAAwzB,KACA,QAAArd,KAAAnW,GAAAwzB,EAAAnnB,MAAqC8J,MAAAzd,MAAAsH,EAAAmW,IACrC,OAAAqd,GAGAn8B,GAAAs8B,OACAt8B,EAAAytB,MACAztB,EAAA2I,MACA3I,EAAAk8B,OACAl8B,EAAAgT,SACAhT,EAAAm8B,UAEAh7B,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OXs5HxC,SAAUpB,EAAQD,EAASM,IY3mIjC,SAAA6P,EAAApQ,GACAA,EAAAC,EAAAM,EAAA,KAGCF,KAAA,SAAAJ,EAAA2E,GAAoC,YAErC,SAAAu4B,GAAAnb,EAAAob,EAAAC,EAAAC,EAAAC,GACA,GAAA1b,GAAAG,IAAAJ,EAAAC,EAAAG,CACA,aAAAA,EAAA,EAAAH,EAAAD,GAAAwb,GACA,IAAAvb,EAAA,EAAAD,GAAAyb,GACA,IAAArb,EAAA,EAAAH,EAAA,EAAAD,GAAA0b,EACA1b,EAAA2b,GAAA,EAiCA,QAAAxmB,GAAArG,EAAAzH,GACA,gBAAAoN,GACA,MAAA3F,GAAA2F,EAAApN,GAIA,QAAAu0B,GAAA9sB,EAAAC,EAAA6L,GACA,MAAA9L,GAAAvI,KAAAkJ,IAAAX,EAAA8L,GAAA7L,EAAAxI,KAAAkJ,IAAAV,EAAA6L,GAAA9L,EAAA8L,EAAA,EAAAA,EAAA,SAAAnG,GACA,MAAAlO,MAAAkJ,IAAAX,EAAA2F,EAAA1F,EAAA6L,IAIA,QAAAihB,GAAA/sB,EAAAC,GACA,GAAA1H,GAAA0H,EAAAD,CACA,OAAAzH,GAAA8N,EAAArG,EAAAzH,EAAA,KAAAA,GAAA,IAAAA,EAAA,IAAAd,KAAAyU,MAAA3T,EAAA,KAAAA,GAAA+K,EAAAP,MAAA/C,GAAAC,EAAAD,GAGA,QAAAgtB,GAAAlhB,GACA,YAAAA,MAAAmhB,EAAA,SAAAjtB,EAAAC,GACA,MAAAA,GAAAD,EAAA8sB,EAAA9sB,EAAAC,EAAA6L,GAAAxI,EAAAP,MAAA/C,GAAAC,EAAAD,IAIA,QAAAitB,GAAAjtB,EAAAC,GACA,GAAA1H,GAAA0H,EAAAD,CACA,OAAAzH,GAAA8N,EAAArG,EAAAzH,GAAA+K,EAAAP,MAAA/C,GAAAC,EAAAD,GAyBA,QAAAktB,GAAAC,GACA,gBAAAt8B,GACA,GAIA4C,GAAA25B,EAJAtrB,EAAAjR,EAAA8C,OACA8b,EAAA,GAAAlc,OAAAuO,GACA4N,EAAA,GAAAnc,OAAAuO,GACA7B,EAAA,GAAA1M,OAAAuO,EAEA,KAAArO,EAAA,EAAeA,EAAAqO,IAAOrO,EACtB25B,EAAAl5B,EAAA2b,IAAAhf,EAAA4C,IACAgc,EAAAhc,GAAA25B,EAAA3d,GAAA,EACAC,EAAAjc,GAAA25B,EAAA1d,GAAA,EACAzP,EAAAxM,GAAA25B,EAAAntB,GAAA,CAMA,OAJAwP,GAAA0d,EAAA1d,GACAC,EAAAyd,EAAAzd,GACAzP,EAAAktB,EAAAltB,GACAmtB,EAAAtd,QAAA,EACA,SAAAnK,GAIA,MAHAynB,GAAA3d,IAAA9J,GACAynB,EAAA1d,IAAA/J,GACAynB,EAAAntB,IAAA0F,GACAynB,EAAA,KA8DA,QAAApP,GAAA/d,GACA,kBACA,MAAAA,IAIA,QAAAotB,GAAAptB,GACA,gBAAA0F,GACA,MAAA1F,GAAA0F,GAAA,IAsGA,QAAA2nB,GAAA18B,GACA,eAAAA,EAAA2S,GACAgqB,MAAAC,SAAAC,cAAA,OAAAC,EAAAF,SAAAG,gBAAAC,EAAAJ,SAAAK,aACAN,EAAArwB,MAAAwQ,UAAA9c,EACAA,EAAAg9B,EAAAE,iBAAAJ,EAAAK,YAAAR,GAAA,MAAAS,iBAAA,aACAN,EAAAO,YAAAV,GACA38B,IAAAyS,MAAA,MAAAuZ,MAAA,KACAsR,GAAAt9B,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,KAGA,QAAAu9B,GAAAv9B,GACA,aAAAA,EAAA2S,GACA6qB,MAAAZ,SAAAa,gBAAA,mCACAD,EAAAE,aAAA,YAAA19B,IACAA,EAAAw9B,EAAA1gB,UAAA6gB,QAAAC,gBACA59B,IAAAkV,OACAooB,EAAAt9B,EAAAoP,EAAApP,EAAAqP,EAAArP,EAAAR,EAAAQ,EAAA2H,EAAA3H,EAAA+M,EAAA/M,EAAAgP,IAFA2D,GAKA,QAAAkrB,GAAAC,EAAAC,EAAAC,EAAAC,GAEA,QAAAzqB,GAAA0E,GACA,MAAAA,GAAAnV,OAAAmV,EAAA1E,MAAA,OAGA,QAAA0qB,GAAAC,EAAAC,EAAAC,EAAAC,EAAApmB,EAAAqmB,GACA,GAAAJ,IAAAE,GAAAD,IAAAE,EAAA,CACA,GAAAz7B,GAAAqV,EAAAvE,KAAA,kBAAAoqB,EAAA,KAAAC,EACAO,GAAA5qB,MAAc9Q,IAAA,EAAAoM,EAAA4C,EAAAssB,EAAAE,KAA+Bx7B,IAAA,EAAAoM,EAAA4C,EAAAusB,EAAAE,UACxCD,GAAAC,IACLpmB,EAAAvE,KAAA,aAAA0qB,EAAAN,EAAAO,EAAAN,GAIA,QAAAQ,GAAApvB,EAAAC,EAAA6I,EAAAqmB,GACAnvB,IAAAC,GACAD,EAAAC,EAAA,IAAAA,GAAA,IAAgCA,EAAAD,EAAA,MAAAA,GAAA,KAChCmvB,EAAA5qB,MAAc9Q,EAAAqV,EAAAvE,KAAAH,EAAA0E,GAAA,eAAA+lB,GAAA,EAAAhvB,EAAA4C,EAAAzC,EAAAC,MACTA,GACL6I,EAAAvE,KAAAH,EAAA0E,GAAA,UAAA7I,EAAA4uB,GAIA,QAAAQ,GAAArvB,EAAAC,EAAA6I,EAAAqmB,GACAnvB,IAAAC,EACAkvB,EAAA5qB,MAAc9Q,EAAAqV,EAAAvE,KAAAH,EAAA0E,GAAA,cAAA+lB,GAAA,EAAAhvB,EAAA4C,EAAAzC,EAAAC,KACTA,GACL6I,EAAAvE,KAAAH,EAAA0E,GAAA,SAAA7I,EAAA4uB,GAIA,QAAA9iB,GAAAgjB,EAAAC,EAAAC,EAAAC,EAAApmB,EAAAqmB,GACA,GAAAJ,IAAAE,GAAAD,IAAAE,EAAA,CACA,GAAAz7B,GAAAqV,EAAAvE,KAAAH,EAAA0E,GAAA,2BACAqmB,GAAA5qB,MAAc9Q,IAAA,EAAAoM,EAAA4C,EAAAssB,EAAAE,KAA+Bx7B,IAAA,EAAAoM,EAAA4C,EAAAusB,EAAAE,SACxC,KAAAD,GAAA,IAAAC,GACLpmB,EAAAvE,KAAAH,EAAA0E,GAAA,SAAAmmB,EAAA,IAAAC,EAAA,KAIA,gBAAAlvB,EAAAC,GACA,GAAA6I,MACAqmB,IAOA,OANAnvB,GAAA0uB,EAAA1uB,GAAAC,EAAAyuB,EAAAzuB,GACA6uB,EAAA9uB,EAAA4L,WAAA5L,EAAA6L,WAAA5L,EAAA2L,WAAA3L,EAAA4L,WAAA/C,EAAAqmB,GACAC,EAAApvB,EAAAovB,OAAAnvB,EAAAmvB,OAAAtmB,EAAAqmB,GACAE,EAAArvB,EAAAqvB,MAAApvB,EAAAovB,MAAAvmB,EAAAqmB,GACApjB,EAAA/L,EAAAsvB,OAAAtvB,EAAAuvB,OAAAtvB,EAAAqvB,OAAArvB,EAAAsvB,OAAAzmB,EAAAqmB,GACAnvB,EAAAC,EAAA,KACA,SAAA0F,GAEA,IADA,GAAAiK,GAAAnc,GAAA,EAAAqO,EAAAqtB,EAAAx7B,SACAF,EAAAqO,GAAAgH,GAAA8G,EAAAuf,EAAA17B,OAAAmc,EAAA/P,EAAA8F,EACA,OAAAmD,GAAAkW,KAAA,MAaA,QAAA3C,GAAAxc,GACA,QAAAA,EAAApI,KAAAwsB,IAAApkB,IAAA,EAAAA,GAAA,EAGA,QAAAyc,GAAAzc,GACA,QAAAA,EAAApI,KAAAwsB,IAAApkB,IAAA,EAAAA,GAAA,EAGA,QAAA2vB,GAAA3vB,GACA,QAAAA,EAAApI,KAAAwsB,IAAA,EAAApkB,IAAA,IAAAA,EAAA,GAmDA,QAAA4vB,GAAAC,GACA,gBAAAvvB,EAAAwvB,GACA,GAAA5f,GAAA2f,GAAAvvB,EAAAjM,EAAAic,IAAAhQ,IAAA4P,GAAA4f,EAAAz7B,EAAAic,IAAAwf,IAAA5f,GACAjH,EAAAmkB,EAAA9sB,EAAA2I,EAAA6mB,EAAA7mB,GACAkH,EAAAid,EAAA9sB,EAAA6P,EAAA2f,EAAA3f,GACAF,EAAAmd,EAAA9sB,EAAA2P,QAAA6f,EAAA7f,QACA,iBAAAnK,GAKA,MAJAxF,GAAA4P,IAAApK,GACAxF,EAAA2I,IAAAnD,GACAxF,EAAA6P,IAAArK,GACAxF,EAAA2P,UAAAnK,GACAxF,EAAA,KAQA,QAAAyvB,GAAAzvB,EAAAwvB,GACA,GAAA3f,GAAAid,GAAA9sB,EAAAjM,EAAA+c,IAAA9Q,IAAA6P,GAAA2f,EAAAz7B,EAAA+c,IAAA0e,IAAA3f,GACAhQ,EAAAitB,EAAA9sB,EAAAH,EAAA2vB,EAAA3vB,GACAC,EAAAgtB,EAAA9sB,EAAAF,EAAA0vB,EAAA1vB,GACA6P,EAAAmd,EAAA9sB,EAAA2P,QAAA6f,EAAA7f,QACA,iBAAAnK,GAKA,MAJAxF,GAAA6P,IAAArK,GACAxF,EAAAH,IAAA2F,GACAxF,EAAAF,IAAA0F,GACAxF,EAAA2P,UAAAnK,GACAxF,EAAA,IAIA,QAAA0vB,GAAAH,GACA,gBAAAvvB,EAAAwvB,GACA,GAAA5f,GAAA2f,GAAAvvB,EAAAjM,EAAAyd,IAAAxR,IAAA4P,GAAA4f,EAAAz7B,EAAAyd,IAAAge,IAAA5f,GACA3f,EAAA68B,EAAA9sB,EAAA/P,EAAAu/B,EAAAv/B,GACA4f,EAAAid,EAAA9sB,EAAA6P,EAAA2f,EAAA3f,GACAF,EAAAmd,EAAA9sB,EAAA2P,QAAA6f,EAAA7f,QACA,iBAAAnK,GAKA,MAJAxF,GAAA4P,IAAApK,GACAxF,EAAA/P,IAAAuV,GACAxF,EAAA6P,IAAArK,GACAxF,EAAA2P,UAAAnK,GACAxF,EAAA,KAQA,QAAAuoB,GAAAgH,GACA,eAAAI,GAAAhkB,GAGA,QAAAikB,GAAA5vB,EAAAwvB,GACA,GAAA5f,GAAA2f,GAAAvvB,EAAAjM,EAAAme,UAAAlS,IAAA4P,GAAA4f,EAAAz7B,EAAAme,UAAAsd,IAAA5f,GACAjH,EAAAmkB,EAAA9sB,EAAA2I,EAAA6mB,EAAA7mB,GACAkH,EAAAid,EAAA9sB,EAAA6P,EAAA2f,EAAA3f,GACAF,EAAAmd,EAAA9sB,EAAA2P,QAAA6f,EAAA7f,QACA,iBAAAnK,GAKA,MAJAxF,GAAA4P,IAAApK,GACAxF,EAAA2I,IAAAnD,GACAxF,EAAA6P,IAAAvY,KAAAkJ,IAAAgF,EAAAmG,IACA3L,EAAA2P,UAAAnK,GACAxF,EAAA,IAMA,MAlBA2L,MAgBAikB,EAAA/C,MAAA8C,EAEAC,GACG,GA3eH,GA4QAxC,GACAG,EACAE,EACAQ,EA/QA4B,EAAA,SAAAztB,GACA,GAAAT,GAAAS,EAAA5O,OAAA,CACA,iBAAAgS,GACA,GAAAlS,GAAAkS,GAAA,EAAAA,EAAA,EAAAA,GAAA,GAAAA,EAAA,EAAA7D,EAAA,GAAArK,KAAA8I,MAAAoF,EAAA7D,GACA6qB,EAAApqB,EAAA9O,GACAm5B,EAAArqB,EAAA9O,EAAA,GACAi5B,EAAAj5B,EAAA,EAAA8O,EAAA9O,EAAA,KAAAk5B,EAAAC,EACAC,EAAAp5B,EAAAqO,EAAA,EAAAS,EAAA9O,EAAA,KAAAm5B,EAAAD,CACA,OAAAF,IAAA9mB,EAAAlS,EAAAqO,KAAA4qB,EAAAC,EAAAC,EAAAC,KAIAoD,EAAA,SAAA1tB,GACA,GAAAT,GAAAS,EAAA5O,MACA,iBAAAgS,GACA,GAAAlS,GAAAgE,KAAA8I,QAAAoF,GAAA,OAAAA,KAAA7D,GACA4qB,EAAAnqB,GAAA9O,EAAAqO,EAAA,GAAAA,GACA6qB,EAAApqB,EAAA9O,EAAAqO,GACA8qB,EAAArqB,GAAA9O,EAAA,GAAAqO,GACA+qB,EAAAtqB,GAAA9O,EAAA,GAAAqO,EACA,OAAA2qB,IAAA9mB,EAAAlS,EAAAqO,KAAA4qB,EAAAC,EAAAC,EAAAC,KAIAvpB,EAAA,SAAAzD,GACA,kBACA,MAAAA,KAgCAqwB,EAAA,QAAAC,GAAArkB,GAGA,QAAAskB,GAAAjwB,EAAAwvB,GACA,GAAAlgB,GAAA2d,GAAAjtB,EAAAjM,EAAA2b,IAAA1P,IAAAsP,GAAAkgB,EAAAz7B,EAAA2b,IAAA8f,IAAAlgB,GACAC,EAAA0d,EAAAjtB,EAAAuP,EAAAigB,EAAAjgB,GACAzP,EAAAmtB,EAAAjtB,EAAAF,EAAA0vB,EAAA1vB,GACA6P,EAAAmd,EAAA9sB,EAAA2P,QAAA6f,EAAA7f,QACA,iBAAAnK,GAKA,MAJAxF,GAAAsP,IAAA9J,GACAxF,EAAAuP,IAAA/J,GACAxF,EAAAF,IAAA0F,GACAxF,EAAA2P,UAAAnK,GACAxF,EAAA,IAZA,GAAAitB,GAAAJ,EAAAlhB,EAkBA,OAFAskB,GAAApD,MAAAmD,EAEAC,GACC,GA4BDC,EAAAnD,EAAA8C,GACAM,EAAApD,EAAA+C,GAEApuB,EAAA,SAAA7B,EAAAC,GACA,GAIAxM,GAJA88B,EAAAtwB,IAAAtM,OAAA,EACA68B,EAAAxwB,EAAAvI,KAAAC,IAAA64B,EAAAvwB,EAAArM,QAAA,EACAkM,EAAA,GAAAtM,OAAAg9B,GACAngC,EAAA,GAAAmD,OAAAg9B,EAGA,KAAA98B,EAAA,EAAaA,EAAA+8B,IAAQ/8B,EAAAoM,EAAApM,GAAA7C,EAAAoP,EAAAvM,GAAAwM,EAAAxM,GACrB,MAAQA,EAAA88B,IAAQ98B,EAAArD,EAAAqD,GAAAwM,EAAAxM,EAEhB,iBAAAkS,GACA,IAAAlS,EAAA,EAAeA,EAAA+8B,IAAQ/8B,EAAArD,EAAAqD,GAAAoM,EAAApM,GAAAkS,EACvB,OAAAvV,KAIA00B,EAAA,SAAA9kB,EAAAC,GACA,GAAA1H,GAAA,GAAAwsB,KACA,OAAA/kB,MAAAC,GAAAD,EAAA,SAAA2F,GACA,MAAApN,GAAAk4B,QAAAzwB,EAAAC,EAAA0F,GAAApN,IAIAkK,EAAA,SAAAzC,EAAAC,GACA,MAAAD,MAAAC,GAAAD,EAAA,SAAA2F,GACA,MAAA3F,GAAAC,EAAA0F,IAIAolB,EAAA,SAAA/qB,EAAAC,GACA,GAEAuN,GAFA/Z,KACArD,IAGA,QAAA4P,GAAA,gBAAAA,WACA,OAAAC,GAAA,gBAAAA,UAEA,KAAAuN,IAAAvN,GACAuN,IAAAxN,GACAvM,EAAA+Z,GAAA5c,EAAAoP,EAAAwN,GAAAvN,EAAAuN,IAEApd,EAAAod,GAAAvN,EAAAuN,EAIA,iBAAA7H,GACA,IAAA6H,IAAA/Z,GAAArD,EAAAod,GAAA/Z,EAAA+Z,GAAA7H,EACA,OAAAvV,KAIAsgC,EAAA,8CACAC,EAAA,GAAAhe,QAAA+d,EAAA5N,OAAA,KAcA8N,EAAA,SAAA5wB,EAAAC,GACA,GACA4wB,GACAC,EACAC,EAHAC,EAAAN,EAAAO,UAAAN,EAAAM,UAAA,EAIAx9B,GAAA,EACAqV,KACAqmB,IAMA,KAHAnvB,GAAA,GAAAC,GAAA,IAGA4wB,EAAAH,EAAAhiB,KAAA1O,MACA8wB,EAAAH,EAAAjiB,KAAAzO,MACA8wB,EAAAD,EAAAtP,OAAAwP,IACAD,EAAA9wB,EAAAoD,MAAA2tB,EAAAD,GACAjoB,EAAArV,GAAAqV,EAAArV,IAAAs9B,EACAjoB,IAAArV,GAAAs9B,IAEAF,IAAA,OAAAC,IAAA,IACAhoB,EAAArV,GAAAqV,EAAArV,IAAAq9B,EACAhoB,IAAArV,GAAAq9B,GAEAhoB,IAAArV,GAAA,KACA07B,EAAA5qB,MAAc9Q,IAAAoM,EAAA4C,EAAAouB,EAAAC,MAEdE,EAAAL,EAAAM,SAYA,OARAD,GAAA/wB,EAAAtM,SACAo9B,EAAA9wB,EAAAoD,MAAA2tB,GACAloB,EAAArV,GAAAqV,EAAArV,IAAAs9B,EACAjoB,IAAArV,GAAAs9B,GAKAjoB,EAAAnV,OAAA,EAAAw7B,EAAA,GACA9B,EAAA8B,EAAA,GAAAtvB,GACAme,EAAA/d,IACAA,EAAAkvB,EAAAx7B,OAAA,SAAAgS,GACA,OAAAiK,GAAAnc,EAAA,EAA4BA,EAAAwM,IAAOxM,EAAAqV,GAAA8G,EAAAuf,EAAA17B,OAAAmc,EAAA/P,EAAA8F,EACnC,OAAAmD,GAAAkW,KAAA,OAIApuB,EAAA,SAAAoP,EAAAC,GACA,GAAA7P,GAAAuV,QAAA1F,EACA,cAAAA,GAAA,YAAA0F,EAAArC,EAAArD,IACA,WAAA0F,EAAAlD,EACA,WAAAkD,GAAAvV,EAAA8D,EAAAyE,MAAAsH,OAAA7P,EAAA8/B,GAAAU,EACA3wB,YAAA/L,GAAAyE,MAAAu3B,EACAjwB,YAAA8kB,MAAAD,EACAvxB,MAAAC,QAAAyM,GAAA4B,EACA,kBAAA5B,GAAAixB,SAAA,kBAAAjxB,GAAAgc,UAAAlZ,MAAA9C,GAAA8qB,EACAtoB,GAAAzC,EAAAC,IAGAiM,EAAA,SAAAlM,EAAAC,GACA,MAAAD,MAAAC,GAAAD,EAAA,SAAA2F,GACA,MAAAlO,MAAAyU,MAAAlM,EAAAC,EAAA0F,KAIAwrB,EAAA,IAAA15B,KAAAkR,GAEApF,GACAqI,WAAA,EACAC,WAAA,EACAujB,OAAA,EACAC,MAAA,EACAC,OAAA,EACAC,OAAA,GAGArB,EAAA,SAAAluB,EAAAC,EAAA7P,EAAAmI,EAAAoF,EAAAiC,GACA,GAAA0vB,GAAAC,EAAAF,CAKA,QAJAC,EAAA73B,KAAAyL,KAAAlD,IAAAC,QAAAD,GAAAsvB,EAAArvB,GAAAqvB,IACAD,EAAArvB,EAAA5P,EAAA6P,EAAA1H,KAAAnI,GAAA4P,EAAAqvB,EAAA92B,GAAA0H,EAAAovB,IACAE,EAAA93B,KAAAyL,KAAA9S,IAAAmI,QAAAnI,GAAAm/B,EAAAh3B,GAAAg3B,EAAAF,GAAAE,GACAvvB,EAAAzH,EAAA0H,EAAA7P,IAAA4P,KAAAC,KAAAovB,KAAAC,OAEA1jB,WAAAjO,EACAkO,WAAAjM,EACAwvB,OAAA33B,KAAAga,MAAAxR,EAAAD,GAAAmxB,EACA9B,MAAA53B,KAAA25B,KAAA/B,GAAA8B,EACA7B,SACAC,WAsFA8B,EAAA5C,EAAAnB,EAAA,qBACAgE,EAAA7C,EAAAN,EAAA,cAEAoD,EAAA95B,KAAA+5B,MACAC,EAAA,EACAC,EAAA,EACAC,EAAA,MAgBAC,EAAA,SAAAC,EAAAC,GACA,GAKAr+B,GACAs+B,EANAC,EAAAH,EAAA,GAAAI,EAAAJ,EAAA,GAAAK,EAAAL,EAAA,GACAM,EAAAL,EAAA,GAAAM,EAAAN,EAAA,GAAAO,EAAAP,EAAA,GACAQ,EAAAH,EAAAH,EACAO,EAAAH,EAAAH,EACAO,EAAAF,IAAAC,GAKA,IAAAC,EAAAb,EACAI,EAAAt6B,KAAA+I,IAAA6xB,EAAAH,GAAAX,EACA99B,EAAA,SAAAkS,GACA,OACAqsB,EAAArsB,EAAA2sB,EACAL,EAAAtsB,EAAA4sB,EACAL,EAAAz6B,KAAAwsB,IAAAsN,EAAA5rB,EAAAosB,SAMA,CACA,GAAArP,GAAAjrB,KAAAyL,KAAAsvB,GACA5qB,GAAAyqB,IAAAH,IAAAR,EAAAc,IAAA,EAAAN,EAAAT,EAAA/O,GACA/a,GAAA0qB,IAAAH,IAAAR,EAAAc,IAAA,EAAAH,EAAAZ,EAAA/O,GACAC,EAAAlrB,KAAA+I,IAAA/I,KAAAyL,KAAA0E,IAAA,GAAAA,GACAgb,EAAAnrB,KAAA+I,IAAA/I,KAAAyL,KAAAyE,IAAA,GAAAA,EACAoqB,IAAAnP,EAAAD,GAAA4O,EACA99B,EAAA,SAAAkS,GACA,GAAAmD,GAAAnD,EAAAosB,EACAU,EAAApW,EAAAsG,GACA6B,EAAA0N,GAAAT,EAAA/O,IAAA+P,EAAAjD,EAAA+B,EAAAzoB,EAAA6Z,GAAArG,EAAAqG,GACA,QACAqP,EAAAxN,EAAA8N,EACAL,EAAAzN,EAAA+N,EACAL,EAAAO,EAAApW,EAAAkV,EAAAzoB,EAAA6Z,KAOA,MAFAlvB,GAAAyH,SAAA,IAAA62B,EAEAt+B,GAmBAi/B,EAAAjD,EAAA1C,GACA4F,EAAAlD,EAAAxC,GAgCA2F,EAAA/C,EAAA9C,GACA8F,EAAAhD,EAAA5C,GA0BA6F,GAAApK,EAAAqE,GACAgG,GAAArK,EAAAuE,GAEApI,GAAA,SAAAmC,EAAAllB,GAEA,OADAkxB,GAAA,GAAAz/B,OAAAuO,GACArO,EAAA,EAAiBA,EAAAqO,IAAOrO,EAAAu/B,EAAAv/B,GAAAuzB,EAAAvzB,GAAAqO,EAAA,GACxB,OAAAkxB,GAGAzjC,GAAAyzB,YAAApyB,EACArB,EAAA0jC,iBAAApxB,EACAtS,EAAA2jC,iBAAAlD,EACAzgC,EAAA4jC,uBAAAlD,EACA1gC,EAAA6jC,gBAAAtO,EACAv1B,EAAAs0B,kBAAAphB,EACAlT,EAAA8jC,kBAAAtI,EACAx7B,EAAAm0B,iBAAAxX,EACA3c,EAAA+jC,kBAAA1C,EACArhC,EAAA8hC,0BACA9hC,EAAA+hC,0BACA/hC,EAAAgkC,gBAAA3B,EACAriC,EAAAikC,eAAAtD,EACA3gC,EAAAkkC,oBAAApD,EACA9gC,EAAAmkC,0BAAApD;AACA/gC,EAAAokC,eAAAjB,EACAnjC,EAAAqkC,mBAAAjB,EACApjC,EAAAskC,eAAAjE,EACArgC,EAAAukC,eAAAlB,EACArjC,EAAAwkC,mBAAAlB,EACAtjC,EAAAykC,qBAAAlB,GACAvjC,EAAAo5B,yBAAAoK,GACAxjC,EAAAs1B,YAEAn0B,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OZqnIxC,SAAUpB,EAAQD,EAASM,IalpJjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAK7B,SAAA0kC,GAAAC,EAAAC,EAAA9zB,EAAA+zB,GAEA,QAAAhO,GAAAtB,GACA,MAAAoP,GAAApP,EAAA,GAAAC,OAAAD,MA2DA,MAxDAsB,GAAA7lB,MAAA6lB,EAEAA,EAAA3iB,KAAA,SAAAqhB,GACA,MAAAoP,GAAApP,EAAA,GAAAC,MAAAD,EAAA,IAAAqP,EAAArP,EAAA,GAAAoP,EAAApP,MAGAsB,EAAAla,MAAA,SAAA4Y,GACA,GAAArC,GAAA2D,EAAAtB,GACApC,EAAA0D,EAAA3iB,KAAAqhB,EACA,OAAAA,GAAArC,EAAAC,EAAAoC,EAAArC,EAAAC,GAGA0D,EAAAna,OAAA,SAAA6Y,EAAA/zB,GACA,MAAAojC,GAAArP,EAAA,GAAAC,OAAAD,GAAA,MAAA/zB,EAAA,EAAA0G,KAAA8I,MAAAxP,IAAA+zB,GAGAsB,EAAA5iB,MAAA,SAAArD,EAAAC,EAAArP,GACA,GAAAyS,KAGA,IAFArD,EAAAimB,EAAA3iB,KAAAtD,GACApP,EAAA,MAAAA,EAAA,EAAA0G,KAAA8I,MAAAxP,KACAoP,EAAAC,GAAArP,EAAA,SAAAyS,EACA,GAAAA,GAAAe,KAAA,GAAAwgB,OAAA5kB,UAAoCg0B,EAAAh0B,EAAApP,GAAAmjC,EAAA/zB,KAAAC,EACpC,OAAAoD,IAGA4iB,EAAAptB,OAAA,SAAA4nB,GACA,MAAAqT,GAAA,SAAAnP,GACA,GAAAA,KAAA,KAAAoP,EAAApP,IAAAlE,EAAAkE,MAAA2L,QAAA3L,EAAA,IACK,SAAAA,EAAA/zB,GACL,GAAA+zB,KACA,GAAA/zB,EAAA,SAAAA,GAAA,GACA,KAAAojC,EAAArP,GAAA,IAAAlE,EAAAkE,SACS,QAAA/zB,GAAA,GACT,KAAAojC,EAAArP,EAAA,IAAAlE,EAAAkE,SAMAzkB,IACA+lB,EAAA/lB,MAAA,SAAAF,EAAAwvB,GAGA,MAFAve,GAAAqf,SAAAtwB,GAAAmR,EAAAmf,SAAAd,GACAuE,EAAA9iB,GAAA8iB,EAAA5iB,GACA7Z,KAAA8I,MAAAF,EAAA+Q,EAAAE,KAGA8U,EAAAG,MAAA,SAAAx1B,GAEA,MADAA,GAAA0G,KAAA8I,MAAAxP,GACA2S,SAAA3S,MAAA,EACAA,EAAA,EACAq1B,EAAAptB,OAAAo7B,EACA,SAAA77B,GAA6B,MAAA67B,GAAA77B,GAAAxH,IAAA,GAC7B,SAAAwH,GAA6B,MAAA6tB,GAAA/lB,MAAA,EAAA9H,GAAAxH,IAAA,IAH7Bq1B,EADA,OAQAA,EAmFA,QAAAiO,GAAA5gC,GACA,MAAAwgC,GAAA,SAAAnP,GACAA,EAAAwP,QAAAxP,EAAAyP,WAAAzP,EAAA0P,SAAA,EAAA/gC,GAAA,GACAqxB,EAAA2P,SAAA,UACG,SAAA3P,EAAA/zB,GACH+zB,EAAAwP,QAAAxP,EAAAyP,UAAA,EAAAxjC,IACG,SAAAoP,EAAAwvB,GACH,OAAAA,EAAAxvB,GAAAwvB,EAAA+E,oBAAAv0B,EAAAu0B,qBAAAjO,GAAAG,IA6FA,QAAA+N,GAAAlhC,GACA,MAAAwgC,GAAA,SAAAnP,GACAA,EAAA8P,WAAA9P,EAAA+P,cAAA/P,EAAAgQ,YAAA,EAAArhC,GAAA,GACAqxB,EAAAiQ,YAAA,UACG,SAAAjQ,EAAA/zB,GACH+zB,EAAA8P,WAAA9P,EAAA+P,aAAA,EAAA9jC,IACG,SAAAoP,EAAAwvB,GACH,OAAAA,EAAAxvB,GAAAymB,IA/PA,GAAAxV,GAAA,GAAA2T,MACAzT,EAAA,GAAAyT,MAmEAU,EAAAwO,EAAA,aAEC,SAAAnP,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,IACC,SAAAoP,EAAAwvB,GACD,MAAAA,GAAAxvB,GAIAslB,GAAAc,MAAA,SAAA/Y,GAEA,MADAA,GAAA/V,KAAA8I,MAAAiN,GACA9J,SAAA8J,MAAA,EACAA,EAAA,EACAymB,EAAA,SAAAnP,GACAA,EAAA2L,QAAAh5B,KAAA8I,MAAAukB,EAAAtX,OACG,SAAAsX,EAAA/zB,GACH+zB,EAAA2L,SAAA3L,EAAA/zB,EAAAyc,IACG,SAAArN,EAAAwvB,GACH,OAAAA,EAAAxvB,GAAAqN,IANAiY,EADA,KAWA,IAAAuP,GAAAvP,EAAAjiB,MAEAgjB,EAAA,IACAC,EAAA,IACAC,EAAA,KACAC,EAAA,MACAC,EAAA,OAEApB,EAAAyO,EAAA,SAAAnP,GACAA,EAAA2L,QAAAh5B,KAAA8I,MAAAukB,EAAA0B,OACC,SAAA1B,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,EAAAy1B,IACC,SAAArmB,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAqmB,GACC,SAAA1B,GACD,MAAAA,GAAAmQ,kBAGAC,EAAA1P,EAAAhiB,MAEA+hB,EAAA0O,EAAA,SAAAnP,GACAA,EAAA2L,QAAAh5B,KAAA8I,MAAAukB,EAAA2B,OACC,SAAA3B,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,EAAA01B,IACC,SAAAtmB,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAsmB,GACC,SAAA3B,GACD,MAAAA,GAAAqQ,eAGAC,EAAA7P,EAAA/hB,MAEA8hB,EAAA2O,EAAA,SAAAnP,GACA,GAAA7Y,GAAA6Y,EAAA4P,oBAAAjO,EAAAC,CACAza,GAAA,IAAAA,GAAAya,GACA5B,EAAA2L,QAAAh5B,KAAA8I,QAAAukB,EAAA7Y,GAAAya,KAAAza,IACC,SAAA6Y,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,EAAA21B,IACC,SAAAvmB,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAumB,GACC,SAAA5B,GACD,MAAAA,GAAAuQ,aAGAC,EAAAhQ,EAAA9hB,MAEA6hB,EAAA4O,EAAA,SAAAnP,GACAA,EAAA2P,SAAA,UACC,SAAA3P,EAAA/zB,GACD+zB,EAAAwP,QAAAxP,EAAAyP,UAAAxjC,IACC,SAAAoP,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAwvB,EAAA+E,oBAAAv0B,EAAAu0B,qBAAAjO,GAAAE,GACC,SAAA7B,GACD,MAAAA,GAAAyP,UAAA,IAGAgB,EAAAlQ,EAAA7hB,MAaAgyB,EAAAnB,EAAA,GACAoB,EAAApB,EAAA,GACAqB,EAAArB,EAAA,GACAsB,EAAAtB,EAAA,GACAuB,EAAAvB,EAAA,GACAwB,EAAAxB,EAAA,GACAyB,EAAAzB,EAAA,GAEA0B,EAAAP,EAAAhyB,MACAwyB,EAAAP,EAAAjyB,MACAyyB,EAAAP,EAAAlyB,MACA0yB,EAAAP,EAAAnyB,MACA2yB,EAAAP,EAAApyB,MACA4yB,EAAAP,EAAAryB,MACA6yB,EAAAP,EAAAtyB,MAEA2hB,EAAA8O,EAAA,SAAAnP,GACAA,EAAAwP,QAAA,GACAxP,EAAA2P,SAAA,UACC,SAAA3P,EAAA/zB,GACD+zB,EAAAwR,SAAAxR,EAAAyR,WAAAxlC,IACC,SAAAoP,EAAAwvB,GACD,MAAAA,GAAA4G,WAAAp2B,EAAAo2B,WAAA,IAAA5G,EAAA6G,cAAAr2B,EAAAq2B,gBACC,SAAA1R,GACD,MAAAA,GAAAyR,aAGAE,EAAAtR,EAAA3hB,MAEA0hB,EAAA+O,EAAA,SAAAnP,GACAA,EAAAwR,SAAA,KACAxR,EAAA2P,SAAA,UACC,SAAA3P,EAAA/zB,GACD+zB,EAAA4R,YAAA5R,EAAA0R,cAAAzlC,IACC,SAAAoP,EAAAwvB,GACD,MAAAA,GAAA6G,cAAAr2B,EAAAq2B,eACC,SAAA1R,GACD,MAAAA,GAAA0R,eAIAtR,GAAAqB,MAAA,SAAA/Y,GACA,MAAA9J,UAAA8J,EAAA/V,KAAA8I,MAAAiN,OAAA,EAAAymB,EAAA,SAAAnP,GACAA,EAAA4R,YAAAj/B,KAAA8I,MAAAukB,EAAA0R,cAAAhpB,MACAsX,EAAAwR,SAAA,KACAxR,EAAA2P,SAAA,UACG,SAAA3P,EAAA/zB,GACH+zB,EAAA4R,YAAA5R,EAAA0R,cAAAzlC,EAAAyc,KALA,KASA,IAAAmpB,GAAAzR,EAAA1hB,MAEAykB,EAAAgM,EAAA,SAAAnP,GACAA,EAAA8R,cAAA,MACC,SAAA9R,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,EAAA01B,IACC,SAAAtmB,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAsmB,GACC,SAAA3B,GACD,MAAAA,GAAA+R,kBAGAC,EAAA7O,EAAAzkB,MAEAwkB,EAAAiM,EAAA,SAAAnP,GACAA,EAAAiS,cAAA,QACC,SAAAjS,EAAA/zB,GACD+zB,EAAA2L,SAAA3L,EAAA/zB,EAAA21B,IACC,SAAAvmB,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAumB,GACC,SAAA5B,GACD,MAAAA,GAAAkS,gBAGAC,EAAAjP,EAAAxkB,MAEAukB,EAAAkM,EAAA,SAAAnP,GACAA,EAAAiQ,YAAA,UACC,SAAAjQ,EAAA/zB,GACD+zB,EAAA8P,WAAA9P,EAAA+P,aAAA9jC,IACC,SAAAoP,EAAAwvB,GACD,OAAAA,EAAAxvB,GAAAwmB,GACC,SAAA7B,GACD,MAAAA,GAAA+P,aAAA,IAGAqC,EAAAnP,EAAAvkB,MAaA2zB,EAAAxC,EAAA,GACAyC,EAAAzC,EAAA,GACA0C,EAAA1C,EAAA,GACA2C,EAAA3C,EAAA,GACA4C,EAAA5C,EAAA,GACA6C,EAAA7C,EAAA,GACA8C,EAAA9C,EAAA,GAEA+C,EAAAP,EAAA3zB,MACAm0B,EAAAP,EAAA5zB,MACAo0B,GAAAP,EAAA7zB,MACAq0B,GAAAP,EAAA9zB,MACAs0B,GAAAP,EAAA/zB,MACAu0B,GAAAP,EAAAh0B,MACAw0B,GAAAP,EAAAj0B,MAEAqkB,GAAAoM,EAAA,SAAAnP,GACAA,EAAA8P,WAAA,GACA9P,EAAAiQ,YAAA,UACC,SAAAjQ,EAAA/zB,GACD+zB,EAAAmT,YAAAnT,EAAAoT,cAAAnnC,IACC,SAAAoP,EAAAwvB,GACD,MAAAA,GAAAuI,cAAA/3B,EAAA+3B,cAAA,IAAAvI,EAAAwI,iBAAAh4B,EAAAg4B,mBACC,SAAArT,GACD,MAAAA,GAAAoT,gBAGAE,GAAAvQ,GAAArkB,MAEAokB,GAAAqM,EAAA,SAAAnP,GACAA,EAAAmT,YAAA,KACAnT,EAAAiQ,YAAA,UACC,SAAAjQ,EAAA/zB,GACD+zB,EAAAuT,eAAAvT,EAAAqT,iBAAApnC,IACC,SAAAoP,EAAAwvB,GACD,MAAAA,GAAAwI,iBAAAh4B,EAAAg4B,kBACC,SAAArT,GACD,MAAAA,GAAAqT,kBAIAvQ,IAAArB,MAAA,SAAA/Y,GACA,MAAA9J,UAAA8J,EAAA/V,KAAA8I,MAAAiN,OAAA,EAAAymB,EAAA,SAAAnP,GACAA,EAAAuT,eAAA5gC,KAAA8I,MAAAukB,EAAAqT,iBAAA3qB,MACAsX,EAAAmT,YAAA,KACAnT,EAAAiQ,YAAA,UACG,SAAAjQ,EAAA/zB,GACH+zB,EAAAuT,eAAAvT,EAAAqT,iBAAApnC,EAAAyc,KALA,KASA,IAAA8qB,IAAA1Q,GAAApkB,KAEAjU,GAAAgpC,aAAAtE,EACA1kC,EAAAk4B,gBAAAhC,EACAl2B,EAAAipC,iBAAAxD,EACAzlC,EAAA44B,eAAA1C,EACAl2B,EAAAkpC,gBAAAzD,EACAzlC,EAAAi4B,WAAAhC,EACAj2B,EAAAmpC,YAAAxD,EACA3lC,EAAA24B,UAAA1C,EACAj2B,EAAAopC,WAAAzD,EACA3lC,EAAAg4B,WAAAhC,EACAh2B,EAAAqpC,YAAAxD,EACA7lC,EAAA+3B,SAAAhC,EACA/1B,EAAAspC,UAAAvD,EACA/lC,EAAA83B,QAAAhC,EACA91B,EAAAupC,SAAAvD,EACAhmC,EAAA63B,SAAAoO,EACAjmC,EAAAwpC,UAAAhD,EACAxmC,EAAAypC,WAAAxD,EACAjmC,EAAA0pC,YAAAlD,EACAxmC,EAAA2pC,WAAAzD,EACAlmC,EAAA4pC,YAAAnD,EACAzmC,EAAA6pC,YAAA1D,EACAnmC,EAAA8pC,aAAApD,EACA1mC,EAAA+pC,cAAA3D,EACApmC,EAAAgqC,eAAArD,EACA3mC,EAAAiqC,aAAA5D,EACArmC,EAAAkqC,cAAAtD,EACA5mC,EAAAmqC,WAAA7D,EACAtmC,EAAAoqC,YAAAvD,EACA7mC,EAAAqqC,aAAA9D,EACAvmC,EAAAsqC,cAAAxD,EACA9mC,EAAA43B,UAAAhC,EACA51B,EAAAuqC,WAAArD,EACAlnC,EAAA23B,SAAAhC,EACA31B,EAAAwqC,UAAApD,EACApnC,EAAA04B,YACA14B,EAAAunC,aACAvnC,EAAAy4B,UACAz4B,EAAA0nC,WACA1nC,EAAAw4B,SACAx4B,EAAA2nC,UACA3nC,EAAAu4B,QAAAqP,EACA5nC,EAAAyqC,SAAAtC,EACAnoC,EAAA4nC,YACA5nC,EAAAmoC,aACAnoC,EAAA6nC,YACA7nC,EAAAooC,aACApoC,EAAA8nC,aACA9nC,EAAAqoC,eACAroC,EAAA+nC,eACA/nC,EAAAsoC,iBACAtoC,EAAAgoC,cACAhoC,EAAAuoC,gBACAvoC,EAAAioC,YACAjoC,EAAAwoC,cACAxoC,EAAAkoC,cACAloC,EAAAyoC,gBACAzoC,EAAAs4B,YACAt4B,EAAA6oC,aACA7oC,EAAAq4B,WACAr4B,EAAA+oC,YAEA5nC,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,Ob4pJxC,SAAUpB,EAAQD,EAASM,IcxhKjC,SAAA6P,EAAApQ,GACAA,EAAAC,EAAAM,EAAA,MAGCF,KAAA,SAAAJ,EAAA6xB,GAAmC,YAEpC,SAAA6Y,GAAA1hC,GACA,MAAAA,EAAAuT,GAAAvT,EAAAuT,EAAA,KACA,GAAAgZ,GAAA,GAAAC,OAAA,EAAAxsB,EAAApI,EAAAoI,MAAA2hC,EAAA3hC,EAAA4hC,EAAA5hC,EAAAw5B,EAAAx5B,EAAA6hC,EAEA,OADAtV,GAAA4R,YAAAn+B,EAAAuT,GACAgZ,EAEA,UAAAC,MAAAxsB,EAAAuT,EAAAvT,EAAApI,EAAAoI,MAAA2hC,EAAA3hC,EAAA4hC,EAAA5hC,EAAAw5B,EAAAx5B,EAAA6hC,GAGA,QAAAC,GAAA9hC,GACA,MAAAA,EAAAuT,GAAAvT,EAAAuT,EAAA,KACA,GAAAgZ,GAAA,GAAAC,WAAAsD,KAAA,EAAA9vB,EAAApI,EAAAoI,MAAA2hC,EAAA3hC,EAAA4hC,EAAA5hC,EAAAw5B,EAAAx5B,EAAA6hC,GAEA,OADAtV,GAAAuT,eAAA9/B,EAAAuT,GACAgZ,EAEA,UAAAC,WAAAsD,IAAA9vB,EAAAuT,EAAAvT,EAAApI,EAAAoI,MAAA2hC,EAAA3hC,EAAA4hC,EAAA5hC,EAAAw5B,EAAAx5B,EAAA6hC,IAGA,QAAAE,GAAAxuB,GACA,OAAUA,IAAA3b,EAAA,EAAAoI,EAAA,EAAA2hC,EAAA,EAAAC,EAAA,EAAApI,EAAA,EAAAqI,EAAA,GAGV,QAAA9b,GAAAD,GA8GA,QAAA0B,GAAAvC,EAAA+c,GACA,gBAAAzV,GACA,GAIA10B,GACAoqC,EACAx7B,EANA4xB,KACAn9B,GAAA,EACA0R,EAAA,EACArD,EAAA0b,EAAA7pB,MAOA,KAFAmxB,YAAAC,QAAAD,EAAA,GAAAC,OAAAD,MAEArxB,EAAAqO,GACA,KAAA0b,EAAA+C,WAAA9sB,KACAm9B,EAAArsB,KAAAiZ,EAAAna,MAAA8B,EAAA1R,IACA,OAAA+mC,EAAAC,GAAArqC,EAAAotB,EAAAkd,SAAAjnC,KAAArD,EAAAotB,EAAAkd,SAAAjnC,GACA+mC,EAAA,MAAApqC,EAAA,SACA4O,EAAAu7B,EAAAnqC,QAAA4O,EAAA8lB,EAAA0V,IACA5J,EAAArsB,KAAAnU,GACA+U,EAAA1R,EAAA,EAKA,OADAm9B,GAAArsB,KAAAiZ,EAAAna,MAAA8B,EAAA1R,IACAm9B,EAAA5R,KAAA,KAIA,QAAA2b,GAAAnd,EAAAod,GACA,gBAAAhK,GACA,GAAAr4B,GAAA+hC,EAAA,MACA7mC,EAAAonC,EAAAtiC,EAAAilB,EAAAoT,GAAA,KACA,IAAAn9B,GAAAm9B,EAAAj9B,OAAA,WAMA,IAHA,KAAA4E,OAAA2hC,EAAA3hC,EAAA2hC,EAAA,MAAA3hC,EAAAlI,GAGA,KAAAkI,IAAA,KAAAA,GAAA,CACA,KAAAA,OAAAuiC,EAAA,KAAAviC,GAAA,IACA,IAAA8sB,GAAA,KAAA9sB,GAAA8hC,EAAAC,EAAA/hC,EAAAuT,IAAAgpB,YAAA8F,EAAAN,EAAA/hC,EAAAuT,IAAA0oB,QACAj8B,GAAApI,EAAA,EACAoI,IAAA,KAAAA,MAAAuiC,EAAA,OAAAviC,EAAAwiC,GAAA1V,EAAA,KAAA9sB,EAAAuiC,EAAA,EAAAviC,EAAAyiC,GAAA3V,EAAA,KAKA,WAAA9sB,IACAA,EAAA2hC,GAAA3hC,EAAA0iC,EAAA,MACA1iC,EAAA4hC,GAAA5hC,EAAA0iC,EAAA,IACAZ,EAAA9hC,IAIAqiC,EAAAriC,IAIA,QAAAsiC,GAAAtiC,EAAAilB,EAAAoT,EAAAzrB,GAOA,IANA,GAGA/U,GACAs+B,EAJAj7B,EAAA,EACAqO,EAAA0b,EAAA7pB,OACAxD,EAAAygC,EAAAj9B,OAIAF,EAAAqO,GAAA,CACA,GAAAqD,GAAAhV,EAAA,QAEA,IADAC,EAAAotB,EAAA+C,WAAA9sB,KACA,KAAArD,GAGA,GAFAA,EAAAotB,EAAAkd,OAAAjnC,KACAi7B,EAAAwM,GAAA9qC,IAAAqqC,IAAAjd,EAAAkd,OAAAjnC,KAAArD,IACAs+B,IAAAvpB,EAAAupB,EAAAn2B,EAAAq4B,EAAAzrB,IAAA,eACO,IAAA/U,GAAAwgC,EAAArQ,WAAApb,KACP,SAIA,MAAAA,GAGA,QAAAg2B,GAAA5iC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAAs5B,GAAA1sB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAAlI,EAAAgrC,GAAAv5B,EAAA,GAAA0M,eAAA/a,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA2nC,GAAA/iC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAAy5B,GAAA7sB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAAuiC,EAAAU,GAAA15B,EAAA,GAAA0M,eAAA/a,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA8nC,IAAAljC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA45B,GAAAhtB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAAuiC,EAAAa,GAAA75B,EAAA,GAAA0M,eAAA/a,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAioC,IAAArjC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA+5B,GAAAntB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAApI,EAAA2rC,GAAAh6B,EAAA,GAAA0M,eAAA/a,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAooC,IAAAxjC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAAk6B,GAAAttB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAApI,EAAA8rC,GAAAn6B,EAAA,GAAA0M,eAAA/a,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAuoC,IAAA3jC,EAAAq4B,EAAAn9B,GACA,MAAAonC,GAAAtiC,EAAA4jC,GAAAvL,EAAAn9B,GAGA,QAAA2oC,IAAA7jC,EAAAq4B,EAAAn9B,GACA,MAAAonC,GAAAtiC,EAAA8jC,GAAAzL,EAAAn9B,GAGA,QAAA6oC,IAAA/jC,EAAAq4B,EAAAn9B,GACA,MAAAonC,GAAAtiC,EAAAgkC,GAAA3L,EAAAn9B,GAGA,QAAA+oC,IAAAjkC,GACA,MAAAkkC,IAAAlkC,EAAAi8B,UAGA,QAAAkI,IAAAnkC,GACA,MAAAokC,IAAApkC,EAAAi8B,UAGA,QAAAoI,IAAArkC,GACA,MAAAskC,IAAAtkC,EAAAg+B,YAGA,QAAAtQ,IAAA1tB,GACA,MAAAukC,IAAAvkC,EAAAg+B,YAGA,QAAAwG,IAAAxkC,GACA,MAAAykC,MAAAzkC,EAAA88B,YAAA,KAGA,QAAA4H,IAAA1kC,GACA,MAAAkkC,IAAAlkC,EAAAu8B,aAGA,QAAAoI,IAAA3kC,GACA,MAAAokC,IAAApkC,EAAAu8B,aAGA,QAAAqI,IAAA5kC,GACA,MAAAskC,IAAAtkC,EAAA2/B,eAGA,QAAAkF,IAAA7kC,GACA,MAAAukC,IAAAvkC,EAAA2/B,eAGA,QAAAmF,IAAA9kC,GACA,MAAAykC,MAAAzkC,EAAAy+B,eAAA,KAvQA,GAAAmF,IAAA9d,EAAAif,SACAjB,GAAAhe,EAAAyG,KACAyX,GAAAle,EAAA4I,KACA+V,GAAA3e,EAAAkf,QACAZ,GAAAte,EAAAkX,KACAkH,GAAApe,EAAAmf,UACAV,GAAAze,EAAAoY,OACAoG,GAAAxe,EAAAof,YAEArC,GAAAsC,EAAAV,IACA3B,GAAAsC,EAAAX,IACAtB,GAAAgC,EAAAf,IACAhB,GAAAgC,EAAAhB,IACApB,GAAAmC,EAAAjB,IACAjB,GAAAmC,EAAAlB,IACAT,GAAA0B,EAAAZ,IACAb,GAAA0B,EAAAb,IACAjB,GAAA6B,EAAAb,IACAf,GAAA6B,EAAAd,IAEAtC,IACAv6B,EAAAw8B,GACArgB,EAAAugB,GACAz8B,EAAA28B,GACAxgB,EAAA6J,GACA71B,EAAA,KACAmI,EAAAqlC,EACAjgC,EAAAigC,EACA1D,EAAA2D,EACAC,EAAAC,EACA54B,EAAA64B,EACA5D,EAAA6D,EACA9tC,EAAA+tC,EACA/D,EAAAgE,EACA9tC,EAAA0sC,GACAhL,EAAAqM,EACApD,EAAAqD,EACAvD,EAAAwD,EACAvD,EAAAwD,EACA1+B,EAAA,KACA+f,EAAA,KACA9T,EAAAoa,EACAsY,EAAAC,EACAxD,EAAAyD,EACAhf,IAAAif,GAGAC,IACA5+B,EAAAi9B,GACA9gB,EAAA+gB,GACAj9B,EAAAk9B,GACA/gB,EAAAghB,GACAhtC,EAAA,KACAmI,EAAAsmC,EACAlhC,EAAAkhC,EACA3E,EAAA4E,EACAhB,EAAAiB,EACA55B,EAAA65B,EACA5E,EAAA6E,EACA9uC,EAAA+uC,EACA/E,EAAAgF,EACA9uC,EAAAgtC,GACAtL,EAAAqN,EACApE,EAAAqE,EACAvE,EAAAwE,EACAvE,EAAAwE,EACA1/B,EAAA,KACA+f,EAAA,KACA9T,EAAA0zB,EACAhB,EAAAiB,EACAxE,EAAAyE,EACAhgB,IAAAif,GAGAzD,IACAl7B,EAAAs7B,EACAnf,EAAAsf,GACAx7B,EAAA27B,GACAxf,EAAA2f,GACA3rC,EAAA8rC,GACA3jC,EAAAonC,EACAhiC,EAAAgiC,EACAzF,EAAA0F,EACA9B,EAAA8B,EACAz6B,EAAA06B,EACAzF,EAAA0F,EACA3vC,EAAA4vC,EACA5F,EAAA6F,EACA3vC,EAAA8qC,EACApJ,EAAAkO,EACAjF,EAAAkF,EACApF,EAAAqF,EACApF,EAAAqF,EACAvgC,EAAAu8B,GACAxc,EAAA0c,GACAxwB,EAAAu0B,EACA7B,EAAA8B,EACArF,EAAAsF,EACA7gB,IAAA8gB,EAwKA,OApKAjG,IAAA16B,EAAAkgB,EAAAsc,GAAA9B,IACAA,GAAA3a,EAAAG,EAAAwc,GAAAhC,IACAA,GAAAnqC,EAAA2vB,EAAAoc,GAAA5B,IACAqE,GAAA/+B,EAAAkgB,EAAAsc,GAAAuC,IACAA,GAAAhf,EAAAG,EAAAwc,GAAAqC,IACAA,GAAAxuC,EAAA2vB,EAAAoc,GAAAyC,KAgKA5/B,OAAA,SAAAwe,GACA,GAAA5d,GAAAmgB,EAAAvC,GAAA,GAAA+c,GAEA,OADA36B,GAAAqc,SAAA,WAA+B,MAAAuB,IAC/B5d,GAEA8uB,MAAA,SAAAlR,GACA,GAAAntB,GAAAsqC,EAAAnd,GAAA,GAAAyc,EAEA,OADA5pC,GAAA4rB,SAAA,WAA+B,MAAAuB,IAC/BntB,GAEA+3B,UAAA,SAAA5K,GACA,GAAA5d,GAAAmgB,EAAAvC,GAAA,GAAAohB,GAEA,OADAh/B,GAAAqc,SAAA,WAA+B,MAAAuB,IAC/B5d,GAEA6gC,SAAA,SAAAjjB,GACA,GAAAntB,GAAAsqC,EAAAnd,EAAA6c,EAEA,OADAhqC,GAAA4rB,SAAA,WAA+B,MAAAuB,IAC/BntB,IAUA,QAAAmqC,GAAA5pC,EAAAgtB,EAAA3oB,GACA,GAAA6oB,GAAAltB,EAAA,SACAggC,GAAA9S,GAAAltB,KAAA,GACA+C,EAAAi9B,EAAAj9B,MACA,OAAAmqB,IAAAnqB,EAAAsB,EAAA,GAAA1B,OAAA0B,EAAAtB,EAAA,GAAAqrB,KAAApB,GAAAgT,KAGA,QAAA8P,GAAA53B,GACA,MAAAA,GAAAqW,QAAAwhB,GAAA,QAGA,QAAAjD,GAAAkD,GACA,UAAAjuB,QAAA,OAAAiuB,EAAA1oC,IAAAwoC,GAAA1hB,KAAA,cAGA,QAAA2e,GAAAiD,GAEA,IADA,GAAA1oC,MAAczE,GAAA,EAAAqO,EAAA8+B,EAAAjtC,SACdF,EAAAqO,GAAA5J,EAAA0oC,EAAAntC,GAAA+a,eAAA/a,CACA,OAAAyE,GAGA,QAAAioC,GAAA5nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAAuiC,GAAAh5B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAusC,GAAA3nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAAyiC,GAAAl5B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAysC,GAAA7nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,GACA,OAAAqO,IAAAvJ,EAAAwiC,GAAAj5B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA2sC,GAAA/nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAAuT,GAAAhK,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA0sC,GAAA9nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAAuT,GAAAhK,EAAA,KAAAA,EAAA,gBAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA4sC,GAAAhoC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA,gCAAA4M,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAA0iC,EAAAn5B,EAAA,OAAAA,EAAA,IAAAA,EAAA,WAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAosC,GAAAxnC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAApI,EAAA2R,EAAA,KAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAgsC,GAAApnC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,KAAAuJ,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAksC,GAAAtnC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAApI,EAAA,EAAAoI,KAAAuJ,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAisC,GAAArnC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAA2hC,GAAAp4B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAqsC,GAAAznC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAA4hC,GAAAr4B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAssC,GAAA1nC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAAw5B,GAAAjwB,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAAmsC,GAAAvnC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAA++B,GAAAnyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,IAAAvJ,EAAA6hC,GAAAt4B,EAAA,GAAArO,EAAAqO,EAAA,GAAAnO,SAAA,EAGA,QAAA6sC,GAAAjoC,EAAAq4B,EAAAn9B,GACA,GAAAqO,GAAAg/B,GAAApyB,KAAAkiB,EAAAvtB,MAAA5P,IAAA,GACA,OAAAqO,GAAArO,EAAAqO,EAAA,GAAAnO,QAAA,EAGA,QAAAiqC,GAAArlC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAg8B,UAAAlkC,EAAA,GAGA,QAAAwtC,GAAAtlC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA88B,WAAAhlC,EAAA,GAGA,QAAA0tC,GAAAxlC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA88B,WAAA,OAAAhlC,EAAA,GAGA,QAAA2tC,GAAAzlC,EAAAlI,GACA,MAAAmqC,GAAA,EAAApZ,EAAAiG,QAAAhnB,MAAA+gB,EAAA8F,SAAA3uB,MAAAlI,EAAA,GAGA,QAAA4tC,GAAA1lC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAwoC,kBAAA1wC,EAAA,GAGA,QAAA6tC,GAAA3lC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAg+B,WAAA,EAAAlmC,EAAA,GAGA,QAAA8tC,GAAA5lC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA48B,aAAA9kC,EAAA,GAGA,QAAA+tC,GAAA7lC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAyoC,aAAA3wC,EAAA,GAGA,QAAAguC,GAAA9lC,EAAAlI,GACA,MAAAmqC,GAAApZ,EAAA4X,WAAA34B,MAAA+gB,EAAA8F,SAAA3uB,MAAAlI,EAAA,GAGA,QAAAiuC,GAAA/lC,GACA,MAAAA,GAAAi8B,SAGA,QAAA+J,GAAAhmC,EAAAlI,GACA,MAAAmqC,GAAApZ,EAAA8X,WAAA74B,MAAA+gB,EAAA8F,SAAA3uB,MAAAlI,EAAA,GAGA,QAAA61B,GAAA3tB,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAi+B,cAAA,IAAAnmC,EAAA,GAGA,QAAAouC,GAAAlmC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAi+B,cAAA,IAAAnmC,EAAA,GAGA,QAAAquC,GAAAnmC,GACA,GAAAwY,GAAAxY,EAAAm8B,mBACA,QAAA3jB,EAAA,OAAAA,IAAA,QACAypB,EAAAzpB,EAAA,YACAypB,EAAAzpB,EAAA,UAGA,QAAA8tB,GAAAtmC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAs8B,aAAAxkC,EAAA,GAGA,QAAAyuC,GAAAvmC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAy+B,cAAA3mC,EAAA,GAGA,QAAA0uC,GAAAxmC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAy+B,cAAA,OAAA3mC,EAAA,GAGA,QAAA2uC,GAAAzmC,EAAAlI,GACA,MAAAmqC,GAAA,EAAApZ,EAAA2G,OAAA1nB,MAAA+gB,EAAAwG,QAAArvB,MAAAlI,EAAA,GAGA,QAAA4uC,GAAA1mC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA0oC,qBAAA5wC,EAAA,GAGA,QAAA6uC,GAAA3mC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA2/B,cAAA,EAAA7nC,EAAA,GAGA,QAAA8uC,GAAA5mC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAAs+B,gBAAAxmC,EAAA,GAGA,QAAA+uC,GAAA7mC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA08B,gBAAA5kC,EAAA,GAGA,QAAAgvC,GAAA9mC,EAAAlI,GACA,MAAAmqC,GAAApZ,EAAA+V,UAAA92B,MAAA+gB,EAAAwG,QAAArvB,MAAAlI,EAAA,GAGA,QAAAivC,GAAA/mC,GACA,MAAAA,GAAAu8B,YAGA,QAAAyK,GAAAhnC,EAAAlI,GACA,MAAAmqC,GAAApZ,EAAAgW,UAAA/2B,MAAA+gB,EAAAwG,QAAArvB,MAAAlI,EAAA,GAGA,QAAAmvC,GAAAjnC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA4/B,iBAAA,IAAA9nC,EAAA,GAGA,QAAAovC,GAAAlnC,EAAAlI,GACA,MAAAmqC,GAAAjiC,EAAA4/B,iBAAA,IAAA9nC,EAAA,GAGA,QAAAqvC,KACA,cAGA,QAAAf,KACA,UAoBA,QAAAvgB,GAAAjQ,GAMA,MALA+yB,IAAA5iB,EAAAnQ,GACA5e,EAAAm4B,WAAAwZ,GAAAliC,OACAzP,EAAA4xC,UAAAD,GAAAxS,MACAn/B,EAAA64B,UAAA8Y,GAAA9Y,UACA74B,EAAAkxC,SAAAS,GAAAT,SACAS,GAKA,QAAAE,IAAAtc,GACA,MAAAA,GAAAuc,cAOA,QAAAC,IAAA1Q,GACA,GAAA9L,GAAA,GAAAC,MAAA6L,EACA,OAAA7tB,OAAA+hB,GAAA,KAAAA,EA7PA,GAuNAoc,IAvNAzG,IAAY8G,IAAA,GAAA/8B,EAAA,IAAAg9B,EAAA,KACZX,GAAA,UACAC,GAAA,KACAH,GAAA,iCA0NAviB,IACAkf,SAAA,SACAxY,KAAA,aACAmC,KAAA,eACAsW,SAAA,WACAhI,MAAA,wEACAiI,WAAA,2CACA/G,QAAA,+GACAgH,aAAA,0EAYA,IAAAgE,IAAA,wBAMAC,GAAA3c,KAAA3hB,UAAAi+B,YACAD,GACA7xC,EAAA64B,UAAAqZ,IAOAE,IAAA,GAAA5c,MAAA,4BACAuc,GACA/xC,EAAAkxC,SAAAgB,GAEAlyC,GAAAqyC,wBAAAxjB,EACA7uB,EAAAsyC,iBAAAvjB,EACA/uB,EAAAuyC,UAAAJ,GACAnyC,EAAAwyC,SAAAJ,GAEAjxC,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OdkiKxC,SAAUpB,EAAQD,EAASM,Ie1mLjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAkB7B,SAAAyyC,GAAAtpC,GACA,kBACA,GAAA80B,GAAA79B,KAAAsyC,cACAC,EAAAvyC,KAAAwyC,YACA,OAAAD,KAAAE,GAAA5U,EAAAG,gBAAAwU,eAAAC,EACA5U,EAAAC,cAAA/0B,GACA80B,EAAAa,gBAAA6T,EAAAxpC,IAIA,QAAA2pC,GAAAC,GACA,kBACA,MAAA3yC,MAAAsyC,cAAA5T,gBAAAiU,EAAAC,MAAAD,EAAAE,QAaA,QAAAA,KACA,UAAAC,GAGA,QAAAA,KACA9yC,KAAA6U,EAAA,OAAAk+B,IAAAzmB,SAAA,IAuDA,QAAA0mB,GAAAC,EAAAphB,EAAAf,GAEA,MADAmiB,GAAAC,EAAAD,EAAAphB,EAAAf,GACA,SAAAqiB,GACA,GAAAC,GAAAD,EAAAE,aACAD,SAAApzC,MAAA,EAAAozC,EAAAE,wBAAAtzC,QACAizC,EAAA1yC,KAAAP,KAAAmzC,IAKA,QAAAD,GAAAD,EAAAphB,EAAAf,GACA,gBAAAyiB,GACA,GAAAC,GAAA5zC,EAAAuzC,KACAvzC,GAAAuzC,MAAAI,CACA,KACAN,EAAA1yC,KAAAP,UAAAyzC,SAAA5hB,EAAAf,GACK,QACLlxB,EAAAuzC,MAAAK,IAKA,QAAA1mB,GAAAC,GACA,MAAAA,GAAAnO,OAAAqO,MAAA,SAAA1kB,IAAA,SAAAyN,GACA,GAAAjN,GAAA,GAAAjF,EAAAkS,EAAAkX,QAAA,IAEA,OADAppB,IAAA,IAAAiF,EAAAiN,EAAAtC,MAAA5P,EAAA,GAAAkS,IAAAtC,MAAA,EAAA5P,KACYqpB,KAAAnX,EAAAjN,UAIZ,QAAA2qC,GAAAlmB,GACA,kBACA,GAAA9iB,GAAA1K,KAAA2zC,IACA,IAAAjpC,EAAA,CACA,OAAAuV,GAAAzK,EAAA,EAAA1R,GAAA,EAAAtD,EAAAkK,EAAA1G,OAA6CwR,EAAAhV,IAAOgV,EACpDyK,EAAAvV,EAAA8K,GAAAgY,EAAAL,MAAAlN,EAAAkN,OAAAK,EAAAL,MAAAlN,EAAAlX,OAAAykB,EAAAzkB,KAGA2B,IAAA5G,GAAAmc,EAFAjgB,KAAA4zC,oBAAA3zB,EAAAkN,KAAAlN,EAAAgzB,SAAAhzB,EAAA4zB,WAKA/vC,EAAA4G,EAAA1G,OAAAF,QACA9D,MAAA2zC,OAIA,QAAAG,GAAAtmB,EAAAvsB,EAAA4yC,GACA,GAAAE,GAAAC,GAAAn0B,eAAA2N,EAAAL,MAAA6lB,EAAAE,CACA,iBAAAtqC,EAAA9E,EAAAgtB,GACA,GAAA7Q,GAAAvV,EAAA1K,KAAA2zC,KAAAV,EAAAc,EAAA9yC,EAAA6C,EAAAgtB,EACA,IAAApmB,EAAA,OAAA8K,GAAA,EAAAhV,EAAAkK,EAAA1G,OAA0CwR,EAAAhV,IAAOgV,EACjD,IAAAyK,EAAAvV,EAAA8K,IAAA2X,OAAAK,EAAAL,MAAAlN,EAAAlX,OAAAykB,EAAAzkB,KAIA,MAHA/I,MAAA4zC,oBAAA3zB,EAAAkN,KAAAlN,EAAAgzB,SAAAhzB,EAAA4zB,SACA7zC,KAAAi0C,iBAAAh0B,EAAAkN,KAAAlN,EAAAgzB,WAAAhzB,EAAA4zB,gBACA5zB,EAAAhf,QAIAjB,MAAAi0C,iBAAAzmB,EAAAL,KAAA8lB,EAAAY,GACA5zB,GAASkN,KAAAK,EAAAL,KAAApkB,KAAAykB,EAAAzkB,KAAA9H,QAAAgyC,WAAAY,WACTnpC,EACAA,EAAAkK,KAAAqL,GADAjgB,KAAA2zC,MAAA1zB,IA0BA,QAAAi0B,GAAAX,EAAAN,EAAAvlB,EAAAC,GACA,GAAA6lB,GAAA5zC,EAAAuzC,KACAI,GAAAY,YAAAv0C,EAAAuzC,MACAvzC,EAAAuzC,MAAAI,CACA,KACA,MAAAN,GAAArjC,MAAA8d,EAAAC,GACG,QACH/tB,EAAAuzC,MAAAK,GA8BA,QAAAY,MAuBA,QAAAnY,KACA,SA8CA,QAAAoY,GAAA91B,EAAA+1B,GACAt0C,KAAAsyC,cAAA/zB,EAAA+zB,cACAtyC,KAAAwyC,aAAAj0B,EAAAi0B,aACAxyC,KAAAu0C,MAAA,KACAv0C,KAAAw0C,QAAAj2B,EACAve,KAAAyzC,SAAAa,EAmBA,QAAAG,GAAAl2B,EAAAuS,EAAAvmB,EAAAmqC,EAAApnC,EAAArH,GASA,IARA,GACA0uC,GADA7wC,EAAA,EAEA8wC,EAAA9jB,EAAA9sB,OACA6wC,EAAA5uC,EAAAjC,OAKQF,EAAA+wC,IAAgB/wC,GACxB6wC,EAAA7jB,EAAAhtB,KACA6wC,EAAAlB,SAAAxtC,EAAAnC,GACA4wC,EAAA5wC,GAAA6wC,GAEApqC,EAAAzG,GAAA,GAAAuwC,GAAA91B,EAAAtY,EAAAnC,GAKA,MAAQA,EAAA8wC,IAAiB9wC,GACzB6wC,EAAA7jB,EAAAhtB,MACAwJ,EAAAxJ,GAAA6wC,GAKA,QAAAG,GAAAv2B,EAAAuS,EAAAvmB,EAAAmqC,EAAApnC,EAAArH,EAAAyY,GACA,GAAA5a,GACA6wC,EAKAnY,EAJAuY,KACAH,EAAA9jB,EAAA9sB,OACA6wC,EAAA5uC,EAAAjC,OACAgxC,EAAA,GAAApxC,OAAAgxC,EAKA,KAAA9wC,EAAA,EAAaA,EAAA8wC,IAAiB9wC,GAC9B6wC,EAAA7jB,EAAAhtB,MACAkxC,EAAAlxC,GAAA04B,EAAAyY,GAAAv2B,EAAAne,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,GACA0L,IAAAuY,GACAznC,EAAAxJ,GAAA6wC,EAEAI,EAAAvY,GAAAmY,EAQA,KAAA7wC,EAAA,EAAaA,EAAA+wC,IAAgB/wC,EAC7B04B,EAAAyY,GAAAv2B,EAAAne,KAAAge,EAAAtY,EAAAnC,KAAAmC,IACA0uC,EAAAI,EAAAvY,KACAkY,EAAA5wC,GAAA6wC,EACAA,EAAAlB,SAAAxtC,EAAAnC,GACAixC,EAAAvY,GAAA,MAEAjyB,EAAAzG,GAAA,GAAAuwC,GAAA91B,EAAAtY,EAAAnC,GAKA,KAAAA,EAAA,EAAaA,EAAA8wC,IAAiB9wC,GAC9B6wC,EAAA7jB,EAAAhtB,KAAAixC,EAAAC,EAAAlxC,MAAA6wC,IACArnC,EAAAxJ,GAAA6wC,GAsGA,QAAAxkC,GAAAE,EAAAC,GACA,MAAAD,GAAAC,GAAA,EAAAD,EAAAC,EAAA,EAAAD,GAAAC,EAAA,EAAAkB,IAiDA,QAAA0jC,GAAAnsC,GACA,kBACA/I,KAAAm1C,gBAAApsC,IAIA,QAAAqsC,GAAAzC,GACA,kBACA3yC,KAAAq1C,kBAAA1C,EAAAC,MAAAD,EAAAE,QAIA,QAAAyC,GAAAvsC,EAAA9H,GACA,kBACAjB,KAAA2+B,aAAA51B,EAAA9H,IAIA,QAAAs0C,GAAA5C,EAAA1xC,GACA,kBACAjB,KAAAw1C,eAAA7C,EAAAC,MAAAD,EAAAE,MAAA5xC,IAIA,QAAAw0C,GAAA1sC,EAAA9H,GACA,kBACA,GAAAqS,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACA,OAAA6D,EAAAtT,KAAAm1C,gBAAApsC,GACA/I,KAAA2+B,aAAA51B,EAAAuK,IAIA,QAAAoiC,GAAA/C,EAAA1xC,GACA,kBACA,GAAAqS,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACA,OAAA6D,EAAAtT,KAAAq1C,kBAAA1C,EAAAC,MAAAD,EAAAE,OACA7yC,KAAAw1C,eAAA7C,EAAAC,MAAAD,EAAAE,MAAAv/B,IA0BA,QAAAqiC,GAAA5sC,GACA,kBACA/I,KAAAuN,MAAAqoC,eAAA7sC,IAIA,QAAA8sC,GAAA9sC,EAAA9H,EAAA60C,GACA,kBACA91C,KAAAuN,MAAAwoC,YAAAhtC,EAAA9H,EAAA60C,IAIA,QAAAE,GAAAjtC,EAAA9H,EAAA60C,GACA,kBACA,GAAAxiC,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACA,OAAA6D,EAAAtT,KAAAuN,MAAAqoC,eAAA7sC,GACA/I,KAAAuN,MAAAwoC,YAAAhtC,EAAAuK,EAAAwiC,IAaA,QAAAG,GAAAtB,EAAA5rC,GACA,MAAA4rC,GAAApnC,MAAA8wB,iBAAAt1B,IACAm1B,GAAAyW,GAAAxW,iBAAAwW,EAAA,MAAAtW,iBAAAt1B,GAGA,QAAAmtC,GAAAntC,GACA,wBACA/I,MAAA+I,IAIA,QAAAotC,GAAAptC,EAAA9H,GACA,kBACAjB,KAAA+I,GAAA9H,GAIA,QAAAm1C,GAAArtC,EAAA9H,GACA,kBACA,GAAAqS,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACA,OAAA6D,QAAAtT,MAAA+I,GACA/I,KAAA+I,GAAAuK,GAaA,QAAA+iC,GAAApV,GACA,MAAAA,GAAAriB,OAAAqO,MAAA,SAGA,QAAAqpB,GAAA3B,GACA,MAAAA,GAAA2B,WAAA,GAAAC,GAAA5B,GAGA,QAAA4B,GAAA5B,GACA30C,KAAAw2C,MAAA7B,EACA30C,KAAAy2C,OAAAJ,EAAA1B,EAAA32B,aAAA,cAuBA,QAAA04B,GAAA/B,EAAA1D,GAEA,IADA,GAAA0F,GAAAL,EAAA3B,GAAA7wC,GAAA,EAAAqO,EAAA8+B,EAAAjtC,SACAF,EAAAqO,GAAAwkC,EAAAhb,IAAAsV,EAAAntC,IAGA,QAAA8yC,GAAAjC,EAAA1D,GAEA,IADA,GAAA0F,GAAAL,EAAA3B,GAAA7wC,GAAA,EAAAqO,EAAA8+B,EAAAjtC,SACAF,EAAAqO,GAAAwkC,EAAAnpC,OAAAyjC,EAAAntC,IAGA,QAAA+yC,GAAA5F,GACA,kBACAyF,EAAA12C,KAAAixC,IAIA,QAAA6F,GAAA7F,GACA,kBACA2F,EAAA52C,KAAAixC,IAIA,QAAA8F,GAAA9F,EAAAhwC,GACA,mBACAA,EAAA2O,MAAA5P,KAAAyP,WAAAinC,EAAAE,GAAA52C,KAAAixC,IAmBA,QAAA+F,KACAh3C,KAAAi3C,YAAA,GAGA,QAAAC,GAAAj2C,GACA,kBACAjB,KAAAi3C,YAAAh2C,GAIA,QAAAk2C,GAAAl2C,GACA,kBACA,GAAAqS,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACAzP,MAAAi3C,YAAA,MAAA3jC,EAAA,GAAAA,GAaA,QAAA8jC,KACAp3C,KAAAq3C,UAAA,GAGA,QAAAC,GAAAr2C,GACA,kBACAjB,KAAAq3C,UAAAp2C,GAIA,QAAAs2C,GAAAt2C,GACA,kBACA,GAAAqS,GAAArS,EAAA2O,MAAA5P,KAAAyP,UACAzP,MAAAq3C,UAAA,MAAA/jC,EAAA,GAAAA,GAaA,QAAAwhB,KACA90B,KAAAw3C,aAAAx3C,KAAAie,WAAAmgB,YAAAp+B,MAOA,QAAAy3C,KACAz3C,KAAA03C,iBAAA13C,KAAAie,WAAA05B,aAAA33C,UAAAie,WAAA25B,YAcA,QAAAC,KACA,YAWA,QAAArqC,KACA,GAAA+Q,GAAAve,KAAAie,UACAM,MAAA+f,YAAAt+B,MAaA,QAAA83C,GAAAnD,EAAAxnB,EAAA4qB,GACA,GAAAC,GAAA9Z,GAAAyW,GACAxB,EAAA6E,EAAAC,WAEA,mBAAA9E,GACAA,EAAA,GAAAA,GAAAhmB,EAAA4qB,IAEA5E,EAAA6E,EAAAna,SAAAqa,YAAA,SACAH,GAAA5E,EAAAgF,UAAAhrB,EAAA4qB,EAAAK,QAAAL,EAAAM,YAAAlF,EAAAmF,OAAAP,EAAAO,QACAnF,EAAAgF,UAAAhrB,GAAA,OAGAwnB,EAAAmD,cAAA3E,GAGA,QAAAoF,GAAAprB,EAAA4qB,GACA,kBACA,MAAAD,GAAA93C,KAAAmtB,EAAA4qB,IAIA,QAAAS,GAAArrB,EAAA4qB,GACA,kBACA,MAAAD,GAAA93C,KAAAmtB,EAAA4qB,EAAAnoC,MAAA5P,KAAAyP,aAYA,QAAAgpC,GAAAC,EAAAC,GACA34C,KAAA44C,QAAAF,EACA14C,KAAA64C,SAAAF,EAGA,QAAAr7B,KACA,UAAAm7B,KAAA5a,SAAAG,kBAAAt+B,IA/2BA,GAAA+yC,GAAA,+BAEAqG,IACArxC,IAAA,6BACAgrC,QACAsG,MAAA,+BACAC,IAAA,uCACAC,MAAA,iCAGAC,GAAA,SAAAnwC,GACA,GAAAunB,GAAAvnB,GAAA,GAAAjF,EAAAwsB,EAAApD,QAAA,IAEA,OADAppB,IAAA,cAAAwsB,EAAAvnB,EAAA2K,MAAA,EAAA5P,MAAAiF,IAAA2K,MAAA5P,EAAA,IACAg1C,GAAAj5B,eAAAyQ,IAA8CsiB,MAAAkG,GAAAxoB,GAAAuiB,MAAA9pC,GAAuCA,GAmBrFowC,GAAA,SAAApwC,GACA,GAAA4pC,GAAAuG,GAAAnwC,EACA,QAAA4pC,EAAAE,MACAH,EACAL,GAAAM,IAGAI,GAAA,CAUAD,GAAAr/B,UAAAo/B,EAAAp/B,WACAkP,YAAAmwB,EACA1lB,IAAA,SAAAunB,GAEA,IADA,GAAAt0C,GAAAL,KAAA6U,IACAxU,IAAAs0C,KAAA,KAAAA,IAAA12B,YAAA,MACA,OAAA02B,GAAAt0C,IAEAgtB,IAAA,SAAAsnB,EAAA1zC,GACA,MAAA0zC,GAAA30C,KAAA6U,GAAA5T,GAEAuM,OAAA,SAAAmnC,GACA,MAAA30C,MAAA6U,IAAA8/B,aAAA30C,KAAA6U,IAEAyX,SAAA,WACA,MAAAtsB,MAAA6U,GAIA,IAAAukC,IAAA,SAAAC,GACA,kBACA,MAAAr5C,MAAAs5C,QAAAD,IAIA,uBAAAxb,UAAA,CACA,GAAA0b,IAAA1b,SAAAG,eACA,KAAAub,GAAAD,QAAA,CACA,GAAAE,IAAAD,GAAAE,uBACAF,GAAAG,mBACAH,GAAAI,oBACAJ,GAAAK,gBACAR,IAAA,SAAAC,GACA,kBACA,MAAAG,IAAAj5C,KAAAP,KAAAq5C,MAMA,GAAAQ,IAAAT,GAEApF,KAIA,IAFAp0C,EAAAuzC,MAAA,KAEA,mBAAAtV,UAAA,CACA,GAAAic,IAAAjc,SAAAG,eACA,iBAAA8b,MACA9F,IAAoB+F,WAAA,YAAAC,WAAA,aAqEpB,GAAAC,IAAA,SAAAzsB,EAAAvsB,EAAA4yC,GACA,GAAA/vC,GAAAkS,EAAA+W,EAAAD,EAAAU,EAAA,IAAArb,EAAA4a,EAAA/oB,MAEA,OAAAyL,UAAAzL,OAAA,IAcA,IAFA0G,EAAAzJ,EAAA6yC,EAAAJ,EACA,MAAAG,OAAA,GACA/vC,EAAA,EAAaA,EAAAqO,IAAOrO,EAAA9D,KAAAmF,KAAAuF,EAAAqiB,EAAAjpB,GAAA7C,EAAA4yC,GACpB,OAAA7zC,MAdA,GAAA0K,GAAA1K,KAAA20C,OAAAhB,IACA,IAAAjpC,EAAA,OAAAuV,GAAAzK,EAAA,EAAAhV,EAAAkK,EAAA1G,OAA6CwR,EAAAhV,IAAOgV,EACpD,IAAA1R,EAAA,EAAAmc,EAAAvV,EAAA8K,GAA4B1R,EAAAqO,IAAOrO,EACnC,IAAAkS,EAAA+W,EAAAjpB,IAAAqpB,OAAAlN,EAAAkN,MAAAnX,EAAAjN,OAAAkX,EAAAlX,KACA,MAAAkX,GAAAhf,QAwBAkzC,GAAA,WAEA,IADA,GAAAhhB,GAAA+mB,EAAAt6C,EAAAuzC,MACAhgB,EAAA+mB,EAAA/F,aAAA+F,EAAA/mB,CACA,OAAA+mB,IAGA3nB,GAAA,SAAAoiB,EAAAxB,GACA,GAAA1rC,GAAAktC,EAAAwF,iBAAAxF,CAEA,IAAAltC,EAAA2yC,eAAA,CACA,GAAA7nB,GAAA9qB,EAAA2yC,gBAGA,OAFA7nB,GAAAriB,EAAAijC,EAAAkH,QAAA9nB,EAAApW,EAAAg3B,EAAAmH,QACA/nB,IAAAgoB,gBAAA5F,EAAA6F,eAAAC,YACAloB,EAAAriB,EAAAqiB,EAAApW,GAGA,GAAAu+B,GAAA/F,EAAAgG,uBACA,QAAAxH,EAAAkH,QAAAK,EAAAl1C,KAAAmvC,EAAAiG,WAAAzH,EAAAmH,QAAAI,EAAA70C,IAAA8uC,EAAAkG,YAGA3sC,GAAA,SAAAymC,GACA,GAAAxB,GAAAgB,IAEA,OADAhB,GAAA2H,iBAAA3H,IAAA2H,eAAA,IACAvoB,GAAAoiB,EAAAxB,IAKAkG,GAAA,SAAAA,GACA,aAAAA,EAAAjF,EAAA,WACA,MAAAp0C,MAAA+6C,cAAA1B,KAIA2B,GAAA,SAAAzxC,GACA,kBAAAA,OAAA8vC,GAAA9vC,GAEA,QAAAmvC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,EAAA,GAAAr3C,OAAApD,GAAAgV,EAAA,EAAqFA,EAAAhV,IAAOgV,EAC5F,OAAAm/B,GAAAuG,EAAApqB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAm3C,EAAAF,EAAAzlC,GAAA,GAAA5R,OAAAuO,GAAArO,EAAA,EAA+GA,EAAAqO,IAAOrO,GACtH6wC,EAAA7jB,EAAAhtB,MAAAo3C,EAAA3xC,EAAAhJ,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,MACA,YAAA6jB,KAAAuG,EAAAzH,SAAAkB,EAAAlB,UACA0H,EAAAr3C,GAAAo3C,EAKA,WAAAzC,GAAAwC,EAAAj7C,KAAA64C,WAOAuC,GAAA,SAAA/B,GACA,aAAAA,EAAApd,EAAA,WACA,MAAAj8B,MAAAq7C,iBAAAhC,KAIAiC,GAAA,SAAA/xC,GACA,kBAAAA,OAAA6xC,GAAA7xC,GAEA,QAAAmvC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,KAAAtC,KAAAnjC,EAAA,EAAyFA,EAAAhV,IAAOgV,EAChG,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAF,EAAA,EAA8DA,EAAAqO,IAAOrO,GACrE6wC,EAAA7jB,EAAAhtB,MACAm3C,EAAArmC,KAAArL,EAAAhJ,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,IACA6nB,EAAA/jC,KAAA+/B,GAKA,WAAA8D,GAAAwC,EAAAtC,IAGA4C,GAAA,SAAAxtB,GACA,kBAAAA,OAAA8rB,GAAA9rB,GAEA,QAAA2qB,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,EAAA,GAAAr3C,OAAApD,GAAAgV,EAAA,EAAqFA,EAAAhV,IAAOgV,EAC5F,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAm3C,EAAAF,EAAAzlC,MAAA1R,EAAA,EAA4FA,EAAAqO,IAAOrO,GACnG6wC,EAAA7jB,EAAAhtB,KAAAiqB,EAAAxtB,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,IACAqqB,EAAAvmC,KAAA+/B,EAKA,WAAA8D,GAAAwC,EAAAj7C,KAAA64C,WAGA2C,GAAA,SAAA9G,GACA,UAAA9wC,OAAA8wC,EAAA1wC,SAGAy3C,GAAA,WACA,UAAAhD,GAAAz4C,KAAA07C,QAAA17C,KAAA44C,QAAArwC,IAAAizC,IAAAx7C,KAAA64C,UAWAxE,GAAA5gC,WACAkP,YAAA0xB,EACAjW,YAAA,SAAAud,GAAgC,MAAA37C,MAAAw0C,QAAAmD,aAAAgE,EAAA37C,KAAAu0C,QAChCoD,aAAA,SAAAgE,EAAAC,GAAuC,MAAA57C,MAAAw0C,QAAAmD,aAAAgE,EAAAC,IACvCb,cAAA,SAAA1B,GAAqC,MAAAr5C,MAAAw0C,QAAAuG,cAAA1B,IACrCgC,iBAAA,SAAAhC,GAAwC,MAAAr5C,MAAAw0C,QAAA6G,iBAAAhC,IAGxC,IAAA1lC,IAAA,SAAAzD,GACA,kBACA,MAAAA,KAIA+kC,GAAA,IAwEA4G,GAAA,SAAA56C,EAAAyd,GACA,IAAAzd,EAGA,MAFAgF,GAAA,GAAArC,OAAA5D,KAAAg8B,QAAAxmB,GAAA,EACAxV,KAAAmF,KAAA,SAAAyD,GAA2B3C,IAAAuP,GAAA5M,IAC3B3C,CAGA,IAAA61C,GAAAp9B,EAAAo2B,EAAAL,EACAkE,EAAA34C,KAAA64C,SACAH,EAAA14C,KAAA44C,OAEA,mBAAA33C,OAAA0S,GAAA1S,GAEA,QAAAT,GAAAk4C,EAAA10C,OAAA0wC,EAAA,GAAA9wC,OAAApD,GAAA+J,EAAA,GAAA3G,OAAApD,GAAA8M,EAAA,GAAA1J,OAAApD,GAAAgV,EAAA,EAAsGA,EAAAhV,IAAOgV,EAAA,CAC7G,GAAA+I,GAAAo6B,EAAAnjC,GACAsb,EAAA4nB,EAAAljC,GACAo/B,EAAA9jB,EAAA9sB,OACAiC,EAAAhF,EAAAV,KAAAge,OAAAk1B,SAAAj+B,EAAAmjC,GACA9D,EAAA5uC,EAAAjC,OACA+3C,EAAAxxC,EAAAiL,GAAA,GAAA5R,OAAAixC,GACAmH,EAAAtH,EAAAl/B,GAAA,GAAA5R,OAAAixC,GACAoH,EAAA3uC,EAAAkI,GAAA,GAAA5R,OAAAgxC,EAEAkH,GAAAv9B,EAAAuS,EAAAirB,EAAAC,EAAAC,EAAAh2C,EAAAyY,EAKA,QAAAw9B,GAAAN,EAAArpC,EAAA,EAAAC,EAAA,EAA4CD,EAAAsiC,IAAiBtiC,EAC7D,GAAA2pC,EAAAH,EAAAxpC,GAAA,CAEA,IADAA,GAAAC,MAAAD,EAAA,KACAqpC,EAAAI,EAAAxpC,SAAAqiC,IACAqH,EAAA3H,MAAAqH,GAAA,MAQA,MAHAlH,GAAA,GAAA+D,GAAA/D,EAAAiE,GACAjE,EAAAgH,OAAAnxC,EACAmqC,EAAAyH,MAAA7uC,EACAonC,GAGA0H,GAAA,WACA,UAAA3D,GAAAz4C,KAAAm8C,OAAAn8C,KAAA44C,QAAArwC,IAAAizC,IAAAx7C,KAAA64C,WAGAwD,GAAA,SAAA/+B,GAEA,OAAAg/B,GAAAt8C,KAAA44C,QAAA2D,EAAAj/B,EAAAs7B,QAAA4D,EAAAF,EAAAt4C,OAAA0c,EAAA67B,EAAAv4C,OAAAxD,EAAAsH,KAAAC,IAAAy0C,EAAA97B,GAAA+7B,EAAA,GAAA74C,OAAA44C,GAAAhnC,EAAA,EAA8JA,EAAAhV,IAAOgV,EACrK,OAAAm/B,GAAA+H,EAAAJ,EAAA9mC,GAAAmnC,EAAAJ,EAAA/mC,GAAArD,EAAAuqC,EAAA14C,OAAA8G,EAAA2xC,EAAAjnC,GAAA,GAAA5R,OAAAuO,GAAArO,EAAA,EAAwHA,EAAAqO,IAAOrO,GAC/H6wC,EAAA+H,EAAA54C,IAAA64C,EAAA74C,MACAgH,EAAAhH,GAAA6wC,EAKA,MAAQn/B,EAAAgnC,IAAQhnC,EAChBinC,EAAAjnC,GAAA8mC,EAAA9mC,EAGA,WAAAijC,GAAAgE,EAAAz8C,KAAA64C,WAGA+D,GAAA,WAEA,OAAAlE,GAAA14C,KAAA44C,QAAApjC,GAAA,EAAAhV,EAAAk4C,EAAA10C,SAA4DwR,EAAAhV,GAC5D,OAAAm0C,GAAA7jB,EAAA4nB,EAAAljC,GAAA1R,EAAAgtB,EAAA9sB,OAAA,EAAA43C,EAAA9qB,EAAAhtB,KAA4EA,GAAA,IAC5E6wC,EAAA7jB,EAAAhtB,MACA83C,OAAAjH,EAAA6C,aAAAoE,EAAA39B,WAAA05B,aAAAhD,EAAAiH,GACAA,EAAAjH,EAKA,OAAA30C,OAGA68C,GAAA,SAAAnrC,GAGA,QAAAorC,GAAAzsC,EAAAC,GACA,MAAAD,IAAAC,EAAAoB,EAAArB,EAAAojC,SAAAnjC,EAAAmjC,WAAApjC,GAAAC,EAHAoB,MAAAvB,EAMA,QAAAuoC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAA+4C,EAAA,GAAAn5C,OAAApD,GAAAgV,EAAA,EAAsFA,EAAAhV,IAAOgV,EAAA,CAC7F,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAg5C,EAAAD,EAAAvnC,GAAA,GAAA5R,OAAAuO,GAAArO,EAAA,EAAwGA,EAAAqO,IAAOrO,GAC/G6wC,EAAA7jB,EAAAhtB,MACAk5C,EAAAl5C,GAAA6wC,EAGAqI,GAAA9nC,KAAA4nC,GAGA,UAAArE,GAAAsE,EAAA/8C,KAAA64C,UAAAp7B,SAOAw/B,GAAA,WACA,GAAA3vB,GAAA7d,UAAA,EAGA,OAFAA,WAAA,GAAAzP,KACAstB,EAAA1d,MAAA,KAAAH,WACAzP,MAGAk9C,GAAA,WACA,GAAAC,GAAA,GAAAv5C,OAAA5D,KAAAg8B,QAAAl4B,GAAA,CAEA,OADA9D,MAAAmF,KAAA,WAAwBg4C,IAAAr5C,GAAA9D,OACxBm9C,GAGAC,GAAA,WAEA,OAAA1E,GAAA14C,KAAA44C,QAAApjC,EAAA,EAAAhV,EAAAk4C,EAAA10C,OAA2DwR,EAAAhV,IAAOgV,EAClE,OAAAsb,GAAA4nB,EAAAljC,GAAA1R,EAAA,EAAAqO,EAAA2e,EAAA9sB,OAAwDF,EAAAqO,IAAOrO,EAAA,CAC/D,GAAA6wC,GAAA7jB,EAAAhtB,EACA,IAAA6wC,EAAA,MAAAA,GAIA,aAGA0I,GAAA,WACA,GAAArhB,GAAA,CAEA,OADAh8B,MAAAmF,KAAA,aAAwB62B,IACxBA,GAGAshB,GAAA,WACA,OAAAt9C,KAAA20C,QAGA4I,GAAA,SAAAjwB,GAEA,OAAAorB,GAAA14C,KAAA44C,QAAApjC,EAAA,EAAAhV,EAAAk4C,EAAA10C,OAA2DwR,EAAAhV,IAAOgV,EAClE,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAA1R,EAAA,EAAAqO,EAAA2e,EAAA9sB,OAA8DF,EAAAqO,IAAOrO,GACrE6wC,EAAA7jB,EAAAhtB,KAAAwpB,EAAA/sB,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,EAIA,OAAA9wB,OA2CAw9C,GAAA,SAAAz0C,EAAA9H,GACA,GAAA0xC,GAAAuG,GAAAnwC,EAEA,IAAA0G,UAAAzL,OAAA,GACA,GAAA2wC,GAAA30C,KAAA20C,MACA,OAAAhC,GAAAE,MACA8B,EAAA8I,eAAA9K,EAAAC,MAAAD,EAAAE,OACA8B,EAAA32B,aAAA20B,GAGA,MAAA3yC,MAAAmF,MAAA,MAAAlE,EACA0xC,EAAAE,MAAAuC,EAAAF,EAAA,kBAAAj0C,GACA0xC,EAAAE,MAAA6C,EAAAD,EACA9C,EAAAE,MAAA0C,EAAAD,GAAA3C,EAAA1xC,KAGAi9B,GAAA,SAAAyW,GACA,MAAAA,GAAArC,eAAAqC,EAAArC,cAAApU,aACAyW,EAAA9W,UAAA8W,GACAA,EAAAzW,aAuBAwf,GAAA,SAAA30C,EAAA9H,EAAA60C,GACA,MAAArmC,WAAAzL,OAAA,EACAhE,KAAAmF,MAAA,MAAAlE,EACA00C,EAAA,kBAAA10C,GACA+0C,EACAH,GAAA9sC,EAAA9H,EAAA,MAAA60C,EAAA,GAAAA,IACAG,EAAAj2C,KAAA20C,OAAA5rC,IA4BA40C,GAAA,SAAA50C,EAAA9H,GACA,MAAAwO,WAAAzL,OAAA,EACAhE,KAAAmF,MAAA,MAAAlE,EACAi1C,EAAA,kBAAAj1C,GACAm1C,EACAD,GAAAptC,EAAA9H,IACAjB,KAAA20C,OAAA5rC,GAgBAwtC,GAAA9iC,WACAkoB,IAAA,SAAA5yB,GACA,GAAAjF,GAAA9D,KAAAy2C,OAAAvpB,QAAAnkB,EACAjF,GAAA,IACA9D,KAAAy2C,OAAA7hC,KAAA7L,GACA/I,KAAAw2C,MAAA7X,aAAA,QAAA3+B,KAAAy2C,OAAApnB,KAAA,QAGA7hB,OAAA,SAAAzE,GACA,GAAAjF,GAAA9D,KAAAy2C,OAAAvpB,QAAAnkB,EACAjF,IAAA,IACA9D,KAAAy2C,OAAAmH,OAAA95C,EAAA,GACA9D,KAAAw2C,MAAA7X,aAAA,QAAA3+B,KAAAy2C,OAAApnB,KAAA,QAGAwuB,SAAA,SAAA90C,GACA,MAAA/I,MAAAy2C,OAAAvpB,QAAAnkB,IAAA,GAgCA,IAAA+0C,IAAA,SAAA/0C,EAAA9H,GACA,GAAAgwC,GAAAoF,EAAAttC,EAAA,GAEA,IAAA0G,UAAAzL,OAAA,GAEA,IADA,GAAA2yC,GAAAL,EAAAt2C,KAAA20C,QAAA7wC,GAAA,EAAAqO,EAAA8+B,EAAAjtC,SACAF,EAAAqO,GAAA,IAAAwkC,EAAAkH,SAAA5M,EAAAntC,IAAA,QACA,UAGA,MAAA9D,MAAAmF,MAAA,kBAAAlE,GACA81C,EAAA91C,EACA41C,EACAC,GAAA7F,EAAAhwC,KAoBA88C,GAAA,SAAA98C,GACA,MAAAwO,WAAAzL,OACAhE,KAAAmF,KAAA,MAAAlE,EACA+1C,GAAA,kBAAA/1C,GACAk2C,EACAD,GAAAj2C,IACAjB,KAAA20C,OAAAsC,aAoBA+G,GAAA,SAAA/8C,GACA,MAAAwO,WAAAzL,OACAhE,KAAAmF,KAAA,MAAAlE,EACAm2C,GAAA,kBAAAn2C,GACAs2C,EACAD,GAAAr2C,IACAjB,KAAA20C,OAAA0C,WAOA4G,GAAA,WACA,MAAAj+C,MAAAmF,KAAA2vB,IAOAopB,GAAA,WACA,MAAAl+C,MAAAmF,KAAAsyC,IAGA0G,GAAA,SAAAp1C,GACA,GAAA0V,GAAA,kBAAA1V,KAAAowC,GAAApwC,EACA,OAAA/I,MAAAuJ,OAAA,WACA,MAAAvJ,MAAAo+B,YAAA3f,EAAA7O,MAAA5P,KAAAyP,eAQA2uC,GAAA,SAAAr1C,EAAAs1C,GACA,GAAA5/B,GAAA,kBAAA1V,KAAAowC,GAAApwC,GACAQ,EAAA,MAAA80C,EAAAxG,EAAA,kBAAAwG,KAAAhF,GAAAgF,EACA,OAAAr+C,MAAAuJ,OAAA,WACA,MAAAvJ,MAAA23C,aAAAl5B,EAAA7O,MAAA5P,KAAAyP,WAAAlG,EAAAqG,MAAA5P,KAAAyP,YAAA,SASA6uC,GAAA,WACA,MAAAt+C,MAAAmF,KAAAqI,IAGA+wC,GAAA,SAAAt9C,GACA,MAAAwO,WAAAzL,OACAhE,KAAA47B,SAAA,WAAA36B,GACAjB,KAAA20C,OAAAlB,UA8BA+K,GAAA,SAAArxB,EAAA4qB,GACA,MAAA/3C,MAAAmF,MAAA,kBAAA4yC,GACAS,EACAD,GAAAprB,EAAA4qB,KAGAr4C,IAAA,KAWA+4C,GAAAhlC,UAAA6J,EAAA7J,WACAkP,YAAA81B,EACAlvC,OAAAyxC,GACA5wC,UAAAkxC,GACAjyC,OAAAkyC,GACAt1C,KAAA41C,GACAtxC,MAAAkxC,GACAnuC,KAAA8uC,GACAtxC,MAAAuxC,GACA5+B,MAAAm/B,GACA1nC,KAAA2nC,GACAt8C,KAAA08C,GACAE,MAAAD,GACAvI,KAAAyI,GACAphB,KAAAqhB,GACAphB,MAAAqhB,GACAn4C,KAAAo4C,GACA31C,KAAA41C,GACAjwC,MAAAmwC,GACA9hB,SAAA+hB,GACAh2C,QAAAm2C,GACA9zC,KAAA+zC,GACAU,KAAAT,GACAlpB,MAAAmpB,GACAxG,MAAAyG,GACAx2C,OAAAy2C,GACAvgC,OAAAwgC,GACA5wC,OAAA8wC,GACAhK,MAAAiK,GACA7zC,GAAAuvC,GACAprC,SAAA2vC,GAGA,IAAAj1C,IAAA,SAAA8vC,GACA,sBAAAA,GACA,GAAAZ,KAAA5a,SAAAkd,cAAA1B,MAAAxb,SAAAG,kBACA,GAAAya,KAAAY,IAAA35C,KAGA0K,GAAA,SAAAivC,GACA,sBAAAA,GACA,GAAAZ,IAAA5a,SAAAwd,iBAAAhC,KAAAxb,SAAAG,kBACA,GAAAya,IAAA,MAAAY,QAAA35C,KAGAg/C,GAAA,SAAA/J,EAAAgK,EAAAC,GACAnvC,UAAAzL,OAAA,IAAA46C,EAAAD,IAAAxK,KAAA2G,eAEA,QAAA4D,GAAA56C,EAAA,EAAAqO,EAAAwsC,IAAA36C,OAAA,EAA0DF,EAAAqO,IAAOrO,EACjE,IAAA46C,EAAAC,EAAA76C,IAAA86C,eACA,MAAArsB,IAAAoiB,EAAA+J,EAIA,cAGAC,GAAA,SAAAhK,EAAAgK,GACA,MAAAA,MAAAxK,KAAAwK,QAEA,QAAA76C,GAAA,EAAAqO,EAAAwsC,IAAA36C,OAAA,EAAA66C,EAAA,GAAAj7C,OAAAuO,GAA0ErO,EAAAqO,IAAOrO,EACjF+6C,EAAA/6C,GAAAyuB,GAAAoiB,EAAAgK,EAAA76C,GAGA,OAAA+6C,GAGAj/C,GAAAu5C,WACAv5C,EAAAizC,QACAjzC,EAAAw5C,QAAAS,GACAj6C,EAAAsO,SACAtO,EAAAs5C,aACAt5C,EAAAk5C,cACAl5C,EAAA2J,UACA3J,EAAAwK,aACAxK,EAAA0d,YACA1d,EAAAy5C,YACAz5C,EAAAw7C,eACAx7C,EAAA2N,MAAA0oC,EACAr2C,EAAA8+C,SACA9+C,EAAA++C,WACA/+C,EAAAo4C,OAAA9Z,GACAt+B,EAAAs0C,cAEAnzC,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OfonLxC,SAAUpB,EAAQD,EAASM,IgBhkNjC,SAAA6P,EAAApQ,GACAA,EAAAC,EAAAM,EAAA,IAAAA,EAAA,GAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,GAAAA,EAAA,KAGCF,KAAA,SAAAJ,EAAA+E,EAAAH,EAAAs6C,EAAAttB,EAAAjtB,EAAAF,GAAwF,YAgCzF,SAAA06C,GAAApK,EAAAt0C,GACA,GAAA2+C,GAAArK,EAAAsK,YACA,KAAAD,SAAA3+C,KAAA2+C,EAAAE,MAAAC,EAAA,SAAAvyB,OAAA,WACA,OAAAoyB,GAGA,QAAA3xB,GAAAsnB,EAAAt0C,GACA,GAAA2+C,GAAArK,EAAAsK,YACA,KAAAD,SAAA3+C,KAAA2+C,EAAAE,MAAAE,EAAA,SAAAxyB,OAAA,WACA,OAAAoyB,GAGA,QAAA5xB,GAAAunB,EAAAt0C,GACA,GAAA2+C,GAAArK,EAAAsK,YACA,KAAAD,SAAA3+C,IAAA,SAAAusB,OAAA,WACA,OAAAoyB,GAGA,QAAAvgC,GAAAk2B,EAAAt0C,EAAAg/C,GASA,QAAAL,GAAAM,GACAD,EAAAH,MAAAK,EACAF,EAAAG,MAAAC,QAAAjvC,EAAA6uC,EAAA5zC,MAAA4zC,EAAA/nB,MAGA+nB,EAAA5zC,OAAA6zC,GAAA9uC,EAAA8uC,EAAAD,EAAA5zC,OAGA,QAAA+E,GAAA8uC,GACA,GAAAx7C,GAAA0R,EAAArD,EAAA8N,CAGA,IAAAo/B,EAAAH,QAAAK,EAAA,MAAA9uC,IAEA,KAAA3M,IAAA47C,GAEA,GADAz/B,EAAAy/B,EAAA57C,GACAmc,EAAAlX,OAAAs2C,EAAAt2C,KAAA,CAKA,GAAAkX,EAAAi/B,QAAAS,EAAA,MAAAb,GAAAc,QAAApvC,EAIAyP,GAAAi/B,QAAAW,GACA5/B,EAAAi/B,MAAAY,EACA7/B,EAAAu/B,MAAA/uC,OACAwP,EAAAvV,GAAAnK,KAAA,YAAAo0C,IAAAlB,SAAAxzB,EAAA4R,MAAA5R,EAAA6Q,aACA4uB,GAAA57C,KAMAA,EAAAzD,IACA4f,EAAAi/B,MAAAY,EACA7/B,EAAAu/B,MAAA/uC,aACAivC,GAAA57C,IAoBA,GAZAg7C,EAAAc,QAAA,WACAP,EAAAH,QAAAS,IACAN,EAAAH,MAAAW,EACAR,EAAAG,MAAAC,QAAAjiC,EAAA6hC,EAAA5zC,MAAA4zC,EAAA/nB,MACA9Z,EAAA8hC,MAMAD,EAAAH,MAAAE,EACAC,EAAA30C,GAAAnK,KAAA,QAAAo0C,IAAAlB,SAAA4L,EAAAxtB,MAAAwtB,EAAAvuB,OACAuuB,EAAAH,QAAAE,EAAA,CAKA,IAJAC,EAAAH,MAAAS,EAGAI,EAAA,GAAAn8C,OAAAuO,EAAAktC,EAAAU,MAAA/7C,QACAF,EAAA,EAAA0R,GAAA,EAAuB1R,EAAAqO,IAAOrO,GAC9Bmc,EAAAo/B,EAAAU,MAAAj8C,GAAA7C,MAAAV,KAAAo0C,IAAAlB,SAAA4L,EAAAxtB,MAAAwtB,EAAAvuB,UACAivB,IAAAvqC,GAAAyK,EAGA8/B,GAAA/7C,OAAAwR,EAAA,GAGA,QAAAgI,GAAA8hC,GAKA,IAJA,GAAAtpC,GAAAspC,EAAAD,EAAA9zC,SAAA8zC,EAAA1zC,KAAApL,KAAA,KAAA++C,EAAAD,EAAA9zC,WAAA8zC,EAAAG,MAAAC,QAAAhvC,GAAA4uC,EAAAH,MAAAc,EAAA,GACAl8C,GAAA,EACAqO,EAAA4tC,EAAA/7C,SAEAF,EAAAqO,GACA4tC,EAAAj8C,GAAAvD,KAAA,KAAAyV,EAIAqpC,GAAAH,QAAAc,IACAX,EAAA30C,GAAAnK,KAAA,MAAAo0C,IAAAlB,SAAA4L,EAAAxtB,MAAAwtB,EAAAvuB,OACArgB,KAIA,QAAAA,KACA4uC,EAAAH,MAAAY,EACAT,EAAAG,MAAA/uC,aACAivC,GAAAr/C,EACA,QAAAyD,KAAA47C,GAAA,aACA/K,GAAAsK,aApGA,GACAc,GADAL,EAAA/K,EAAAsK,YAKAS,GAAAr/C,GAAAg/C,EACAA,EAAAG,MAAAV,EAAAU,MAAAR,EAAA,EAAAK,EAAA/nB,MA+HA,QAAA2oB,GAAA5/C,EAAA0I,GACA,GAAAm3C,GAAAC,CACA,mBACA,GAAAnB,GAAA3xB,EAAArtB,KAAAK,GACA0/C,EAAAf,EAAAe,KAKA,IAAAA,IAAAG,EAAA,CACAC,EAAAD,EAAAH,CACA,QAAAj8C,GAAA,EAAAqO,EAAAguC,EAAAn8C,OAAwCF,EAAAqO,IAAOrO,EAC/C,GAAAq8C,EAAAr8C,GAAAiF,SAAA,CACAo3C,IAAAzsC,QACAysC,EAAAvC,OAAA95C,EAAA,EACA,QAKAk7C,EAAAe,MAAAI,GAIA,QAAAC,GAAA//C,EAAA0I,EAAA9H,GACA,GAAAi/C,GAAAC,CACA,sBAAAl/C,GAAA,SAAA2rB,MACA,mBACA,GAAAoyB,GAAA3xB,EAAArtB,KAAAK,GACA0/C,EAAAf,EAAAe,KAKA,IAAAA,IAAAG,EAAA,CACAC,GAAAD,EAAAH,GAAArsC,OACA,QAAAsC,IAAoBjN,OAAA9H,SAAyB6C,EAAA,EAAAqO,EAAAguC,EAAAn8C,OAA2BF,EAAAqO,IAAOrO,EAC/E,GAAAq8C,EAAAr8C,GAAAiF,SAAA,CACAo3C,EAAAr8C,GAAAkS,CACA,OAGAlS,IAAAqO,GAAAguC,EAAAvrC,KAAAoB,GAGAgpC,EAAAe,MAAAI,GAsBA,QAAAE,GAAA/0C,EAAAvC,EAAA9H,GACA,GAAAZ,GAAAiL,EAAAg1C,GAOA,OALAh1C,GAAAnG,KAAA,WACA,GAAA65C,GAAA3xB,EAAArtB,KAAAK,IACA2+C,EAAA/9C,QAAA+9C,EAAA/9C,WAA2C8H,GAAA9H,EAAA2O,MAAA5P,KAAAyP,aAG3C,SAAAklC,GACA,MAAAvnB,GAAAunB,EAAAt0C,GAAAY,MAAA8H,IAYA,QAAAmsC,GAAAnsC,GACA,kBACA/I,KAAAm1C,gBAAApsC,IAIA,QAAAqsC,GAAAzC,GACA,kBACA3yC,KAAAq1C,kBAAA1C,EAAAC,MAAAD,EAAAE,QAIA,QAAAyC,GAAAvsC,EAAA4qB,EAAA3e,GACA,GAAAurC,GACAC,CACA,mBACA,GAAA/tC,GAAAzS,KAAAge,aAAAjV,EACA,OAAA0J,KAAAuC,EAAA,KACAvC,IAAA8tC,EAAAC,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAuC,IAIA,QAAAugC,GAAA5C,EAAAhf,EAAA3e,GACA,GAAAurC,GACAC,CACA,mBACA,GAAA/tC,GAAAzS,KAAAy9C,eAAA9K,EAAAC,MAAAD,EAAAE,MACA,OAAApgC,KAAAuC,EAAA,KACAvC,IAAA8tC,EAAAC,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAuC,IAIA,QAAAygC,GAAA1sC,EAAA4qB,EAAA1yB,GACA,GAAAs/C,GACAE,EACAD,CACA,mBACA,GAAA/tC,GAAAuC,EAAA/T,EAAAjB,KACA,cAAAgV,MAAAhV,MAAAm1C,gBAAApsC,IACA0J,EAAAzS,KAAAge,aAAAjV,GACA0J,IAAAuC,EAAA,KACAvC,IAAA8tC,GAAAvrC,IAAAyrC,EAAAD,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAguC,EAAAzrC,KAIA,QAAA0gC,GAAA/C,EAAAhf,EAAA1yB,GACA,GAAAs/C,GACAE,EACAD,CACA,mBACA,GAAA/tC,GAAAuC,EAAA/T,EAAAjB,KACA,cAAAgV,MAAAhV,MAAAq1C,kBAAA1C,EAAAC,MAAAD,EAAAE,QACApgC,EAAAzS,KAAAy9C,eAAA9K,EAAAC,MAAAD,EAAAE,OACApgC,IAAAuC,EAAA,KACAvC,IAAA8tC,GAAAvrC,IAAAyrC,EAAAD,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAguC,EAAAzrC,KAYA,QAAA0rC,GAAA/N,EAAA1xC,GACA,QAAA8+C,KACA,GAAApL,GAAA30C,KAAA8D,EAAA7C,EAAA2O,MAAA+kC,EAAAllC,UACA,OAAA3L,IAAA,SAAAkS,GACA2+B,EAAAa,eAAA7C,EAAAC,MAAAD,EAAAE,MAAA/uC,EAAAkS,KAIA,MADA+pC,GAAAY,OAAA1/C,EACA8+C,EAGA,QAAAa,GAAA73C,EAAA9H,GACA,QAAA8+C,KACA,GAAApL,GAAA30C,KAAA8D,EAAA7C,EAAA2O,MAAA+kC,EAAAllC,UACA,OAAA3L,IAAA,SAAAkS,GACA2+B,EAAAhW,aAAA51B,EAAAjF,EAAAkS,KAIA,MADA+pC,GAAAY,OAAA1/C,EACA8+C,EAYA,QAAAc,GAAAxgD,EAAAY,GACA,kBACA89C,EAAA/+C,KAAAK,GAAAoL,OAAAxK,EAAA2O,MAAA5P,KAAAyP,YAIA,QAAAqxC,GAAAzgD,EAAAY,GACA,MAAAA,MAAA,WACA89C,EAAA/+C,KAAAK,GAAAoL,MAAAxK,GAcA,QAAA8/C,GAAA1gD,EAAAY,GACA,kBACAosB,EAAArtB,KAAAK,GAAAkL,UAAAtK,EAAA2O,MAAA5P,KAAAyP,YAIA,QAAAuxC,GAAA3gD,EAAAY,GACA,MAAAA,MAAA,WACAosB,EAAArtB,KAAAK,GAAAkL,SAAAtK,GAcA,QAAAggD,GAAA5gD,EAAAY,GACA,qBAAAA,GAAA,SAAA2rB,MACA,mBACAS,EAAArtB,KAAAK,GAAAsL,KAAA1K,GA4CA,QAAAuP,GAAAzH,GACA,OAAAA,EAAA,IAAA6V,OAAAqO,MAAA,SAAA2J,MAAA,SAAA5gB,GACA,GAAAlS,GAAAkS,EAAAkX,QAAA,IAEA,OADAppB,IAAA,IAAAkS,IAAAtC,MAAA,EAAA5P,KACAkS,GAAA,UAAAA,IAIA,QAAAkrC,GAAA7gD,EAAA0I,EAAAkqC,GACA,GAAAkO,GAAAC,EAAAC,EAAA7wC,EAAAzH,GAAAg2C,EAAA1xB,CACA,mBACA,GAAA2xB,GAAAqC,EAAArhD,KAAAK,GACAqK,EAAAs0C,EAAAt0C,EAKAA,KAAAy2C,IAAAC,GAAAD,EAAAz2C,GAAA2S,QAAA3S,GAAA3B,EAAAkqC,GAEA+L,EAAAt0C,GAAA02C,GAYA,QAAAE,GAAAjhD,GACA,kBACA,GAAAke,GAAAve,KAAAie,UACA,QAAAna,KAAA9D,MAAAi/C,aAAA,IAAAn7C,IAAAzD,EAAA,MACAke,MAAA+f,YAAAt+B,OAwDA,QAAA21C,GAAA5sC,EAAA4qB,GACA,GAAA4sB,GACAE,EACAD,CACA,mBACA,GAAA/tC,GAAA9N,EAAA4I,MAAAvN,KAAA+I,GACAiM,GAAAhV,KAAAuN,MAAAqoC,eAAA7sC,GAAApE,EAAA4I,MAAAvN,KAAA+I,GACA,OAAA0J,KAAAuC,EAAA,KACAvC,IAAA8tC,GAAAvrC,IAAAyrC,EAAAD,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAguC,EAAAzrC,IAIA,QAAAusC,GAAAx4C,GACA,kBACA/I,KAAAuN,MAAAqoC,eAAA7sC,IAIA,QAAA8sC,GAAA9sC,EAAA4qB,EAAA3e,GACA,GAAAurC,GACAC,CACA,mBACA,GAAA/tC,GAAA9N,EAAA4I,MAAAvN,KAAA+I,EACA,OAAA0J,KAAAuC,EAAA,KACAvC,IAAA8tC,EAAAC,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAuC,IAIA,QAAAghC,GAAAjtC,EAAA4qB,EAAA1yB,GACA,GAAAs/C,GACAE,EACAD,CACA,mBACA,GAAA/tC,GAAA9N,EAAA4I,MAAAvN,KAAA+I,GACAiM,EAAA/T,EAAAjB,KAEA,OADA,OAAAgV,IAAAhV,KAAAuN,MAAAqoC,eAAA7sC,GAAAiM,EAAArQ,EAAA4I,MAAAvN,KAAA+I,IACA0J,IAAAuC,EAAA,KACAvC,IAAA8tC,GAAAvrC,IAAAyrC,EAAAD,EACAA,EAAA7sB,EAAA4sB,EAAA9tC,EAAAguC,EAAAzrC,IAcA,QAAAwsC,GAAAz4C,EAAA9H,EAAA60C,GACA,QAAAiK,KACA,GAAApL,GAAA30C,KAAA8D,EAAA7C,EAAA2O,MAAA+kC,EAAAllC,UACA,OAAA3L,IAAA,SAAAkS,GACA2+B,EAAApnC,MAAAwoC,YAAAhtC,EAAAjF,EAAAkS,GAAA8/B,IAIA,MADAiK,GAAAY,OAAA1/C,EACA8+C,EAWA,QAAA7I,GAAAj2C,GACA,kBACAjB,KAAAi3C,YAAAh2C,GAIA,QAAAk2C,GAAAl2C,GACA,kBACA,GAAA+T,GAAA/T,EAAAjB,KACAA,MAAAi3C,YAAA,MAAAjiC,EAAA,GAAAA,GAkCA,QAAAysC,GAAA/I,EAAAC,EAAA5vC,EAAA1I,GACAL,KAAA44C,QAAAF,EACA14C,KAAA64C,SAAAF,EACA34C,KAAA0hD,MAAA34C,EACA/I,KAAAsgD,IAAAjgD,EAGA,QAAAiL,GAAAvC,GACA,MAAApE,GAAA2Y,YAAAhS,WAAAvC,GAGA,QAAA44C,KACA,QAAAthD,GAuCA,QAAAuhD,GAAAjN,EAAAt0C,GAEA,IADA,GAAAwhD,KACAA,EAAAlN,EAAAsK,iBAAA4C,IAAAxhD,KACA,KAAAs0C,IAAA12B,YACA,MAAA6jC,IAAAxqB,KAAAwnB,EAAAiD,MAAAD,EAGA,OAAAD,GAvtBA,GAAAG,GAAAx9C,EAAAqK,SAAA,2BACAozC,KAEA9C,EAAA,EACAI,EAAA,EACAH,EAAA,EACAO,EAAA,EACAE,EAAA,EACAG,EAAA,EACAF,EAAA,EAEAd,EAAA,SAAArK,EAAA5rC,EAAA1I,EAAAwxB,EAAAf,EAAA+wB,GACA,GAAAnC,GAAA/K,EAAAsK,YACA,IAAAS,GACA,GAAAr/C,IAAAq/C,GAAA,WADA/K,GAAAsK,eAEAxgC,GAAAk2B,EAAAt0C,GACA0I,OACA8oB,QACAf,QACApmB,GAAAs3C,EACAjC,MAAAkC,EACA3qB,KAAAuqB,EAAAvqB,KACA7rB,MAAAo2C,EAAAp2C,MACAF,SAAAs2C,EAAAt2C,SACAI,KAAAk2C,EAAAl2C,KACA6zC,MAAA,KACAN,MAAAC,KA+HA+C,EAAA,SAAAvN,EAAA5rC,GACA,GACAi2C,GACAmD,EAEAr+C,EAJA47C,EAAA/K,EAAAsK,aAGAhjB,GAAA,CAGA,IAAAyjB,EAAA,CAEA32C,EAAA,MAAAA,EAAA,KAAAA,EAAA,EAEA,KAAAjF,IAAA47C,IACAV,EAAAU,EAAA57C,IAAAiF,UACAo5C,EAAAnD,EAAAE,MAAAE,GAAAJ,EAAAE,MAAAc,EACAhB,EAAAE,MAAAY,EACAd,EAAAQ,MAAA/uC,OACA0xC,GAAAnD,EAAAt0C,GAAAnK,KAAA,YAAAo0C,IAAAlB,SAAAuL,EAAAntB,MAAAmtB,EAAAluB,aACA4uB,GAAA57C,IALkDm4B,GAAA,CAQlDA,UAAA0Y,GAAAsK,eAGAmD,EAAA,SAAAr5C,GACA,MAAA/I,MAAAmF,KAAA,WACA+8C,EAAAliD,KAAA+I,MAqDAs5C,EAAA,SAAAt5C,EAAA9H,GACA,GAAAZ,GAAAL,KAAAsgD,GAIA,IAFAv3C,GAAA,GAEA0G,UAAAzL,OAAA,GAEA,OAAAgS,GADA+pC,EAAA3yB,EAAAptB,KAAA20C,OAAAt0C,GAAA0/C,MACAj8C,EAAA,EAAAqO,EAAA4tC,EAAA/7C,OAAwCF,EAAAqO,IAAOrO,EAC/C,IAAAkS,EAAA+pC,EAAAj8C,IAAAiF,SACA,MAAAiN,GAAA/U,KAGA,aAGA,MAAAjB,MAAAmF,MAAA,MAAAlE,EAAAg/C,EAAAG,GAAA//C,EAAA0I,EAAA9H,KAgBAoyB,GAAA,SAAAhjB,EAAAC,GACA,GAAA7P,EACA,wBAAA6P,GAAAkhB,EAAA0C,kBACA5jB,YAAA/L,GAAAyE,MAAAwoB,EAAAqS,gBACApjC,EAAA8D,EAAAyE,MAAAsH,OAAA7P,EAAA+wB,EAAAqS,gBACArS,EAAAmS,mBAAAtzB,EAAAC,IAiEAgyC,GAAA,SAAAv5C,EAAA9H,GACA,GAAA0xC,GAAAhuC,EAAAu0C,UAAAnwC,GAAAjF,EAAA,cAAA6uC,EAAAnhB,EAAAmQ,wBAAAtO,EACA,OAAArzB,MAAA4gD,UAAA73C,EAAA,kBAAA9H,IACA0xC,EAAAE,MAAA6C,EAAAD,GAAA9C,EAAA7uC,EAAAu8C,EAAArgD,KAAA,QAAA+I,EAAA9H,IACA,MAAAA,GAAA0xC,EAAAE,MAAAuC,EAAAF,GAAAvC,IACAA,EAAAE,MAAA0C,EAAAD,GAAA3C,EAAA7uC,EAAA7C,EAAA;EAyBAshD,GAAA,SAAAx5C,EAAA9H,GACA,GAAAyd,GAAA,QAAA3V,CACA,IAAA0G,UAAAzL,OAAA,SAAA0a,EAAA1e,KAAA+/C,MAAArhC,OAAAiiC,MACA,UAAA1/C,EAAA,MAAAjB,MAAA+/C,MAAArhC,EAAA,KACA,sBAAAzd,GAAA,SAAA2rB,MACA,IAAA+lB,GAAAhuC,EAAAu0C,UAAAnwC,EACA,OAAA/I,MAAA+/C,MAAArhC,GAAAi0B,EAAAE,MAAA6N,EAAAE,GAAAjO,EAAA1xC,KAeAuhD,GAAA,SAAAvhD,GACA,GAAAZ,GAAAL,KAAAsgD,GAEA,OAAA7wC,WAAAzL,OACAhE,KAAAmF,MAAA,kBAAAlE,GACA4/C,EACAC,GAAAzgD,EAAAY,IACAmsB,EAAAptB,KAAA20C,OAAAt0C,GAAAoL,OAeAg3C,GAAA,SAAAxhD,GACA,GAAAZ,GAAAL,KAAAsgD,GAEA,OAAA7wC,WAAAzL,OACAhE,KAAAmF,MAAA,kBAAAlE,GACA8/C,EACAC,GAAA3gD,EAAAY,IACAmsB,EAAAptB,KAAA20C,OAAAt0C,GAAAkL,UAUAm3C,GAAA,SAAAzhD,GACA,GAAAZ,GAAAL,KAAAsgD,GAEA,OAAA7wC,WAAAzL,OACAhE,KAAAmF,KAAA87C,EAAA5gD,EAAAY,IACAmsB,EAAAptB,KAAA20C,OAAAt0C,GAAAsL,MAGAg3C,GAAA,SAAA50B,GACA,kBAAAA,OAAAppB,EAAAy0C,QAAArrB,GAEA,QAAA2qB,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,EAAA,GAAAr3C,OAAApD,GAAAgV,EAAA,EAAqFA,EAAAhV,IAAOgV,EAC5F,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAm3C,EAAAF,EAAAzlC,MAAA1R,EAAA,EAA4FA,EAAAqO,IAAOrO,GACnG6wC,EAAA7jB,EAAAhtB,KAAAiqB,EAAAxtB,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,IACAqqB,EAAAvmC,KAAA+/B,EAKA,WAAA8M,GAAAxG,EAAAj7C,KAAA64C,SAAA74C,KAAA0hD,MAAA1hD,KAAAsgD,MAGAsC,GAAA,SAAAt3C,GACA,GAAAA,EAAAg1C,MAAAtgD,KAAAsgD,IAAA,SAAA1zB,MAEA,QAAA0vB,GAAAt8C,KAAA44C,QAAA2D,EAAAjxC,EAAAstC,QAAA4D,EAAAF,EAAAt4C,OAAA0c,EAAA67B,EAAAv4C,OAAAxD,EAAAsH,KAAAC,IAAAy0C,EAAA97B,GAAA+7B,EAAA,GAAA74C,OAAA44C,GAAAhnC,EAAA,EAA+JA,EAAAhV,IAAOgV,EACtK,OAAAm/B,GAAA+H,EAAAJ,EAAA9mC,GAAAmnC,EAAAJ,EAAA/mC,GAAArD,EAAAuqC,EAAA14C,OAAA8G,EAAA2xC,EAAAjnC,GAAA,GAAA5R,OAAAuO,GAAArO,EAAA,EAAwHA,EAAAqO,IAAOrO,GAC/H6wC,EAAA+H,EAAA54C,IAAA64C,EAAA74C,MACAgH,EAAAhH,GAAA6wC,EAKA,MAAQn/B,EAAAgnC,IAAQhnC,EAChBinC,EAAAjnC,GAAA8mC,EAAA9mC,EAGA,WAAAisC,GAAAhF,EAAAz8C,KAAA64C,SAAA74C,KAAA0hD,MAAA1hD,KAAAsgD,MA0BAuC,GAAA,SAAA95C,EAAAkqC,GACA,GAAA5yC,GAAAL,KAAAsgD,GAEA,OAAA7wC,WAAAzL,OAAA,EACAopB,EAAAptB,KAAA20C,OAAAt0C,GAAAqK,MAAA3B,GACA/I,KAAAmF,KAAA+7C,EAAA7gD,EAAA0I,EAAAkqC,KAWA6P,GAAA,WACA,MAAA9iD,MAAA0K,GAAA,aAAA42C,EAAAthD,KAAAsgD,OAGAyC,GAAA,SAAAx5C,GACA,GAAAR,GAAA/I,KAAA0hD,MACArhD,EAAAL,KAAAsgD,GAEA,mBAAA/2C,OAAA5E,EAAA00C,SAAA9vC,GAEA,QAAAmvC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,EAAA,GAAAr3C,OAAApD,GAAAgV,EAAA,EAAqFA,EAAAhV,IAAOgV,EAC5F,OAAAm/B,GAAAuG,EAAApqB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAm3C,EAAAF,EAAAzlC,GAAA,GAAA5R,OAAAuO,GAAArO,EAAA,EAA+GA,EAAAqO,IAAOrO,GACtH6wC,EAAA7jB,EAAAhtB,MAAAo3C,EAAA3xC,EAAAhJ,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,MACA,YAAA6jB,KAAAuG,EAAAzH,SAAAkB,EAAAlB,UACA0H,EAAAr3C,GAAAo3C,EACA8D,EAAA7D,EAAAr3C,GAAAiF,EAAA1I,EAAAyD,EAAAq3C,EAAA/tB,EAAAunB,EAAAt0C,IAKA,WAAAohD,GAAAxG,EAAAj7C,KAAA64C,SAAA9vC,EAAA1I,IAGA2iD,GAAA,SAAAz5C,GACA,GAAAR,GAAA/I,KAAA0hD,MACArhD,EAAAL,KAAAsgD,GAEA,mBAAA/2C,OAAA5E,EAAAy2C,YAAA7xC,GAEA,QAAAmvC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAi3C,KAAAtC,KAAAnjC,EAAA,EAAyFA,EAAAhV,IAAOgV,EAChG,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAF,EAAA,EAA8DA,EAAAqO,IAAOrO,EACrE,GAAA6wC,EAAA7jB,EAAAhtB,GAAA,CACA,OAAA63C,GAAAsH,EAAA15C,EAAAhJ,KAAAo0C,IAAAlB,SAAA3vC,EAAAgtB,GAAA8wB,EAAAx0B,EAAAunB,EAAAt0C,GAAAwd,EAAA,EAAAwC,EAAA4iC,EAAAj/C,OAAmI6Z,EAAAwC,IAAOxC,GAC1I89B,EAAAsH,EAAAplC,KACAmhC,EAAArD,EAAA5yC,EAAA1I,EAAAwd,EAAAolC,EAAArB,EAGA3G,GAAArmC,KAAAquC,GACAtK,EAAA/jC,KAAA+/B,GAKA,UAAA8M,GAAAxG,EAAAtC,EAAA5vC,EAAA1I,IAGAo4C,GAAA9zC,EAAA2Y,UAAA7J,UAAAkP,YAEAugC,GAAA,WACA,UAAAzK,IAAAz4C,KAAA44C,QAAA54C,KAAA64C,WA+CAsK,GAAA,SAAAp6C,EAAA9H,EAAA60C,GACA,GAAAhyC,GAAA,cAAAiF,GAAA,IAAAyoB,EAAAkQ,wBAAArO,EACA,cAAApyB,EAAAjB,KACAwhD,WAAAz4C,EAAA4sC,EAAA5sC,EAAAjF,IACA4G,GAAA,aAAA3B,EAAAw4C,EAAAx4C,IACA/I,KAAAwhD,WAAAz4C,EAAA,kBAAA9H,GACA+0C,EAAAjtC,EAAAjF,EAAAu8C,EAAArgD,KAAA,SAAA+I,EAAA9H,IACA40C,EAAA9sC,EAAAjF,EAAA7C,EAAA,IAAA60C,IAcAsN,GAAA,SAAAr6C,EAAA9H,EAAA60C,GACA,GAAAp3B,GAAA,UAAA3V,GAAA,GACA,IAAA0G,UAAAzL,OAAA,SAAA0a,EAAA1e,KAAA+/C,MAAArhC,OAAAiiC,MACA,UAAA1/C,EAAA,MAAAjB,MAAA+/C,MAAArhC,EAAA,KACA,sBAAAzd,GAAA,SAAA2rB,MACA,OAAA5sB,MAAA+/C,MAAArhC,EAAA8iC,EAAAz4C,EAAA9H,EAAA,MAAA60C,EAAA,GAAAA,KAgBAuN,GAAA,SAAApiD,GACA,MAAAjB,MAAA+/C,MAAA,yBAAA9+C,GACAk2C,EAAAkJ,EAAArgD,KAAA,OAAAiB,IACAi2C,EAAA,MAAAj2C,EAAA,GAAAA,EAAA,MAGAqiD,GAAA,WAKA,OAJAv6C,GAAA/I,KAAA0hD,MACA6B,EAAAvjD,KAAAsgD,IACAkD,EAAA7B,IAEAjJ,EAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAwR,EAAA,EAA2DA,EAAAhV,IAAOgV,EAClE,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAF,EAAA,EAA8DA,EAAAqO,IAAOrO,EACrE,GAAA6wC,EAAA7jB,EAAAhtB,GAAA,CACA,GAAA89C,GAAAx0B,EAAAunB,EAAA4O,EACAvE,GAAArK,EAAA5rC,EAAAy6C,EAAA1/C,EAAAgtB,GACAwG,KAAAsqB,EAAAtqB,KAAAsqB,EAAAn2C,MAAAm2C,EAAAr2C,SACAE,MAAA,EACAF,SAAAq2C,EAAAr2C,SACAI,KAAAi2C,EAAAj2C,OAMA,UAAA81C,GAAA/I,EAAA14C,KAAA64C,SAAA9vC,EAAAy6C,IAGAnjD,GAAA,EAiBAojD,GAAA9+C,EAAA2Y,UAAA7J,SAEAguC,GAAAhuC,UAAAnI,EAAAmI,WACAkP,YAAA8+B,EACAl4C,OAAAw5C,GACA34C,UAAA44C,GACA35C,OAAAs5C,GACA73C,MAAA83C,GACAtlC,UAAA4lC,GACA53C,WAAAg4C,GACA/iD,KAAAkjD,GAAAljD,KACA48C,MAAAsG,GAAAtG,MACAxI,KAAA8O,GAAA9O,KACA3Y,KAAAynB,GAAAznB,KACAC,MAAAwnB,GAAAxnB,MACA92B,KAAAs+C,GAAAt+C,KACAuF,GAAAm4C,GACAj7C,KAAA06C,GACA1B,UAAA2B,GACAh1C,MAAA41C,GACA3B,WAAA4B,GACAp5C,KAAAq5C,GACA71C,OAAAs1C,GACA/C,MAAAsC,EACA52C,MAAA+2C,GACAj3C,SAAAk3C,GACA92C,KAAA+2C,GAGA,IAAAZ,KACAxqB,KAAA,KACA7rB,MAAA,EACAF,SAAA,IACAI,KAAAtH,EAAA+V,gBAaAspC,GAAA,SAAA36C,GACA,GAAA1I,GACAwhD,CAEA94C,aAAA04C,IACAphD,EAAA0I,EAAAu3C,IAAAv3C,IAAA24C,QAEArhD,EAAAshD,KAAAE,EAAAC,IAAAxqB,KAAAwnB,EAAAiD,MAAAh5C,EAAA,MAAAA,EAAA,KAAAA,EAAA,GAGA,QAAA2vC,GAAA14C,KAAA44C,QAAAp4C,EAAAk4C,EAAA10C,OAAAwR,EAAA,EAA2DA,EAAAhV,IAAOgV,EAClE,OAAAm/B,GAAA7jB,EAAA4nB,EAAAljC,GAAArD,EAAA2e,EAAA9sB,OAAAF,EAAA,EAA8DA,EAAAqO,IAAOrO,GACrE6wC,EAAA7jB,EAAAhtB,KACAk7C,EAAArK,EAAA5rC,EAAA1I,EAAAyD,EAAAgtB,EAAA+wB,GAAAD,EAAAjN,EAAAt0C,GAKA,WAAAohD,GAAA/I,EAAA14C,KAAA64C,SAAA9vC,EAAA1I,GAGAsE,GAAA2Y,UAAA7J,UAAAyuC,UAAAE,EACAz9C,EAAA2Y,UAAA7J,UAAAnI,WAAAo4C,EAEA,IAAAhkD,KAAA,MAEAyiD,GAAA,SAAAxN,EAAA5rC,GACA,GACAi2C,GACAl7C,EAFA47C,EAAA/K,EAAAsK,YAIA,IAAAS,EAAA,CACA32C,EAAA,MAAAA,EAAA,KAAAA,EAAA,EACA,KAAAjF,IAAA47C,GACA,IAAAV,EAAAU,EAAA57C,IAAAo7C,MAAAK,GAAAP,EAAAj2C,SACA,UAAA04C,KAAA9M,IAAAj1C,GAAAqJ,GAAAjF,GAKA,YAGAlE,GAAA0L,aACA1L,EAAAuiD,UACAviD,EAAAsiD,YAEAnhD,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OhB0kNxC,SAAUpB,EAAQD,EAASM,IiBz1OjC,SAAA6P,EAAApQ,GACAA,EAAAC,IAGCI,KAAA,SAAAJ,GAA4B,YAc7B,SAAAmiD,KACA,MAAA4B,KAAAC,EAAAC,GAAAF,EAAAG,EAAA/B,MAAAgC,GAGA,QAAAF,KACAF,EAAA,EAGA,QAAAK,KACAhkD,KAAAikD,MACAjkD,KAAAkkD,MACAlkD,KAAAu0C,MAAA,KA0BA,QAAAiL,GAAAlyB,EAAA7hB,EAAA6rB,GACA,GAAAthB,GAAA,GAAAguC,EAEA,OADAhuC,GAAAypC,QAAAnyB,EAAA7hB,EAAA6rB,GACAthB,EAGA,QAAAmuC,KACApC,MACAqC,CAEA,KADA,GAAAp2C,GAAAgI,EAAAquC,EACAruC,IACAhI,EAAA21C,EAAA3tC,EAAAkuC,QAAA,GAAAluC,EAAAiuC,MAAA1jD,KAAA,KAAAyN,GACAgI,IAAAu+B,QAEA6P,EAGA,QAAAE,KACAX,GAAAY,EAAAT,EAAA/B,OAAAgC,EACAK,EAAAxE,EAAA,CACA,KACAuE,IACG,QACHC,EAAA,EACAI,IACAb,EAAA,GAIA,QAAAc,KACA,GAAA1C,GAAA+B,EAAA/B,MAAAt2C,EAAAs2C,EAAAwC,CACA94C,GAAAi5C,IAAAX,GAAAt4C,EAAA84C,EAAAxC,GAGA,QAAAyC,KAEA,IADA,GAAA/iC,GAAAD,EAAAG,EAAA0iC,EAAA/sB,EAAAvG,IACApP,GACAA,EAAAsiC,OACA3sB,EAAA3V,EAAAuiC,QAAA5sB,EAAA3V,EAAAuiC,OACAziC,EAAAE,MAAA4yB,QAEA/yB,EAAAG,EAAA4yB,MAAA5yB,EAAA4yB,MAAA,KACA5yB,EAAAF,IAAA8yB,MAAA/yB,EAAA6iC,EAAA7iC,EAGAmjC,GAAAljC,EACAmjC,EAAAttB,GAGA,QAAAstB,GAAAttB,GACA,IAAA8sB,EAAA,CACAxE,MAAAiF,aAAAjF,GACA,IAAAn0C,GAAA6rB,EAAAqsB,CACAl4C,GAAA,IACA6rB,EAAAvG,MAAA6uB,EAAAkF,WAAAR,EAAA74C,IACAgrB,MAAAsuB,cAAAtuB,MAEAA,IAAA8tB,EAAAZ,EAAAltB,EAAAuuB,YAAAP,EAAAC,IACAN,EAAA,EAAAR,EAAAU,KA3GA,GAIAD,GACAM,EALAP,EAAA,EACAxE,EAAA,EACAnpB,EAAA,EACAiuB,EAAA,IAGAH,EAAA,EACAZ,EAAA,EACAI,EAAA,EACAD,EAAA,gBAAAmB,0BAAAlD,IAAAkD,YAAA7vB,KACAwuB,EAAA,gBAAA5L,gBAAAkN,sBAAAlN,OAAAkN,sBAAApJ,KAAA9D,QAAA,SAAA/nC,GAAqI60C,WAAA70C,EAAA,IAgBrI+zC,GAAAvwC,UAAA+rC,EAAA/rC,WACAkP,YAAAqhC,EACAvE,QAAA,SAAAnyB,EAAA7hB,EAAA6rB,GACA,qBAAAhK,GAAA,SAAA63B,WAAA,6BACA7tB,IAAA,MAAAA,EAAAyqB,KAAAzqB,IAAA,MAAA7rB,EAAA,GAAAA,GACAzL,KAAAu0C,OAAAoQ,IAAA3kD,OACA2kD,IAAApQ,MAAAv0C,KACAqkD,EAAArkD,KACA2kD,EAAA3kD,MAEAA,KAAAikD,MAAA32B,EACAttB,KAAAkkD,MAAA5sB,EACAstB,KAEAn0C,KAAA,WACAzQ,KAAAikD,QACAjkD,KAAAikD,MAAA,KACAjkD,KAAAkkD,MAAAnzB,IACA6zB,MAmEA,IAAAQ,GAAA,SAAA93B,EAAA7hB,EAAA6rB,GACA,GAAAthB,GAAA,GAAAguC,EAMA,OALAv4C,GAAA,MAAAA,EAAA,GAAAA,EACAuK,EAAAypC,QAAA,SAAAH,GACAtpC,EAAAvF,OACA6c,EAAAgyB,EAAA7zC,IACGA,EAAA6rB,GACHthB,GAGAqvC,EAAA,SAAA/3B,EAAA7hB,EAAA6rB,GACA,GAAAthB,GAAA,GAAAguC,GAAAsB,EAAA75C,CACA,cAAAA,GAAAuK,EAAAypC,QAAAnyB,EAAA7hB,EAAA6rB,GAAAthB,IACAvK,KAAA6rB,EAAA,MAAAA,EAAAyqB,KAAAzqB,EACAthB,EAAAypC,QAAA,QAAAjiC,GAAA8hC,GACAA,GAAAgG,EACAtvC,EAAAypC,QAAAjiC,EAAA8nC,GAAA75C,EAAA6rB,GACAhK,EAAAgyB,IACG7zC,EAAA6rB,GACHthB,GAGApW,GAAAmiD,MACAniD,EAAA4/C,QACA5/C,EAAAukD,aACAvkD,EAAAggD,QAAAwF,EACAxlD,EAAA62B,SAAA4uB,EAEAtkD,OAAAC,eAAApB,EAAA,cAA8CqB,OAAA,OjBm2OxC,SAAUpB,EAAQD,EAASM,GAEhC,GAAIgE,EkBv/OLA,GAAO,SAASC,GAEZ,GAAMQ,GAAczE,EAAQ,IAEtBqlD,GACFC,WAAY,IACZC,gBAAiB,GACjBC,yBAA0B,GAC1BC,eAAgB,GAChBC,eAAgB,QAChBC,eAAgB,SAGdC,EAAkB,GAClBC,EAAkB,QAalBh8C,EAAW,SAASi8C,EAASC,EAAUC,EAAgBvR,GACzD,GAAI3qC,GAAOrF,EAAY4E,OAAOorC,GAC1BwR,EAAQn8C,EAAKA,OAAOijB,MAAM,OAAOpkB,UACjCu9C,SACAzkD,KACA0kD,EAAa,EACbC,EAAkBf,EAAWC,WAAaD,EAAWG,yBACrDvpC,EAAInS,EAAKpC,KAAK,KACdg7B,EAAKrzB,WAAWvF,EAAKpC,KAAK,OAC1B2+C,EAAgBN,EAAWV,EAAWI,eACtCa,EAAQx8C,EAAKA,KAAK,MAAMtC,OAAO,SAC1BE,KAAK,IAAKo+C,GACVp+C,KAAK,IAAKuU,EAAI,GACdvU,KAAK,KAAMg7B,EAAK,MAChBj7B,QAAQ49C,EAAWK,gBAAgB,GACnCr4C,MAAM,YAAa04C,EAAW,KAUvC,KARAO,EAAMx8C,KAAKm8C,EAAM1xC,OACjB+xC,EAAQx8C,EAAKtC,OAAO,SACfC,QAAQ49C,EAAWM,gBAAgB,GACnCj+C,KAAK,IAAKo+C,GACVp+C,KAAK,IAAKuU,EAAIopC,EAAWE,iBACzB79C,KAAK,OAAQy+C,EAAaC,EAAkB1jB,EAAK,MACjDr1B,MAAM,YAAag5C,EAAgB,MAEjCH,EAAOD,EAAM1xC,OAChB9S,EAAKiT,KAAKwxC,GACVI,EAAMx8C,KAAKrI,EAAK0tB,KAAK,MACjBm3B,EAAM7R,OAAO8R,wBAA0BP,EAAiB,KACxDvkD,EAAK8S,MACL+xC,EAAMx8C,KAAKrI,EAAK0tB,KAAK,MACrB1tB,GAAQykD,GACRI,EAAQx8C,EAAKtC,OAAO,SACfC,QAAQ49C,EAAWM,gBAAgB,GACnCj+C,KAAK,IAAKo+C,GACVp+C,KAAK,IAAKuU,EAAGopC,EAAWE,iBACxB79C,KAAK,OAAQy+C,EAAaC,EAAkB1jB,EAAK,MACjD54B,KAAKo8C,GACL74C,MAAM,YAAag5C,EAAgB,QAiB9Cr8C,EAAuB,SAASF,EAAM1E,GAAwB,GAAjBohD,GAAiBj3C,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAAZ,EAAGk3C,EAASl3C,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAAH,CAEzDzF,GAAK7E,KAAK,WACN,GAAIghD,GACAC,EACAzkD,EACA0kD,EACAb,EACArpC,EACAymB,EACA4jB,CAiBJ,KAfAx8C,EAAOrF,EAAY4E,OAAOvJ,MAE1BmmD,EAAQn8C,EAAKA,OAAOijB,MAAM,OAAOpkB,UACjClH,KACA0kD,EAAa,EACbb,EAAa,IACbrpC,EAAInS,EAAKpC,KAAK,KACdg7B,EAAKrzB,WAAWvF,EAAKpC,KAAK,OAC1B4+C,EAAQx8C,EACHA,KAAK,MACLtC,OAAO,SACPE,KAAK,IAAK8+C,GACV9+C,KAAK,IAAKuU,GACVvU,KAAK,KAAMg7B,EAAK,MAEbwjB,EAAOD,EAAM1xC,OAIjB,GAHA9S,EAAKiT,KAAKwxC,GACVI,EAAMx8C,KAAKrI,EAAK0tB,KAAK,MAEjBm3B,EAAM7R,OAAO8R,wBAA0BnhD,EAAO,CAI9C,GAHA3D,EAAK8S,MACL+xC,EAAMx8C,KAAKrI,EAAK0tB,KAAK,QAEjBg3B,EAAaM,EAAQ,GASlB,CACHhlD,EAAKiT,KAAK,OACV4xC,EAAMx8C,KAAKrI,EAAK0tB,KAAK,KACrB,OAXA1tB,GAAQykD,GACRI,EAAQx8C,EAAKtC,OAAO,SACfE,KAAK,IAAK8+C,GACV9+C,KAAK,IAAKuU,GACVvU,KAAK,OAAQy+C,EAAab,EAAa5iB,EAAK,MAC5C54B,KAAKo8C,GAEVp8C,EAAKrC,QAAQ,kBAAkB,OAmBjDi/C,EAAe,SAAS58C,GAA8D,GAAxDi8C,GAAwDx2C,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAA7Cq2C,EAAiBe,EAA4Bp3C,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAAjBs2C,EACnE11C,EAAIwtB,SAASC,cAAc,UAC3BxtB,EAAID,EAAEy2C,WAAW,KAIrB,OAFAx2C,GAAEy2C,KAAOd,EAAW,MAAQY,EAErBv2C,EAAE02C,YAAYh9C,GAAM1E,MAG/B,QACIshD,eACA78C,WACAG,yBA5JR3J,KAAAX,EAAAM,EAAAN,EAAAC,KAAAkC,SAAAmC,IAAArE,EAAAD,QAAAsE,KlBioPM,SAAUrE,EAAQD,EAASM,GAEhC,GAAIgE,EmBnoPLA,GAAO,SAASC,GACZ,YAuCA,SAASW,GAAYmiD,EAAOv3C,EAAUC,GAClC,GAAIu3C,GAAMC,EAAYC,EAAiB7mD,KAAKP,KAAMinD,EAAOt3C,GAEzDu3C,GAAIG,OAASC,EAAgBxL,KACrBoL,EACAK,EAAavnD,KAAKsF,QAAStF,KAAK4F,UAChC8J,GAQZ,QAAS83C,GAAc/I,GACnB,MAAOA,GAAKjvB,QAAQ,IAAb,IAAqBi4B,EAAOC,uBASvC,QAASN,GAAkBH,EAAOt3C,GAC9B,GAAKs3C,EAAL,CAIAA,EAAMr/C,KAAK,UAAW,KACjBA,KAAK,QAAS,6BACnB,IAAI+/C,GAAaC,EAAoBC,uBACjCpJ,EAAOkJ,EAAWV,EAAMtS,OAM5B,OAJA8J,GAAOqJ,EAAoBrJ,GAC3BA,EAAOsJ,EAAaxnD,KAAKP,KAAMy+C,EAAM9uC,EAAOqP,SAASioC,EAAMr/C,KAAK,SAAU,KAC1E62C,EAAO+I,EAAc/I,IAWzB,QAAS8I,GAAajiD,EAAOM,GACzB,GAAIoiD,GAASnqB,SAASC,cAAc,SAKpC,OAHAkqB,GAAOpiD,OAASA,EAChBoiD,EAAO1iD,MAAQA,EAER0iD,EAQX,QAASb,GAAYc,GACjB,GAAIf,GAAM,GAAIgB,MAId,OAFAhB,GAAIiB,IAAJ,GAAaV,EAAOW,gBAAmBC,EAAiBJ,GAEjDf,EAQX,QAASoB,GAAkBC,EAAOP,GAG9B,MAFAA,GAAOlB,WAAW,MAAM0B,UAAUD,EAAO,EAAG,GAErCP,EAWX,QAASS,GAAeT,GAAoE,GAA5Dt4C,GAA4DD,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAAnDg4C,EAAOiB,gBAAiBC,EAA2Bl5C,UAAAzL,OAAA,GAAAjC,SAAA0N,UAAA,GAAAA,UAAA,GAAb,YACvEm5C,EAAMZ,EAAOa,UAAUF,GACvBG,EAAOjrB,SAASC,cAAc,IAElCgrB,GAAKC,KAAOH,EACZE,EAAKE,SAAWt5C,EAChBmuB,SAASorB,KAAK7qB,YAAY0qB,GAC1BA,EAAKI,QACLrrB,SAASorB,KAAK3qB,YAAYwqB,GAQ9B,QAAShB,GAAoBrJ,GACzB,MAAI0K,WAAUC,UAAUC,OAAO,YAAa,EACjC5K,EAAKjvB,QAAQ,gBAAb,cAA4C85B,EAAUC,eAAtD,YAGJ9K,EASX,QAAS6I,GAAgBU,EAAQt4C,EAAU1B,GACvCA,EAAEw7C,iBAEFf,EAAeH,EAAkBtoD,KAAMgoD,GAASt4C,GAUpD,QAASq4C,GAAatJ,EAAM9uC,EAAO85C,GAC/B,IAAK95C,IAAU85C,EACX,MAAOhL,EAF8B,IAIpCh4B,GAAQijC,EAARjjC,IAIL,OAFAg4B,GAAQA,EAAKjvB,QAAQ,KAAb,YAA8BxvB,KAAKuF,SAASC,KAA5C,QAAwDiiD,EAAOkC,eAA/D,kBAA+FlC,EAAOmC,gBAAtG,gBAAqInC,EAAOoC,cAA5I,WAAoKpjC,EAAK,GAAzK,MAAiL9W,EAAjL,eAjLS,GAAA9K,GAGE3E,EAAQ,IAAxBwpD,EAHc7kD,EAGd6kD,aACDJ,EAAYppD,EAAQ,IACpB0nD,EAAsB1nD,EAAQ,IAEhC4pD,EAAU9R,OAAO+R,IAEhBD,KACDA,EAAU5pD,EAAQ,IAAW8pD,OAKjC,IAAM3B,GAAmB,SAAC4B,GACtB,MAAOH,GAAQI,mBAAmBD,GAAKz6B,QAAQ,kBAAmB,SAASzB,EAAOoU,GAC9E,MAAOv4B,QAAOugD,aAAa,KAAOhoB,OAIpCslB,GACF2C,WAAa,kBACb1B,gBAAiB,iBACjB2B,gBAAiB,QACjBjC,gBAAiB,6BACjByB,cAAe,OACfD,gBAAiB,4BACjBD,eAAgB,GAChBjC,GAAIA,yBACA,+BAAgC1nD,KAAKqqD,gBAArC,cAwJR,QACIvlD,cACAsiD,mBACAD,cACAmB,sBA1LR/nD,KAAAX,EAAAM,EAAAN,EAAAC,KAAAkC,SAAAmC,IAAArE,EAAAD,QAAAsE,KnBs0PM,SAAUrE,EAAQD,EAASM,GAEhC,GAAIgE,EoBx0PLA,GAAO,WAGH,GAAMomD,IACEC,WAAY,UAAW,WACvBC,YAAa,UAAW,WACxBC,YAAa,UAAW,YAK1BC,GACE,UACA,UACA,UACA,UACA,UACA,WAIFjkC,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAIFiD,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFihC,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFh/B,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFpF,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGF4F,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGF/B,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFG,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFE,GACE,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGFlc,GACE,UAGR,QACIm7C,cACIgB,cACAjkC,OACAiD,SACAihC,YACAh/B,OACApF,QACA4F,SACA/B,OACAG,SACAE,OAEJmgC,mBACIF,YAAe,sBACfjkC,KAAQ,m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","file":"britecharts.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"britecharts\"] = factory();\n\telse\n\t\troot[\"britecharts\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"britecharts\"] = factory();\n\telse\n\t\troot[\"britecharts\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.colors = exports.brush = exports.step = exports.stackedBar = exports.groupedBar = exports.stackedArea = exports.sparkline = exports.miniTooltip = exports.tooltip = exports.line = exports.legend = exports.donut = exports.bar = undefined;\n\t\n\tvar _bar = __webpack_require__(1);\n\t\n\tvar _bar2 = _interopRequireDefault(_bar);\n\t\n\tvar _donut = __webpack_require__(23);\n\t\n\tvar _donut2 = _interopRequireDefault(_donut);\n\t\n\tvar _legend = __webpack_require__(27);\n\t\n\tvar _legend2 = _interopRequireDefault(_legend);\n\t\n\tvar _line = __webpack_require__(28);\n\t\n\tvar _line2 = _interopRequireDefault(_line);\n\t\n\tvar _tooltip = __webpack_require__(31);\n\t\n\tvar _tooltip2 = _interopRequireDefault(_tooltip);\n\t\n\tvar _miniTooltip = __webpack_require__(32);\n\t\n\tvar _miniTooltip2 = _interopRequireDefault(_miniTooltip);\n\t\n\tvar _sparkline = __webpack_require__(33);\n\t\n\tvar _sparkline2 = _interopRequireDefault(_sparkline);\n\t\n\tvar _stackedArea = __webpack_require__(34);\n\t\n\tvar _stackedArea2 = _interopRequireDefault(_stackedArea);\n\t\n\tvar _groupedBar = __webpack_require__(36);\n\t\n\tvar _groupedBar2 = _interopRequireDefault(_groupedBar);\n\t\n\tvar _stackedBar = __webpack_require__(37);\n\t\n\tvar _stackedBar2 = _interopRequireDefault(_stackedBar);\n\t\n\tvar _step = __webpack_require__(38);\n\t\n\tvar _step2 = _interopRequireDefault(_step);\n\t\n\tvar _brush = __webpack_require__(39);\n\t\n\tvar _brush2 = _interopRequireDefault(_brush);\n\t\n\tvar _colors = __webpack_require__(18);\n\t\n\tvar _colors2 = _interopRequireDefault(_colors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.bar = _bar2.default;\n\texports.donut = _donut2.default;\n\texports.legend = _legend2.default;\n\texports.line = _line2.default;\n\texports.tooltip = _tooltip2.default;\n\texports.miniTooltip = _miniTooltip2.default;\n\texports.sparkline = _sparkline2.default;\n\texports.stackedArea = _stackedArea2.default;\n\texports.groupedBar = _groupedBar2.default;\n\texports.stackedBar = _stackedBar2.default;\n\texports.step = _step2.default;\n\texports.brush = _brush2.default;\n\texports.colors = _colors2.default;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Color = __webpack_require__(5);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Format = __webpack_require__(7);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var textHelper = __webpack_require__(16);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t\n\t var PERCENTAGE_FORMAT = '%';\n\t var NUMBER_FORMAT = ',f';\n\t\n\t /**\n\t * @typedef BarChartData\n\t * @type {Object[]}\n\t * @property {Number} value Value of the group (required)\n\t * @property {String} name Name of the group (required)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * value: 1,\n\t * name: 'glittering'\n\t * },\n\t * {\n\t * value: 1,\n\t * name: 'luminous'\n\t * }\n\t * ]\n\t */\n\t\n\t /**\n\t * Bar Chart reusable API class that renders a\n\t * simple and configurable bar chart.\n\t *\n\t * @module Bar\n\t * @tutorial bar\n\t * @requires d3-array, d3-axis, d3-dispatch, d3-scale, d3-selection\n\t *\n\t * @example\n\t * var barChart = bar();\n\t *\n\t * barChart\n\t * .height(500)\n\t * .width(800);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(barChart);\n\t *\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t top: 20,\n\t right: 20,\n\t bottom: 30,\n\t left: 40\n\t },\n\t width = 960,\n\t height = 500,\n\t data = void 0,\n\t dataZeroed = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t xScale = void 0,\n\t yScale = void 0,\n\t colorSchema = colorHelper.singleColors.aloeGreen,\n\t colorList = void 0,\n\t colorMap = void 0,\n\t yTicks = 5,\n\t xTicks = 5,\n\t percentageAxisToMaxRatio = 1,\n\t enablePercentageLabels = false,\n\t percentageLabelMargin = 7,\n\t percentageLabelSize = 12,\n\t horizontalLabelFormat = '.0%',\n\t verticalLabelFormat = '.0f',\n\t valueLabelFormat = NUMBER_FORMAT,\n\t xAxis = void 0,\n\t yAxis = void 0,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 0,\n\t bottom: 0,\n\t right: 0\n\t },\n\t yAxisPaddingBetweenChart = 10,\n\t yAxisLineWrapLimit = 1,\n\t isHorizontal = false,\n\t svg = void 0,\n\t isAnimated = false,\n\t ease = d3Ease.easeQuadInOut,\n\t animationDuration = 800,\n\t animationStepRatio = 70,\n\t interBarDelay = function interBarDelay(d, i) {\n\t return animationStepRatio * i;\n\t },\n\t valueLabel = 'value',\n\t nameLabel = 'name',\n\t baseLine = void 0,\n\t maskGridLines = void 0,\n\t shouldReverseColorList = true,\n\t\n\t\n\t // Dispatcher object to broadcast the mouse events\n\t // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove'),\n\t\n\t\n\t // extractors\n\t getName = function getName(_ref) {\n\t var name = _ref.name;\n\t return name;\n\t },\n\t getValue = function getValue(_ref2) {\n\t var value = _ref2.value;\n\t return value;\n\t },\n\t _percentageLabelHorizontalX = function _percentageLabelHorizontalX(_ref3) {\n\t var value = _ref3.value;\n\t return xScale(value) + percentageLabelMargin;\n\t },\n\t _percentageLabelHorizontalY = function _percentageLabelHorizontalY(_ref4) {\n\t var name = _ref4.name;\n\t return yScale(name) + yScale.bandwidth() / 2 + percentageLabelSize * (3 / 8);\n\t },\n\t _percentageLabelVerticalX = function _percentageLabelVerticalX(_ref5) {\n\t var name = _ref5.name;\n\t return xScale(name);\n\t },\n\t _percentageLabelVerticalY = function _percentageLabelVerticalY(_ref6) {\n\t var value = _ref6.value;\n\t return yScale(value) - percentageLabelMargin;\n\t },\n\t _percentageLabelHorizontalFormatValue = function _percentageLabelHorizontalFormatValue(_ref7) {\n\t var value = _ref7.value;\n\t return d3Format.format(horizontalLabelFormat)(value);\n\t },\n\t _percentageLabelVerticalFormatValue = function _percentageLabelVerticalFormatValue(_ref8) {\n\t var value = _ref8.value;\n\t return d3Format.format(verticalLabelFormat)(parseFloat(value) * 100);\n\t };\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {BarChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right - yAxisPaddingBetweenChart * 1.2;\n\t chartHeight = height - margin.top - margin.bottom;\n\t\n\t var _cleanData = cleanData(_data);\n\t\n\t data = _cleanData.data;\n\t dataZeroed = _cleanData.dataZeroed;\n\t\n\t\n\t buildScales();\n\t buildAxis();\n\t buildSVG(this);\n\t drawGridLines();\n\t drawBars();\n\t drawAxis();\n\t if (enablePercentageLabels) {\n\t drawPercentageLabels();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t if (isHorizontal) {\n\t xAxis = d3Axis.axisBottom(xScale).ticks(xTicks, valueLabelFormat).tickSizeInner([-chartHeight]);\n\t\n\t yAxis = d3Axis.axisLeft(yScale);\n\t } else {\n\t xAxis = d3Axis.axisBottom(xScale);\n\t\n\t yAxis = d3Axis.axisLeft(yScale).ticks(yTicks, valueLabelFormat);\n\t }\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + (margin.left + yAxisPaddingBetweenChart) + ', ' + margin.top + ')');\n\t\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('x-axis-group axis', true);\n\t container.append('g').attr('transform', 'translate(' + -1 * yAxisPaddingBetweenChart + ', 0)').classed('y-axis-group axis', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Creates the x and y scales of the graph\n\t * @private\n\t */\n\t function buildScales() {\n\t var percentageAxis = Math.min(percentageAxisToMaxRatio * d3Array.max(data, getValue));\n\t\n\t if (isHorizontal) {\n\t xScale = d3Scale.scaleLinear().domain([0, percentageAxis]).rangeRound([0, chartWidth]);\n\t\n\t yScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([chartHeight, 0]).padding(0.1);\n\t } else {\n\t xScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([0, chartWidth]).padding(0.1);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, percentageAxis]).rangeRound([chartHeight, 0]);\n\t }\n\t\n\t if (shouldReverseColorList) {\n\t colorList = data.map(function (d) {\n\t return d;\n\t }).reverse().map(function (_ref9, i) {\n\t var name = _ref9.name;\n\t return {\n\t name: name,\n\t color: colorSchema[i % colorSchema.length] };\n\t });\n\t } else {\n\t colorList = data.map(function (d) {\n\t return d;\n\t }).map(function (_ref10, i) {\n\t var name = _ref10.name;\n\t return {\n\t name: name,\n\t color: colorSchema[i % colorSchema.length] };\n\t });\n\t }\n\t\n\t colorMap = function colorMap(item) {\n\t return colorList.filter(function (_ref11) {\n\t var name = _ref11.name;\n\t return name === item;\n\t })[0].color;\n\t };\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart bar-chart', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Cleaning data adding the proper format\n\t * @param {BarChartData} originalData Data\n\t * @private\n\t */\n\t function cleanData(originalData) {\n\t var data = originalData.reduce(function (acc, d) {\n\t d.value = +d[valueLabel];\n\t d.name = String(d[nameLabel]);\n\t\n\t return [].concat(_toConsumableArray(acc), [d]);\n\t }, []);\n\t\n\t var dataZeroed = data.map(function (d) {\n\t return {\n\t value: 0,\n\t name: String(d[nameLabel])\n\t };\n\t });\n\t\n\t return { data: data, dataZeroed: dataZeroed };\n\t }\n\t\n\t /**\n\t * Utility function that wraps a text into the given width\n\t * @param {D3Selection} text Text to write\n\t * @param {Number} containerWidth\n\t * @private\n\t */\n\t function wrapText(text, containerWidth) {\n\t textHelper.wrapTextWithEllipses(text, containerWidth, 0, yAxisLineWrapLimit);\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t svg.select('.x-axis-group.axis').attr('transform', 'translate(0, ' + chartHeight + ')').call(xAxis);\n\t\n\t svg.select('.y-axis-group.axis').call(yAxis);\n\t\n\t svg.selectAll('.y-axis-group .tick text').call(wrapText, margin.left - yAxisPaddingBetweenChart);\n\t }\n\t\n\t /**\n\t * Draws the bars along the x axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawHorizontalBars(bars) {\n\t // Enter + Update\n\t bars.enter().append('rect').classed('bar', true).attr('y', chartHeight).attr('x', 0).attr('height', yScale.bandwidth()).attr('width', function (_ref12) {\n\t var value = _ref12.value;\n\t return xScale(value);\n\t }).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t }).merge(bars).attr('x', 0).attr('y', function (_ref13) {\n\t var name = _ref13.name;\n\t return yScale(name);\n\t }).attr('height', yScale.bandwidth()).attr('width', function (_ref14) {\n\t var value = _ref14.value;\n\t return xScale(value);\n\t }).attr('fill', function (_ref15) {\n\t var name = _ref15.name;\n\t return colorMap(name);\n\t });\n\t }\n\t\n\t /**\n\t * Draws and animates the bars along the x axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawAnimatedHorizontalBars(bars) {\n\t // Enter + Update\n\t bars.enter().append('rect').classed('bar', true).attr('x', 0).attr('y', chartHeight).attr('height', yScale.bandwidth()).attr('width', function (_ref16) {\n\t var value = _ref16.value;\n\t return xScale(value);\n\t }).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t });\n\t\n\t bars.attr('x', 0).attr('y', function (_ref17) {\n\t var name = _ref17.name;\n\t return yScale(name);\n\t }).attr('height', yScale.bandwidth()).attr('fill', function (_ref18) {\n\t var name = _ref18.name;\n\t return colorMap(name);\n\t }).transition().duration(animationDuration).delay(interBarDelay).ease(ease).attr('width', function (_ref19) {\n\t var value = _ref19.value;\n\t return xScale(value);\n\t });\n\t }\n\t\n\t /**\n\t * Draws and animates the bars along the y axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawAnimatedVerticalBars(bars) {\n\t // Enter + Update\n\t bars.enter().append('rect').classed('bar', true).attr('x', chartWidth).attr('y', function (_ref20) {\n\t var value = _ref20.value;\n\t return yScale(value);\n\t }).attr('width', xScale.bandwidth()).attr('height', function (_ref21) {\n\t var value = _ref21.value;\n\t return chartHeight - yScale(value);\n\t }).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t }).merge(bars).attr('x', function (_ref22) {\n\t var name = _ref22.name;\n\t return xScale(name);\n\t }).attr('width', xScale.bandwidth()).attr('fill', function (_ref23) {\n\t var name = _ref23.name;\n\t return colorMap(name);\n\t }).transition().duration(animationDuration).delay(interBarDelay).ease(ease).attr('y', function (_ref24) {\n\t var value = _ref24.value;\n\t return yScale(value);\n\t }).attr('height', function (_ref25) {\n\t var value = _ref25.value;\n\t return chartHeight - yScale(value);\n\t });\n\t }\n\t\n\t /**\n\t * Draws the bars along the y axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawVerticalBars(bars) {\n\t // Enter + Update\n\t bars.enter().append('rect').classed('bar', true).attr('x', chartWidth).attr('y', function (_ref26) {\n\t var value = _ref26.value;\n\t return yScale(value);\n\t }).attr('width', xScale.bandwidth()).attr('height', function (_ref27) {\n\t var value = _ref27.value;\n\t return chartHeight - yScale(value);\n\t }).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t }).merge(bars).attr('x', function (_ref28) {\n\t var name = _ref28.name;\n\t return xScale(name);\n\t }).attr('y', function (_ref29) {\n\t var value = _ref29.value;\n\t return yScale(value);\n\t }).attr('width', xScale.bandwidth()).attr('height', function (_ref30) {\n\t var value = _ref30.value;\n\t return chartHeight - yScale(value);\n\t }).attr('fill', function (_ref31) {\n\t var name = _ref31.name;\n\t return colorMap(name);\n\t });\n\t }\n\t\n\t /**\n\t * Draws percentage labels at the end of each bar\n\t * @private\n\t * @return {void}\n\t */\n\t function drawPercentageLabels() {\n\t var labelXPosition = isHorizontal ? _percentageLabelHorizontalX : _percentageLabelVerticalX;\n\t var labelYPosition = isHorizontal ? _percentageLabelHorizontalY : _percentageLabelVerticalY;\n\t var text = isHorizontal ? _percentageLabelHorizontalFormatValue : _percentageLabelVerticalFormatValue;\n\t\n\t var percentageLabels = svg.select('.metadata-group').append('g').classed('percentage-label-group', true).selectAll('text').data(data.reverse()).enter().append('text');\n\t\n\t percentageLabels.classed('percentage-label', true).attr('x', labelXPosition).attr('y', labelYPosition).text(text).attr('font-size', percentageLabelSize + 'px');\n\t }\n\t\n\t /**\n\t * Draws the bar elements within the chart group\n\t * @private\n\t */\n\t function drawBars() {\n\t var bars = void 0;\n\t\n\t if (isAnimated) {\n\t bars = svg.select('.chart-group').selectAll('.bar').data(dataZeroed);\n\t\n\t if (isHorizontal) {\n\t drawHorizontalBars(bars);\n\t } else {\n\t drawVerticalBars(bars);\n\t }\n\t\n\t bars = svg.select('.chart-group').selectAll('.bar').data(data);\n\t\n\t if (isHorizontal) {\n\t drawAnimatedHorizontalBars(bars);\n\t } else {\n\t drawAnimatedVerticalBars(bars);\n\t }\n\t } else {\n\t bars = svg.select('.chart-group').selectAll('.bar').data(data);\n\t\n\t if (isHorizontal) {\n\t drawHorizontalBars(bars);\n\t } else {\n\t drawVerticalBars(bars);\n\t }\n\t }\n\t\n\t // Exit\n\t bars.exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines() {\n\t if (isHorizontal) {\n\t drawHorizontalGridLines();\n\t } else {\n\t drawVerticalGridLines();\n\t }\n\t }\n\t\n\t /**\n\t * Draws the grid lines for an horizontal bar chart\n\t * @return {void}\n\t */\n\t function drawHorizontalGridLines() {\n\t maskGridLines = svg.select('.grid-lines-group').selectAll('line.vertical-grid-line').data(xScale.ticks(4)).enter().append('line').attr('class', 'vertical-grid-line').attr('y1', xAxisPadding.left).attr('y2', chartHeight).attr('x1', function (d) {\n\t return xScale(d);\n\t }).attr('x2', function (d) {\n\t return xScale(d);\n\t });\n\t\n\t drawVerticalExtendedLine();\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend y-axis till the edges\n\t * @return {void}\n\t */\n\t function drawVerticalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-y-line').data([0]).enter().append('line').attr('class', 'extended-y-line').attr('y1', xAxisPadding.bottom).attr('y2', chartHeight).attr('x1', 0).attr('x2', 0);\n\t }\n\t\n\t /**\n\t * Draws the grid lines for a vertical bar chart\n\t * @return {void}\n\t */\n\t function drawVerticalGridLines() {\n\t maskGridLines = svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(yScale.ticks(4)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t\n\t drawHorizontalExtendedLine();\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend x-axis till the edges\n\t * @return {void}\n\t */\n\t function drawHorizontalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', chartHeight).attr('y2', chartHeight);\n\t }\n\t\n\t /**\n\t * Custom OnMouseOver event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOver(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t d3Selection.select(e).attr('fill', function (_ref32) {\n\t var name = _ref32.name;\n\t return d3Color.color(colorMap(name)).darker();\n\t });\n\t }\n\t\n\t /**\n\t * Custom OnMouseMove event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseMove(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseMove', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t }\n\t\n\t /**\n\t * Custom OnMouseOver event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOut(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t d3Selection.select(e).attr('fill', function (_ref33) {\n\t var name = _ref33.name;\n\t return colorMap(name);\n\t });\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Default false. If true, adds percentage labels at the end of the bars\n\t * @param {Boolean} _x\n\t * @return {Boolean | module} Current value of enablePercentageLables or Chart module to chain calls\n\t */\n\t exports.enablePercentageLabels = function (_x) {\n\t if (!arguments.length) {\n\t return enablePercentageLabels;\n\t }\n\t enablePercentageLabels = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {number} _x Desired width for the graph\n\t * @return { height | module} Current height or Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the horizontal direction of the chart\n\t * @param {number} _x Desired horizontal direction for the graph\n\t * @return { isHorizontal | module} If it is horizontal or Chart module to chain calls\n\t * @public\n\t */\n\t exports.isHorizontal = function (_x) {\n\t if (!arguments.length) {\n\t return isHorizontal;\n\t }\n\t isHorizontal = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the nameLabel of the chart\n\t * @param {Number} _x Desired nameLabel for the graph\n\t * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabel = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabel;\n\t }\n\t nameLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Configurable extension of the x axis\n\t * if your max point was 50% you might want to show x axis to 60%, pass 1.2\n\t * @param {number} _x ratio to max data point to add to the x axis\n\t * @return { ratio | module} Current ratio or Chart module to chain calls\n\t * @public\n\t */\n\t exports.percentageAxisToMaxRatio = function (_x) {\n\t if (!arguments.length) {\n\t return percentageAxisToMaxRatio;\n\t }\n\t percentageAxisToMaxRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Default 10px. Offset between end of bar and start of the percentage bars\n\t * @param {number} _x percentage margin offset from end of bar\n\t * @return {number | module} Currnet offset or Chart module to chain calls\n\t */\n\t exports.percentageLabelMargin = function (_x) {\n\t if (!arguments.length) {\n\t return percentageLabelMargin;\n\t }\n\t percentageLabelMargin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets whether the color list should be reversed or not\n\t * @param {boolean} _x Should reverse the color list\n\t * @return { boolean | module} Is color list being reversed\n\t * @public\n\t */\n\t exports.shouldReverseColorList = function (_x) {\n\t if (!arguments.length) {\n\t return shouldReverseColorList;\n\t }\n\t shouldReverseColorList = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the hasPercentage status\n\t * @param {boolean} _x Should use percentage as value format\n\t * @return { boolean | module} Is percentage used or Chart module to chain calls\n\t * @public\n\t */\n\t exports.hasPercentage = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabelFormat === PERCENTAGE_FORMAT;\n\t }\n\t if (_x) {\n\t valueLabelFormat = PERCENTAGE_FORMAT;\n\t } else {\n\t valueLabelFormat = NUMBER_FORMAT;\n\t }\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabelFormat to a percentage format if true (default false)\n\t * @param {boolean} _x Should use percentage as value format\n\t * @return { boolean | module} Is percentage the value format used or Chart module to chain calls\n\t * @public\n\t */\n\t exports.usePercentage = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabelFormat === PERCENTAGE_FORMAT;\n\t }\n\t if (_x) {\n\t valueLabelFormat = PERCENTAGE_FORMAT;\n\t } else {\n\t valueLabelFormat = NUMBER_FORMAT;\n\t }\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {number} _x Desired width for the graph\n\t * @return { width | module} Current width or Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the x axis on the chart\n\t * (Default is 5)\n\t * @param {Number} _x Desired horizontal ticks\n\t * @return {Number | module} Current xTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Space between y axis and chart\n\t * (Default 10)\n\t * @param {Number} _x Space between y axis and chart\n\t * @return {Number| module} Current value of yAxisPaddingBetweenChart or Chart module to chain calls\n\t */\n\t exports.yAxisPaddingBetweenChart = function (_x) {\n\t if (!arguments.length) {\n\t return yAxisPaddingBetweenChart;\n\t }\n\t yAxisPaddingBetweenChart = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of vertical ticks on the chart\n\t * (Default is 6)\n\t * @param {Number} _x Desired number of vertical ticks for the graph\n\t * @return {Number | module} Current yTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-array/ Version 1.2.0. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar ascending = function(a, b) {\n\t return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n\t};\n\t\n\tvar bisector = function(compare) {\n\t if (compare.length === 1) compare = ascendingComparator(compare);\n\t return {\n\t left: function(a, x, lo, hi) {\n\t if (lo == null) lo = 0;\n\t if (hi == null) hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (compare(a[mid], x) < 0) lo = mid + 1;\n\t else hi = mid;\n\t }\n\t return lo;\n\t },\n\t right: function(a, x, lo, hi) {\n\t if (lo == null) lo = 0;\n\t if (hi == null) hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (compare(a[mid], x) > 0) hi = mid;\n\t else lo = mid + 1;\n\t }\n\t return lo;\n\t }\n\t };\n\t};\n\t\n\tfunction ascendingComparator(f) {\n\t return function(d, x) {\n\t return ascending(f(d), x);\n\t };\n\t}\n\t\n\tvar ascendingBisect = bisector(ascending);\n\tvar bisectRight = ascendingBisect.right;\n\tvar bisectLeft = ascendingBisect.left;\n\t\n\tvar pairs = function(array, f) {\n\t if (f == null) f = pair;\n\t var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n\t while (i < n) pairs[i] = f(p, p = array[++i]);\n\t return pairs;\n\t};\n\t\n\tfunction pair(a, b) {\n\t return [a, b];\n\t}\n\t\n\tvar cross = function(values0, values1, reduce) {\n\t var n0 = values0.length,\n\t n1 = values1.length,\n\t values = new Array(n0 * n1),\n\t i0,\n\t i1,\n\t i,\n\t value0;\n\t\n\t if (reduce == null) reduce = pair;\n\t\n\t for (i0 = i = 0; i0 < n0; ++i0) {\n\t for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n\t values[i] = reduce(value0, values1[i1]);\n\t }\n\t }\n\t\n\t return values;\n\t};\n\t\n\tvar descending = function(a, b) {\n\t return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n\t};\n\t\n\tvar number = function(x) {\n\t return x === null ? NaN : +x;\n\t};\n\t\n\tvar variance = function(values, valueof) {\n\t var n = values.length,\n\t m = 0,\n\t i = -1,\n\t mean = 0,\n\t value,\n\t delta,\n\t sum = 0;\n\t\n\t if (valueof == null) {\n\t while (++i < n) {\n\t if (!isNaN(value = number(values[i]))) {\n\t delta = value - mean;\n\t mean += delta / ++m;\n\t sum += delta * (value - mean);\n\t }\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) {\n\t if (!isNaN(value = number(valueof(values[i], i, values)))) {\n\t delta = value - mean;\n\t mean += delta / ++m;\n\t sum += delta * (value - mean);\n\t }\n\t }\n\t }\n\t\n\t if (m > 1) return sum / (m - 1);\n\t};\n\t\n\tvar deviation = function(array, f) {\n\t var v = variance(array, f);\n\t return v ? Math.sqrt(v) : v;\n\t};\n\t\n\tvar extent = function(values, valueof) {\n\t var n = values.length,\n\t i = -1,\n\t value,\n\t min,\n\t max;\n\t\n\t if (valueof == null) {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = values[i]) != null && value >= value) {\n\t min = max = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = values[i]) != null) {\n\t if (min > value) min = value;\n\t if (max < value) max = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = valueof(values[i], i, values)) != null && value >= value) {\n\t min = max = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = valueof(values[i], i, values)) != null) {\n\t if (min > value) min = value;\n\t if (max < value) max = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t return [min, max];\n\t};\n\t\n\tvar array = Array.prototype;\n\t\n\tvar slice = array.slice;\n\tvar map = array.map;\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tvar identity = function(x) {\n\t return x;\n\t};\n\t\n\tvar range = function(start, stop, step) {\n\t start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\t\n\t var i = -1,\n\t n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n\t range = new Array(n);\n\t\n\t while (++i < n) {\n\t range[i] = start + i * step;\n\t }\n\t\n\t return range;\n\t};\n\t\n\tvar e10 = Math.sqrt(50);\n\tvar e5 = Math.sqrt(10);\n\tvar e2 = Math.sqrt(2);\n\t\n\tvar ticks = function(start, stop, count) {\n\t var reverse = stop < start,\n\t i = -1,\n\t n,\n\t ticks,\n\t step;\n\t\n\t if (reverse) n = start, start = stop, stop = n;\n\t\n\t if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\t\n\t if (step > 0) {\n\t start = Math.ceil(start / step);\n\t stop = Math.floor(stop / step);\n\t ticks = new Array(n = Math.ceil(stop - start + 1));\n\t while (++i < n) ticks[i] = (start + i) * step;\n\t } else {\n\t start = Math.floor(start * step);\n\t stop = Math.ceil(stop * step);\n\t ticks = new Array(n = Math.ceil(start - stop + 1));\n\t while (++i < n) ticks[i] = (start - i) / step;\n\t }\n\t\n\t if (reverse) ticks.reverse();\n\t\n\t return ticks;\n\t};\n\t\n\tfunction tickIncrement(start, stop, count) {\n\t var step = (stop - start) / Math.max(0, count),\n\t power = Math.floor(Math.log(step) / Math.LN10),\n\t error = step / Math.pow(10, power);\n\t return power >= 0\n\t ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n\t : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n\t}\n\t\n\tfunction tickStep(start, stop, count) {\n\t var step0 = Math.abs(stop - start) / Math.max(0, count),\n\t step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n\t error = step0 / step1;\n\t if (error >= e10) step1 *= 10;\n\t else if (error >= e5) step1 *= 5;\n\t else if (error >= e2) step1 *= 2;\n\t return stop < start ? -step1 : step1;\n\t}\n\t\n\tvar sturges = function(values) {\n\t return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n\t};\n\t\n\tvar histogram = function() {\n\t var value = identity,\n\t domain = extent,\n\t threshold = sturges;\n\t\n\t function histogram(data) {\n\t var i,\n\t n = data.length,\n\t x,\n\t values = new Array(n);\n\t\n\t for (i = 0; i < n; ++i) {\n\t values[i] = value(data[i], i, data);\n\t }\n\t\n\t var xz = domain(values),\n\t x0 = xz[0],\n\t x1 = xz[1],\n\t tz = threshold(values, x0, x1);\n\t\n\t // Convert number of thresholds into uniform thresholds.\n\t if (!Array.isArray(tz)) {\n\t tz = tickStep(x0, x1, tz);\n\t tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive\n\t }\n\t\n\t // Remove any thresholds outside the domain.\n\t var m = tz.length;\n\t while (tz[0] <= x0) tz.shift(), --m;\n\t while (tz[m - 1] > x1) tz.pop(), --m;\n\t\n\t var bins = new Array(m + 1),\n\t bin;\n\t\n\t // Initialize bins.\n\t for (i = 0; i <= m; ++i) {\n\t bin = bins[i] = [];\n\t bin.x0 = i > 0 ? tz[i - 1] : x0;\n\t bin.x1 = i < m ? tz[i] : x1;\n\t }\n\t\n\t // Assign data to bins by value, ignoring any outside the domain.\n\t for (i = 0; i < n; ++i) {\n\t x = values[i];\n\t if (x0 <= x && x <= x1) {\n\t bins[bisectRight(tz, x, 0, m)].push(data[i]);\n\t }\n\t }\n\t\n\t return bins;\n\t }\n\t\n\t histogram.value = function(_) {\n\t return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n\t };\n\t\n\t histogram.domain = function(_) {\n\t return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n\t };\n\t\n\t histogram.thresholds = function(_) {\n\t return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n\t };\n\t\n\t return histogram;\n\t};\n\t\n\tvar quantile = function(values, p, valueof) {\n\t if (valueof == null) valueof = number;\n\t if (!(n = values.length)) return;\n\t if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n\t if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n\t var n,\n\t i = (n - 1) * p,\n\t i0 = Math.floor(i),\n\t value0 = +valueof(values[i0], i0, values),\n\t value1 = +valueof(values[i0 + 1], i0 + 1, values);\n\t return value0 + (value1 - value0) * (i - i0);\n\t};\n\t\n\tvar freedmanDiaconis = function(values, min, max) {\n\t values = map.call(values, number).sort(ascending);\n\t return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n\t};\n\t\n\tvar scott = function(values, min, max) {\n\t return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n\t};\n\t\n\tvar max = function(values, valueof) {\n\t var n = values.length,\n\t i = -1,\n\t value,\n\t max;\n\t\n\t if (valueof == null) {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = values[i]) != null && value >= value) {\n\t max = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = values[i]) != null && value > max) {\n\t max = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = valueof(values[i], i, values)) != null && value >= value) {\n\t max = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = valueof(values[i], i, values)) != null && value > max) {\n\t max = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t return max;\n\t};\n\t\n\tvar mean = function(values, valueof) {\n\t var n = values.length,\n\t m = n,\n\t i = -1,\n\t value,\n\t sum = 0;\n\t\n\t if (valueof == null) {\n\t while (++i < n) {\n\t if (!isNaN(value = number(values[i]))) sum += value;\n\t else --m;\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) {\n\t if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;\n\t else --m;\n\t }\n\t }\n\t\n\t if (m) return sum / m;\n\t};\n\t\n\tvar median = function(values, valueof) {\n\t var n = values.length,\n\t i = -1,\n\t value,\n\t numbers = [];\n\t\n\t if (valueof == null) {\n\t while (++i < n) {\n\t if (!isNaN(value = number(values[i]))) {\n\t numbers.push(value);\n\t }\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) {\n\t if (!isNaN(value = number(valueof(values[i], i, values)))) {\n\t numbers.push(value);\n\t }\n\t }\n\t }\n\t\n\t return quantile(numbers.sort(ascending), 0.5);\n\t};\n\t\n\tvar merge = function(arrays) {\n\t var n = arrays.length,\n\t m,\n\t i = -1,\n\t j = 0,\n\t merged,\n\t array;\n\t\n\t while (++i < n) j += arrays[i].length;\n\t merged = new Array(j);\n\t\n\t while (--n >= 0) {\n\t array = arrays[n];\n\t m = array.length;\n\t while (--m >= 0) {\n\t merged[--j] = array[m];\n\t }\n\t }\n\t\n\t return merged;\n\t};\n\t\n\tvar min = function(values, valueof) {\n\t var n = values.length,\n\t i = -1,\n\t value,\n\t min;\n\t\n\t if (valueof == null) {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = values[i]) != null && value >= value) {\n\t min = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = values[i]) != null && min > value) {\n\t min = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) { // Find the first comparable value.\n\t if ((value = valueof(values[i], i, values)) != null && value >= value) {\n\t min = value;\n\t while (++i < n) { // Compare the remaining values.\n\t if ((value = valueof(values[i], i, values)) != null && min > value) {\n\t min = value;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t return min;\n\t};\n\t\n\tvar permute = function(array, indexes) {\n\t var i = indexes.length, permutes = new Array(i);\n\t while (i--) permutes[i] = array[indexes[i]];\n\t return permutes;\n\t};\n\t\n\tvar scan = function(values, compare) {\n\t if (!(n = values.length)) return;\n\t var n,\n\t i = 0,\n\t j = 0,\n\t xi,\n\t xj = values[j];\n\t\n\t if (compare == null) compare = ascending;\n\t\n\t while (++i < n) {\n\t if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\n\t xj = xi, j = i;\n\t }\n\t }\n\t\n\t if (compare(xj, xj) === 0) return j;\n\t};\n\t\n\tvar shuffle = function(array, i0, i1) {\n\t var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n\t t,\n\t i;\n\t\n\t while (m) {\n\t i = Math.random() * m-- | 0;\n\t t = array[m + i0];\n\t array[m + i0] = array[i + i0];\n\t array[i + i0] = t;\n\t }\n\t\n\t return array;\n\t};\n\t\n\tvar sum = function(values, valueof) {\n\t var n = values.length,\n\t i = -1,\n\t value,\n\t sum = 0;\n\t\n\t if (valueof == null) {\n\t while (++i < n) {\n\t if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n\t }\n\t }\n\t\n\t else {\n\t while (++i < n) {\n\t if (value = +valueof(values[i], i, values)) sum += value;\n\t }\n\t }\n\t\n\t return sum;\n\t};\n\t\n\tvar transpose = function(matrix) {\n\t if (!(n = matrix.length)) return [];\n\t for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n\t for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n\t row[j] = matrix[j][i];\n\t }\n\t }\n\t return transpose;\n\t};\n\t\n\tfunction length(d) {\n\t return d.length;\n\t}\n\t\n\tvar zip = function() {\n\t return transpose(arguments);\n\t};\n\t\n\texports.bisect = bisectRight;\n\texports.bisectRight = bisectRight;\n\texports.bisectLeft = bisectLeft;\n\texports.ascending = ascending;\n\texports.bisector = bisector;\n\texports.cross = cross;\n\texports.descending = descending;\n\texports.deviation = deviation;\n\texports.extent = extent;\n\texports.histogram = histogram;\n\texports.thresholdFreedmanDiaconis = freedmanDiaconis;\n\texports.thresholdScott = scott;\n\texports.thresholdSturges = sturges;\n\texports.max = max;\n\texports.mean = mean;\n\texports.median = median;\n\texports.merge = merge;\n\texports.min = min;\n\texports.pairs = pairs;\n\texports.permute = permute;\n\texports.quantile = quantile;\n\texports.range = range;\n\texports.scan = scan;\n\texports.shuffle = shuffle;\n\texports.sum = sum;\n\texports.ticks = ticks;\n\texports.tickIncrement = tickIncrement;\n\texports.tickStep = tickStep;\n\texports.transpose = transpose;\n\texports.variance = variance;\n\texports.zip = zip;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-ease/ Version 1.0.3. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tfunction linear(t) {\n\t return +t;\n\t}\n\t\n\tfunction quadIn(t) {\n\t return t * t;\n\t}\n\t\n\tfunction quadOut(t) {\n\t return t * (2 - t);\n\t}\n\t\n\tfunction quadInOut(t) {\n\t return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n\t}\n\t\n\tfunction cubicIn(t) {\n\t return t * t * t;\n\t}\n\t\n\tfunction cubicOut(t) {\n\t return --t * t * t + 1;\n\t}\n\t\n\tfunction cubicInOut(t) {\n\t return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n\t}\n\t\n\tvar exponent = 3;\n\t\n\tvar polyIn = (function custom(e) {\n\t e = +e;\n\t\n\t function polyIn(t) {\n\t return Math.pow(t, e);\n\t }\n\t\n\t polyIn.exponent = custom;\n\t\n\t return polyIn;\n\t})(exponent);\n\t\n\tvar polyOut = (function custom(e) {\n\t e = +e;\n\t\n\t function polyOut(t) {\n\t return 1 - Math.pow(1 - t, e);\n\t }\n\t\n\t polyOut.exponent = custom;\n\t\n\t return polyOut;\n\t})(exponent);\n\t\n\tvar polyInOut = (function custom(e) {\n\t e = +e;\n\t\n\t function polyInOut(t) {\n\t return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n\t }\n\t\n\t polyInOut.exponent = custom;\n\t\n\t return polyInOut;\n\t})(exponent);\n\t\n\tvar pi = Math.PI;\n\tvar halfPi = pi / 2;\n\t\n\tfunction sinIn(t) {\n\t return 1 - Math.cos(t * halfPi);\n\t}\n\t\n\tfunction sinOut(t) {\n\t return Math.sin(t * halfPi);\n\t}\n\t\n\tfunction sinInOut(t) {\n\t return (1 - Math.cos(pi * t)) / 2;\n\t}\n\t\n\tfunction expIn(t) {\n\t return Math.pow(2, 10 * t - 10);\n\t}\n\t\n\tfunction expOut(t) {\n\t return 1 - Math.pow(2, -10 * t);\n\t}\n\t\n\tfunction expInOut(t) {\n\t return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n\t}\n\t\n\tfunction circleIn(t) {\n\t return 1 - Math.sqrt(1 - t * t);\n\t}\n\t\n\tfunction circleOut(t) {\n\t return Math.sqrt(1 - --t * t);\n\t}\n\t\n\tfunction circleInOut(t) {\n\t return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n\t}\n\t\n\tvar b1 = 4 / 11;\n\tvar b2 = 6 / 11;\n\tvar b3 = 8 / 11;\n\tvar b4 = 3 / 4;\n\tvar b5 = 9 / 11;\n\tvar b6 = 10 / 11;\n\tvar b7 = 15 / 16;\n\tvar b8 = 21 / 22;\n\tvar b9 = 63 / 64;\n\tvar b0 = 1 / b1 / b1;\n\t\n\tfunction bounceIn(t) {\n\t return 1 - bounceOut(1 - t);\n\t}\n\t\n\tfunction bounceOut(t) {\n\t return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n\t}\n\t\n\tfunction bounceInOut(t) {\n\t return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n\t}\n\t\n\tvar overshoot = 1.70158;\n\t\n\tvar backIn = (function custom(s) {\n\t s = +s;\n\t\n\t function backIn(t) {\n\t return t * t * ((s + 1) * t - s);\n\t }\n\t\n\t backIn.overshoot = custom;\n\t\n\t return backIn;\n\t})(overshoot);\n\t\n\tvar backOut = (function custom(s) {\n\t s = +s;\n\t\n\t function backOut(t) {\n\t return --t * t * ((s + 1) * t + s) + 1;\n\t }\n\t\n\t backOut.overshoot = custom;\n\t\n\t return backOut;\n\t})(overshoot);\n\t\n\tvar backInOut = (function custom(s) {\n\t s = +s;\n\t\n\t function backInOut(t) {\n\t return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n\t }\n\t\n\t backInOut.overshoot = custom;\n\t\n\t return backInOut;\n\t})(overshoot);\n\t\n\tvar tau = 2 * Math.PI;\n\tvar amplitude = 1;\n\tvar period = 0.3;\n\t\n\tvar elasticIn = (function custom(a, p) {\n\t var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\t\n\t function elasticIn(t) {\n\t return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n\t }\n\t\n\t elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n\t elasticIn.period = function(p) { return custom(a, p); };\n\t\n\t return elasticIn;\n\t})(amplitude, period);\n\t\n\tvar elasticOut = (function custom(a, p) {\n\t var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\t\n\t function elasticOut(t) {\n\t return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n\t }\n\t\n\t elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n\t elasticOut.period = function(p) { return custom(a, p); };\n\t\n\t return elasticOut;\n\t})(amplitude, period);\n\t\n\tvar elasticInOut = (function custom(a, p) {\n\t var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\t\n\t function elasticInOut(t) {\n\t return ((t = t * 2 - 1) < 0\n\t ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n\t : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n\t }\n\t\n\t elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n\t elasticInOut.period = function(p) { return custom(a, p); };\n\t\n\t return elasticInOut;\n\t})(amplitude, period);\n\t\n\texports.easeLinear = linear;\n\texports.easeQuad = quadInOut;\n\texports.easeQuadIn = quadIn;\n\texports.easeQuadOut = quadOut;\n\texports.easeQuadInOut = quadInOut;\n\texports.easeCubic = cubicInOut;\n\texports.easeCubicIn = cubicIn;\n\texports.easeCubicOut = cubicOut;\n\texports.easeCubicInOut = cubicInOut;\n\texports.easePoly = polyInOut;\n\texports.easePolyIn = polyIn;\n\texports.easePolyOut = polyOut;\n\texports.easePolyInOut = polyInOut;\n\texports.easeSin = sinInOut;\n\texports.easeSinIn = sinIn;\n\texports.easeSinOut = sinOut;\n\texports.easeSinInOut = sinInOut;\n\texports.easeExp = expInOut;\n\texports.easeExpIn = expIn;\n\texports.easeExpOut = expOut;\n\texports.easeExpInOut = expInOut;\n\texports.easeCircle = circleInOut;\n\texports.easeCircleIn = circleIn;\n\texports.easeCircleOut = circleOut;\n\texports.easeCircleInOut = circleInOut;\n\texports.easeBounce = bounceOut;\n\texports.easeBounceIn = bounceIn;\n\texports.easeBounceOut = bounceOut;\n\texports.easeBounceInOut = bounceInOut;\n\texports.easeBack = backInOut;\n\texports.easeBackIn = backIn;\n\texports.easeBackOut = backOut;\n\texports.easeBackInOut = backInOut;\n\texports.easeElastic = elasticOut;\n\texports.easeElasticIn = elasticIn;\n\texports.easeElasticOut = elasticOut;\n\texports.easeElasticInOut = elasticInOut;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-axis/ Version 1.0.8. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar slice = Array.prototype.slice;\n\t\n\tvar identity = function(x) {\n\t return x;\n\t};\n\t\n\tvar top = 1;\n\tvar right = 2;\n\tvar bottom = 3;\n\tvar left = 4;\n\tvar epsilon = 1e-6;\n\t\n\tfunction translateX(x) {\n\t return \"translate(\" + (x + 0.5) + \",0)\";\n\t}\n\t\n\tfunction translateY(y) {\n\t return \"translate(0,\" + (y + 0.5) + \")\";\n\t}\n\t\n\tfunction number(scale) {\n\t return function(d) {\n\t return +scale(d);\n\t };\n\t}\n\t\n\tfunction center(scale) {\n\t var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n\t if (scale.round()) offset = Math.round(offset);\n\t return function(d) {\n\t return +scale(d) + offset;\n\t };\n\t}\n\t\n\tfunction entering() {\n\t return !this.__axis;\n\t}\n\t\n\tfunction axis(orient, scale) {\n\t var tickArguments = [],\n\t tickValues = null,\n\t tickFormat = null,\n\t tickSizeInner = 6,\n\t tickSizeOuter = 6,\n\t tickPadding = 3,\n\t k = orient === top || orient === left ? -1 : 1,\n\t x = orient === left || orient === right ? \"x\" : \"y\",\n\t transform = orient === top || orient === bottom ? translateX : translateY;\n\t\n\t function axis(context) {\n\t var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n\t format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n\t spacing = Math.max(tickSizeInner, 0) + tickPadding,\n\t range = scale.range(),\n\t range0 = +range[0] + 0.5,\n\t range1 = +range[range.length - 1] + 0.5,\n\t position = (scale.bandwidth ? center : number)(scale.copy()),\n\t selection = context.selection ? context.selection() : context,\n\t path = selection.selectAll(\".domain\").data([null]),\n\t tick = selection.selectAll(\".tick\").data(values, scale).order(),\n\t tickExit = tick.exit(),\n\t tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n\t line = tick.select(\"line\"),\n\t text = tick.select(\"text\");\n\t\n\t path = path.merge(path.enter().insert(\"path\", \".tick\")\n\t .attr(\"class\", \"domain\")\n\t .attr(\"stroke\", \"#000\"));\n\t\n\t tick = tick.merge(tickEnter);\n\t\n\t line = line.merge(tickEnter.append(\"line\")\n\t .attr(\"stroke\", \"#000\")\n\t .attr(x + \"2\", k * tickSizeInner));\n\t\n\t text = text.merge(tickEnter.append(\"text\")\n\t .attr(\"fill\", \"#000\")\n\t .attr(x, k * spacing)\n\t .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\t\n\t if (context !== selection) {\n\t path = path.transition(context);\n\t tick = tick.transition(context);\n\t line = line.transition(context);\n\t text = text.transition(context);\n\t\n\t tickExit = tickExit.transition(context)\n\t .attr(\"opacity\", epsilon)\n\t .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\t\n\t tickEnter\n\t .attr(\"opacity\", epsilon)\n\t .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n\t }\n\t\n\t tickExit.remove();\n\t\n\t path\n\t .attr(\"d\", orient === left || orient == right\n\t ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter\n\t : \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter);\n\t\n\t tick\n\t .attr(\"opacity\", 1)\n\t .attr(\"transform\", function(d) { return transform(position(d)); });\n\t\n\t line\n\t .attr(x + \"2\", k * tickSizeInner);\n\t\n\t text\n\t .attr(x, k * spacing)\n\t .text(format);\n\t\n\t selection.filter(entering)\n\t .attr(\"fill\", \"none\")\n\t .attr(\"font-size\", 10)\n\t .attr(\"font-family\", \"sans-serif\")\n\t .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\t\n\t selection\n\t .each(function() { this.__axis = position; });\n\t }\n\t\n\t axis.scale = function(_) {\n\t return arguments.length ? (scale = _, axis) : scale;\n\t };\n\t\n\t axis.ticks = function() {\n\t return tickArguments = slice.call(arguments), axis;\n\t };\n\t\n\t axis.tickArguments = function(_) {\n\t return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n\t };\n\t\n\t axis.tickValues = function(_) {\n\t return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n\t };\n\t\n\t axis.tickFormat = function(_) {\n\t return arguments.length ? (tickFormat = _, axis) : tickFormat;\n\t };\n\t\n\t axis.tickSize = function(_) {\n\t return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n\t };\n\t\n\t axis.tickSizeInner = function(_) {\n\t return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n\t };\n\t\n\t axis.tickSizeOuter = function(_) {\n\t return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n\t };\n\t\n\t axis.tickPadding = function(_) {\n\t return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n\t };\n\t\n\t return axis;\n\t}\n\t\n\tfunction axisTop(scale) {\n\t return axis(top, scale);\n\t}\n\t\n\tfunction axisRight(scale) {\n\t return axis(right, scale);\n\t}\n\t\n\tfunction axisBottom(scale) {\n\t return axis(bottom, scale);\n\t}\n\t\n\tfunction axisLeft(scale) {\n\t return axis(left, scale);\n\t}\n\t\n\texports.axisTop = axisTop;\n\texports.axisRight = axisRight;\n\texports.axisBottom = axisBottom;\n\texports.axisLeft = axisLeft;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-color/ Version 1.0.3. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar define = function(constructor, factory, prototype) {\n\t constructor.prototype = factory.prototype = prototype;\n\t prototype.constructor = constructor;\n\t};\n\t\n\tfunction extend(parent, definition) {\n\t var prototype = Object.create(parent.prototype);\n\t for (var key in definition) prototype[key] = definition[key];\n\t return prototype;\n\t}\n\t\n\tfunction Color() {}\n\t\n\tvar darker = 0.7;\n\tvar brighter = 1 / darker;\n\t\n\tvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\";\n\tvar reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\";\n\tvar reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\";\n\tvar reHex3 = /^#([0-9a-f]{3})$/;\n\tvar reHex6 = /^#([0-9a-f]{6})$/;\n\tvar reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\");\n\tvar reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\");\n\tvar reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\");\n\tvar reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\");\n\tvar reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\");\n\tvar reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\t\n\tvar named = {\n\t aliceblue: 0xf0f8ff,\n\t antiquewhite: 0xfaebd7,\n\t aqua: 0x00ffff,\n\t aquamarine: 0x7fffd4,\n\t azure: 0xf0ffff,\n\t beige: 0xf5f5dc,\n\t bisque: 0xffe4c4,\n\t black: 0x000000,\n\t blanchedalmond: 0xffebcd,\n\t blue: 0x0000ff,\n\t blueviolet: 0x8a2be2,\n\t brown: 0xa52a2a,\n\t burlywood: 0xdeb887,\n\t cadetblue: 0x5f9ea0,\n\t chartreuse: 0x7fff00,\n\t chocolate: 0xd2691e,\n\t coral: 0xff7f50,\n\t cornflowerblue: 0x6495ed,\n\t cornsilk: 0xfff8dc,\n\t crimson: 0xdc143c,\n\t cyan: 0x00ffff,\n\t darkblue: 0x00008b,\n\t darkcyan: 0x008b8b,\n\t darkgoldenrod: 0xb8860b,\n\t darkgray: 0xa9a9a9,\n\t darkgreen: 0x006400,\n\t darkgrey: 0xa9a9a9,\n\t darkkhaki: 0xbdb76b,\n\t darkmagenta: 0x8b008b,\n\t darkolivegreen: 0x556b2f,\n\t darkorange: 0xff8c00,\n\t darkorchid: 0x9932cc,\n\t darkred: 0x8b0000,\n\t darksalmon: 0xe9967a,\n\t darkseagreen: 0x8fbc8f,\n\t darkslateblue: 0x483d8b,\n\t darkslategray: 0x2f4f4f,\n\t darkslategrey: 0x2f4f4f,\n\t darkturquoise: 0x00ced1,\n\t darkviolet: 0x9400d3,\n\t deeppink: 0xff1493,\n\t deepskyblue: 0x00bfff,\n\t dimgray: 0x696969,\n\t dimgrey: 0x696969,\n\t dodgerblue: 0x1e90ff,\n\t firebrick: 0xb22222,\n\t floralwhite: 0xfffaf0,\n\t forestgreen: 0x228b22,\n\t fuchsia: 0xff00ff,\n\t gainsboro: 0xdcdcdc,\n\t ghostwhite: 0xf8f8ff,\n\t gold: 0xffd700,\n\t goldenrod: 0xdaa520,\n\t gray: 0x808080,\n\t green: 0x008000,\n\t greenyellow: 0xadff2f,\n\t grey: 0x808080,\n\t honeydew: 0xf0fff0,\n\t hotpink: 0xff69b4,\n\t indianred: 0xcd5c5c,\n\t indigo: 0x4b0082,\n\t ivory: 0xfffff0,\n\t khaki: 0xf0e68c,\n\t lavender: 0xe6e6fa,\n\t lavenderblush: 0xfff0f5,\n\t lawngreen: 0x7cfc00,\n\t lemonchiffon: 0xfffacd,\n\t lightblue: 0xadd8e6,\n\t lightcoral: 0xf08080,\n\t lightcyan: 0xe0ffff,\n\t lightgoldenrodyellow: 0xfafad2,\n\t lightgray: 0xd3d3d3,\n\t lightgreen: 0x90ee90,\n\t lightgrey: 0xd3d3d3,\n\t lightpink: 0xffb6c1,\n\t lightsalmon: 0xffa07a,\n\t lightseagreen: 0x20b2aa,\n\t lightskyblue: 0x87cefa,\n\t lightslategray: 0x778899,\n\t lightslategrey: 0x778899,\n\t lightsteelblue: 0xb0c4de,\n\t lightyellow: 0xffffe0,\n\t lime: 0x00ff00,\n\t limegreen: 0x32cd32,\n\t linen: 0xfaf0e6,\n\t magenta: 0xff00ff,\n\t maroon: 0x800000,\n\t mediumaquamarine: 0x66cdaa,\n\t mediumblue: 0x0000cd,\n\t mediumorchid: 0xba55d3,\n\t mediumpurple: 0x9370db,\n\t mediumseagreen: 0x3cb371,\n\t mediumslateblue: 0x7b68ee,\n\t mediumspringgreen: 0x00fa9a,\n\t mediumturquoise: 0x48d1cc,\n\t mediumvioletred: 0xc71585,\n\t midnightblue: 0x191970,\n\t mintcream: 0xf5fffa,\n\t mistyrose: 0xffe4e1,\n\t moccasin: 0xffe4b5,\n\t navajowhite: 0xffdead,\n\t navy: 0x000080,\n\t oldlace: 0xfdf5e6,\n\t olive: 0x808000,\n\t olivedrab: 0x6b8e23,\n\t orange: 0xffa500,\n\t orangered: 0xff4500,\n\t orchid: 0xda70d6,\n\t palegoldenrod: 0xeee8aa,\n\t palegreen: 0x98fb98,\n\t paleturquoise: 0xafeeee,\n\t palevioletred: 0xdb7093,\n\t papayawhip: 0xffefd5,\n\t peachpuff: 0xffdab9,\n\t peru: 0xcd853f,\n\t pink: 0xffc0cb,\n\t plum: 0xdda0dd,\n\t powderblue: 0xb0e0e6,\n\t purple: 0x800080,\n\t rebeccapurple: 0x663399,\n\t red: 0xff0000,\n\t rosybrown: 0xbc8f8f,\n\t royalblue: 0x4169e1,\n\t saddlebrown: 0x8b4513,\n\t salmon: 0xfa8072,\n\t sandybrown: 0xf4a460,\n\t seagreen: 0x2e8b57,\n\t seashell: 0xfff5ee,\n\t sienna: 0xa0522d,\n\t silver: 0xc0c0c0,\n\t skyblue: 0x87ceeb,\n\t slateblue: 0x6a5acd,\n\t slategray: 0x708090,\n\t slategrey: 0x708090,\n\t snow: 0xfffafa,\n\t springgreen: 0x00ff7f,\n\t steelblue: 0x4682b4,\n\t tan: 0xd2b48c,\n\t teal: 0x008080,\n\t thistle: 0xd8bfd8,\n\t tomato: 0xff6347,\n\t turquoise: 0x40e0d0,\n\t violet: 0xee82ee,\n\t wheat: 0xf5deb3,\n\t white: 0xffffff,\n\t whitesmoke: 0xf5f5f5,\n\t yellow: 0xffff00,\n\t yellowgreen: 0x9acd32\n\t};\n\t\n\tdefine(Color, color, {\n\t displayable: function() {\n\t return this.rgb().displayable();\n\t },\n\t toString: function() {\n\t return this.rgb() + \"\";\n\t }\n\t});\n\t\n\tfunction color(format) {\n\t var m;\n\t format = (format + \"\").trim().toLowerCase();\n\t return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n\t : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n\t : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n\t : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n\t : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n\t : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n\t : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n\t : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n\t : named.hasOwnProperty(format) ? rgbn(named[format])\n\t : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n\t : null;\n\t}\n\t\n\tfunction rgbn(n) {\n\t return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n\t}\n\t\n\tfunction rgba(r, g, b, a) {\n\t if (a <= 0) r = g = b = NaN;\n\t return new Rgb(r, g, b, a);\n\t}\n\t\n\tfunction rgbConvert(o) {\n\t if (!(o instanceof Color)) o = color(o);\n\t if (!o) return new Rgb;\n\t o = o.rgb();\n\t return new Rgb(o.r, o.g, o.b, o.opacity);\n\t}\n\t\n\tfunction rgb(r, g, b, opacity) {\n\t return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n\t}\n\t\n\tfunction Rgb(r, g, b, opacity) {\n\t this.r = +r;\n\t this.g = +g;\n\t this.b = +b;\n\t this.opacity = +opacity;\n\t}\n\t\n\tdefine(Rgb, rgb, extend(Color, {\n\t brighter: function(k) {\n\t k = k == null ? brighter : Math.pow(brighter, k);\n\t return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n\t },\n\t darker: function(k) {\n\t k = k == null ? darker : Math.pow(darker, k);\n\t return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n\t },\n\t rgb: function() {\n\t return this;\n\t },\n\t displayable: function() {\n\t return (0 <= this.r && this.r <= 255)\n\t && (0 <= this.g && this.g <= 255)\n\t && (0 <= this.b && this.b <= 255)\n\t && (0 <= this.opacity && this.opacity <= 1);\n\t },\n\t toString: function() {\n\t var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n\t return (a === 1 ? \"rgb(\" : \"rgba(\")\n\t + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n\t + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n\t + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n\t + (a === 1 ? \")\" : \", \" + a + \")\");\n\t }\n\t}));\n\t\n\tfunction hsla(h, s, l, a) {\n\t if (a <= 0) h = s = l = NaN;\n\t else if (l <= 0 || l >= 1) h = s = NaN;\n\t else if (s <= 0) h = NaN;\n\t return new Hsl(h, s, l, a);\n\t}\n\t\n\tfunction hslConvert(o) {\n\t if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n\t if (!(o instanceof Color)) o = color(o);\n\t if (!o) return new Hsl;\n\t if (o instanceof Hsl) return o;\n\t o = o.rgb();\n\t var r = o.r / 255,\n\t g = o.g / 255,\n\t b = o.b / 255,\n\t min = Math.min(r, g, b),\n\t max = Math.max(r, g, b),\n\t h = NaN,\n\t s = max - min,\n\t l = (max + min) / 2;\n\t if (s) {\n\t if (r === max) h = (g - b) / s + (g < b) * 6;\n\t else if (g === max) h = (b - r) / s + 2;\n\t else h = (r - g) / s + 4;\n\t s /= l < 0.5 ? max + min : 2 - max - min;\n\t h *= 60;\n\t } else {\n\t s = l > 0 && l < 1 ? 0 : h;\n\t }\n\t return new Hsl(h, s, l, o.opacity);\n\t}\n\t\n\tfunction hsl(h, s, l, opacity) {\n\t return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n\t}\n\t\n\tfunction Hsl(h, s, l, opacity) {\n\t this.h = +h;\n\t this.s = +s;\n\t this.l = +l;\n\t this.opacity = +opacity;\n\t}\n\t\n\tdefine(Hsl, hsl, extend(Color, {\n\t brighter: function(k) {\n\t k = k == null ? brighter : Math.pow(brighter, k);\n\t return new Hsl(this.h, this.s, this.l * k, this.opacity);\n\t },\n\t darker: function(k) {\n\t k = k == null ? darker : Math.pow(darker, k);\n\t return new Hsl(this.h, this.s, this.l * k, this.opacity);\n\t },\n\t rgb: function() {\n\t var h = this.h % 360 + (this.h < 0) * 360,\n\t s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n\t l = this.l,\n\t m2 = l + (l < 0.5 ? l : 1 - l) * s,\n\t m1 = 2 * l - m2;\n\t return new Rgb(\n\t hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n\t hsl2rgb(h, m1, m2),\n\t hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n\t this.opacity\n\t );\n\t },\n\t displayable: function() {\n\t return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n\t && (0 <= this.l && this.l <= 1)\n\t && (0 <= this.opacity && this.opacity <= 1);\n\t }\n\t}));\n\t\n\t/* From FvD 13.37, CSS Color Module Level 3 */\n\tfunction hsl2rgb(h, m1, m2) {\n\t return (h < 60 ? m1 + (m2 - m1) * h / 60\n\t : h < 180 ? m2\n\t : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n\t : m1) * 255;\n\t}\n\t\n\tvar deg2rad = Math.PI / 180;\n\tvar rad2deg = 180 / Math.PI;\n\t\n\tvar Kn = 18;\n\tvar Xn = 0.950470;\n\tvar Yn = 1;\n\tvar Zn = 1.088830;\n\tvar t0 = 4 / 29;\n\tvar t1 = 6 / 29;\n\tvar t2 = 3 * t1 * t1;\n\tvar t3 = t1 * t1 * t1;\n\t\n\tfunction labConvert(o) {\n\t if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n\t if (o instanceof Hcl) {\n\t var h = o.h * deg2rad;\n\t return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n\t }\n\t if (!(o instanceof Rgb)) o = rgbConvert(o);\n\t var b = rgb2xyz(o.r),\n\t a = rgb2xyz(o.g),\n\t l = rgb2xyz(o.b),\n\t x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n\t y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),\n\t z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);\n\t return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n\t}\n\t\n\tfunction lab(l, a, b, opacity) {\n\t return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n\t}\n\t\n\tfunction Lab(l, a, b, opacity) {\n\t this.l = +l;\n\t this.a = +a;\n\t this.b = +b;\n\t this.opacity = +opacity;\n\t}\n\t\n\tdefine(Lab, lab, extend(Color, {\n\t brighter: function(k) {\n\t return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);\n\t },\n\t darker: function(k) {\n\t return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);\n\t },\n\t rgb: function() {\n\t var y = (this.l + 16) / 116,\n\t x = isNaN(this.a) ? y : y + this.a / 500,\n\t z = isNaN(this.b) ? y : y - this.b / 200;\n\t y = Yn * lab2xyz(y);\n\t x = Xn * lab2xyz(x);\n\t z = Zn * lab2xyz(z);\n\t return new Rgb(\n\t xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB\n\t xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),\n\t xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),\n\t this.opacity\n\t );\n\t }\n\t}));\n\t\n\tfunction xyz2lab(t) {\n\t return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n\t}\n\t\n\tfunction lab2xyz(t) {\n\t return t > t1 ? t * t * t : t2 * (t - t0);\n\t}\n\t\n\tfunction xyz2rgb(x) {\n\t return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n\t}\n\t\n\tfunction rgb2xyz(x) {\n\t return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n\t}\n\t\n\tfunction hclConvert(o) {\n\t if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n\t if (!(o instanceof Lab)) o = labConvert(o);\n\t var h = Math.atan2(o.b, o.a) * rad2deg;\n\t return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n\t}\n\t\n\tfunction hcl(h, c, l, opacity) {\n\t return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n\t}\n\t\n\tfunction Hcl(h, c, l, opacity) {\n\t this.h = +h;\n\t this.c = +c;\n\t this.l = +l;\n\t this.opacity = +opacity;\n\t}\n\t\n\tdefine(Hcl, hcl, extend(Color, {\n\t brighter: function(k) {\n\t return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);\n\t },\n\t darker: function(k) {\n\t return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);\n\t },\n\t rgb: function() {\n\t return labConvert(this).rgb();\n\t }\n\t}));\n\t\n\tvar A = -0.14861;\n\tvar B = +1.78277;\n\tvar C = -0.29227;\n\tvar D = -0.90649;\n\tvar E = +1.97294;\n\tvar ED = E * D;\n\tvar EB = E * B;\n\tvar BC_DA = B * C - D * A;\n\t\n\tfunction cubehelixConvert(o) {\n\t if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n\t if (!(o instanceof Rgb)) o = rgbConvert(o);\n\t var r = o.r / 255,\n\t g = o.g / 255,\n\t b = o.b / 255,\n\t l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n\t bl = b - l,\n\t k = (E * (g - l) - C * bl) / D,\n\t s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n\t h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n\t return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n\t}\n\t\n\tfunction cubehelix(h, s, l, opacity) {\n\t return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n\t}\n\t\n\tfunction Cubehelix(h, s, l, opacity) {\n\t this.h = +h;\n\t this.s = +s;\n\t this.l = +l;\n\t this.opacity = +opacity;\n\t}\n\t\n\tdefine(Cubehelix, cubehelix, extend(Color, {\n\t brighter: function(k) {\n\t k = k == null ? brighter : Math.pow(brighter, k);\n\t return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n\t },\n\t darker: function(k) {\n\t k = k == null ? darker : Math.pow(darker, k);\n\t return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n\t },\n\t rgb: function() {\n\t var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n\t l = +this.l,\n\t a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n\t cosh = Math.cos(h),\n\t sinh = Math.sin(h);\n\t return new Rgb(\n\t 255 * (l + a * (A * cosh + B * sinh)),\n\t 255 * (l + a * (C * cosh + D * sinh)),\n\t 255 * (l + a * (E * cosh)),\n\t this.opacity\n\t );\n\t }\n\t}));\n\t\n\texports.color = color;\n\texports.rgb = rgb;\n\texports.hsl = hsl;\n\texports.lab = lab;\n\texports.hcl = hcl;\n\texports.cubehelix = cubehelix;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-dispatch/ Version 1.0.3. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar noop = {value: function() {}};\n\t\n\tfunction dispatch() {\n\t for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n\t if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n\t _[t] = [];\n\t }\n\t return new Dispatch(_);\n\t}\n\t\n\tfunction Dispatch(_) {\n\t this._ = _;\n\t}\n\t\n\tfunction parseTypenames(typenames, types) {\n\t return typenames.trim().split(/^|\\s+/).map(function(t) {\n\t var name = \"\", i = t.indexOf(\".\");\n\t if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n\t if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n\t return {type: t, name: name};\n\t });\n\t}\n\t\n\tDispatch.prototype = dispatch.prototype = {\n\t constructor: Dispatch,\n\t on: function(typename, callback) {\n\t var _ = this._,\n\t T = parseTypenames(typename + \"\", _),\n\t t,\n\t i = -1,\n\t n = T.length;\n\t\n\t // If no callback was specified, return the callback of the given type and name.\n\t if (arguments.length < 2) {\n\t while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n\t return;\n\t }\n\t\n\t // If a type was specified, set the callback for the given type and name.\n\t // Otherwise, if a null callback was specified, remove callbacks of the given name.\n\t if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n\t while (++i < n) {\n\t if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n\t else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n\t }\n\t\n\t return this;\n\t },\n\t copy: function() {\n\t var copy = {}, _ = this._;\n\t for (var t in _) copy[t] = _[t].slice();\n\t return new Dispatch(copy);\n\t },\n\t call: function(type, that) {\n\t if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n\t if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n\t for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n\t },\n\t apply: function(type, that, args) {\n\t if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n\t for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n\t }\n\t};\n\t\n\tfunction get(type, name) {\n\t for (var i = 0, n = type.length, c; i < n; ++i) {\n\t if ((c = type[i]).name === name) {\n\t return c.value;\n\t }\n\t }\n\t}\n\t\n\tfunction set(type, name, callback) {\n\t for (var i = 0, n = type.length; i < n; ++i) {\n\t if (type[i].name === name) {\n\t type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n\t break;\n\t }\n\t }\n\t if (callback != null) type.push({name: name, value: callback});\n\t return type;\n\t}\n\t\n\texports.dispatch = dispatch;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-format/ Version 1.2.0. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\t// Computes the decimal coefficient and exponent of the specified number x with\n\t// significant digits p, where x is positive and p is in [1, 21] or undefined.\n\t// For example, formatDecimal(1.23) returns [\"123\", 0].\n\tvar formatDecimal = function(x, p) {\n\t if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n\t var i, coefficient = x.slice(0, i);\n\t\n\t // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n\t // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n\t return [\n\t coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n\t +x.slice(i + 1)\n\t ];\n\t};\n\t\n\tvar exponent = function(x) {\n\t return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n\t};\n\t\n\tvar formatGroup = function(grouping, thousands) {\n\t return function(value, width) {\n\t var i = value.length,\n\t t = [],\n\t j = 0,\n\t g = grouping[0],\n\t length = 0;\n\t\n\t while (i > 0 && g > 0) {\n\t if (length + g + 1 > width) g = Math.max(1, width - length);\n\t t.push(value.substring(i -= g, i + g));\n\t if ((length += g + 1) > width) break;\n\t g = grouping[j = (j + 1) % grouping.length];\n\t }\n\t\n\t return t.reverse().join(thousands);\n\t };\n\t};\n\t\n\tvar formatNumerals = function(numerals) {\n\t return function(value) {\n\t return value.replace(/[0-9]/g, function(i) {\n\t return numerals[+i];\n\t });\n\t };\n\t};\n\t\n\tvar formatDefault = function(x, p) {\n\t x = x.toPrecision(p);\n\t\n\t out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {\n\t switch (x[i]) {\n\t case \".\": i0 = i1 = i; break;\n\t case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n\t case \"e\": break out;\n\t default: if (i0 > 0) i0 = 0; break;\n\t }\n\t }\n\t\n\t return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;\n\t};\n\t\n\tvar prefixExponent;\n\t\n\tvar formatPrefixAuto = function(x, p) {\n\t var d = formatDecimal(x, p);\n\t if (!d) return x + \"\";\n\t var coefficient = d[0],\n\t exponent = d[1],\n\t i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n\t n = coefficient.length;\n\t return i === n ? coefficient\n\t : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n\t : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n\t : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n\t};\n\t\n\tvar formatRounded = function(x, p) {\n\t var d = formatDecimal(x, p);\n\t if (!d) return x + \"\";\n\t var coefficient = d[0],\n\t exponent = d[1];\n\t return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n\t : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n\t : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n\t};\n\t\n\tvar formatTypes = {\n\t \"\": formatDefault,\n\t \"%\": function(x, p) { return (x * 100).toFixed(p); },\n\t \"b\": function(x) { return Math.round(x).toString(2); },\n\t \"c\": function(x) { return x + \"\"; },\n\t \"d\": function(x) { return Math.round(x).toString(10); },\n\t \"e\": function(x, p) { return x.toExponential(p); },\n\t \"f\": function(x, p) { return x.toFixed(p); },\n\t \"g\": function(x, p) { return x.toPrecision(p); },\n\t \"o\": function(x) { return Math.round(x).toString(8); },\n\t \"p\": function(x, p) { return formatRounded(x * 100, p); },\n\t \"r\": formatRounded,\n\t \"s\": formatPrefixAuto,\n\t \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n\t \"x\": function(x) { return Math.round(x).toString(16); }\n\t};\n\t\n\t// [[fill]align][sign][symbol][0][width][,][.precision][type]\n\tvar re = /^(?:(.)?([<>=^]))?([+\\-\\( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?([a-z%])?$/i;\n\t\n\tfunction formatSpecifier(specifier) {\n\t return new FormatSpecifier(specifier);\n\t}\n\t\n\tformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\t\n\tfunction FormatSpecifier(specifier) {\n\t if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n\t\n\t var match,\n\t fill = match[1] || \" \",\n\t align = match[2] || \">\",\n\t sign = match[3] || \"-\",\n\t symbol = match[4] || \"\",\n\t zero = !!match[5],\n\t width = match[6] && +match[6],\n\t comma = !!match[7],\n\t precision = match[8] && +match[8].slice(1),\n\t type = match[9] || \"\";\n\t\n\t // The \"n\" type is an alias for \",g\".\n\t if (type === \"n\") comma = true, type = \"g\";\n\t\n\t // Map invalid types to the default format.\n\t else if (!formatTypes[type]) type = \"\";\n\t\n\t // If zero fill is specified, padding goes after sign and before digits.\n\t if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\t\n\t this.fill = fill;\n\t this.align = align;\n\t this.sign = sign;\n\t this.symbol = symbol;\n\t this.zero = zero;\n\t this.width = width;\n\t this.comma = comma;\n\t this.precision = precision;\n\t this.type = type;\n\t}\n\t\n\tFormatSpecifier.prototype.toString = function() {\n\t return this.fill\n\t + this.align\n\t + this.sign\n\t + this.symbol\n\t + (this.zero ? \"0\" : \"\")\n\t + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n\t + (this.comma ? \",\" : \"\")\n\t + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n\t + this.type;\n\t};\n\t\n\tvar identity = function(x) {\n\t return x;\n\t};\n\t\n\tvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\t\n\tvar formatLocale = function(locale) {\n\t var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n\t currency = locale.currency,\n\t decimal = locale.decimal,\n\t numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n\t percent = locale.percent || \"%\";\n\t\n\t function newFormat(specifier) {\n\t specifier = formatSpecifier(specifier);\n\t\n\t var fill = specifier.fill,\n\t align = specifier.align,\n\t sign = specifier.sign,\n\t symbol = specifier.symbol,\n\t zero = specifier.zero,\n\t width = specifier.width,\n\t comma = specifier.comma,\n\t precision = specifier.precision,\n\t type = specifier.type;\n\t\n\t // Compute the prefix and suffix.\n\t // For SI-prefix, the suffix is lazily computed.\n\t var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n\t suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\t\n\t // What format function should we use?\n\t // Is this an integer type?\n\t // Can this type generate exponential notation?\n\t var formatType = formatTypes[type],\n\t maybeSuffix = !type || /[defgprs%]/.test(type);\n\t\n\t // Set the default precision if not specified,\n\t // or clamp the specified precision to the supported range.\n\t // For significant precision, it must be in [1, 21].\n\t // For fixed precision, it must be in [0, 20].\n\t precision = precision == null ? (type ? 6 : 12)\n\t : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n\t : Math.max(0, Math.min(20, precision));\n\t\n\t function format(value) {\n\t var valuePrefix = prefix,\n\t valueSuffix = suffix,\n\t i, n, c;\n\t\n\t if (type === \"c\") {\n\t valueSuffix = formatType(value) + valueSuffix;\n\t value = \"\";\n\t } else {\n\t value = +value;\n\t\n\t // Perform the initial formatting.\n\t var valueNegative = value < 0;\n\t value = formatType(Math.abs(value), precision);\n\t\n\t // If a negative value rounds to zero during formatting, treat as positive.\n\t if (valueNegative && +value === 0) valueNegative = false;\n\t\n\t // Compute the prefix and suffix.\n\t valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n\t valueSuffix = valueSuffix + (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\t\n\t // Break the formatted value into the integer “value” part that can be\n\t // grouped, and fractional or exponential “suffix” part that is not.\n\t if (maybeSuffix) {\n\t i = -1, n = value.length;\n\t while (++i < n) {\n\t if (c = value.charCodeAt(i), 48 > c || c > 57) {\n\t valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n\t value = value.slice(0, i);\n\t break;\n\t }\n\t }\n\t }\n\t }\n\t\n\t // If the fill character is not \"0\", grouping is applied before padding.\n\t if (comma && !zero) value = group(value, Infinity);\n\t\n\t // Compute the padding.\n\t var length = valuePrefix.length + value.length + valueSuffix.length,\n\t padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\t\n\t // If the fill character is \"0\", grouping is applied after padding.\n\t if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\t\n\t // Reconstruct the final output based on the desired alignment.\n\t switch (align) {\n\t case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n\t case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n\t case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n\t default: value = padding + valuePrefix + value + valueSuffix; break;\n\t }\n\t\n\t return numerals(value);\n\t }\n\t\n\t format.toString = function() {\n\t return specifier + \"\";\n\t };\n\t\n\t return format;\n\t }\n\t\n\t function formatPrefix(specifier, value) {\n\t var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n\t e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n\t k = Math.pow(10, -e),\n\t prefix = prefixes[8 + e / 3];\n\t return function(value) {\n\t return f(k * value) + prefix;\n\t };\n\t }\n\t\n\t return {\n\t format: newFormat,\n\t formatPrefix: formatPrefix\n\t };\n\t};\n\t\n\tvar locale;\n\t\n\t\n\t\n\tdefaultLocale({\n\t decimal: \".\",\n\t thousands: \",\",\n\t grouping: [3],\n\t currency: [\"$\", \"\"]\n\t});\n\t\n\tfunction defaultLocale(definition) {\n\t locale = formatLocale(definition);\n\t exports.format = locale.format;\n\t exports.formatPrefix = locale.formatPrefix;\n\t return locale;\n\t}\n\t\n\tvar precisionFixed = function(step) {\n\t return Math.max(0, -exponent(Math.abs(step)));\n\t};\n\t\n\tvar precisionPrefix = function(step, value) {\n\t return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n\t};\n\t\n\tvar precisionRound = function(step, max) {\n\t step = Math.abs(step), max = Math.abs(max) - step;\n\t return Math.max(0, exponent(max) - exponent(step)) + 1;\n\t};\n\t\n\texports.formatDefaultLocale = defaultLocale;\n\texports.formatLocale = formatLocale;\n\texports.formatSpecifier = formatSpecifier;\n\texports.precisionFixed = precisionFixed;\n\texports.precisionPrefix = precisionPrefix;\n\texports.precisionRound = precisionRound;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-scale/ Version 1.0.6. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(2), __webpack_require__(9), __webpack_require__(10), __webpack_require__(7), __webpack_require__(11), __webpack_require__(12), __webpack_require__(5)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-collection', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format', 'd3-color'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));\n\t}(this, (function (exports,d3Array,d3Collection,d3Interpolate,d3Format,d3Time,d3TimeFormat,d3Color) { 'use strict';\n\t\n\tvar array = Array.prototype;\n\t\n\tvar map$1 = array.map;\n\tvar slice = array.slice;\n\t\n\tvar implicit = {name: \"implicit\"};\n\t\n\tfunction ordinal(range$$1) {\n\t var index = d3Collection.map(),\n\t domain = [],\n\t unknown = implicit;\n\t\n\t range$$1 = range$$1 == null ? [] : slice.call(range$$1);\n\t\n\t function scale(d) {\n\t var key = d + \"\", i = index.get(key);\n\t if (!i) {\n\t if (unknown !== implicit) return unknown;\n\t index.set(key, i = domain.push(d));\n\t }\n\t return range$$1[(i - 1) % range$$1.length];\n\t }\n\t\n\t scale.domain = function(_) {\n\t if (!arguments.length) return domain.slice();\n\t domain = [], index = d3Collection.map();\n\t var i = -1, n = _.length, d, key;\n\t while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n\t return scale;\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (range$$1 = slice.call(_), scale) : range$$1.slice();\n\t };\n\t\n\t scale.unknown = function(_) {\n\t return arguments.length ? (unknown = _, scale) : unknown;\n\t };\n\t\n\t scale.copy = function() {\n\t return ordinal()\n\t .domain(domain)\n\t .range(range$$1)\n\t .unknown(unknown);\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tfunction band() {\n\t var scale = ordinal().unknown(undefined),\n\t domain = scale.domain,\n\t ordinalRange = scale.range,\n\t range$$1 = [0, 1],\n\t step,\n\t bandwidth,\n\t round = false,\n\t paddingInner = 0,\n\t paddingOuter = 0,\n\t align = 0.5;\n\t\n\t delete scale.unknown;\n\t\n\t function rescale() {\n\t var n = domain().length,\n\t reverse = range$$1[1] < range$$1[0],\n\t start = range$$1[reverse - 0],\n\t stop = range$$1[1 - reverse];\n\t step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n\t if (round) step = Math.floor(step);\n\t start += (stop - start - step * (n - paddingInner)) * align;\n\t bandwidth = step * (1 - paddingInner);\n\t if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n\t var values = d3Array.range(n).map(function(i) { return start + step * i; });\n\t return ordinalRange(reverse ? values.reverse() : values);\n\t }\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (domain(_), rescale()) : domain();\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();\n\t };\n\t\n\t scale.rangeRound = function(_) {\n\t return range$$1 = [+_[0], +_[1]], round = true, rescale();\n\t };\n\t\n\t scale.bandwidth = function() {\n\t return bandwidth;\n\t };\n\t\n\t scale.step = function() {\n\t return step;\n\t };\n\t\n\t scale.round = function(_) {\n\t return arguments.length ? (round = !!_, rescale()) : round;\n\t };\n\t\n\t scale.padding = function(_) {\n\t return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n\t };\n\t\n\t scale.paddingInner = function(_) {\n\t return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n\t };\n\t\n\t scale.paddingOuter = function(_) {\n\t return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n\t };\n\t\n\t scale.align = function(_) {\n\t return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n\t };\n\t\n\t scale.copy = function() {\n\t return band()\n\t .domain(domain())\n\t .range(range$$1)\n\t .round(round)\n\t .paddingInner(paddingInner)\n\t .paddingOuter(paddingOuter)\n\t .align(align);\n\t };\n\t\n\t return rescale();\n\t}\n\t\n\tfunction pointish(scale) {\n\t var copy = scale.copy;\n\t\n\t scale.padding = scale.paddingOuter;\n\t delete scale.paddingInner;\n\t delete scale.paddingOuter;\n\t\n\t scale.copy = function() {\n\t return pointish(copy());\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tfunction point() {\n\t return pointish(band().paddingInner(1));\n\t}\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tvar number = function(x) {\n\t return +x;\n\t};\n\t\n\tvar unit = [0, 1];\n\t\n\tfunction deinterpolateLinear(a, b) {\n\t return (b -= (a = +a))\n\t ? function(x) { return (x - a) / b; }\n\t : constant(b);\n\t}\n\t\n\tfunction deinterpolateClamp(deinterpolate) {\n\t return function(a, b) {\n\t var d = deinterpolate(a = +a, b = +b);\n\t return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n\t };\n\t}\n\t\n\tfunction reinterpolateClamp(reinterpolate) {\n\t return function(a, b) {\n\t var r = reinterpolate(a = +a, b = +b);\n\t return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n\t };\n\t}\n\t\n\tfunction bimap(domain, range$$1, deinterpolate, reinterpolate) {\n\t var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];\n\t if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n\t else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n\t return function(x) { return r0(d0(x)); };\n\t}\n\t\n\tfunction polymap(domain, range$$1, deinterpolate, reinterpolate) {\n\t var j = Math.min(domain.length, range$$1.length) - 1,\n\t d = new Array(j),\n\t r = new Array(j),\n\t i = -1;\n\t\n\t // Reverse descending domains.\n\t if (domain[j] < domain[0]) {\n\t domain = domain.slice().reverse();\n\t range$$1 = range$$1.slice().reverse();\n\t }\n\t\n\t while (++i < j) {\n\t d[i] = deinterpolate(domain[i], domain[i + 1]);\n\t r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);\n\t }\n\t\n\t return function(x) {\n\t var i = d3Array.bisect(domain, x, 1, j) - 1;\n\t return r[i](d[i](x));\n\t };\n\t}\n\t\n\tfunction copy(source, target) {\n\t return target\n\t .domain(source.domain())\n\t .range(source.range())\n\t .interpolate(source.interpolate())\n\t .clamp(source.clamp());\n\t}\n\t\n\t// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n\t// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\n\tfunction continuous(deinterpolate, reinterpolate) {\n\t var domain = unit,\n\t range$$1 = unit,\n\t interpolate$$1 = d3Interpolate.interpolate,\n\t clamp = false,\n\t piecewise,\n\t output,\n\t input;\n\t\n\t function rescale() {\n\t piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;\n\t output = input = null;\n\t return scale;\n\t }\n\t\n\t function scale(x) {\n\t return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);\n\t }\n\t\n\t scale.invert = function(y) {\n\t return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n\t };\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (domain = map$1.call(_, number), rescale()) : domain.slice();\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice();\n\t };\n\t\n\t scale.rangeRound = function(_) {\n\t return range$$1 = slice.call(_), interpolate$$1 = d3Interpolate.interpolateRound, rescale();\n\t };\n\t\n\t scale.clamp = function(_) {\n\t return arguments.length ? (clamp = !!_, rescale()) : clamp;\n\t };\n\t\n\t scale.interpolate = function(_) {\n\t return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;\n\t };\n\t\n\t return rescale();\n\t}\n\t\n\tvar tickFormat = function(domain, count, specifier) {\n\t var start = domain[0],\n\t stop = domain[domain.length - 1],\n\t step = d3Array.tickStep(start, stop, count == null ? 10 : count),\n\t precision;\n\t specifier = d3Format.formatSpecifier(specifier == null ? \",f\" : specifier);\n\t switch (specifier.type) {\n\t case \"s\": {\n\t var value = Math.max(Math.abs(start), Math.abs(stop));\n\t if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision;\n\t return d3Format.formatPrefix(specifier, value);\n\t }\n\t case \"\":\n\t case \"e\":\n\t case \"g\":\n\t case \"p\":\n\t case \"r\": {\n\t if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n\t break;\n\t }\n\t case \"f\":\n\t case \"%\": {\n\t if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n\t break;\n\t }\n\t }\n\t return d3Format.format(specifier);\n\t};\n\t\n\tfunction linearish(scale) {\n\t var domain = scale.domain;\n\t\n\t scale.ticks = function(count) {\n\t var d = domain();\n\t return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n\t };\n\t\n\t scale.tickFormat = function(count, specifier) {\n\t return tickFormat(domain(), count, specifier);\n\t };\n\t\n\t scale.nice = function(count) {\n\t if (count == null) count = 10;\n\t\n\t var d = domain(),\n\t i0 = 0,\n\t i1 = d.length - 1,\n\t start = d[i0],\n\t stop = d[i1],\n\t step;\n\t\n\t if (stop < start) {\n\t step = start, start = stop, stop = step;\n\t step = i0, i0 = i1, i1 = step;\n\t }\n\t\n\t step = d3Array.tickIncrement(start, stop, count);\n\t\n\t if (step > 0) {\n\t start = Math.floor(start / step) * step;\n\t stop = Math.ceil(stop / step) * step;\n\t step = d3Array.tickIncrement(start, stop, count);\n\t } else if (step < 0) {\n\t start = Math.ceil(start * step) / step;\n\t stop = Math.floor(stop * step) / step;\n\t step = d3Array.tickIncrement(start, stop, count);\n\t }\n\t\n\t if (step > 0) {\n\t d[i0] = Math.floor(start / step) * step;\n\t d[i1] = Math.ceil(stop / step) * step;\n\t domain(d);\n\t } else if (step < 0) {\n\t d[i0] = Math.ceil(start * step) / step;\n\t d[i1] = Math.floor(stop * step) / step;\n\t domain(d);\n\t }\n\t\n\t return scale;\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tfunction linear() {\n\t var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber);\n\t\n\t scale.copy = function() {\n\t return copy(scale, linear());\n\t };\n\t\n\t return linearish(scale);\n\t}\n\t\n\tfunction identity() {\n\t var domain = [0, 1];\n\t\n\t function scale(x) {\n\t return +x;\n\t }\n\t\n\t scale.invert = scale;\n\t\n\t scale.domain = scale.range = function(_) {\n\t return arguments.length ? (domain = map$1.call(_, number), scale) : domain.slice();\n\t };\n\t\n\t scale.copy = function() {\n\t return identity().domain(domain);\n\t };\n\t\n\t return linearish(scale);\n\t}\n\t\n\tvar nice = function(domain, interval) {\n\t domain = domain.slice();\n\t\n\t var i0 = 0,\n\t i1 = domain.length - 1,\n\t x0 = domain[i0],\n\t x1 = domain[i1],\n\t t;\n\t\n\t if (x1 < x0) {\n\t t = i0, i0 = i1, i1 = t;\n\t t = x0, x0 = x1, x1 = t;\n\t }\n\t\n\t domain[i0] = interval.floor(x0);\n\t domain[i1] = interval.ceil(x1);\n\t return domain;\n\t};\n\t\n\tfunction deinterpolate(a, b) {\n\t return (b = Math.log(b / a))\n\t ? function(x) { return Math.log(x / a) / b; }\n\t : constant(b);\n\t}\n\t\n\tfunction reinterpolate(a, b) {\n\t return a < 0\n\t ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }\n\t : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };\n\t}\n\t\n\tfunction pow10(x) {\n\t return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n\t}\n\t\n\tfunction powp(base) {\n\t return base === 10 ? pow10\n\t : base === Math.E ? Math.exp\n\t : function(x) { return Math.pow(base, x); };\n\t}\n\t\n\tfunction logp(base) {\n\t return base === Math.E ? Math.log\n\t : base === 10 && Math.log10\n\t || base === 2 && Math.log2\n\t || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n\t}\n\t\n\tfunction reflect(f) {\n\t return function(x) {\n\t return -f(-x);\n\t };\n\t}\n\t\n\tfunction log() {\n\t var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),\n\t domain = scale.domain,\n\t base = 10,\n\t logs = logp(10),\n\t pows = powp(10);\n\t\n\t function rescale() {\n\t logs = logp(base), pows = powp(base);\n\t if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);\n\t return scale;\n\t }\n\t\n\t scale.base = function(_) {\n\t return arguments.length ? (base = +_, rescale()) : base;\n\t };\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (domain(_), rescale()) : domain();\n\t };\n\t\n\t scale.ticks = function(count) {\n\t var d = domain(),\n\t u = d[0],\n\t v = d[d.length - 1],\n\t r;\n\t\n\t if (r = v < u) i = u, u = v, v = i;\n\t\n\t var i = logs(u),\n\t j = logs(v),\n\t p,\n\t k,\n\t t,\n\t n = count == null ? 10 : +count,\n\t z = [];\n\t\n\t if (!(base % 1) && j - i < n) {\n\t i = Math.round(i) - 1, j = Math.round(j) + 1;\n\t if (u > 0) for (; i < j; ++i) {\n\t for (k = 1, p = pows(i); k < base; ++k) {\n\t t = p * k;\n\t if (t < u) continue;\n\t if (t > v) break;\n\t z.push(t);\n\t }\n\t } else for (; i < j; ++i) {\n\t for (k = base - 1, p = pows(i); k >= 1; --k) {\n\t t = p * k;\n\t if (t < u) continue;\n\t if (t > v) break;\n\t z.push(t);\n\t }\n\t }\n\t } else {\n\t z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows);\n\t }\n\t\n\t return r ? z.reverse() : z;\n\t };\n\t\n\t scale.tickFormat = function(count, specifier) {\n\t if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n\t if (typeof specifier !== \"function\") specifier = d3Format.format(specifier);\n\t if (count === Infinity) return specifier;\n\t if (count == null) count = 10;\n\t var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n\t return function(d) {\n\t var i = d / pows(Math.round(logs(d)));\n\t if (i * base < base - 0.5) i *= base;\n\t return i <= k ? specifier(d) : \"\";\n\t };\n\t };\n\t\n\t scale.nice = function() {\n\t return domain(nice(domain(), {\n\t floor: function(x) { return pows(Math.floor(logs(x))); },\n\t ceil: function(x) { return pows(Math.ceil(logs(x))); }\n\t }));\n\t };\n\t\n\t scale.copy = function() {\n\t return copy(scale, log().base(base));\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tfunction raise(x, exponent) {\n\t return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n\t}\n\t\n\tfunction pow() {\n\t var exponent = 1,\n\t scale = continuous(deinterpolate, reinterpolate),\n\t domain = scale.domain;\n\t\n\t function deinterpolate(a, b) {\n\t return (b = raise(b, exponent) - (a = raise(a, exponent)))\n\t ? function(x) { return (raise(x, exponent) - a) / b; }\n\t : constant(b);\n\t }\n\t\n\t function reinterpolate(a, b) {\n\t b = raise(b, exponent) - (a = raise(a, exponent));\n\t return function(t) { return raise(a + b * t, 1 / exponent); };\n\t }\n\t\n\t scale.exponent = function(_) {\n\t return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n\t };\n\t\n\t scale.copy = function() {\n\t return copy(scale, pow().exponent(exponent));\n\t };\n\t\n\t return linearish(scale);\n\t}\n\t\n\tfunction sqrt() {\n\t return pow().exponent(0.5);\n\t}\n\t\n\tfunction quantile$1() {\n\t var domain = [],\n\t range$$1 = [],\n\t thresholds = [];\n\t\n\t function rescale() {\n\t var i = 0, n = Math.max(1, range$$1.length);\n\t thresholds = new Array(n - 1);\n\t while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n);\n\t return scale;\n\t }\n\t\n\t function scale(x) {\n\t if (!isNaN(x = +x)) return range$$1[d3Array.bisect(thresholds, x)];\n\t }\n\t\n\t scale.invertExtent = function(y) {\n\t var i = range$$1.indexOf(y);\n\t return i < 0 ? [NaN, NaN] : [\n\t i > 0 ? thresholds[i - 1] : domain[0],\n\t i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n\t ];\n\t };\n\t\n\t scale.domain = function(_) {\n\t if (!arguments.length) return domain.slice();\n\t domain = [];\n\t for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n\t domain.sort(d3Array.ascending);\n\t return rescale();\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice();\n\t };\n\t\n\t scale.quantiles = function() {\n\t return thresholds.slice();\n\t };\n\t\n\t scale.copy = function() {\n\t return quantile$1()\n\t .domain(domain)\n\t .range(range$$1);\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tfunction quantize() {\n\t var x0 = 0,\n\t x1 = 1,\n\t n = 1,\n\t domain = [0.5],\n\t range$$1 = [0, 1];\n\t\n\t function scale(x) {\n\t if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)];\n\t }\n\t\n\t function rescale() {\n\t var i = -1;\n\t domain = new Array(n);\n\t while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n\t return scale;\n\t }\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (n = (range$$1 = slice.call(_)).length - 1, rescale()) : range$$1.slice();\n\t };\n\t\n\t scale.invertExtent = function(y) {\n\t var i = range$$1.indexOf(y);\n\t return i < 0 ? [NaN, NaN]\n\t : i < 1 ? [x0, domain[0]]\n\t : i >= n ? [domain[n - 1], x1]\n\t : [domain[i - 1], domain[i]];\n\t };\n\t\n\t scale.copy = function() {\n\t return quantize()\n\t .domain([x0, x1])\n\t .range(range$$1);\n\t };\n\t\n\t return linearish(scale);\n\t}\n\t\n\tfunction threshold() {\n\t var domain = [0.5],\n\t range$$1 = [0, 1],\n\t n = 1;\n\t\n\t function scale(x) {\n\t if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)];\n\t }\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();\n\t };\n\t\n\t scale.range = function(_) {\n\t return arguments.length ? (range$$1 = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();\n\t };\n\t\n\t scale.invertExtent = function(y) {\n\t var i = range$$1.indexOf(y);\n\t return [domain[i - 1], domain[i]];\n\t };\n\t\n\t scale.copy = function() {\n\t return threshold()\n\t .domain(domain)\n\t .range(range$$1);\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tvar durationSecond = 1000;\n\tvar durationMinute = durationSecond * 60;\n\tvar durationHour = durationMinute * 60;\n\tvar durationDay = durationHour * 24;\n\tvar durationWeek = durationDay * 7;\n\tvar durationMonth = durationDay * 30;\n\tvar durationYear = durationDay * 365;\n\t\n\tfunction date(t) {\n\t return new Date(t);\n\t}\n\t\n\tfunction number$1(t) {\n\t return t instanceof Date ? +t : +new Date(+t);\n\t}\n\t\n\tfunction calendar(year, month, week, day, hour, minute, second, millisecond, format$$1) {\n\t var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber),\n\t invert = scale.invert,\n\t domain = scale.domain;\n\t\n\t var formatMillisecond = format$$1(\".%L\"),\n\t formatSecond = format$$1(\":%S\"),\n\t formatMinute = format$$1(\"%I:%M\"),\n\t formatHour = format$$1(\"%I %p\"),\n\t formatDay = format$$1(\"%a %d\"),\n\t formatWeek = format$$1(\"%b %d\"),\n\t formatMonth = format$$1(\"%B\"),\n\t formatYear = format$$1(\"%Y\");\n\t\n\t var tickIntervals = [\n\t [second, 1, durationSecond],\n\t [second, 5, 5 * durationSecond],\n\t [second, 15, 15 * durationSecond],\n\t [second, 30, 30 * durationSecond],\n\t [minute, 1, durationMinute],\n\t [minute, 5, 5 * durationMinute],\n\t [minute, 15, 15 * durationMinute],\n\t [minute, 30, 30 * durationMinute],\n\t [ hour, 1, durationHour ],\n\t [ hour, 3, 3 * durationHour ],\n\t [ hour, 6, 6 * durationHour ],\n\t [ hour, 12, 12 * durationHour ],\n\t [ day, 1, durationDay ],\n\t [ day, 2, 2 * durationDay ],\n\t [ week, 1, durationWeek ],\n\t [ month, 1, durationMonth ],\n\t [ month, 3, 3 * durationMonth ],\n\t [ year, 1, durationYear ]\n\t ];\n\t\n\t function tickFormat(date) {\n\t return (second(date) < date ? formatMillisecond\n\t : minute(date) < date ? formatSecond\n\t : hour(date) < date ? formatMinute\n\t : day(date) < date ? formatHour\n\t : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n\t : year(date) < date ? formatMonth\n\t : formatYear)(date);\n\t }\n\t\n\t function tickInterval(interval, start, stop, step) {\n\t if (interval == null) interval = 10;\n\t\n\t // If a desired tick count is specified, pick a reasonable tick interval\n\t // based on the extent of the domain and a rough estimate of tick size.\n\t // Otherwise, assume interval is already a time interval and use it.\n\t if (typeof interval === \"number\") {\n\t var target = Math.abs(stop - start) / interval,\n\t i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n\t if (i === tickIntervals.length) {\n\t step = d3Array.tickStep(start / durationYear, stop / durationYear, interval);\n\t interval = year;\n\t } else if (i) {\n\t i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n\t step = i[1];\n\t interval = i[0];\n\t } else {\n\t step = d3Array.tickStep(start, stop, interval);\n\t interval = millisecond;\n\t }\n\t }\n\t\n\t return step == null ? interval : interval.every(step);\n\t }\n\t\n\t scale.invert = function(y) {\n\t return new Date(invert(y));\n\t };\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? domain(map$1.call(_, number$1)) : domain().map(date);\n\t };\n\t\n\t scale.ticks = function(interval, step) {\n\t var d = domain(),\n\t t0 = d[0],\n\t t1 = d[d.length - 1],\n\t r = t1 < t0,\n\t t;\n\t if (r) t = t0, t0 = t1, t1 = t;\n\t t = tickInterval(interval, t0, t1, step);\n\t t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n\t return r ? t.reverse() : t;\n\t };\n\t\n\t scale.tickFormat = function(count, specifier) {\n\t return specifier == null ? tickFormat : format$$1(specifier);\n\t };\n\t\n\t scale.nice = function(interval, step) {\n\t var d = domain();\n\t return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n\t ? domain(nice(d, interval))\n\t : scale;\n\t };\n\t\n\t scale.copy = function() {\n\t return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format$$1));\n\t };\n\t\n\t return scale;\n\t}\n\t\n\tvar time = function() {\n\t return calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n\t};\n\t\n\tvar utcTime = function() {\n\t return calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);\n\t};\n\t\n\tvar colors = function(s) {\n\t return s.match(/.{6}/g).map(function(x) {\n\t return \"#\" + x;\n\t });\n\t};\n\t\n\tvar category10 = colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n\t\n\tvar category20b = colors(\"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\");\n\t\n\tvar category20c = colors(\"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\");\n\t\n\tvar category20 = colors(\"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\");\n\t\n\tvar cubehelix$1 = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0));\n\t\n\tvar warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8));\n\t\n\tvar cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8));\n\t\n\tvar rainbow = d3Color.cubehelix();\n\t\n\tvar rainbow$1 = function(t) {\n\t if (t < 0 || t > 1) t -= Math.floor(t);\n\t var ts = Math.abs(t - 0.5);\n\t rainbow.h = 360 * t - 100;\n\t rainbow.s = 1.5 - 1.5 * ts;\n\t rainbow.l = 0.8 - 0.9 * ts;\n\t return rainbow + \"\";\n\t};\n\t\n\tfunction ramp(range$$1) {\n\t var n = range$$1.length;\n\t return function(t) {\n\t return range$$1[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n\t };\n\t}\n\t\n\tvar viridis = ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\t\n\tvar magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\t\n\tvar inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\t\n\tvar plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n\t\n\tfunction sequential(interpolator) {\n\t var x0 = 0,\n\t x1 = 1,\n\t clamp = false;\n\t\n\t function scale(x) {\n\t var t = (x - x0) / (x1 - x0);\n\t return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n\t }\n\t\n\t scale.domain = function(_) {\n\t return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];\n\t };\n\t\n\t scale.clamp = function(_) {\n\t return arguments.length ? (clamp = !!_, scale) : clamp;\n\t };\n\t\n\t scale.interpolator = function(_) {\n\t return arguments.length ? (interpolator = _, scale) : interpolator;\n\t };\n\t\n\t scale.copy = function() {\n\t return sequential(interpolator).domain([x0, x1]).clamp(clamp);\n\t };\n\t\n\t return linearish(scale);\n\t}\n\t\n\texports.scaleBand = band;\n\texports.scalePoint = point;\n\texports.scaleIdentity = identity;\n\texports.scaleLinear = linear;\n\texports.scaleLog = log;\n\texports.scaleOrdinal = ordinal;\n\texports.scaleImplicit = implicit;\n\texports.scalePow = pow;\n\texports.scaleSqrt = sqrt;\n\texports.scaleQuantile = quantile$1;\n\texports.scaleQuantize = quantize;\n\texports.scaleThreshold = threshold;\n\texports.scaleTime = time;\n\texports.scaleUtc = utcTime;\n\texports.schemeCategory10 = category10;\n\texports.schemeCategory20b = category20b;\n\texports.schemeCategory20c = category20c;\n\texports.schemeCategory20 = category20;\n\texports.interpolateCubehelixDefault = cubehelix$1;\n\texports.interpolateRainbow = rainbow$1;\n\texports.interpolateWarm = warm;\n\texports.interpolateCool = cool;\n\texports.interpolateViridis = viridis;\n\texports.interpolateMagma = magma;\n\texports.interpolateInferno = inferno;\n\texports.interpolatePlasma = plasma;\n\texports.scaleSequential = sequential;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-collection/ Version 1.0.4. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar prefix = \"$\";\n\t\n\tfunction Map() {}\n\t\n\tMap.prototype = map.prototype = {\n\t constructor: Map,\n\t has: function(key) {\n\t return (prefix + key) in this;\n\t },\n\t get: function(key) {\n\t return this[prefix + key];\n\t },\n\t set: function(key, value) {\n\t this[prefix + key] = value;\n\t return this;\n\t },\n\t remove: function(key) {\n\t var property = prefix + key;\n\t return property in this && delete this[property];\n\t },\n\t clear: function() {\n\t for (var property in this) if (property[0] === prefix) delete this[property];\n\t },\n\t keys: function() {\n\t var keys = [];\n\t for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n\t return keys;\n\t },\n\t values: function() {\n\t var values = [];\n\t for (var property in this) if (property[0] === prefix) values.push(this[property]);\n\t return values;\n\t },\n\t entries: function() {\n\t var entries = [];\n\t for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n\t return entries;\n\t },\n\t size: function() {\n\t var size = 0;\n\t for (var property in this) if (property[0] === prefix) ++size;\n\t return size;\n\t },\n\t empty: function() {\n\t for (var property in this) if (property[0] === prefix) return false;\n\t return true;\n\t },\n\t each: function(f) {\n\t for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n\t }\n\t};\n\t\n\tfunction map(object, f) {\n\t var map = new Map;\n\t\n\t // Copy constructor.\n\t if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\t\n\t // Index array by numeric index or specified key function.\n\t else if (Array.isArray(object)) {\n\t var i = -1,\n\t n = object.length,\n\t o;\n\t\n\t if (f == null) while (++i < n) map.set(i, object[i]);\n\t else while (++i < n) map.set(f(o = object[i], i, object), o);\n\t }\n\t\n\t // Convert object to map.\n\t else if (object) for (var key in object) map.set(key, object[key]);\n\t\n\t return map;\n\t}\n\t\n\tvar nest = function() {\n\t var keys = [],\n\t sortKeys = [],\n\t sortValues,\n\t rollup,\n\t nest;\n\t\n\t function apply(array, depth, createResult, setResult) {\n\t if (depth >= keys.length) {\n\t if (sortValues != null) array.sort(sortValues);\n\t return rollup != null ? rollup(array) : array;\n\t }\n\t\n\t var i = -1,\n\t n = array.length,\n\t key = keys[depth++],\n\t keyValue,\n\t value,\n\t valuesByKey = map(),\n\t values,\n\t result = createResult();\n\t\n\t while (++i < n) {\n\t if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n\t values.push(value);\n\t } else {\n\t valuesByKey.set(keyValue, [value]);\n\t }\n\t }\n\t\n\t valuesByKey.each(function(values, key) {\n\t setResult(result, key, apply(values, depth, createResult, setResult));\n\t });\n\t\n\t return result;\n\t }\n\t\n\t function entries(map$$1, depth) {\n\t if (++depth > keys.length) return map$$1;\n\t var array, sortKey = sortKeys[depth - 1];\n\t if (rollup != null && depth >= keys.length) array = map$$1.entries();\n\t else array = [], map$$1.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n\t return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n\t }\n\t\n\t return nest = {\n\t object: function(array) { return apply(array, 0, createObject, setObject); },\n\t map: function(array) { return apply(array, 0, createMap, setMap); },\n\t entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n\t key: function(d) { keys.push(d); return nest; },\n\t sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n\t sortValues: function(order) { sortValues = order; return nest; },\n\t rollup: function(f) { rollup = f; return nest; }\n\t };\n\t};\n\t\n\tfunction createObject() {\n\t return {};\n\t}\n\t\n\tfunction setObject(object, key, value) {\n\t object[key] = value;\n\t}\n\t\n\tfunction createMap() {\n\t return map();\n\t}\n\t\n\tfunction setMap(map$$1, key, value) {\n\t map$$1.set(key, value);\n\t}\n\t\n\tfunction Set() {}\n\t\n\tvar proto = map.prototype;\n\t\n\tSet.prototype = set.prototype = {\n\t constructor: Set,\n\t has: proto.has,\n\t add: function(value) {\n\t value += \"\";\n\t this[prefix + value] = value;\n\t return this;\n\t },\n\t remove: proto.remove,\n\t clear: proto.clear,\n\t values: proto.keys,\n\t size: proto.size,\n\t empty: proto.empty,\n\t each: proto.each\n\t};\n\t\n\tfunction set(object, f) {\n\t var set = new Set;\n\t\n\t // Copy constructor.\n\t if (object instanceof Set) object.each(function(value) { set.add(value); });\n\t\n\t // Otherwise, assume it’s an array.\n\t else if (object) {\n\t var i = -1, n = object.length;\n\t if (f == null) while (++i < n) set.add(object[i]);\n\t else while (++i < n) set.add(f(object[i], i, object));\n\t }\n\t\n\t return set;\n\t}\n\t\n\tvar keys = function(map) {\n\t var keys = [];\n\t for (var key in map) keys.push(key);\n\t return keys;\n\t};\n\t\n\tvar values = function(map) {\n\t var values = [];\n\t for (var key in map) values.push(map[key]);\n\t return values;\n\t};\n\t\n\tvar entries = function(map) {\n\t var entries = [];\n\t for (var key in map) entries.push({key: key, value: map[key]});\n\t return entries;\n\t};\n\t\n\texports.nest = nest;\n\texports.set = set;\n\texports.map = map;\n\texports.keys = keys;\n\texports.values = values;\n\texports.entries = entries;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-interpolate/ Version 1.1.5. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(5)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3));\n\t}(this, (function (exports,d3Color) { 'use strict';\n\t\n\tfunction basis(t1, v0, v1, v2, v3) {\n\t var t2 = t1 * t1, t3 = t2 * t1;\n\t return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n\t + (4 - 6 * t2 + 3 * t3) * v1\n\t + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n\t + t3 * v3) / 6;\n\t}\n\t\n\tvar basis$1 = function(values) {\n\t var n = values.length - 1;\n\t return function(t) {\n\t var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n\t v1 = values[i],\n\t v2 = values[i + 1],\n\t v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n\t v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n\t return basis((t - i / n) * n, v0, v1, v2, v3);\n\t };\n\t};\n\t\n\tvar basisClosed = function(values) {\n\t var n = values.length;\n\t return function(t) {\n\t var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n\t v0 = values[(i + n - 1) % n],\n\t v1 = values[i % n],\n\t v2 = values[(i + 1) % n],\n\t v3 = values[(i + 2) % n];\n\t return basis((t - i / n) * n, v0, v1, v2, v3);\n\t };\n\t};\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tfunction linear(a, d) {\n\t return function(t) {\n\t return a + t * d;\n\t };\n\t}\n\t\n\tfunction exponential(a, b, y) {\n\t return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n\t return Math.pow(a + t * b, y);\n\t };\n\t}\n\t\n\tfunction hue(a, b) {\n\t var d = b - a;\n\t return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n\t}\n\t\n\tfunction gamma(y) {\n\t return (y = +y) === 1 ? nogamma : function(a, b) {\n\t return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n\t };\n\t}\n\t\n\tfunction nogamma(a, b) {\n\t var d = b - a;\n\t return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n\t}\n\t\n\tvar rgb$1 = ((function rgbGamma(y) {\n\t var color$$1 = gamma(y);\n\t\n\t function rgb$$1(start, end) {\n\t var r = color$$1((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r),\n\t g = color$$1(start.g, end.g),\n\t b = color$$1(start.b, end.b),\n\t opacity = nogamma(start.opacity, end.opacity);\n\t return function(t) {\n\t start.r = r(t);\n\t start.g = g(t);\n\t start.b = b(t);\n\t start.opacity = opacity(t);\n\t return start + \"\";\n\t };\n\t }\n\t\n\t rgb$$1.gamma = rgbGamma;\n\t\n\t return rgb$$1;\n\t}))(1);\n\t\n\tfunction rgbSpline(spline) {\n\t return function(colors) {\n\t var n = colors.length,\n\t r = new Array(n),\n\t g = new Array(n),\n\t b = new Array(n),\n\t i, color$$1;\n\t for (i = 0; i < n; ++i) {\n\t color$$1 = d3Color.rgb(colors[i]);\n\t r[i] = color$$1.r || 0;\n\t g[i] = color$$1.g || 0;\n\t b[i] = color$$1.b || 0;\n\t }\n\t r = spline(r);\n\t g = spline(g);\n\t b = spline(b);\n\t color$$1.opacity = 1;\n\t return function(t) {\n\t color$$1.r = r(t);\n\t color$$1.g = g(t);\n\t color$$1.b = b(t);\n\t return color$$1 + \"\";\n\t };\n\t };\n\t}\n\t\n\tvar rgbBasis = rgbSpline(basis$1);\n\tvar rgbBasisClosed = rgbSpline(basisClosed);\n\t\n\tvar array = function(a, b) {\n\t var nb = b ? b.length : 0,\n\t na = a ? Math.min(nb, a.length) : 0,\n\t x = new Array(nb),\n\t c = new Array(nb),\n\t i;\n\t\n\t for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n\t for (; i < nb; ++i) c[i] = b[i];\n\t\n\t return function(t) {\n\t for (i = 0; i < na; ++i) c[i] = x[i](t);\n\t return c;\n\t };\n\t};\n\t\n\tvar date = function(a, b) {\n\t var d = new Date;\n\t return a = +a, b -= a, function(t) {\n\t return d.setTime(a + b * t), d;\n\t };\n\t};\n\t\n\tvar number = function(a, b) {\n\t return a = +a, b -= a, function(t) {\n\t return a + b * t;\n\t };\n\t};\n\t\n\tvar object = function(a, b) {\n\t var i = {},\n\t c = {},\n\t k;\n\t\n\t if (a === null || typeof a !== \"object\") a = {};\n\t if (b === null || typeof b !== \"object\") b = {};\n\t\n\t for (k in b) {\n\t if (k in a) {\n\t i[k] = value(a[k], b[k]);\n\t } else {\n\t c[k] = b[k];\n\t }\n\t }\n\t\n\t return function(t) {\n\t for (k in i) c[k] = i[k](t);\n\t return c;\n\t };\n\t};\n\t\n\tvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g;\n\tvar reB = new RegExp(reA.source, \"g\");\n\t\n\tfunction zero(b) {\n\t return function() {\n\t return b;\n\t };\n\t}\n\t\n\tfunction one(b) {\n\t return function(t) {\n\t return b(t) + \"\";\n\t };\n\t}\n\t\n\tvar string = function(a, b) {\n\t var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n\t am, // current match in a\n\t bm, // current match in b\n\t bs, // string preceding current number in b, if any\n\t i = -1, // index in s\n\t s = [], // string constants and placeholders\n\t q = []; // number interpolators\n\t\n\t // Coerce inputs to strings.\n\t a = a + \"\", b = b + \"\";\n\t\n\t // Interpolate pairs of numbers in a & b.\n\t while ((am = reA.exec(a))\n\t && (bm = reB.exec(b))) {\n\t if ((bs = bm.index) > bi) { // a string precedes the next number in b\n\t bs = b.slice(bi, bs);\n\t if (s[i]) s[i] += bs; // coalesce with previous string\n\t else s[++i] = bs;\n\t }\n\t if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n\t if (s[i]) s[i] += bm; // coalesce with previous string\n\t else s[++i] = bm;\n\t } else { // interpolate non-matching numbers\n\t s[++i] = null;\n\t q.push({i: i, x: number(am, bm)});\n\t }\n\t bi = reB.lastIndex;\n\t }\n\t\n\t // Add remains of b.\n\t if (bi < b.length) {\n\t bs = b.slice(bi);\n\t if (s[i]) s[i] += bs; // coalesce with previous string\n\t else s[++i] = bs;\n\t }\n\t\n\t // Special optimization for only a single match.\n\t // Otherwise, interpolate each of the numbers and rejoin the string.\n\t return s.length < 2 ? (q[0]\n\t ? one(q[0].x)\n\t : zero(b))\n\t : (b = q.length, function(t) {\n\t for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n\t return s.join(\"\");\n\t });\n\t};\n\t\n\tvar value = function(a, b) {\n\t var t = typeof b, c;\n\t return b == null || t === \"boolean\" ? constant(b)\n\t : (t === \"number\" ? number\n\t : t === \"string\" ? ((c = d3Color.color(b)) ? (b = c, rgb$1) : string)\n\t : b instanceof d3Color.color ? rgb$1\n\t : b instanceof Date ? date\n\t : Array.isArray(b) ? array\n\t : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n\t : number)(a, b);\n\t};\n\t\n\tvar round = function(a, b) {\n\t return a = +a, b -= a, function(t) {\n\t return Math.round(a + b * t);\n\t };\n\t};\n\t\n\tvar degrees = 180 / Math.PI;\n\t\n\tvar identity = {\n\t translateX: 0,\n\t translateY: 0,\n\t rotate: 0,\n\t skewX: 0,\n\t scaleX: 1,\n\t scaleY: 1\n\t};\n\t\n\tvar decompose = function(a, b, c, d, e, f) {\n\t var scaleX, scaleY, skewX;\n\t if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n\t if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n\t if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n\t if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n\t return {\n\t translateX: e,\n\t translateY: f,\n\t rotate: Math.atan2(b, a) * degrees,\n\t skewX: Math.atan(skewX) * degrees,\n\t scaleX: scaleX,\n\t scaleY: scaleY\n\t };\n\t};\n\t\n\tvar cssNode;\n\tvar cssRoot;\n\tvar cssView;\n\tvar svgNode;\n\t\n\tfunction parseCss(value) {\n\t if (value === \"none\") return identity;\n\t if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n\t cssNode.style.transform = value;\n\t value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n\t cssRoot.removeChild(cssNode);\n\t value = value.slice(7, -1).split(\",\");\n\t return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n\t}\n\t\n\tfunction parseSvg(value) {\n\t if (value == null) return identity;\n\t if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t svgNode.setAttribute(\"transform\", value);\n\t if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n\t value = value.matrix;\n\t return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n\t}\n\t\n\tfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\t\n\t function pop(s) {\n\t return s.length ? s.pop() + \" \" : \"\";\n\t }\n\t\n\t function translate(xa, ya, xb, yb, s, q) {\n\t if (xa !== xb || ya !== yb) {\n\t var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n\t q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n\t } else if (xb || yb) {\n\t s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n\t }\n\t }\n\t\n\t function rotate(a, b, s, q) {\n\t if (a !== b) {\n\t if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n\t q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n\t } else if (b) {\n\t s.push(pop(s) + \"rotate(\" + b + degParen);\n\t }\n\t }\n\t\n\t function skewX(a, b, s, q) {\n\t if (a !== b) {\n\t q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n\t } else if (b) {\n\t s.push(pop(s) + \"skewX(\" + b + degParen);\n\t }\n\t }\n\t\n\t function scale(xa, ya, xb, yb, s, q) {\n\t if (xa !== xb || ya !== yb) {\n\t var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n\t q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n\t } else if (xb !== 1 || yb !== 1) {\n\t s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n\t }\n\t }\n\t\n\t return function(a, b) {\n\t var s = [], // string constants and placeholders\n\t q = []; // number interpolators\n\t a = parse(a), b = parse(b);\n\t translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n\t rotate(a.rotate, b.rotate, s, q);\n\t skewX(a.skewX, b.skewX, s, q);\n\t scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n\t a = b = null; // gc\n\t return function(t) {\n\t var i = -1, n = q.length, o;\n\t while (++i < n) s[(o = q[i]).i] = o.x(t);\n\t return s.join(\"\");\n\t };\n\t };\n\t}\n\t\n\tvar interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n\tvar interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n\t\n\tvar rho = Math.SQRT2;\n\tvar rho2 = 2;\n\tvar rho4 = 4;\n\tvar epsilon2 = 1e-12;\n\t\n\tfunction cosh(x) {\n\t return ((x = Math.exp(x)) + 1 / x) / 2;\n\t}\n\t\n\tfunction sinh(x) {\n\t return ((x = Math.exp(x)) - 1 / x) / 2;\n\t}\n\t\n\tfunction tanh(x) {\n\t return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n\t}\n\t\n\t// p0 = [ux0, uy0, w0]\n\t// p1 = [ux1, uy1, w1]\n\tvar zoom = function(p0, p1) {\n\t var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n\t ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n\t dx = ux1 - ux0,\n\t dy = uy1 - uy0,\n\t d2 = dx * dx + dy * dy,\n\t i,\n\t S;\n\t\n\t // Special case for u0 ≅ u1.\n\t if (d2 < epsilon2) {\n\t S = Math.log(w1 / w0) / rho;\n\t i = function(t) {\n\t return [\n\t ux0 + t * dx,\n\t uy0 + t * dy,\n\t w0 * Math.exp(rho * t * S)\n\t ];\n\t };\n\t }\n\t\n\t // General case.\n\t else {\n\t var d1 = Math.sqrt(d2),\n\t b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n\t b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n\t r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n\t r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n\t S = (r1 - r0) / rho;\n\t i = function(t) {\n\t var s = t * S,\n\t coshr0 = cosh(r0),\n\t u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n\t return [\n\t ux0 + u * dx,\n\t uy0 + u * dy,\n\t w0 * coshr0 / cosh(rho * s + r0)\n\t ];\n\t };\n\t }\n\t\n\t i.duration = S * 1000;\n\t\n\t return i;\n\t};\n\t\n\tfunction hsl$1(hue$$1) {\n\t return function(start, end) {\n\t var h = hue$$1((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h),\n\t s = nogamma(start.s, end.s),\n\t l = nogamma(start.l, end.l),\n\t opacity = nogamma(start.opacity, end.opacity);\n\t return function(t) {\n\t start.h = h(t);\n\t start.s = s(t);\n\t start.l = l(t);\n\t start.opacity = opacity(t);\n\t return start + \"\";\n\t };\n\t }\n\t}\n\t\n\tvar hsl$2 = hsl$1(hue);\n\tvar hslLong = hsl$1(nogamma);\n\t\n\tfunction lab$1(start, end) {\n\t var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l),\n\t a = nogamma(start.a, end.a),\n\t b = nogamma(start.b, end.b),\n\t opacity = nogamma(start.opacity, end.opacity);\n\t return function(t) {\n\t start.l = l(t);\n\t start.a = a(t);\n\t start.b = b(t);\n\t start.opacity = opacity(t);\n\t return start + \"\";\n\t };\n\t}\n\t\n\tfunction hcl$1(hue$$1) {\n\t return function(start, end) {\n\t var h = hue$$1((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h),\n\t c = nogamma(start.c, end.c),\n\t l = nogamma(start.l, end.l),\n\t opacity = nogamma(start.opacity, end.opacity);\n\t return function(t) {\n\t start.h = h(t);\n\t start.c = c(t);\n\t start.l = l(t);\n\t start.opacity = opacity(t);\n\t return start + \"\";\n\t };\n\t }\n\t}\n\t\n\tvar hcl$2 = hcl$1(hue);\n\tvar hclLong = hcl$1(nogamma);\n\t\n\tfunction cubehelix$1(hue$$1) {\n\t return (function cubehelixGamma(y) {\n\t y = +y;\n\t\n\t function cubehelix$$1(start, end) {\n\t var h = hue$$1((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h),\n\t s = nogamma(start.s, end.s),\n\t l = nogamma(start.l, end.l),\n\t opacity = nogamma(start.opacity, end.opacity);\n\t return function(t) {\n\t start.h = h(t);\n\t start.s = s(t);\n\t start.l = l(Math.pow(t, y));\n\t start.opacity = opacity(t);\n\t return start + \"\";\n\t };\n\t }\n\t\n\t cubehelix$$1.gamma = cubehelixGamma;\n\t\n\t return cubehelix$$1;\n\t })(1);\n\t}\n\t\n\tvar cubehelix$2 = cubehelix$1(hue);\n\tvar cubehelixLong = cubehelix$1(nogamma);\n\t\n\tvar quantize = function(interpolator, n) {\n\t var samples = new Array(n);\n\t for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n\t return samples;\n\t};\n\t\n\texports.interpolate = value;\n\texports.interpolateArray = array;\n\texports.interpolateBasis = basis$1;\n\texports.interpolateBasisClosed = basisClosed;\n\texports.interpolateDate = date;\n\texports.interpolateNumber = number;\n\texports.interpolateObject = object;\n\texports.interpolateRound = round;\n\texports.interpolateString = string;\n\texports.interpolateTransformCss = interpolateTransformCss;\n\texports.interpolateTransformSvg = interpolateTransformSvg;\n\texports.interpolateZoom = zoom;\n\texports.interpolateRgb = rgb$1;\n\texports.interpolateRgbBasis = rgbBasis;\n\texports.interpolateRgbBasisClosed = rgbBasisClosed;\n\texports.interpolateHsl = hsl$2;\n\texports.interpolateHslLong = hslLong;\n\texports.interpolateLab = lab$1;\n\texports.interpolateHcl = hcl$2;\n\texports.interpolateHclLong = hclLong;\n\texports.interpolateCubehelix = cubehelix$2;\n\texports.interpolateCubehelixLong = cubehelixLong;\n\texports.quantize = quantize;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-time/ Version 1.0.7. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar t0 = new Date;\n\tvar t1 = new Date;\n\t\n\tfunction newInterval(floori, offseti, count, field) {\n\t\n\t function interval(date) {\n\t return floori(date = new Date(+date)), date;\n\t }\n\t\n\t interval.floor = interval;\n\t\n\t interval.ceil = function(date) {\n\t return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n\t };\n\t\n\t interval.round = function(date) {\n\t var d0 = interval(date),\n\t d1 = interval.ceil(date);\n\t return date - d0 < d1 - date ? d0 : d1;\n\t };\n\t\n\t interval.offset = function(date, step) {\n\t return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n\t };\n\t\n\t interval.range = function(start, stop, step) {\n\t var range = [];\n\t start = interval.ceil(start);\n\t step = step == null ? 1 : Math.floor(step);\n\t if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n\t do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)\n\t return range;\n\t };\n\t\n\t interval.filter = function(test) {\n\t return newInterval(function(date) {\n\t if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n\t }, function(date, step) {\n\t if (date >= date) {\n\t if (step < 0) while (++step <= 0) {\n\t while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n\t } else while (--step >= 0) {\n\t while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n\t }\n\t }\n\t });\n\t };\n\t\n\t if (count) {\n\t interval.count = function(start, end) {\n\t t0.setTime(+start), t1.setTime(+end);\n\t floori(t0), floori(t1);\n\t return Math.floor(count(t0, t1));\n\t };\n\t\n\t interval.every = function(step) {\n\t step = Math.floor(step);\n\t return !isFinite(step) || !(step > 0) ? null\n\t : !(step > 1) ? interval\n\t : interval.filter(field\n\t ? function(d) { return field(d) % step === 0; }\n\t : function(d) { return interval.count(0, d) % step === 0; });\n\t };\n\t }\n\t\n\t return interval;\n\t}\n\t\n\tvar millisecond = newInterval(function() {\n\t // noop\n\t}, function(date, step) {\n\t date.setTime(+date + step);\n\t}, function(start, end) {\n\t return end - start;\n\t});\n\t\n\t// An optimized implementation for this simple case.\n\tmillisecond.every = function(k) {\n\t k = Math.floor(k);\n\t if (!isFinite(k) || !(k > 0)) return null;\n\t if (!(k > 1)) return millisecond;\n\t return newInterval(function(date) {\n\t date.setTime(Math.floor(date / k) * k);\n\t }, function(date, step) {\n\t date.setTime(+date + step * k);\n\t }, function(start, end) {\n\t return (end - start) / k;\n\t });\n\t};\n\t\n\tvar milliseconds = millisecond.range;\n\t\n\tvar durationSecond = 1e3;\n\tvar durationMinute = 6e4;\n\tvar durationHour = 36e5;\n\tvar durationDay = 864e5;\n\tvar durationWeek = 6048e5;\n\t\n\tvar second = newInterval(function(date) {\n\t date.setTime(Math.floor(date / durationSecond) * durationSecond);\n\t}, function(date, step) {\n\t date.setTime(+date + step * durationSecond);\n\t}, function(start, end) {\n\t return (end - start) / durationSecond;\n\t}, function(date) {\n\t return date.getUTCSeconds();\n\t});\n\t\n\tvar seconds = second.range;\n\t\n\tvar minute = newInterval(function(date) {\n\t date.setTime(Math.floor(date / durationMinute) * durationMinute);\n\t}, function(date, step) {\n\t date.setTime(+date + step * durationMinute);\n\t}, function(start, end) {\n\t return (end - start) / durationMinute;\n\t}, function(date) {\n\t return date.getMinutes();\n\t});\n\t\n\tvar minutes = minute.range;\n\t\n\tvar hour = newInterval(function(date) {\n\t var offset = date.getTimezoneOffset() * durationMinute % durationHour;\n\t if (offset < 0) offset += durationHour;\n\t date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);\n\t}, function(date, step) {\n\t date.setTime(+date + step * durationHour);\n\t}, function(start, end) {\n\t return (end - start) / durationHour;\n\t}, function(date) {\n\t return date.getHours();\n\t});\n\t\n\tvar hours = hour.range;\n\t\n\tvar day = newInterval(function(date) {\n\t date.setHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setDate(date.getDate() + step);\n\t}, function(start, end) {\n\t return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n\t}, function(date) {\n\t return date.getDate() - 1;\n\t});\n\t\n\tvar days = day.range;\n\t\n\tfunction weekday(i) {\n\t return newInterval(function(date) {\n\t date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n\t date.setHours(0, 0, 0, 0);\n\t }, function(date, step) {\n\t date.setDate(date.getDate() + step * 7);\n\t }, function(start, end) {\n\t return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n\t });\n\t}\n\t\n\tvar sunday = weekday(0);\n\tvar monday = weekday(1);\n\tvar tuesday = weekday(2);\n\tvar wednesday = weekday(3);\n\tvar thursday = weekday(4);\n\tvar friday = weekday(5);\n\tvar saturday = weekday(6);\n\t\n\tvar sundays = sunday.range;\n\tvar mondays = monday.range;\n\tvar tuesdays = tuesday.range;\n\tvar wednesdays = wednesday.range;\n\tvar thursdays = thursday.range;\n\tvar fridays = friday.range;\n\tvar saturdays = saturday.range;\n\t\n\tvar month = newInterval(function(date) {\n\t date.setDate(1);\n\t date.setHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setMonth(date.getMonth() + step);\n\t}, function(start, end) {\n\t return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n\t}, function(date) {\n\t return date.getMonth();\n\t});\n\t\n\tvar months = month.range;\n\t\n\tvar year = newInterval(function(date) {\n\t date.setMonth(0, 1);\n\t date.setHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setFullYear(date.getFullYear() + step);\n\t}, function(start, end) {\n\t return end.getFullYear() - start.getFullYear();\n\t}, function(date) {\n\t return date.getFullYear();\n\t});\n\t\n\t// An optimized implementation for this simple case.\n\tyear.every = function(k) {\n\t return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n\t date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n\t date.setMonth(0, 1);\n\t date.setHours(0, 0, 0, 0);\n\t }, function(date, step) {\n\t date.setFullYear(date.getFullYear() + step * k);\n\t });\n\t};\n\t\n\tvar years = year.range;\n\t\n\tvar utcMinute = newInterval(function(date) {\n\t date.setUTCSeconds(0, 0);\n\t}, function(date, step) {\n\t date.setTime(+date + step * durationMinute);\n\t}, function(start, end) {\n\t return (end - start) / durationMinute;\n\t}, function(date) {\n\t return date.getUTCMinutes();\n\t});\n\t\n\tvar utcMinutes = utcMinute.range;\n\t\n\tvar utcHour = newInterval(function(date) {\n\t date.setUTCMinutes(0, 0, 0);\n\t}, function(date, step) {\n\t date.setTime(+date + step * durationHour);\n\t}, function(start, end) {\n\t return (end - start) / durationHour;\n\t}, function(date) {\n\t return date.getUTCHours();\n\t});\n\t\n\tvar utcHours = utcHour.range;\n\t\n\tvar utcDay = newInterval(function(date) {\n\t date.setUTCHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setUTCDate(date.getUTCDate() + step);\n\t}, function(start, end) {\n\t return (end - start) / durationDay;\n\t}, function(date) {\n\t return date.getUTCDate() - 1;\n\t});\n\t\n\tvar utcDays = utcDay.range;\n\t\n\tfunction utcWeekday(i) {\n\t return newInterval(function(date) {\n\t date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n\t date.setUTCHours(0, 0, 0, 0);\n\t }, function(date, step) {\n\t date.setUTCDate(date.getUTCDate() + step * 7);\n\t }, function(start, end) {\n\t return (end - start) / durationWeek;\n\t });\n\t}\n\t\n\tvar utcSunday = utcWeekday(0);\n\tvar utcMonday = utcWeekday(1);\n\tvar utcTuesday = utcWeekday(2);\n\tvar utcWednesday = utcWeekday(3);\n\tvar utcThursday = utcWeekday(4);\n\tvar utcFriday = utcWeekday(5);\n\tvar utcSaturday = utcWeekday(6);\n\t\n\tvar utcSundays = utcSunday.range;\n\tvar utcMondays = utcMonday.range;\n\tvar utcTuesdays = utcTuesday.range;\n\tvar utcWednesdays = utcWednesday.range;\n\tvar utcThursdays = utcThursday.range;\n\tvar utcFridays = utcFriday.range;\n\tvar utcSaturdays = utcSaturday.range;\n\t\n\tvar utcMonth = newInterval(function(date) {\n\t date.setUTCDate(1);\n\t date.setUTCHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setUTCMonth(date.getUTCMonth() + step);\n\t}, function(start, end) {\n\t return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n\t}, function(date) {\n\t return date.getUTCMonth();\n\t});\n\t\n\tvar utcMonths = utcMonth.range;\n\t\n\tvar utcYear = newInterval(function(date) {\n\t date.setUTCMonth(0, 1);\n\t date.setUTCHours(0, 0, 0, 0);\n\t}, function(date, step) {\n\t date.setUTCFullYear(date.getUTCFullYear() + step);\n\t}, function(start, end) {\n\t return end.getUTCFullYear() - start.getUTCFullYear();\n\t}, function(date) {\n\t return date.getUTCFullYear();\n\t});\n\t\n\t// An optimized implementation for this simple case.\n\tutcYear.every = function(k) {\n\t return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n\t date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n\t date.setUTCMonth(0, 1);\n\t date.setUTCHours(0, 0, 0, 0);\n\t }, function(date, step) {\n\t date.setUTCFullYear(date.getUTCFullYear() + step * k);\n\t });\n\t};\n\t\n\tvar utcYears = utcYear.range;\n\t\n\texports.timeInterval = newInterval;\n\texports.timeMillisecond = millisecond;\n\texports.timeMilliseconds = milliseconds;\n\texports.utcMillisecond = millisecond;\n\texports.utcMilliseconds = milliseconds;\n\texports.timeSecond = second;\n\texports.timeSeconds = seconds;\n\texports.utcSecond = second;\n\texports.utcSeconds = seconds;\n\texports.timeMinute = minute;\n\texports.timeMinutes = minutes;\n\texports.timeHour = hour;\n\texports.timeHours = hours;\n\texports.timeDay = day;\n\texports.timeDays = days;\n\texports.timeWeek = sunday;\n\texports.timeWeeks = sundays;\n\texports.timeSunday = sunday;\n\texports.timeSundays = sundays;\n\texports.timeMonday = monday;\n\texports.timeMondays = mondays;\n\texports.timeTuesday = tuesday;\n\texports.timeTuesdays = tuesdays;\n\texports.timeWednesday = wednesday;\n\texports.timeWednesdays = wednesdays;\n\texports.timeThursday = thursday;\n\texports.timeThursdays = thursdays;\n\texports.timeFriday = friday;\n\texports.timeFridays = fridays;\n\texports.timeSaturday = saturday;\n\texports.timeSaturdays = saturdays;\n\texports.timeMonth = month;\n\texports.timeMonths = months;\n\texports.timeYear = year;\n\texports.timeYears = years;\n\texports.utcMinute = utcMinute;\n\texports.utcMinutes = utcMinutes;\n\texports.utcHour = utcHour;\n\texports.utcHours = utcHours;\n\texports.utcDay = utcDay;\n\texports.utcDays = utcDays;\n\texports.utcWeek = utcSunday;\n\texports.utcWeeks = utcSundays;\n\texports.utcSunday = utcSunday;\n\texports.utcSundays = utcSundays;\n\texports.utcMonday = utcMonday;\n\texports.utcMondays = utcMondays;\n\texports.utcTuesday = utcTuesday;\n\texports.utcTuesdays = utcTuesdays;\n\texports.utcWednesday = utcWednesday;\n\texports.utcWednesdays = utcWednesdays;\n\texports.utcThursday = utcThursday;\n\texports.utcThursdays = utcThursdays;\n\texports.utcFriday = utcFriday;\n\texports.utcFridays = utcFridays;\n\texports.utcSaturday = utcSaturday;\n\texports.utcSaturdays = utcSaturdays;\n\texports.utcMonth = utcMonth;\n\texports.utcMonths = utcMonths;\n\texports.utcYear = utcYear;\n\texports.utcYears = utcYears;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-time-format/ Version 2.0.5. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(11)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3));\n\t}(this, (function (exports,d3Time) { 'use strict';\n\t\n\tfunction localDate(d) {\n\t if (0 <= d.y && d.y < 100) {\n\t var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n\t date.setFullYear(d.y);\n\t return date;\n\t }\n\t return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n\t}\n\t\n\tfunction utcDate(d) {\n\t if (0 <= d.y && d.y < 100) {\n\t var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n\t date.setUTCFullYear(d.y);\n\t return date;\n\t }\n\t return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n\t}\n\t\n\tfunction newYear(y) {\n\t return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n\t}\n\t\n\tfunction formatLocale(locale) {\n\t var locale_dateTime = locale.dateTime,\n\t locale_date = locale.date,\n\t locale_time = locale.time,\n\t locale_periods = locale.periods,\n\t locale_weekdays = locale.days,\n\t locale_shortWeekdays = locale.shortDays,\n\t locale_months = locale.months,\n\t locale_shortMonths = locale.shortMonths;\n\t\n\t var periodRe = formatRe(locale_periods),\n\t periodLookup = formatLookup(locale_periods),\n\t weekdayRe = formatRe(locale_weekdays),\n\t weekdayLookup = formatLookup(locale_weekdays),\n\t shortWeekdayRe = formatRe(locale_shortWeekdays),\n\t shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n\t monthRe = formatRe(locale_months),\n\t monthLookup = formatLookup(locale_months),\n\t shortMonthRe = formatRe(locale_shortMonths),\n\t shortMonthLookup = formatLookup(locale_shortMonths);\n\t\n\t var formats = {\n\t \"a\": formatShortWeekday,\n\t \"A\": formatWeekday,\n\t \"b\": formatShortMonth,\n\t \"B\": formatMonth,\n\t \"c\": null,\n\t \"d\": formatDayOfMonth,\n\t \"e\": formatDayOfMonth,\n\t \"H\": formatHour24,\n\t \"I\": formatHour12,\n\t \"j\": formatDayOfYear,\n\t \"L\": formatMilliseconds,\n\t \"m\": formatMonthNumber,\n\t \"M\": formatMinutes,\n\t \"p\": formatPeriod,\n\t \"S\": formatSeconds,\n\t \"U\": formatWeekNumberSunday,\n\t \"w\": formatWeekdayNumber,\n\t \"W\": formatWeekNumberMonday,\n\t \"x\": null,\n\t \"X\": null,\n\t \"y\": formatYear,\n\t \"Y\": formatFullYear,\n\t \"Z\": formatZone,\n\t \"%\": formatLiteralPercent\n\t };\n\t\n\t var utcFormats = {\n\t \"a\": formatUTCShortWeekday,\n\t \"A\": formatUTCWeekday,\n\t \"b\": formatUTCShortMonth,\n\t \"B\": formatUTCMonth,\n\t \"c\": null,\n\t \"d\": formatUTCDayOfMonth,\n\t \"e\": formatUTCDayOfMonth,\n\t \"H\": formatUTCHour24,\n\t \"I\": formatUTCHour12,\n\t \"j\": formatUTCDayOfYear,\n\t \"L\": formatUTCMilliseconds,\n\t \"m\": formatUTCMonthNumber,\n\t \"M\": formatUTCMinutes,\n\t \"p\": formatUTCPeriod,\n\t \"S\": formatUTCSeconds,\n\t \"U\": formatUTCWeekNumberSunday,\n\t \"w\": formatUTCWeekdayNumber,\n\t \"W\": formatUTCWeekNumberMonday,\n\t \"x\": null,\n\t \"X\": null,\n\t \"y\": formatUTCYear,\n\t \"Y\": formatUTCFullYear,\n\t \"Z\": formatUTCZone,\n\t \"%\": formatLiteralPercent\n\t };\n\t\n\t var parses = {\n\t \"a\": parseShortWeekday,\n\t \"A\": parseWeekday,\n\t \"b\": parseShortMonth,\n\t \"B\": parseMonth,\n\t \"c\": parseLocaleDateTime,\n\t \"d\": parseDayOfMonth,\n\t \"e\": parseDayOfMonth,\n\t \"H\": parseHour24,\n\t \"I\": parseHour24,\n\t \"j\": parseDayOfYear,\n\t \"L\": parseMilliseconds,\n\t \"m\": parseMonthNumber,\n\t \"M\": parseMinutes,\n\t \"p\": parsePeriod,\n\t \"S\": parseSeconds,\n\t \"U\": parseWeekNumberSunday,\n\t \"w\": parseWeekdayNumber,\n\t \"W\": parseWeekNumberMonday,\n\t \"x\": parseLocaleDate,\n\t \"X\": parseLocaleTime,\n\t \"y\": parseYear,\n\t \"Y\": parseFullYear,\n\t \"Z\": parseZone,\n\t \"%\": parseLiteralPercent\n\t };\n\t\n\t // These recursive directive definitions must be deferred.\n\t formats.x = newFormat(locale_date, formats);\n\t formats.X = newFormat(locale_time, formats);\n\t formats.c = newFormat(locale_dateTime, formats);\n\t utcFormats.x = newFormat(locale_date, utcFormats);\n\t utcFormats.X = newFormat(locale_time, utcFormats);\n\t utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\t\n\t function newFormat(specifier, formats) {\n\t return function(date) {\n\t var string = [],\n\t i = -1,\n\t j = 0,\n\t n = specifier.length,\n\t c,\n\t pad,\n\t format;\n\t\n\t if (!(date instanceof Date)) date = new Date(+date);\n\t\n\t while (++i < n) {\n\t if (specifier.charCodeAt(i) === 37) {\n\t string.push(specifier.slice(j, i));\n\t if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n\t else pad = c === \"e\" ? \" \" : \"0\";\n\t if (format = formats[c]) c = format(date, pad);\n\t string.push(c);\n\t j = i + 1;\n\t }\n\t }\n\t\n\t string.push(specifier.slice(j, i));\n\t return string.join(\"\");\n\t };\n\t }\n\t\n\t function newParse(specifier, newDate) {\n\t return function(string) {\n\t var d = newYear(1900),\n\t i = parseSpecifier(d, specifier, string += \"\", 0);\n\t if (i != string.length) return null;\n\t\n\t // The am-pm flag is 0 for AM, and 1 for PM.\n\t if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\t\n\t // Convert day-of-week and week-of-year to day-of-year.\n\t if (\"W\" in d || \"U\" in d) {\n\t if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n\t var day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n\t d.m = 0;\n\t d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n\t }\n\t\n\t // If a time zone is specified, all fields are interpreted as UTC and then\n\t // offset according to the specified time zone.\n\t if (\"Z\" in d) {\n\t d.H += d.Z / 100 | 0;\n\t d.M += d.Z % 100;\n\t return utcDate(d);\n\t }\n\t\n\t // Otherwise, all fields are in local time.\n\t return newDate(d);\n\t };\n\t }\n\t\n\t function parseSpecifier(d, specifier, string, j) {\n\t var i = 0,\n\t n = specifier.length,\n\t m = string.length,\n\t c,\n\t parse;\n\t\n\t while (i < n) {\n\t if (j >= m) return -1;\n\t c = specifier.charCodeAt(i++);\n\t if (c === 37) {\n\t c = specifier.charAt(i++);\n\t parse = parses[c in pads ? specifier.charAt(i++) : c];\n\t if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n\t } else if (c != string.charCodeAt(j++)) {\n\t return -1;\n\t }\n\t }\n\t\n\t return j;\n\t }\n\t\n\t function parsePeriod(d, string, i) {\n\t var n = periodRe.exec(string.slice(i));\n\t return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n\t }\n\t\n\t function parseShortWeekday(d, string, i) {\n\t var n = shortWeekdayRe.exec(string.slice(i));\n\t return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n\t }\n\t\n\t function parseWeekday(d, string, i) {\n\t var n = weekdayRe.exec(string.slice(i));\n\t return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n\t }\n\t\n\t function parseShortMonth(d, string, i) {\n\t var n = shortMonthRe.exec(string.slice(i));\n\t return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n\t }\n\t\n\t function parseMonth(d, string, i) {\n\t var n = monthRe.exec(string.slice(i));\n\t return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n\t }\n\t\n\t function parseLocaleDateTime(d, string, i) {\n\t return parseSpecifier(d, locale_dateTime, string, i);\n\t }\n\t\n\t function parseLocaleDate(d, string, i) {\n\t return parseSpecifier(d, locale_date, string, i);\n\t }\n\t\n\t function parseLocaleTime(d, string, i) {\n\t return parseSpecifier(d, locale_time, string, i);\n\t }\n\t\n\t function formatShortWeekday(d) {\n\t return locale_shortWeekdays[d.getDay()];\n\t }\n\t\n\t function formatWeekday(d) {\n\t return locale_weekdays[d.getDay()];\n\t }\n\t\n\t function formatShortMonth(d) {\n\t return locale_shortMonths[d.getMonth()];\n\t }\n\t\n\t function formatMonth(d) {\n\t return locale_months[d.getMonth()];\n\t }\n\t\n\t function formatPeriod(d) {\n\t return locale_periods[+(d.getHours() >= 12)];\n\t }\n\t\n\t function formatUTCShortWeekday(d) {\n\t return locale_shortWeekdays[d.getUTCDay()];\n\t }\n\t\n\t function formatUTCWeekday(d) {\n\t return locale_weekdays[d.getUTCDay()];\n\t }\n\t\n\t function formatUTCShortMonth(d) {\n\t return locale_shortMonths[d.getUTCMonth()];\n\t }\n\t\n\t function formatUTCMonth(d) {\n\t return locale_months[d.getUTCMonth()];\n\t }\n\t\n\t function formatUTCPeriod(d) {\n\t return locale_periods[+(d.getUTCHours() >= 12)];\n\t }\n\t\n\t return {\n\t format: function(specifier) {\n\t var f = newFormat(specifier += \"\", formats);\n\t f.toString = function() { return specifier; };\n\t return f;\n\t },\n\t parse: function(specifier) {\n\t var p = newParse(specifier += \"\", localDate);\n\t p.toString = function() { return specifier; };\n\t return p;\n\t },\n\t utcFormat: function(specifier) {\n\t var f = newFormat(specifier += \"\", utcFormats);\n\t f.toString = function() { return specifier; };\n\t return f;\n\t },\n\t utcParse: function(specifier) {\n\t var p = newParse(specifier, utcDate);\n\t p.toString = function() { return specifier; };\n\t return p;\n\t }\n\t };\n\t}\n\t\n\tvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"};\n\tvar numberRe = /^\\s*\\d+/;\n\tvar percentRe = /^%/;\n\tvar requoteRe = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n\t\n\tfunction pad(value, fill, width) {\n\t var sign = value < 0 ? \"-\" : \"\",\n\t string = (sign ? -value : value) + \"\",\n\t length = string.length;\n\t return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n\t}\n\t\n\tfunction requote(s) {\n\t return s.replace(requoteRe, \"\\\\$&\");\n\t}\n\t\n\tfunction formatRe(names) {\n\t return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n\t}\n\t\n\tfunction formatLookup(names) {\n\t var map = {}, i = -1, n = names.length;\n\t while (++i < n) map[names[i].toLowerCase()] = i;\n\t return map;\n\t}\n\t\n\tfunction parseWeekdayNumber(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 1));\n\t return n ? (d.w = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseWeekNumberSunday(d, string, i) {\n\t var n = numberRe.exec(string.slice(i));\n\t return n ? (d.U = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseWeekNumberMonday(d, string, i) {\n\t var n = numberRe.exec(string.slice(i));\n\t return n ? (d.W = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseFullYear(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 4));\n\t return n ? (d.y = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseYear(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseZone(d, string, i) {\n\t var n = /^(Z)|([+-]\\d\\d)(?:\\:?(\\d\\d))?/.exec(string.slice(i, i + 6));\n\t return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseMonthNumber(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseDayOfMonth(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.d = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseDayOfYear(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 3));\n\t return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseHour24(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.H = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseMinutes(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.M = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseSeconds(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 2));\n\t return n ? (d.S = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseMilliseconds(d, string, i) {\n\t var n = numberRe.exec(string.slice(i, i + 3));\n\t return n ? (d.L = +n[0], i + n[0].length) : -1;\n\t}\n\t\n\tfunction parseLiteralPercent(d, string, i) {\n\t var n = percentRe.exec(string.slice(i, i + 1));\n\t return n ? i + n[0].length : -1;\n\t}\n\t\n\tfunction formatDayOfMonth(d, p) {\n\t return pad(d.getDate(), p, 2);\n\t}\n\t\n\tfunction formatHour24(d, p) {\n\t return pad(d.getHours(), p, 2);\n\t}\n\t\n\tfunction formatHour12(d, p) {\n\t return pad(d.getHours() % 12 || 12, p, 2);\n\t}\n\t\n\tfunction formatDayOfYear(d, p) {\n\t return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3);\n\t}\n\t\n\tfunction formatMilliseconds(d, p) {\n\t return pad(d.getMilliseconds(), p, 3);\n\t}\n\t\n\tfunction formatMonthNumber(d, p) {\n\t return pad(d.getMonth() + 1, p, 2);\n\t}\n\t\n\tfunction formatMinutes(d, p) {\n\t return pad(d.getMinutes(), p, 2);\n\t}\n\t\n\tfunction formatSeconds(d, p) {\n\t return pad(d.getSeconds(), p, 2);\n\t}\n\t\n\tfunction formatWeekNumberSunday(d, p) {\n\t return pad(d3Time.timeSunday.count(d3Time.timeYear(d), d), p, 2);\n\t}\n\t\n\tfunction formatWeekdayNumber(d) {\n\t return d.getDay();\n\t}\n\t\n\tfunction formatWeekNumberMonday(d, p) {\n\t return pad(d3Time.timeMonday.count(d3Time.timeYear(d), d), p, 2);\n\t}\n\t\n\tfunction formatYear(d, p) {\n\t return pad(d.getFullYear() % 100, p, 2);\n\t}\n\t\n\tfunction formatFullYear(d, p) {\n\t return pad(d.getFullYear() % 10000, p, 4);\n\t}\n\t\n\tfunction formatZone(d) {\n\t var z = d.getTimezoneOffset();\n\t return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n\t + pad(z / 60 | 0, \"0\", 2)\n\t + pad(z % 60, \"0\", 2);\n\t}\n\t\n\tfunction formatUTCDayOfMonth(d, p) {\n\t return pad(d.getUTCDate(), p, 2);\n\t}\n\t\n\tfunction formatUTCHour24(d, p) {\n\t return pad(d.getUTCHours(), p, 2);\n\t}\n\t\n\tfunction formatUTCHour12(d, p) {\n\t return pad(d.getUTCHours() % 12 || 12, p, 2);\n\t}\n\t\n\tfunction formatUTCDayOfYear(d, p) {\n\t return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3);\n\t}\n\t\n\tfunction formatUTCMilliseconds(d, p) {\n\t return pad(d.getUTCMilliseconds(), p, 3);\n\t}\n\t\n\tfunction formatUTCMonthNumber(d, p) {\n\t return pad(d.getUTCMonth() + 1, p, 2);\n\t}\n\t\n\tfunction formatUTCMinutes(d, p) {\n\t return pad(d.getUTCMinutes(), p, 2);\n\t}\n\t\n\tfunction formatUTCSeconds(d, p) {\n\t return pad(d.getUTCSeconds(), p, 2);\n\t}\n\t\n\tfunction formatUTCWeekNumberSunday(d, p) {\n\t return pad(d3Time.utcSunday.count(d3Time.utcYear(d), d), p, 2);\n\t}\n\t\n\tfunction formatUTCWeekdayNumber(d) {\n\t return d.getUTCDay();\n\t}\n\t\n\tfunction formatUTCWeekNumberMonday(d, p) {\n\t return pad(d3Time.utcMonday.count(d3Time.utcYear(d), d), p, 2);\n\t}\n\t\n\tfunction formatUTCYear(d, p) {\n\t return pad(d.getUTCFullYear() % 100, p, 2);\n\t}\n\t\n\tfunction formatUTCFullYear(d, p) {\n\t return pad(d.getUTCFullYear() % 10000, p, 4);\n\t}\n\t\n\tfunction formatUTCZone() {\n\t return \"+0000\";\n\t}\n\t\n\tfunction formatLiteralPercent() {\n\t return \"%\";\n\t}\n\t\n\tvar locale$1;\n\t\n\t\n\t\n\t\n\t\n\tdefaultLocale({\n\t dateTime: \"%x, %X\",\n\t date: \"%-m/%-d/%Y\",\n\t time: \"%-I:%M:%S %p\",\n\t periods: [\"AM\", \"PM\"],\n\t days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n\t months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\t});\n\t\n\tfunction defaultLocale(definition) {\n\t locale$1 = formatLocale(definition);\n\t exports.timeFormat = locale$1.format;\n\t exports.timeParse = locale$1.parse;\n\t exports.utcFormat = locale$1.utcFormat;\n\t exports.utcParse = locale$1.utcParse;\n\t return locale$1;\n\t}\n\t\n\tvar isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\t\n\tfunction formatIsoNative(date) {\n\t return date.toISOString();\n\t}\n\t\n\tvar formatIso = Date.prototype.toISOString\n\t ? formatIsoNative\n\t : exports.utcFormat(isoSpecifier);\n\t\n\tfunction parseIsoNative(string) {\n\t var date = new Date(string);\n\t return isNaN(date) ? null : date;\n\t}\n\t\n\tvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n\t ? parseIsoNative\n\t : exports.utcParse(isoSpecifier);\n\t\n\texports.timeFormatDefaultLocale = defaultLocale;\n\texports.timeFormatLocale = formatLocale;\n\texports.isoFormat = formatIso;\n\texports.isoParse = parseIso;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-selection/ Version 1.1.0. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar xhtml = \"http://www.w3.org/1999/xhtml\";\n\t\n\tvar namespaces = {\n\t svg: \"http://www.w3.org/2000/svg\",\n\t xhtml: xhtml,\n\t xlink: \"http://www.w3.org/1999/xlink\",\n\t xml: \"http://www.w3.org/XML/1998/namespace\",\n\t xmlns: \"http://www.w3.org/2000/xmlns/\"\n\t};\n\t\n\tvar namespace = function(name) {\n\t var prefix = name += \"\", i = prefix.indexOf(\":\");\n\t if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n\t return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n\t};\n\t\n\tfunction creatorInherit(name) {\n\t return function() {\n\t var document = this.ownerDocument,\n\t uri = this.namespaceURI;\n\t return uri === xhtml && document.documentElement.namespaceURI === xhtml\n\t ? document.createElement(name)\n\t : document.createElementNS(uri, name);\n\t };\n\t}\n\t\n\tfunction creatorFixed(fullname) {\n\t return function() {\n\t return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n\t };\n\t}\n\t\n\tvar creator = function(name) {\n\t var fullname = namespace(name);\n\t return (fullname.local\n\t ? creatorFixed\n\t : creatorInherit)(fullname);\n\t};\n\t\n\tvar nextId = 0;\n\t\n\tfunction local() {\n\t return new Local;\n\t}\n\t\n\tfunction Local() {\n\t this._ = \"@\" + (++nextId).toString(36);\n\t}\n\t\n\tLocal.prototype = local.prototype = {\n\t constructor: Local,\n\t get: function(node) {\n\t var id = this._;\n\t while (!(id in node)) if (!(node = node.parentNode)) return;\n\t return node[id];\n\t },\n\t set: function(node, value) {\n\t return node[this._] = value;\n\t },\n\t remove: function(node) {\n\t return this._ in node && delete node[this._];\n\t },\n\t toString: function() {\n\t return this._;\n\t }\n\t};\n\t\n\tvar matcher = function(selector) {\n\t return function() {\n\t return this.matches(selector);\n\t };\n\t};\n\t\n\tif (typeof document !== \"undefined\") {\n\t var element = document.documentElement;\n\t if (!element.matches) {\n\t var vendorMatches = element.webkitMatchesSelector\n\t || element.msMatchesSelector\n\t || element.mozMatchesSelector\n\t || element.oMatchesSelector;\n\t matcher = function(selector) {\n\t return function() {\n\t return vendorMatches.call(this, selector);\n\t };\n\t };\n\t }\n\t}\n\t\n\tvar matcher$1 = matcher;\n\t\n\tvar filterEvents = {};\n\t\n\texports.event = null;\n\t\n\tif (typeof document !== \"undefined\") {\n\t var element$1 = document.documentElement;\n\t if (!(\"onmouseenter\" in element$1)) {\n\t filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n\t }\n\t}\n\t\n\tfunction filterContextListener(listener, index, group) {\n\t listener = contextListener(listener, index, group);\n\t return function(event) {\n\t var related = event.relatedTarget;\n\t if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n\t listener.call(this, event);\n\t }\n\t };\n\t}\n\t\n\tfunction contextListener(listener, index, group) {\n\t return function(event1) {\n\t var event0 = exports.event; // Events can be reentrant (e.g., focus).\n\t exports.event = event1;\n\t try {\n\t listener.call(this, this.__data__, index, group);\n\t } finally {\n\t exports.event = event0;\n\t }\n\t };\n\t}\n\t\n\tfunction parseTypenames(typenames) {\n\t return typenames.trim().split(/^|\\s+/).map(function(t) {\n\t var name = \"\", i = t.indexOf(\".\");\n\t if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n\t return {type: t, name: name};\n\t });\n\t}\n\t\n\tfunction onRemove(typename) {\n\t return function() {\n\t var on = this.__on;\n\t if (!on) return;\n\t for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n\t if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n\t this.removeEventListener(o.type, o.listener, o.capture);\n\t } else {\n\t on[++i] = o;\n\t }\n\t }\n\t if (++i) on.length = i;\n\t else delete this.__on;\n\t };\n\t}\n\t\n\tfunction onAdd(typename, value, capture) {\n\t var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n\t return function(d, i, group) {\n\t var on = this.__on, o, listener = wrap(value, i, group);\n\t if (on) for (var j = 0, m = on.length; j < m; ++j) {\n\t if ((o = on[j]).type === typename.type && o.name === typename.name) {\n\t this.removeEventListener(o.type, o.listener, o.capture);\n\t this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n\t o.value = value;\n\t return;\n\t }\n\t }\n\t this.addEventListener(typename.type, listener, capture);\n\t o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n\t if (!on) this.__on = [o];\n\t else on.push(o);\n\t };\n\t}\n\t\n\tvar selection_on = function(typename, value, capture) {\n\t var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\t\n\t if (arguments.length < 2) {\n\t var on = this.node().__on;\n\t if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n\t for (i = 0, o = on[j]; i < n; ++i) {\n\t if ((t = typenames[i]).type === o.type && t.name === o.name) {\n\t return o.value;\n\t }\n\t }\n\t }\n\t return;\n\t }\n\t\n\t on = value ? onAdd : onRemove;\n\t if (capture == null) capture = false;\n\t for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n\t return this;\n\t};\n\t\n\tfunction customEvent(event1, listener, that, args) {\n\t var event0 = exports.event;\n\t event1.sourceEvent = exports.event;\n\t exports.event = event1;\n\t try {\n\t return listener.apply(that, args);\n\t } finally {\n\t exports.event = event0;\n\t }\n\t}\n\t\n\tvar sourceEvent = function() {\n\t var current = exports.event, source;\n\t while (source = current.sourceEvent) current = source;\n\t return current;\n\t};\n\t\n\tvar point = function(node, event) {\n\t var svg = node.ownerSVGElement || node;\n\t\n\t if (svg.createSVGPoint) {\n\t var point = svg.createSVGPoint();\n\t point.x = event.clientX, point.y = event.clientY;\n\t point = point.matrixTransform(node.getScreenCTM().inverse());\n\t return [point.x, point.y];\n\t }\n\t\n\t var rect = node.getBoundingClientRect();\n\t return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n\t};\n\t\n\tvar mouse = function(node) {\n\t var event = sourceEvent();\n\t if (event.changedTouches) event = event.changedTouches[0];\n\t return point(node, event);\n\t};\n\t\n\tfunction none() {}\n\t\n\tvar selector = function(selector) {\n\t return selector == null ? none : function() {\n\t return this.querySelector(selector);\n\t };\n\t};\n\t\n\tvar selection_select = function(select) {\n\t if (typeof select !== \"function\") select = selector(select);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n\t if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n\t if (\"__data__\" in node) subnode.__data__ = node.__data__;\n\t subgroup[i] = subnode;\n\t }\n\t }\n\t }\n\t\n\t return new Selection(subgroups, this._parents);\n\t};\n\t\n\tfunction empty() {\n\t return [];\n\t}\n\t\n\tvar selectorAll = function(selector) {\n\t return selector == null ? empty : function() {\n\t return this.querySelectorAll(selector);\n\t };\n\t};\n\t\n\tvar selection_selectAll = function(select) {\n\t if (typeof select !== \"function\") select = selectorAll(select);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n\t if (node = group[i]) {\n\t subgroups.push(select.call(node, node.__data__, i, group));\n\t parents.push(node);\n\t }\n\t }\n\t }\n\t\n\t return new Selection(subgroups, parents);\n\t};\n\t\n\tvar selection_filter = function(match) {\n\t if (typeof match !== \"function\") match = matcher$1(match);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n\t if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n\t subgroup.push(node);\n\t }\n\t }\n\t }\n\t\n\t return new Selection(subgroups, this._parents);\n\t};\n\t\n\tvar sparse = function(update) {\n\t return new Array(update.length);\n\t};\n\t\n\tvar selection_enter = function() {\n\t return new Selection(this._enter || this._groups.map(sparse), this._parents);\n\t};\n\t\n\tfunction EnterNode(parent, datum) {\n\t this.ownerDocument = parent.ownerDocument;\n\t this.namespaceURI = parent.namespaceURI;\n\t this._next = null;\n\t this._parent = parent;\n\t this.__data__ = datum;\n\t}\n\t\n\tEnterNode.prototype = {\n\t constructor: EnterNode,\n\t appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n\t insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n\t querySelector: function(selector) { return this._parent.querySelector(selector); },\n\t querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n\t};\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\t\n\tfunction bindIndex(parent, group, enter, update, exit, data) {\n\t var i = 0,\n\t node,\n\t groupLength = group.length,\n\t dataLength = data.length;\n\t\n\t // Put any non-null nodes that fit into update.\n\t // Put any null nodes into enter.\n\t // Put any remaining data into enter.\n\t for (; i < dataLength; ++i) {\n\t if (node = group[i]) {\n\t node.__data__ = data[i];\n\t update[i] = node;\n\t } else {\n\t enter[i] = new EnterNode(parent, data[i]);\n\t }\n\t }\n\t\n\t // Put any non-null nodes that don’t fit into exit.\n\t for (; i < groupLength; ++i) {\n\t if (node = group[i]) {\n\t exit[i] = node;\n\t }\n\t }\n\t}\n\t\n\tfunction bindKey(parent, group, enter, update, exit, data, key) {\n\t var i,\n\t node,\n\t nodeByKeyValue = {},\n\t groupLength = group.length,\n\t dataLength = data.length,\n\t keyValues = new Array(groupLength),\n\t keyValue;\n\t\n\t // Compute the key for each node.\n\t // If multiple nodes have the same key, the duplicates are added to exit.\n\t for (i = 0; i < groupLength; ++i) {\n\t if (node = group[i]) {\n\t keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n\t if (keyValue in nodeByKeyValue) {\n\t exit[i] = node;\n\t } else {\n\t nodeByKeyValue[keyValue] = node;\n\t }\n\t }\n\t }\n\t\n\t // Compute the key for each datum.\n\t // If there a node associated with this key, join and add it to update.\n\t // If there is not (or the key is a duplicate), add it to enter.\n\t for (i = 0; i < dataLength; ++i) {\n\t keyValue = keyPrefix + key.call(parent, data[i], i, data);\n\t if (node = nodeByKeyValue[keyValue]) {\n\t update[i] = node;\n\t node.__data__ = data[i];\n\t nodeByKeyValue[keyValue] = null;\n\t } else {\n\t enter[i] = new EnterNode(parent, data[i]);\n\t }\n\t }\n\t\n\t // Add any remaining nodes that were not bound to data to exit.\n\t for (i = 0; i < groupLength; ++i) {\n\t if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n\t exit[i] = node;\n\t }\n\t }\n\t}\n\t\n\tvar selection_data = function(value, key) {\n\t if (!value) {\n\t data = new Array(this.size()), j = -1;\n\t this.each(function(d) { data[++j] = d; });\n\t return data;\n\t }\n\t\n\t var bind = key ? bindKey : bindIndex,\n\t parents = this._parents,\n\t groups = this._groups;\n\t\n\t if (typeof value !== \"function\") value = constant(value);\n\t\n\t for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n\t var parent = parents[j],\n\t group = groups[j],\n\t groupLength = group.length,\n\t data = value.call(parent, parent && parent.__data__, j, parents),\n\t dataLength = data.length,\n\t enterGroup = enter[j] = new Array(dataLength),\n\t updateGroup = update[j] = new Array(dataLength),\n\t exitGroup = exit[j] = new Array(groupLength);\n\t\n\t bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\t\n\t // Now connect the enter nodes to their following update node, such that\n\t // appendChild can insert the materialized enter node before this node,\n\t // rather than at the end of the parent node.\n\t for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n\t if (previous = enterGroup[i0]) {\n\t if (i0 >= i1) i1 = i0 + 1;\n\t while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n\t previous._next = next || null;\n\t }\n\t }\n\t }\n\t\n\t update = new Selection(update, parents);\n\t update._enter = enter;\n\t update._exit = exit;\n\t return update;\n\t};\n\t\n\tvar selection_exit = function() {\n\t return new Selection(this._exit || this._groups.map(sparse), this._parents);\n\t};\n\t\n\tvar selection_merge = function(selection) {\n\t\n\t for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n\t for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n\t if (node = group0[i] || group1[i]) {\n\t merge[i] = node;\n\t }\n\t }\n\t }\n\t\n\t for (; j < m0; ++j) {\n\t merges[j] = groups0[j];\n\t }\n\t\n\t return new Selection(merges, this._parents);\n\t};\n\t\n\tvar selection_order = function() {\n\t\n\t for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n\t for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n\t if (node = group[i]) {\n\t if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n\t next = node;\n\t }\n\t }\n\t }\n\t\n\t return this;\n\t};\n\t\n\tvar selection_sort = function(compare) {\n\t if (!compare) compare = ascending;\n\t\n\t function compareNode(a, b) {\n\t return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n\t }\n\t\n\t for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n\t if (node = group[i]) {\n\t sortgroup[i] = node;\n\t }\n\t }\n\t sortgroup.sort(compareNode);\n\t }\n\t\n\t return new Selection(sortgroups, this._parents).order();\n\t};\n\t\n\tfunction ascending(a, b) {\n\t return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n\t}\n\t\n\tvar selection_call = function() {\n\t var callback = arguments[0];\n\t arguments[0] = this;\n\t callback.apply(null, arguments);\n\t return this;\n\t};\n\t\n\tvar selection_nodes = function() {\n\t var nodes = new Array(this.size()), i = -1;\n\t this.each(function() { nodes[++i] = this; });\n\t return nodes;\n\t};\n\t\n\tvar selection_node = function() {\n\t\n\t for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n\t for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n\t var node = group[i];\n\t if (node) return node;\n\t }\n\t }\n\t\n\t return null;\n\t};\n\t\n\tvar selection_size = function() {\n\t var size = 0;\n\t this.each(function() { ++size; });\n\t return size;\n\t};\n\t\n\tvar selection_empty = function() {\n\t return !this.node();\n\t};\n\t\n\tvar selection_each = function(callback) {\n\t\n\t for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n\t for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n\t if (node = group[i]) callback.call(node, node.__data__, i, group);\n\t }\n\t }\n\t\n\t return this;\n\t};\n\t\n\tfunction attrRemove(name) {\n\t return function() {\n\t this.removeAttribute(name);\n\t };\n\t}\n\t\n\tfunction attrRemoveNS(fullname) {\n\t return function() {\n\t this.removeAttributeNS(fullname.space, fullname.local);\n\t };\n\t}\n\t\n\tfunction attrConstant(name, value) {\n\t return function() {\n\t this.setAttribute(name, value);\n\t };\n\t}\n\t\n\tfunction attrConstantNS(fullname, value) {\n\t return function() {\n\t this.setAttributeNS(fullname.space, fullname.local, value);\n\t };\n\t}\n\t\n\tfunction attrFunction(name, value) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t if (v == null) this.removeAttribute(name);\n\t else this.setAttribute(name, v);\n\t };\n\t}\n\t\n\tfunction attrFunctionNS(fullname, value) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n\t else this.setAttributeNS(fullname.space, fullname.local, v);\n\t };\n\t}\n\t\n\tvar selection_attr = function(name, value) {\n\t var fullname = namespace(name);\n\t\n\t if (arguments.length < 2) {\n\t var node = this.node();\n\t return fullname.local\n\t ? node.getAttributeNS(fullname.space, fullname.local)\n\t : node.getAttribute(fullname);\n\t }\n\t\n\t return this.each((value == null\n\t ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n\t ? (fullname.local ? attrFunctionNS : attrFunction)\n\t : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n\t};\n\t\n\tvar defaultView = function(node) {\n\t return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n\t || (node.document && node) // node is a Window\n\t || node.defaultView; // node is a Document\n\t};\n\t\n\tfunction styleRemove(name) {\n\t return function() {\n\t this.style.removeProperty(name);\n\t };\n\t}\n\t\n\tfunction styleConstant(name, value, priority) {\n\t return function() {\n\t this.style.setProperty(name, value, priority);\n\t };\n\t}\n\t\n\tfunction styleFunction(name, value, priority) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t if (v == null) this.style.removeProperty(name);\n\t else this.style.setProperty(name, v, priority);\n\t };\n\t}\n\t\n\tvar selection_style = function(name, value, priority) {\n\t return arguments.length > 1\n\t ? this.each((value == null\n\t ? styleRemove : typeof value === \"function\"\n\t ? styleFunction\n\t : styleConstant)(name, value, priority == null ? \"\" : priority))\n\t : styleValue(this.node(), name);\n\t};\n\t\n\tfunction styleValue(node, name) {\n\t return node.style.getPropertyValue(name)\n\t || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n\t}\n\t\n\tfunction propertyRemove(name) {\n\t return function() {\n\t delete this[name];\n\t };\n\t}\n\t\n\tfunction propertyConstant(name, value) {\n\t return function() {\n\t this[name] = value;\n\t };\n\t}\n\t\n\tfunction propertyFunction(name, value) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t if (v == null) delete this[name];\n\t else this[name] = v;\n\t };\n\t}\n\t\n\tvar selection_property = function(name, value) {\n\t return arguments.length > 1\n\t ? this.each((value == null\n\t ? propertyRemove : typeof value === \"function\"\n\t ? propertyFunction\n\t : propertyConstant)(name, value))\n\t : this.node()[name];\n\t};\n\t\n\tfunction classArray(string) {\n\t return string.trim().split(/^|\\s+/);\n\t}\n\t\n\tfunction classList(node) {\n\t return node.classList || new ClassList(node);\n\t}\n\t\n\tfunction ClassList(node) {\n\t this._node = node;\n\t this._names = classArray(node.getAttribute(\"class\") || \"\");\n\t}\n\t\n\tClassList.prototype = {\n\t add: function(name) {\n\t var i = this._names.indexOf(name);\n\t if (i < 0) {\n\t this._names.push(name);\n\t this._node.setAttribute(\"class\", this._names.join(\" \"));\n\t }\n\t },\n\t remove: function(name) {\n\t var i = this._names.indexOf(name);\n\t if (i >= 0) {\n\t this._names.splice(i, 1);\n\t this._node.setAttribute(\"class\", this._names.join(\" \"));\n\t }\n\t },\n\t contains: function(name) {\n\t return this._names.indexOf(name) >= 0;\n\t }\n\t};\n\t\n\tfunction classedAdd(node, names) {\n\t var list = classList(node), i = -1, n = names.length;\n\t while (++i < n) list.add(names[i]);\n\t}\n\t\n\tfunction classedRemove(node, names) {\n\t var list = classList(node), i = -1, n = names.length;\n\t while (++i < n) list.remove(names[i]);\n\t}\n\t\n\tfunction classedTrue(names) {\n\t return function() {\n\t classedAdd(this, names);\n\t };\n\t}\n\t\n\tfunction classedFalse(names) {\n\t return function() {\n\t classedRemove(this, names);\n\t };\n\t}\n\t\n\tfunction classedFunction(names, value) {\n\t return function() {\n\t (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n\t };\n\t}\n\t\n\tvar selection_classed = function(name, value) {\n\t var names = classArray(name + \"\");\n\t\n\t if (arguments.length < 2) {\n\t var list = classList(this.node()), i = -1, n = names.length;\n\t while (++i < n) if (!list.contains(names[i])) return false;\n\t return true;\n\t }\n\t\n\t return this.each((typeof value === \"function\"\n\t ? classedFunction : value\n\t ? classedTrue\n\t : classedFalse)(names, value));\n\t};\n\t\n\tfunction textRemove() {\n\t this.textContent = \"\";\n\t}\n\t\n\tfunction textConstant(value) {\n\t return function() {\n\t this.textContent = value;\n\t };\n\t}\n\t\n\tfunction textFunction(value) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t this.textContent = v == null ? \"\" : v;\n\t };\n\t}\n\t\n\tvar selection_text = function(value) {\n\t return arguments.length\n\t ? this.each(value == null\n\t ? textRemove : (typeof value === \"function\"\n\t ? textFunction\n\t : textConstant)(value))\n\t : this.node().textContent;\n\t};\n\t\n\tfunction htmlRemove() {\n\t this.innerHTML = \"\";\n\t}\n\t\n\tfunction htmlConstant(value) {\n\t return function() {\n\t this.innerHTML = value;\n\t };\n\t}\n\t\n\tfunction htmlFunction(value) {\n\t return function() {\n\t var v = value.apply(this, arguments);\n\t this.innerHTML = v == null ? \"\" : v;\n\t };\n\t}\n\t\n\tvar selection_html = function(value) {\n\t return arguments.length\n\t ? this.each(value == null\n\t ? htmlRemove : (typeof value === \"function\"\n\t ? htmlFunction\n\t : htmlConstant)(value))\n\t : this.node().innerHTML;\n\t};\n\t\n\tfunction raise() {\n\t if (this.nextSibling) this.parentNode.appendChild(this);\n\t}\n\t\n\tvar selection_raise = function() {\n\t return this.each(raise);\n\t};\n\t\n\tfunction lower() {\n\t if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n\t}\n\t\n\tvar selection_lower = function() {\n\t return this.each(lower);\n\t};\n\t\n\tvar selection_append = function(name) {\n\t var create = typeof name === \"function\" ? name : creator(name);\n\t return this.select(function() {\n\t return this.appendChild(create.apply(this, arguments));\n\t });\n\t};\n\t\n\tfunction constantNull() {\n\t return null;\n\t}\n\t\n\tvar selection_insert = function(name, before) {\n\t var create = typeof name === \"function\" ? name : creator(name),\n\t select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n\t return this.select(function() {\n\t return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n\t });\n\t};\n\t\n\tfunction remove() {\n\t var parent = this.parentNode;\n\t if (parent) parent.removeChild(this);\n\t}\n\t\n\tvar selection_remove = function() {\n\t return this.each(remove);\n\t};\n\t\n\tvar selection_datum = function(value) {\n\t return arguments.length\n\t ? this.property(\"__data__\", value)\n\t : this.node().__data__;\n\t};\n\t\n\tfunction dispatchEvent(node, type, params) {\n\t var window = defaultView(node),\n\t event = window.CustomEvent;\n\t\n\t if (typeof event === \"function\") {\n\t event = new event(type, params);\n\t } else {\n\t event = window.document.createEvent(\"Event\");\n\t if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n\t else event.initEvent(type, false, false);\n\t }\n\t\n\t node.dispatchEvent(event);\n\t}\n\t\n\tfunction dispatchConstant(type, params) {\n\t return function() {\n\t return dispatchEvent(this, type, params);\n\t };\n\t}\n\t\n\tfunction dispatchFunction(type, params) {\n\t return function() {\n\t return dispatchEvent(this, type, params.apply(this, arguments));\n\t };\n\t}\n\t\n\tvar selection_dispatch = function(type, params) {\n\t return this.each((typeof params === \"function\"\n\t ? dispatchFunction\n\t : dispatchConstant)(type, params));\n\t};\n\t\n\tvar root = [null];\n\t\n\tfunction Selection(groups, parents) {\n\t this._groups = groups;\n\t this._parents = parents;\n\t}\n\t\n\tfunction selection() {\n\t return new Selection([[document.documentElement]], root);\n\t}\n\t\n\tSelection.prototype = selection.prototype = {\n\t constructor: Selection,\n\t select: selection_select,\n\t selectAll: selection_selectAll,\n\t filter: selection_filter,\n\t data: selection_data,\n\t enter: selection_enter,\n\t exit: selection_exit,\n\t merge: selection_merge,\n\t order: selection_order,\n\t sort: selection_sort,\n\t call: selection_call,\n\t nodes: selection_nodes,\n\t node: selection_node,\n\t size: selection_size,\n\t empty: selection_empty,\n\t each: selection_each,\n\t attr: selection_attr,\n\t style: selection_style,\n\t property: selection_property,\n\t classed: selection_classed,\n\t text: selection_text,\n\t html: selection_html,\n\t raise: selection_raise,\n\t lower: selection_lower,\n\t append: selection_append,\n\t insert: selection_insert,\n\t remove: selection_remove,\n\t datum: selection_datum,\n\t on: selection_on,\n\t dispatch: selection_dispatch\n\t};\n\t\n\tvar select = function(selector) {\n\t return typeof selector === \"string\"\n\t ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n\t : new Selection([[selector]], root);\n\t};\n\t\n\tvar selectAll = function(selector) {\n\t return typeof selector === \"string\"\n\t ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n\t : new Selection([selector == null ? [] : selector], root);\n\t};\n\t\n\tvar touch = function(node, touches, identifier) {\n\t if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n\t\n\t for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n\t if ((touch = touches[i]).identifier === identifier) {\n\t return point(node, touch);\n\t }\n\t }\n\t\n\t return null;\n\t};\n\t\n\tvar touches = function(node, touches) {\n\t if (touches == null) touches = sourceEvent().touches;\n\t\n\t for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\n\t points[i] = point(node, touches[i]);\n\t }\n\t\n\t return points;\n\t};\n\t\n\texports.creator = creator;\n\texports.local = local;\n\texports.matcher = matcher$1;\n\texports.mouse = mouse;\n\texports.namespace = namespace;\n\texports.namespaces = namespaces;\n\texports.select = select;\n\texports.selectAll = selectAll;\n\texports.selection = selection;\n\texports.selector = selector;\n\texports.selectorAll = selectorAll;\n\texports.style = styleValue;\n\texports.touch = touch;\n\texports.touches = touches;\n\texports.window = defaultView;\n\texports.customEvent = customEvent;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-transition/ Version 1.1.0. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(13), __webpack_require__(6), __webpack_require__(15), __webpack_require__(10), __webpack_require__(5), __webpack_require__(3)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));\n\t}(this, (function (exports,d3Selection,d3Dispatch,d3Timer,d3Interpolate,d3Color,d3Ease) { 'use strict';\n\t\n\tvar emptyOn = d3Dispatch.dispatch(\"start\", \"end\", \"interrupt\");\n\tvar emptyTween = [];\n\t\n\tvar CREATED = 0;\n\tvar SCHEDULED = 1;\n\tvar STARTING = 2;\n\tvar STARTED = 3;\n\tvar RUNNING = 4;\n\tvar ENDING = 5;\n\tvar ENDED = 6;\n\t\n\tvar schedule = function(node, name, id, index, group, timing) {\n\t var schedules = node.__transition;\n\t if (!schedules) node.__transition = {};\n\t else if (id in schedules) return;\n\t create(node, id, {\n\t name: name,\n\t index: index, // For context during callback.\n\t group: group, // For context during callback.\n\t on: emptyOn,\n\t tween: emptyTween,\n\t time: timing.time,\n\t delay: timing.delay,\n\t duration: timing.duration,\n\t ease: timing.ease,\n\t timer: null,\n\t state: CREATED\n\t });\n\t};\n\t\n\tfunction init(node, id) {\n\t var schedule = node.__transition;\n\t if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error(\"too late\");\n\t return schedule;\n\t}\n\t\n\tfunction set(node, id) {\n\t var schedule = node.__transition;\n\t if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error(\"too late\");\n\t return schedule;\n\t}\n\t\n\tfunction get(node, id) {\n\t var schedule = node.__transition;\n\t if (!schedule || !(schedule = schedule[id])) throw new Error(\"too late\");\n\t return schedule;\n\t}\n\t\n\tfunction create(node, id, self) {\n\t var schedules = node.__transition,\n\t tween;\n\t\n\t // Initialize the self timer when the transition is created.\n\t // Note the actual delay is not known until the first callback!\n\t schedules[id] = self;\n\t self.timer = d3Timer.timer(schedule, 0, self.time);\n\t\n\t function schedule(elapsed) {\n\t self.state = SCHEDULED;\n\t self.timer.restart(start, self.delay, self.time);\n\t\n\t // If the elapsed delay is less than our first sleep, start immediately.\n\t if (self.delay <= elapsed) start(elapsed - self.delay);\n\t }\n\t\n\t function start(elapsed) {\n\t var i, j, n, o;\n\t\n\t // If the state is not SCHEDULED, then we previously errored on start.\n\t if (self.state !== SCHEDULED) return stop();\n\t\n\t for (i in schedules) {\n\t o = schedules[i];\n\t if (o.name !== self.name) continue;\n\t\n\t // While this element already has a starting transition during this frame,\n\t // defer starting an interrupting transition until that transition has a\n\t // chance to tick (and possibly end); see d3/d3-transition#54!\n\t if (o.state === STARTED) return d3Timer.timeout(start);\n\t\n\t // Interrupt the active transition, if any.\n\t // Dispatch the interrupt event.\n\t if (o.state === RUNNING) {\n\t o.state = ENDED;\n\t o.timer.stop();\n\t o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n\t delete schedules[i];\n\t }\n\t\n\t // Cancel any pre-empted transitions. No interrupt event is dispatched\n\t // because the cancelled transitions never started. Note that this also\n\t // removes this transition from the pending list!\n\t else if (+i < id) {\n\t o.state = ENDED;\n\t o.timer.stop();\n\t delete schedules[i];\n\t }\n\t }\n\t\n\t // Defer the first tick to end of the current frame; see d3/d3#1576.\n\t // Note the transition may be canceled after start and before the first tick!\n\t // Note this must be scheduled before the start event; see d3/d3-transition#16!\n\t // Assuming this is successful, subsequent callbacks go straight to tick.\n\t d3Timer.timeout(function() {\n\t if (self.state === STARTED) {\n\t self.state = RUNNING;\n\t self.timer.restart(tick, self.delay, self.time);\n\t tick(elapsed);\n\t }\n\t });\n\t\n\t // Dispatch the start event.\n\t // Note this must be done before the tween are initialized.\n\t self.state = STARTING;\n\t self.on.call(\"start\", node, node.__data__, self.index, self.group);\n\t if (self.state !== STARTING) return; // interrupted\n\t self.state = STARTED;\n\t\n\t // Initialize the tween, deleting null tween.\n\t tween = new Array(n = self.tween.length);\n\t for (i = 0, j = -1; i < n; ++i) {\n\t if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n\t tween[++j] = o;\n\t }\n\t }\n\t tween.length = j + 1;\n\t }\n\t\n\t function tick(elapsed) {\n\t var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n\t i = -1,\n\t n = tween.length;\n\t\n\t while (++i < n) {\n\t tween[i].call(null, t);\n\t }\n\t\n\t // Dispatch the end event.\n\t if (self.state === ENDING) {\n\t self.on.call(\"end\", node, node.__data__, self.index, self.group);\n\t stop();\n\t }\n\t }\n\t\n\t function stop() {\n\t self.state = ENDED;\n\t self.timer.stop();\n\t delete schedules[id];\n\t for (var i in schedules) return; // eslint-disable-line no-unused-vars\n\t delete node.__transition;\n\t }\n\t}\n\t\n\tvar interrupt = function(node, name) {\n\t var schedules = node.__transition,\n\t schedule,\n\t active,\n\t empty = true,\n\t i;\n\t\n\t if (!schedules) return;\n\t\n\t name = name == null ? null : name + \"\";\n\t\n\t for (i in schedules) {\n\t if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n\t active = schedule.state > STARTING && schedule.state < ENDING;\n\t schedule.state = ENDED;\n\t schedule.timer.stop();\n\t if (active) schedule.on.call(\"interrupt\", node, node.__data__, schedule.index, schedule.group);\n\t delete schedules[i];\n\t }\n\t\n\t if (empty) delete node.__transition;\n\t};\n\t\n\tvar selection_interrupt = function(name) {\n\t return this.each(function() {\n\t interrupt(this, name);\n\t });\n\t};\n\t\n\tfunction tweenRemove(id, name) {\n\t var tween0, tween1;\n\t return function() {\n\t var schedule = set(this, id),\n\t tween = schedule.tween;\n\t\n\t // If this node shared tween with the previous node,\n\t // just assign the updated shared tween and we’re done!\n\t // Otherwise, copy-on-write.\n\t if (tween !== tween0) {\n\t tween1 = tween0 = tween;\n\t for (var i = 0, n = tween1.length; i < n; ++i) {\n\t if (tween1[i].name === name) {\n\t tween1 = tween1.slice();\n\t tween1.splice(i, 1);\n\t break;\n\t }\n\t }\n\t }\n\t\n\t schedule.tween = tween1;\n\t };\n\t}\n\t\n\tfunction tweenFunction(id, name, value) {\n\t var tween0, tween1;\n\t if (typeof value !== \"function\") throw new Error;\n\t return function() {\n\t var schedule = set(this, id),\n\t tween = schedule.tween;\n\t\n\t // If this node shared tween with the previous node,\n\t // just assign the updated shared tween and we’re done!\n\t // Otherwise, copy-on-write.\n\t if (tween !== tween0) {\n\t tween1 = (tween0 = tween).slice();\n\t for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n\t if (tween1[i].name === name) {\n\t tween1[i] = t;\n\t break;\n\t }\n\t }\n\t if (i === n) tween1.push(t);\n\t }\n\t\n\t schedule.tween = tween1;\n\t };\n\t}\n\t\n\tvar transition_tween = function(name, value) {\n\t var id = this._id;\n\t\n\t name += \"\";\n\t\n\t if (arguments.length < 2) {\n\t var tween = get(this.node(), id).tween;\n\t for (var i = 0, n = tween.length, t; i < n; ++i) {\n\t if ((t = tween[i]).name === name) {\n\t return t.value;\n\t }\n\t }\n\t return null;\n\t }\n\t\n\t return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n\t};\n\t\n\tfunction tweenValue(transition, name, value) {\n\t var id = transition._id;\n\t\n\t transition.each(function() {\n\t var schedule = set(this, id);\n\t (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n\t });\n\t\n\t return function(node) {\n\t return get(node, id).value[name];\n\t };\n\t}\n\t\n\tvar interpolate = function(a, b) {\n\t var c;\n\t return (typeof b === \"number\" ? d3Interpolate.interpolateNumber\n\t : b instanceof d3Color.color ? d3Interpolate.interpolateRgb\n\t : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb)\n\t : d3Interpolate.interpolateString)(a, b);\n\t};\n\t\n\tfunction attrRemove(name) {\n\t return function() {\n\t this.removeAttribute(name);\n\t };\n\t}\n\t\n\tfunction attrRemoveNS(fullname) {\n\t return function() {\n\t this.removeAttributeNS(fullname.space, fullname.local);\n\t };\n\t}\n\t\n\tfunction attrConstant(name, interpolate$$1, value1) {\n\t var value00,\n\t interpolate0;\n\t return function() {\n\t var value0 = this.getAttribute(name);\n\t return value0 === value1 ? null\n\t : value0 === value00 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value1);\n\t };\n\t}\n\t\n\tfunction attrConstantNS(fullname, interpolate$$1, value1) {\n\t var value00,\n\t interpolate0;\n\t return function() {\n\t var value0 = this.getAttributeNS(fullname.space, fullname.local);\n\t return value0 === value1 ? null\n\t : value0 === value00 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value1);\n\t };\n\t}\n\t\n\tfunction attrFunction(name, interpolate$$1, value) {\n\t var value00,\n\t value10,\n\t interpolate0;\n\t return function() {\n\t var value0, value1 = value(this);\n\t if (value1 == null) return void this.removeAttribute(name);\n\t value0 = this.getAttribute(name);\n\t return value0 === value1 ? null\n\t : value0 === value00 && value1 === value10 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n\t };\n\t}\n\t\n\tfunction attrFunctionNS(fullname, interpolate$$1, value) {\n\t var value00,\n\t value10,\n\t interpolate0;\n\t return function() {\n\t var value0, value1 = value(this);\n\t if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n\t value0 = this.getAttributeNS(fullname.space, fullname.local);\n\t return value0 === value1 ? null\n\t : value0 === value00 && value1 === value10 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n\t };\n\t}\n\t\n\tvar transition_attr = function(name, value) {\n\t var fullname = d3Selection.namespace(name), i = fullname === \"transform\" ? d3Interpolate.interpolateTransformSvg : interpolate;\n\t return this.attrTween(name, typeof value === \"function\"\n\t ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n\t : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n\t : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + \"\"));\n\t};\n\t\n\tfunction attrTweenNS(fullname, value) {\n\t function tween() {\n\t var node = this, i = value.apply(node, arguments);\n\t return i && function(t) {\n\t node.setAttributeNS(fullname.space, fullname.local, i(t));\n\t };\n\t }\n\t tween._value = value;\n\t return tween;\n\t}\n\t\n\tfunction attrTween(name, value) {\n\t function tween() {\n\t var node = this, i = value.apply(node, arguments);\n\t return i && function(t) {\n\t node.setAttribute(name, i(t));\n\t };\n\t }\n\t tween._value = value;\n\t return tween;\n\t}\n\t\n\tvar transition_attrTween = function(name, value) {\n\t var key = \"attr.\" + name;\n\t if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n\t if (value == null) return this.tween(key, null);\n\t if (typeof value !== \"function\") throw new Error;\n\t var fullname = d3Selection.namespace(name);\n\t return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n\t};\n\t\n\tfunction delayFunction(id, value) {\n\t return function() {\n\t init(this, id).delay = +value.apply(this, arguments);\n\t };\n\t}\n\t\n\tfunction delayConstant(id, value) {\n\t return value = +value, function() {\n\t init(this, id).delay = value;\n\t };\n\t}\n\t\n\tvar transition_delay = function(value) {\n\t var id = this._id;\n\t\n\t return arguments.length\n\t ? this.each((typeof value === \"function\"\n\t ? delayFunction\n\t : delayConstant)(id, value))\n\t : get(this.node(), id).delay;\n\t};\n\t\n\tfunction durationFunction(id, value) {\n\t return function() {\n\t set(this, id).duration = +value.apply(this, arguments);\n\t };\n\t}\n\t\n\tfunction durationConstant(id, value) {\n\t return value = +value, function() {\n\t set(this, id).duration = value;\n\t };\n\t}\n\t\n\tvar transition_duration = function(value) {\n\t var id = this._id;\n\t\n\t return arguments.length\n\t ? this.each((typeof value === \"function\"\n\t ? durationFunction\n\t : durationConstant)(id, value))\n\t : get(this.node(), id).duration;\n\t};\n\t\n\tfunction easeConstant(id, value) {\n\t if (typeof value !== \"function\") throw new Error;\n\t return function() {\n\t set(this, id).ease = value;\n\t };\n\t}\n\t\n\tvar transition_ease = function(value) {\n\t var id = this._id;\n\t\n\t return arguments.length\n\t ? this.each(easeConstant(id, value))\n\t : get(this.node(), id).ease;\n\t};\n\t\n\tvar transition_filter = function(match) {\n\t if (typeof match !== \"function\") match = d3Selection.matcher(match);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n\t if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n\t subgroup.push(node);\n\t }\n\t }\n\t }\n\t\n\t return new Transition(subgroups, this._parents, this._name, this._id);\n\t};\n\t\n\tvar transition_merge = function(transition) {\n\t if (transition._id !== this._id) throw new Error;\n\t\n\t for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n\t for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n\t if (node = group0[i] || group1[i]) {\n\t merge[i] = node;\n\t }\n\t }\n\t }\n\t\n\t for (; j < m0; ++j) {\n\t merges[j] = groups0[j];\n\t }\n\t\n\t return new Transition(merges, this._parents, this._name, this._id);\n\t};\n\t\n\tfunction start(name) {\n\t return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n\t var i = t.indexOf(\".\");\n\t if (i >= 0) t = t.slice(0, i);\n\t return !t || t === \"start\";\n\t });\n\t}\n\t\n\tfunction onFunction(id, name, listener) {\n\t var on0, on1, sit = start(name) ? init : set;\n\t return function() {\n\t var schedule = sit(this, id),\n\t on = schedule.on;\n\t\n\t // If this node shared a dispatch with the previous node,\n\t // just assign the updated shared dispatch and we’re done!\n\t // Otherwise, copy-on-write.\n\t if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\t\n\t schedule.on = on1;\n\t };\n\t}\n\t\n\tvar transition_on = function(name, listener) {\n\t var id = this._id;\n\t\n\t return arguments.length < 2\n\t ? get(this.node(), id).on.on(name)\n\t : this.each(onFunction(id, name, listener));\n\t};\n\t\n\tfunction removeFunction(id) {\n\t return function() {\n\t var parent = this.parentNode;\n\t for (var i in this.__transition) if (+i !== id) return;\n\t if (parent) parent.removeChild(this);\n\t };\n\t}\n\t\n\tvar transition_remove = function() {\n\t return this.on(\"end.remove\", removeFunction(this._id));\n\t};\n\t\n\tvar transition_select = function(select) {\n\t var name = this._name,\n\t id = this._id;\n\t\n\t if (typeof select !== \"function\") select = d3Selection.selector(select);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n\t if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n\t if (\"__data__\" in node) subnode.__data__ = node.__data__;\n\t subgroup[i] = subnode;\n\t schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n\t }\n\t }\n\t }\n\t\n\t return new Transition(subgroups, this._parents, name, id);\n\t};\n\t\n\tvar transition_selectAll = function(select) {\n\t var name = this._name,\n\t id = this._id;\n\t\n\t if (typeof select !== \"function\") select = d3Selection.selectorAll(select);\n\t\n\t for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n\t if (node = group[i]) {\n\t for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n\t if (child = children[k]) {\n\t schedule(child, name, id, k, children, inherit);\n\t }\n\t }\n\t subgroups.push(children);\n\t parents.push(node);\n\t }\n\t }\n\t }\n\t\n\t return new Transition(subgroups, parents, name, id);\n\t};\n\t\n\tvar Selection = d3Selection.selection.prototype.constructor;\n\t\n\tvar transition_selection = function() {\n\t return new Selection(this._groups, this._parents);\n\t};\n\t\n\tfunction styleRemove(name, interpolate$$1) {\n\t var value00,\n\t value10,\n\t interpolate0;\n\t return function() {\n\t var value0 = d3Selection.style(this, name),\n\t value1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n\t return value0 === value1 ? null\n\t : value0 === value00 && value1 === value10 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n\t };\n\t}\n\t\n\tfunction styleRemoveEnd(name) {\n\t return function() {\n\t this.style.removeProperty(name);\n\t };\n\t}\n\t\n\tfunction styleConstant(name, interpolate$$1, value1) {\n\t var value00,\n\t interpolate0;\n\t return function() {\n\t var value0 = d3Selection.style(this, name);\n\t return value0 === value1 ? null\n\t : value0 === value00 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value1);\n\t };\n\t}\n\t\n\tfunction styleFunction(name, interpolate$$1, value) {\n\t var value00,\n\t value10,\n\t interpolate0;\n\t return function() {\n\t var value0 = d3Selection.style(this, name),\n\t value1 = value(this);\n\t if (value1 == null) value1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n\t return value0 === value1 ? null\n\t : value0 === value00 && value1 === value10 ? interpolate0\n\t : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n\t };\n\t}\n\t\n\tvar transition_style = function(name, value, priority) {\n\t var i = (name += \"\") === \"transform\" ? d3Interpolate.interpolateTransformCss : interpolate;\n\t return value == null ? this\n\t .styleTween(name, styleRemove(name, i))\n\t .on(\"end.style.\" + name, styleRemoveEnd(name))\n\t : this.styleTween(name, typeof value === \"function\"\n\t ? styleFunction(name, i, tweenValue(this, \"style.\" + name, value))\n\t : styleConstant(name, i, value + \"\"), priority);\n\t};\n\t\n\tfunction styleTween(name, value, priority) {\n\t function tween() {\n\t var node = this, i = value.apply(node, arguments);\n\t return i && function(t) {\n\t node.style.setProperty(name, i(t), priority);\n\t };\n\t }\n\t tween._value = value;\n\t return tween;\n\t}\n\t\n\tvar transition_styleTween = function(name, value, priority) {\n\t var key = \"style.\" + (name += \"\");\n\t if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n\t if (value == null) return this.tween(key, null);\n\t if (typeof value !== \"function\") throw new Error;\n\t return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n\t};\n\t\n\tfunction textConstant(value) {\n\t return function() {\n\t this.textContent = value;\n\t };\n\t}\n\t\n\tfunction textFunction(value) {\n\t return function() {\n\t var value1 = value(this);\n\t this.textContent = value1 == null ? \"\" : value1;\n\t };\n\t}\n\t\n\tvar transition_text = function(value) {\n\t return this.tween(\"text\", typeof value === \"function\"\n\t ? textFunction(tweenValue(this, \"text\", value))\n\t : textConstant(value == null ? \"\" : value + \"\"));\n\t};\n\t\n\tvar transition_transition = function() {\n\t var name = this._name,\n\t id0 = this._id,\n\t id1 = newId();\n\t\n\t for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n\t if (node = group[i]) {\n\t var inherit = get(node, id0);\n\t schedule(node, name, id1, i, group, {\n\t time: inherit.time + inherit.delay + inherit.duration,\n\t delay: 0,\n\t duration: inherit.duration,\n\t ease: inherit.ease\n\t });\n\t }\n\t }\n\t }\n\t\n\t return new Transition(groups, this._parents, name, id1);\n\t};\n\t\n\tvar id = 0;\n\t\n\tfunction Transition(groups, parents, name, id) {\n\t this._groups = groups;\n\t this._parents = parents;\n\t this._name = name;\n\t this._id = id;\n\t}\n\t\n\tfunction transition(name) {\n\t return d3Selection.selection().transition(name);\n\t}\n\t\n\tfunction newId() {\n\t return ++id;\n\t}\n\t\n\tvar selection_prototype = d3Selection.selection.prototype;\n\t\n\tTransition.prototype = transition.prototype = {\n\t constructor: Transition,\n\t select: transition_select,\n\t selectAll: transition_selectAll,\n\t filter: transition_filter,\n\t merge: transition_merge,\n\t selection: transition_selection,\n\t transition: transition_transition,\n\t call: selection_prototype.call,\n\t nodes: selection_prototype.nodes,\n\t node: selection_prototype.node,\n\t size: selection_prototype.size,\n\t empty: selection_prototype.empty,\n\t each: selection_prototype.each,\n\t on: transition_on,\n\t attr: transition_attr,\n\t attrTween: transition_attrTween,\n\t style: transition_style,\n\t styleTween: transition_styleTween,\n\t text: transition_text,\n\t remove: transition_remove,\n\t tween: transition_tween,\n\t delay: transition_delay,\n\t duration: transition_duration,\n\t ease: transition_ease\n\t};\n\t\n\tvar defaultTiming = {\n\t time: null, // Set on use.\n\t delay: 0,\n\t duration: 250,\n\t ease: d3Ease.easeCubicInOut\n\t};\n\t\n\tfunction inherit(node, id) {\n\t var timing;\n\t while (!(timing = node.__transition) || !(timing = timing[id])) {\n\t if (!(node = node.parentNode)) {\n\t return defaultTiming.time = d3Timer.now(), defaultTiming;\n\t }\n\t }\n\t return timing;\n\t}\n\t\n\tvar selection_transition = function(name) {\n\t var id,\n\t timing;\n\t\n\t if (name instanceof Transition) {\n\t id = name._id, name = name._name;\n\t } else {\n\t id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + \"\";\n\t }\n\t\n\t for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n\t for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n\t if (node = group[i]) {\n\t schedule(node, name, id, i, group, timing || inherit(node, id));\n\t }\n\t }\n\t }\n\t\n\t return new Transition(groups, this._parents, name, id);\n\t};\n\t\n\td3Selection.selection.prototype.interrupt = selection_interrupt;\n\td3Selection.selection.prototype.transition = selection_transition;\n\t\n\tvar root = [null];\n\t\n\tvar active = function(node, name) {\n\t var schedules = node.__transition,\n\t schedule,\n\t i;\n\t\n\t if (schedules) {\n\t name = name == null ? null : name + \"\";\n\t for (i in schedules) {\n\t if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\n\t return new Transition([[node]], root, name, +i);\n\t }\n\t }\n\t }\n\t\n\t return null;\n\t};\n\t\n\texports.transition = transition;\n\texports.active = active;\n\texports.interrupt = interrupt;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-timer/ Version 1.0.6. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar frame = 0;\n\tvar timeout = 0;\n\tvar interval = 0;\n\tvar pokeDelay = 1000;\n\tvar taskHead;\n\tvar taskTail;\n\tvar clockLast = 0;\n\tvar clockNow = 0;\n\tvar clockSkew = 0;\n\tvar clock = typeof performance === \"object\" && performance.now ? performance : Date;\n\tvar setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\t\n\tfunction now() {\n\t return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n\t}\n\t\n\tfunction clearNow() {\n\t clockNow = 0;\n\t}\n\t\n\tfunction Timer() {\n\t this._call =\n\t this._time =\n\t this._next = null;\n\t}\n\t\n\tTimer.prototype = timer.prototype = {\n\t constructor: Timer,\n\t restart: function(callback, delay, time) {\n\t if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n\t time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n\t if (!this._next && taskTail !== this) {\n\t if (taskTail) taskTail._next = this;\n\t else taskHead = this;\n\t taskTail = this;\n\t }\n\t this._call = callback;\n\t this._time = time;\n\t sleep();\n\t },\n\t stop: function() {\n\t if (this._call) {\n\t this._call = null;\n\t this._time = Infinity;\n\t sleep();\n\t }\n\t }\n\t};\n\t\n\tfunction timer(callback, delay, time) {\n\t var t = new Timer;\n\t t.restart(callback, delay, time);\n\t return t;\n\t}\n\t\n\tfunction timerFlush() {\n\t now(); // Get the current time, if not already set.\n\t ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n\t var t = taskHead, e;\n\t while (t) {\n\t if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n\t t = t._next;\n\t }\n\t --frame;\n\t}\n\t\n\tfunction wake() {\n\t clockNow = (clockLast = clock.now()) + clockSkew;\n\t frame = timeout = 0;\n\t try {\n\t timerFlush();\n\t } finally {\n\t frame = 0;\n\t nap();\n\t clockNow = 0;\n\t }\n\t}\n\t\n\tfunction poke() {\n\t var now = clock.now(), delay = now - clockLast;\n\t if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n\t}\n\t\n\tfunction nap() {\n\t var t0, t1 = taskHead, t2, time = Infinity;\n\t while (t1) {\n\t if (t1._call) {\n\t if (time > t1._time) time = t1._time;\n\t t0 = t1, t1 = t1._next;\n\t } else {\n\t t2 = t1._next, t1._next = null;\n\t t1 = t0 ? t0._next = t2 : taskHead = t2;\n\t }\n\t }\n\t taskTail = t0;\n\t sleep(time);\n\t}\n\t\n\tfunction sleep(time) {\n\t if (frame) return; // Soonest alarm already set, or will be.\n\t if (timeout) timeout = clearTimeout(timeout);\n\t var delay = time - clockNow;\n\t if (delay > 24) {\n\t if (time < Infinity) timeout = setTimeout(wake, delay);\n\t if (interval) interval = clearInterval(interval);\n\t } else {\n\t if (!interval) clockLast = clockNow, interval = setInterval(poke, pokeDelay);\n\t frame = 1, setFrame(wake);\n\t }\n\t}\n\t\n\tvar timeout$1 = function(callback, delay, time) {\n\t var t = new Timer;\n\t delay = delay == null ? 0 : +delay;\n\t t.restart(function(elapsed) {\n\t t.stop();\n\t callback(elapsed + delay);\n\t }, delay, time);\n\t return t;\n\t};\n\t\n\tvar interval$1 = function(callback, delay, time) {\n\t var t = new Timer, total = delay;\n\t if (delay == null) return t.restart(callback, delay, time), t;\n\t delay = +delay, time = time == null ? now() : +time;\n\t t.restart(function tick(elapsed) {\n\t elapsed += total;\n\t t.restart(tick, total += delay, time);\n\t callback(elapsed);\n\t }, delay, time);\n\t return t;\n\t};\n\t\n\texports.now = now;\n\texports.timer = timer;\n\texports.timerFlush = timerFlush;\n\texports.timeout = timeout$1;\n\texports.interval = interval$1;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t\n\t var d3Selection = __webpack_require__(13);\n\t\n\t var wrapConfig = {\n\t lineHeight: 1.2,\n\t smallTextOffset: 10,\n\t smallTextLineHeightRatio: 0.9,\n\t smallTextRatio: 0.6,\n\t valueClassName: 'value',\n\t labelClassName: 'label'\n\t };\n\t\n\t var defaultTextSize = 12;\n\t var defaultFontFace = 'Arial';\n\t\n\t /**\n\t * Wraps a selection of text within the available width\n\t * @param {Number} xOffset X axis offset for the text\n\t * @param {Number} fontSize Size of the base font\n\t * @param {Number} availableWidth Width of the container where the text needs to wrap on\n\t * @param {D3Selection} node SVG text element that contains the text to wrap\n\t *\n\t * REF: http://bl.ocks.org/mbostock/7555321\n\t * More discussions on https://github.com/mbostock/d3/issues/1642\n\t * @return {void}\n\t */\n\t var wrapText = function wrapText(xOffset, fontSize, availableWidth, node) {\n\t var text = d3Selection.select(node),\n\t words = text.text().split(/\\s+/).reverse(),\n\t word = void 0,\n\t line = [],\n\t lineNumber = 0,\n\t smallLineHeight = wrapConfig.lineHeight * wrapConfig.smallTextLineHeightRatio,\n\t y = text.attr('y'),\n\t dy = parseFloat(text.attr('dy')),\n\t smallFontSize = fontSize * wrapConfig.smallTextRatio,\n\t tspan = text.text(null).append('tspan').attr('x', xOffset).attr('y', y - 5).attr('dy', dy + 'em').classed(wrapConfig.valueClassName, true).style('font-size', fontSize + 'px');\n\t\n\t tspan.text(words.pop());\n\t tspan = text.append('tspan').classed(wrapConfig.labelClassName, true).attr('x', xOffset).attr('y', y + wrapConfig.smallTextOffset).attr('dy', ++lineNumber * smallLineHeight + dy + 'em').style('font-size', smallFontSize + 'px');\n\t\n\t while (word = words.pop()) {\n\t line.push(word);\n\t tspan.text(line.join(' '));\n\t if (tspan.node().getComputedTextLength() > availableWidth - 50) {\n\t line.pop();\n\t tspan.text(line.join(' '));\n\t line = [word];\n\t tspan = text.append('tspan').classed(wrapConfig.labelClassName, true).attr('x', xOffset).attr('y', y + wrapConfig.smallTextOffset).attr('dy', ++lineNumber * smallLineHeight + dy + 'em').text(word).style('font-size', smallFontSize + 'px');\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Wraps a selection of text within the available width, also adds class .adjust-upwards\n\t * to configure a y offset for entries with multiple rows\n\t * @param {D3Sekectuib} text d3 text element\n\t * @param {Number} width Width of the container where the text needs to wrap on\n\t * @param {Number} xpos number passed to determine the x offset\n\t * @param {Number} limit number of lines before an ellipses is added and the rest of the text is cut off\n\t *\n\t * REF: http://bl.ocks.org/mbostock/7555321\n\t * More discussions on https://github.com/mbostock/d3/issues/1642\n\t * @return {void}\n\t */\n\t var wrapTextWithEllipses = function wrapTextWithEllipses(text, width) {\n\t var xpos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\t var limit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 2;\n\t\n\t\n\t text.each(function () {\n\t var words, word, line, lineNumber, lineHeight, y, dy, tspan;\n\t\n\t text = d3Selection.select(this);\n\t\n\t words = text.text().split(/\\s+/).reverse();\n\t line = [];\n\t lineNumber = 0;\n\t lineHeight = 1.2;\n\t y = text.attr('y');\n\t dy = parseFloat(text.attr('dy'));\n\t tspan = text.text(null).append('tspan').attr('x', xpos).attr('y', y).attr('dy', dy + 'em');\n\t\n\t while (word = words.pop()) {\n\t line.push(word);\n\t tspan.text(line.join(' '));\n\t\n\t if (tspan.node().getComputedTextLength() > width) {\n\t line.pop();\n\t tspan.text(line.join(' '));\n\t\n\t if (lineNumber < limit - 1) {\n\t line = [word];\n\t tspan = text.append('tspan').attr('x', xpos).attr('y', y).attr('dy', ++lineNumber * lineHeight + dy + 'em').text(word);\n\t // if we need two lines for the text, move them both up to center them\n\t text.classed('adjust-upwards', true);\n\t } else {\n\t line.push('...');\n\t tspan.text(line.join(' '));\n\t break;\n\t }\n\t }\n\t }\n\t });\n\t };\n\t\n\t /**\n\t * Figures out an approximate of the text width by using a canvas element\n\t * This avoids having to actually render the text to measure it from the DOM itself\n\t * @param {String} text Text to measure\n\t * @param {Number} fontSize Fontsize (or default)\n\t * @param {String} fontFace Font familty (or default)\n\t * @return {String} Approximate font size of the text\n\t */\n\t var getTextWidth = function getTextWidth(text) {\n\t var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultTextSize;\n\t var fontFace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultFontFace;\n\t\n\t var a = document.createElement('canvas'),\n\t b = a.getContext('2d');\n\t\n\t b.font = fontSize + 'px ' + fontFace;\n\t\n\t return b.measureText(text).width;\n\t };\n\t\n\t return {\n\t getTextWidth: getTextWidth,\n\t wrapText: wrapText,\n\t wrapTextWithEllipses: wrapTextWithEllipses\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var _require = __webpack_require__(18),\n\t colorSchemas = _require.colorSchemas;\n\t\n\t var constants = __webpack_require__(19);\n\t var serializeWithStyles = __webpack_require__(20);\n\t\n\t var encoder = window.btoa;\n\t\n\t if (!encoder) {\n\t encoder = __webpack_require__(21).encode;\n\t }\n\t\n\t // Base64 doesn't work really well with Unicode strings, so we need to use this function\n\t // Ref: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding\n\t var b64EncodeUnicode = function b64EncodeUnicode(str) {\n\t return encoder(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n\t return String.fromCharCode('0x' + p1);\n\t }));\n\t };\n\t\n\t var config = {\n\t styleClass: 'britechartStyle',\n\t defaultFilename: 'britechart.png',\n\t chartBackground: 'white',\n\t imageSourceBase: 'data:image/svg+xml;base64,',\n\t titleFontSize: '15px',\n\t titleFontFamily: '\\'Benton Sans\\', sans-serif',\n\t titleTopOffset: 30,\n\t get styleBackgroundString() {\n\t return '';\n\t }\n\t };\n\t\n\t /**\n\t * Main function to be used as a method by chart instances to export charts to png\n\t * @param {array} svgs (or an svg element) pass in both chart & legend as array or just chart as svg or in array\n\t * @param {string} filename [download to be called .png]\n\t * @param {string} title Title for the image\n\t */\n\t function exportChart(d3svg, filename, title) {\n\t var img = createImage(convertSvgToHtml.call(this, d3svg, title));\n\t\n\t img.onload = handleImageLoad.bind(img, createCanvas(this.width(), this.height()), filename);\n\t }\n\t\n\t /**\n\t * adds background styles to raw html\n\t * @param {string} html raw html\n\t */\n\t function addBackground(html) {\n\t return html.replace('>', '>' + config.styleBackgroundString);\n\t }\n\t\n\t /**\n\t * takes d3 svg el, adds proper svg tags, adds inline styles\n\t * from stylesheets, adds white background and returns string\n\t * @param {object} d3svg TYPE d3 svg element\n\t * @return {string} string of passed d3\n\t */\n\t function convertSvgToHtml(d3svg, title) {\n\t if (!d3svg) {\n\t return;\n\t }\n\t\n\t d3svg.attr('version', 1.1).attr('xmlns', 'http://www.w3.org/2000/svg');\n\t var serializer = serializeWithStyles.initializeSerializer();\n\t var html = serializer(d3svg.node());\n\t\n\t html = formatHtmlByBrowser(html);\n\t html = prependTitle.call(this, html, title, parseInt(d3svg.attr('width'), 10));\n\t html = addBackground(html);\n\t\n\t return html;\n\t }\n\t\n\t /**\n\t * Create Canvas\n\t * @param {number} width\n\t * @param {number} height\n\t * @return {object} TYPE canvas element\n\t */\n\t function createCanvas(width, height) {\n\t var canvas = document.createElement('canvas');\n\t\n\t canvas.height = height;\n\t canvas.width = width;\n\t\n\t return canvas;\n\t }\n\t\n\t /**\n\t * Create Image\n\t * @param {string} svgHtml string representation of svg el\n\t * @return {object} TYPE element , src points at svg\n\t */\n\t function createImage(svgHtml) {\n\t var img = new Image();\n\t\n\t img.src = '' + config.imageSourceBase + b64EncodeUnicode(svgHtml);\n\t\n\t return img;\n\t };\n\t\n\t /**\n\t * Draws image on canvas\n\t * @param {object} image TYPE:el , to be drawn\n\t * @param {object} canvas TYPE: el , to draw on\n\t */\n\t function drawImageOnCanvas(image, canvas) {\n\t canvas.getContext('2d').drawImage(image, 0, 0);\n\t\n\t return canvas;\n\t }\n\t\n\t /**\n\t * Triggers browser to download image, convert canvas to url,\n\t * we need to append the link el to the dom before clicking it for Firefox to register\n\t * point at it and trigger click\n\t * @param {object} canvas TYPE: el \n\t * @param {string} filename\n\t * @param {string} extensionType\n\t */\n\t function downloadCanvas(canvas) {\n\t var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.defaultFilename;\n\t var extensionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png';\n\t\n\t var url = canvas.toDataURL(extensionType);\n\t var link = document.createElement('a');\n\t\n\t link.href = url;\n\t link.download = filename;\n\t document.body.appendChild(link);\n\t link.click();\n\t document.body.removeChild(link);\n\t }\n\t\n\t /**\n\t * Some browsers need special formatting, we handle that here\n\t * @param {string} html string of svg html\n\t * @return {string} string of svg html\n\t */\n\t function formatHtmlByBrowser(html) {\n\t if (navigator.userAgent.search('FireFox') > -1) {\n\t return html.replace(/url.*"\\)/, 'url("#' + constants.lineGradientId + '");');\n\t }\n\t\n\t return html;\n\t }\n\t\n\t /**\n\t * Handles on load event fired by img.onload, this=img\n\t * @param {object} canvas TYPE: el \n\t * @param {string} filename\n\t * @param {object} e\n\t */\n\t function handleImageLoad(canvas, filename, e) {\n\t e.preventDefault();\n\t\n\t downloadCanvas(drawImageOnCanvas(this, canvas), filename);\n\t }\n\t\n\t /**\n\t * if passed, append title to the raw html to appear on graph\n\t * @param {string} html raw html string\n\t * @param {string} title title of the graph\n\t * @param {number} svgWidth width of graph container\n\t * @return {string} raw html with title prepended\n\t */\n\t function prependTitle(html, title, svgWidth) {\n\t if (!title || !svgWidth) {\n\t return html;\n\t }\n\t var grey = colorSchemas.grey;\n\t\n\t\n\t html = html.replace(/ ' + title + ' > (-2 * bitCounter & 6)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn output;\n\t\t};\n\t\n\t\t// `encode` is designed to be fully compatible with `btoa` as described in the\n\t\t// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa\n\t\tvar encode = function(input) {\n\t\t\tinput = String(input);\n\t\t\tif (/[^\\0-\\xFF]/.test(input)) {\n\t\t\t\t// Note: no need to special-case astral symbols here, as surrogates are\n\t\t\t\t// matched, and the input is supposed to only contain ASCII anyway.\n\t\t\t\terror(\n\t\t\t\t\t'The string to be encoded contains characters outside of the ' +\n\t\t\t\t\t'Latin1 range.'\n\t\t\t\t);\n\t\t\t}\n\t\t\tvar padding = input.length % 3;\n\t\t\tvar output = '';\n\t\t\tvar position = -1;\n\t\t\tvar a;\n\t\t\tvar b;\n\t\t\tvar c;\n\t\t\tvar d;\n\t\t\tvar buffer;\n\t\t\t// Make sure any padding is handled outside of the loop.\n\t\t\tvar length = input.length - padding;\n\t\n\t\t\twhile (++position < length) {\n\t\t\t\t// Read three bytes, i.e. 24 bits.\n\t\t\t\ta = input.charCodeAt(position) << 16;\n\t\t\t\tb = input.charCodeAt(++position) << 8;\n\t\t\t\tc = input.charCodeAt(++position);\n\t\t\t\tbuffer = a + b + c;\n\t\t\t\t// Turn the 24 bits into four chunks of 6 bits each, and append the\n\t\t\t\t// matching character for each of them to the output.\n\t\t\t\toutput += (\n\t\t\t\t\tTABLE.charAt(buffer >> 18 & 0x3F) +\n\t\t\t\t\tTABLE.charAt(buffer >> 12 & 0x3F) +\n\t\t\t\t\tTABLE.charAt(buffer >> 6 & 0x3F) +\n\t\t\t\t\tTABLE.charAt(buffer & 0x3F)\n\t\t\t\t);\n\t\t\t}\n\t\n\t\t\tif (padding == 2) {\n\t\t\t\ta = input.charCodeAt(position) << 8;\n\t\t\t\tb = input.charCodeAt(++position);\n\t\t\t\tbuffer = a + b;\n\t\t\t\toutput += (\n\t\t\t\t\tTABLE.charAt(buffer >> 10) +\n\t\t\t\t\tTABLE.charAt((buffer >> 4) & 0x3F) +\n\t\t\t\t\tTABLE.charAt((buffer << 2) & 0x3F) +\n\t\t\t\t\t'='\n\t\t\t\t);\n\t\t\t} else if (padding == 1) {\n\t\t\t\tbuffer = input.charCodeAt(position);\n\t\t\t\toutput += (\n\t\t\t\t\tTABLE.charAt(buffer >> 2) +\n\t\t\t\t\tTABLE.charAt((buffer << 4) & 0x3F) +\n\t\t\t\t\t'=='\n\t\t\t\t);\n\t\t\t}\n\t\n\t\t\treturn output;\n\t\t};\n\t\n\t\tvar base64 = {\n\t\t\t'encode': encode,\n\t\t\t'decode': decode,\n\t\t\t'version': '0.1.0'\n\t\t};\n\t\n\t\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t\t// like the following:\n\t\tif (\n\t\t\ttrue\n\t\t) {\n\t\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\t\t\treturn base64;\n\t\t\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\t\tfreeModule.exports = base64;\n\t\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\t\tfor (var key in base64) {\n\t\t\t\t\tbase64.hasOwnProperty(key) && (freeExports[key] = base64[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // in Rhino or a web browser\n\t\t\troot.base64 = base64;\n\t\t}\n\t\n\t}(this));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(22)(module), (function() { return this; }())))\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = function(module) {\r\n\t\tif(!module.webpackPolyfill) {\r\n\t\t\tmodule.deprecate = function() {};\r\n\t\t\tmodule.paths = [];\r\n\t\t\t// module.parent = undefined by default\r\n\t\t\tmodule.children = [];\r\n\t\t\tmodule.webpackPolyfill = 1;\r\n\t\t}\r\n\t\treturn module;\r\n\t}\r\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Interpolate = __webpack_require__(10);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var textHelper = __webpack_require__(16);\n\t var colorHelper = __webpack_require__(18);\n\t\n\t var _require2 = __webpack_require__(26),\n\t calculatePercent = _require2.calculatePercent;\n\t\n\t /**\n\t * @typedef DonutChartData\n\t * @type {Object[]}\n\t * @property {Number} quantity Quantity of the group (required)\n\t * @property {Number} percentage Percentage of the total (optional)\n\t * @property {String} name Name of the group (required)\n\t * @property {Number} id Identifier for the group required for legend feature (optional)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * quantity: 1,\n\t * percentage: 50,\n\t * name: 'glittering',\n\t * id: 1\n\t * },\n\t * {\n\t * quantity: 1,\n\t * percentage: 50,\n\t * name: 'luminous',\n\t * id: 2\n\t * }\n\t * ]\n\t */\n\t\n\t /**\n\t * Reusable Donut Chart API class that renders a\n\t * simple and configurable donut chart.\n\t *\n\t * @module Donut\n\t * @tutorial donut\n\t * @requires d3-dispatch, d3-ease, d3-interpolate, d3-scale, d3-shape, d3-selection\n\t *\n\t * @example\n\t * var donutChart = donut();\n\t *\n\t * donutChart\n\t * .externalRadius(500)\n\t * .internalRadius(200);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(donutChart);\n\t *\n\t */\n\t\n\t\n\t return function module() {\n\t var margin = {\n\t top: 0,\n\t right: 0,\n\t bottom: 0,\n\t left: 0\n\t },\n\t width = 300,\n\t height = 300,\n\t ease = d3Ease.easeCubicInOut,\n\t arcTransitionDuration = 750,\n\t pieDrawingTransitionDuration = 1200,\n\t pieHoverTransitionDuration = 150,\n\t radiusHoverOffset = 12,\n\t paddingAngle = 0,\n\t data = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t externalRadius = 140,\n\t internalRadius = 45.5,\n\t legendWidth = externalRadius + internalRadius,\n\t layout = void 0,\n\t shape = void 0,\n\t slices = void 0,\n\t svg = void 0,\n\t isAnimated = false,\n\t highlightedSliceId = void 0,\n\t highlightedSlice = void 0,\n\t hasFixedHighlightedSlice = false,\n\t quantityLabel = 'quantity',\n\t nameLabel = 'name',\n\t percentageLabel = 'percentage',\n\t percentageFormat = '.1f',\n\t\n\t\n\t // colors\n\t colorScale = void 0,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t\n\t\n\t // utils\n\t storeAngle = function storeAngle(d) {\n\t this._current = d;\n\t },\n\t reduceOuterRadius = function reduceOuterRadius(d) {\n\t d.outerRadius = externalRadius - radiusHoverOffset;\n\t },\n\t sortComparator = function sortComparator(a, b) {\n\t return b.quantity - a.quantity;\n\t },\n\t sumValues = function sumValues(data) {\n\t return data.reduce(function (total, d) {\n\t return d.quantity + total;\n\t }, 0);\n\t },\n\t\n\t\n\t // extractors\n\t getQuantity = function getQuantity(_ref) {\n\t var quantity = _ref.quantity;\n\t return quantity;\n\t },\n\t getSliceFill = function getSliceFill(_ref2) {\n\t var data = _ref2.data;\n\t return colorScale(data.name);\n\t },\n\t\n\t\n\t // events\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t *\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {DonutChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t\n\t buildLayout();\n\t buildColorScale();\n\t buildShape();\n\t buildSVG(this);\n\t drawSlices();\n\t initTooltip();\n\t\n\t if (highlightedSliceId) {\n\t initHighlightSlice();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Builds color scale for chart, if any colorSchema was defined\n\t * @private\n\t */\n\t function buildColorScale() {\n\t if (colorSchema) {\n\t colorScale = d3Scale.scaleOrdinal().range(colorSchema);\n\t }\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the legend and a wrapper for all of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true);\n\t\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('legend-group', true);\n\t }\n\t\n\t /**\n\t * Builds the pie layout that will produce data ready to draw\n\t * @private\n\t */\n\t function buildLayout() {\n\t layout = d3Shape.pie().padAngle(paddingAngle).value(getQuantity).sort(sortComparator);\n\t }\n\t\n\t /**\n\t * Builds the shape function\n\t * @private\n\t */\n\t function buildShape() {\n\t shape = d3Shape.arc().innerRadius(internalRadius).padRadius(externalRadius);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t *\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart donut-chart', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t // Updates Container Group position\n\t svg.select('.container-group').attr('transform', 'translate(' + width / 2 + ', ' + height / 2 + ')');\n\t\n\t // Updates SVG size\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Cleaning data adding the proper format\n\t * @param {DonutChartData} data Data\n\t * @private\n\t */\n\t function cleanData(data) {\n\t var cleanData = data.reduce(function (acc, d) {\n\t // Skip data without quantity\n\t if (!d[quantityLabel]) {\n\t return acc;\n\t }\n\t\n\t d.quantity = +d[quantityLabel];\n\t d.name = String(d[nameLabel]);\n\t d.percentage = d[percentageLabel] || null;\n\t\n\t return [].concat(_toConsumableArray(acc), [d]);\n\t }, []);\n\t var totalQuantity = sumValues(cleanData);\n\t var dataWithPercentages = cleanData.map(function (d) {\n\t d.percentage = String(d.percentage || calculatePercent(d[quantityLabel], totalQuantity, percentageFormat));\n\t\n\t return d;\n\t });\n\t\n\t return dataWithPercentages;\n\t }\n\t\n\t /**\n\t * Cleans any value that could be on the legend text element\n\t * @private\n\t */\n\t function cleanLegend() {\n\t svg.select('.donut-text').text('');\n\t }\n\t\n\t /**\n\t * Draws the values on the donut slice inside the text element\n\t *\n\t * @param {Object} obj Data object\n\t * @private\n\t */\n\t function drawLegend(obj) {\n\t if (obj.data) {\n\t svg.select('.donut-text').text(function () {\n\t return obj.data.percentage + '% ' + obj.data.name;\n\t }).attr('dy', '.2em').attr('text-anchor', 'middle');\n\t\n\t svg.select('.donut-text').call(wrapText, legendWidth);\n\t }\n\t }\n\t\n\t /**\n\t * Draws the slices of the donut\n\t * @private\n\t */\n\t function drawSlices() {\n\t // We clean all the previous arcs\n\t if (slices) {\n\t svg.selectAll('g.arc').remove();\n\t }\n\t\n\t slices = svg.select('.chart-group').selectAll('g.arc').data(layout(data));\n\t\n\t var newSlices = slices.enter().append('g').each(storeAngle).each(reduceOuterRadius).classed('arc', true).append('path');\n\t\n\t if (isAnimated) {\n\t newSlices.merge(slices).attr('fill', getSliceFill).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t }).transition().ease(ease).duration(pieDrawingTransitionDuration).attrTween('d', tweenLoading);\n\t } else {\n\t newSlices.merge(slices).attr('fill', getSliceFill).attr('d', shape).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t });\n\t }\n\t\n\t slices.exit().remove();\n\t }\n\t\n\t /**\n\t * Checks if the given element id is the same as the highlightedSliceId and returns the\n\t * element if that's the case\n\t * @param {DOMElement} options.data Dom element to check\n\t * @return {DOMElement} Dom element if it has the same id\n\t */\n\t function filterHighlightedSlice(_ref3) {\n\t var data = _ref3.data;\n\t\n\t if (data.id === highlightedSliceId) {\n\t return this;\n\t }\n\t }\n\t\n\t /**\n\t * Handles a path mouse over\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOver(el, d, chartWidth, chartHeight) {\n\t drawLegend(d);\n\t dispatcher.call('customMouseOver', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n\t\n\t if (highlightedSlice && el !== highlightedSlice) {\n\t tweenGrowth(highlightedSlice, externalRadius - radiusHoverOffset);\n\t }\n\t tweenGrowth(el, externalRadius);\n\t }\n\t\n\t /**\n\t * Handles a path mouse move\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseMove(el, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseMove', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n\t }\n\t\n\t /**\n\t * Handles a path mouse out\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOut(el, d, chartWidth, chartHeight) {\n\t if (highlightedSlice && hasFixedHighlightedSlice) {\n\t drawLegend(highlightedSlice.__data__);\n\t } else {\n\t cleanLegend();\n\t }\n\t dispatcher.call('customMouseOut', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n\t\n\t if (highlightedSlice && hasFixedHighlightedSlice && el !== highlightedSlice) {\n\t tweenGrowth(highlightedSlice, externalRadius);\n\t }\n\t tweenGrowth(el, externalRadius - radiusHoverOffset, pieHoverTransitionDuration);\n\t }\n\t\n\t /**\n\t * Find the slice by id and growth it if needed\n\t * @private\n\t */\n\t function initHighlightSlice() {\n\t highlightedSlice = svg.selectAll('.chart-group .arc path').select(filterHighlightedSlice).node();\n\t\n\t if (highlightedSlice) {\n\t drawLegend(highlightedSlice.__data__);\n\t tweenGrowth(highlightedSlice, externalRadius, pieDrawingTransitionDuration);\n\t }\n\t }\n\t\n\t /**\n\t * Creates the text element that will hold the legend of the chart\n\t */\n\t function initTooltip() {\n\t svg.select('.legend-group').append('text').attr('class', 'donut-text');\n\t }\n\t\n\t /**\n\t * Stores current angles and interpolates with new angles\n\t * Check out {@link http://bl.ocks.org/mbostock/1346410| this example}\n\t *\n\t * @param {Object} a New data for slice\n\t * @return {Function} Tweening function for the donut shape\n\t * @private\n\t */\n\t function tweenArc(a) {\n\t var i = d3Interpolate.interpolate(this._current, a);\n\t\n\t this._current = i(0);\n\t\n\t return function (t) {\n\t return shape(i(t));\n\t };\n\t }\n\t\n\t /**\n\t * Animate slice with tweens depending on the attributes given\n\t *\n\t * @param {DOMElement} slice Slice to growth\n\t * @param {Number} outerRadius Final outer radius value\n\t * @param {Number} delay Delay of animation\n\t * @private\n\t */\n\t function tweenGrowth(slice, outerRadius) {\n\t var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\t\n\t d3Selection.select(slice).transition().delay(delay).attrTween('d', function (d) {\n\t var i = d3Interpolate.interpolate(d.outerRadius, outerRadius);\n\t\n\t return function (t) {\n\t d.outerRadius = i(t);\n\t\n\t return shape(d);\n\t };\n\t });\n\t }\n\t\n\t /**\n\t * Animation for chart loading\n\t * Check out {@link http://bl.ocks.org/mbostock/4341574| this example}\n\t *\n\t * @param {Object} b Data point\n\t * @return {Function} Tween function\n\t * @private\n\t */\n\t function tweenLoading(b) {\n\t var i = void 0;\n\t\n\t b.innerRadius = 0;\n\t i = d3Interpolate.interpolate({ startAngle: 0, endAngle: 0 }, b);\n\t\n\t return function (t) {\n\t return shape(i(t));\n\t };\n\t }\n\t\n\t /**\n\t * Utility function that wraps a text into the given width\n\t *\n\t * @param {D3Selection} text Text to write\n\t * @param {Number} legendWidth Width of the container\n\t * @private\n\t */\n\t function wrapText(text, legendWidth) {\n\t var fontSize = externalRadius / 5;\n\t\n\t textHelper.wrapText.call(null, 0, fontSize, legendWidth, text.node());\n\t }\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the externalRadius of the chart\n\t * @param {Number} _x ExternalRadius number to get/set\n\t * @return { (Number | Module) } Current externalRadius or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.externalRadius = function (_x) {\n\t if (!arguments.length) {\n\t return externalRadius;\n\t }\n\t externalRadius = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the hasFixedHighlightedSlice property of the chart, making it to\n\t * highlight the selected slice id set with `highlightSliceById` all the time.\n\t *\n\t * @param {Boolean} _x If we want to make the highlighted slice permanently highlighted\n\t * @return { hasFixedHighlightedSlice | module} Current hasFixedHighlightedSlice flag or Chart module\n\t * @public\n\t */\n\t exports.hasFixedHighlightedSlice = function (_x) {\n\t if (!arguments.length) {\n\t return hasFixedHighlightedSlice;\n\t }\n\t hasFixedHighlightedSlice = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { (Number | Module) } Current height or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the internalRadius of the chart\n\t * @param {Number} _x InternalRadius number to get/set\n\t * @return { (Number | Module) } Current internalRadius or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.internalRadius = function (_x) {\n\t if (!arguments.length) {\n\t return internalRadius;\n\t }\n\t internalRadius = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { (Number | Module) } Current margin or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { (Number | Module) } Current width or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Gets or Sets the id of the slice to highlight\n\t * @param {Number} _x Slice id\n\t * @return { (Number | Module) } Current highlighted slice id or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.highlightSliceById = function (_x) {\n\t if (!arguments.length) {\n\t return highlightedSliceId;\n\t }\n\t highlightedSliceId = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-shape/ Version 1.2.0. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(25)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3));\n\t}(this, (function (exports,d3Path) { 'use strict';\n\t\n\tvar constant = function(x) {\n\t return function constant() {\n\t return x;\n\t };\n\t};\n\t\n\tvar abs = Math.abs;\n\tvar atan2 = Math.atan2;\n\tvar cos = Math.cos;\n\tvar max = Math.max;\n\tvar min = Math.min;\n\tvar sin = Math.sin;\n\tvar sqrt = Math.sqrt;\n\t\n\tvar epsilon = 1e-12;\n\tvar pi = Math.PI;\n\tvar halfPi = pi / 2;\n\tvar tau = 2 * pi;\n\t\n\tfunction acos(x) {\n\t return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n\t}\n\t\n\tfunction asin(x) {\n\t return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n\t}\n\t\n\tfunction arcInnerRadius(d) {\n\t return d.innerRadius;\n\t}\n\t\n\tfunction arcOuterRadius(d) {\n\t return d.outerRadius;\n\t}\n\t\n\tfunction arcStartAngle(d) {\n\t return d.startAngle;\n\t}\n\t\n\tfunction arcEndAngle(d) {\n\t return d.endAngle;\n\t}\n\t\n\tfunction arcPadAngle(d) {\n\t return d && d.padAngle; // Note: optional!\n\t}\n\t\n\tfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n\t var x10 = x1 - x0, y10 = y1 - y0,\n\t x32 = x3 - x2, y32 = y3 - y2,\n\t t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);\n\t return [x0 + t * x10, y0 + t * y10];\n\t}\n\t\n\t// Compute perpendicular offset line of length rc.\n\t// http://mathworld.wolfram.com/Circle-LineIntersection.html\n\tfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n\t var x01 = x0 - x1,\n\t y01 = y0 - y1,\n\t lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n\t ox = lo * y01,\n\t oy = -lo * x01,\n\t x11 = x0 + ox,\n\t y11 = y0 + oy,\n\t x10 = x1 + ox,\n\t y10 = y1 + oy,\n\t x00 = (x11 + x10) / 2,\n\t y00 = (y11 + y10) / 2,\n\t dx = x10 - x11,\n\t dy = y10 - y11,\n\t d2 = dx * dx + dy * dy,\n\t r = r1 - rc,\n\t D = x11 * y10 - x10 * y11,\n\t d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n\t cx0 = (D * dy - dx * d) / d2,\n\t cy0 = (-D * dx - dy * d) / d2,\n\t cx1 = (D * dy + dx * d) / d2,\n\t cy1 = (-D * dx + dy * d) / d2,\n\t dx0 = cx0 - x00,\n\t dy0 = cy0 - y00,\n\t dx1 = cx1 - x00,\n\t dy1 = cy1 - y00;\n\t\n\t // Pick the closer of the two intersection points.\n\t // TODO Is there a faster way to determine which intersection to use?\n\t if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\t\n\t return {\n\t cx: cx0,\n\t cy: cy0,\n\t x01: -ox,\n\t y01: -oy,\n\t x11: cx0 * (r1 / r - 1),\n\t y11: cy0 * (r1 / r - 1)\n\t };\n\t}\n\t\n\tvar arc = function() {\n\t var innerRadius = arcInnerRadius,\n\t outerRadius = arcOuterRadius,\n\t cornerRadius = constant(0),\n\t padRadius = null,\n\t startAngle = arcStartAngle,\n\t endAngle = arcEndAngle,\n\t padAngle = arcPadAngle,\n\t context = null;\n\t\n\t function arc() {\n\t var buffer,\n\t r,\n\t r0 = +innerRadius.apply(this, arguments),\n\t r1 = +outerRadius.apply(this, arguments),\n\t a0 = startAngle.apply(this, arguments) - halfPi,\n\t a1 = endAngle.apply(this, arguments) - halfPi,\n\t da = abs(a1 - a0),\n\t cw = a1 > a0;\n\t\n\t if (!context) context = buffer = d3Path.path();\n\t\n\t // Ensure that the outer radius is always larger than the inner radius.\n\t if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\t\n\t // Is it a point?\n\t if (!(r1 > epsilon)) context.moveTo(0, 0);\n\t\n\t // Or is it a circle or annulus?\n\t else if (da > tau - epsilon) {\n\t context.moveTo(r1 * cos(a0), r1 * sin(a0));\n\t context.arc(0, 0, r1, a0, a1, !cw);\n\t if (r0 > epsilon) {\n\t context.moveTo(r0 * cos(a1), r0 * sin(a1));\n\t context.arc(0, 0, r0, a1, a0, cw);\n\t }\n\t }\n\t\n\t // Or is it a circular or annular sector?\n\t else {\n\t var a01 = a0,\n\t a11 = a1,\n\t a00 = a0,\n\t a10 = a1,\n\t da0 = da,\n\t da1 = da,\n\t ap = padAngle.apply(this, arguments) / 2,\n\t rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n\t rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n\t rc0 = rc,\n\t rc1 = rc,\n\t t0,\n\t t1;\n\t\n\t // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n\t if (rp > epsilon) {\n\t var p0 = asin(rp / r0 * sin(ap)),\n\t p1 = asin(rp / r1 * sin(ap));\n\t if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n\t else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n\t if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n\t else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n\t }\n\t\n\t var x01 = r1 * cos(a01),\n\t y01 = r1 * sin(a01),\n\t x10 = r0 * cos(a10),\n\t y10 = r0 * sin(a10);\n\t\n\t // Apply rounded corners?\n\t if (rc > epsilon) {\n\t var x11 = r1 * cos(a11),\n\t y11 = r1 * sin(a11),\n\t x00 = r0 * cos(a00),\n\t y00 = r0 * sin(a00);\n\t\n\t // Restrict the corner radius according to the sector angle.\n\t if (da < pi) {\n\t var oc = da0 > epsilon ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],\n\t ax = x01 - oc[0],\n\t ay = y01 - oc[1],\n\t bx = x11 - oc[0],\n\t by = y11 - oc[1],\n\t kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n\t lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n\t rc0 = min(rc, (r0 - lc) / (kc - 1));\n\t rc1 = min(rc, (r1 - lc) / (kc + 1));\n\t }\n\t }\n\t\n\t // Is the sector collapsed to a line?\n\t if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\t\n\t // Does the sector’s outer ring have rounded corners?\n\t else if (rc1 > epsilon) {\n\t t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n\t t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\t\n\t context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\t\n\t // Have the corners merged?\n\t if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\t\n\t // Otherwise, draw the two corners and the ring.\n\t else {\n\t context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n\t context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n\t context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n\t }\n\t }\n\t\n\t // Or is the outer ring just a circular arc?\n\t else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\t\n\t // Is there no inner ring, and it’s a circular sector?\n\t // Or perhaps it’s an annular sector collapsed due to padding?\n\t if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\t\n\t // Does the sector’s inner ring (or point) have rounded corners?\n\t else if (rc0 > epsilon) {\n\t t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n\t t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\t\n\t context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\t\n\t // Have the corners merged?\n\t if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\t\n\t // Otherwise, draw the two corners and the ring.\n\t else {\n\t context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n\t context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n\t context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n\t }\n\t }\n\t\n\t // Or is the inner ring just a circular arc?\n\t else context.arc(0, 0, r0, a10, a00, cw);\n\t }\n\t\n\t context.closePath();\n\t\n\t if (buffer) return context = null, buffer + \"\" || null;\n\t }\n\t\n\t arc.centroid = function() {\n\t var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n\t a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n\t return [cos(a) * r, sin(a) * r];\n\t };\n\t\n\t arc.innerRadius = function(_) {\n\t return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n\t };\n\t\n\t arc.outerRadius = function(_) {\n\t return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n\t };\n\t\n\t arc.cornerRadius = function(_) {\n\t return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n\t };\n\t\n\t arc.padRadius = function(_) {\n\t return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n\t };\n\t\n\t arc.startAngle = function(_) {\n\t return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n\t };\n\t\n\t arc.endAngle = function(_) {\n\t return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n\t };\n\t\n\t arc.padAngle = function(_) {\n\t return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n\t };\n\t\n\t arc.context = function(_) {\n\t return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n\t };\n\t\n\t return arc;\n\t};\n\t\n\tfunction Linear(context) {\n\t this._context = context;\n\t}\n\t\n\tLinear.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; // proceed\n\t default: this._context.lineTo(x, y); break;\n\t }\n\t }\n\t};\n\t\n\tvar curveLinear = function(context) {\n\t return new Linear(context);\n\t};\n\t\n\tfunction x(p) {\n\t return p[0];\n\t}\n\t\n\tfunction y(p) {\n\t return p[1];\n\t}\n\t\n\tvar line = function() {\n\t var x$$1 = x,\n\t y$$1 = y,\n\t defined = constant(true),\n\t context = null,\n\t curve = curveLinear,\n\t output = null;\n\t\n\t function line(data) {\n\t var i,\n\t n = data.length,\n\t d,\n\t defined0 = false,\n\t buffer;\n\t\n\t if (context == null) output = curve(buffer = d3Path.path());\n\t\n\t for (i = 0; i <= n; ++i) {\n\t if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n\t if (defined0 = !defined0) output.lineStart();\n\t else output.lineEnd();\n\t }\n\t if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));\n\t }\n\t\n\t if (buffer) return output = null, buffer + \"\" || null;\n\t }\n\t\n\t line.x = function(_) {\n\t return arguments.length ? (x$$1 = typeof _ === \"function\" ? _ : constant(+_), line) : x$$1;\n\t };\n\t\n\t line.y = function(_) {\n\t return arguments.length ? (y$$1 = typeof _ === \"function\" ? _ : constant(+_), line) : y$$1;\n\t };\n\t\n\t line.defined = function(_) {\n\t return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n\t };\n\t\n\t line.curve = function(_) {\n\t return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n\t };\n\t\n\t line.context = function(_) {\n\t return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n\t };\n\t\n\t return line;\n\t};\n\t\n\tvar area = function() {\n\t var x0 = x,\n\t x1 = null,\n\t y0 = constant(0),\n\t y1 = y,\n\t defined = constant(true),\n\t context = null,\n\t curve = curveLinear,\n\t output = null;\n\t\n\t function area(data) {\n\t var i,\n\t j,\n\t k,\n\t n = data.length,\n\t d,\n\t defined0 = false,\n\t buffer,\n\t x0z = new Array(n),\n\t y0z = new Array(n);\n\t\n\t if (context == null) output = curve(buffer = d3Path.path());\n\t\n\t for (i = 0; i <= n; ++i) {\n\t if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n\t if (defined0 = !defined0) {\n\t j = i;\n\t output.areaStart();\n\t output.lineStart();\n\t } else {\n\t output.lineEnd();\n\t output.lineStart();\n\t for (k = i - 1; k >= j; --k) {\n\t output.point(x0z[k], y0z[k]);\n\t }\n\t output.lineEnd();\n\t output.areaEnd();\n\t }\n\t }\n\t if (defined0) {\n\t x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n\t output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n\t }\n\t }\n\t\n\t if (buffer) return output = null, buffer + \"\" || null;\n\t }\n\t\n\t function arealine() {\n\t return line().defined(defined).curve(curve).context(context);\n\t }\n\t\n\t area.x = function(_) {\n\t return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n\t };\n\t\n\t area.x0 = function(_) {\n\t return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n\t };\n\t\n\t area.x1 = function(_) {\n\t return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n\t };\n\t\n\t area.y = function(_) {\n\t return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n\t };\n\t\n\t area.y0 = function(_) {\n\t return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n\t };\n\t\n\t area.y1 = function(_) {\n\t return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n\t };\n\t\n\t area.lineX0 =\n\t area.lineY0 = function() {\n\t return arealine().x(x0).y(y0);\n\t };\n\t\n\t area.lineY1 = function() {\n\t return arealine().x(x0).y(y1);\n\t };\n\t\n\t area.lineX1 = function() {\n\t return arealine().x(x1).y(y0);\n\t };\n\t\n\t area.defined = function(_) {\n\t return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n\t };\n\t\n\t area.curve = function(_) {\n\t return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n\t };\n\t\n\t area.context = function(_) {\n\t return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n\t };\n\t\n\t return area;\n\t};\n\t\n\tvar descending = function(a, b) {\n\t return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n\t};\n\t\n\tvar identity = function(d) {\n\t return d;\n\t};\n\t\n\tvar pie = function() {\n\t var value = identity,\n\t sortValues = descending,\n\t sort = null,\n\t startAngle = constant(0),\n\t endAngle = constant(tau),\n\t padAngle = constant(0);\n\t\n\t function pie(data) {\n\t var i,\n\t n = data.length,\n\t j,\n\t k,\n\t sum = 0,\n\t index = new Array(n),\n\t arcs = new Array(n),\n\t a0 = +startAngle.apply(this, arguments),\n\t da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n\t a1,\n\t p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n\t pa = p * (da < 0 ? -1 : 1),\n\t v;\n\t\n\t for (i = 0; i < n; ++i) {\n\t if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n\t sum += v;\n\t }\n\t }\n\t\n\t // Optionally sort the arcs by previously-computed values or by data.\n\t if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n\t else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\t\n\t // Compute the arcs! They are stored in the original data's order.\n\t for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n\t j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n\t data: data[j],\n\t index: i,\n\t value: v,\n\t startAngle: a0,\n\t endAngle: a1,\n\t padAngle: p\n\t };\n\t }\n\t\n\t return arcs;\n\t }\n\t\n\t pie.value = function(_) {\n\t return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n\t };\n\t\n\t pie.sortValues = function(_) {\n\t return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n\t };\n\t\n\t pie.sort = function(_) {\n\t return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n\t };\n\t\n\t pie.startAngle = function(_) {\n\t return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n\t };\n\t\n\t pie.endAngle = function(_) {\n\t return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n\t };\n\t\n\t pie.padAngle = function(_) {\n\t return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n\t };\n\t\n\t return pie;\n\t};\n\t\n\tvar curveRadialLinear = curveRadial(curveLinear);\n\t\n\tfunction Radial(curve) {\n\t this._curve = curve;\n\t}\n\t\n\tRadial.prototype = {\n\t areaStart: function() {\n\t this._curve.areaStart();\n\t },\n\t areaEnd: function() {\n\t this._curve.areaEnd();\n\t },\n\t lineStart: function() {\n\t this._curve.lineStart();\n\t },\n\t lineEnd: function() {\n\t this._curve.lineEnd();\n\t },\n\t point: function(a, r) {\n\t this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n\t }\n\t};\n\t\n\tfunction curveRadial(curve) {\n\t\n\t function radial(context) {\n\t return new Radial(curve(context));\n\t }\n\t\n\t radial._curve = curve;\n\t\n\t return radial;\n\t}\n\t\n\tfunction lineRadial(l) {\n\t var c = l.curve;\n\t\n\t l.angle = l.x, delete l.x;\n\t l.radius = l.y, delete l.y;\n\t\n\t l.curve = function(_) {\n\t return arguments.length ? c(curveRadial(_)) : c()._curve;\n\t };\n\t\n\t return l;\n\t}\n\t\n\tvar lineRadial$1 = function() {\n\t return lineRadial(line().curve(curveRadialLinear));\n\t};\n\t\n\tvar areaRadial = function() {\n\t var a = area().curve(curveRadialLinear),\n\t c = a.curve,\n\t x0 = a.lineX0,\n\t x1 = a.lineX1,\n\t y0 = a.lineY0,\n\t y1 = a.lineY1;\n\t\n\t a.angle = a.x, delete a.x;\n\t a.startAngle = a.x0, delete a.x0;\n\t a.endAngle = a.x1, delete a.x1;\n\t a.radius = a.y, delete a.y;\n\t a.innerRadius = a.y0, delete a.y0;\n\t a.outerRadius = a.y1, delete a.y1;\n\t a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n\t a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n\t a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n\t a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n\t\n\t a.curve = function(_) {\n\t return arguments.length ? c(curveRadial(_)) : c()._curve;\n\t };\n\t\n\t return a;\n\t};\n\t\n\tvar pointRadial = function(x, y) {\n\t return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n\t};\n\t\n\tvar slice = Array.prototype.slice;\n\t\n\tfunction linkSource(d) {\n\t return d.source;\n\t}\n\t\n\tfunction linkTarget(d) {\n\t return d.target;\n\t}\n\t\n\tfunction link(curve) {\n\t var source = linkSource,\n\t target = linkTarget,\n\t x$$1 = x,\n\t y$$1 = y,\n\t context = null;\n\t\n\t function link() {\n\t var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n\t if (!context) context = buffer = d3Path.path();\n\t curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));\n\t if (buffer) return context = null, buffer + \"\" || null;\n\t }\n\t\n\t link.source = function(_) {\n\t return arguments.length ? (source = _, link) : source;\n\t };\n\t\n\t link.target = function(_) {\n\t return arguments.length ? (target = _, link) : target;\n\t };\n\t\n\t link.x = function(_) {\n\t return arguments.length ? (x$$1 = typeof _ === \"function\" ? _ : constant(+_), link) : x$$1;\n\t };\n\t\n\t link.y = function(_) {\n\t return arguments.length ? (y$$1 = typeof _ === \"function\" ? _ : constant(+_), link) : y$$1;\n\t };\n\t\n\t link.context = function(_) {\n\t return arguments.length ? ((context = _ == null ? null : _), link) : context;\n\t };\n\t\n\t return link;\n\t}\n\t\n\tfunction curveHorizontal(context, x0, y0, x1, y1) {\n\t context.moveTo(x0, y0);\n\t context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n\t}\n\t\n\tfunction curveVertical(context, x0, y0, x1, y1) {\n\t context.moveTo(x0, y0);\n\t context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n\t}\n\t\n\tfunction curveRadial$1(context, x0, y0, x1, y1) {\n\t var p0 = pointRadial(x0, y0),\n\t p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n\t p2 = pointRadial(x1, y0),\n\t p3 = pointRadial(x1, y1);\n\t context.moveTo(p0[0], p0[1]);\n\t context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n\t}\n\t\n\tfunction linkHorizontal() {\n\t return link(curveHorizontal);\n\t}\n\t\n\tfunction linkVertical() {\n\t return link(curveVertical);\n\t}\n\t\n\tfunction linkRadial() {\n\t var l = link(curveRadial$1);\n\t l.angle = l.x, delete l.x;\n\t l.radius = l.y, delete l.y;\n\t return l;\n\t}\n\t\n\tvar circle = {\n\t draw: function(context, size) {\n\t var r = Math.sqrt(size / pi);\n\t context.moveTo(r, 0);\n\t context.arc(0, 0, r, 0, tau);\n\t }\n\t};\n\t\n\tvar cross = {\n\t draw: function(context, size) {\n\t var r = Math.sqrt(size / 5) / 2;\n\t context.moveTo(-3 * r, -r);\n\t context.lineTo(-r, -r);\n\t context.lineTo(-r, -3 * r);\n\t context.lineTo(r, -3 * r);\n\t context.lineTo(r, -r);\n\t context.lineTo(3 * r, -r);\n\t context.lineTo(3 * r, r);\n\t context.lineTo(r, r);\n\t context.lineTo(r, 3 * r);\n\t context.lineTo(-r, 3 * r);\n\t context.lineTo(-r, r);\n\t context.lineTo(-3 * r, r);\n\t context.closePath();\n\t }\n\t};\n\t\n\tvar tan30 = Math.sqrt(1 / 3);\n\tvar tan30_2 = tan30 * 2;\n\t\n\tvar diamond = {\n\t draw: function(context, size) {\n\t var y = Math.sqrt(size / tan30_2),\n\t x = y * tan30;\n\t context.moveTo(0, -y);\n\t context.lineTo(x, 0);\n\t context.lineTo(0, y);\n\t context.lineTo(-x, 0);\n\t context.closePath();\n\t }\n\t};\n\t\n\tvar ka = 0.89081309152928522810;\n\tvar kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10);\n\tvar kx = Math.sin(tau / 10) * kr;\n\tvar ky = -Math.cos(tau / 10) * kr;\n\t\n\tvar star = {\n\t draw: function(context, size) {\n\t var r = Math.sqrt(size * ka),\n\t x = kx * r,\n\t y = ky * r;\n\t context.moveTo(0, -r);\n\t context.lineTo(x, y);\n\t for (var i = 1; i < 5; ++i) {\n\t var a = tau * i / 5,\n\t c = Math.cos(a),\n\t s = Math.sin(a);\n\t context.lineTo(s * r, -c * r);\n\t context.lineTo(c * x - s * y, s * x + c * y);\n\t }\n\t context.closePath();\n\t }\n\t};\n\t\n\tvar square = {\n\t draw: function(context, size) {\n\t var w = Math.sqrt(size),\n\t x = -w / 2;\n\t context.rect(x, x, w, w);\n\t }\n\t};\n\t\n\tvar sqrt3 = Math.sqrt(3);\n\t\n\tvar triangle = {\n\t draw: function(context, size) {\n\t var y = -Math.sqrt(size / (sqrt3 * 3));\n\t context.moveTo(0, y * 2);\n\t context.lineTo(-sqrt3 * y, -y);\n\t context.lineTo(sqrt3 * y, -y);\n\t context.closePath();\n\t }\n\t};\n\t\n\tvar c = -0.5;\n\tvar s = Math.sqrt(3) / 2;\n\tvar k = 1 / Math.sqrt(12);\n\tvar a = (k / 2 + 1) * 3;\n\t\n\tvar wye = {\n\t draw: function(context, size) {\n\t var r = Math.sqrt(size / a),\n\t x0 = r / 2,\n\t y0 = r * k,\n\t x1 = x0,\n\t y1 = r * k + r,\n\t x2 = -x1,\n\t y2 = y1;\n\t context.moveTo(x0, y0);\n\t context.lineTo(x1, y1);\n\t context.lineTo(x2, y2);\n\t context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n\t context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n\t context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n\t context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n\t context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n\t context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n\t context.closePath();\n\t }\n\t};\n\t\n\tvar symbols = [\n\t circle,\n\t cross,\n\t diamond,\n\t square,\n\t star,\n\t triangle,\n\t wye\n\t];\n\t\n\tvar symbol = function() {\n\t var type = constant(circle),\n\t size = constant(64),\n\t context = null;\n\t\n\t function symbol() {\n\t var buffer;\n\t if (!context) context = buffer = d3Path.path();\n\t type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n\t if (buffer) return context = null, buffer + \"\" || null;\n\t }\n\t\n\t symbol.type = function(_) {\n\t return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n\t };\n\t\n\t symbol.size = function(_) {\n\t return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n\t };\n\t\n\t symbol.context = function(_) {\n\t return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n\t };\n\t\n\t return symbol;\n\t};\n\t\n\tvar noop = function() {};\n\t\n\tfunction point(that, x, y) {\n\t that._context.bezierCurveTo(\n\t (2 * that._x0 + that._x1) / 3,\n\t (2 * that._y0 + that._y1) / 3,\n\t (that._x0 + 2 * that._x1) / 3,\n\t (that._y0 + 2 * that._y1) / 3,\n\t (that._x0 + 4 * that._x1 + x) / 6,\n\t (that._y0 + 4 * that._y1 + y) / 6\n\t );\n\t}\n\t\n\tfunction Basis(context) {\n\t this._context = context;\n\t}\n\t\n\tBasis.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 =\n\t this._y0 = this._y1 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 3: point(this, this._x1, this._y1); // proceed\n\t case 2: this._context.lineTo(this._x1, this._y1); break;\n\t }\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n\t default: point(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = x;\n\t this._y0 = this._y1, this._y1 = y;\n\t }\n\t};\n\t\n\tvar basis = function(context) {\n\t return new Basis(context);\n\t};\n\t\n\tfunction BasisClosed(context) {\n\t this._context = context;\n\t}\n\t\n\tBasisClosed.prototype = {\n\t areaStart: noop,\n\t areaEnd: noop,\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n\t this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 1: {\n\t this._context.moveTo(this._x2, this._y2);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 2: {\n\t this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n\t this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 3: {\n\t this.point(this._x2, this._y2);\n\t this.point(this._x3, this._y3);\n\t this.point(this._x4, this._y4);\n\t break;\n\t }\n\t }\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n\t case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n\t case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n\t default: point(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = x;\n\t this._y0 = this._y1, this._y1 = y;\n\t }\n\t};\n\t\n\tvar basisClosed = function(context) {\n\t return new BasisClosed(context);\n\t};\n\t\n\tfunction BasisOpen(context) {\n\t this._context = context;\n\t}\n\t\n\tBasisOpen.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 =\n\t this._y0 = this._y1 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n\t case 3: this._point = 4; // proceed\n\t default: point(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = x;\n\t this._y0 = this._y1, this._y1 = y;\n\t }\n\t};\n\t\n\tvar basisOpen = function(context) {\n\t return new BasisOpen(context);\n\t};\n\t\n\tfunction Bundle(context, beta) {\n\t this._basis = new Basis(context);\n\t this._beta = beta;\n\t}\n\t\n\tBundle.prototype = {\n\t lineStart: function() {\n\t this._x = [];\n\t this._y = [];\n\t this._basis.lineStart();\n\t },\n\t lineEnd: function() {\n\t var x = this._x,\n\t y = this._y,\n\t j = x.length - 1;\n\t\n\t if (j > 0) {\n\t var x0 = x[0],\n\t y0 = y[0],\n\t dx = x[j] - x0,\n\t dy = y[j] - y0,\n\t i = -1,\n\t t;\n\t\n\t while (++i <= j) {\n\t t = i / j;\n\t this._basis.point(\n\t this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n\t this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n\t );\n\t }\n\t }\n\t\n\t this._x = this._y = null;\n\t this._basis.lineEnd();\n\t },\n\t point: function(x, y) {\n\t this._x.push(+x);\n\t this._y.push(+y);\n\t }\n\t};\n\t\n\tvar bundle = ((function custom(beta) {\n\t\n\t function bundle(context) {\n\t return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n\t }\n\t\n\t bundle.beta = function(beta) {\n\t return custom(+beta);\n\t };\n\t\n\t return bundle;\n\t}))(0.85);\n\t\n\tfunction point$1(that, x, y) {\n\t that._context.bezierCurveTo(\n\t that._x1 + that._k * (that._x2 - that._x0),\n\t that._y1 + that._k * (that._y2 - that._y0),\n\t that._x2 + that._k * (that._x1 - x),\n\t that._y2 + that._k * (that._y1 - y),\n\t that._x2,\n\t that._y2\n\t );\n\t}\n\t\n\tfunction Cardinal(context, tension) {\n\t this._context = context;\n\t this._k = (1 - tension) / 6;\n\t}\n\t\n\tCardinal.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 =\n\t this._y0 = this._y1 = this._y2 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 2: this._context.lineTo(this._x2, this._y2); break;\n\t case 3: point$1(this, this._x1, this._y1); break;\n\t }\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n\t case 2: this._point = 3; // proceed\n\t default: point$1(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar cardinal = ((function custom(tension) {\n\t\n\t function cardinal(context) {\n\t return new Cardinal(context, tension);\n\t }\n\t\n\t cardinal.tension = function(tension) {\n\t return custom(+tension);\n\t };\n\t\n\t return cardinal;\n\t}))(0);\n\t\n\tfunction CardinalClosed(context, tension) {\n\t this._context = context;\n\t this._k = (1 - tension) / 6;\n\t}\n\t\n\tCardinalClosed.prototype = {\n\t areaStart: noop,\n\t areaEnd: noop,\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n\t this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 1: {\n\t this._context.moveTo(this._x3, this._y3);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 2: {\n\t this._context.lineTo(this._x3, this._y3);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 3: {\n\t this.point(this._x3, this._y3);\n\t this.point(this._x4, this._y4);\n\t this.point(this._x5, this._y5);\n\t break;\n\t }\n\t }\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n\t case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n\t case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n\t default: point$1(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar cardinalClosed = ((function custom(tension) {\n\t\n\t function cardinal(context) {\n\t return new CardinalClosed(context, tension);\n\t }\n\t\n\t cardinal.tension = function(tension) {\n\t return custom(+tension);\n\t };\n\t\n\t return cardinal;\n\t}))(0);\n\t\n\tfunction CardinalOpen(context, tension) {\n\t this._context = context;\n\t this._k = (1 - tension) / 6;\n\t}\n\t\n\tCardinalOpen.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 =\n\t this._y0 = this._y1 = this._y2 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n\t case 3: this._point = 4; // proceed\n\t default: point$1(this, x, y); break;\n\t }\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar cardinalOpen = ((function custom(tension) {\n\t\n\t function cardinal(context) {\n\t return new CardinalOpen(context, tension);\n\t }\n\t\n\t cardinal.tension = function(tension) {\n\t return custom(+tension);\n\t };\n\t\n\t return cardinal;\n\t}))(0);\n\t\n\tfunction point$2(that, x, y) {\n\t var x1 = that._x1,\n\t y1 = that._y1,\n\t x2 = that._x2,\n\t y2 = that._y2;\n\t\n\t if (that._l01_a > epsilon) {\n\t var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n\t n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n\t x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n\t y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n\t }\n\t\n\t if (that._l23_a > epsilon) {\n\t var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n\t m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n\t x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n\t y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n\t }\n\t\n\t that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n\t}\n\t\n\tfunction CatmullRom(context, alpha) {\n\t this._context = context;\n\t this._alpha = alpha;\n\t}\n\t\n\tCatmullRom.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 =\n\t this._y0 = this._y1 = this._y2 = NaN;\n\t this._l01_a = this._l12_a = this._l23_a =\n\t this._l01_2a = this._l12_2a = this._l23_2a =\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 2: this._context.lineTo(this._x2, this._y2); break;\n\t case 3: this.point(this._x2, this._y2); break;\n\t }\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t\n\t if (this._point) {\n\t var x23 = this._x2 - x,\n\t y23 = this._y2 - y;\n\t this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n\t }\n\t\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; // proceed\n\t default: point$2(this, x, y); break;\n\t }\n\t\n\t this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n\t this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar catmullRom = ((function custom(alpha) {\n\t\n\t function catmullRom(context) {\n\t return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n\t }\n\t\n\t catmullRom.alpha = function(alpha) {\n\t return custom(+alpha);\n\t };\n\t\n\t return catmullRom;\n\t}))(0.5);\n\t\n\tfunction CatmullRomClosed(context, alpha) {\n\t this._context = context;\n\t this._alpha = alpha;\n\t}\n\t\n\tCatmullRomClosed.prototype = {\n\t areaStart: noop,\n\t areaEnd: noop,\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n\t this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n\t this._l01_a = this._l12_a = this._l23_a =\n\t this._l01_2a = this._l12_2a = this._l23_2a =\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 1: {\n\t this._context.moveTo(this._x3, this._y3);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 2: {\n\t this._context.lineTo(this._x3, this._y3);\n\t this._context.closePath();\n\t break;\n\t }\n\t case 3: {\n\t this.point(this._x3, this._y3);\n\t this.point(this._x4, this._y4);\n\t this.point(this._x5, this._y5);\n\t break;\n\t }\n\t }\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t\n\t if (this._point) {\n\t var x23 = this._x2 - x,\n\t y23 = this._y2 - y;\n\t this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n\t }\n\t\n\t switch (this._point) {\n\t case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n\t case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n\t case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n\t default: point$2(this, x, y); break;\n\t }\n\t\n\t this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n\t this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar catmullRomClosed = ((function custom(alpha) {\n\t\n\t function catmullRom(context) {\n\t return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n\t }\n\t\n\t catmullRom.alpha = function(alpha) {\n\t return custom(+alpha);\n\t };\n\t\n\t return catmullRom;\n\t}))(0.5);\n\t\n\tfunction CatmullRomOpen(context, alpha) {\n\t this._context = context;\n\t this._alpha = alpha;\n\t}\n\t\n\tCatmullRomOpen.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 = this._x2 =\n\t this._y0 = this._y1 = this._y2 = NaN;\n\t this._l01_a = this._l12_a = this._l23_a =\n\t this._l01_2a = this._l12_2a = this._l23_2a =\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t\n\t if (this._point) {\n\t var x23 = this._x2 - x,\n\t y23 = this._y2 - y;\n\t this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n\t }\n\t\n\t switch (this._point) {\n\t case 0: this._point = 1; break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n\t case 3: this._point = 4; // proceed\n\t default: point$2(this, x, y); break;\n\t }\n\t\n\t this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n\t this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n\t this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n\t this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n\t }\n\t};\n\t\n\tvar catmullRomOpen = ((function custom(alpha) {\n\t\n\t function catmullRom(context) {\n\t return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n\t }\n\t\n\t catmullRom.alpha = function(alpha) {\n\t return custom(+alpha);\n\t };\n\t\n\t return catmullRom;\n\t}))(0.5);\n\t\n\tfunction LinearClosed(context) {\n\t this._context = context;\n\t}\n\t\n\tLinearClosed.prototype = {\n\t areaStart: noop,\n\t areaEnd: noop,\n\t lineStart: function() {\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (this._point) this._context.closePath();\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t if (this._point) this._context.lineTo(x, y);\n\t else this._point = 1, this._context.moveTo(x, y);\n\t }\n\t};\n\t\n\tvar linearClosed = function(context) {\n\t return new LinearClosed(context);\n\t};\n\t\n\tfunction sign(x) {\n\t return x < 0 ? -1 : 1;\n\t}\n\t\n\t// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n\t// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n\t// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n\t// NOV(II), P. 443, 1990.\n\tfunction slope3(that, x2, y2) {\n\t var h0 = that._x1 - that._x0,\n\t h1 = x2 - that._x1,\n\t s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n\t s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n\t p = (s0 * h1 + s1 * h0) / (h0 + h1);\n\t return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n\t}\n\t\n\t// Calculate a one-sided slope.\n\tfunction slope2(that, t) {\n\t var h = that._x1 - that._x0;\n\t return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n\t}\n\t\n\t// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n\t// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n\t// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\n\tfunction point$3(that, t0, t1) {\n\t var x0 = that._x0,\n\t y0 = that._y0,\n\t x1 = that._x1,\n\t y1 = that._y1,\n\t dx = (x1 - x0) / 3;\n\t that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n\t}\n\t\n\tfunction MonotoneX(context) {\n\t this._context = context;\n\t}\n\t\n\tMonotoneX.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x0 = this._x1 =\n\t this._y0 = this._y1 =\n\t this._t0 = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t switch (this._point) {\n\t case 2: this._context.lineTo(this._x1, this._y1); break;\n\t case 3: point$3(this, this._t0, slope2(this, this._t0)); break;\n\t }\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t var t1 = NaN;\n\t\n\t x = +x, y = +y;\n\t if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; break;\n\t case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n\t default: point$3(this, this._t0, t1 = slope3(this, x, y)); break;\n\t }\n\t\n\t this._x0 = this._x1, this._x1 = x;\n\t this._y0 = this._y1, this._y1 = y;\n\t this._t0 = t1;\n\t }\n\t};\n\t\n\tfunction MonotoneY(context) {\n\t this._context = new ReflectContext(context);\n\t}\n\t\n\t(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n\t MonotoneX.prototype.point.call(this, y, x);\n\t};\n\t\n\tfunction ReflectContext(context) {\n\t this._context = context;\n\t}\n\t\n\tReflectContext.prototype = {\n\t moveTo: function(x, y) { this._context.moveTo(y, x); },\n\t closePath: function() { this._context.closePath(); },\n\t lineTo: function(x, y) { this._context.lineTo(y, x); },\n\t bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n\t};\n\t\n\tfunction monotoneX(context) {\n\t return new MonotoneX(context);\n\t}\n\t\n\tfunction monotoneY(context) {\n\t return new MonotoneY(context);\n\t}\n\t\n\tfunction Natural(context) {\n\t this._context = context;\n\t}\n\t\n\tNatural.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x = [];\n\t this._y = [];\n\t },\n\t lineEnd: function() {\n\t var x = this._x,\n\t y = this._y,\n\t n = x.length;\n\t\n\t if (n) {\n\t this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n\t if (n === 2) {\n\t this._context.lineTo(x[1], y[1]);\n\t } else {\n\t var px = controlPoints(x),\n\t py = controlPoints(y);\n\t for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n\t this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n\t }\n\t }\n\t }\n\t\n\t if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n\t this._line = 1 - this._line;\n\t this._x = this._y = null;\n\t },\n\t point: function(x, y) {\n\t this._x.push(+x);\n\t this._y.push(+y);\n\t }\n\t};\n\t\n\t// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\n\tfunction controlPoints(x) {\n\t var i,\n\t n = x.length - 1,\n\t m,\n\t a = new Array(n),\n\t b = new Array(n),\n\t r = new Array(n);\n\t a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n\t for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n\t a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n\t for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n\t a[n - 1] = r[n - 1] / b[n - 1];\n\t for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n\t b[n - 1] = (x[n] + a[n - 1]) / 2;\n\t for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n\t return [a, b];\n\t}\n\t\n\tvar natural = function(context) {\n\t return new Natural(context);\n\t};\n\t\n\tfunction Step(context, t) {\n\t this._context = context;\n\t this._t = t;\n\t}\n\t\n\tStep.prototype = {\n\t areaStart: function() {\n\t this._line = 0;\n\t },\n\t areaEnd: function() {\n\t this._line = NaN;\n\t },\n\t lineStart: function() {\n\t this._x = this._y = NaN;\n\t this._point = 0;\n\t },\n\t lineEnd: function() {\n\t if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n\t if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n\t if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n\t },\n\t point: function(x, y) {\n\t x = +x, y = +y;\n\t switch (this._point) {\n\t case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n\t case 1: this._point = 2; // proceed\n\t default: {\n\t if (this._t <= 0) {\n\t this._context.lineTo(this._x, y);\n\t this._context.lineTo(x, y);\n\t } else {\n\t var x1 = this._x * (1 - this._t) + x * this._t;\n\t this._context.lineTo(x1, this._y);\n\t this._context.lineTo(x1, y);\n\t }\n\t break;\n\t }\n\t }\n\t this._x = x, this._y = y;\n\t }\n\t};\n\t\n\tvar step = function(context) {\n\t return new Step(context, 0.5);\n\t};\n\t\n\tfunction stepBefore(context) {\n\t return new Step(context, 0);\n\t}\n\t\n\tfunction stepAfter(context) {\n\t return new Step(context, 1);\n\t}\n\t\n\tvar none = function(series, order) {\n\t if (!((n = series.length) > 1)) return;\n\t for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n\t s0 = s1, s1 = series[order[i]];\n\t for (j = 0; j < m; ++j) {\n\t s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n\t }\n\t }\n\t};\n\t\n\tvar none$1 = function(series) {\n\t var n = series.length, o = new Array(n);\n\t while (--n >= 0) o[n] = n;\n\t return o;\n\t};\n\t\n\tfunction stackValue(d, key) {\n\t return d[key];\n\t}\n\t\n\tvar stack = function() {\n\t var keys = constant([]),\n\t order = none$1,\n\t offset = none,\n\t value = stackValue;\n\t\n\t function stack(data) {\n\t var kz = keys.apply(this, arguments),\n\t i,\n\t m = data.length,\n\t n = kz.length,\n\t sz = new Array(n),\n\t oz;\n\t\n\t for (i = 0; i < n; ++i) {\n\t for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n\t si[j] = sij = [0, +value(data[j], ki, j, data)];\n\t sij.data = data[j];\n\t }\n\t si.key = ki;\n\t }\n\t\n\t for (i = 0, oz = order(sz); i < n; ++i) {\n\t sz[oz[i]].index = i;\n\t }\n\t\n\t offset(sz, oz);\n\t return sz;\n\t }\n\t\n\t stack.keys = function(_) {\n\t return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n\t };\n\t\n\t stack.value = function(_) {\n\t return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n\t };\n\t\n\t stack.order = function(_) {\n\t return arguments.length ? (order = _ == null ? none$1 : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n\t };\n\t\n\t stack.offset = function(_) {\n\t return arguments.length ? (offset = _ == null ? none : _, stack) : offset;\n\t };\n\t\n\t return stack;\n\t};\n\t\n\tvar expand = function(series, order) {\n\t if (!((n = series.length) > 0)) return;\n\t for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n\t for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n\t if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n\t }\n\t none(series, order);\n\t};\n\t\n\tvar diverging = function(series, order) {\n\t if (!((n = series.length) > 1)) return;\n\t for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n\t for (yp = yn = 0, i = 0; i < n; ++i) {\n\t if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {\n\t d[0] = yp, d[1] = yp += dy;\n\t } else if (dy < 0) {\n\t d[1] = yn, d[0] = yn += dy;\n\t } else {\n\t d[0] = yp;\n\t }\n\t }\n\t }\n\t};\n\t\n\tvar silhouette = function(series, order) {\n\t if (!((n = series.length) > 0)) return;\n\t for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n\t for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n\t s0[j][1] += s0[j][0] = -y / 2;\n\t }\n\t none(series, order);\n\t};\n\t\n\tvar wiggle = function(series, order) {\n\t if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n\t for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n\t for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n\t var si = series[order[i]],\n\t sij0 = si[j][1] || 0,\n\t sij1 = si[j - 1][1] || 0,\n\t s3 = (sij0 - sij1) / 2;\n\t for (var k = 0; k < i; ++k) {\n\t var sk = series[order[k]],\n\t skj0 = sk[j][1] || 0,\n\t skj1 = sk[j - 1][1] || 0;\n\t s3 += skj0 - skj1;\n\t }\n\t s1 += sij0, s2 += s3 * sij0;\n\t }\n\t s0[j - 1][1] += s0[j - 1][0] = y;\n\t if (s1) y -= s2 / s1;\n\t }\n\t s0[j - 1][1] += s0[j - 1][0] = y;\n\t none(series, order);\n\t};\n\t\n\tvar ascending = function(series) {\n\t var sums = series.map(sum);\n\t return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; });\n\t};\n\t\n\tfunction sum(series) {\n\t var s = 0, i = -1, n = series.length, v;\n\t while (++i < n) if (v = +series[i][1]) s += v;\n\t return s;\n\t}\n\t\n\tvar descending$1 = function(series) {\n\t return ascending(series).reverse();\n\t};\n\t\n\tvar insideOut = function(series) {\n\t var n = series.length,\n\t i,\n\t j,\n\t sums = series.map(sum),\n\t order = none$1(series).sort(function(a, b) { return sums[b] - sums[a]; }),\n\t top = 0,\n\t bottom = 0,\n\t tops = [],\n\t bottoms = [];\n\t\n\t for (i = 0; i < n; ++i) {\n\t j = order[i];\n\t if (top < bottom) {\n\t top += sums[j];\n\t tops.push(j);\n\t } else {\n\t bottom += sums[j];\n\t bottoms.push(j);\n\t }\n\t }\n\t\n\t return bottoms.reverse().concat(tops);\n\t};\n\t\n\tvar reverse = function(series) {\n\t return none$1(series).reverse();\n\t};\n\t\n\texports.arc = arc;\n\texports.area = area;\n\texports.line = line;\n\texports.pie = pie;\n\texports.areaRadial = areaRadial;\n\texports.radialArea = areaRadial;\n\texports.lineRadial = lineRadial$1;\n\texports.radialLine = lineRadial$1;\n\texports.pointRadial = pointRadial;\n\texports.linkHorizontal = linkHorizontal;\n\texports.linkVertical = linkVertical;\n\texports.linkRadial = linkRadial;\n\texports.symbol = symbol;\n\texports.symbols = symbols;\n\texports.symbolCircle = circle;\n\texports.symbolCross = cross;\n\texports.symbolDiamond = diamond;\n\texports.symbolSquare = square;\n\texports.symbolStar = star;\n\texports.symbolTriangle = triangle;\n\texports.symbolWye = wye;\n\texports.curveBasisClosed = basisClosed;\n\texports.curveBasisOpen = basisOpen;\n\texports.curveBasis = basis;\n\texports.curveBundle = bundle;\n\texports.curveCardinalClosed = cardinalClosed;\n\texports.curveCardinalOpen = cardinalOpen;\n\texports.curveCardinal = cardinal;\n\texports.curveCatmullRomClosed = catmullRomClosed;\n\texports.curveCatmullRomOpen = catmullRomOpen;\n\texports.curveCatmullRom = catmullRom;\n\texports.curveLinearClosed = linearClosed;\n\texports.curveLinear = curveLinear;\n\texports.curveMonotoneX = monotoneX;\n\texports.curveMonotoneY = monotoneY;\n\texports.curveNatural = natural;\n\texports.curveStep = step;\n\texports.curveStepAfter = stepAfter;\n\texports.curveStepBefore = stepBefore;\n\texports.stack = stack;\n\texports.stackOffsetExpand = expand;\n\texports.stackOffsetDiverging = diverging;\n\texports.stackOffsetNone = none;\n\texports.stackOffsetSilhouette = silhouette;\n\texports.stackOffsetWiggle = wiggle;\n\texports.stackOrderAscending = ascending;\n\texports.stackOrderDescending = descending$1;\n\texports.stackOrderInsideOut = insideOut;\n\texports.stackOrderNone = none$1;\n\texports.stackOrderReverse = reverse;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-path/ Version 1.0.5. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t\t(factory((global.d3 = global.d3 || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tvar pi = Math.PI;\n\tvar tau = 2 * pi;\n\tvar epsilon = 1e-6;\n\tvar tauEpsilon = tau - epsilon;\n\t\n\tfunction Path() {\n\t this._x0 = this._y0 = // start of current subpath\n\t this._x1 = this._y1 = null; // end of current subpath\n\t this._ = \"\";\n\t}\n\t\n\tfunction path() {\n\t return new Path;\n\t}\n\t\n\tPath.prototype = path.prototype = {\n\t constructor: Path,\n\t moveTo: function(x, y) {\n\t this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n\t },\n\t closePath: function() {\n\t if (this._x1 !== null) {\n\t this._x1 = this._x0, this._y1 = this._y0;\n\t this._ += \"Z\";\n\t }\n\t },\n\t lineTo: function(x, y) {\n\t this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n\t },\n\t quadraticCurveTo: function(x1, y1, x, y) {\n\t this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n\t },\n\t bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n\t this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n\t },\n\t arcTo: function(x1, y1, x2, y2, r) {\n\t x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\t var x0 = this._x1,\n\t y0 = this._y1,\n\t x21 = x2 - x1,\n\t y21 = y2 - y1,\n\t x01 = x0 - x1,\n\t y01 = y0 - y1,\n\t l01_2 = x01 * x01 + y01 * y01;\n\t\n\t // Is the radius negative? Error.\n\t if (r < 0) throw new Error(\"negative radius: \" + r);\n\t\n\t // Is this path empty? Move to (x1,y1).\n\t if (this._x1 === null) {\n\t this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n\t }\n\t\n\t // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n\t else if (!(l01_2 > epsilon)) {}\n\t\n\t // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n\t // Equivalently, is (x1,y1) coincident with (x2,y2)?\n\t // Or, is the radius zero? Line to (x1,y1).\n\t else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n\t this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n\t }\n\t\n\t // Otherwise, draw an arc!\n\t else {\n\t var x20 = x2 - x0,\n\t y20 = y2 - y0,\n\t l21_2 = x21 * x21 + y21 * y21,\n\t l20_2 = x20 * x20 + y20 * y20,\n\t l21 = Math.sqrt(l21_2),\n\t l01 = Math.sqrt(l01_2),\n\t l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n\t t01 = l / l01,\n\t t21 = l / l21;\n\t\n\t // If the start tangent is not coincident with (x0,y0), line to.\n\t if (Math.abs(t01 - 1) > epsilon) {\n\t this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n\t }\n\t\n\t this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n\t }\n\t },\n\t arc: function(x, y, r, a0, a1, ccw) {\n\t x = +x, y = +y, r = +r;\n\t var dx = r * Math.cos(a0),\n\t dy = r * Math.sin(a0),\n\t x0 = x + dx,\n\t y0 = y + dy,\n\t cw = 1 ^ ccw,\n\t da = ccw ? a0 - a1 : a1 - a0;\n\t\n\t // Is the radius negative? Error.\n\t if (r < 0) throw new Error(\"negative radius: \" + r);\n\t\n\t // Is this path empty? Move to (x0,y0).\n\t if (this._x1 === null) {\n\t this._ += \"M\" + x0 + \",\" + y0;\n\t }\n\t\n\t // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n\t else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n\t this._ += \"L\" + x0 + \",\" + y0;\n\t }\n\t\n\t // Is this arc empty? We’re done.\n\t if (!r) return;\n\t\n\t // Does the angle go the wrong way? Flip the direction.\n\t if (da < 0) da = da % tau + tau;\n\t\n\t // Is this a complete circle? Draw two arcs to complete the circle.\n\t if (da > tauEpsilon) {\n\t this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n\t }\n\t\n\t // Is this arc non-empty? Draw an arc!\n\t else if (da > epsilon) {\n\t this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n\t }\n\t },\n\t rect: function(x, y, w, h) {\n\t this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n\t },\n\t toString: function() {\n\t return this._;\n\t }\n\t};\n\t\n\texports.path = path;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Format = __webpack_require__(7);\n\t\n\t /**\n\t * Calculates percentage of value from total\n\t * @param {Number} value Value to check\n\t * @param {Number} total Sum of values\n\t * @param {String} decimals Specifies number of decimals https://github.com/d3/d3-format\n\t * @return {String} Percentage\n\t */\n\t function calculatePercent(value, total, decimals) {\n\t return d3Format.format(decimals)(value / total * 100);\n\t }\n\t\n\t /**\n\t * Checks if a number is an integer of has decimal values\n\t * @param {Number} value Value to check\n\t * @return {Boolean} If it is an iteger\n\t */\n\t function isInteger(value) {\n\t return value % 1 === 0;\n\t }\n\t\n\t return {\n\t calculatePercent: calculatePercent,\n\t isInteger: isInteger\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Format = __webpack_require__(7);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var textHelper = __webpack_require__(16);\n\t var colorHelper = __webpack_require__(18);\n\t\n\t /**\n\t * @typedef LegendChartData\n\t * @type {Object[]}\n\t * @property {Number} id Id of the group (required)\n\t * @property {Number} quantity Quantity of the group (required)\n\t * @property {String} name Name of the group (required)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * id: 1,\n\t * quantity: 2,\n\t * name: 'glittering'\n\t * },\n\t * {\n\t * id: 2,\n\t * quantity: 3,\n\t * name: 'luminous'\n\t * }\n\t */\n\t\n\t /**\n\t * @fileOverview Legend Component reusable API class that renders a\n\t * simple and configurable legend element.\n\t *\n\t * @example\n\t * var donutChart = donut(),\n\t * legendBox = legend();\n\t *\n\t * donutChart\n\t * .externalRadius(500)\n\t * .internalRadius(200)\n\t * .on('customMouseOver', function(data) {\n\t * legendBox.highlight(data.data.id);\n\t * })\n\t * .on('customMouseOut', function() {\n\t * legendBox.clearHighlight();\n\t * });\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(donutChart);\n\t *\n\t * d3Selection.select('.other-css-selector')\n\t * .datum(dataset)\n\t * .call(legendBox);\n\t *\n\t * @module Legend\n\t * @tutorial legend\n\t * @exports charts/legend\n\t * @requires d3\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t top: 5,\n\t right: 5,\n\t bottom: 5,\n\t left: 5\n\t },\n\t width = 320,\n\t height = 180,\n\t textSize = 12,\n\t textLetterSpacing = 0.5,\n\t markerSize = 16,\n\t markerYOffset = -(textSize - 2) / 2,\n\t marginRatio = 1.5,\n\t valueReservedSpace = 40,\n\t numberLetterSpacing = 0.8,\n\t numberFormat = 's',\n\t isFadedClassName = 'is-faded',\n\t isHorizontal = false,\n\t\n\t\n\t // colors\n\t colorScale = void 0,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t getId = function getId(_ref) {\n\t var id = _ref.id;\n\t return id;\n\t },\n\t getName = function getName(_ref2) {\n\t var name = _ref2.name;\n\t return name;\n\t },\n\t getFormattedQuantity = function getFormattedQuantity(_ref3) {\n\t var quantity = _ref3.quantity;\n\t return d3Format.format(numberFormat)(quantity);\n\t },\n\t getCircleFill = function getCircleFill(_ref4) {\n\t var name = _ref4.name;\n\t return colorScale(name);\n\t },\n\t entries = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t svg = void 0;\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {object} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = _data;\n\t\n\t buildColorScale();\n\t buildSVG(this);\n\t if (isHorizontal) {\n\t drawHorizontalLegend();\n\t } else {\n\t drawVerticalLegend();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Depending on the size of the horizontal legend, we are going to either\n\t * center the legend or add a new line with the last entry of the legend\n\t * @return {void}\n\t */\n\t function adjustLines() {\n\t var lineWidth = svg.select('.legend-line').node().getBoundingClientRect().width;\n\t var lineWidthSpace = chartWidth - lineWidth;\n\t\n\t if (lineWidthSpace > 0) {\n\t centerLegendOnSVG();\n\t } else {\n\t splitInLines();\n\t }\n\t }\n\t\n\t /**\n\t * Builds containers for the legend\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('legend-container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('legend-group', true);\n\t }\n\t\n\t /**\n\t * Builds color scale for chart, if any colorSchema was defined\n\t * @private\n\t */\n\t function buildColorScale() {\n\t if (colorSchema) {\n\t colorScale = d3Scale.scaleOrdinal().range(colorSchema);\n\t }\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart britechart-legend', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Centers the legend on the chart given that is a single line of labels\n\t * @return {void}\n\t */\n\t function centerLegendOnSVG() {\n\t var legendGroupSize = svg.select('g.legend-container-group').node().getBoundingClientRect().width;\n\t var emptySpace = width - legendGroupSize;\n\t\n\t if (emptySpace > 0) {\n\t svg.select('g.legend-container-group').attr('transform', 'translate(' + emptySpace / 2 + ',0)');\n\t }\n\t }\n\t\n\t /**\n\t * Removes the faded class from all the entry lines\n\t */\n\t function cleanFadedLines() {\n\t svg.select('.legend-group').selectAll('g.legend-entry').classed(isFadedClassName, false);\n\t }\n\t\n\t /**\n\t * Draws the entries of the legend within a single line\n\t * @private\n\t */\n\t function drawHorizontalLegend() {\n\t var xOffset = markerSize;\n\t\n\t // We want a single line\n\t svg.select('.legend-group').append('g').classed('legend-line', true);\n\t\n\t // And one entry per data item\n\t entries = svg.select('.legend-line').selectAll('g.legend-entry').data(data);\n\t\n\t // Enter\n\t entries.enter().append('g').classed('legend-entry', true).attr('data-item', getId).attr('transform', function (_ref5) {\n\t var name = _ref5.name;\n\t\n\t var horizontalOffset = xOffset,\n\t lineHeight = chartHeight / 2,\n\t verticalOffset = lineHeight,\n\t labelWidth = textHelper.getTextWidth(name, textSize);\n\t\n\t xOffset += markerSize + 2 * getLineElementMargin() + labelWidth;\n\t\n\t return 'translate(' + horizontalOffset + ',' + verticalOffset + ')';\n\t }).merge(entries).append('circle').classed('legend-circle', true).attr('cx', markerSize / 2).attr('cy', markerYOffset).attr('r', markerSize / 2).style('fill', getCircleFill).style('stroke-width', 1);\n\t\n\t svg.select('.legend-group').selectAll('g.legend-entry').append('text').classed('legend-entry-name', true).text(getName).attr('x', getLineElementMargin()).style('font-size', textSize + 'px').style('letter-spacing', textLetterSpacing + 'px');\n\t\n\t // Exit\n\t svg.select('.legend-group').selectAll('g.legend-entry').exit().transition().style('opacity', 0).remove();\n\t\n\t adjustLines();\n\t }\n\t\n\t /**\n\t * Draws the entries of the legend\n\t * @private\n\t */\n\t function drawVerticalLegend() {\n\t entries = svg.select('.legend-group').selectAll('g.legend-line').data(data);\n\t\n\t // Enter\n\t entries.enter().append('g').classed('legend-line', true).append('g').classed('legend-entry', true).attr('data-item', getId).attr('transform', function (d, i) {\n\t var horizontalOffset = markerSize + getLineElementMargin(),\n\t lineHeight = chartHeight / (data.length + 1),\n\t verticalOffset = (i + 1) * lineHeight;\n\t\n\t return 'translate(' + horizontalOffset + ',' + verticalOffset + ')';\n\t }).merge(entries).append('circle').classed('legend-circle', true).attr('cx', markerSize / 2).attr('cy', markerYOffset).attr('r', markerSize / 2).style('fill', getCircleFill).style('stroke-width', 1);\n\t\n\t svg.select('.legend-group').selectAll('g.legend-line').selectAll('g.legend-entry').append('text').classed('legend-entry-name', true).text(getName).attr('x', getLineElementMargin()).style('font-size', textSize + 'px').style('letter-spacing', textLetterSpacing + 'px');\n\t\n\t svg.select('.legend-group').selectAll('g.legend-line').selectAll('g.legend-entry').append('text').classed('legend-entry-value', true).text(getFormattedQuantity).attr('x', chartWidth - valueReservedSpace).style('font-size', textSize + 'px').style('letter-spacing', numberLetterSpacing + 'px').style('text-anchor', 'end').style('startOffset', '100%');\n\t\n\t // Exit\n\t svg.select('.legend-group').selectAll('g.legend-line').exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Applies the faded class to all lines but the one that has the given id\n\t * @param {number} exceptionItemId Id of the line that needs to stay the same\n\t */\n\t function fadeLinesBut(exceptionItemId) {\n\t var classToFade = 'g.legend-entry';\n\t\n\t svg.select('.legend-group').selectAll(classToFade).classed(isFadedClassName, true);\n\t\n\t svg.select('[data-item=\"' + exceptionItemId + '\"]').classed(isFadedClassName, false);\n\t }\n\t\n\t /**\n\t * Calculates the margin between elements of the legend\n\t * @return {Number} Margin to apply between elements\n\t */\n\t function getLineElementMargin() {\n\t return marginRatio * markerSize;\n\t }\n\t\n\t /**\n\t * Simple method to move the last item of an overflowing legend into the next line\n\t * @return {void}\n\t * @private\n\t */\n\t function splitInLines() {\n\t var legendEntries = svg.selectAll('.legend-entry');\n\t var numberOfEntries = legendEntries.size();\n\t var lineHeight = chartHeight / 2 * 1.7;\n\t var newLine = svg.select('.legend-group').append('g').classed('legend-line', true).attr('transform', 'translate(0, ' + lineHeight + ')');\n\t var lastEntry = legendEntries.filter(':nth-child(' + numberOfEntries + ')');\n\t\n\t lastEntry.attr('transform', 'translate(' + markerSize + ',0)');\n\t newLine.append(function () {\n\t return lastEntry.node();\n\t });\n\t }\n\t\n\t /**\n\t * Clears the highlighted line entry\n\t */\n\t exports.clearHighlight = function () {\n\t cleanFadedLines();\n\t };\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {array} _x Color scheme array to get/set\n\t * @return {number | module} Current colorSchema or Donut Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the legend chart\n\t * @param {number} _x Desired width for the chart\n\t * @return {height | module} Current height or Legend module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Highlights a line entry by fading the rest of lines\n\t * @param {number} entryId ID of the entry line\n\t */\n\t exports.highlight = function (entryId) {\n\t cleanFadedLines();\n\t fadeLinesBut(entryId);\n\t };\n\t\n\t /**\n\t * Gets or Sets the horizontal mode on the legend\n\t * @param {boolean} _x Desired horizontal mode for the graph\n\t * @return {ishorizontal | module} If it is horizontal or Legend module to chain calls\n\t * @public\n\t */\n\t exports.isHorizontal = function (_x) {\n\t if (!arguments.length) {\n\t return isHorizontal;\n\t }\n\t isHorizontal = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the legend chart\n\t * @param {object} _x Margin object to get/set\n\t * @return {margin | module} Current margin or Legend module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the markerSize of the legend chart.\n\t * This markerSize will determine the horizontal and vertical size of the colored marks\n\t * added as color identifiers for the chart's categories.\n\t *\n\t * @param {object} _x Margin object to get/set\n\t * @return {markerSize | module} Current markerSize or Legend module to chain calls\n\t * @public\n\t */\n\t exports.markerSize = function (_x) {\n\t if (!arguments.length) {\n\t return markerSize;\n\t }\n\t markerSize = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the legend chart\n\t * @param {number} _x Desired width for the graph\n\t * @return {width | module} Current width or Legend module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number format of the legend chart\n\t * @param {string} _x Desired number format for the legend chart\n\t * @return {numberFormat | module} Current number format or Legend module to chain calls\n\t * @public\n\t */\n\t exports.numberFormat = function (_x) {\n\t if (!arguments.length) {\n\t return numberFormat;\n\t }\n\t numberFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Collection = __webpack_require__(9);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t var d3TimeFormat = __webpack_require__(12);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t\n\t var _require2 = __webpack_require__(26),\n\t isInteger = _require2.isInteger;\n\t\n\t var _require3 = __webpack_require__(29),\n\t getXAxisSettings = _require3.getXAxisSettings,\n\t getLocaleDateFormatter = _require3.getLocaleDateFormatter;\n\t\n\t var _require4 = __webpack_require__(19),\n\t axisTimeCombinations = _require4.axisTimeCombinations,\n\t lineGradientId = _require4.lineGradientId;\n\t\n\t var _require5 = __webpack_require__(30),\n\t formatIntegerValue = _require5.formatIntegerValue,\n\t formatDecimalValue = _require5.formatDecimalValue;\n\t /**\n\t * @typedef D3Selection\n\t * @type {Array[]}\n\t * @property {Number} length Size of the selection\n\t * @property {DOMElement} parentNode Parent of the selection\n\t */\n\t\n\t /**\n\t * @typedef lineChartDataByTopic\n\t * @type {Object}\n\t * @property {String} topicName Topic name (required)\n\t * @property {Number} topic Topic identifier (required)\n\t * @property {Object[]} dates All date entries with values for that topic (required)\n\t *\n\t * @example\n\t * {\n\t * topicName: 'San Francisco',\n\t * topic: 123,\n\t * dates: [\n\t * {\n\t * date: '2017-01-16T16:00:00-08:00',\n\t * value: 1\n\t * },\n\t * {\n\t * date: '2017-01-16T17:00:00-08:00',\n\t * value: 2\n\t * }\n\t * ]\n\t * }\n\t */\n\t\n\t /**\n\t * @typedef LineChartData\n\t * @type {Object[]}\n\t * @property {lineChartDataByTopic[]} dataByTopic Data values to chart (required)\n\t *\n\t * @example\n\t * {\n\t * dataByTopic: [\n\t * {\n\t * topicName: 'San Francisco',\n\t * topic: 123,\n\t * dates: [\n\t * {\n\t * date: '2017-01-16T16:00:00-08:00',\n\t * value: 1\n\t * },\n\t * {\n\t * date: '2017-01-16T17:00:00-08:00',\n\t * value: 2\n\t * }\n\t * ]\n\t * },\n\t * {\n\t * topicName: 'Other',\n\t * topic: 345,\n\t * dates: [\n\t * {...},\n\t * {...}\n\t * ]\n\t * }\n\t * ]\n\t * }\n\t */\n\t\n\t /**\n\t * Line Chart reusable API module that allows us\n\t * rendering a multi line and configurable chart.\n\t *\n\t * @module Line\n\t * @tutorial line\n\t * @requires d3-array, d3-axis, d3-brush, d3-ease, d3-format, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n\t *\n\t * @example\n\t * let lineChart = line();\n\t *\n\t * lineChart\n\t * .aspectRatio(0.5)\n\t * .width(500);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(lineChart);\n\t *\n\t */\n\t\n\t\n\t return function line() {\n\t\n\t var margin = {\n\t top: 60,\n\t right: 30,\n\t bottom: 40,\n\t left: 70\n\t },\n\t width = 960,\n\t height = 500,\n\t aspectRatio = null,\n\t tooltipThreshold = 480,\n\t svg = void 0,\n\t paths = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t xScale = void 0,\n\t yScale = void 0,\n\t colorScale = void 0,\n\t xAxis = void 0,\n\t xMonthAxis = void 0,\n\t yAxis = void 0,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 15,\n\t bottom: 0,\n\t right: 0\n\t },\n\t monthAxisPadding = 28,\n\t tickPadding = 5,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t singleLineGradientColors = colorHelper.colorGradients.greenBlue,\n\t topicColorMap = void 0,\n\t xAxisFormat = null,\n\t xTicks = null,\n\t xAxisCustomFormat = null,\n\t locale = void 0,\n\t isAnimated = false,\n\t ease = d3Ease.easeQuadInOut,\n\t animationDuration = 1500,\n\t maskingRectangle = void 0,\n\t lineCurve = 'linear',\n\t curveMap = {\n\t linear: d3Shape.curveLinear,\n\t basis: d3Shape.curveBasis,\n\t cardinal: d3Shape.curveCardinal,\n\t catmullRom: d3Shape.curveCatmullRom,\n\t monotoneX: d3Shape.curveMonotoneX,\n\t monotoneY: d3Shape.curveMonotoneY,\n\t natural: d3Shape.curveNatural,\n\t step: d3Shape.curveStep,\n\t stepAfter: d3Shape.curveStepAfter,\n\t stepBefore: d3Shape.curveStepBefore\n\t },\n\t dataByTopic = void 0,\n\t dataByDate = void 0,\n\t dateLabel = 'date',\n\t valueLabel = 'value',\n\t topicLabel = 'topic',\n\t topicNameLabel = 'topicName',\n\t yTicks = 5,\n\t overlay = void 0,\n\t overlayColor = 'rgba(0, 0, 0, 0)',\n\t verticalMarkerContainer = void 0,\n\t verticalMarkerLine = void 0,\n\t verticalGridLines = void 0,\n\t horizontalGridLines = void 0,\n\t grid = null,\n\t baseLine = void 0,\n\t pathYCache = {},\n\t\n\t\n\t // extractors\n\t getDate = function getDate(_ref) {\n\t var date = _ref.date;\n\t return date;\n\t },\n\t getValue = function getValue(_ref2) {\n\t var value = _ref2.value;\n\t return value;\n\t },\n\t getTopic = function getTopic(_ref3) {\n\t var topic = _ref3.topic;\n\t return topic;\n\t },\n\t getLineColor = function getLineColor(_ref4) {\n\t var topic = _ref4.topic;\n\t return colorScale(topic);\n\t },\n\t\n\t\n\t // events\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\t\n\t /**\n\t * This function creates the graph using the selection and data provided\n\t *\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {LineChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t var _cleanData = cleanData(_data);\n\t\n\t dataByTopic = _cleanData.dataByTopic;\n\t dataByDate = _cleanData.dataByDate;\n\t\n\t\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t\n\t buildScales();\n\t buildSVG(this);\n\t buildAxis();\n\t drawAxis();\n\t buildGradient();\n\t drawLines();\n\t createMaskingClip();\n\t\n\t if (shouldShowTooltip()) {\n\t drawVerticalMarker();\n\t drawHoverOverlay();\n\t addMouseEvents();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Adds events to the container group if the environment is not mobile\n\t * Adding: mouseover, mouseout and mousemove\n\t */\n\t function addMouseEvents() {\n\t svg.on('mouseover', function (d) {\n\t handleMouseOver(this, d);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d);\n\t });\n\t }\n\t\n\t /**\n\t * Adjusts the position of the y axis' ticks\n\t * @param {D3Selection} selection Y axis group\n\t * @return void\n\t */\n\t function adjustYTickLabels(selection) {\n\t selection.selectAll('.tick text').attr('transform', 'translate(0, -7)');\n\t }\n\t\n\t /**\n\t * Formats the value depending on its characteristics\n\t * @param {Number} value Value to format\n\t * @return {Number} Formatted value\n\t */\n\t function getFormattedValue(value) {\n\t var format = void 0;\n\t\n\t if (isInteger(value)) {\n\t format = formatIntegerValue;\n\t } else {\n\t format = formatDecimalValue;\n\t }\n\t\n\t return format(value);\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t var dataTimeSpan = yScale.domain()[1] - yScale.domain()[0];\n\t var yTickNumber = dataTimeSpan < yTicks - 1 ? dataTimeSpan : yTicks;\n\t var minor = void 0,\n\t major = void 0;\n\t\n\t if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n\t minor = {\n\t tick: xTicks,\n\t format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n\t };\n\t major = null;\n\t } else {\n\t var _getXAxisSettings = getXAxisSettings(dataByDate, width, xAxisFormat, locale);\n\t\n\t minor = _getXAxisSettings.minor;\n\t major = _getXAxisSettings.major;\n\t\n\t\n\t xMonthAxis = d3Axis.axisBottom(xScale).ticks(major.tick).tickSize(0, 0).tickFormat(major.format);\n\t }\n\t\n\t xAxis = d3Axis.axisBottom(xScale).ticks(minor.tick).tickSize(10, 0).tickPadding(tickPadding).tickFormat(minor.format);\n\t\n\t yAxis = d3Axis.axisLeft(yScale).ticks(yTickNumber).tickSize([0]).tickPadding(tickPadding).tickFormat(getFormattedValue);\n\t\n\t drawGridLines(minor.tick, yTickNumber);\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * NOTE: The order of drawing of this group elements is really important,\n\t * as everything else will be drawn on top of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('x-axis-group', true).append('g').classed('axis x', true);\n\t container.selectAll('.x-axis-group').append('g').classed('month-axis', true);\n\t container.append('g').classed('y-axis-group axis y', true);\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Builds the gradient element to be used later\n\t * @return {void}\n\t */\n\t function buildGradient() {\n\t svg.select('.metadata-group').append('linearGradient').attr('id', lineGradientId).attr('x1', '0%').attr('y1', '0%').attr('x2', '100%').attr('y2', '0%').selectAll('stop').data([{ offset: '0%', color: singleLineGradientColors[0] }, { offset: '100%', color: singleLineGradientColors[1] }]).enter().append('stop').attr('offset', function (_ref5) {\n\t var offset = _ref5.offset;\n\t return offset;\n\t }).attr('stop-color', function (_ref6) {\n\t var color = _ref6.color;\n\t return color;\n\t });\n\t }\n\t\n\t /**\n\t * Creates the x and y scales of the graph\n\t * @private\n\t */\n\t function buildScales() {\n\t var minX = d3Array.min(dataByTopic, function (_ref7) {\n\t var dates = _ref7.dates;\n\t return d3Array.min(dates, getDate);\n\t }),\n\t maxX = d3Array.max(dataByTopic, function (_ref8) {\n\t var dates = _ref8.dates;\n\t return d3Array.max(dates, getDate);\n\t }),\n\t maxY = d3Array.max(dataByTopic, function (_ref9) {\n\t var dates = _ref9.dates;\n\t return d3Array.max(dates, getValue);\n\t }),\n\t minY = d3Array.min(dataByTopic, function (_ref10) {\n\t var dates = _ref10.dates;\n\t return d3Array.min(dates, getValue);\n\t });\n\t var yScaleBottomValue = Math.abs(minY) < 0 ? Math.abs(minY) : 0;\n\t\n\t xScale = d3Scale.scaleTime().domain([minX, maxX]).rangeRound([0, chartWidth]);\n\t\n\t yScale = d3Scale.scaleLinear().domain([yScaleBottomValue, Math.abs(maxY)]).rangeRound([chartHeight, 0]).nice();\n\t\n\t colorScale = d3Scale.scaleOrdinal().range(colorSchema).domain(dataByTopic.map(getTopic));\n\t\n\t var range = colorScale.range();\n\t\n\t topicColorMap = colorScale.domain().reduce(function (memo, item, i) {\n\t memo[item] = range[i];\n\t\n\t return memo;\n\t }, {});\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t *\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart line-chart', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Parses dates and values into JS Date objects and numbers\n\t * @param {obj} dataByTopic Raw data grouped by topic\n\t * @return {obj} Parsed data with dataByTopic and dataByDate\n\t */\n\t function cleanData(_ref11) {\n\t var dataByTopic = _ref11.dataByTopic,\n\t dataByDate = _ref11.dataByDate;\n\t\n\t\n\t if (dataByTopic) {\n\t var flatData = [];\n\t\n\t dataByTopic.forEach(function (topic) {\n\t topic.dates.forEach(function (date) {\n\t flatData.push({\n\t topicName: topic[topicNameLabel],\n\t name: topic[topicLabel],\n\t date: date[dateLabel],\n\t value: date[valueLabel]\n\t });\n\t });\n\t });\n\t\n\t // Nest data by date and format\n\t dataByDate = d3Collection.nest().key(getDate).entries(flatData).map(function (d) {\n\t return {\n\t date: new Date(d.key),\n\t topics: d.values\n\t };\n\t });\n\t\n\t // Normalize dates in keys\n\t dataByDate = dataByDate.map(function (d) {\n\t d.date = new Date(d.date);\n\t\n\t return d;\n\t });\n\t\n\t // Normalize dataByTopic\n\t dataByTopic.forEach(function (kv) {\n\t kv.dates.forEach(function (d) {\n\t d.date = new Date(d[dateLabel]);\n\t d.value = +d[valueLabel];\n\t });\n\t });\n\t }\n\t\n\t return { dataByTopic: dataByTopic, dataByDate: dataByDate };\n\t }\n\t\n\t /**\n\t * Removes all the datapoints highlighter circles added to the marker container\n\t * @return void\n\t */\n\t function cleanDataPointHighlights() {\n\t verticalMarkerContainer.selectAll('.circle-container').remove();\n\t }\n\t\n\t /**\n\t * Creates a masking clip that would help us fake an animation if the\n\t * proper flag is true\n\t *\n\t * @return {void}\n\t */\n\t function createMaskingClip() {\n\t if (isAnimated) {\n\t // We use a white rectangle to simulate the line drawing animation\n\t maskingRectangle = svg.append('rect').attr('class', 'masking-rectangle').attr('width', width).attr('height', height).attr('x', 0).attr('y', 0);\n\t\n\t maskingRectangle.transition().duration(animationDuration).ease(ease).attr('x', width).on('end', function () {\n\t return maskingRectangle.remove();\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate(0, ' + chartHeight + ')').call(xAxis);\n\t\n\t if (xAxisFormat !== 'custom') {\n\t svg.select('.x-axis-group .month-axis').attr('transform', 'translate(0, ' + (chartHeight + monthAxisPadding) + ')').call(xMonthAxis);\n\t }\n\t\n\t svg.select('.y-axis-group.axis.y').transition().ease(ease).attr('transform', 'translate(' + -xAxisPadding.left + ', 0)').call(yAxis).call(adjustYTickLabels);\n\t }\n\t\n\t /**\n\t * Draws the line elements within the chart group\n\t * @private\n\t */\n\t function drawLines() {\n\t var lines = void 0,\n\t topicLine = void 0;\n\t\n\t topicLine = d3Shape.line().curve(curveMap[lineCurve]).x(function (_ref12) {\n\t var date = _ref12.date;\n\t return xScale(date);\n\t }).y(function (_ref13) {\n\t var value = _ref13.value;\n\t return yScale(value);\n\t });\n\t\n\t lines = svg.select('.chart-group').selectAll('.line').data(dataByTopic);\n\t\n\t paths = lines.enter().append('g').attr('class', 'topic').append('path').attr('class', 'line').attr('id', function (_ref14) {\n\t var topic = _ref14.topic;\n\t return topic;\n\t }).attr('d', function (_ref15) {\n\t var dates = _ref15.dates;\n\t return topicLine(dates);\n\t }).style('stroke', function (d) {\n\t return dataByTopic.length === 1 ? 'url(#' + lineGradientId + ')' : getLineColor(d);\n\t });\n\t\n\t lines.exit().remove();\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines(xTicks, yTicks) {\n\t if (grid === 'horizontal' || grid === 'full') {\n\t horizontalGridLines = svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(yScale.ticks(yTicks)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', -xAxisPadding.left - 30).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t }\n\t\n\t if (grid === 'vertical' || grid === 'full') {\n\t verticalGridLines = svg.select('.grid-lines-group').selectAll('line.vertical-grid-line').data(xScale.ticks(xTicks)).enter().append('line').attr('class', 'vertical-grid-line').attr('y1', 0).attr('y2', chartHeight).attr('x1', function (d) {\n\t return xScale(d);\n\t }).attr('x2', function (d) {\n\t return xScale(d);\n\t });\n\t }\n\t\n\t //draw a horizontal line to extend x-axis till the edges\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', -xAxisPadding.left - 30).attr('x2', chartWidth).attr('y1', height - margin.bottom - margin.top).attr('y2', height - margin.bottom - margin.top);\n\t }\n\t\n\t /**\n\t * Draws an overlay element over the graph\n\t * @inner\n\t * @return void\n\t */\n\t function drawHoverOverlay() {\n\t overlay = svg.select('.metadata-group').append('rect').attr('class', 'overlay').attr('y1', 0).attr('y2', height).attr('height', chartHeight).attr('width', chartWidth).attr('fill', overlayColor).style('display', 'none');\n\t }\n\t\n\t /**\n\t * Creates the vertical marker\n\t * @return void\n\t */\n\t function drawVerticalMarker() {\n\t verticalMarkerContainer = svg.select('.metadata-group').append('g').attr('class', 'hover-marker vertical-marker-container').attr('transform', 'translate(9999, 0)');\n\t\n\t verticalMarkerLine = verticalMarkerContainer.selectAll('path').data([{\n\t x1: 0,\n\t y1: 0,\n\t x2: 0,\n\t y2: 0\n\t }]).enter().append('line').classed('vertical-marker', true).attr('x1', 0).attr('y1', chartHeight).attr('x2', 0).attr('y2', 0);\n\t }\n\t\n\t /**\n\t * Finds out which datapoint is closer to the given x position\n\t * @param {Number} x0 Date value for data point\n\t * @param {Object} d0 Previous datapoint\n\t * @param {Object} d1 Next datapoint\n\t * @return {Object} d0 or d1, the datapoint with closest date to x0\n\t */\n\t function findOutNearestDate(x0, d0, d1) {\n\t return new Date(x0).getTime() - new Date(d0.date).getTime() > new Date(d1.date).getTime() - new Date(x0).getTime() ? d0 : d1;\n\t }\n\t\n\t /**\n\t * Extract X position on the graph from a given mouse event\n\t * @param {Object} event D3 mouse event\n\t * @return {Number} Position on the x axis of the mouse\n\t */\n\t function getMouseXPosition(event) {\n\t return d3Selection.mouse(event)[0];\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseX X position of the mouse\n\t * @return {Object} Data entry that is closer to that x axis position\n\t */\n\t function getNearestDataPoint(mouseX) {\n\t var dateFromInvertedX = xScale.invert(mouseX);\n\t var bisectDate = d3Array.bisector(getDate).left;\n\t var dataEntryIndex = bisectDate(dataByDate, dateFromInvertedX, 1);\n\t var dataEntryForXPosition = dataByDate[dataEntryIndex];\n\t var previousDataEntryForXPosition = dataByDate[dataEntryIndex - 1];\n\t var nearestDataPoint = void 0;\n\t\n\t if (previousDataEntryForXPosition && dataEntryForXPosition) {\n\t nearestDataPoint = findOutNearestDate(dateFromInvertedX, dataEntryForXPosition, previousDataEntryForXPosition);\n\t } else {\n\t nearestDataPoint = dataEntryForXPosition;\n\t }\n\t\n\t return nearestDataPoint;\n\t }\n\t\n\t /**\n\t * MouseMove handler, calculates the nearest dataPoint to the cursor\n\t * and updates metadata related to it\n\t * @private\n\t */\n\t function handleMouseMove(e) {\n\t var xPositionOffset = -margin.left,\n\t //Arbitrary number, will love to know how to assess it\n\t dataPoint = getNearestDataPoint(getMouseXPosition(e) + xPositionOffset),\n\t dataPointXPosition = void 0;\n\t\n\t if (dataPoint) {\n\t dataPointXPosition = xScale(new Date(dataPoint.date));\n\t // More verticalMarker to that datapoint\n\t moveVerticalMarker(dataPointXPosition);\n\t // Add data points highlighting\n\t highlightDataPoints(dataPoint);\n\t // Emit event with xPosition for tooltip or similar feature\n\t dispatcher.call('customMouseMove', e, dataPoint, topicColorMap, dataPointXPosition);\n\t }\n\t }\n\t\n\t /**\n\t * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n\t * It also resets the container of the vertical marker\n\t * @private\n\t */\n\t function handleMouseOut(e, d) {\n\t overlay.style('display', 'none');\n\t verticalMarkerLine.classed('bc-is-active', false);\n\t verticalMarkerContainer.attr('transform', 'translate(9999, 0)');\n\t\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n\t * @private\n\t */\n\t function handleMouseOver(e, d) {\n\t overlay.style('display', 'block');\n\t verticalMarkerLine.classed('bc-is-active', true);\n\t\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Creates coloured circles marking where the exact data y value is for a given data point\n\t * @param {Object} dataPoint Data point to extract info from\n\t * @private\n\t */\n\t function highlightDataPoints(dataPoint) {\n\t cleanDataPointHighlights();\n\t\n\t var nodes = paths.nodes();\n\t var nodesById = nodes.reduce(function (acc, node) {\n\t acc[node.id] = node;\n\t\n\t return acc;\n\t }, {});\n\t\n\t // Group corresponding path node with its topic, and\n\t // sorting the topics based on the order of the colors,\n\t // so that the order always stays constant\n\t var topicsWithNode = dataPoint.topics.map(function (topic) {\n\t return {\n\t topic: topic,\n\t node: nodesById[topic.name]\n\t };\n\t }).filter(function (_ref16) {\n\t var topic = _ref16.topic;\n\t return !!topic;\n\t }).sort(function (a, b) {\n\t return topicColorMap[a.topic.name] < topicColorMap[b.topic.name];\n\t });\n\t\n\t dataPoint.topics = topicsWithNode.map(function (_ref17) {\n\t var topic = _ref17.topic;\n\t return topic;\n\t });\n\t\n\t dataPoint.topics.forEach(function (_ref18, index) {\n\t var name = _ref18.name;\n\t\n\t var marker = verticalMarkerContainer.append('g').classed('circle-container', true),\n\t circleSize = 12;\n\t\n\t marker.append('circle').classed('data-point-highlighter', true).attr('cx', circleSize).attr('cy', 0).attr('r', 5).style('stroke', topicColorMap[name]);\n\t\n\t var path = topicsWithNode[index].node;\n\t var x = xScale(new Date(dataPoint.topics[index].date));\n\t var y = getPathYFromX(x, path, name);\n\t\n\t marker.attr('transform', 'translate( ' + -circleSize + ', ' + y + ' )');\n\t });\n\t }\n\t\n\t /**\n\t * Finds the y coordinate of a path given an x coordinate and the line's path node.\n\t * @param {number} x The x coordinate\n\t * @param {node} path The path node element\n\t * @param {*} name - The name identifier of the topic\n\t * @param {number} error The margin of error from the actual x coordinate. Default 0.01\n\t * @private\n\t */\n\t function getPathYFromX(x, path, name, error) {\n\t var key = name + '-' + x;\n\t\n\t if (key in pathYCache) {\n\t return pathYCache[key];\n\t }\n\t\n\t error = error || 0.01;\n\t\n\t var maxIterations = 100;\n\t\n\t var lengthStart = 0;\n\t var lengthEnd = path.getTotalLength();\n\t var point = path.getPointAtLength((lengthEnd + lengthStart) / 2);\n\t var iterations = 0;\n\t\n\t while (x < point.x - error || x > point.x + error) {\n\t var midpoint = (lengthStart + lengthEnd) / 2;\n\t\n\t point = path.getPointAtLength(midpoint);\n\t\n\t if (x < point.x) {\n\t lengthEnd = midpoint;\n\t } else {\n\t lengthStart = midpoint;\n\t }\n\t\n\t iterations += 1;\n\t if (maxIterations < iterations) {\n\t break;\n\t }\n\t }\n\t\n\t pathYCache[key] = point.y;\n\t\n\t return pathYCache[key];\n\t }\n\t\n\t /**\n\t * Helper method to update the x position of the vertical marker\n\t * @param {Object} dataPoint Data entry to extract info\n\t * @return void\n\t */\n\t function moveVerticalMarker(verticalMarkerXPosition) {\n\t verticalMarkerContainer.attr('transform', 'translate(' + verticalMarkerXPosition + ',0)');\n\t }\n\t\n\t /**\n\t * Determines if we should add the tooltip related logic depending on the\n\t * size of the chart and the tooltipThreshold variable value\n\t * @return {Boolean} Should we build the tooltip?\n\t */\n\t function shouldShowTooltip() {\n\t return width > tooltipThreshold;\n\t }\n\t\n\t // API Methods\n\t\n\t /**\n\t * Gets or Sets the aspect ratio of the chart\n\t * @param {Number} _x Desired aspect ratio for the graph\n\t * @return { (Number | Module) } Current aspect ratio or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.aspectRatio = function (_x) {\n\t if (!arguments.length) {\n\t return aspectRatio;\n\t }\n\t aspectRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the dateLabel of the chart\n\t * @param {Number} _x Desired dateLabel for the graph\n\t * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.dateLabel = function (_x) {\n\t if (!arguments.length) {\n\t return dateLabel;\n\t }\n\t dateLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x axis grouping\n\t * @param {String} _x Desired format\n\t * @return { (String|Module) } Current format or module to chain calls\n\t * @example\n\t * line.xAxisFormat(line.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.xAxisFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisFormat;\n\t }\n\t xAxisFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x format\n\t * It requires a `xAxisFormat` of 'custom' in order to work.\n\t * NOTE: localization not supported\n\t * @param {String} _x Desired format for x axis\n\t * @return { (String|Module) } Current format or module to chain calls\n\t */\n\t exports.xAxisCustomFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisCustomFormat;\n\t }\n\t xAxisCustomFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisFormat` of 'custom' in order to work.\n\t * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n\t * how many and where the ticks will appear.\n\t *\n\t * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n\t * @return { (Number|Module) } Current number or ticks or module to chain calls\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the grid mode.\n\t *\n\t * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n\t * @return { String | module} Current mode of the grid or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.grid = function (_x) {\n\t if (!arguments.length) {\n\t return grid;\n\t }\n\t grid = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { (Number | Module) } Current height or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t if (aspectRatio) {\n\t width = Math.ceil(_x / aspectRatio);\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { (Number | Module) } Current margin or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the curve of the line chart\n\t * @param {curve} _x Desired curve for the lines, default 'linear'. Other options are:\n\t * basis, natural, monotoneX, monotoneY, step, stepAfter, stepBefore, cardinal, and\n\t * catmullRom. Visit https://github.com/d3/d3-shape#curves for more information.\n\t * @return { (curve | Module) } Current line curve or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.lineCurve = function (_x) {\n\t if (!arguments.length) {\n\t return lineCurve;\n\t }\n\t lineCurve = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the gradient colors of the line chart when there is only one line\n\t * @param {String[]} _x Desired color gradient for the line (array of two hexadecimal numbers)\n\t * @return { (Number | Module) } Current color gradient or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.lineGradient = function (_x) {\n\t if (!arguments.length) {\n\t return singleLineGradientColors;\n\t }\n\t singleLineGradientColors = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the minimum width of the graph in order to show the tooltip\n\t * NOTE: This could also depend on the aspect ratio\n\t * @param {Number} _x Desired tooltip threshold for the graph\n\t * @return { (Number | Module) } Current tooltip threshold or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.tooltipThreshold = function (_x) {\n\t if (!arguments.length) {\n\t return tooltipThreshold;\n\t }\n\t tooltipThreshold = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the topicLabel of the chart\n\t * @param {Number} _x Desired topicLabel for the graph\n\t * @return { topicLabel | module} Current topicLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.topicLabel = function (_x) {\n\t if (!arguments.length) {\n\t return topicLabel;\n\t }\n\t topicLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the y axis on the chart\n\t * (Default is 5)\n\t * @param {Number} _x Desired yTicks\n\t * @return {Number | module} Current yTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return {Number | Module} Current width or Line Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t if (aspectRatio) {\n\t height = Math.ceil(_x * aspectRatio);\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Pass language tag for the tooltip to localize the date.\n\t * Feature uses Intl.DateTimeFormat, for compatability and support, refer to\n\t * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n\t * @param {String} _x must be a language tag (BCP 47) like 'en-US' or 'fr-FR'\n\t * @return { (String|Module) } Current locale or module to chain calls\n\t */\n\t exports.locale = function (_x) {\n\t if (!arguments.length) {\n\t return locale;\n\t }\n\t locale = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseHover, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Exposes the constants to be used to force the x axis to respect a certain granularity\n\t * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n\t * @example\n\t * line.xAxisCustomFormat(line.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.axisTimeCombinations = axisTimeCombinations;\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var _settingsToMajorTickM;\n\t\n\t var d3Time = __webpack_require__(11);\n\t var d3TimeFormat = __webpack_require__(12);\n\t\n\t var _require = __webpack_require__(19),\n\t axisTimeCombinations = _require.axisTimeCombinations,\n\t timeBenchmarks = _require.timeBenchmarks;\n\t\n\t var singleTickWidth = 20;\n\t var horizontalTickSpacing = 50;\n\t var minEntryNumForDayFormat = 5;\n\t\n\t var formatMap = {\n\t minute: d3TimeFormat.timeFormat('%M m'),\n\t hour: d3TimeFormat.timeFormat('%H %p'),\n\t day: d3TimeFormat.timeFormat('%e'),\n\t daymonth: d3TimeFormat.timeFormat('%d %b'),\n\t month: d3TimeFormat.timeFormat('%b'),\n\t year: d3TimeFormat.timeFormat('%Y')\n\t };\n\t var localeTimeMap = {\n\t minute: { minute: 'numeric' },\n\t hour: { hour: 'numeric' },\n\t day: { day: 'numeric' },\n\t daymonth: { day: 'numeric', month: 'short' },\n\t month: { month: 'short' },\n\t year: { year: 'numeric' }\n\t };\n\t var settingsToMajorTickMap = (_settingsToMajorTickM = {}, _defineProperty(_settingsToMajorTickM, axisTimeCombinations.MINUTE_HOUR, d3Time.timeHour.every(1)), _defineProperty(_settingsToMajorTickM, axisTimeCombinations.HOUR_DAY, d3Time.timeDay.every(1)), _defineProperty(_settingsToMajorTickM, axisTimeCombinations.DAY_MONTH, d3Time.timeMonth.every(1)), _defineProperty(_settingsToMajorTickM, axisTimeCombinations.MONTH_YEAR, d3Time.timeYear.every(1)), _settingsToMajorTickM);\n\t\n\t /**\n\t * Figures out the proper settings from the current time span\n\t * @param {Number} timeSpan Span of time charted by the graph in milliseconds\n\t * @return {String} Type of settings for the given timeSpan\n\t */\n\t var getAxisSettingsFromTimeSpan = function getAxisSettingsFromTimeSpan(timeSpan) {\n\t var ONE_YEAR = timeBenchmarks.ONE_YEAR,\n\t ONE_DAY = timeBenchmarks.ONE_DAY;\n\t\n\t var settings = void 0;\n\t\n\t if (timeSpan < ONE_DAY) {\n\t settings = axisTimeCombinations.HOUR_DAY;\n\t } else if (timeSpan < ONE_YEAR) {\n\t settings = axisTimeCombinations.DAY_MONTH;\n\t } else {\n\t settings = axisTimeCombinations.MONTH_YEAR;\n\t }\n\t\n\t return settings;\n\t };\n\t\n\t /**\n\t * Calculates the maximum number of ticks for the x axis\n\t * @param {Number} width Chart width\n\t * @param {Number} dataPointNumber Number of entries on the data\n\t * @return {Number} Number of ticks to render\n\t */\n\t var getMaxNumOfHorizontalTicks = function getMaxNumOfHorizontalTicks(width, dataPointNumber) {\n\t var ticksForWidth = Math.ceil(width / (singleTickWidth + horizontalTickSpacing));\n\t\n\t return dataPointNumber < minEntryNumForDayFormat ? d3Time.timeDay : Math.min(dataPointNumber, ticksForWidth);\n\t };\n\t\n\t /**\n\t * Takes a locale (string) and the format to return and returns a function to format dates\n\t * @param {String} locale locale tag eg. en-US, fr-FR, ru-RU\n\t * @param {string} timeUnit minute, hour, day, dayMonth, month, year\n\t * @return {function} function that formats dates in the proper locale\n\t */\n\t var getLocaleDateFormatter = function getLocaleDateFormatter(locale) {\n\t var timeUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'day';\n\t\n\t var options = localeTimeMap[timeUnit];\n\t var formatter = new Intl.DateTimeFormat(locale, options);\n\t\n\t return function (date) {\n\t return formatter.format(date);\n\t };\n\t };\n\t\n\t /**\n\t * Returns tick object to be used when building the x axis\n\t * @param {dataByDate} dataByDate Chart data ordered by Date\n\t * @param {Number} width Chart width\n\t * @param {String} settings Optional forced settings for axis\n\t * @return {object} tick settings for major and minr axis\n\t */\n\t var getXAxisSettings = function getXAxisSettings(dataByDate, width) {\n\t var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\t var locale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\t\n\t var firstDate = new Date(dataByDate[0].date);\n\t var lastDate = new Date(dataByDate[dataByDate.length - 1].date);\n\t var dateTimeSpan = lastDate - firstDate;\n\t\n\t if (locale && (typeof Intl === 'undefined' || (typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object' && !Intl.DateTimeFormat)) {\n\t locale = null;\n\t }\n\t\n\t if (!settings) {\n\t settings = getAxisSettingsFromTimeSpan(dateTimeSpan);\n\t }\n\t\n\t var _settings$split = settings.split('-'),\n\t _settings$split2 = _slicedToArray(_settings$split, 2),\n\t minor = _settings$split2[0],\n\t major = _settings$split2[1];\n\t\n\t var majorTickValue = settingsToMajorTickMap[settings];\n\t var minorTickValue = getMaxNumOfHorizontalTicks(width, dataByDate.length);\n\t\n\t return {\n\t minor: {\n\t format: locale ? getLocaleDateFormatter(locale, minor) : formatMap[minor],\n\t tick: minorTickValue\n\t },\n\t major: {\n\t format: locale ? getLocaleDateFormatter(locale, major) : formatMap[major],\n\t tick: majorTickValue\n\t }\n\t };\n\t };\n\t\n\t return {\n\t getXAxisSettings: getXAxisSettings,\n\t getLocaleDateFormatter: getLocaleDateFormatter\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Format = __webpack_require__(7);\n\t\n\t var integerValueFormats = {\n\t small: {\n\t limit: 10,\n\t format: d3Format.format('')\n\t },\n\t medium: {\n\t limit: 1000,\n\t format: d3Format.format('')\n\t },\n\t large: {\n\t limit: null,\n\t format: d3Format.format('.2s')\n\t }\n\t };\n\t var decimalValueFormats = {\n\t small: {\n\t limit: 10,\n\t format: d3Format.format('.3f')\n\t },\n\t medium: {\n\t limit: 100,\n\t format: d3Format.format('.1f')\n\t },\n\t large: {\n\t limit: null,\n\t format: d3Format.format('.2s')\n\t }\n\t };\n\t\n\t function getValueSize(value, limits) {\n\t var size = 'large';\n\t\n\t if (value < limits.small.limit) {\n\t size = 'small';\n\t } else if (value < limits.medium.limit) {\n\t size = 'medium';\n\t }\n\t return size;\n\t }\n\t\n\t /**\n\t * Formats an integer value depending on its value range\n\t * @param {Number} value Decimal point value to format\n\t * @return {Number} Formatted value to show\n\t */\n\t function formatIntegerValue(value) {\n\t var size = getValueSize(value, integerValueFormats);\n\t var format = integerValueFormats[size].format;\n\t\n\t return format(value);\n\t }\n\t\n\t /**\n\t * Formats a floating point value depending on its value range\n\t * @param {Number} value Decimal point value to format\n\t * @return {Number} Formatted value to show\n\t */\n\t function formatDecimalValue(value) {\n\t var size = getValueSize(value, decimalValueFormats);\n\t var format = decimalValueFormats[size].format;\n\t\n\t return format(value);\n\t }\n\t\n\t return {\n\t formatDecimalValue: formatDecimalValue,\n\t formatIntegerValue: formatIntegerValue\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Ease = __webpack_require__(3);\n\t var d3Format = __webpack_require__(7);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t var d3TimeFormat = __webpack_require__(12);\n\t\n\t var _require = __webpack_require__(19),\n\t axisTimeCombinations = _require.axisTimeCombinations;\n\t\n\t var _require2 = __webpack_require__(30),\n\t formatIntegerValue = _require2.formatIntegerValue,\n\t formatDecimalValue = _require2.formatDecimalValue;\n\t\n\t var _require3 = __webpack_require__(26),\n\t isInteger = _require3.isInteger;\n\t\n\t /**\n\t * Tooltip Component reusable API class that renders a\n\t * simple and configurable tooltip element for Britechart's\n\t * line chart or stacked area chart.\n\t *\n\t * @module Tooltip\n\t * @tutorial tooltip\n\t * @requires d3-array, d3-axis, d3-dispatch, d3-format, d3-scale, d3-selection, d3-transition\n\t *\n\t * @example\n\t * var lineChart = line(),\n\t * tooltip = tooltip();\n\t *\n\t * tooltip\n\t * .title('Tooltip title');\n\t *\n\t * lineChart\n\t * .width(500)\n\t * .on('customMouseOver', function() {\n\t * tooltip.show();\n\t * })\n\t * .on('customMouseMove', function(dataPoint, topicColorMap, dataPointXPosition) {\n\t * tooltip.update(dataPoint, topicColorMap, dataPointXPosition);\n\t * })\n\t * .on('customMouseOut', function() {\n\t * tooltip.hide();\n\t * });\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(lineChart);\n\t *\n\t * d3Selection.select('.metadata-group .hover-marker')\n\t * .datum([])\n\t * .call(tooltip);\n\t *\n\t */\n\t\n\t\n\t return function module() {\n\t\n\t var margin = {\n\t top: 2,\n\t right: 2,\n\t bottom: 2,\n\t left: 2\n\t },\n\t width = 250,\n\t height = 45,\n\t title = 'Tooltip title',\n\t shouldShowDateInTitle = true,\n\t valueFormat = null,\n\t\n\t\n\t // tooltip\n\t tooltip = void 0,\n\t tooltipOffset = {\n\t y: -55,\n\t x: 0\n\t },\n\t tooltipMaxTopicLength = 170,\n\t tooltipTextContainer = void 0,\n\t tooltipDivider = void 0,\n\t tooltipBody = void 0,\n\t tooltipTitle = void 0,\n\t tooltipWidth = 250,\n\t tooltipHeight = 48,\n\t tooltipBorderRadius = 3,\n\t ttTextX = 0,\n\t ttTextY = 37,\n\t textSize = void 0,\n\t entryLineLimit = 3,\n\t\n\t\n\t // Animations\n\t mouseChaseDuration = 100,\n\t ease = d3Ease.easeQuadInOut,\n\t circleYOffset = 8,\n\t colorMap = void 0,\n\t bodyFillColor = '#FFFFFF',\n\t borderStrokeColor = '#D2D6DF',\n\t titleFillColor = '#6D717A',\n\t textFillColor = '#282C35',\n\t tooltipTextColor = '#000000',\n\t dateLabel = 'date',\n\t valueLabel = 'value',\n\t nameLabel = 'name',\n\t topicLabel = 'topics',\n\t defaultAxisSettings = axisTimeCombinations.DAY_MONTH,\n\t dateFormat = null,\n\t topicsOrder = [],\n\t\n\t\n\t // formats\n\t monthDayYearFormat = d3TimeFormat.timeFormat('%b %d, %Y'),\n\t monthDayHourFormat = d3TimeFormat.timeFormat('%b %d, %I %p'),\n\t locale = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t svg = void 0;\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {Object} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = _data;\n\t\n\t buildSVG(this);\n\t });\n\t }\n\t\n\t /**\n\t * Builds containers for the tooltip\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('tooltip-container-group', true).attr('transform', 'translate( ' + margin.left + ', ' + margin.top + ')');\n\t\n\t container.append('g').classed('tooltip-group', true);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('g').classed('britechart britechart-tooltip', true);\n\t\n\t buildContainerGroups();\n\t drawTooltip();\n\t }\n\t svg.transition().attr('width', width).attr('height', height);\n\t\n\t // Hidden by default\n\t exports.hide();\n\t }\n\t\n\t /**\n\t * Resets the tooltipBody content\n\t * @return void\n\t */\n\t function cleanContent() {\n\t tooltipBody.selectAll('text').remove();\n\t tooltipBody.selectAll('circle').remove();\n\t }\n\t\n\t /**\n\t * Draws the different elements of the Tooltip box\n\t * @return void\n\t */\n\t function drawTooltip() {\n\t tooltipTextContainer = svg.selectAll('.tooltip-group').append('g').classed('tooltip-text', true);\n\t\n\t tooltip = tooltipTextContainer.append('rect').classed('tooltip-text-container', true).attr('x', -tooltipWidth / 4 + 8).attr('y', 0).attr('width', tooltipWidth).attr('height', tooltipHeight).attr('rx', tooltipBorderRadius).attr('ry', tooltipBorderRadius).style('fill', bodyFillColor).style('stroke', borderStrokeColor).style('stroke-width', 1);\n\t\n\t tooltipTitle = tooltipTextContainer.append('text').classed('tooltip-title', true).attr('x', -tooltipWidth / 4 + 17).attr('dy', '.35em').attr('y', 16).style('fill', titleFillColor);\n\t\n\t tooltipDivider = tooltipTextContainer.append('line').classed('tooltip-divider', true).attr('x1', -tooltipWidth / 4 + 15).attr('x2', 265).attr('y1', 31).attr('y2', 31).style('stroke', borderStrokeColor);\n\t\n\t tooltipBody = tooltipTextContainer.append('g').classed('tooltip-body', true).style('transform', 'translateY(8px)').style('fill', textFillColor);\n\t }\n\t\n\t /**\n\t * Formats the value depending on its characteristics\n\t * @param {Number} value Value to format\n\t * @return {Number} Formatted value\n\t */\n\t function getFormattedValue(value) {\n\t var valueFormatter = formatDecimalValue;\n\t\n\t if (!value) {\n\t return 0;\n\t }\n\t if (valueFormat) {\n\t valueFormatter = d3Format.format(valueFormat);\n\t } else if (isInteger(value)) {\n\t valueFormatter = formatIntegerValue;\n\t }\n\t\n\t return valueFormatter(value);\n\t }\n\t\n\t /**\n\t * Calculates the desired position for the tooltip\n\t * @param {Number} mouseX Current horizontal mouse position\n\t * @param {Number} mouseY Current vertical mouse position\n\t * @return {Number[]} X and Y position\n\t */\n\t function getTooltipPosition(_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t mouseX = _ref2[0],\n\t mouseY = _ref2[1];\n\t\n\t var tooltipX = void 0,\n\t tooltipY = void 0;\n\t\n\t // show tooltip to the right\n\t if (mouseX - tooltipWidth < 0) {\n\t // Tooltip on the right\n\t tooltipX = tooltipWidth - 185;\n\t } else {\n\t // Tooltip on the left\n\t tooltipX = -205;\n\t }\n\t\n\t if (mouseY) {\n\t tooltipY = tooltipOffset.y;\n\t // tooltipY = mouseY + tooltipOffset.y;\n\t } else {\n\t tooltipY = tooltipOffset.y;\n\t }\n\t\n\t return [tooltipX, tooltipY];\n\t }\n\t\n\t /**\n\t * Extracts the value from the data object\n\t * @param {Object} data Data value containing the info\n\t * @return {String} Value to show\n\t */\n\t function getValueText(data) {\n\t var value = data[valueLabel];\n\t var valueText = void 0;\n\t\n\t if (data.missingValue) {\n\t valueText = '-';\n\t } else {\n\t valueText = getFormattedValue(value).toString();\n\t }\n\t\n\t return valueText;\n\t }\n\t\n\t /**\n\t * Resets the height of the tooltip and the pointer for the text\n\t * position\n\t */\n\t function resetSizeAndPositionPointers() {\n\t tooltipHeight = 48;\n\t ttTextY = 37;\n\t ttTextX = 0;\n\t }\n\t\n\t /**\n\t * Draws the data entries inside the tooltip for a given topic\n\t * @param {Object} topic Topic to extract data from\n\t * @return void\n\t */\n\t function updateTopicContent(topic) {\n\t var name = topic[nameLabel],\n\t tooltipRight = void 0,\n\t tooltipLeftText = void 0,\n\t tooltipRightText = void 0,\n\t elementText = void 0;\n\t\n\t tooltipLeftText = topic.topicName || name;\n\t tooltipRightText = getValueText(topic);\n\t\n\t elementText = tooltipBody.append('text').classed('tooltip-left-text', true).attr('dy', '1em').attr('x', ttTextX - 20).attr('y', ttTextY).style('fill', tooltipTextColor).text(tooltipLeftText).call(textWrap, tooltipMaxTopicLength, -25);\n\t\n\t tooltipRight = tooltipBody.append('text').classed('tooltip-right-text', true).attr('dy', '1em').attr('x', ttTextX + 8).attr('y', ttTextY).style('fill', tooltipTextColor).text(tooltipRightText);\n\t\n\t textSize = elementText.node().getBBox();\n\t tooltipHeight += textSize.height + 5;\n\t\n\t // Not sure if necessary\n\t tooltipRight.attr('x', tooltipWidth - tooltipRight.node().getBBox().width - 10 - tooltipWidth / 4);\n\t\n\t tooltipBody.append('circle').classed('tooltip-circle', true).attr('cx', 23 - tooltipWidth / 4).attr('cy', ttTextY + circleYOffset).attr('r', 5).style('fill', colorMap[name]).style('stroke-width', 1);\n\t\n\t ttTextY += textSize.height + 7;\n\t }\n\t\n\t /**\n\t * Updates size and position of tooltip depending on the side of the chart we are in\n\t * TODO: This needs a refactor, following the mini-tooltip code.\n\t *\n\t * @param {Object} dataPoint DataPoint of the tooltip\n\t * @param {Number} xPosition DataPoint's x position in the chart\n\t * @param {Number} xPosition DataPoint's y position in the chart\n\t * @return void\n\t */\n\t function updatePositionAndSize(dataPoint, xPosition, yPosition) {\n\t var _getTooltipPosition = getTooltipPosition([xPosition, yPosition]),\n\t _getTooltipPosition2 = _slicedToArray(_getTooltipPosition, 2),\n\t tooltipX = _getTooltipPosition2[0],\n\t tooltipY = _getTooltipPosition2[1];\n\t\n\t tooltip.attr('width', tooltipWidth).attr('height', tooltipHeight + 10);\n\t\n\t tooltipTextContainer.transition().duration(mouseChaseDuration).ease(ease).attr('transform', 'translate(' + tooltipX + ', ' + tooltipY + ')');\n\t\n\t tooltipDivider.attr('x2', tooltipWidth - 60);\n\t }\n\t\n\t /**\n\t * Updates value of tooltipTitle with the data meaning and the date\n\t * @param {Object} dataPoint Point of data to use as source\n\t * @return void\n\t */\n\t function updateTitle(dataPoint) {\n\t var tTitle = title;\n\t\n\t if (shouldShowDateInTitle) {\n\t tTitle = tTitle + ' - ' + formatDate(new Date(dataPoint[dateLabel]));\n\t }\n\t\n\t tooltipTitle.text(tTitle);\n\t }\n\t\n\t /**\n\t * Figures out which date format to use when showing the date of the current data entry\n\t * @return {Function} The proper date formatting function\n\t */\n\t function formatDate(date) {\n\t var settings = dateFormat || defaultAxisSettings;\n\t var format = null;\n\t var localeOptions = { month: 'short', day: 'numeric' };\n\t\n\t if (settings === axisTimeCombinations.DAY_MONTH || settings === axisTimeCombinations.MONTH_YEAR) {\n\t format = monthDayYearFormat;\n\t localeOptions.year = 'numeric';\n\t } else if (settings === axisTimeCombinations.HOUR_DAY || settings === axisTimeCombinations.MINUTE_HOUR) {\n\t format = monthDayHourFormat;\n\t localeOptions.hour = 'numeric';\n\t }\n\t\n\t if (locale && typeof Intl !== 'undefined' && (typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object' && Intl.DateTimeFormat) {\n\t var f = Intl.DateTimeFormat(locale, localeOptions);\n\t\n\t return f.format(date);\n\t }\n\t\n\t return format(date);\n\t }\n\t\n\t /**\n\t * Helper method to sort the passed topics array by the names passed int he order arary\n\t * @param {Object[]} topics Topics data, retrieved from datapoint passed by line chart\n\t * @param {Object[]} order Array of names in the order to sort topics by\n\t * @return {Object[]} sorted topics object\n\t */\n\t function _sortByTopicsOrder(topics) {\n\t var order = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : topicsOrder;\n\t\n\t return order.map(function (orderName) {\n\t return topics.filter(function (_ref3) {\n\t var name = _ref3.name;\n\t return name === orderName;\n\t })[0];\n\t });\n\t }\n\t\n\t /**\n\t * Sorts topic by alphabetical order for arrays of objects with a name proeprty\n\t * @param {Array} topics List of topic objects\n\t * @return {Array} List of topic name strings\n\t */\n\t function _sortByAlpha(topics) {\n\t return topics.map(function (d) {\n\t return d;\n\t }).sort(function (a, b) {\n\t if (a.name > b.name) return 1;\n\t if (a.name === b.name) return 0;\n\t return -1;\n\t });\n\t\n\t var otherIndex = topics.map(function (_ref4) {\n\t var name = _ref4.name;\n\t return name;\n\t }).indexOf('Other');\n\t\n\t if (otherIndex >= 0) {\n\t var other = topics.splice(otherIndex, 1);\n\t\n\t topics = topics.concat(other);\n\t }\n\t }\n\t\n\t /**\n\t * Wraps a text given the text, width, x position and textFormatter function\n\t * @param {D3Selection} text Selection with the text to wrap inside\n\t * @param {Number} width Desired max width for that line\n\t * @param {Number} xpos Initial x position of the text\n\t *\n\t * REF: http://bl.ocks.org/mbostock/7555321\n\t * More discussions on https://github.com/mbostock/d3/issues/1642\n\t */\n\t function textWrap(text, width, xpos) {\n\t xpos = xpos || 0;\n\t\n\t text.each(function () {\n\t var words, word, line, lineNumber, lineHeight, y, dy, tspan;\n\t\n\t text = d3Selection.select(this);\n\t\n\t words = text.text().split(/\\s+/).reverse();\n\t line = [];\n\t lineNumber = 0;\n\t lineHeight = 1.2;\n\t y = text.attr('y');\n\t dy = parseFloat(text.attr('dy'));\n\t tspan = text.text(null).append('tspan').attr('x', xpos).attr('y', y).attr('dy', dy + 'em');\n\t\n\t while (word = words.pop()) {\n\t line.push(word);\n\t tspan.text(line.join(' '));\n\t\n\t if (tspan.node().getComputedTextLength() > width) {\n\t line.pop();\n\t tspan.text(line.join(' '));\n\t\n\t if (lineNumber < entryLineLimit - 1) {\n\t line = [word];\n\t tspan = text.append('tspan').attr('x', xpos).attr('y', y).attr('dy', ++lineNumber * lineHeight + dy + 'em').text(word);\n\t }\n\t }\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Draws the data entries inside the tooltip\n\t * @param {Object} dataPoint Data entry from to take the info\n\t * @return void\n\t */\n\t function updateContent(dataPoint) {\n\t var topics = dataPoint[topicLabel];\n\t\n\t // sort order by topicsOrder array if passed\n\t if (topicsOrder.length) {\n\t topics = _sortByTopicsOrder(topics);\n\t } else if (topics.length && topics[0].name) {\n\t topics = _sortByAlpha(topics);\n\t }\n\t\n\t cleanContent();\n\t updateTitle(dataPoint);\n\t resetSizeAndPositionPointers();\n\t topics.forEach(updateTopicContent);\n\t }\n\t\n\t /**\n\t * Updates tooltip title, content, size and position\n\t * sorts by alphatical name order if not forced order given\n\t *\n\t * @param {lineChartPointByDate} dataPoint Current datapoint to show info about\n\t * @param {Number} xPosition Position of the mouse on the X axis\n\t * @return void\n\t */\n\t function updateTooltip(dataPoint, xPosition, yPosition) {\n\t updateContent(dataPoint);\n\t updatePositionAndSize(dataPoint, xPosition, yPosition);\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * constants to be used to force the x axis to respect a certain granularity\n\t * current options: HOUR_DAY, DAY_MONTH, MONTH_YEAR\n\t * @example tooltip.dateFormat(tooltip.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.axisTimeCombinations = axisTimeCombinations;\n\t\n\t /**\n\t * Gets or Sets the dateLabel of the data\n\t * @param {Number} _x Desired dateLabel\n\t * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.dateLabel = function (_x) {\n\t if (!arguments.length) {\n\t return dateLabel;\n\t }\n\t dateLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the tooltip to use a certain date format\n\t * @param {String} _x Desired format\n\t * @return { (String|Module) } Current format or module to chain calls\n\t */\n\t exports.dateFormat = function (_x) {\n\t if (!arguments.length) {\n\t return dateFormat || defaultAxisSettings;\n\t }\n\t dateFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Hides the tooltip\n\t * @return {Module} Tooltip module to chain calls\n\t * @public\n\t */\n\t exports.hide = function () {\n\t svg.style('display', 'none');\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Pass locale for the tooltip to render the date in\n\t * @param {String} _x must be a locale tag like 'en-US' or 'fr-FR'\n\t * @return { (String|Module) } Current locale or module to chain calls\n\t */\n\t exports.locale = function (_x) {\n\t if (!arguments.length) {\n\t return locale;\n\t }\n\t locale = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the nameLabel of the data\n\t * @param {Number} _x Desired nameLabel\n\t * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabel = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabel;\n\t }\n\t nameLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Shows the tooltip\n\t * @return {Module} Tooltip module to chain calls\n\t * @public\n\t */\n\t exports.show = function () {\n\t svg.style('display', 'block');\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Pass an override for the ordering of your tooltip\n\t * @param {Object[]} _x Array of the names of your tooltip items\n\t * @return { overrideOrder | module} Current overrideOrder or Chart module to chain calls\n\t * @public\n\t */\n\t exports.topicsOrder = function (_x) {\n\t if (!arguments.length) {\n\t return topicsOrder;\n\t }\n\t topicsOrder = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the title of the tooltip\n\t * @param {string} _x Desired title\n\t * @return { string | module} Current title or module to chain calls\n\t * @public\n\t */\n\t exports.title = function (_x) {\n\t if (!arguments.length) {\n\t return title;\n\t }\n\t title = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the topicLabel of the data\n\t * @param {Number} _x Desired topicLabel\n\t * @return { topicLabel | module} Current topicLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.topicLabel = function (_x) {\n\t if (!arguments.length) {\n\t return topicLabel;\n\t }\n\t topicLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Updates the position and content of the tooltip\n\t * @param {Object} dataPoint Datapoint to represent\n\t * @param {Object} colorMapping Color scheme of the topics\n\t * @param {Number} position X-scale position in pixels\n\t * @return {Module} Tooltip module to chain calls\n\t * @public\n\t */\n\t exports.update = function (dataPoint, colorMapping, xPosition) {\n\t var yPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\t\n\t colorMap = colorMapping;\n\t updateTooltip(dataPoint, xPosition, yPosition);\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueFormat of the tooltip\n\t * @param {String} _x Desired valueFormat\n\t * @return { String | module} Current valueFormat or module to chain calls\n\t * @public\n\t */\n\t exports.valueFormat = function (_x) {\n\t if (!arguments.length) {\n\t return valueFormat;\n\t }\n\t valueFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the data\n\t * @param {Number} _x Desired valueLabel\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets shouldShowDateInTitle\n\t * @param {Boolean} _x Desired value\n\t * @return { shouldShowDateInTitle | module} Current shouldShowDateInTitle or Chart module to chain calls\n\t * @public\n\t */\n\t exports.shouldShowDateInTitle = function (_x) {\n\t if (!arguments.length) {\n\t return shouldShowDateInTitle;\n\t }\n\t shouldShowDateInTitle = _x;\n\t\n\t return this;\n\t };\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Format = __webpack_require__(7);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t /**\n\t * Mini Tooltip Component reusable API class that renders a\n\t * simple and configurable tooltip element for Britechart's\n\t * bar and step chart.\n\t *\n\t * @module Mini-tooltip\n\t * @tutorial bar\n\t * @requires d3\n\t *\n\t * @example\n\t * var barChart = line(),\n\t * miniTooltip = miniTooltip();\n\t *\n\t * barChart\n\t * .width(500)\n\t * .height(300)\n\t * .on('customMouseHover', miniTooltip.show)\n\t * .on('customMouseMove', miniTooltip.update)\n\t * .on('customMouseOut', miniTooltip.hide);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(barChart);\n\t *\n\t * d3Selection.select('.metadata-group .mini-tooltip-container')\n\t * .datum([])\n\t * .call(miniTooltip);\n\t *\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t top: 12,\n\t right: 12,\n\t bottom: 12,\n\t left: 12\n\t },\n\t width = 100,\n\t height = 100,\n\t\n\t\n\t // Optional Title\n\t title = '',\n\t\n\t\n\t // Data Format\n\t valueLabel = 'value',\n\t nameLabel = 'name',\n\t\n\t\n\t // Animations\n\t mouseChaseDuration = 100,\n\t ease = d3Ease.easeQuadInOut,\n\t\n\t\n\t // tooltip\n\t tooltipBackground = void 0,\n\t backgroundBorderRadius = 1,\n\t tooltipTextContainer = void 0,\n\t tooltipOffset = {\n\t y: 0,\n\t x: 20\n\t },\n\t\n\t\n\t // Fonts\n\t textSize = 14,\n\t textLineHeight = 1.5,\n\t valueTextSize = 27,\n\t valueTextLineHeight = 1.18,\n\t\n\t\n\t // Colors\n\t bodyFillColor = '#FFFFFF',\n\t borderStrokeColor = '#D2D6DF',\n\t titleFillColor = '#666a73',\n\t nameTextFillColor = '#666a73',\n\t valueTextFillColor = '#45494E',\n\t valueTextWeight = 200,\n\t\n\t\n\t // formats\n\t tooltipValueFormat = d3Format.format('.2f'),\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t svg = void 0;\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t */\n\t function exports(_selection) {\n\t _selection.each(function () {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t\n\t buildSVG(this);\n\t drawTooltip();\n\t });\n\t }\n\t\n\t /**\n\t * Builds containers for the tooltip\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('tooltip-container-group', true).attr('transform', 'translate( ' + margin.left + ', ' + margin.top + ')');\n\t\n\t container.append('g').classed('tooltip-group', true);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('g').classed('britechart britechart-mini-tooltip', true);\n\t\n\t buildContainerGroups();\n\t }\n\t svg.transition().attr('width', width).attr('height', height);\n\t\n\t // Hidden by default\n\t exports.hide();\n\t }\n\t\n\t /**\n\t * Draws the different elements of the Tooltip box\n\t * @return void\n\t */\n\t function drawTooltip() {\n\t tooltipTextContainer = svg.selectAll('.tooltip-group').append('g').classed('tooltip-text', true);\n\t\n\t tooltipBackground = tooltipTextContainer.append('rect').classed('tooltip-background', true).attr('width', width).attr('height', height).attr('rx', backgroundBorderRadius).attr('ry', backgroundBorderRadius).attr('y', -margin.top).attr('x', -margin.left).style('fill', bodyFillColor).style('stroke', borderStrokeColor).style('stroke-width', 1).style('pointer-events', 'none').style('opacity', 0.9);\n\t }\n\t\n\t /**\n\t * Figures out the max length of the tooltip lines\n\t * @param {D3Selection[]} texts List of svg elements of each line\n\t * @return {Number} Max size of the lines\n\t */\n\t function getMaxLengthLine() {\n\t for (var _len = arguments.length, texts = Array(_len), _key = 0; _key < _len; _key++) {\n\t texts[_key] = arguments[_key];\n\t }\n\t\n\t var textSizes = texts.filter(function (x) {\n\t return !!x;\n\t }).map(function (x) {\n\t return x.node().getBBox().width;\n\t });\n\t\n\t return d3Array.max(textSizes);\n\t }\n\t\n\t /**\n\t * Calculates the desired position for the tooltip\n\t * @param {Number} mouseX Current horizontal mouse position\n\t * @param {Number} mouseY Current vertical mouse position\n\t * @param {Number} parentChartWidth Parent's chart width\n\t * @param {Number} parentChartHeight Parent's chart height\n\t * @return {Number[]} X and Y position\n\t * @private\n\t */\n\t function getTooltipPosition(_ref, _ref2) {\n\t var _ref4 = _slicedToArray(_ref, 2),\n\t mouseX = _ref4[0],\n\t mouseY = _ref4[1];\n\t\n\t var _ref3 = _slicedToArray(_ref2, 2),\n\t parentChartWidth = _ref3[0],\n\t parentChartHeight = _ref3[1];\n\t\n\t var tooltipX = void 0,\n\t tooltipY = void 0;\n\t\n\t if (hasEnoughHorizontalRoom(parentChartWidth, mouseX)) {\n\t tooltipX = mouseX + tooltipOffset.x;\n\t } else {\n\t tooltipX = mouseX - chartWidth - tooltipOffset.x - margin.right;\n\t }\n\t\n\t if (hasEnoughVerticalRoom(parentChartHeight, mouseY)) {\n\t tooltipY = mouseY + tooltipOffset.y;\n\t } else {\n\t tooltipY = mouseY - chartHeight - tooltipOffset.y - margin.bottom;\n\t }\n\t\n\t return [tooltipX, tooltipY];\n\t }\n\t\n\t /**\n\t * Checks if the mouse is over the bounds of the parent chart\n\t * @param {Number} chartWidth Parent's chart\n\t * @param {Number} positionX Mouse position\n\t * @return {Boolean} If the mouse position allows space for the tooltip\n\t */\n\t function hasEnoughHorizontalRoom(parentChartWidth, positionX) {\n\t return parentChartWidth - margin.left - margin.right - chartWidth - positionX > 0;\n\t }\n\t\n\t /**\n\t * Checks if the mouse is over the bounds of the parent chart\n\t * @param {Number} chartWidth Parent's chart\n\t * @param {Number} positionX Mouse position\n\t * @return {Boolean} If the mouse position allows space for the tooltip\n\t */\n\t function hasEnoughVerticalRoom(parentChartHeight, positionY) {\n\t return parentChartHeight - margin.top - margin.bottom - chartHeight - positionY > 0;\n\t }\n\t\n\t /**\n\t * Hides the tooltip\n\t * @return {void}\n\t */\n\t function hideTooltip() {\n\t svg.style('display', 'none');\n\t }\n\t\n\t /**\n\t * Shows the tooltip updating it's content\n\t * @param {Object} dataPoint Data point from the chart\n\t * @return {void}\n\t */\n\t function showTooltip(dataPoint) {\n\t updateContent(dataPoint);\n\t svg.style('display', 'block');\n\t }\n\t\n\t /**\n\t * Draws the data entries inside the tooltip for a given topic\n\t * @param {Object} topic Topic to extract data from\n\t * @return void\n\t */\n\t function updateContent() {\n\t var dataPoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t\n\t var value = dataPoint[valueLabel] || '',\n\t name = dataPoint[nameLabel] || '',\n\t lineHeight = textSize * textLineHeight,\n\t valueLineHeight = valueTextSize * valueTextLineHeight,\n\t defaultDy = '1em',\n\t temporalHeight = 0,\n\t tooltipValue = void 0,\n\t tooltipName = void 0,\n\t tooltipTitle = void 0;\n\t\n\t tooltipTextContainer.selectAll('text').remove();\n\t\n\t if (title) {\n\t tooltipTitle = tooltipTextContainer.append('text').classed('mini-tooltip-title', true).attr('dy', defaultDy).attr('y', 0).style('fill', titleFillColor).style('font-size', textSize).text(title);\n\t\n\t temporalHeight = lineHeight + temporalHeight;\n\t }\n\t\n\t if (name) {\n\t tooltipName = tooltipTextContainer.append('text').classed('mini-tooltip-name', true).attr('dy', defaultDy).attr('y', temporalHeight || 0).style('fill', nameTextFillColor).style('font-size', textSize).text(name);\n\t\n\t temporalHeight = lineHeight + temporalHeight;\n\t }\n\t\n\t if (value) {\n\t tooltipValue = tooltipTextContainer.append('text').classed('mini-tooltip-value', true).attr('dy', defaultDy).attr('y', temporalHeight || 0).style('fill', valueTextFillColor).style('font-size', valueTextSize).style('font-weight', valueTextWeight).text(tooltipValueFormat(value));\n\t\n\t temporalHeight = valueLineHeight + temporalHeight;\n\t }\n\t\n\t chartWidth = getMaxLengthLine(tooltipName, tooltipTitle, tooltipValue);\n\t chartHeight = temporalHeight;\n\t }\n\t\n\t /**\n\t * Updates size and position of tooltip depending on the side of the chart we are in\n\t * @param {Object} dataPoint DataPoint of the tooltip\n\t * @return void\n\t */\n\t function updatePositionAndSize(mousePosition, parentChartSize) {\n\t var _getTooltipPosition = getTooltipPosition(mousePosition, parentChartSize),\n\t _getTooltipPosition2 = _slicedToArray(_getTooltipPosition, 2),\n\t tooltipX = _getTooltipPosition2[0],\n\t tooltipY = _getTooltipPosition2[1];\n\t\n\t svg.transition().duration(mouseChaseDuration).ease(ease).attr('height', chartHeight + margin.top + margin.bottom).attr('width', chartWidth + margin.left + margin.right).attr('transform', 'translate(' + tooltipX + ',' + tooltipY + ')');\n\t\n\t tooltipBackground.attr('height', chartHeight + margin.top + margin.bottom).attr('width', chartWidth + margin.left + margin.right);\n\t }\n\t\n\t /**\n\t * Updates tooltip content, size and position\n\t *\n\t * @param {Object} dataPoint Current datapoint to show info about\n\t * @return void\n\t */\n\t function updateTooltip(dataPoint, position, chartSize) {\n\t updateContent(dataPoint);\n\t updatePositionAndSize(position, chartSize);\n\t }\n\t\n\t /**\n\t * Hides the tooltip\n\t * @return {Module} Tooltip module to chain calls\n\t * @public\n\t */\n\t exports.hide = function () {\n\t hideTooltip();\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets data's nameLabel\n\t * @param {text} _x Desired nameLabel\n\t * @return { text | module} nameLabel or Step Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabel = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabel;\n\t }\n\t nameLabel = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Shows the tooltip\n\t * @return {Module} Tooltip module to chain calls\n\t * @public\n\t */\n\t exports.show = function () {\n\t showTooltip();\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the title of the tooltip\n\t * @param {string} _x Desired title\n\t * @return { string | module} Current title or module to chain calls\n\t * @public\n\t */\n\t exports.title = function (_x) {\n\t if (!arguments.length) {\n\t return title;\n\t }\n\t title = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Updates the position and content of the tooltip\n\t * @param {Object} dataPoint Datapoint of the hovered element\n\t * @param {Array} mousePosition Mouse position relative to the parent chart [x, y]\n\t * @param {Array} chartSize Parent chart size [x, y]\n\t * @return {module} Current component\n\t */\n\t exports.update = function (dataPoint, mousePosition, chartSize) {\n\t updateTooltip(dataPoint, mousePosition, chartSize);\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t\n\t /**\n\t * @typedef SparklineChartData\n\t * @type {Object[]}\n\t * @property {Number} value Value of the group (required)\n\t * @property {String} name Name of the group (required)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * value: 1,\n\t * date: '2011-01-06T00:00:00Z'\n\t * },\n\t * {\n\t * value: 2,\n\t * date: '2011-01-07T00:00:00Z'\n\t * }\n\t */\n\t\n\t /**\n\t * Sparkline Chart reusable API module that allows us\n\t * rendering a sparkline configurable chart.\n\t *\n\t * @module Sparkline\n\t * @tutorial sparkline\n\t * @requires d3\n\t *\n\t * @example\n\t * var sparkLineChart = sparkline();\n\t *\n\t * sparkLineChart\n\t * .width(200)\n\t * .height(100);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(sparkLineChart);\n\t *\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t left: 5,\n\t right: 5,\n\t top: 5,\n\t bottom: 5\n\t },\n\t width = 100,\n\t height = 30,\n\t xScale = void 0,\n\t yScale = void 0,\n\t areaGradient = ['#F5FDFF', '#F6FEFC'],\n\t lineGradient = colorHelper.colorGradients.greenBlue,\n\t svg = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t hasArea = true,\n\t isAnimated = false,\n\t clipDuration = 3000,\n\t ease = d3Ease.easeQuadInOut,\n\t line = void 0,\n\t markerSize = 1.5,\n\t valueLabel = 'value',\n\t dateLabel = 'date',\n\t\n\t\n\t // getters\n\t getDate = function getDate(_ref) {\n\t var date = _ref.date;\n\t return date;\n\t },\n\t getValue = function getValue(_ref2) {\n\t var value = _ref2.value;\n\t return value;\n\t };\n\t\n\t /**\n\t * This function creates the graph using the selection and data provided\n\t *\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {SparklineChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t\n\t buildScales();\n\t buildSVG(this);\n\t createGradients();\n\t createMaskingClip();\n\t drawLine();\n\t drawArea();\n\t drawEndMarker();\n\t });\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * NOTE: The order of drawing of this group elements is really important,\n\t * as everything else will be drawn on top of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Creates the x, y and color scales of the chart\n\t * @private\n\t */\n\t function buildScales() {\n\t xScale = d3Scale.scaleLinear().domain(d3Array.extent(data, getDate)).range([0, chartWidth]);\n\t\n\t yScale = d3Scale.scaleLinear().domain(d3Array.extent(data, getValue)).range([chartHeight, 0]);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart sparkline', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Cleaning data adding the proper format\n\t * @param {array} data Data\n\t * @private\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.date = new Date(d[dateLabel]);\n\t d.value = +d[valueLabel];\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Creates the gradient on the area below the line\n\t * @return {void}\n\t */\n\t function createGradients() {\n\t var metadataGroup = svg.select('.metadata-group');\n\t\n\t metadataGroup.append('linearGradient').attr('id', 'sparkline-area-gradient').attr('gradientUnits', 'userSpaceOnUse').attr('x1', 0).attr('x2', xScale(data[data.length - 1].date)).attr('y1', 0).attr('y2', 0).selectAll('stop').data([{ offset: '0%', color: areaGradient[0] }, { offset: '100%', color: areaGradient[1] }]).enter().append('stop').attr('offset', function (_ref3) {\n\t var offset = _ref3.offset;\n\t return offset;\n\t }).attr('stop-color', function (_ref4) {\n\t var color = _ref4.color;\n\t return color;\n\t });\n\t\n\t metadataGroup.append('linearGradient').attr('id', 'sparkline-line-gradient').attr('gradientUnits', 'userSpaceOnUse').attr('x1', 0).attr('x2', xScale(data[data.length - 1].date)).attr('y1', 0).attr('y2', 0).selectAll('stop').data([{ offset: '0%', color: lineGradient[0] }, { offset: '100%', color: lineGradient[1] }]).enter().append('stop').attr('offset', function (_ref5) {\n\t var offset = _ref5.offset;\n\t return offset;\n\t }).attr('stop-color', function (_ref6) {\n\t var color = _ref6.color;\n\t return color;\n\t });\n\t }\n\t\n\t /**\n\t * Creates a masking clip that would help us fake an animation if the\n\t * proper flag is true\n\t *\n\t * @return {void}\n\t */\n\t function createMaskingClip() {\n\t if (isAnimated) {\n\t svg.select('.metadata-group').append('clipPath').attr('id', 'maskingClip').append('rect').attr('width', 0).attr('height', height);\n\t\n\t d3Selection.select('#maskingClip rect').transition().ease(ease).duration(clipDuration).attr('width', width);\n\t }\n\t }\n\t\n\t /**\n\t * Draws the area that will be placed below the line\n\t * @private\n\t */\n\t function drawArea() {\n\t var area = d3Shape.area().x(function (_ref7) {\n\t var date = _ref7.date;\n\t return xScale(date);\n\t }).y0(function () {\n\t return yScale(0);\n\t }).y1(function (_ref8) {\n\t var value = _ref8.value;\n\t return yScale(value);\n\t }).curve(d3Shape.curveBasis);\n\t\n\t svg.select('.chart-group').append('path').datum(data).attr('class', 'sparkline-area').attr('d', area).attr('clip-path', 'url(#maskingClip)');\n\t }\n\t\n\t /**\n\t * Draws the line element within the chart group\n\t * @private\n\t */\n\t function drawLine() {\n\t line = d3Shape.line().curve(d3Shape.curveBasis).x(function (_ref9) {\n\t var date = _ref9.date;\n\t return xScale(date);\n\t }).y(function (_ref10) {\n\t var value = _ref10.value;\n\t return yScale(value);\n\t });\n\t\n\t svg.select('.chart-group').append('path').datum(data).attr('class', 'line').attr('d', line).attr('clip-path', 'url(#maskingClip)');\n\t }\n\t\n\t /**\n\t * Draws a marker at the end of the sparkline\n\t */\n\t function drawEndMarker() {\n\t svg.selectAll('.chart-group').append('circle').attr('class', 'sparkline-circle').attr('cx', xScale(data[data.length - 1].date)).attr('cy', yScale(data[data.length - 1].value)).attr('r', markerSize);\n\t }\n\t\n\t // Accessors\n\t /**\n\t * Gets or Sets the dateLabel of the chart\n\t * @param {Number} _x Desired dateLabel for the graph\n\t * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.dateLabel = function (_x) {\n\t if (!arguments.length) {\n\t return dateLabel;\n\t }\n\t dateLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the duration of the animation\n\t * @param {Number} _x Desired animation duration for the graph\n\t * @return { dateLabel | module} Current animation duration or Chart module to chain calls\n\t * @public\n\t */\n\t exports.duration = function (_x) {\n\t if (!arguments.length) {\n\t return clipDuration;\n\t }\n\t clipDuration = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the areaGradient of the chart\n\t * @param {String[]} _x Desired areaGradient for the graph\n\t * @return { areaGradient | module} Current areaGradient or Chart module to chain calls\n\t * @public\n\t */\n\t exports.areaGradient = function (_x) {\n\t if (!arguments.length) {\n\t return areaGradient;\n\t }\n\t areaGradient = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the lineGradient of the chart\n\t * @param {String[]} _x Desired lineGradient for the graph\n\t * @return { lineGradient | module} Current lineGradient or Chart module to chain calls\n\t * @public\n\t */\n\t exports.lineGradient = function (_x) {\n\t if (!arguments.length) {\n\t return lineGradient;\n\t }\n\t lineGradient = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { height | module} Current height or Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { width | module} Current width or Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Collection = __webpack_require__(9);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t var d3TimeFormat = __webpack_require__(12);\n\t\n\t var assign = __webpack_require__(35);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t\n\t var _require2 = __webpack_require__(29),\n\t getXAxisSettings = _require2.getXAxisSettings,\n\t getLocaleDateFormatter = _require2.getLocaleDateFormatter;\n\t\n\t var _require3 = __webpack_require__(26),\n\t isInteger = _require3.isInteger;\n\t\n\t var _require4 = __webpack_require__(19),\n\t axisTimeCombinations = _require4.axisTimeCombinations;\n\t\n\t var _require5 = __webpack_require__(30),\n\t formatIntegerValue = _require5.formatIntegerValue,\n\t formatDecimalValue = _require5.formatDecimalValue;\n\t\n\t var uniq = function uniq(arrArg) {\n\t return arrArg.filter(function (elem, pos, arr) {\n\t return arr.indexOf(elem) === pos;\n\t });\n\t };\n\t\n\t /**\n\t * @typdef D3Layout\n\t * @type function\n\t */\n\t\n\t /**\n\t * @typedef areaChartData\n\t * @type {Object}\n\t * @property {Object[]} data All data entries\n\t * @property {String} date Date of the entry\n\t * @property {String} name Name of the entry\n\t * @property {Number} value Value of the entry\n\t *\n\t * @example\n\t * {\n\t * 'data': [\n\t * {\n\t * \"date\": \"2011-01-05T00:00:00Z\",\n\t * \"name\": \"Direct\",\n\t * \"value\": 0\n\t * }\n\t * ]\n\t * }\n\t */\n\t\n\t /**\n\t * Stacked Area Chart reusable API module that allows us\n\t * rendering a multi area and configurable chart.\n\t *\n\t * @module Stacked-area\n\t * @tutorial stacked-area\n\t * @requires d3-array, d3-axis, d3-collection, d3-ease, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n\t *\n\t * @example\n\t * let stackedArea = stackedArea();\n\t *\n\t * stackedArea\n\t * .width(containerWidth);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset.data)\n\t * .call(stackedArea);\n\t *\n\t */\n\t\n\t return function module() {\n\t\n\t var margin = {\n\t top: 70,\n\t right: 30,\n\t bottom: 60,\n\t left: 70\n\t },\n\t width = 960,\n\t height = 500,\n\t xScale = void 0,\n\t xAxis = void 0,\n\t xMonthAxis = void 0,\n\t yScale = void 0,\n\t yAxis = void 0,\n\t aspectRatio = null,\n\t monthAxisPadding = 30,\n\t yTicks = 5,\n\t yTickTextYOffset = -8,\n\t yTickTextXOffset = -20,\n\t tickPadding = 5,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t areaOpacity = 0.64,\n\t categoryColorMap = void 0,\n\t order = void 0,\n\t xAxisFormat = null,\n\t xTicks = null,\n\t xAxisCustomFormat = null,\n\t locale = void 0,\n\t baseLine = void 0,\n\t layers = void 0,\n\t layersInitial = void 0,\n\t area = void 0,\n\t\n\t\n\t // Area Animation\n\t maxAreaNumber = 8,\n\t areaAnimationDelayStep = 20,\n\t areaAnimationDelays = d3Array.range(areaAnimationDelayStep, maxAreaNumber * areaAnimationDelayStep, areaAnimationDelayStep),\n\t overlay = void 0,\n\t verticalMarkerContainer = void 0,\n\t verticalMarker = void 0,\n\t epsilon = void 0,\n\t dataPoints = {},\n\t pointsSize = 1.5,\n\t pointsColor = '#c0c6cc',\n\t pointsBorderColor = '#ffffff',\n\t isAnimated = false,\n\t ease = d3Ease.easeQuadInOut,\n\t areaAnimationDuration = 1000,\n\t svg = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t dataByDate = void 0,\n\t dataByDateFormatted = void 0,\n\t dataByDateZeroed = void 0,\n\t verticalGridLines = void 0,\n\t horizontalGridLines = void 0,\n\t grid = null,\n\t tooltipThreshold = 480,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 15,\n\t bottom: 0,\n\t right: 0\n\t },\n\t dateLabel = 'date',\n\t valueLabel = 'value',\n\t keyLabel = 'name',\n\t\n\t\n\t // getters\n\t getName = function getName(_ref) {\n\t var name = _ref.name;\n\t return name;\n\t },\n\t getDate = function getDate(_ref2) {\n\t var date = _ref2.date;\n\t return date;\n\t },\n\t\n\t\n\t // events\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\t\n\t /**\n\t * This function creates the graph using the selection and data provided\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {areaChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t dataByDate = getDataByDate(data);\n\t\n\t buildLayers();\n\t buildScales();\n\t buildSVG(this);\n\t buildAxis();\n\t drawAxis();\n\t drawStackedAreas();\n\t\n\t if (shouldShowTooltip()) {\n\t drawHoverOverlay();\n\t drawVerticalMarker();\n\t addMouseEvents();\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Adds events to the container group if the environment is not mobile\n\t * Adding: mouseover, mouseout and mousemove\n\t */\n\t function addMouseEvents() {\n\t svg.on('mouseover', function (d) {\n\t handleMouseOver(this, d);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d);\n\t });\n\t }\n\t\n\t /**\n\t * Formats the value depending on its characteristics\n\t * @param {Number} value Value to format\n\t * @return {Number} Formatted value\n\t */\n\t function getFormattedValue(value) {\n\t var format = void 0;\n\t\n\t if (isInteger(value)) {\n\t format = formatIntegerValue;\n\t } else {\n\t format = formatDecimalValue;\n\t }\n\t\n\t return format(value);\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t var dataSpan = yScale.domain()[1] - yScale.domain()[0];\n\t var yTickNumber = dataSpan < yTicks - 1 ? dataSpan : yTicks;\n\t var minor = void 0,\n\t major = void 0;\n\t\n\t if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n\t minor = {\n\t tick: xTicks,\n\t format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n\t };\n\t major = null;\n\t } else {\n\t var _getXAxisSettings = getXAxisSettings(dataByDate, width, xAxisFormat, locale);\n\t\n\t minor = _getXAxisSettings.minor;\n\t major = _getXAxisSettings.major;\n\t\n\t\n\t xMonthAxis = d3Axis.axisBottom(xScale).ticks(major.tick).tickSize(0, 0).tickFormat(major.format);\n\t }\n\t\n\t xAxis = d3Axis.axisBottom(xScale).ticks(minor.tick).tickSize(10, 0).tickPadding(tickPadding).tickFormat(minor.format);\n\t\n\t yAxis = d3Axis.axisRight(yScale).ticks(yTickNumber).tickSize([0]).tickPadding(tickPadding).tickFormat(getFormattedValue);\n\t\n\t drawGridLines(minor.tick, yTickNumber);\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * NOTE: The order of drawing of this group elements is really important,\n\t * as everything else will be drawn on top of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('x-axis-group', true).append('g').classed('x axis', true);\n\t container.selectAll('.x-axis-group').append('g').classed('month-axis', true);\n\t container.append('g').classed('y-axis-group axis', true);\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Builds the stacked layers layout\n\t * @return {D3Layout} Layout for drawing the chart\n\t * @private\n\t */\n\t function buildLayers() {\n\t dataByDateFormatted = dataByDate.map(function (d) {\n\t return assign({}, d, d.values);\n\t }).map(function (d) {\n\t Object.keys(d).forEach(function (k) {\n\t var entry = d[k];\n\t\n\t if (entry && entry.name) {\n\t d[entry.name] = entry.value;\n\t }\n\t });\n\t\n\t return assign({}, d, {\n\t date: new Date(d['key'])\n\t });\n\t });\n\t\n\t dataByDateZeroed = dataByDate.map(function (d) {\n\t return assign({}, d, d.values);\n\t }).map(function (d) {\n\t Object.keys(d).forEach(function (k) {\n\t var entry = d[k];\n\t\n\t if (entry && entry.name) {\n\t d[entry.name] = 0;\n\t }\n\t });\n\t\n\t return assign({}, d, {\n\t date: new Date(d['key'])\n\t });\n\t });\n\t\n\t var initialTotalsObject = uniq(data.map(function (_ref3) {\n\t var name = _ref3.name;\n\t return name;\n\t })).reduce(function (memo, key) {\n\t return assign({}, memo, _defineProperty({}, key, 0));\n\t }, {});\n\t\n\t var totals = data.reduce(function (memo, item) {\n\t return assign({}, memo, _defineProperty({}, item.name, memo[item.name] += item.value));\n\t }, initialTotalsObject);\n\t\n\t order = formatOrder(totals);\n\t\n\t var stack3 = d3Shape.stack().keys(order).order(d3Shape.stackOrderNone).offset(d3Shape.stackOffsetNone);\n\t\n\t layersInitial = stack3(dataByDateZeroed);\n\t layers = stack3(dataByDateFormatted);\n\t }\n\t\n\t /**\n\t * Takes an object with all topics as keys and their aggregate totals as values,\n\t * sorts them into a list by descending total value and\n\t * moves \"Other\" to the end\n\t * @param {Object} totals Keys of all the topics and their corresponding totals\n\t * @return {Array} List of topic names in aggregate order\n\t */\n\t function formatOrder(totals) {\n\t var order = Object.keys(totals).sort(function (a, b) {\n\t if (totals[a] > totals[b]) return -1;\n\t if (totals[a] === totals[b]) return 0;\n\t return 1;\n\t });\n\t\n\t var otherIndex = order.indexOf('Other');\n\t\n\t if (otherIndex >= 0) {\n\t var other = order.splice(otherIndex, 1);\n\t\n\t order = order.concat(other);\n\t }\n\t\n\t return order;\n\t }\n\t\n\t /**\n\t * Creates the x, y and color scales of the chart\n\t * @private\n\t */\n\t function buildScales() {\n\t xScale = d3Scale.scaleTime().domain(d3Array.extent(dataByDate, function (_ref4) {\n\t var date = _ref4.date;\n\t return date;\n\t })).rangeRound([0, chartWidth]);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, getMaxValueByDate()]).rangeRound([chartHeight, 0]).nice();\n\t\n\t categoryColorMap = order.reduce(function (memo, topic, index) {\n\t return assign({}, memo, _defineProperty({}, topic, colorSchema[index]));\n\t }, {});\n\t }\n\t\n\t /**\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart stacked-area', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Parses dates and values into JS Date objects and numbers\n\t * @param {obj} data Raw data from JSON file\n\t * @return {obj} Parsed data with values and dates\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.date = new Date(d[dateLabel]), d.value = +d[valueLabel];\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate( 0, ' + chartHeight + ' )').call(xAxis);\n\t\n\t if (xAxisFormat !== 'custom') {\n\t svg.select('.x-axis-group .month-axis').attr('transform', 'translate(0, ' + (chartHeight + monthAxisPadding) + ')').call(xMonthAxis);\n\t }\n\t\n\t svg.select('.y-axis-group.axis').attr('transform', 'translate( ' + -xAxisPadding.left + ', 0)').call(yAxis).call(adjustYTickLabels);\n\t\n\t // Moving the YAxis tick labels to the right side\n\t // d3Selection.selectAll('.y-axis-group .tick text')\n\t // .attr('transform', `translate( ${-chartWidth - yTickTextXOffset}, ${yTickTextYOffset})` );\n\t }\n\t\n\t /**\n\t * Adjusts the position of the y axis' ticks\n\t * @param {D3Selection} selection Y axis group\n\t * @return void\n\t */\n\t function adjustYTickLabels(selection) {\n\t selection.selectAll('.tick text').attr('transform', 'translate(' + yTickTextXOffset + ', ' + yTickTextYOffset + ')');\n\t }\n\t\n\t /**\n\t * Creates SVG dot elements for each data entry and draws them\n\t * TODO: Plug\n\t */\n\t function drawDataReferencePoints() {\n\t // Creates Dots on Data points\n\t var points = svg.select('.chart-group').selectAll('.dots').data(layers).enter().append('g').attr('class', 'dots').attr('d', function (_ref5) {\n\t var values = _ref5.values;\n\t return area(values);\n\t }).attr('clip-path', 'url(#clip)');\n\t\n\t // Processes the points\n\t // TODO: Optimize this code\n\t points.selectAll('.dot').data(function (_ref6, index) {\n\t var values = _ref6.values;\n\t return values.map(function (point) {\n\t return { index: index, point: point };\n\t });\n\t }).enter().append('circle').attr('class', 'dot').attr('r', function () {\n\t return pointsSize;\n\t }).attr('fill', function () {\n\t return pointsColor;\n\t }).attr('stroke-width', '0').attr('stroke', pointsBorderColor).attr('transform', function (d) {\n\t var point = d.point;\n\t\n\t var key = xScale(point.date);\n\t\n\t dataPoints[key] = dataPoints[key] || [];\n\t dataPoints[key].push(d);\n\t\n\t var date = point.date,\n\t y = point.y,\n\t y0 = point.y0;\n\t\n\t\n\t return 'translate( ' + xScale(date) + ', ' + yScale(y + y0) + ' )';\n\t });\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines(xTicks, yTicks) {\n\t if (grid === 'horizontal' || grid === 'full') {\n\t horizontalGridLines = svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(yScale.ticks(yTicks)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', -xAxisPadding.left - 30).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t }\n\t\n\t if (grid === 'vertical' || grid === 'full') {\n\t verticalGridLines = svg.select('.grid-lines-group').selectAll('line.vertical-grid-line').data(xScale.ticks(xTicks)).enter().append('line').attr('class', 'vertical-grid-line').attr('y1', 0).attr('y2', chartHeight).attr('x1', function (d) {\n\t return xScale(d);\n\t }).attr('x2', function (d) {\n\t return xScale(d);\n\t });\n\t }\n\t\n\t //draw a horizontal line to extend x-axis till the edges\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', -xAxisPadding.left - 30).attr('x2', chartWidth).attr('y1', height - margin.bottom - margin.top).attr('y2', height - margin.bottom - margin.top);\n\t }\n\t\n\t /**\n\t * Draws an overlay element over the graph\n\t * @private\n\t */\n\t function drawHoverOverlay() {\n\t overlay = svg.select('.metadata-group').append('rect').attr('class', 'overlay').attr('y1', 0).attr('y2', chartHeight).attr('height', chartHeight).attr('width', chartWidth).attr('fill', 'rgba(0,0,0,0)').style('display', 'none');\n\t }\n\t\n\t /**\n\t * Draws the different areas into the chart-group element\n\t * @private\n\t */\n\t function drawStackedAreas() {\n\t var series = void 0;\n\t\n\t area = d3Shape.area().curve(d3Shape.curveMonotoneX).x(function (_ref7) {\n\t var data = _ref7.data;\n\t return xScale(data.date);\n\t }).y0(function (d) {\n\t return yScale(d[0]);\n\t }).y1(function (d) {\n\t return yScale(d[1]);\n\t });\n\t\n\t if (isAnimated) {\n\t series = svg.select('.chart-group').selectAll('.layer').data(layersInitial).enter().append('g').classed('layer-container', true);\n\t\n\t series.append('path').attr('class', 'layer').attr('d', area).style('fill', function (_ref8) {\n\t var key = _ref8.key;\n\t return categoryColorMap[key];\n\t });\n\t\n\t // Update\n\t svg.select('.chart-group').selectAll('.layer').data(layers).transition().delay(function (_, i) {\n\t return areaAnimationDelays[i];\n\t }).duration(areaAnimationDuration).ease(ease).attr('d', area).style('opacity', areaOpacity).style('fill', function (_ref9) {\n\t var key = _ref9.key;\n\t return categoryColorMap[key];\n\t });\n\t } else {\n\t series = svg.select('.chart-group').selectAll('.layer').data(layers).enter().append('g').classed('layer-container', true);\n\t\n\t series.append('path').attr('class', 'layer').attr('d', area).style('fill', function (_ref10) {\n\t var key = _ref10.key;\n\t return categoryColorMap[key];\n\t });\n\t\n\t // Update\n\t series.attr('d', area).style('opacity', areaOpacity).style('fill', function (_ref11) {\n\t var key = _ref11.key;\n\t return categoryColorMap[key];\n\t });\n\t }\n\t\n\t // Exit\n\t series.exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Creates the vertical marker\n\t * @return void\n\t */\n\t function drawVerticalMarker() {\n\t verticalMarkerContainer = svg.select('.metadata-group').append('g').attr('class', 'vertical-marker-container').attr('transform', 'translate(9999, 0)');\n\t\n\t verticalMarker = verticalMarkerContainer.selectAll('path').data([{\n\t x1: 0,\n\t y1: 0,\n\t x2: 0,\n\t y2: 0\n\t }]).enter().append('line').classed('vertical-marker', true).attr('x1', 0).attr('y1', chartHeight).attr('x2', 0).attr('y2', 0);\n\t }\n\t\n\t /**\n\t * Removes all the datapoints highlighter circles added to the marker container\n\t * @return void\n\t */\n\t function eraseDataPointHighlights() {\n\t verticalMarkerContainer.selectAll('.circle-container').remove();\n\t }\n\t\n\t /**\n\t * Orders the data by date for consumption on the chart tooltip\n\t * @param {areaChartData} data Chart data\n\t * @return {Object[]} Chart data ordered by date\n\t * @private\n\t */\n\t function getDataByDate(data) {\n\t return d3Collection.nest().key(getDate).entries(data.sort(function (a, b) {\n\t return a.date - b.date;\n\t })).map(function (d) {\n\t return assign({}, d, {\n\t date: new Date(d.key)\n\t });\n\t });\n\t\n\t // let b = d3Collection.nest()\n\t // .key(getDate).sortKeys(d3Array.ascending)\n\t // .entries(data);\n\t }\n\t\n\t /**\n\t * Computes the maximum sum of values for any date\n\t *\n\t * @return {Number} Max value\n\t */\n\t function getMaxValueByDate() {\n\t var keys = uniq(data.map(function (o) {\n\t return o.name;\n\t }));\n\t var maxValueByDate = d3Array.max(dataByDateFormatted, function (d) {\n\t var vals = keys.map(function (key) {\n\t return d[key];\n\t });\n\t\n\t return d3Array.sum(vals);\n\t });\n\t\n\t return maxValueByDate;\n\t }\n\t\n\t /**\n\t * Extract X position on the chart from a given mouse event\n\t * @param {obj} event D3 mouse event\n\t * @return {Number} Position on the x axis of the mouse\n\t * @private\n\t */\n\t function getMouseXPosition(event) {\n\t return d3Selection.mouse(event)[0];\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseX X position of the mouse\n\t * @return {obj} Data entry that is closer to that x axis position\n\t */\n\t function getNearestDataPoint(mouseX) {\n\t var points = dataByDate.filter(function (_ref12) {\n\t var date = _ref12.date;\n\t return Math.abs(xScale(date) - mouseX) <= epsilon;\n\t });\n\t\n\t if (points.length) {\n\t return points[0];\n\t }\n\t }\n\t\n\t /**\n\t * Epsilon is the value given to the number representing half of the distance in\n\t * pixels between two date data points\n\t * @return {Number} half distance between any two points\n\t */\n\t function setEpsilon() {\n\t var dates = dataByDate.map(function (_ref13) {\n\t var date = _ref13.date;\n\t return date;\n\t });\n\t\n\t epsilon = (xScale(dates[1]) - xScale(dates[0])) / 2;\n\t }\n\t\n\t /**\n\t * MouseMove handler, calculates the nearest dataPoint to the cursor\n\t * and updates metadata related to it\n\t * @private\n\t */\n\t function handleMouseMove(e) {\n\t epsilon || setEpsilon();\n\t\n\t var dataPoint = getNearestDataPoint(getMouseXPosition(e) - margin.left),\n\t dataPointXPosition = void 0;\n\t\n\t if (dataPoint) {\n\t dataPointXPosition = xScale(new Date(dataPoint.key));\n\t // Move verticalMarker to that datapoint\n\t moveVerticalMarker(dataPointXPosition);\n\t // Add data points highlighting\n\t highlightDataPoints(dataPoint);\n\t // Emit event with xPosition for tooltip or similar feature\n\t dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, dataPointXPosition);\n\t }\n\t }\n\t\n\t /**\n\t * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n\t * It also resets the container of the vertical marker\n\t * @private\n\t */\n\t function handleMouseOut(e, d) {\n\t overlay.style('display', 'none');\n\t verticalMarker.classed('bc-is-active', false);\n\t verticalMarkerContainer.attr('transform', 'translate(9999, 0)');\n\t\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n\t * @private\n\t */\n\t function handleMouseOver(e, d) {\n\t overlay.style('display', 'block');\n\t verticalMarker.classed('bc-is-active', true);\n\t\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Creates coloured circles marking where the exact data y value is for a given data point\n\t * @param {obj} dataPoint Data point to extract info from\n\t * @private\n\t */\n\t function highlightDataPoints(_ref14) {\n\t var values = _ref14.values;\n\t\n\t var accumulator = 0;\n\t\n\t eraseDataPointHighlights();\n\t\n\t // ensure order stays constant\n\t values = values.filter(function (v) {\n\t return !!v;\n\t }).sort(function (a, b) {\n\t return order.indexOf(a.name) > order.indexOf(b.name);\n\t });\n\t\n\t values.forEach(function (_ref15, index) {\n\t var name = _ref15.name;\n\t\n\t var marker = verticalMarkerContainer.append('g').classed('circle-container', true),\n\t circleSize = 12;\n\t\n\t accumulator = accumulator + values[index][valueLabel];\n\t\n\t marker.append('circle').classed('data-point-highlighter', true).attr('cx', circleSize).attr('cy', 0).attr('r', 5).style('stroke-width', 2).style('stroke', categoryColorMap[name]);\n\t\n\t marker.attr('transform', 'translate( ' + -circleSize + ', ' + yScale(accumulator) + ' )');\n\t });\n\t }\n\t\n\t /**\n\t * Helper method to update the x position of the vertical marker\n\t * @param {obj} dataPoint Data entry to extract info\n\t * @return void\n\t */\n\t function moveVerticalMarker(verticalMarkerXPosition) {\n\t verticalMarkerContainer.attr('transform', 'translate(' + verticalMarkerXPosition + ',0)');\n\t }\n\t\n\t /**\n\t * Determines if we should add the tooltip related logic depending on the\n\t * size of the chart and the tooltipThreshold variable value\n\t * @return {boolean} Should we build the tooltip?\n\t * @private\n\t */\n\t function shouldShowTooltip() {\n\t return width > tooltipThreshold;\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * Gets or Sets the opacity of the stacked areas in the chart (all of them will have the same opacity)\n\t * @param {Object} _x Opacity to get/set\n\t * @return { opacity | module} Current opacity or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.areaOpacity = function (_x) {\n\t if (!arguments.length) {\n\t return areaOpacity;\n\t }\n\t areaOpacity = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the aspect ratio of the chart\n\t * @param {Number} _x Desired aspect ratio for the graph\n\t * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.aspectRatio = function (_x) {\n\t if (!arguments.length) {\n\t return aspectRatio;\n\t }\n\t aspectRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the dateLabel of the chart\n\t * @param {Number} _x Desired dateLabel for the graph\n\t * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.dateLabel = function (_x) {\n\t if (!arguments.length) {\n\t return dateLabel;\n\t }\n\t dateLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the grid mode.\n\t *\n\t * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n\t * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.grid = function (_x) {\n\t if (!arguments.length) {\n\t return grid;\n\t }\n\t grid = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { height | module} Current height or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t if (aspectRatio) {\n\t width = Math.ceil(_x / aspectRatio);\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the keyLabel of the chart\n\t * @param {Number} _x Desired keyLabel for the graph\n\t * @return { keyLabel | module} Current keyLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.keyLabel = function (_x) {\n\t if (!arguments.length) {\n\t return keyLabel;\n\t }\n\t keyLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the minimum width of the graph in order to show the tooltip\n\t * NOTE: This could also depend on the aspect ratio\n\t *\n\t * @param {Object} _x Margin object to get/set\n\t * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.tooltipThreshold = function (_x) {\n\t if (!arguments.length) {\n\t return tooltipThreshold;\n\t }\n\t tooltipThreshold = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Pass language tag for the tooltip to localize the date.\n\t * Feature uses Intl.DateTimeFormat, for compatability and support, refer to\n\t * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n\t * @param {String} _x must be a language tag (BCP 47) like 'en-US' or 'fr-FR'\n\t * @return { (String|Module) } Current locale or module to chain calls\n\t */\n\t exports.locale = function (_x) {\n\t if (!arguments.length) {\n\t return locale;\n\t }\n\t locale = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Exposes the constants to be used to force the x axis to respect a certain granularity\n\t * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n\t * @example\n\t * area.xAxisFormat(area.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.axisTimeCombinations = axisTimeCombinations;\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return {Number | module} Current width or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t if (aspectRatio) {\n\t height = Math.ceil(_x * aspectRatio);\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x format\n\t * It requires a `xAxisFormat` of 'custom' in order to work.\n\t * NOTE: localization not supported\n\t * @param {String} _x Desired format for x axis\n\t * @return {String | Module} Current format or module to chain calls\n\t */\n\t exports.xAxisCustomFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisCustomFormat;\n\t }\n\t xAxisCustomFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x axis grouping\n\t * @param {String} _x Desired format\n\t * @return {String | Module} Current format or module to chain calls\n\t * @example\n\t * area.xAxisFormat(area.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.xAxisFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisFormat;\n\t }\n\t xAxisFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisFormat` of 'custom' in order to work.\n\t * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n\t * how many and where the ticks will appear.\n\t *\n\t * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n\t * @return {Number | Module} Current number or ticks or module to chain calls\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the y axis on the chart\n\t * (Default is 5)\n\t * @param {Number} _x Desired vertical ticks\n\t * @return {Number | module} Current vertical ticks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * lodash (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright jQuery Foundation and other contributors \n\t * Released under MIT license \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {Array} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t switch (args.length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Creates a unary function that invokes `func` with its argument transformed.\n\t *\n\t * @private\n\t * @param {Function} func The function to wrap.\n\t * @param {Function} transform The argument transform.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction overArg(func, transform) {\n\t return function(arg) {\n\t return func(transform(arg));\n\t };\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = overArg(Object.keys, Object),\n\t nativeMax = Math.max;\n\t\n\t/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */\n\tvar nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');\n\t\n\t/**\n\t * Creates an array of the enumerable property names of the array-like `value`.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @param {boolean} inherited Specify returning inherited property names.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction arrayLikeKeys(value, inherited) {\n\t // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n\t // Safari 9 makes `arguments.length` enumerable in strict mode.\n\t var result = (isArray(value) || isArguments(value))\n\t ? baseTimes(value.length, String)\n\t : [];\n\t\n\t var length = result.length,\n\t skipIndexes = !!length;\n\t\n\t for (var key in value) {\n\t if ((inherited || hasOwnProperty.call(value, key)) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t if (!isPrototype(object)) {\n\t return nativeKeys(object);\n\t }\n\t var result = [];\n\t for (var key in Object(object)) {\n\t if (hasOwnProperty.call(object, key) && key != 'constructor') {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n\t *\n\t * @private\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseRest(func, start) {\n\t start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t index = -1;\n\t var otherArgs = Array(start + 1);\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property identifiers to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index];\n\t\n\t var newValue = customizer\n\t ? customizer(object[key], source[key], key, object, source)\n\t : undefined;\n\t\n\t assignValue(object, key, newValue === undefined ? source[key] : newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return baseRest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = (assigner.length > 3 && typeof customizer == 'function')\n\t ? (length--, customizer)\n\t : undefined;\n\t\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return !!length &&\n\t (typeof value == 'number' || reIsUint.test(value)) &&\n\t (value > -1 && value % 1 == 0 && value < length);\n\t}\n\t\n\t/**\n\t * Checks if the given arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n\t * else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)\n\t ) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Performs a\n\t * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'a': 1 };\n\t * var other = { 'a': 1 };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null && isLength(value.length) && !isFunction(value);\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8-9 which returns 'object' for typed array and other constructors.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This method is loosely based on\n\t * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' &&\n\t value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the\n\t * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n\t * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Assigns own enumerable string keyed properties of source objects to the\n\t * destination object. Source objects are applied from left to right.\n\t * Subsequent sources overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.10.0\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @see _.assignIn\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * Foo.prototype.b = 2;\n\t * Bar.prototype.d = 4;\n\t *\n\t * _.assign({ 'a': 0 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {\n\t copyObject(source, keys(source), object);\n\t return;\n\t }\n\t for (var key in source) {\n\t if (hasOwnProperty.call(source, key)) {\n\t assignValue(object, key, source[key]);\n\t }\n\t }\n\t});\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @since 0.1.0\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n\t}\n\t\n\tmodule.exports = assign;\n\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Color = __webpack_require__(5);\n\t var d3Collection = __webpack_require__(9);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Interpolate = __webpack_require__(10);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Selection = __webpack_require__(13);\n\t var assign = __webpack_require__(35);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t var NUMBER_FORMAT = ',f';\n\t var uniq = function uniq(arrArg) {\n\t return arrArg.filter(function (elem, pos, arr) {\n\t return arr.indexOf(elem) == pos;\n\t });\n\t };\n\t\n\t /**\n\t * @typdef D3Layout\n\t * @type function\n\t */\n\t\n\t /**\n\t * @typedef GroupedBarChartData\n\t * @type {Object}\n\t * @property {Object[]} data All data entries\n\t * @property {String} name Name of the entry\n\t * @property {String} group group of the entry\n\t * @property {Number} value Value of the entry\n\t *\n\t * @example\n\t * {\n\t * 'data': [\n\t * {\n\t * \"name\": \"2011-01\",\n\t * \"group\": \"Direct\",\n\t * \"value\": 0\n\t * }\n\t * ]\n\t * }\n\t */\n\t\n\t /**\n\t * Grouped Bar Chart reusable API module that allows us\n\t * rendering a multi grouped bar and configurable chart.\n\t *\n\t * @module Grouped-bar\n\t * @tutorial grouped-bar\n\t * @requires d3-array, d3-axis, d3-color, d3-collection, d3-dispatch, d3-ease,\n\t * d3-interpolate, d3-scale, d3-selection, lodash assign\n\t *\n\t * @example\n\t * let groupedBar = GroupedBar();\n\t *\n\t * groupedBar\n\t * .width(containerWidth);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset.data)\n\t * .call(groupedBar);\n\t *\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t top: 40,\n\t right: 30,\n\t bottom: 60,\n\t left: 70\n\t },\n\t width = 960,\n\t height = 500,\n\t xScale = void 0,\n\t xScale2 = void 0,\n\t xAxis = void 0,\n\t yScale = void 0,\n\t yScale2 = void 0,\n\t yAxis = void 0,\n\t aspectRatio = null,\n\t yTickTextYOffset = -8,\n\t yTickTextXOffset = -20,\n\t yTicks = 5,\n\t xTicks = 5,\n\t baseLine = void 0,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t colorScale = void 0,\n\t categoryColorMap = void 0,\n\t layers = void 0,\n\t ease = d3Ease.easeQuadInOut,\n\t isHorizontal = false,\n\t svg = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t groups = void 0,\n\t transformedData = void 0,\n\t tooltipThreshold = 480,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 0,\n\t bottom: 0,\n\t right: 0\n\t },\n\t maxBarNumber = 8,\n\t barOpacity = 0.24,\n\t animationDelayStep = 20,\n\t animationDelays = d3Array.range(animationDelayStep, maxBarNumber * animationDelayStep, animationDelayStep),\n\t animationDuration = 1000,\n\t grid = null,\n\t nameLabel = 'name',\n\t valueLabel = 'value',\n\t groupLabel = 'group',\n\t valueLabelFormat = NUMBER_FORMAT,\n\t\n\t\n\t // getters\n\t getName = function getName(_ref) {\n\t var name = _ref.name;\n\t return name;\n\t },\n\t getValue = function getValue(_ref2) {\n\t var value = _ref2.value;\n\t return value;\n\t },\n\t getGroup = function getGroup(_ref3) {\n\t var group = _ref3.group;\n\t return group;\n\t },\n\t isAnimated = false,\n\t\n\t\n\t // events\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\t\n\t /**\n\t * This function creates the graph using the selection and data provided\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {GroupedBarChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t\n\t prepareData(data);\n\t buildScales();\n\t buildLayers();\n\t buildSVG(this);\n\t drawGridLines();\n\t buildAxis();\n\t drawAxis();\n\t drawGroupedBar();\n\t addMouseEvents();\n\t });\n\t }\n\t\n\t /**\n\t * Adds events to the container group if the environment is not mobile\n\t * Adding: mouseover, mouseout and mousemove\n\t */\n\t function addMouseEvents() {\n\t if (shouldShowTooltip()) {\n\t svg.on('mouseover', function (d) {\n\t handleMouseOver(this, d);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d);\n\t });\n\t }\n\t\n\t svg.selectAll('.bar').on('mouseover', function (d) {\n\t handleBarsMouseOver(this, d);\n\t }).on('mouseout', function (d) {\n\t handleBarsMouseOut(this, d);\n\t });\n\t }\n\t\n\t /**\n\t * Adjusts the position of the y axis' ticks\n\t * @param {D3Selection} selection Y axis group\n\t * @return void\n\t */\n\t function adjustYTickLabels(selection) {\n\t selection.selectAll('.tick text').attr('transform', 'translate(' + yTickTextXOffset + ', ' + yTickTextYOffset + ')');\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t if (isHorizontal) {\n\t xAxis = d3Axis.axisBottom(xScale).ticks(xTicks, valueLabelFormat);\n\t yAxis = d3Axis.axisLeft(yScale);\n\t } else {\n\t xAxis = d3Axis.axisBottom(xScale);\n\t yAxis = d3Axis.axisLeft(yScale).ticks(yTicks, valueLabelFormat);\n\t }\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * NOTE: The order of drawing of this group elements is really important,\n\t * as everything else will be drawn on top of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('x-axis-group', true).append('g').classed('x axis', true);\n\t container.selectAll('.x-axis-group').append('g').classed('month-axis', true);\n\t container.append('g').classed('y-axis-group axis', true);\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Builds the grouped layers layout\n\t * @return {D3Layout} Layout for drawing the chart\n\t * @private\n\t */\n\t function buildLayers() {\n\t layers = transformedData.map(function (item) {\n\t var ret = {};\n\t\n\t groups.forEach(function (key) {\n\t ret[key] = item[key];\n\t });\n\t\n\t return assign({}, item, ret);\n\t });\n\t }\n\t\n\t /**\n\t * Creates the x, y and color scales of the chart\n\t * @private\n\t */\n\t function buildScales() {\n\t var yMax = d3Array.max(data.map(getValue));\n\t\n\t if (isHorizontal) {\n\t xScale = d3Scale.scaleLinear().domain([0, yMax]).rangeRound([0, chartWidth - 1]);\n\t // 1 pix for edge tick\n\t\n\t yScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([chartHeight, 0]).padding(0.1);\n\t\n\t yScale2 = d3Scale.scaleBand().domain(data.map(getGroup)).rangeRound([yScale.bandwidth(), 0]).padding(0.1);\n\t } else {\n\t xScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([0, chartWidth]).padding(0.1);\n\t xScale2 = d3Scale.scaleBand().domain(data.map(getGroup)).rangeRound([0, xScale.bandwidth()]).padding(0.1);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, yMax]).rangeRound([chartHeight, 0]).nice();\n\t }\n\t\n\t colorScale = d3Scale.scaleOrdinal().range(colorSchema).domain(data.map(getGroup));\n\t\n\t categoryColorMap = colorScale.domain(data.map(getName)).domain().reduce(function (memo, item) {\n\t data.forEach(function (v) {\n\t if (getName(v) == item) {\n\t memo[v.name] = colorScale(v.group);\n\t memo[v.group] = colorScale(v.group);\n\t memo[v.group + item] = colorScale(v.group);\n\t }\n\t });\n\t return memo;\n\t }, {});\n\t }\n\t\n\t /**\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart grouped-bar', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Parses dates and values into JS Date objects and numbers\n\t * @param {obj} data Raw data from JSON file\n\t * @return {obj} Parsed data with values and dates\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.value = +d[valueLabel];\n\t d.group = d[groupLabel];\n\t // for tooltip\n\t d.topicName = getGroup(d);\n\t d.name = d[nameLabel];\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t if (isHorizontal) {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate( 0, ' + chartHeight + ' )').call(xAxis);\n\t\n\t svg.select('.y-axis-group.axis').attr('transform', 'translate( ' + -xAxisPadding.left + ', 0)').call(yAxis);\n\t } else {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate( 0, ' + chartHeight + ' )').call(xAxis);\n\t\n\t svg.select('.y-axis-group.axis').attr('transform', 'translate( ' + -xAxisPadding.left + ', 0)').call(yAxis).call(adjustYTickLabels);\n\t }\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend x-axis till the edges\n\t * @return {void}\n\t */\n\t function drawHorizontalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', chartHeight).attr('y2', chartHeight);\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend y-axis till the edges\n\t * @return {void}\n\t */\n\t function drawVerticalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-y-line').data([0]).enter().append('line').attr('class', 'extended-y-line').attr('y1', xAxisPadding.bottom).attr('y2', chartHeight).attr('x1', 0).attr('x2', 0);\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines() {\n\t var scale = isHorizontal ? xScale : yScale;\n\t\n\t if (grid === 'horizontal' || grid === 'full') {\n\t svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(scale.ticks(yTicks).slice(1)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', -xAxisPadding.left + 1).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t }\n\t\n\t if (grid === 'vertical' || grid === 'full') {\n\t svg.select('.grid-lines-group').selectAll('line.vertical-grid-line').data(scale.ticks(xTicks).slice(1)).enter().append('line').attr('class', 'vertical-grid-line').attr('y1', 0).attr('y2', chartHeight).attr('x1', function (d) {\n\t return xScale(d);\n\t }).attr('x2', function (d) {\n\t return xScale(d);\n\t });\n\t }\n\t\n\t if (isHorizontal) {\n\t drawVerticalExtendedLine();\n\t } else {\n\t drawHorizontalExtendedLine();\n\t }\n\t }\n\t\n\t /**\n\t * Draws the bars along the x axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawHorizontalBars(series) {\n\t // Enter + Update\n\t var bars = series.data(layers).enter().append('g').attr('transform', function (_ref4) {\n\t var key = _ref4.key;\n\t return 'translate(0,' + yScale(key) + ')';\n\t }).classed('layer', true).selectAll('.bar').data(function (_ref5) {\n\t var values = _ref5.values;\n\t return values;\n\t }).enter().append('rect').classed('bar', true).attr('x', 1).attr('y', function (d) {\n\t return yScale2(getGroup(d));\n\t }).attr('height', yScale2.bandwidth()).attr('fill', function (data) {\n\t return categoryColorMap[data.group];\n\t });\n\t\n\t if (isAnimated) {\n\t bars.style('opacity', barOpacity).transition().delay(function (_, i) {\n\t return animationDelays[i];\n\t }).duration(animationDuration).ease(ease).tween('attr.width', horizontalBarsTween);\n\t } else {\n\t bars.attr('width', function (d) {\n\t return xScale(getValue(d));\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Draws the bars along the y axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawVerticalBars(series) {\n\t // Enter + Update\n\t var bars = series.data(layers).enter().append('g').attr('transform', function (d) {\n\t return 'translate(' + xScale(d.key) + ',0)';\n\t }).classed('layer', true).selectAll('.bar').data(function (d) {\n\t return d.values;\n\t }).enter().append('rect').classed('bar', true).attr('x', function (d) {\n\t return xScale2(getGroup(d));\n\t }).attr('y', function (d) {\n\t return yScale(d.value);\n\t }).attr('width', xScale2.bandwidth).attr('fill', function (data) {\n\t return categoryColorMap[data.group];\n\t });\n\t\n\t if (isAnimated) {\n\t bars.style('opacity', barOpacity).transition().delay(function (_, i) {\n\t return animationDelays[i];\n\t }).duration(animationDuration).ease(ease).tween('attr.height', verticalBarsTween);\n\t } else {\n\t bars.attr('height', function (d) {\n\t return chartHeight - yScale(getValue(d));\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Draws the different areas into the chart-group element\n\t * @private\n\t */\n\t function drawGroupedBar() {\n\t var series = svg.select('.chart-group').selectAll('.layer');\n\t\n\t if (isHorizontal) {\n\t drawHorizontalBars(series);\n\t } else {\n\t drawVerticalBars(series);\n\t }\n\t // Exit\n\t series.exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Extract X position on the chart from a given mouse event\n\t * @param {obj} event D3 mouse event\n\t * @return {Number} Position on the x axis of the mouse\n\t * @private\n\t */\n\t function getMousePosition(event) {\n\t return d3Selection.mouse(event);\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseX X position of the mouse\n\t * @return {obj} Data entry that is closer to that x axis position\n\t */\n\t function getNearestDataPoint(mouseX) {\n\t var adjustedMouseX = mouseX - margin.left,\n\t epsilon = xScale2.bandwidth(),\n\t nearest = [];\n\t\n\t layers.forEach(function (data) {\n\t var found = data.values.find(function (d2) {\n\t return Math.abs(adjustedMouseX >= xScale(d2[nameLabel]) + xScale2(d2[groupLabel])) && Math.abs(adjustedMouseX - xScale2(d2[groupLabel]) - xScale(d2[nameLabel]) <= epsilon);\n\t });\n\t\n\t if (found) {\n\t found.values = data.values;\n\t found.key = found.name;\n\t nearest.push(found);\n\t }\n\t });\n\t\n\t return nearest.length ? nearest[0] : undefined;\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseX X position of the mouse\n\t * @return {obj} Data entry that is closer to that x axis position\n\t */\n\t function getNearestDataPoint2(mouseY) {\n\t var adjustedMouseY = mouseY - margin.bottom,\n\t epsilon = yScale.bandwidth(),\n\t nearest = [];\n\t\n\t layers.map(function (data) {\n\t var found = data.values.find(function (d2) {\n\t return Math.abs(adjustedMouseY >= yScale(d2[nameLabel])) && Math.abs(adjustedMouseY - yScale(d2[nameLabel]) <= epsilon * 2);\n\t });\n\t\n\t if (found) {\n\t found.values = data.values;\n\t found.key = found.name;\n\t nearest.push(found);\n\t }\n\t });\n\t\n\t return nearest.length ? nearest[0] : undefined;\n\t }\n\t\n\t /**\n\t * Handles a mouseover event on top of a bar\n\t * @param {obj} e the fired event\n\t * @param {obj} d data of bar\n\t * @return {void}\n\t */\n\t function handleBarsMouseOver(e, d) {\n\t d3Selection.select(e).attr('fill', function () {\n\t return d3Color.color(categoryColorMap[d.group]).darker();\n\t });\n\t }\n\t\n\t /**\n\t * Handles a mouseout event out of a bar\n\t * @param {obj} e the fired event\n\t * @param {obj} d data of bar\n\t * @return {void}\n\t */\n\t function handleBarsMouseOut(e, d) {\n\t d3Selection.select(e).attr('fill', function () {\n\t return categoryColorMap[d.group];\n\t });\n\t }\n\t\n\t /**\n\t * MouseMove handler, calculates the nearest dataPoint to the cursor\n\t * and updates metadata related to it\n\t * @param {obj} e the fired event\n\t * @private\n\t */\n\t function handleMouseMove(e) {\n\t var _getMousePosition = getMousePosition(e),\n\t _getMousePosition2 = _slicedToArray(_getMousePosition, 2),\n\t mouseX = _getMousePosition2[0],\n\t mouseY = _getMousePosition2[1],\n\t dataPoint = isHorizontal ? getNearestDataPoint2(mouseY) : getNearestDataPoint(mouseX),\n\t x = void 0,\n\t y = void 0;\n\t\n\t if (dataPoint) {\n\t // Move verticalMarker to that datapoint\n\t if (isHorizontal) {\n\t x = mouseX - margin.left;\n\t y = yScale(dataPoint.key) + yScale.bandwidth() / 2;\n\t } else {\n\t x = xScale(dataPoint.key) + xScale2(dataPoint[groupLabel]);\n\t y = mouseY - margin.bottom;\n\t }\n\t moveTooltipOriginXY(x, y);\n\t\n\t // Emit event with xPosition for tooltip or similar feature\n\t dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, x, y);\n\t }\n\t }\n\t\n\t /**\n\t * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n\t * It also resets the container of the vertical marker\n\t * @private\n\t */\n\t function handleMouseOut(e, d) {\n\t svg.select('.metadata-group').attr('transform', 'translate(9999, 0)');\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n\t * @private\n\t */\n\t function handleMouseOver(e, d) {\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Animation tween of horizontal bars\n\t * @param {obj} d data of bar\n\t * @return {void}\n\t */\n\t function horizontalBarsTween(d) {\n\t var node = d3Selection.select(this),\n\t i = d3Interpolate.interpolateRound(0, xScale(getValue(d))),\n\t j = d3Interpolate.interpolateNumber(0, 1);\n\t\n\t return function (t) {\n\t node.attr('width', i(t)).style('opacity', j(t));\n\t };\n\t }\n\t\n\t /**\n\t * Helper method to update the x position of the vertical marker\n\t * @param {obj} dataPoint Data entry to extract info\n\t * @return void\n\t */\n\t function moveTooltipOriginXY(originXPosition, originYPosition) {\n\t svg.select('.metadata-group').attr('transform', 'translate(' + originXPosition + ',' + originYPosition + ')');\n\t }\n\t\n\t /**\n\t * Prepare data for create chart.\n\t * @private\n\t */\n\t function prepareData(data) {\n\t groups = uniq(data.map(function (d) {\n\t return getGroup(d);\n\t }));\n\t transformedData = d3Collection.nest().key(getName).rollup(function (values) {\n\t var ret = {};\n\t\n\t values.forEach(function (entry) {\n\t if (entry && entry[groupLabel]) {\n\t ret[entry[groupLabel]] = getValue(entry);\n\t }\n\t });\n\t //for tooltip\n\t ret.values = values;\n\t return ret;\n\t }).entries(data).map(function (data) {\n\t return assign({}, {\n\t total: d3Array.sum(d3Array.permute(data.value, groups)),\n\t key: data.key\n\t }, data.value);\n\t });\n\t }\n\t\n\t /**\n\t * Determines if we should add the tooltip related logic depending on the\n\t * size of the chart and the tooltipThreshold variable value\n\t * @return {boolean} Should we build the tooltip?\n\t * @private\n\t */\n\t function shouldShowTooltip() {\n\t return width > tooltipThreshold;\n\t }\n\t\n\t /**\n\t * Animation tween of vertical bars\n\t * @param {obj} d data of bar\n\t * @return {void}\n\t */\n\t function verticalBarsTween(d) {\n\t var node = d3Selection.select(this),\n\t i = d3Interpolate.interpolateRound(0, chartHeight - yScale(getValue(d))),\n\t y = d3Interpolate.interpolateRound(chartHeight, yScale(getValue(d))),\n\t j = d3Interpolate.interpolateNumber(0, 1);\n\t\n\t return function (t) {\n\t node.attr('y', y(t)).attr('height', i(t)).style('opacity', j(t));\n\t };\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * Gets or Sets the aspect ratio of the chart\n\t * @param {Number} _x Desired aspect ratio for the graph\n\t * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.aspectRatio = function (_x) {\n\t if (!arguments.length) {\n\t return aspectRatio;\n\t }\n\t aspectRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Gets or Sets the groupLabel of the chart\n\t * @param {String} _x Desired groupLabel for the graph\n\t * @return { groupLabel | module} Current groupLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.groupLabel = function (_x) {\n\t if (!arguments.length) {\n\t return groupLabel;\n\t }\n\t groupLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the grid mode.\n\t *\n\t * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n\t * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.grid = function (_x) {\n\t if (!arguments.length) {\n\t return grid;\n\t }\n\t grid = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { height | module} Current height or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t if (aspectRatio) {\n\t width = Math.ceil(_x / aspectRatio);\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the horizontal direction of the chart\n\t * @param {number} _x Desired horizontal direction for the graph\n\t * @return { isHorizontal | module} If it is horizontal or Bar Chart module to chain calls\n\t * @public\n\t */\n\t exports.isHorizontal = function (_x) {\n\t if (!arguments.length) {\n\t return isHorizontal;\n\t }\n\t isHorizontal = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the nameLabel of the chart\n\t * @param {Number} _x Desired dateLabel for the graph\n\t * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabel = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabel;\n\t }\n\t nameLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the y axis on the chart\n\t * @param {Number} _x Desired vertical ticks\n\t * @return {Number | module} Current yTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Gets or Sets the minimum width of the graph in order to show the tooltip\n\t * NOTE: This could also depend on the aspect ratio\n\t *\n\t * @param {Object} _x Margin object to get/set\n\t * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.tooltipThreshold = function (_x) {\n\t if (!arguments.length) {\n\t return tooltipThreshold;\n\t }\n\t tooltipThreshold = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabelFormat of the chart\n\t * @param {String[]} _x Desired valueLabelFormat for the graph\n\t * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabelFormat = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabelFormat;\n\t }\n\t valueLabelFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { width | module} Current width or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t if (aspectRatio) {\n\t height = Math.ceil(_x * aspectRatio);\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the x axis on the chart\n\t * @param {Number} _x Desired xTicks\n\t * @return {Number | module} Current xTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Color = __webpack_require__(5);\n\t var d3Collection = __webpack_require__(9);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Interpolate = __webpack_require__(10);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Selection = __webpack_require__(13);\n\t var assign = __webpack_require__(35);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t var colorHelper = __webpack_require__(18);\n\t var NUMBER_FORMAT = ',f';\n\t var uniq = function uniq(arrArg) {\n\t return arrArg.filter(function (elem, pos, arr) {\n\t return arr.indexOf(elem) == pos;\n\t });\n\t };\n\t\n\t /**\n\t * @typdef D3Layout\n\t * @type function\n\t */\n\t\n\t /**\n\t * @typedef stackedBarData\n\t * @type {Object}\n\t * @property {Object[]} data All data entries\n\t * @property {String} name Name of the entry\n\t * @property {String} stack Stack of the entry\n\t * @property {Number} value Value of the entry\n\t *\n\t * @example\n\t * {\n\t * 'data': [\n\t * {\n\t * \"name\": \"2011-01\",\n\t * \"stack\": \"Direct\",\n\t * \"value\": 0\n\t * }\n\t * ]\n\t * }\n\t */\n\t\n\t /**\n\t * Stacked Area Chart reusable API module that allows us\n\t * rendering a multi area and configurable chart.\n\t *\n\t * @module Stacked-bar\n\t * @tutorial stacked-bar\n\t * @requires d3-array, d3-axis, d3-color, d3-collection, d3-dispatch, d3-ease,\n\t * d3-interpolate, d3-scale, d3-shape, d3-selection, lodash assign\n\t *\n\t * @example\n\t * let stackedBar = stackedBar();\n\t *\n\t * stackedBar\n\t * .width(containerWidth);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset.data)\n\t * .call(stackedBar);\n\t *\n\t */\n\t return function module() {\n\t\n\t var margin = {\n\t top: 40,\n\t right: 30,\n\t bottom: 60,\n\t left: 70\n\t },\n\t width = 960,\n\t height = 500,\n\t xScale = void 0,\n\t xAxis = void 0,\n\t yScale = void 0,\n\t yAxis = void 0,\n\t aspectRatio = null,\n\t yTickTextYOffset = -8,\n\t yTickTextXOffset = -20,\n\t yTicks = 5,\n\t xTicks = 5,\n\t percentageAxisToMaxRatio = 1,\n\t colorSchema = colorHelper.colorSchemas.britecharts,\n\t colorScale = void 0,\n\t categoryColorMap = void 0,\n\t layers = void 0,\n\t ease = d3Ease.easeQuadInOut,\n\t isHorizontal = false,\n\t svg = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t data = void 0,\n\t transformedData = void 0,\n\t stacks = void 0,\n\t tooltipThreshold = 480,\n\t baseLine = void 0,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 0,\n\t bottom: 0,\n\t right: 0\n\t },\n\t maxBarNumber = 8,\n\t animationDelayStep = 20,\n\t animationDelays = d3Array.range(animationDelayStep, maxBarNumber * animationDelayStep, animationDelayStep),\n\t animationDuration = 1000,\n\t grid = null,\n\t nameLabel = 'name',\n\t valueLabel = 'value',\n\t stackLabel = 'stack',\n\t nameLabelFormat = void 0,\n\t valueLabelFormat = NUMBER_FORMAT,\n\t\n\t\n\t // getters\n\t getName = function getName(data) {\n\t return data[nameLabel];\n\t },\n\t getValue = function getValue(data) {\n\t return data[valueLabel];\n\t },\n\t getStack = function getStack(data) {\n\t return data[stackLabel];\n\t },\n\t isAnimated = false,\n\t\n\t\n\t // events\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\t\n\t /**\n\t * This function creates the graph using the selection and data provided\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {stackedBarData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t\n\t prepareData(data);\n\t buildScales();\n\t buildLayers();\n\t buildSVG(this);\n\t drawGridLines();\n\t buildAxis();\n\t drawAxis();\n\t drawStackedBar();\n\t addMouseEvents();\n\t });\n\t }\n\t\n\t /**\n\t * Adds events to the container group if the environment is not mobile\n\t * Adding: mouseover, mouseout and mousemove\n\t */\n\t function addMouseEvents() {\n\t if (shouldShowTooltip()) {\n\t svg.on('mouseover', function (d) {\n\t handleMouseOver(this, d);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d);\n\t });\n\t }\n\t\n\t svg.selectAll('.bar').on('mouseover', handleBarsMouseOver).on('mouseout', handleBarsMouseOut);\n\t }\n\t\n\t /**\n\t * Adjusts the position of the y axis' ticks\n\t * @param {D3Selection} selection Y axis group\n\t * @return void\n\t */\n\t function adjustYTickLabels(selection) {\n\t selection.selectAll('.tick text').attr('transform', 'translate(' + yTickTextXOffset + ', ' + yTickTextYOffset + ')');\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t if (isHorizontal) {\n\t xAxis = d3Axis.axisBottom(xScale).ticks(xTicks, valueLabelFormat);\n\t yAxis = d3Axis.axisLeft(yScale);\n\t } else {\n\t xAxis = d3Axis.axisBottom(xScale);\n\t yAxis = d3Axis.axisLeft(yScale).ticks(yTicks, valueLabelFormat);\n\t }\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * NOTE: The order of drawing of this group elements is really important,\n\t * as everything else will be drawn on top of them\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\n\t\n\t container.append('g').classed('x-axis-group', true).append('g').classed('x axis', true);\n\t container.selectAll('.x-axis-group').append('g').classed('month-axis', true);\n\t container.append('g').classed('y-axis-group axis', true);\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Builds the stacked layers layout\n\t * @return {D3Layout} Layout for drawing the chart\n\t * @private\n\t */\n\t function buildLayers() {\n\t var stack3 = d3Shape.stack().keys(stacks),\n\t dataInitial = transformedData.map(function (item) {\n\t var ret = {};\n\t\n\t stacks.forEach(function (key) {\n\t ret[key] = item[key];\n\t });\n\t\n\t return assign({}, item, ret);\n\t });\n\t\n\t layers = stack3(dataInitial);\n\t }\n\t\n\t /**\n\t * Creates the x, y and color scales of the chart\n\t * @private\n\t */\n\t function buildScales() {\n\t var yMax = d3Array.max(transformedData.map(function (d) {\n\t return d.total;\n\t }));\n\t\n\t if (isHorizontal) {\n\t xScale = d3Scale.scaleLinear().domain([0, yMax]).rangeRound([0, chartWidth - 1]);\n\t // 1 pix for edge tick\n\t\n\t yScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([chartHeight, 0]).padding(0.1);\n\t } else {\n\t xScale = d3Scale.scaleBand().domain(data.map(getName)).rangeRound([0, chartWidth]).padding(0.1);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, yMax]).rangeRound([chartHeight, 0]).nice();\n\t }\n\t\n\t colorScale = d3Scale.scaleOrdinal().range(colorSchema).domain(data.map(getStack));\n\t\n\t categoryColorMap = colorScale.domain(data.map(getName)).domain().reduce(function (memo, item) {\n\t data.forEach(function (v) {\n\t if (getName(v) === item) {\n\t memo[v.name] = colorScale(v.stack);\n\t memo[v.stack] = colorScale(v.stack);\n\t memo[v.stack + item] = colorScale(v.stack);\n\t }\n\t });\n\t return memo;\n\t }, {});\n\t }\n\t\n\t /**\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart stacked-bar', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Parses dates and values into JS Date objects and numbers\n\t * @param {obj} data Raw data from JSON file\n\t * @return {obj} Parsed data with values and dates\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.value = +d[valueLabel];\n\t d.stack = d[stackLabel];\n\t d.topicName = getStack(d); // for tooltip\n\t d.name = d[nameLabel];\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t if (isHorizontal) {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate( 0, ' + chartHeight + ' )').call(xAxis);\n\t\n\t svg.select('.y-axis-group.axis').attr('transform', 'translate( ' + -xAxisPadding.left + ', 0)').call(yAxis);\n\t } else {\n\t svg.select('.x-axis-group .axis.x').attr('transform', 'translate( 0, ' + chartHeight + ' )').call(xAxis);\n\t\n\t svg.select('.y-axis-group.axis').attr('transform', 'translate( ' + -xAxisPadding.left + ', 0)').call(yAxis).call(adjustYTickLabels);\n\t }\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines() {\n\t var scale = isHorizontal ? xScale : yScale;\n\t\n\t if (grid === 'horizontal' || grid === 'full') {\n\t svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(scale.ticks(yTicks).slice(1)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', -xAxisPadding.left + 1).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t }\n\t\n\t if (grid === 'vertical' || grid === 'full') {\n\t svg.select('.grid-lines-group').selectAll('line.vertical-grid-line').data(scale.ticks(xTicks).slice(1)).enter().append('line').attr('class', 'vertical-grid-line').attr('y1', 0).attr('y2', chartHeight).attr('x1', function (d) {\n\t return xScale(d);\n\t }).attr('x2', function (d) {\n\t return xScale(d);\n\t });\n\t }\n\t\n\t if (isHorizontal) {\n\t drawVerticalExtendedLine();\n\t } else {\n\t drawHorizontalExtendedLine();\n\t }\n\t }\n\t\n\t /**\n\t * Draws the bars along the x axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawHorizontalBars(series) {\n\t // Enter + Update\n\t var context = void 0,\n\t bars = series.data(layers).enter().append('g').classed('layer', true).attr('fill', function (_ref) {\n\t var key = _ref.key;\n\t return categoryColorMap[key];\n\t }).selectAll('.bar').data(function (d) {\n\t return d;\n\t }).enter().append('rect').classed('bar', true).attr('x', function (d) {\n\t return xScale(d[0]);\n\t }).attr('y', function (d) {\n\t return yScale(d.data.key);\n\t }).attr('height', yScale.bandwidth()).attr('fill', function (_ref2) {\n\t var data = _ref2.data;\n\t return categoryColorMap[data.stack + data.key];\n\t });\n\t\n\t if (isAnimated) {\n\t bars.style('opacity', 0.24).transition().delay(function (_, i) {\n\t return animationDelays[i];\n\t }).duration(animationDuration).ease(ease).tween('attr.width', function (d) {\n\t var node = d3Selection.select(this),\n\t i = d3Interpolate.interpolateRound(0, xScale(d[1] - d[0])),\n\t j = d3Interpolate.interpolateNumber(0, 1);\n\t\n\t return function (t) {\n\t node.attr('width', i(t));\n\t node.style('opacity', j(t));\n\t };\n\t });\n\t } else {\n\t bars.attr('width', function (d) {\n\t return xScale(d[1] - d[0]);\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend x-axis till the edges\n\t * @return {void}\n\t */\n\t function drawHorizontalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', chartHeight).attr('y2', chartHeight);\n\t }\n\t\n\t /**\n\t * Draws the bars along the y axis\n\t * @param {D3Selection} bars Selection of bars\n\t * @return {void}\n\t */\n\t function drawVerticalBars(series) {\n\t // Enter + Update\n\t var bars = series.data(layers).enter().append('g').classed('layer', true).attr('fill', function (_ref3) {\n\t var key = _ref3.key;\n\t return categoryColorMap[key];\n\t }).selectAll('.bar').data(function (d) {\n\t return d;\n\t }).enter().append('rect').classed('bar', true).attr('x', function (d) {\n\t return xScale(d.data.key);\n\t }).attr('y', function (d) {\n\t return yScale(d[1]);\n\t }).attr('width', xScale.bandwidth).attr('fill', function (_ref4) {\n\t var data = _ref4.data;\n\t return categoryColorMap[data.stack + data.key];\n\t }),\n\t context = void 0;\n\t\n\t if (isAnimated) {\n\t bars.style('opacity', 0.24).transition().delay(function (_, i) {\n\t return animationDelays[i];\n\t }).duration(animationDuration).ease(ease).tween('attr.height', function (d) {\n\t var node = d3Selection.select(this),\n\t i = d3Interpolate.interpolateRound(0, yScale(d[0]) - yScale(d[1])),\n\t j = d3Interpolate.interpolateNumber(0, 1);\n\t\n\t return function (t) {\n\t node.attr('height', i(t));\n\t node.style('opacity', j(t));\n\t };\n\t });\n\t } else {\n\t bars.attr('height', function (d) {\n\t return yScale(d[0]) - yScale(d[1]);\n\t });\n\t }\n\t }\n\t\n\t /**\n\t * Draws a vertical line to extend y-axis till the edges\n\t * @return {void}\n\t */\n\t function drawVerticalExtendedLine() {\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-y-line').data([0]).enter().append('line').attr('class', 'extended-y-line').attr('y1', xAxisPadding.bottom).attr('y2', chartHeight).attr('x1', 0).attr('x2', 0);\n\t }\n\t\n\t /**\n\t * Draws the different areas into the chart-group element\n\t * @private\n\t */\n\t function drawStackedBar() {\n\t var series = svg.select('.chart-group').selectAll('.layer');\n\t\n\t if (isHorizontal) {\n\t drawHorizontalBars(series);\n\t } else {\n\t drawVerticalBars(series);\n\t }\n\t // Exit\n\t series.exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Extract X position on the chart from a given mouse event\n\t * @param {obj} event D3 mouse event\n\t * @return {Number} Position on the x axis of the mouse\n\t * @private\n\t */\n\t function getMousePosition(event) {\n\t return d3Selection.mouse(event);\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseX X position of the mouse\n\t * @return {obj} Data entry that is closer to that x axis position\n\t */\n\t function getNearestDataPoint(mouseX) {\n\t var adjustedMouseX = mouseX - margin.left,\n\t dataByValueParsed = transformedData.map(function (item) {\n\t item.key = item.key;\n\t return item;\n\t }),\n\t epsilon = void 0,\n\t nearest = void 0;\n\t\n\t epsilon = xScale(dataByValueParsed[1].key) - xScale(dataByValueParsed[0].key);\n\t nearest = dataByValueParsed.find(function (_ref5) {\n\t var key = _ref5.key;\n\t return Math.abs(xScale(key) - adjustedMouseX) <= epsilon;\n\t });\n\t\n\t return nearest;\n\t }\n\t\n\t /**\n\t * Finds out the data entry that is closer to the given position on pixels\n\t * @param {Number} mouseY Y position of the mouse\n\t * @return {obj} Data entry that is closer to that y axis position\n\t */\n\t\n\t function getNearestDataPoint2(mouseY) {\n\t var adjustedMouseY = mouseY - margin.bottom,\n\t epsilon = yScale.bandwidth(),\n\t nearest = void 0;\n\t\n\t nearest = layers.map(function (stackedArray) {\n\t return stackedArray.map(function (d1) {\n\t var found = d1.data.values.find(function (d2) {\n\t return Math.abs(adjustedMouseY >= yScale(d2[nameLabel])) && Math.abs(adjustedMouseY - yScale(d2[nameLabel]) <= epsilon * 2);\n\t });\n\t\n\t return found ? d1.data : undefined;\n\t });\n\t });\n\t nearest = d3Array.merge(nearest).filter(function (e) {\n\t return e;\n\t });\n\t\n\t return nearest.length ? nearest[0] : undefined;\n\t }\n\t\n\t /**\n\t * Handles a mouseover event on top of a bar\n\t * @return {void}\n\t */\n\t function handleBarsMouseOver() {\n\t var _this = this;\n\t\n\t d3Selection.select(this).attr('fill', function () {\n\t return d3Color.color(d3Selection.select(_this.parentNode).attr('fill')).darker();\n\t });\n\t }\n\t\n\t /**\n\t * Handles a mouseout event out of a bar\n\t * @return {void}\n\t */\n\t function handleBarsMouseOut() {\n\t var _this2 = this;\n\t\n\t d3Selection.select(this).attr('fill', function () {\n\t return d3Selection.select(_this2.parentNode).attr('fill');\n\t });\n\t }\n\t\n\t /**\n\t * MouseMove handler, calculates the nearest dataPoint to the cursor\n\t * and updates metadata related to it\n\t * @private\n\t */\n\t function handleMouseMove(e) {\n\t var _getMousePosition = getMousePosition(e),\n\t _getMousePosition2 = _slicedToArray(_getMousePosition, 2),\n\t mouseX = _getMousePosition2[0],\n\t mouseY = _getMousePosition2[1],\n\t dataPoint = isHorizontal ? getNearestDataPoint2(mouseY) : getNearestDataPoint(mouseX),\n\t x = void 0,\n\t y = void 0;\n\t\n\t if (dataPoint) {\n\t // Move verticalMarker to that datapoint\n\t if (isHorizontal) {\n\t x = mouseX - margin.left;\n\t y = yScale(dataPoint.key) + yScale.bandwidth() / 2;\n\t } else {\n\t x = xScale(dataPoint.key) + margin.left;\n\t y = mouseY - margin.bottom;\n\t }\n\t moveTooltipOriginXY(x, y);\n\t\n\t // Emit event with xPosition for tooltip or similar feature\n\t dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, x, y);\n\t }\n\t }\n\t\n\t /**\n\t * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n\t * It also resets the container of the vertical marker\n\t * @private\n\t */\n\t function handleMouseOut(e, d) {\n\t svg.select('.metadata-group').attr('transform', 'translate(9999, 0)');\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n\t * @private\n\t */\n\t function handleMouseOver(e, d) {\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n\t }\n\t\n\t /**\n\t * Helper method to update the x position of the vertical marker\n\t * @param {obj} dataPoint Data entry to extract info\n\t * @return void\n\t */\n\t function moveTooltipOriginXY(originXPosition, originYPosition) {\n\t svg.select('.metadata-group').attr('transform', 'translate(' + originXPosition + ',' + originYPosition + ')');\n\t }\n\t\n\t /**\n\t * Prepare data for create chart.\n\t * @private\n\t */\n\t function prepareData(data) {\n\t stacks = uniq(data.map(function (_ref6) {\n\t var stack = _ref6.stack;\n\t return stack;\n\t }));\n\t transformedData = d3Collection.nest().key(getName).rollup(function (values) {\n\t var ret = {};\n\t\n\t values.forEach(function (entry) {\n\t if (entry && entry[stackLabel]) {\n\t ret[entry[stackLabel]] = getValue(entry);\n\t }\n\t });\n\t ret.values = values; //for tooltip\n\t\n\t return ret;\n\t }).entries(data).map(function (data) {\n\t return assign({}, {\n\t total: d3Array.sum(d3Array.permute(data.value, stacks)),\n\t key: data.key\n\t }, data.value);\n\t });\n\t }\n\t\n\t /**\n\t * Determines if we should add the tooltip related logic depending on the\n\t * size of the chart and the tooltipThreshold variable value\n\t * @return {boolean} Should we build the tooltip?\n\t * @private\n\t */\n\t function shouldShowTooltip() {\n\t return width > tooltipThreshold;\n\t }\n\t\n\t // API\n\t /**\n\t * Gets or Sets the aspect ratio of the chart\n\t * @param {Number} _x Desired aspect ratio for the graph\n\t * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.aspectRatio = function (_x) {\n\t if (!arguments.length) {\n\t return aspectRatio;\n\t }\n\t aspectRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the colorSchema of the chart\n\t * @param {String[]} _x Desired colorSchema for the graph\n\t * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n\t * @public\n\t */\n\t exports.colorSchema = function (_x) {\n\t if (!arguments.length) {\n\t return colorSchema;\n\t }\n\t colorSchema = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename, title) {\n\t exportChart.call(exports, svg, filename, title);\n\t };\n\t\n\t /**\n\t * Gets or Sets the grid mode.\n\t *\n\t * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n\t * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.grid = function (_x) {\n\t if (!arguments.length) {\n\t return grid;\n\t }\n\t grid = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { height | module} Current height or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t if (aspectRatio) {\n\t width = Math.ceil(_x / aspectRatio);\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the horizontal direction of the chart\n\t * @param {number} _x Desired horizontal direction for the graph\n\t * @return { isHorizontal | module} If it is horizontal or Bar Chart module to chain calls\n\t * @public\n\t */\n\t exports.isHorizontal = function (_x) {\n\t if (!arguments.length) {\n\t return isHorizontal;\n\t }\n\t isHorizontal = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n\t * By default this is 'false'\n\t *\n\t * @param {Boolean} _x Desired animation flag\n\t * @return { isAnimated | module} Current isAnimated flag or Chart module\n\t * @public\n\t */\n\t exports.isAnimated = function (_x) {\n\t if (!arguments.length) {\n\t return isAnimated;\n\t }\n\t isAnimated = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the nameLabel of the chart\n\t * @param {Number} _x Desired dateLabel for the graph\n\t * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabel = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabel;\n\t }\n\t nameLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabelFormat of the chart\n\t * @param {String[]} _x Desired valueLabelFormat for the graph\n\t * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n\t * @public\n\t */\n\t exports.nameLabelFormat = function (_x) {\n\t if (!arguments.length) {\n\t return nameLabelFormat;\n\t }\n\t nameLabelFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of ticks of the x axis on the chart\n\t * (Default is 5)\n\t * @param {Number} _x Desired horizontal ticks\n\t * @return {Number | module} Current xTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of vertical ticks of the axis on the chart\n\t * @param {Number} _x Desired vertical ticks\n\t * @return {Number | module} Current yTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Configurable extension of the x axis\n\t * if your max point was 50% you might want to show x axis to 60%, pass 1.2\n\t * @param {number} _x ratio to max data point to add to the x axis\n\t * @return { ratio | module} Current ratio or Bar Chart module to chain calls\n\t * @public\n\t */\n\t exports.percentageAxisToMaxRatio = function (_x) {\n\t if (!arguments.length) {\n\t return percentageAxisToMaxRatio;\n\t }\n\t percentageAxisToMaxRatio = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the stackLabel of the chart\n\t * @param {String} _x Desired stackLabel for the graph\n\t * @return { stackLabel | module} Current stackLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.stackLabel = function (_x) {\n\t if (!arguments.length) {\n\t return stackLabel;\n\t }\n\t stackLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the minimum width of the graph in order to show the tooltip\n\t * NOTE: This could also depend on the aspect ratio\n\t *\n\t * @param {Object} _x Margin object to get/set\n\t * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.tooltipThreshold = function (_x) {\n\t if (!arguments.length) {\n\t return tooltipThreshold;\n\t }\n\t tooltipThreshold = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabel of the chart\n\t * @param {Number} _x Desired valueLabel for the graph\n\t * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabel = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabel;\n\t }\n\t valueLabel = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the valueLabelFormat of the chart\n\t * @param {String[]} _x Desired valueLabelFormat for the graph\n\t * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n\t * @public\n\t */\n\t exports.valueLabelFormat = function (_x) {\n\t if (!arguments.length) {\n\t return valueLabelFormat;\n\t }\n\t valueLabelFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return { width | module} Current width or Area Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t if (aspectRatio) {\n\t height = Math.ceil(_x * aspectRatio);\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Format = __webpack_require__(7);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Transition = __webpack_require__(14);\n\t\n\t var _require = __webpack_require__(17),\n\t exportChart = _require.exportChart;\n\t\n\t /**\n\t * @typedef StepChartData\n\t * @type Object[]\n\t *\n\t * @property {String} key Key we measure (required)\n\t * @property {Number} value value of the key (required)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * value: 1,\n\t * key: 'glittering'\n\t * },\n\t * {\n\t * value: 1,\n\t * key: 'luminous'\n\t * }\n\t * ]\n\t */\n\t\n\t /**\n\t * Step Chart reusable API class that renders a\n\t * simple and configurable step chart.\n\t *\n\t * @module Step\n\t * @tutorial step\n\t * @requires d3-array, d3-axis, d3-dispatch, d3-format, d3-scale, d3-selection, d3-transition\n\t *\n\t * @example\n\t * var stepChart= step();\n\t *\n\t * stepChart\n\t * .height(500)\n\t * .width(800);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(stepChart);\n\t *\n\t */\n\t\n\t return function module() {\n\t\n\t var margin = {\n\t top: 20,\n\t right: 20,\n\t bottom: 30,\n\t left: 40\n\t },\n\t width = 960,\n\t height = 500,\n\t ease = d3Ease.easeQuadInOut,\n\t data = void 0,\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t xScale = void 0,\n\t yScale = void 0,\n\t yTicks = 6,\n\t xAxis = void 0,\n\t xAxisLabel = void 0,\n\t yAxis = void 0,\n\t yAxisLabel = void 0,\n\t xAxisLabelOffset = 45,\n\t yAxisLabelOffset = -20,\n\t xAxisPadding = {\n\t top: 0,\n\t left: 0,\n\t bottom: 0,\n\t right: 0\n\t },\n\t yTickPadding = 8,\n\t svg = void 0,\n\t valueLabel = 'value',\n\t nameLabel = 'key',\n\t maskGridLines = void 0,\n\t baseLine = void 0,\n\t\n\t\n\t // Dispatcher object to broadcast the mouse events\n\t // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n\t dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove'),\n\t\n\t\n\t // Formats\n\t yAxisTickFormat = d3Format.format('.3'),\n\t\n\t\n\t // extractors\n\t getKey = function getKey(_ref) {\n\t var key = _ref.key;\n\t return key;\n\t },\n\t getValue = function getValue(_ref2) {\n\t var value = _ref2.value;\n\t return value;\n\t };\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {StepChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t // Make space on the left of the graph for the y axis label\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(_data);\n\t\n\t buildScales();\n\t buildAxis();\n\t buildSVG(this);\n\t drawGridLines();\n\t drawSteps();\n\t drawAxis();\n\t });\n\t }\n\t\n\t /**\n\t * Creates the d3 x and y axis, setting orientations\n\t * @private\n\t */\n\t function buildAxis() {\n\t xAxis = d3Axis.axisBottom(xScale);\n\t\n\t yAxis = d3Axis.axisLeft(yScale).ticks(yTicks).tickPadding(yTickPadding).tickFormat(yAxisTickFormat);\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');\n\t\n\t container.append('g').classed('grid-lines-group', true);\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('x-axis-group axis', true).append('g').classed('x-axis-label', true);\n\t container.append('g').classed('y-axis-group axis', true).append('g').classed('y-axis-label', true);\n\t container.append('g').classed('metadata-group', true);\n\t }\n\t\n\t /**\n\t * Creates the x and y scales of the graph\n\t * @private\n\t */\n\t function buildScales() {\n\t xScale = d3Scale.scaleBand().domain(data.map(getKey)).rangeRound([0, chartWidth]).paddingInner(0);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, d3Array.max(data, getValue)]).rangeRound([chartHeight, 0]);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart step-chart', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Cleaning data adding the proper format\n\t * @param {StepChartData} data Data\n\t * @private\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.value = +d[valueLabel];\n\t d.key = String(d[nameLabel]);\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Draws the x and y axis on the svg object within their\n\t * respective groups\n\t * @private\n\t */\n\t function drawAxis() {\n\t svg.select('.x-axis-group.axis').attr('transform', 'translate(0, ' + chartHeight + ')').call(xAxis);\n\t\n\t if (xAxisLabel) {\n\t svg.select('.x-axis-label').append('text').attr('text-anchor', 'middle').attr('x', chartWidth / 2).attr('y', xAxisLabelOffset).text(xAxisLabel);\n\t }\n\t\n\t svg.select('.y-axis-group.axis').call(yAxis);\n\t\n\t if (yAxisLabel) {\n\t svg.select('.y-axis-label').append('text').attr('x', -chartHeight / 2).attr('y', yAxisLabelOffset).attr('text-anchor', 'middle').attr('transform', 'rotate(270 0 0)').text(yAxisLabel);\n\t }\n\t }\n\t\n\t /**\n\t * Draws the step elements within the chart group\n\t * @private\n\t */\n\t function drawSteps() {\n\t var steps = svg.select('.chart-group').selectAll('.step').data(data);\n\t\n\t // Enter\n\t steps.enter().append('rect').classed('step', true).attr('x', chartWidth) // Initially drawing the steps at the end of Y axis\n\t .attr('y', function (_ref3) {\n\t var value = _ref3.value;\n\t return yScale(value);\n\t }).attr('width', xScale.bandwidth()).attr('height', function (d) {\n\t return chartHeight - yScale(d.value);\n\t }).on('mouseover', function (d) {\n\t handleMouseOver(this, d, chartWidth, chartHeight);\n\t }).on('mousemove', function (d) {\n\t handleMouseMove(this, d, chartWidth, chartHeight);\n\t }).on('mouseout', function (d) {\n\t handleMouseOut(this, d, chartWidth, chartHeight);\n\t }).merge(steps).transition().ease(ease).attr('x', function (_ref4) {\n\t var key = _ref4.key;\n\t return xScale(key);\n\t }).attr('y', function (d) {\n\t return yScale(d.value);\n\t }).attr('width', xScale.bandwidth()).attr('height', function (d) {\n\t return chartHeight - yScale(d.value);\n\t });\n\t\n\t // Exit\n\t steps.exit().transition().style('opacity', 0).remove();\n\t }\n\t\n\t /**\n\t * Draws grid lines on the background of the chart\n\t * @return void\n\t */\n\t function drawGridLines() {\n\t maskGridLines = svg.select('.grid-lines-group').selectAll('line.horizontal-grid-line').data(yScale.ticks(yTicks)).enter().append('line').attr('class', 'horizontal-grid-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', function (d) {\n\t return yScale(d);\n\t }).attr('y2', function (d) {\n\t return yScale(d);\n\t });\n\t\n\t //draw a horizontal line to extend x-axis till the edges\n\t baseLine = svg.select('.grid-lines-group').selectAll('line.extended-x-line').data([0]).enter().append('line').attr('class', 'extended-x-line').attr('x1', xAxisPadding.left).attr('x2', chartWidth).attr('y1', height - margin.bottom - margin.top).attr('y2', height - margin.bottom - margin.top);\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * Custom OnMouseOver event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOver(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t }\n\t\n\t /**\n\t * Custom OnMouseMove event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseMove(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseMove', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t }\n\t\n\t /**\n\t * Custom OnMouseOver event handler\n\t * @return {void}\n\t * @private\n\t */\n\t function handleMouseOut(e, d, chartWidth, chartHeight) {\n\t dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n\t }\n\t\n\t /**\n\t * Chart exported to png and a download action is fired\n\t * @public\n\t */\n\t exports.exportChart = function (filename) {\n\t exportChart.call(exports, svg, filename);\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {object} _x Margin object to get/set\n\t * @return { margin | module} Current margin or Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the number of vertical ticks on the chart\n\t * (Default is 6)\n\t * @param {Number} _x Desired number of vertical ticks for the graph\n\t * @return {Number | module} Current yTicks or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yTicks = function (_x) {\n\t if (!arguments.length) {\n\t return yTicks;\n\t }\n\t yTicks = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {number} _x Desired width for the graph\n\t * @return { height | module} Current height or Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {number} _x Desired width for the graph\n\t * @return { width | module} Current width or Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the text of the xAxisLabel on the chart\n\t * @param {text} _x Desired text for the label\n\t * @return { text | module} label or Chart module to chain calls\n\t * @public\n\t */\n\t exports.xAxisLabel = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisLabel;\n\t }\n\t xAxisLabel = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the offset of the xAxisLabel on the chart\n\t * @param {integer} _x Desired offset for the label\n\t * @return { integer | module} label or Chart module to chain calls\n\t * @public\n\t */\n\t exports.xAxisLabelOffset = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisLabelOffset;\n\t }\n\t xAxisLabelOffset = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the text of the yAxisLabel on the chart\n\t * @param {text} _x Desired text for the label\n\t * @return { text | module} label or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yAxisLabel = function (_x) {\n\t if (!arguments.length) {\n\t return yAxisLabel;\n\t }\n\t yAxisLabel = _x;\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the offset of the yAxisLabel on the chart\n\t * @param {integer} _x Desired offset for the label\n\t * @return { integer | module} label or Chart module to chain calls\n\t * @public\n\t */\n\t exports.yAxisLabelOffset = function (_x) {\n\t if (!arguments.length) {\n\t return yAxisLabelOffset;\n\t }\n\t yAxisLabelOffset = _x;\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {\n\t 'use strict';\n\t\n\t var d3Array = __webpack_require__(2);\n\t var d3Axis = __webpack_require__(4);\n\t var d3Brush = __webpack_require__(40);\n\t var d3Ease = __webpack_require__(3);\n\t var d3Scale = __webpack_require__(8);\n\t var d3Shape = __webpack_require__(24);\n\t var d3Dispatch = __webpack_require__(6);\n\t var d3Selection = __webpack_require__(13);\n\t var d3Time = __webpack_require__(11);\n\t var d3Transition = __webpack_require__(14);\n\t var d3TimeFormat = __webpack_require__(12);\n\t\n\t var colorHelper = __webpack_require__(18);\n\t var timeAxisHelper = __webpack_require__(29);\n\t\n\t var _require = __webpack_require__(19),\n\t axisTimeCombinations = _require.axisTimeCombinations;\n\t\n\t /**\n\t * @typedef BrushChartData\n\t * @type {Object[]}\n\t * @property {Number} value Value to chart (required)\n\t * @property {Date} date Date of the value (required)\n\t *\n\t * @example\n\t * [\n\t * {\n\t * value: 1,\n\t * date: '2011-01-06T00:00:00Z'\n\t * },\n\t * {\n\t * value: 2,\n\t * date: '2011-01-07T00:00:00Z'\n\t * }\n\t * ]\n\t */\n\t\n\t /**\n\t * Brush Chart reusable API class that renders a\n\t * simple and configurable brush chart.\n\t *\n\t * @module Brush\n\t * @tutorial brush\n\t * @requires d3-array, d3-axis, d3-brush, d3-ease, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n\t *\n\t * @example\n\t * let brushChart = brush();\n\t *\n\t * brushChart\n\t * .height(500)\n\t * .width(800);\n\t *\n\t * d3Selection.select('.css-selector')\n\t * .datum(dataset)\n\t * .call(brushChart);\n\t *\n\t */\n\t\n\t return function module() {\n\t\n\t var margin = {\n\t top: 20,\n\t right: 20,\n\t bottom: 30,\n\t left: 20\n\t },\n\t width = 960,\n\t height = 500,\n\t data = void 0,\n\t svg = void 0,\n\t ease = d3Ease.easeQuadOut,\n\t dateLabel = 'date',\n\t valueLabel = 'value',\n\t dateRange = [null, null],\n\t chartWidth = void 0,\n\t chartHeight = void 0,\n\t xScale = void 0,\n\t yScale = void 0,\n\t xAxis = void 0,\n\t xAxisFormat = null,\n\t xTicks = null,\n\t xAxisCustomFormat = null,\n\t brush = void 0,\n\t chartBrush = void 0,\n\t handle = void 0,\n\t tickPadding = 5,\n\t gradient = colorHelper.colorGradients.greenBlue,\n\t\n\t\n\t // Dispatcher object to broadcast the mouse events\n\t // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n\t dispatcher = d3Dispatch.dispatch('customBrushStart', 'customBrushEnd'),\n\t\n\t\n\t // extractors\n\t getValue = function getValue(_ref) {\n\t var value = _ref.value;\n\t return value;\n\t },\n\t getDate = function getDate(_ref2) {\n\t var date = _ref2.date;\n\t return date;\n\t };\n\t\n\t /**\n\t * This function creates the graph using the selection as container\n\t * @param {D3Selection} _selection A d3 selection that represents\n\t * the container(s) where the chart(s) will be rendered\n\t * @param {BrushChartData} _data The data to attach and generate the chart\n\t */\n\t function exports(_selection) {\n\t _selection.each(function (_data) {\n\t chartWidth = width - margin.left - margin.right;\n\t chartHeight = height - margin.top - margin.bottom;\n\t data = cleanData(cloneData(_data));\n\t\n\t buildScales();\n\t buildAxis();\n\t buildSVG(this);\n\t buildGradient();\n\t buildBrush();\n\t drawArea();\n\t drawAxis();\n\t drawBrush();\n\t drawHandles();\n\t });\n\t }\n\t\n\t /**\n\t * Creates the d3 x axis, setting orientation\n\t * @private\n\t */\n\t function buildAxis() {\n\t var minor = void 0,\n\t major = void 0;\n\t\n\t if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n\t minor = {\n\t tick: xTicks,\n\t format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n\t };\n\t } else {\n\t var _timeAxisHelper$getXA = timeAxisHelper.getXAxisSettings(data, width, xAxisFormat);\n\t\n\t minor = _timeAxisHelper$getXA.minor;\n\t major = _timeAxisHelper$getXA.major;\n\t }\n\t\n\t xAxis = d3Axis.axisBottom(xScale).ticks(minor.tick).tickSize(10, 0).tickPadding([tickPadding]).tickFormat(minor.format);\n\t }\n\t\n\t /**\n\t * Creates the brush element and attaches a listener\n\t * @return {void}\n\t */\n\t function buildBrush() {\n\t brush = d3Brush.brushX().extent([[0, 0], [chartWidth, chartHeight]]).on('brush', handleBrushStart).on('end', handleBrushEnd);\n\t }\n\t\n\t /**\n\t * Builds containers for the chart, the axis and a wrapper for all of them\n\t * Also applies the Margin convention\n\t * @private\n\t */\n\t function buildContainerGroups() {\n\t var container = svg.append('g').classed('container-group', true).attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');\n\t\n\t container.append('g').classed('chart-group', true);\n\t container.append('g').classed('metadata-group', true);\n\t container.append('g').classed('x-axis-group', true);\n\t container.append('g').classed('brush-group', true);\n\t }\n\t\n\t /**\n\t * Creates the gradient on the area\n\t * @return {void}\n\t */\n\t function buildGradient() {\n\t var metadataGroup = svg.select('.metadata-group');\n\t\n\t metadataGroup.append('linearGradient').attr('id', 'brush-area-gradient').attr('gradientUnits', 'userSpaceOnUse').attr('x1', 0).attr('x2', xScale(data[data.length - 1].date)).attr('y1', 0).attr('y2', 0).selectAll('stop').data([{ offset: '0%', color: gradient[0] }, { offset: '100%', color: gradient[1] }]).enter().append('stop').attr('offset', function (_ref3) {\n\t var offset = _ref3.offset;\n\t return offset;\n\t }).attr('stop-color', function (_ref4) {\n\t var color = _ref4.color;\n\t return color;\n\t });\n\t }\n\t\n\t /**\n\t * Creates the x and y scales of the graph\n\t * @private\n\t */\n\t function buildScales() {\n\t xScale = d3Scale.scaleTime().domain(d3Array.extent(data, getDate)).range([0, chartWidth]);\n\t\n\t yScale = d3Scale.scaleLinear().domain([0, d3Array.max(data, getValue)]).range([chartHeight, 0]);\n\t }\n\t\n\t /**\n\t * Builds the SVG element that will contain the chart\n\t * @param {HTMLElement} container DOM element that will work as the container of the graph\n\t * @private\n\t */\n\t function buildSVG(container) {\n\t if (!svg) {\n\t svg = d3Selection.select(container).append('svg').classed('britechart brush-chart', true);\n\t\n\t buildContainerGroups();\n\t }\n\t\n\t svg.attr('width', width).attr('height', height);\n\t }\n\t\n\t /**\n\t * Cleaning data adding the proper format\n\t *\n\t * @param {BrushChartData} data Data\n\t */\n\t function cleanData(data) {\n\t return data.map(function (d) {\n\t d.date = new Date(d[dateLabel]);\n\t d.value = +d[valueLabel];\n\t\n\t return d;\n\t });\n\t }\n\t\n\t /**\n\t * Clones the passed array of data\n\t * @param {Object[]} dataToClone Data to clone\n\t * @return {Object[]} Cloned data\n\t */\n\t function cloneData(dataToClone) {\n\t return JSON.parse(JSON.stringify(dataToClone));\n\t }\n\t\n\t /**\n\t * Draws the x axis on the svg object within its group\n\t *\n\t * @private\n\t */\n\t function drawAxis() {\n\t svg.select('.x-axis-group').append('g').attr('class', 'x axis').attr('transform', 'translate(0, ' + chartHeight + ')').call(xAxis);\n\t }\n\t\n\t /**\n\t * Draws the area that is going to represent the data\n\t *\n\t * @return {void}\n\t */\n\t function drawArea() {\n\t // Create and configure the area generator\n\t var area = d3Shape.area().x(function (_ref5) {\n\t var date = _ref5.date;\n\t return xScale(date);\n\t }).y0(chartHeight).y1(function (_ref6) {\n\t var value = _ref6.value;\n\t return yScale(value);\n\t }).curve(d3Shape.curveBasis);\n\t\n\t // Create the area path\n\t svg.select('.chart-group').append('path').datum(data).attr('class', 'brush-area').attr('d', area);\n\t }\n\t\n\t /**\n\t * Draws the Brush components on its group\n\t * @return {void}\n\t */\n\t function drawBrush() {\n\t chartBrush = svg.select('.brush-group').call(brush);\n\t\n\t // Update the height of the brushing rectangle\n\t chartBrush.selectAll('rect').classed('brush-rect', true).attr('height', chartHeight);\n\t }\n\t\n\t /**\n\t * Draws a handle for the Brush section\n\t * @return {void}\n\t */\n\t function drawHandles() {\n\t var handleFillColor = colorHelper.colorSchemasHuman.grey[1];\n\t\n\t // Styling\n\t handle = chartBrush.selectAll('.handle.brush-rect').style('fill', handleFillColor);\n\t }\n\t\n\t /**\n\t * When a brush event starts, we can extract info from the extension\n\t * of the brush.\n\t *\n\t * @return {void}\n\t */\n\t function handleBrushStart() {\n\t var s = d3Selection.event.selection,\n\t dateExtent = s.map(xScale.invert);\n\t\n\t dispatcher.call('customBrushStart', this, dateExtent);\n\t // updateHandlers(dateExtent);\n\t }\n\t\n\t /**\n\t * Processes the end brush event, snapping the boundaries to days\n\t * as showed on the example on https://bl.ocks.org/mbostock/6232537\n\t * @return {void}\n\t * @private\n\t */\n\t function handleBrushEnd() {\n\t if (!d3Selection.event.sourceEvent) return; // Only transition after input.\n\t if (!d3Selection.event.selection) return; // Ignore empty selections.\n\t\n\t var s = d3Selection.event.selection,\n\t dateExtent = s.map(xScale.invert),\n\t dateExtentRounded = dateExtent.map(d3Time.timeDay.round);\n\t\n\t // If empty when rounded, use floor & ceil instead.\n\t if (dateExtentRounded[0] >= dateExtentRounded[1]) {\n\t dateExtentRounded[0] = d3Time.timeDay.floor(dateExtent[0]);\n\t dateExtentRounded[1] = d3Time.timeDay.offset(dateExtentRounded[0]);\n\t }\n\t\n\t d3Selection.select(this).transition().call(d3Selection.event.target.move, dateExtentRounded.map(xScale));\n\t\n\t dispatcher.call('customBrushEnd', this, dateExtentRounded);\n\t }\n\t\n\t /**\n\t * Sets a new brush extent within the passed percentage positions\n\t * @param {Number} a Percentage of data that the brush start with\n\t * @param {Number} b Percentage of data that the brush ends with\n\t * @example\n\t * setBrushByPercentages(0.25, 0.5)\n\t */\n\t function setBrushByPercentages(a, b) {\n\t var x0 = a * chartWidth,\n\t x1 = b * chartWidth;\n\t\n\t brush.move(chartBrush, [x0, x1]);\n\t }\n\t\n\t /**\n\t * Sets a new brush extent within the passed dates\n\t * @param {String | Date} dateA Initial Date\n\t * @param {String | Date} dateB End Date\n\t */\n\t function setBrushByDates(dateA, dateB) {\n\t var x0 = xScale(new Date(dateA)),\n\t x1 = xScale(new Date(dateB));\n\t\n\t brush.move(chartBrush, [x0, x1]);\n\t }\n\t\n\t /**\n\t * Updates visibility and position of the brush handlers\n\t * @param {Number[]} dateExtent Date range\n\t * @return {void}\n\t */\n\t function updateHandlers(dateExtent) {\n\t if (dateExtent === null) {\n\t handle.attr('display', 'none');\n\t } else {\n\t handle.attr('display', null).attr('transform', function (d, i) {\n\t return 'translate(' + dateExtent[i] + ',' + chartHeight / 2 + ')';\n\t });\n\t }\n\t }\n\t\n\t // API\n\t\n\t /**\n\t * Exposes the constants to be used to force the x axis to respect a certain granularity\n\t * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n\t * @example\n\t * brush.xAxisCustomFormat(brush.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.axisTimeCombinations = axisTimeCombinations;\n\t\n\t /**\n\t * Gets or Sets the dateRange for the selected part of the brush\n\t * @param {String[]} _x Desired dateRange for the graph\n\t * @return { dateRange | module} Current dateRange or Chart module to chain calls\n\t * @public\n\t */\n\t exports.dateRange = function (_x) {\n\t if (!arguments.length) {\n\t return dateRange;\n\t }\n\t dateRange = _x;\n\t\n\t if (Array.isArray(dateRange)) {\n\t setBrushByDates.apply(undefined, _toConsumableArray(dateRange));\n\t }\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the gradient of the chart\n\t * @param {String[]} _x Desired gradient for the graph\n\t * @return {String | Module} Current gradient or Chart module to chain calls\n\t * @public\n\t */\n\t exports.gradient = function (_x) {\n\t if (!arguments.length) {\n\t return gradient;\n\t }\n\t gradient = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the height of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return {Number | Module} Current height or Chart module to chain calls\n\t * @public\n\t */\n\t exports.height = function (_x) {\n\t if (!arguments.length) {\n\t return height;\n\t }\n\t height = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Gets or Sets the margin of the chart\n\t * @param {Object} _x Margin object to get/set\n\t * @return {Object | Module} Current margin or Chart module to chain calls\n\t * @public\n\t */\n\t exports.margin = function (_x) {\n\t if (!arguments.length) {\n\t return margin;\n\t }\n\t margin = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes an 'on' method that acts as a bridge with the event dispatcher\n\t * We are going to expose this events:\n\t * customMouseOver, customMouseMove and customMouseOut\n\t *\n\t * @return {module} Bar Chart\n\t * @public\n\t */\n\t exports.on = function () {\n\t var value = dispatcher.on.apply(dispatcher, arguments);\n\t\n\t return value === dispatcher ? exports : value;\n\t };\n\t\n\t /**\n\t * Gets or Sets the width of the chart\n\t * @param {Number} _x Desired width for the graph\n\t * @return {Number | Module} Current width or Chart module to chain calls\n\t * @public\n\t */\n\t exports.width = function (_x) {\n\t if (!arguments.length) {\n\t return width;\n\t }\n\t width = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x format\n\t * It requires a `xAxisFormat` of 'custom' in order to work.\n\t * @param {String} _x Desired format for x axis\n\t * @return {String | Module} Current format or module to chain calls\n\t */\n\t exports.xAxisCustomFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisCustomFormat;\n\t }\n\t xAxisCustomFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x axis grouping\n\t * @param {String} _x Desired format\n\t * @return {String | Module} Current format or module to chain calls\n\t * @example\n\t * brush.xAxisFormat(brush.axisTimeCombinations.HOUR_DAY)\n\t */\n\t exports.xAxisFormat = function (_x) {\n\t if (!arguments.length) {\n\t return xAxisFormat;\n\t }\n\t xAxisFormat = _x;\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisCustomFormat` of 'custom' in order to work.\n\t * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n\t * how many and where the ticks will appear.\n\t *\n\t * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n\t * @return {Number | Module} Current number or ticks or module to chain calls\n\t */\n\t exports.xTicks = function (_x) {\n\t if (!arguments.length) {\n\t return xTicks;\n\t }\n\t xTicks = _x;\n\t\n\t return this;\n\t };\n\t\n\t return exports;\n\t };\n\t}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-brush/ Version 1.0.4. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(6), __webpack_require__(41), __webpack_require__(10), __webpack_require__(13), __webpack_require__(14)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3));\n\t}(this, (function (exports,d3Dispatch,d3Drag,d3Interpolate,d3Selection,d3Transition) { 'use strict';\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tvar BrushEvent = function(target, type, selection) {\n\t this.target = target;\n\t this.type = type;\n\t this.selection = selection;\n\t};\n\t\n\tfunction nopropagation() {\n\t d3Selection.event.stopImmediatePropagation();\n\t}\n\t\n\tvar noevent = function() {\n\t d3Selection.event.preventDefault();\n\t d3Selection.event.stopImmediatePropagation();\n\t};\n\t\n\tvar MODE_DRAG = {name: \"drag\"};\n\tvar MODE_SPACE = {name: \"space\"};\n\tvar MODE_HANDLE = {name: \"handle\"};\n\tvar MODE_CENTER = {name: \"center\"};\n\t\n\tvar X = {\n\t name: \"x\",\n\t handles: [\"e\", \"w\"].map(type),\n\t input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },\n\t output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n\t};\n\t\n\tvar Y = {\n\t name: \"y\",\n\t handles: [\"n\", \"s\"].map(type),\n\t input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },\n\t output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n\t};\n\t\n\tvar XY = {\n\t name: \"xy\",\n\t handles: [\"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\"].map(type),\n\t input: function(xy) { return xy; },\n\t output: function(xy) { return xy; }\n\t};\n\t\n\tvar cursors = {\n\t overlay: \"crosshair\",\n\t selection: \"move\",\n\t n: \"ns-resize\",\n\t e: \"ew-resize\",\n\t s: \"ns-resize\",\n\t w: \"ew-resize\",\n\t nw: \"nwse-resize\",\n\t ne: \"nesw-resize\",\n\t se: \"nwse-resize\",\n\t sw: \"nesw-resize\"\n\t};\n\t\n\tvar flipX = {\n\t e: \"w\",\n\t w: \"e\",\n\t nw: \"ne\",\n\t ne: \"nw\",\n\t se: \"sw\",\n\t sw: \"se\"\n\t};\n\t\n\tvar flipY = {\n\t n: \"s\",\n\t s: \"n\",\n\t nw: \"sw\",\n\t ne: \"se\",\n\t se: \"ne\",\n\t sw: \"nw\"\n\t};\n\t\n\tvar signsX = {\n\t overlay: +1,\n\t selection: +1,\n\t n: null,\n\t e: +1,\n\t s: null,\n\t w: -1,\n\t nw: -1,\n\t ne: +1,\n\t se: +1,\n\t sw: -1\n\t};\n\t\n\tvar signsY = {\n\t overlay: +1,\n\t selection: +1,\n\t n: -1,\n\t e: null,\n\t s: +1,\n\t w: null,\n\t nw: -1,\n\t ne: -1,\n\t se: +1,\n\t sw: +1\n\t};\n\t\n\tfunction type(t) {\n\t return {type: t};\n\t}\n\t\n\t// Ignore right-click, since that should open the context menu.\n\tfunction defaultFilter() {\n\t return !d3Selection.event.button;\n\t}\n\t\n\tfunction defaultExtent() {\n\t var svg = this.ownerSVGElement || this;\n\t return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n\t}\n\t\n\t// Like d3.local, but with the name “__brush” rather than auto-generated.\n\tfunction local(node) {\n\t while (!node.__brush) if (!(node = node.parentNode)) return;\n\t return node.__brush;\n\t}\n\t\n\tfunction empty(extent) {\n\t return extent[0][0] === extent[1][0]\n\t || extent[0][1] === extent[1][1];\n\t}\n\t\n\tfunction brushSelection(node) {\n\t var state = node.__brush;\n\t return state ? state.dim.output(state.selection) : null;\n\t}\n\t\n\tfunction brushX() {\n\t return brush$1(X);\n\t}\n\t\n\tfunction brushY() {\n\t return brush$1(Y);\n\t}\n\t\n\tvar brush = function() {\n\t return brush$1(XY);\n\t};\n\t\n\tfunction brush$1(dim) {\n\t var extent = defaultExtent,\n\t filter = defaultFilter,\n\t listeners = d3Dispatch.dispatch(brush, \"start\", \"brush\", \"end\"),\n\t handleSize = 6,\n\t touchending;\n\t\n\t function brush(group) {\n\t var overlay = group\n\t .property(\"__brush\", initialize)\n\t .selectAll(\".overlay\")\n\t .data([type(\"overlay\")]);\n\t\n\t overlay.enter().append(\"rect\")\n\t .attr(\"class\", \"overlay\")\n\t .attr(\"pointer-events\", \"all\")\n\t .attr(\"cursor\", cursors.overlay)\n\t .merge(overlay)\n\t .each(function() {\n\t var extent = local(this).extent;\n\t d3Selection.select(this)\n\t .attr(\"x\", extent[0][0])\n\t .attr(\"y\", extent[0][1])\n\t .attr(\"width\", extent[1][0] - extent[0][0])\n\t .attr(\"height\", extent[1][1] - extent[0][1]);\n\t });\n\t\n\t group.selectAll(\".selection\")\n\t .data([type(\"selection\")])\n\t .enter().append(\"rect\")\n\t .attr(\"class\", \"selection\")\n\t .attr(\"cursor\", cursors.selection)\n\t .attr(\"fill\", \"#777\")\n\t .attr(\"fill-opacity\", 0.3)\n\t .attr(\"stroke\", \"#fff\")\n\t .attr(\"shape-rendering\", \"crispEdges\");\n\t\n\t var handle = group.selectAll(\".handle\")\n\t .data(dim.handles, function(d) { return d.type; });\n\t\n\t handle.exit().remove();\n\t\n\t handle.enter().append(\"rect\")\n\t .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n\t .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\t\n\t group\n\t .each(redraw)\n\t .attr(\"fill\", \"none\")\n\t .attr(\"pointer-events\", \"all\")\n\t .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\")\n\t .on(\"mousedown.brush touchstart.brush\", started);\n\t }\n\t\n\t brush.move = function(group, selection) {\n\t if (group.selection) {\n\t group\n\t .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n\t .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n\t .tween(\"brush\", function() {\n\t var that = this,\n\t state = that.__brush,\n\t emit = emitter(that, arguments),\n\t selection0 = state.selection,\n\t selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n\t i = d3Interpolate.interpolate(selection0, selection1);\n\t\n\t function tween(t) {\n\t state.selection = t === 1 && empty(selection1) ? null : i(t);\n\t redraw.call(that);\n\t emit.brush();\n\t }\n\t\n\t return selection0 && selection1 ? tween : tween(1);\n\t });\n\t } else {\n\t group\n\t .each(function() {\n\t var that = this,\n\t args = arguments,\n\t state = that.__brush,\n\t selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n\t emit = emitter(that, args).beforestart();\n\t\n\t d3Transition.interrupt(that);\n\t state.selection = selection1 == null || empty(selection1) ? null : selection1;\n\t redraw.call(that);\n\t emit.start().brush().end();\n\t });\n\t }\n\t };\n\t\n\t function redraw() {\n\t var group = d3Selection.select(this),\n\t selection = local(this).selection;\n\t\n\t if (selection) {\n\t group.selectAll(\".selection\")\n\t .style(\"display\", null)\n\t .attr(\"x\", selection[0][0])\n\t .attr(\"y\", selection[0][1])\n\t .attr(\"width\", selection[1][0] - selection[0][0])\n\t .attr(\"height\", selection[1][1] - selection[0][1]);\n\t\n\t group.selectAll(\".handle\")\n\t .style(\"display\", null)\n\t .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n\t .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n\t .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n\t .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n\t }\n\t\n\t else {\n\t group.selectAll(\".selection,.handle\")\n\t .style(\"display\", \"none\")\n\t .attr(\"x\", null)\n\t .attr(\"y\", null)\n\t .attr(\"width\", null)\n\t .attr(\"height\", null);\n\t }\n\t }\n\t\n\t function emitter(that, args) {\n\t return that.__brush.emitter || new Emitter(that, args);\n\t }\n\t\n\t function Emitter(that, args) {\n\t this.that = that;\n\t this.args = args;\n\t this.state = that.__brush;\n\t this.active = 0;\n\t }\n\t\n\t Emitter.prototype = {\n\t beforestart: function() {\n\t if (++this.active === 1) this.state.emitter = this, this.starting = true;\n\t return this;\n\t },\n\t start: function() {\n\t if (this.starting) this.starting = false, this.emit(\"start\");\n\t return this;\n\t },\n\t brush: function() {\n\t this.emit(\"brush\");\n\t return this;\n\t },\n\t end: function() {\n\t if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n\t return this;\n\t },\n\t emit: function(type) {\n\t d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n\t }\n\t };\n\t\n\t function started() {\n\t if (d3Selection.event.touches) { if (d3Selection.event.changedTouches.length < d3Selection.event.touches.length) return noevent(); }\n\t else if (touchending) return;\n\t if (!filter.apply(this, arguments)) return;\n\t\n\t var that = this,\n\t type = d3Selection.event.target.__data__.type,\n\t mode = (d3Selection.event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE),\n\t signX = dim === Y ? null : signsX[type],\n\t signY = dim === X ? null : signsY[type],\n\t state = local(that),\n\t extent = state.extent,\n\t selection = state.selection,\n\t W = extent[0][0], w0, w1,\n\t N = extent[0][1], n0, n1,\n\t E = extent[1][0], e0, e1,\n\t S = extent[1][1], s0, s1,\n\t dx,\n\t dy,\n\t moving,\n\t shifting = signX && signY && d3Selection.event.shiftKey,\n\t lockX,\n\t lockY,\n\t point0 = d3Selection.mouse(that),\n\t point = point0,\n\t emit = emitter(that, arguments).beforestart();\n\t\n\t if (type === \"overlay\") {\n\t state.selection = selection = [\n\t [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n\t [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n\t ];\n\t } else {\n\t w0 = selection[0][0];\n\t n0 = selection[0][1];\n\t e0 = selection[1][0];\n\t s0 = selection[1][1];\n\t }\n\t\n\t w1 = w0;\n\t n1 = n0;\n\t e1 = e0;\n\t s1 = s0;\n\t\n\t var group = d3Selection.select(that)\n\t .attr(\"pointer-events\", \"none\");\n\t\n\t var overlay = group.selectAll(\".overlay\")\n\t .attr(\"cursor\", cursors[type]);\n\t\n\t if (d3Selection.event.touches) {\n\t group\n\t .on(\"touchmove.brush\", moved, true)\n\t .on(\"touchend.brush touchcancel.brush\", ended, true);\n\t } else {\n\t var view = d3Selection.select(d3Selection.event.view)\n\t .on(\"keydown.brush\", keydowned, true)\n\t .on(\"keyup.brush\", keyupped, true)\n\t .on(\"mousemove.brush\", moved, true)\n\t .on(\"mouseup.brush\", ended, true);\n\t\n\t d3Drag.dragDisable(d3Selection.event.view);\n\t }\n\t\n\t nopropagation();\n\t d3Transition.interrupt(that);\n\t redraw.call(that);\n\t emit.start();\n\t\n\t function moved() {\n\t var point1 = d3Selection.mouse(that);\n\t if (shifting && !lockX && !lockY) {\n\t if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n\t else lockX = true;\n\t }\n\t point = point1;\n\t moving = true;\n\t noevent();\n\t move();\n\t }\n\t\n\t function move() {\n\t var t;\n\t\n\t dx = point[0] - point0[0];\n\t dy = point[1] - point0[1];\n\t\n\t switch (mode) {\n\t case MODE_SPACE:\n\t case MODE_DRAG: {\n\t if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n\t if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n\t break;\n\t }\n\t case MODE_HANDLE: {\n\t if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n\t else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n\t if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n\t else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n\t break;\n\t }\n\t case MODE_CENTER: {\n\t if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n\t if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n\t break;\n\t }\n\t }\n\t\n\t if (e1 < w1) {\n\t signX *= -1;\n\t t = w0, w0 = e0, e0 = t;\n\t t = w1, w1 = e1, e1 = t;\n\t if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n\t }\n\t\n\t if (s1 < n1) {\n\t signY *= -1;\n\t t = n0, n0 = s0, s0 = t;\n\t t = n1, n1 = s1, s1 = t;\n\t if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n\t }\n\t\n\t if (state.selection) selection = state.selection; // May be set by brush.move!\n\t if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n\t if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\t\n\t if (selection[0][0] !== w1\n\t || selection[0][1] !== n1\n\t || selection[1][0] !== e1\n\t || selection[1][1] !== s1) {\n\t state.selection = [[w1, n1], [e1, s1]];\n\t redraw.call(that);\n\t emit.brush();\n\t }\n\t }\n\t\n\t function ended() {\n\t nopropagation();\n\t if (d3Selection.event.touches) {\n\t if (d3Selection.event.touches.length) return;\n\t if (touchending) clearTimeout(touchending);\n\t touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n\t group.on(\"touchmove.brush touchend.brush touchcancel.brush\", null);\n\t } else {\n\t d3Drag.dragEnable(d3Selection.event.view, moving);\n\t view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n\t }\n\t group.attr(\"pointer-events\", \"all\");\n\t overlay.attr(\"cursor\", cursors.overlay);\n\t if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n\t if (empty(selection)) state.selection = null, redraw.call(that);\n\t emit.end();\n\t }\n\t\n\t function keydowned() {\n\t switch (d3Selection.event.keyCode) {\n\t case 16: { // SHIFT\n\t shifting = signX && signY;\n\t break;\n\t }\n\t case 18: { // ALT\n\t if (mode === MODE_HANDLE) {\n\t if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n\t if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n\t mode = MODE_CENTER;\n\t move();\n\t }\n\t break;\n\t }\n\t case 32: { // SPACE; takes priority over ALT\n\t if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n\t if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n\t if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n\t mode = MODE_SPACE;\n\t overlay.attr(\"cursor\", cursors.selection);\n\t move();\n\t }\n\t break;\n\t }\n\t default: return;\n\t }\n\t noevent();\n\t }\n\t\n\t function keyupped() {\n\t switch (d3Selection.event.keyCode) {\n\t case 16: { // SHIFT\n\t if (shifting) {\n\t lockX = lockY = shifting = false;\n\t move();\n\t }\n\t break;\n\t }\n\t case 18: { // ALT\n\t if (mode === MODE_CENTER) {\n\t if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n\t if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n\t mode = MODE_HANDLE;\n\t move();\n\t }\n\t break;\n\t }\n\t case 32: { // SPACE\n\t if (mode === MODE_SPACE) {\n\t if (d3Selection.event.altKey) {\n\t if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n\t if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n\t mode = MODE_CENTER;\n\t } else {\n\t if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n\t if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n\t mode = MODE_HANDLE;\n\t }\n\t overlay.attr(\"cursor\", cursors[type]);\n\t move();\n\t }\n\t break;\n\t }\n\t default: return;\n\t }\n\t noevent();\n\t }\n\t }\n\t\n\t function initialize() {\n\t var state = this.__brush || {selection: null};\n\t state.extent = extent.apply(this, arguments);\n\t state.dim = dim;\n\t return state;\n\t }\n\t\n\t brush.extent = function(_) {\n\t return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;\n\t };\n\t\n\t brush.filter = function(_) {\n\t return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n\t };\n\t\n\t brush.handleSize = function(_) {\n\t return arguments.length ? (handleSize = +_, brush) : handleSize;\n\t };\n\t\n\t brush.on = function() {\n\t var value = listeners.on.apply(listeners, arguments);\n\t return value === listeners ? brush : value;\n\t };\n\t\n\t return brush;\n\t}\n\t\n\texports.brush = brush;\n\texports.brushX = brushX;\n\texports.brushY = brushY;\n\texports.brushSelection = brushSelection;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// https://d3js.org/d3-drag/ Version 1.1.1. Copyright 2017 Mike Bostock.\n\t(function (global, factory) {\n\t\t true ? factory(exports, __webpack_require__(6), __webpack_require__(13)) :\n\t\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) :\n\t\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3));\n\t}(this, (function (exports,d3Dispatch,d3Selection) { 'use strict';\n\t\n\tfunction nopropagation() {\n\t d3Selection.event.stopImmediatePropagation();\n\t}\n\t\n\tvar noevent = function() {\n\t d3Selection.event.preventDefault();\n\t d3Selection.event.stopImmediatePropagation();\n\t};\n\t\n\tvar nodrag = function(view) {\n\t var root = view.document.documentElement,\n\t selection = d3Selection.select(view).on(\"dragstart.drag\", noevent, true);\n\t if (\"onselectstart\" in root) {\n\t selection.on(\"selectstart.drag\", noevent, true);\n\t } else {\n\t root.__noselect = root.style.MozUserSelect;\n\t root.style.MozUserSelect = \"none\";\n\t }\n\t};\n\t\n\tfunction yesdrag(view, noclick) {\n\t var root = view.document.documentElement,\n\t selection = d3Selection.select(view).on(\"dragstart.drag\", null);\n\t if (noclick) {\n\t selection.on(\"click.drag\", noevent, true);\n\t setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n\t }\n\t if (\"onselectstart\" in root) {\n\t selection.on(\"selectstart.drag\", null);\n\t } else {\n\t root.style.MozUserSelect = root.__noselect;\n\t delete root.__noselect;\n\t }\n\t}\n\t\n\tvar constant = function(x) {\n\t return function() {\n\t return x;\n\t };\n\t};\n\t\n\tfunction DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch$$1) {\n\t this.target = target;\n\t this.type = type;\n\t this.subject = subject;\n\t this.identifier = id;\n\t this.active = active;\n\t this.x = x;\n\t this.y = y;\n\t this.dx = dx;\n\t this.dy = dy;\n\t this._ = dispatch$$1;\n\t}\n\t\n\tDragEvent.prototype.on = function() {\n\t var value = this._.on.apply(this._, arguments);\n\t return value === this._ ? this : value;\n\t};\n\t\n\t// Ignore right-click, since that should open the context menu.\n\tfunction defaultFilter() {\n\t return !d3Selection.event.button;\n\t}\n\t\n\tfunction defaultContainer() {\n\t return this.parentNode;\n\t}\n\t\n\tfunction defaultSubject(d) {\n\t return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d;\n\t}\n\t\n\tfunction touchable() {\n\t return \"ontouchstart\" in this;\n\t}\n\t\n\tvar drag = function() {\n\t var filter = defaultFilter,\n\t container = defaultContainer,\n\t subject = defaultSubject,\n\t gestures = {},\n\t listeners = d3Dispatch.dispatch(\"start\", \"drag\", \"end\"),\n\t active = 0,\n\t mousedownx,\n\t mousedowny,\n\t mousemoving,\n\t touchending,\n\t clickDistance2 = 0;\n\t\n\t function drag(selection) {\n\t selection\n\t .on(\"mousedown.drag\", mousedowned)\n\t .filter(touchable)\n\t .on(\"touchstart.drag\", touchstarted)\n\t .on(\"touchmove.drag\", touchmoved)\n\t .on(\"touchend.drag touchcancel.drag\", touchended)\n\t .style(\"touch-action\", \"none\")\n\t .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n\t }\n\t\n\t function mousedowned() {\n\t if (touchending || !filter.apply(this, arguments)) return;\n\t var gesture = beforestart(\"mouse\", container.apply(this, arguments), d3Selection.mouse, this, arguments);\n\t if (!gesture) return;\n\t d3Selection.select(d3Selection.event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n\t nodrag(d3Selection.event.view);\n\t nopropagation();\n\t mousemoving = false;\n\t mousedownx = d3Selection.event.clientX;\n\t mousedowny = d3Selection.event.clientY;\n\t gesture(\"start\");\n\t }\n\t\n\t function mousemoved() {\n\t noevent();\n\t if (!mousemoving) {\n\t var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny;\n\t mousemoving = dx * dx + dy * dy > clickDistance2;\n\t }\n\t gestures.mouse(\"drag\");\n\t }\n\t\n\t function mouseupped() {\n\t d3Selection.select(d3Selection.event.view).on(\"mousemove.drag mouseup.drag\", null);\n\t yesdrag(d3Selection.event.view, mousemoving);\n\t noevent();\n\t gestures.mouse(\"end\");\n\t }\n\t\n\t function touchstarted() {\n\t if (!filter.apply(this, arguments)) return;\n\t var touches = d3Selection.event.changedTouches,\n\t c = container.apply(this, arguments),\n\t n = touches.length, i, gesture;\n\t\n\t for (i = 0; i < n; ++i) {\n\t if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) {\n\t nopropagation();\n\t gesture(\"start\");\n\t }\n\t }\n\t }\n\t\n\t function touchmoved() {\n\t var touches = d3Selection.event.changedTouches,\n\t n = touches.length, i, gesture;\n\t\n\t for (i = 0; i < n; ++i) {\n\t if (gesture = gestures[touches[i].identifier]) {\n\t noevent();\n\t gesture(\"drag\");\n\t }\n\t }\n\t }\n\t\n\t function touchended() {\n\t var touches = d3Selection.event.changedTouches,\n\t n = touches.length, i, gesture;\n\t\n\t if (touchending) clearTimeout(touchending);\n\t touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n\t for (i = 0; i < n; ++i) {\n\t if (gesture = gestures[touches[i].identifier]) {\n\t nopropagation();\n\t gesture(\"end\");\n\t }\n\t }\n\t }\n\t\n\t function beforestart(id, container, point, that, args) {\n\t var p = point(container, id), s, dx, dy,\n\t sublisteners = listeners.copy();\n\t\n\t if (!d3Selection.customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n\t if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false;\n\t dx = s.x - p[0] || 0;\n\t dy = s.y - p[1] || 0;\n\t return true;\n\t })) return;\n\t\n\t return function gesture(type) {\n\t var p0 = p, n;\n\t switch (type) {\n\t case \"start\": gestures[id] = gesture, n = active++; break;\n\t case \"end\": delete gestures[id], --active; // nobreak\n\t case \"drag\": p = point(container, id), n = active; break;\n\t }\n\t d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n\t };\n\t }\n\t\n\t drag.filter = function(_) {\n\t return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n\t };\n\t\n\t drag.container = function(_) {\n\t return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n\t };\n\t\n\t drag.subject = function(_) {\n\t return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n\t };\n\t\n\t drag.on = function() {\n\t var value = listeners.on.apply(listeners, arguments);\n\t return value === listeners ? drag : value;\n\t };\n\t\n\t drag.clickDistance = function(_) {\n\t return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n\t };\n\t\n\t return drag;\n\t};\n\t\n\texports.drag = drag;\n\texports.dragDisable = nodrag;\n\texports.dragEnable = yesdrag;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// britecharts.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b0253ca21a6a1a4c2341","import bar from './charts/bar.js';\nimport donut from './charts/donut.js';\nimport legend from './charts/legend.js';\nimport line from './charts/line.js';\nimport tooltip from './charts/tooltip.js';\nimport miniTooltip from './charts/mini-tooltip.js';\nimport sparkline from './charts/sparkline.js';\nimport stackedArea from './charts/stacked-area.js';\nimport groupedBar from './charts/grouped-bar.js';\nimport stackedBar from './charts/stacked-bar.js';\nimport step from './charts/step.js';\nimport brush from './charts/brush.js';\nimport colors from './charts/helpers/colors.js';\n\nexport {\n bar,\n donut,\n legend,\n line,\n tooltip,\n miniTooltip,\n sparkline,\n stackedArea,\n groupedBar,\n stackedBar,\n step,\n brush,\n colors\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/bundle.js","define(function(require) {\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Ease = require('d3-ease');\n const d3Axis = require('d3-axis');\n const d3Color = require('d3-color');\n const d3Dispatch = require('d3-dispatch');\n const d3Format = require('d3-format');\n const d3Scale = require('d3-scale');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n const textHelper = require('./helpers/text');\n const {exportChart} = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n\n\n const PERCENTAGE_FORMAT = '%';\n const NUMBER_FORMAT = ',f';\n\n\n /**\n * @typedef BarChartData\n * @type {Object[]}\n * @property {Number} value Value of the group (required)\n * @property {String} name Name of the group (required)\n *\n * @example\n * [\n * {\n * value: 1,\n * name: 'glittering'\n * },\n * {\n * value: 1,\n * name: 'luminous'\n * }\n * ]\n */\n\n /**\n * Bar Chart reusable API class that renders a\n * simple and configurable bar chart.\n *\n * @module Bar\n * @tutorial bar\n * @requires d3-array, d3-axis, d3-dispatch, d3-scale, d3-selection\n *\n * @example\n * var barChart = bar();\n *\n * barChart\n * .height(500)\n * .width(800);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(barChart);\n *\n */\n return function module() {\n\n let margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 40\n },\n width = 960,\n height = 500,\n data,\n dataZeroed,\n chartWidth, chartHeight,\n xScale, yScale,\n colorSchema = colorHelper.singleColors.aloeGreen,\n colorList,\n colorMap,\n yTicks = 5,\n xTicks = 5,\n percentageAxisToMaxRatio = 1,\n enablePercentageLabels = false,\n percentageLabelMargin = 7,\n percentageLabelSize = 12,\n horizontalLabelFormat = '.0%',\n verticalLabelFormat = '.0f',\n valueLabelFormat = NUMBER_FORMAT,\n xAxis, yAxis,\n xAxisPadding = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n },\n yAxisPaddingBetweenChart = 10,\n yAxisLineWrapLimit = 1,\n isHorizontal = false,\n svg,\n\n isAnimated = false,\n ease = d3Ease.easeQuadInOut,\n animationDuration = 800,\n animationStepRatio = 70,\n interBarDelay = (d, i) => animationStepRatio * i,\n\n valueLabel = 'value',\n nameLabel = 'name',\n\n baseLine,\n maskGridLines,\n shouldReverseColorList = true,\n\n // Dispatcher object to broadcast the mouse events\n // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove'),\n\n // extractors\n getName = ({name}) => name,\n getValue = ({value}) => value,\n\n _percentageLabelHorizontalX = ({value}) => xScale(value) + percentageLabelMargin,\n _percentageLabelHorizontalY= ({name}) => yScale(name) + (yScale.bandwidth() / 2) + (percentageLabelSize * (3/8)),\n\n _percentageLabelVerticalX = ({name}) => xScale(name),\n _percentageLabelVerticalY = ({value}) => yScale(value) - percentageLabelMargin,\n\n _percentageLabelHorizontalFormatValue = ({value}) => d3Format.format(horizontalLabelFormat)(value),\n _percentageLabelVerticalFormatValue = ({value}) => d3Format.format(verticalLabelFormat)(parseFloat(value) * 100);\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {BarChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data) {\n chartWidth = width - margin.left - margin.right - (yAxisPaddingBetweenChart * 1.2);\n chartHeight = height - margin.top - margin.bottom;\n ({data, dataZeroed} = cleanData(_data));\n\n buildScales();\n buildAxis();\n buildSVG(this);\n drawGridLines();\n drawBars();\n drawAxis();\n if (enablePercentageLabels) {\n drawPercentageLabels();\n }\n });\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis() {\n if (isHorizontal) {\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(xTicks, valueLabelFormat)\n .tickSizeInner([-chartHeight]);\n\n yAxis = d3Axis.axisLeft(yScale);\n } else {\n xAxis = d3Axis.axisBottom(xScale);\n\n yAxis = d3Axis.axisLeft(yScale)\n .ticks(yTicks, valueLabelFormat)\n }\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left + yAxisPaddingBetweenChart}, ${margin.top})`);\n\n container\n .append('g').classed('grid-lines-group', true);\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('x-axis-group axis', true);\n container\n .append('g')\n .attr('transform', `translate(${-1 * (yAxisPaddingBetweenChart)}, 0)`)\n .classed('y-axis-group axis', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Creates the x and y scales of the graph\n * @private\n */\n function buildScales() {\n let percentageAxis = Math.min(percentageAxisToMaxRatio * d3Array.max(data, getValue))\n\n if (isHorizontal) {\n xScale = d3Scale.scaleLinear()\n .domain([0, percentageAxis])\n .rangeRound([0, chartWidth]);\n\n yScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([chartHeight, 0])\n .padding(0.1);\n } else {\n xScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([0, chartWidth])\n .padding(0.1);\n\n yScale = d3Scale.scaleLinear()\n .domain([0, percentageAxis])\n .rangeRound([chartHeight, 0]);\n }\n\n if (shouldReverseColorList) {\n colorList = data.map(d => d)\n .reverse()\n .map(({name}, i) => ({\n name,\n color: colorSchema[i % colorSchema.length]}\n ));\n } else {\n colorList = data.map(d => d)\n .map(({name}, i) => ({\n name,\n color: colorSchema[i % colorSchema.length]}\n ));\n }\n\n colorMap = (item) => colorList.filter(({name}) => name === item)[0].color;\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart bar-chart', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Cleaning data adding the proper format\n * @param {BarChartData} originalData Data\n * @private\n */\n function cleanData(originalData) {\n let data = originalData.reduce((acc, d) => {\n d.value = +d[valueLabel];\n d.name = String(d[nameLabel]);\n\n return [ ...acc, d];\n }, []);\n\n let dataZeroed = data.map((d) => ({\n value: 0,\n name: String(d[nameLabel])\n }));\n\n return { data, dataZeroed };\n }\n\n /**\n * Utility function that wraps a text into the given width\n * @param {D3Selection} text Text to write\n * @param {Number} containerWidth\n * @private\n */\n function wrapText(text, containerWidth) {\n textHelper.wrapTextWithEllipses(text, containerWidth, 0, yAxisLineWrapLimit)\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis() {\n svg.select('.x-axis-group.axis')\n .attr('transform', `translate(0, ${chartHeight})`)\n .call(xAxis);\n\n svg.select('.y-axis-group.axis')\n .call(yAxis);\n\n svg.selectAll('.y-axis-group .tick text')\n .call(wrapText, margin.left - yAxisPaddingBetweenChart)\n }\n\n /**\n * Draws the bars along the x axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawHorizontalBars(bars) {\n // Enter + Update\n bars.enter()\n .append('rect')\n .classed('bar', true)\n .attr('y', chartHeight)\n .attr('x', 0)\n .attr('height', yScale.bandwidth())\n .attr('width', ({value}) => xScale(value))\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n .merge(bars)\n .attr('x', 0)\n .attr('y', ({name}) => yScale(name))\n .attr('height', yScale.bandwidth())\n .attr('width', ({value}) => xScale(value))\n .attr('fill', ({name}) => colorMap(name));\n }\n\n /**\n * Draws and animates the bars along the x axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawAnimatedHorizontalBars(bars) {\n // Enter + Update\n bars.enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', 0)\n .attr('y', chartHeight)\n .attr('height', yScale.bandwidth())\n .attr('width', ({value}) => xScale(value))\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n });\n\n bars\n .attr('x', 0)\n .attr('y', ({name}) => yScale(name))\n .attr('height', yScale.bandwidth())\n .attr('fill', ({name}) => colorMap(name))\n .transition()\n .duration(animationDuration)\n .delay(interBarDelay)\n .ease(ease)\n .attr('width', ({value}) => xScale(value));\n }\n\n /**\n * Draws and animates the bars along the y axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawAnimatedVerticalBars(bars) {\n // Enter + Update\n bars.enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', chartWidth)\n .attr('y', ({value}) => yScale(value))\n .attr('width', xScale.bandwidth())\n .attr('height', ({value}) => chartHeight - yScale(value))\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n .merge(bars)\n .attr('x', ({name}) => xScale(name))\n .attr('width', xScale.bandwidth())\n .attr('fill', ({name}) => colorMap(name))\n .transition()\n .duration(animationDuration)\n .delay(interBarDelay)\n .ease(ease)\n .attr('y', ({value}) => yScale(value))\n .attr('height', ({value}) => chartHeight - yScale(value));\n }\n\n /**\n * Draws the bars along the y axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawVerticalBars(bars) {\n // Enter + Update\n bars.enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', chartWidth)\n .attr('y', ({value}) => yScale(value))\n .attr('width', xScale.bandwidth())\n .attr('height', ({value}) => chartHeight - yScale(value))\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n .merge(bars)\n .attr('x', ({name}) => xScale(name))\n .attr('y', ({value}) => yScale(value))\n .attr('width', xScale.bandwidth())\n .attr('height', ({value}) => chartHeight - yScale(value))\n .attr('fill', ({name}) => colorMap(name));\n }\n\n /**\n * Draws percentage labels at the end of each bar\n * @private\n * @return {void}\n */\n function drawPercentageLabels() {\n let labelXPosition = isHorizontal ? _percentageLabelHorizontalX : _percentageLabelVerticalX;\n let labelYPosition = isHorizontal ? _percentageLabelHorizontalY : _percentageLabelVerticalY;\n let text = isHorizontal ? _percentageLabelHorizontalFormatValue : _percentageLabelVerticalFormatValue;\n\n let percentageLabels = svg.select('.metadata-group')\n .append('g')\n .classed('percentage-label-group', true)\n .selectAll('text')\n .data(data.reverse())\n .enter()\n .append('text');\n\n percentageLabels\n .classed('percentage-label', true)\n .attr('x', labelXPosition)\n .attr('y', labelYPosition)\n .text(text)\n .attr('font-size', percentageLabelSize + 'px')\n }\n\n /**\n * Draws the bar elements within the chart group\n * @private\n */\n function drawBars() {\n let bars;\n\n if (isAnimated) {\n bars = svg.select('.chart-group').selectAll('.bar')\n .data(dataZeroed);\n\n if (isHorizontal) {\n drawHorizontalBars(bars);\n } else {\n drawVerticalBars(bars);\n }\n\n bars = svg.select('.chart-group').selectAll('.bar')\n .data(data);\n\n if (isHorizontal) {\n drawAnimatedHorizontalBars(bars);\n } else {\n drawAnimatedVerticalBars(bars);\n }\n } else {\n bars = svg.select('.chart-group').selectAll('.bar')\n .data(data);\n\n if (isHorizontal) {\n drawHorizontalBars(bars);\n } else {\n drawVerticalBars(bars);\n }\n }\n\n // Exit\n bars.exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines() {\n if (isHorizontal) {\n drawHorizontalGridLines();\n } else {\n drawVerticalGridLines();\n }\n }\n\n /**\n * Draws the grid lines for an horizontal bar chart\n * @return {void}\n */\n function drawHorizontalGridLines() {\n maskGridLines = svg.select('.grid-lines-group')\n .selectAll('line.vertical-grid-line')\n .data(xScale.ticks(4))\n .enter()\n .append('line')\n .attr('class', 'vertical-grid-line')\n .attr('y1', (xAxisPadding.left))\n .attr('y2', chartHeight)\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d))\n\n drawVerticalExtendedLine();\n }\n\n /**\n * Draws a vertical line to extend y-axis till the edges\n * @return {void}\n */\n function drawVerticalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-y-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-y-line')\n .attr('y1', (xAxisPadding.bottom))\n .attr('y2', chartHeight)\n .attr('x1', 0)\n .attr('x2', 0);\n }\n\n /**\n * Draws the grid lines for a vertical bar chart\n * @return {void}\n */\n function drawVerticalGridLines() {\n maskGridLines = svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(yScale.ticks(4))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d))\n\n drawHorizontalExtendedLine();\n }\n\n /**\n * Draws a vertical line to extend x-axis till the edges\n * @return {void}\n */\n function drawHorizontalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', chartHeight)\n .attr('y2', chartHeight);\n }\n\n /**\n * Custom OnMouseOver event handler\n * @return {void}\n * @private\n */\n function handleMouseOver(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n d3Selection.select(e).attr('fill', ({name}) => d3Color.color(colorMap(name)).darker());\n }\n\n /**\n * Custom OnMouseMove event handler\n * @return {void}\n * @private\n */\n function handleMouseMove(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseMove', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n }\n\n /**\n * Custom OnMouseOver event handler\n * @return {void}\n * @private\n */\n function handleMouseOut(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n d3Selection.select(e).attr('fill', ({name}) => colorMap(name));\n }\n\n // API\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Default false. If true, adds percentage labels at the end of the bars\n * @param {Boolean} _x\n * @return {Boolean | module} Current value of enablePercentageLables or Chart module to chain calls\n */\n exports.enablePercentageLabels = function(_x) {\n if (!arguments.length) {\n return enablePercentageLabels;\n }\n enablePercentageLabels = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {number} _x Desired width for the graph\n * @return { height | module} Current height or Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the horizontal direction of the chart\n * @param {number} _x Desired horizontal direction for the graph\n * @return { isHorizontal | module} If it is horizontal or Chart module to chain calls\n * @public\n */\n exports.isHorizontal = function(_x) {\n if (!arguments.length) {\n return isHorizontal;\n }\n isHorizontal = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {object} _x Margin object to get/set\n * @return { margin | module} Current margin or Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the nameLabel of the chart\n * @param {Number} _x Desired nameLabel for the graph\n * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n * @public\n */\n exports.nameLabel = function(_x) {\n if (!arguments.length) {\n return nameLabel;\n }\n nameLabel = _x;\n\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Configurable extension of the x axis\n * if your max point was 50% you might want to show x axis to 60%, pass 1.2\n * @param {number} _x ratio to max data point to add to the x axis\n * @return { ratio | module} Current ratio or Chart module to chain calls\n * @public\n */\n exports.percentageAxisToMaxRatio = function(_x) {\n if (!arguments.length) {\n return percentageAxisToMaxRatio;\n }\n percentageAxisToMaxRatio = _x;\n\n return this;\n }\n\n /**\n * Default 10px. Offset between end of bar and start of the percentage bars\n * @param {number} _x percentage margin offset from end of bar\n * @return {number | module} Currnet offset or Chart module to chain calls\n */\n exports.percentageLabelMargin = function(_x) {\n if (!arguments.length) {\n return percentageLabelMargin;\n }\n percentageLabelMargin = _x;\n\n return this;\n }\n\n /**\n * Gets or Sets whether the color list should be reversed or not\n * @param {boolean} _x Should reverse the color list\n * @return { boolean | module} Is color list being reversed\n * @public\n */\n exports.shouldReverseColorList = function(_x) {\n if (!arguments.length) {\n return shouldReverseColorList;\n }\n shouldReverseColorList = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the hasPercentage status\n * @param {boolean} _x Should use percentage as value format\n * @return { boolean | module} Is percentage used or Chart module to chain calls\n * @public\n */\n exports.hasPercentage = function(_x) {\n if (!arguments.length) {\n return valueLabelFormat === PERCENTAGE_FORMAT;\n }\n if (_x) {\n valueLabelFormat = PERCENTAGE_FORMAT;\n } else {\n valueLabelFormat = NUMBER_FORMAT;\n }\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabelFormat to a percentage format if true (default false)\n * @param {boolean} _x Should use percentage as value format\n * @return { boolean | module} Is percentage the value format used or Chart module to chain calls\n * @public\n */\n exports.usePercentage = function(_x) {\n if (!arguments.length) {\n return valueLabelFormat === PERCENTAGE_FORMAT;\n }\n if (_x) {\n valueLabelFormat = PERCENTAGE_FORMAT;\n } else {\n valueLabelFormat = NUMBER_FORMAT;\n }\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {number} _x Desired width for the graph\n * @return { width | module} Current width or Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the x axis on the chart\n * (Default is 5)\n * @param {Number} _x Desired horizontal ticks\n * @return {Number | module} Current xTicks or Chart module to chain calls\n * @public\n */\n exports.xTicks = function (_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n /**\n * Space between y axis and chart\n * (Default 10)\n * @param {Number} _x Space between y axis and chart\n * @return {Number| module} Current value of yAxisPaddingBetweenChart or Chart module to chain calls\n */\n exports.yAxisPaddingBetweenChart = function(_x) {\n if (!arguments.length) {\n return yAxisPaddingBetweenChart;\n }\n yAxisPaddingBetweenChart = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of vertical ticks on the chart\n * (Default is 6)\n * @param {Number} _x Desired number of vertical ticks for the graph\n * @return {Number | module} Current yTicks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function(_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n return this;\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/bar.js","// https://d3js.org/d3-array/ Version 1.2.0. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar ascending = function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n};\n\nvar bisector = function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n};\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n\nvar ascendingBisect = bisector(ascending);\nvar bisectRight = ascendingBisect.right;\nvar bisectLeft = ascendingBisect.left;\n\nvar pairs = function(array, f) {\n if (f == null) f = pair;\n var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = f(p, p = array[++i]);\n return pairs;\n};\n\nfunction pair(a, b) {\n return [a, b];\n}\n\nvar cross = function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n};\n\nvar descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n};\n\nvar number = function(x) {\n return x === null ? NaN : +x;\n};\n\nvar variance = function(values, valueof) {\n var n = values.length,\n m = 0,\n i = -1,\n mean = 0,\n value,\n delta,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n if (m > 1) return sum / (m - 1);\n};\n\nvar deviation = function(array, f) {\n var v = variance(array, f);\n return v ? Math.sqrt(v) : v;\n};\n\nvar extent = function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n};\n\nvar array = Array.prototype;\n\nvar slice = array.slice;\nvar map = array.map;\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nvar identity = function(x) {\n return x;\n};\n\nvar range = function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n};\n\nvar e10 = Math.sqrt(50);\nvar e5 = Math.sqrt(10);\nvar e2 = Math.sqrt(2);\n\nvar ticks = function(start, stop, count) {\n var reverse = stop < start,\n i = -1,\n n,\n ticks,\n step;\n\n if (reverse) n = start, start = stop, stop = n;\n\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n};\n\nfunction tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nfunction tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n\nvar sturges = function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n};\n\nvar histogram = function() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisectRight(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n};\n\nvar quantile = function(values, p, valueof) {\n if (valueof == null) valueof = number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n};\n\nvar freedmanDiaconis = function(values, min, max) {\n values = map.call(values, number).sort(ascending);\n return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n};\n\nvar scott = function(values, min, max) {\n return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n};\n\nvar max = function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n};\n\nvar mean = function(values, valueof) {\n var n = values.length,\n m = n,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) sum += value;\n else --m;\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;\n else --m;\n }\n }\n\n if (m) return sum / m;\n};\n\nvar median = function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n numbers = [];\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n numbers.push(value);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n numbers.push(value);\n }\n }\n }\n\n return quantile(numbers.sort(ascending), 0.5);\n};\n\nvar merge = function(arrays) {\n var n = arrays.length,\n m,\n i = -1,\n j = 0,\n merged,\n array;\n\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n\n return merged;\n};\n\nvar min = function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n return min;\n};\n\nvar permute = function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n};\n\nvar scan = function(values, compare) {\n if (!(n = values.length)) return;\n var n,\n i = 0,\n j = 0,\n xi,\n xj = values[j];\n\n if (compare == null) compare = ascending;\n\n while (++i < n) {\n if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\n xj = xi, j = i;\n }\n }\n\n if (compare(xj, xj) === 0) return j;\n};\n\nvar shuffle = function(array, i0, i1) {\n var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0];\n array[m + i0] = array[i + i0];\n array[i + i0] = t;\n }\n\n return array;\n};\n\nvar sum = function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n }\n }\n\n else {\n while (++i < n) {\n if (value = +valueof(values[i], i, values)) sum += value;\n }\n }\n\n return sum;\n};\n\nvar transpose = function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n};\n\nfunction length(d) {\n return d.length;\n}\n\nvar zip = function() {\n return transpose(arguments);\n};\n\nexports.bisect = bisectRight;\nexports.bisectRight = bisectRight;\nexports.bisectLeft = bisectLeft;\nexports.ascending = ascending;\nexports.bisector = bisector;\nexports.cross = cross;\nexports.descending = descending;\nexports.deviation = deviation;\nexports.extent = extent;\nexports.histogram = histogram;\nexports.thresholdFreedmanDiaconis = freedmanDiaconis;\nexports.thresholdScott = scott;\nexports.thresholdSturges = sturges;\nexports.max = max;\nexports.mean = mean;\nexports.median = median;\nexports.merge = merge;\nexports.min = min;\nexports.pairs = pairs;\nexports.permute = permute;\nexports.quantile = quantile;\nexports.range = range;\nexports.scan = scan;\nexports.shuffle = shuffle;\nexports.sum = sum;\nexports.ticks = ticks;\nexports.tickIncrement = tickIncrement;\nexports.tickStep = tickStep;\nexports.transpose = transpose;\nexports.variance = variance;\nexports.zip = zip;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-array/build/d3-array.js\n// module id = 2\n// module chunks = 0","// https://d3js.org/d3-ease/ Version 1.0.3. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nfunction linear(t) {\n return +t;\n}\n\nfunction quadIn(t) {\n return t * t;\n}\n\nfunction quadOut(t) {\n return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n\nfunction cubicIn(t) {\n return t * t * t;\n}\n\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n\nvar exponent = 3;\n\nvar polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nvar polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nvar polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n\nvar pi = Math.PI;\nvar halfPi = pi / 2;\n\nfunction sinIn(t) {\n return 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n\nfunction expIn(t) {\n return Math.pow(2, 10 * t - 10);\n}\n\nfunction expOut(t) {\n return 1 - Math.pow(2, -10 * t);\n}\n\nfunction expInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n\nfunction circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n\nvar b1 = 4 / 11;\nvar b2 = 6 / 11;\nvar b3 = 8 / 11;\nvar b4 = 3 / 4;\nvar b5 = 9 / 11;\nvar b6 = 10 / 11;\nvar b7 = 15 / 16;\nvar b8 = 21 / 22;\nvar b9 = 63 / 64;\nvar b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n\nvar overshoot = 1.70158;\n\nvar backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return t * t * ((s + 1) * t - s);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nvar backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((s + 1) * t + s) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nvar backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n\nvar tau = 2 * Math.PI;\nvar amplitude = 1;\nvar period = 0.3;\n\nvar elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nvar elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nvar elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n\nexports.easeLinear = linear;\nexports.easeQuad = quadInOut;\nexports.easeQuadIn = quadIn;\nexports.easeQuadOut = quadOut;\nexports.easeQuadInOut = quadInOut;\nexports.easeCubic = cubicInOut;\nexports.easeCubicIn = cubicIn;\nexports.easeCubicOut = cubicOut;\nexports.easeCubicInOut = cubicInOut;\nexports.easePoly = polyInOut;\nexports.easePolyIn = polyIn;\nexports.easePolyOut = polyOut;\nexports.easePolyInOut = polyInOut;\nexports.easeSin = sinInOut;\nexports.easeSinIn = sinIn;\nexports.easeSinOut = sinOut;\nexports.easeSinInOut = sinInOut;\nexports.easeExp = expInOut;\nexports.easeExpIn = expIn;\nexports.easeExpOut = expOut;\nexports.easeExpInOut = expInOut;\nexports.easeCircle = circleInOut;\nexports.easeCircleIn = circleIn;\nexports.easeCircleOut = circleOut;\nexports.easeCircleInOut = circleInOut;\nexports.easeBounce = bounceOut;\nexports.easeBounceIn = bounceIn;\nexports.easeBounceOut = bounceOut;\nexports.easeBounceInOut = bounceInOut;\nexports.easeBack = backInOut;\nexports.easeBackIn = backIn;\nexports.easeBackOut = backOut;\nexports.easeBackInOut = backInOut;\nexports.easeElastic = elasticOut;\nexports.easeElasticIn = elasticIn;\nexports.easeElasticOut = elasticOut;\nexports.easeElasticInOut = elasticInOut;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-ease/build/d3-ease.js\n// module id = 3\n// module chunks = 0","// https://d3js.org/d3-axis/ Version 1.0.8. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar slice = Array.prototype.slice;\n\nvar identity = function(x) {\n return x;\n};\n\nvar top = 1;\nvar right = 2;\nvar bottom = 3;\nvar left = 4;\nvar epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n return function(d) {\n return +scale(d);\n };\n}\n\nfunction center(scale) {\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n if (scale.round()) offset = Math.round(offset);\n return function(d) {\n return +scale(d) + offset;\n };\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + 0.5,\n range1 = +range[range.length - 1] + 0.5,\n position = (scale.bandwidth ? center : number)(scale.copy()),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"#000\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"#000\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"#000\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient == right\n ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter\n : \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter);\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d)); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = slice.call(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n return axis;\n}\n\nfunction axisTop(scale) {\n return axis(top, scale);\n}\n\nfunction axisRight(scale) {\n return axis(right, scale);\n}\n\nfunction axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nfunction axisLeft(scale) {\n return axis(left, scale);\n}\n\nexports.axisTop = axisTop;\nexports.axisRight = axisRight;\nexports.axisBottom = axisBottom;\nexports.axisLeft = axisLeft;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-axis/build/d3-axis.js\n// module id = 4\n// module chunks = 0","// https://d3js.org/d3-color/ Version 1.0.3. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar define = function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n};\n\nfunction extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n\nfunction Color() {}\n\nvar darker = 0.7;\nvar brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\";\nvar reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\";\nvar reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\";\nvar reHex3 = /^#([0-9a-f]{3})$/;\nvar reHex6 = /^#([0-9a-f]{6})$/;\nvar reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\");\nvar reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\");\nvar reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\");\nvar reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\");\nvar reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\");\nvar reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nfunction color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n\nvar deg2rad = Math.PI / 180;\nvar rad2deg = 180 / Math.PI;\n\nvar Kn = 18;\nvar Xn = 0.950470;\nvar Yn = 1;\nvar Zn = 1.088830;\nvar t0 = 4 / 29;\nvar t1 = 6 / 29;\nvar t2 = 3 * t1 * t1;\nvar t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var b = rgb2xyz(o.r),\n a = rgb2xyz(o.g),\n l = rgb2xyz(o.b),\n x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),\n z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nfunction lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nfunction Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n y = Yn * lab2xyz(y);\n x = Xn * lab2xyz(x);\n z = Zn * lab2xyz(z);\n return new Rgb(\n xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB\n xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),\n xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction xyz2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2xyz(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nfunction hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n\nvar A = -0.14861;\nvar B = +1.78277;\nvar C = -0.29227;\nvar D = -0.90649;\nvar E = +1.97294;\nvar ED = E * D;\nvar EB = E * B;\nvar BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n\nexports.color = color;\nexports.rgb = rgb;\nexports.hsl = hsl;\nexports.lab = lab;\nexports.hcl = hcl;\nexports.cubehelix = cubehelix;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-color/build/d3-color.js\n// module id = 5\n// module chunks = 0","// https://d3js.org/d3-dispatch/ Version 1.0.3. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexports.dispatch = dispatch;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-dispatch/build/d3-dispatch.js\n// module id = 6\n// module chunks = 0","// https://d3js.org/d3-format/ Version 1.2.0. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nvar formatDecimal = function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n};\n\nvar exponent = function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n};\n\nvar formatGroup = function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n};\n\nvar formatNumerals = function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n};\n\nvar formatDefault = function(x, p) {\n x = x.toPrecision(p);\n\n out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (x[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n case \"e\": break out;\n default: if (i0 > 0) i0 = 0; break;\n }\n }\n\n return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;\n};\n\nvar prefixExponent;\n\nvar formatPrefixAuto = function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n};\n\nvar formatRounded = function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n};\n\nvar formatTypes = {\n \"\": formatDefault,\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n\n// [[fill]align][sign][symbol][0][width][,][.precision][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-\\( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n\n var match,\n fill = match[1] || \" \",\n align = match[2] || \">\",\n sign = match[3] || \"-\",\n symbol = match[4] || \"\",\n zero = !!match[5],\n width = match[6] && +match[6],\n comma = !!match[7],\n precision = match[8] && +match[8].slice(1),\n type = match[9] || \"\";\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // Map invalid types to the default format.\n else if (!formatTypes[type]) type = \"\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n this.fill = fill;\n this.align = align;\n this.sign = sign;\n this.symbol = symbol;\n this.zero = zero;\n this.width = width;\n this.comma = comma;\n this.precision = precision;\n this.type = type;\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + this.type;\n};\n\nvar identity = function(x) {\n return x;\n};\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nvar formatLocale = function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n type = specifier.type;\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = !type || /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? (type ? 6 : 12)\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = valueSuffix + (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n};\n\nvar locale;\n\n\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nfunction defaultLocale(definition) {\n locale = formatLocale(definition);\n exports.format = locale.format;\n exports.formatPrefix = locale.formatPrefix;\n return locale;\n}\n\nvar precisionFixed = function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n};\n\nvar precisionPrefix = function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n};\n\nvar precisionRound = function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n};\n\nexports.formatDefaultLocale = defaultLocale;\nexports.formatLocale = formatLocale;\nexports.formatSpecifier = formatSpecifier;\nexports.precisionFixed = precisionFixed;\nexports.precisionPrefix = precisionPrefix;\nexports.precisionRound = precisionRound;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-format/build/d3-format.js\n// module id = 7\n// module chunks = 0","// https://d3js.org/d3-scale/ Version 1.0.6. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-collection'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format'), require('d3-color')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-collection', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format', 'd3-color'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));\n}(this, (function (exports,d3Array,d3Collection,d3Interpolate,d3Format,d3Time,d3TimeFormat,d3Color) { 'use strict';\n\nvar array = Array.prototype;\n\nvar map$1 = array.map;\nvar slice = array.slice;\n\nvar implicit = {name: \"implicit\"};\n\nfunction ordinal(range$$1) {\n var index = d3Collection.map(),\n domain = [],\n unknown = implicit;\n\n range$$1 = range$$1 == null ? [] : slice.call(range$$1);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range$$1[(i - 1) % range$$1.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = d3Collection.map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range$$1 = slice.call(_), scale) : range$$1.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range$$1)\n .unknown(unknown);\n };\n\n return scale;\n}\n\nfunction band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n range$$1 = [0, 1],\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = range$$1[1] < range$$1[0],\n start = range$$1[reverse - 0],\n stop = range$$1[1 - reverse];\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = d3Array.range(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();\n };\n\n scale.rangeRound = function(_) {\n return range$$1 = [+_[0], +_[1]], round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band()\n .domain(domain())\n .range(range$$1)\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return rescale();\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nfunction point() {\n return pointish(band().paddingInner(1));\n}\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nvar number = function(x) {\n return +x;\n};\n\nvar unit = [0, 1];\n\nfunction deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range$$1, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range$$1, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range$$1.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range$$1 = range$$1.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);\n }\n\n return function(x) {\n var i = d3Array.bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nfunction copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nfunction continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range$$1 = unit,\n interpolate$$1 = d3Interpolate.interpolate,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map$1.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice();\n };\n\n scale.rangeRound = function(_) {\n return range$$1 = slice.call(_), interpolate$$1 = d3Interpolate.interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;\n };\n\n return rescale();\n}\n\nvar tickFormat = function(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = d3Array.tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = d3Format.formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision;\n return d3Format.formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return d3Format.format(specifier);\n};\n\nfunction linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = d3Array.tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = d3Array.tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = d3Array.tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nfunction linear() {\n var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n return linearish(scale);\n}\n\nfunction identity() {\n var domain = [0, 1];\n\n function scale(x) {\n return +x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = function(_) {\n return arguments.length ? (domain = map$1.call(_, number), scale) : domain.slice();\n };\n\n scale.copy = function() {\n return identity().domain(domain);\n };\n\n return linearish(scale);\n}\n\nvar nice = function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n};\n\nfunction deinterpolate(a, b) {\n return (b = Math.log(b / a))\n ? function(x) { return Math.log(x / a) / b; }\n : constant(b);\n}\n\nfunction reinterpolate(a, b) {\n return a < 0\n ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }\n : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nfunction log() {\n var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),\n domain = scale.domain,\n base = 10,\n logs = logp(10),\n pows = powp(10);\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = d3Format.format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n scale.copy = function() {\n return copy(scale, log().base(base));\n };\n\n return scale;\n}\n\nfunction raise(x, exponent) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n}\n\nfunction pow() {\n var exponent = 1,\n scale = continuous(deinterpolate, reinterpolate),\n domain = scale.domain;\n\n function deinterpolate(a, b) {\n return (b = raise(b, exponent) - (a = raise(a, exponent)))\n ? function(x) { return (raise(x, exponent) - a) / b; }\n : constant(b);\n }\n\n function reinterpolate(a, b) {\n b = raise(b, exponent) - (a = raise(a, exponent));\n return function(t) { return raise(a + b * t, 1 / exponent); };\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n };\n\n scale.copy = function() {\n return copy(scale, pow().exponent(exponent));\n };\n\n return linearish(scale);\n}\n\nfunction sqrt() {\n return pow().exponent(0.5);\n}\n\nfunction quantile$1() {\n var domain = [],\n range$$1 = [],\n thresholds = [];\n\n function rescale() {\n var i = 0, n = Math.max(1, range$$1.length);\n thresholds = new Array(n - 1);\n while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n);\n return scale;\n }\n\n function scale(x) {\n if (!isNaN(x = +x)) return range$$1[d3Array.bisect(thresholds, x)];\n }\n\n scale.invertExtent = function(y) {\n var i = range$$1.indexOf(y);\n return i < 0 ? [NaN, NaN] : [\n i > 0 ? thresholds[i - 1] : domain[0],\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n ];\n };\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(d3Array.ascending);\n return rescale();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range$$1 = slice.call(_), rescale()) : range$$1.slice();\n };\n\n scale.quantiles = function() {\n return thresholds.slice();\n };\n\n scale.copy = function() {\n return quantile$1()\n .domain(domain)\n .range(range$$1);\n };\n\n return scale;\n}\n\nfunction quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range$$1 = [0, 1];\n\n function scale(x) {\n if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)];\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range$$1 = slice.call(_)).length - 1, rescale()) : range$$1.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range$$1.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range$$1);\n };\n\n return linearish(scale);\n}\n\nfunction threshold() {\n var domain = [0.5],\n range$$1 = [0, 1],\n n = 1;\n\n function scale(x) {\n if (x <= x) return range$$1[d3Array.bisect(domain, x, 0, n)];\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range$$1 = slice.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range$$1.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return threshold()\n .domain(domain)\n .range(range$$1);\n };\n\n return scale;\n}\n\nvar durationSecond = 1000;\nvar durationMinute = durationSecond * 60;\nvar durationHour = durationMinute * 60;\nvar durationDay = durationHour * 24;\nvar durationWeek = durationDay * 7;\nvar durationMonth = durationDay * 30;\nvar durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number$1(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nfunction calendar(year, month, week, day, hour, minute, second, millisecond, format$$1) {\n var scale = continuous(deinterpolateLinear, d3Interpolate.interpolateNumber),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format$$1(\".%L\"),\n formatSecond = format$$1(\":%S\"),\n formatMinute = format$$1(\"%I:%M\"),\n formatHour = format$$1(\"%I %p\"),\n formatDay = format$$1(\"%a %d\"),\n formatWeek = format$$1(\"%b %d\"),\n formatMonth = format$$1(\"%B\"),\n formatYear = format$$1(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = d3Array.tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = d3Array.tickStep(start, stop, interval);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map$1.call(_, number$1)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format$$1(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format$$1));\n };\n\n return scale;\n}\n\nvar time = function() {\n return calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n};\n\nvar utcTime = function() {\n return calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);\n};\n\nvar colors = function(s) {\n return s.match(/.{6}/g).map(function(x) {\n return \"#\" + x;\n });\n};\n\nvar category10 = colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n\nvar category20b = colors(\"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\");\n\nvar category20c = colors(\"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\");\n\nvar category20 = colors(\"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\");\n\nvar cubehelix$1 = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0));\n\nvar warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8));\n\nvar cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8));\n\nvar rainbow = d3Color.cubehelix();\n\nvar rainbow$1 = function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n rainbow.h = 360 * t - 100;\n rainbow.s = 1.5 - 1.5 * ts;\n rainbow.l = 0.8 - 0.9 * ts;\n return rainbow + \"\";\n};\n\nfunction ramp(range$$1) {\n var n = range$$1.length;\n return function(t) {\n return range$$1[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nvar viridis = ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nvar magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nvar inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nvar plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n\nfunction sequential(interpolator) {\n var x0 = 0,\n x1 = 1,\n clamp = false;\n\n function scale(x) {\n var t = (x - x0) / (x1 - x0);\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return sequential(interpolator).domain([x0, x1]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n\nexports.scaleBand = band;\nexports.scalePoint = point;\nexports.scaleIdentity = identity;\nexports.scaleLinear = linear;\nexports.scaleLog = log;\nexports.scaleOrdinal = ordinal;\nexports.scaleImplicit = implicit;\nexports.scalePow = pow;\nexports.scaleSqrt = sqrt;\nexports.scaleQuantile = quantile$1;\nexports.scaleQuantize = quantize;\nexports.scaleThreshold = threshold;\nexports.scaleTime = time;\nexports.scaleUtc = utcTime;\nexports.schemeCategory10 = category10;\nexports.schemeCategory20b = category20b;\nexports.schemeCategory20c = category20c;\nexports.schemeCategory20 = category20;\nexports.interpolateCubehelixDefault = cubehelix$1;\nexports.interpolateRainbow = rainbow$1;\nexports.interpolateWarm = warm;\nexports.interpolateCool = cool;\nexports.interpolateViridis = viridis;\nexports.interpolateMagma = magma;\nexports.interpolateInferno = inferno;\nexports.interpolatePlasma = plasma;\nexports.scaleSequential = sequential;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-scale/build/d3-scale.js\n// module id = 8\n// module chunks = 0","// https://d3js.org/d3-collection/ Version 1.0.4. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nvar nest = function() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map$$1, depth) {\n if (++depth > keys.length) return map$$1;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map$$1.entries();\n else array = [], map$$1.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n};\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map$$1, key, value) {\n map$$1.set(key, value);\n}\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nvar keys = function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n};\n\nvar values = function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n};\n\nvar entries = function(map) {\n var entries = [];\n for (var key in map) entries.push({key: key, value: map[key]});\n return entries;\n};\n\nexports.nest = nest;\nexports.set = set;\nexports.map = map;\nexports.keys = keys;\nexports.values = values;\nexports.entries = entries;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-collection/build/d3-collection.js\n// module id = 9\n// module chunks = 0","// https://d3js.org/d3-interpolate/ Version 1.1.5. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3));\n}(this, (function (exports,d3Color) { 'use strict';\n\nfunction basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nvar basis$1 = function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n};\n\nvar basisClosed = function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n};\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nfunction hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nfunction gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nfunction nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n\nvar rgb$1 = ((function rgbGamma(y) {\n var color$$1 = gamma(y);\n\n function rgb$$1(start, end) {\n var r = color$$1((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r),\n g = color$$1(start.g, end.g),\n b = color$$1(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb$$1.gamma = rgbGamma;\n\n return rgb$$1;\n}))(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color$$1;\n for (i = 0; i < n; ++i) {\n color$$1 = d3Color.rgb(colors[i]);\n r[i] = color$$1.r || 0;\n g[i] = color$$1.g || 0;\n b[i] = color$$1.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color$$1.opacity = 1;\n return function(t) {\n color$$1.r = r(t);\n color$$1.g = g(t);\n color$$1.b = b(t);\n return color$$1 + \"\";\n };\n };\n}\n\nvar rgbBasis = rgbSpline(basis$1);\nvar rgbBasisClosed = rgbSpline(basisClosed);\n\nvar array = function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(nb),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n};\n\nvar date = function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n};\n\nvar number = function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n};\n\nvar object = function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n};\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g;\nvar reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nvar string = function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n};\n\nvar value = function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = d3Color.color(b)) ? (b = c, rgb$1) : string)\n : b instanceof d3Color.color ? rgb$1\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n};\n\nvar round = function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n};\n\nvar degrees = 180 / Math.PI;\n\nvar identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nvar decompose = function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n};\n\nvar cssNode;\nvar cssRoot;\nvar cssView;\nvar svgNode;\n\nfunction parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nfunction parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nvar interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nvar interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n\nvar rho = Math.SQRT2;\nvar rho2 = 2;\nvar rho4 = 4;\nvar epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nvar zoom = function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n };\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n };\n }\n\n i.duration = S * 1000;\n\n return i;\n};\n\nfunction hsl$1(hue$$1) {\n return function(start, end) {\n var h = hue$$1((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h),\n s = nogamma(start.s, end.s),\n l = nogamma(start.l, end.l),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nvar hsl$2 = hsl$1(hue);\nvar hslLong = hsl$1(nogamma);\n\nfunction lab$1(start, end) {\n var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l),\n a = nogamma(start.a, end.a),\n b = nogamma(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.l = l(t);\n start.a = a(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n}\n\nfunction hcl$1(hue$$1) {\n return function(start, end) {\n var h = hue$$1((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h),\n c = nogamma(start.c, end.c),\n l = nogamma(start.l, end.l),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nvar hcl$2 = hcl$1(hue);\nvar hclLong = hcl$1(nogamma);\n\nfunction cubehelix$1(hue$$1) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix$$1(start, end) {\n var h = hue$$1((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h),\n s = nogamma(start.s, end.s),\n l = nogamma(start.l, end.l),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix$$1.gamma = cubehelixGamma;\n\n return cubehelix$$1;\n })(1);\n}\n\nvar cubehelix$2 = cubehelix$1(hue);\nvar cubehelixLong = cubehelix$1(nogamma);\n\nvar quantize = function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n};\n\nexports.interpolate = value;\nexports.interpolateArray = array;\nexports.interpolateBasis = basis$1;\nexports.interpolateBasisClosed = basisClosed;\nexports.interpolateDate = date;\nexports.interpolateNumber = number;\nexports.interpolateObject = object;\nexports.interpolateRound = round;\nexports.interpolateString = string;\nexports.interpolateTransformCss = interpolateTransformCss;\nexports.interpolateTransformSvg = interpolateTransformSvg;\nexports.interpolateZoom = zoom;\nexports.interpolateRgb = rgb$1;\nexports.interpolateRgbBasis = rgbBasis;\nexports.interpolateRgbBasisClosed = rgbBasisClosed;\nexports.interpolateHsl = hsl$2;\nexports.interpolateHslLong = hslLong;\nexports.interpolateLab = lab$1;\nexports.interpolateHcl = hcl$2;\nexports.interpolateHclLong = hclLong;\nexports.interpolateCubehelix = cubehelix$2;\nexports.interpolateCubehelixLong = cubehelixLong;\nexports.quantize = quantize;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-interpolate/build/d3-interpolate.js\n// module id = 10\n// module chunks = 0","// https://d3js.org/d3-time/ Version 1.0.7. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar t0 = new Date;\nvar t1 = new Date;\n\nfunction newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n\nvar millisecond = newInterval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return newInterval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nvar milliseconds = millisecond.range;\n\nvar durationSecond = 1e3;\nvar durationMinute = 6e4;\nvar durationHour = 36e5;\nvar durationDay = 864e5;\nvar durationWeek = 6048e5;\n\nvar second = newInterval(function(date) {\n date.setTime(Math.floor(date / durationSecond) * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nvar seconds = second.range;\n\nvar minute = newInterval(function(date) {\n date.setTime(Math.floor(date / durationMinute) * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nvar minutes = minute.range;\n\nvar hour = newInterval(function(date) {\n var offset = date.getTimezoneOffset() * durationMinute % durationHour;\n if (offset < 0) offset += durationHour;\n date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nvar hours = hour.range;\n\nvar day = newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nvar days = day.range;\n\nfunction weekday(i) {\n return newInterval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nvar sunday = weekday(0);\nvar monday = weekday(1);\nvar tuesday = weekday(2);\nvar wednesday = weekday(3);\nvar thursday = weekday(4);\nvar friday = weekday(5);\nvar saturday = weekday(6);\n\nvar sundays = sunday.range;\nvar mondays = monday.range;\nvar tuesdays = tuesday.range;\nvar wednesdays = wednesday.range;\nvar thursdays = thursday.range;\nvar fridays = friday.range;\nvar saturdays = saturday.range;\n\nvar month = newInterval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nvar months = month.range;\n\nvar year = newInterval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nvar years = year.range;\n\nvar utcMinute = newInterval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nvar utcMinutes = utcMinute.range;\n\nvar utcHour = newInterval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nvar utcHours = utcHour.range;\n\nvar utcDay = newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nvar utcDays = utcDay.range;\n\nfunction utcWeekday(i) {\n return newInterval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nvar utcSunday = utcWeekday(0);\nvar utcMonday = utcWeekday(1);\nvar utcTuesday = utcWeekday(2);\nvar utcWednesday = utcWeekday(3);\nvar utcThursday = utcWeekday(4);\nvar utcFriday = utcWeekday(5);\nvar utcSaturday = utcWeekday(6);\n\nvar utcSundays = utcSunday.range;\nvar utcMondays = utcMonday.range;\nvar utcTuesdays = utcTuesday.range;\nvar utcWednesdays = utcWednesday.range;\nvar utcThursdays = utcThursday.range;\nvar utcFridays = utcFriday.range;\nvar utcSaturdays = utcSaturday.range;\n\nvar utcMonth = newInterval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nvar utcMonths = utcMonth.range;\n\nvar utcYear = newInterval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nvar utcYears = utcYear.range;\n\nexports.timeInterval = newInterval;\nexports.timeMillisecond = millisecond;\nexports.timeMilliseconds = milliseconds;\nexports.utcMillisecond = millisecond;\nexports.utcMilliseconds = milliseconds;\nexports.timeSecond = second;\nexports.timeSeconds = seconds;\nexports.utcSecond = second;\nexports.utcSeconds = seconds;\nexports.timeMinute = minute;\nexports.timeMinutes = minutes;\nexports.timeHour = hour;\nexports.timeHours = hours;\nexports.timeDay = day;\nexports.timeDays = days;\nexports.timeWeek = sunday;\nexports.timeWeeks = sundays;\nexports.timeSunday = sunday;\nexports.timeSundays = sundays;\nexports.timeMonday = monday;\nexports.timeMondays = mondays;\nexports.timeTuesday = tuesday;\nexports.timeTuesdays = tuesdays;\nexports.timeWednesday = wednesday;\nexports.timeWednesdays = wednesdays;\nexports.timeThursday = thursday;\nexports.timeThursdays = thursdays;\nexports.timeFriday = friday;\nexports.timeFridays = fridays;\nexports.timeSaturday = saturday;\nexports.timeSaturdays = saturdays;\nexports.timeMonth = month;\nexports.timeMonths = months;\nexports.timeYear = year;\nexports.timeYears = years;\nexports.utcMinute = utcMinute;\nexports.utcMinutes = utcMinutes;\nexports.utcHour = utcHour;\nexports.utcHours = utcHours;\nexports.utcDay = utcDay;\nexports.utcDays = utcDays;\nexports.utcWeek = utcSunday;\nexports.utcWeeks = utcSundays;\nexports.utcSunday = utcSunday;\nexports.utcSundays = utcSundays;\nexports.utcMonday = utcMonday;\nexports.utcMondays = utcMondays;\nexports.utcTuesday = utcTuesday;\nexports.utcTuesdays = utcTuesdays;\nexports.utcWednesday = utcWednesday;\nexports.utcWednesdays = utcWednesdays;\nexports.utcThursday = utcThursday;\nexports.utcThursdays = utcThursdays;\nexports.utcFriday = utcFriday;\nexports.utcFridays = utcFridays;\nexports.utcSaturday = utcSaturday;\nexports.utcSaturdays = utcSaturdays;\nexports.utcMonth = utcMonth;\nexports.utcMonths = utcMonths;\nexports.utcYear = utcYear;\nexports.utcYears = utcYears;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-time/build/d3-time.js\n// module id = 11\n// module chunks = 0","// https://d3js.org/d3-time-format/ Version 2.0.5. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3));\n}(this, (function (exports,d3Time) { 'use strict';\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nfunction formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"S\": formatSeconds,\n \"U\": formatWeekNumberSunday,\n \"w\": formatWeekdayNumber,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"S\": formatUTCSeconds,\n \"U\": formatUTCWeekNumberSunday,\n \"w\": formatUTCWeekdayNumber,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"S\": parseSeconds,\n \"U\": parseWeekNumberSunday,\n \"w\": parseWeekdayNumber,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0);\n if (i != string.length) return null;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n var day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"};\nvar numberRe = /^\\s*\\d+/;\nvar percentRe = /^%/;\nvar requoteRe = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?:\\:?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(d3Time.timeSunday.count(d3Time.timeYear(d), d), p, 2);\n}\n\nfunction formatWeekdayNumber(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(d3Time.timeMonday.count(d3Time.timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(d3Time.utcSunday.count(d3Time.utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekdayNumber(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(d3Time.utcMonday.count(d3Time.utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nvar locale$1;\n\n\n\n\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nfunction defaultLocale(definition) {\n locale$1 = formatLocale(definition);\n exports.timeFormat = locale$1.format;\n exports.timeParse = locale$1.parse;\n exports.utcFormat = locale$1.utcFormat;\n exports.utcParse = locale$1.utcParse;\n return locale$1;\n}\n\nvar isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : exports.utcFormat(isoSpecifier);\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : exports.utcParse(isoSpecifier);\n\nexports.timeFormatDefaultLocale = defaultLocale;\nexports.timeFormatLocale = formatLocale;\nexports.isoFormat = formatIso;\nexports.isoParse = parseIso;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-time-format/build/d3-time-format.js\n// module id = 12\n// module chunks = 0","// https://d3js.org/d3-selection/ Version 1.1.0. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar xhtml = \"http://www.w3.org/1999/xhtml\";\n\nvar namespaces = {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n\nvar namespace = function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n};\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nvar creator = function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n};\n\nvar nextId = 0;\n\nfunction local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n\nvar matcher = function(selector) {\n return function() {\n return this.matches(selector);\n };\n};\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!element.matches) {\n var vendorMatches = element.webkitMatchesSelector\n || element.msMatchesSelector\n || element.mozMatchesSelector\n || element.oMatchesSelector;\n matcher = function(selector) {\n return function() {\n return vendorMatches.call(this, selector);\n };\n };\n }\n}\n\nvar matcher$1 = matcher;\n\nvar filterEvents = {};\n\nexports.event = null;\n\nif (typeof document !== \"undefined\") {\n var element$1 = document.documentElement;\n if (!(\"onmouseenter\" in element$1)) {\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n }\n}\n\nfunction filterContextListener(listener, index, group) {\n listener = contextListener(listener, index, group);\n return function(event) {\n var related = event.relatedTarget;\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n listener.call(this, event);\n }\n };\n}\n\nfunction contextListener(listener, index, group) {\n return function(event1) {\n var event0 = exports.event; // Events can be reentrant (e.g., focus).\n exports.event = event1;\n try {\n listener.call(this, this.__data__, index, group);\n } finally {\n exports.event = event0;\n }\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, capture) {\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n return function(d, i, group) {\n var on = this.__on, o, listener = wrap(value, i, group);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, capture);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nvar selection_on = function(typename, value, capture) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n if (capture == null) capture = false;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n return this;\n};\n\nfunction customEvent(event1, listener, that, args) {\n var event0 = exports.event;\n event1.sourceEvent = exports.event;\n exports.event = event1;\n try {\n return listener.apply(that, args);\n } finally {\n exports.event = event0;\n }\n}\n\nvar sourceEvent = function() {\n var current = exports.event, source;\n while (source = current.sourceEvent) current = source;\n return current;\n};\n\nvar point = function(node, event) {\n var svg = node.ownerSVGElement || node;\n\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n};\n\nvar mouse = function(node) {\n var event = sourceEvent();\n if (event.changedTouches) event = event.changedTouches[0];\n return point(node, event);\n};\n\nfunction none() {}\n\nvar selector = function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n};\n\nvar selection_select = function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n};\n\nfunction empty() {\n return [];\n}\n\nvar selectorAll = function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n};\n\nvar selection_selectAll = function(select) {\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n};\n\nvar selection_filter = function(match) {\n if (typeof match !== \"function\") match = matcher$1(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n};\n\nvar sparse = function(update) {\n return new Array(update.length);\n};\n\nvar selection_enter = function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n};\n\nfunction EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = {},\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n if (keyValue in nodeByKeyValue) {\n exit[i] = node;\n } else {\n nodeByKeyValue[keyValue] = node;\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\n if (node = nodeByKeyValue[keyValue]) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue[keyValue] = null;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n exit[i] = node;\n }\n }\n}\n\nvar selection_data = function(value, key) {\n if (!value) {\n data = new Array(this.size()), j = -1;\n this.each(function(d) { data[++j] = d; });\n return data;\n }\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = value.call(parent, parent && parent.__data__, j, parents),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n};\n\nvar selection_exit = function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n};\n\nvar selection_merge = function(selection) {\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n};\n\nvar selection_order = function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n};\n\nvar selection_sort = function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n};\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n\nvar selection_call = function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n};\n\nvar selection_nodes = function() {\n var nodes = new Array(this.size()), i = -1;\n this.each(function() { nodes[++i] = this; });\n return nodes;\n};\n\nvar selection_node = function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n};\n\nvar selection_size = function() {\n var size = 0;\n this.each(function() { ++size; });\n return size;\n};\n\nvar selection_empty = function() {\n return !this.node();\n};\n\nvar selection_each = function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n};\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nvar selection_attr = function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n};\n\nvar defaultView = function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n};\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nvar selection_style = function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n};\n\nfunction styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n\nfunction propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nvar selection_property = function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n};\n\nfunction classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nvar selection_classed = function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n};\n\nfunction textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nvar selection_text = function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n};\n\nfunction htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nvar selection_html = function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n};\n\nfunction raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nvar selection_raise = function() {\n return this.each(raise);\n};\n\nfunction lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nvar selection_lower = function() {\n return this.each(lower);\n};\n\nvar selection_append = function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n};\n\nfunction constantNull() {\n return null;\n}\n\nvar selection_insert = function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n};\n\nfunction remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nvar selection_remove = function() {\n return this.each(remove);\n};\n\nvar selection_datum = function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n};\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nvar selection_dispatch = function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n};\n\nvar root = [null];\n\nfunction Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n merge: selection_merge,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch\n};\n\nvar select = function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n};\n\nvar selectAll = function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : selector], root);\n};\n\nvar touch = function(node, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n\n for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return point(node, touch);\n }\n }\n\n return null;\n};\n\nvar touches = function(node, touches) {\n if (touches == null) touches = sourceEvent().touches;\n\n for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\n points[i] = point(node, touches[i]);\n }\n\n return points;\n};\n\nexports.creator = creator;\nexports.local = local;\nexports.matcher = matcher$1;\nexports.mouse = mouse;\nexports.namespace = namespace;\nexports.namespaces = namespaces;\nexports.select = select;\nexports.selectAll = selectAll;\nexports.selection = selection;\nexports.selector = selector;\nexports.selectorAll = selectorAll;\nexports.style = styleValue;\nexports.touch = touch;\nexports.touches = touches;\nexports.window = defaultView;\nexports.customEvent = customEvent;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-selection/build/d3-selection.js\n// module id = 13\n// module chunks = 0","// https://d3js.org/d3-transition/ Version 1.1.0. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));\n}(this, (function (exports,d3Selection,d3Dispatch,d3Timer,d3Interpolate,d3Color,d3Ease) { 'use strict';\n\nvar emptyOn = d3Dispatch.dispatch(\"start\", \"end\", \"interrupt\");\nvar emptyTween = [];\n\nvar CREATED = 0;\nvar SCHEDULED = 1;\nvar STARTING = 2;\nvar STARTED = 3;\nvar RUNNING = 4;\nvar ENDING = 5;\nvar ENDED = 6;\n\nvar schedule = function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n};\n\nfunction init(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error(\"too late\");\n return schedule;\n}\n\nfunction set(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error(\"too late\");\n return schedule;\n}\n\nfunction get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"too late\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = d3Timer.timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return d3Timer.timeout(start);\n\n // Interrupt the active transition, if any.\n // Dispatch the interrupt event.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions. No interrupt event is dispatched\n // because the cancelled transitions never started. Note that this also\n // removes this transition from the pending list!\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n d3Timer.timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(null, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n\nvar interrupt = function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n if (active) schedule.on.call(\"interrupt\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n};\n\nvar selection_interrupt = function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n};\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nvar transition_tween = function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n};\n\nfunction tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n\nvar interpolate = function(a, b) {\n var c;\n return (typeof b === \"number\" ? d3Interpolate.interpolateNumber\n : b instanceof d3Color.color ? d3Interpolate.interpolateRgb\n : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb)\n : d3Interpolate.interpolateString)(a, b);\n};\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate$$1, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate$$1, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate$$1, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttribute(name);\n value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate$$1, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n };\n}\n\nvar transition_attr = function(name, value) {\n var fullname = d3Selection.namespace(name), i = fullname === \"transform\" ? d3Interpolate.interpolateTransformSvg : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + \"\"));\n};\n\nfunction attrTweenNS(fullname, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttributeNS(fullname.space, fullname.local, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttribute(name, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nvar transition_attrTween = function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = d3Selection.namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n};\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nvar transition_delay = function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n};\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nvar transition_duration = function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n};\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nvar transition_ease = function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n};\n\nvar transition_filter = function(match) {\n if (typeof match !== \"function\") match = d3Selection.matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n};\n\nvar transition_merge = function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n};\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nvar transition_on = function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n};\n\nfunction removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nvar transition_remove = function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n};\n\nvar transition_select = function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = d3Selection.selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n};\n\nvar transition_selectAll = function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = d3Selection.selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n};\n\nvar Selection = d3Selection.selection.prototype.constructor;\n\nvar transition_selection = function() {\n return new Selection(this._groups, this._parents);\n};\n\nfunction styleRemove(name, interpolate$$1) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = d3Selection.style(this, name),\n value1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n };\n}\n\nfunction styleRemoveEnd(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate$$1, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = d3Selection.style(this, name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate$$1, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = d3Selection.style(this, name),\n value1 = value(this);\n if (value1 == null) value1 = (this.style.removeProperty(name), d3Selection.style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);\n };\n}\n\nvar transition_style = function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? d3Interpolate.interpolateTransformCss : interpolate;\n return value == null ? this\n .styleTween(name, styleRemove(name, i))\n .on(\"end.style.\" + name, styleRemoveEnd(name))\n : this.styleTween(name, typeof value === \"function\"\n ? styleFunction(name, i, tweenValue(this, \"style.\" + name, value))\n : styleConstant(name, i, value + \"\"), priority);\n};\n\nfunction styleTween(name, value, priority) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.style.setProperty(name, i(t), priority);\n };\n }\n tween._value = value;\n return tween;\n}\n\nvar transition_styleTween = function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n};\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nvar transition_text = function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n};\n\nvar transition_transition = function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n};\n\nvar id = 0;\n\nfunction Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nfunction transition(name) {\n return d3Selection.selection().transition(name);\n}\n\nfunction newId() {\n return ++id;\n}\n\nvar selection_prototype = d3Selection.selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease\n};\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: d3Ease.easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n return defaultTiming.time = d3Timer.now(), defaultTiming;\n }\n }\n return timing;\n}\n\nvar selection_transition = function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n};\n\nd3Selection.selection.prototype.interrupt = selection_interrupt;\nd3Selection.selection.prototype.transition = selection_transition;\n\nvar root = [null];\n\nvar active = function(node, name) {\n var schedules = node.__transition,\n schedule,\n i;\n\n if (schedules) {\n name = name == null ? null : name + \"\";\n for (i in schedules) {\n if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\n return new Transition([[node]], root, name, +i);\n }\n }\n }\n\n return null;\n};\n\nexports.transition = transition;\nexports.active = active;\nexports.interrupt = interrupt;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-transition/build/d3-transition.js\n// module id = 14\n// module chunks = 0","// https://d3js.org/d3-timer/ Version 1.0.6. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar frame = 0;\nvar timeout = 0;\nvar interval = 0;\nvar pokeDelay = 1000;\nvar taskHead;\nvar taskTail;\nvar clockLast = 0;\nvar clockNow = 0;\nvar clockSkew = 0;\nvar clock = typeof performance === \"object\" && performance.now ? performance : Date;\nvar setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nfunction now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nfunction Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nfunction timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nfunction timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow;\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, delay);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clockNow, interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n\nvar timeout$1 = function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(function(elapsed) {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n};\n\nvar interval$1 = function(callback, delay, time) {\n var t = new Timer, total = delay;\n if (delay == null) return t.restart(callback, delay, time), t;\n delay = +delay, time = time == null ? now() : +time;\n t.restart(function tick(elapsed) {\n elapsed += total;\n t.restart(tick, total += delay, time);\n callback(elapsed);\n }, delay, time);\n return t;\n};\n\nexports.now = now;\nexports.timer = timer;\nexports.timerFlush = timerFlush;\nexports.timeout = timeout$1;\nexports.interval = interval$1;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-timer/build/d3-timer.js\n// module id = 15\n// module chunks = 0","define(function(require) {\n\n const d3Selection = require('d3-selection');\n\n const wrapConfig = {\n lineHeight: 1.2,\n smallTextOffset: 10,\n smallTextLineHeightRatio: 0.9,\n smallTextRatio: 0.6,\n valueClassName: 'value',\n labelClassName: 'label'\n };\n\n const defaultTextSize = 12;\n const defaultFontFace = 'Arial';\n\n /**\n * Wraps a selection of text within the available width\n * @param {Number} xOffset X axis offset for the text\n * @param {Number} fontSize Size of the base font\n * @param {Number} availableWidth Width of the container where the text needs to wrap on\n * @param {D3Selection} node SVG text element that contains the text to wrap\n *\n * REF: http://bl.ocks.org/mbostock/7555321\n * More discussions on https://github.com/mbostock/d3/issues/1642\n * @return {void}\n */\n const wrapText = function(xOffset, fontSize, availableWidth, node) {\n let text = d3Selection.select(node),\n words = text.text().split(/\\s+/).reverse(),\n word,\n line = [],\n lineNumber = 0,\n smallLineHeight = wrapConfig.lineHeight * wrapConfig.smallTextLineHeightRatio,\n y = text.attr('y'),\n dy = parseFloat(text.attr('dy')),\n smallFontSize = fontSize * wrapConfig.smallTextRatio,\n tspan = text.text(null).append('tspan')\n .attr('x', xOffset)\n .attr('y', y - 5)\n .attr('dy', dy + 'em')\n .classed(wrapConfig.valueClassName, true)\n .style('font-size', fontSize + 'px');\n\n tspan.text(words.pop());\n tspan = text.append('tspan')\n .classed(wrapConfig.labelClassName, true)\n .attr('x', xOffset)\n .attr('y', y + wrapConfig.smallTextOffset)\n .attr('dy', ++lineNumber * smallLineHeight + dy + 'em')\n .style('font-size', smallFontSize + 'px');\n\n while (word = words.pop()) {\n line.push(word);\n tspan.text(line.join(' '));\n if (tspan.node().getComputedTextLength() > availableWidth - 50) {\n line.pop();\n tspan.text(line.join(' '));\n line = [word];\n tspan = text.append('tspan')\n .classed(wrapConfig.labelClassName, true)\n .attr('x', xOffset)\n .attr('y', y+ wrapConfig.smallTextOffset)\n .attr('dy', ++lineNumber * smallLineHeight + dy + 'em')\n .text(word)\n .style('font-size', smallFontSize + 'px');\n }\n }\n };\n\n /**\n * Wraps a selection of text within the available width, also adds class .adjust-upwards\n * to configure a y offset for entries with multiple rows\n * @param {D3Sekectuib} text d3 text element\n * @param {Number} width Width of the container where the text needs to wrap on\n * @param {Number} xpos number passed to determine the x offset\n * @param {Number} limit number of lines before an ellipses is added and the rest of the text is cut off\n *\n * REF: http://bl.ocks.org/mbostock/7555321\n * More discussions on https://github.com/mbostock/d3/issues/1642\n * @return {void}\n */\n const wrapTextWithEllipses = function(text, width, xpos=0, limit=2) {\n\n text.each(function() {\n var words,\n word,\n line,\n lineNumber,\n lineHeight,\n y,\n dy,\n tspan;\n\n text = d3Selection.select(this);\n\n words = text.text().split(/\\s+/).reverse();\n line = [];\n lineNumber = 0;\n lineHeight = 1.2;\n y = text.attr('y');\n dy = parseFloat(text.attr('dy'));\n tspan = text\n .text(null)\n .append('tspan')\n .attr('x', xpos)\n .attr('y', y)\n .attr('dy', dy + 'em');\n\n while ((word = words.pop())) {\n line.push(word);\n tspan.text(line.join(' '));\n\n if (tspan.node().getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(' '));\n\n if (lineNumber < limit - 1) {\n line = [word];\n tspan = text.append('tspan')\n .attr('x', xpos)\n .attr('y', y)\n .attr('dy', ++lineNumber * lineHeight + dy + 'em')\n .text(word);\n // if we need two lines for the text, move them both up to center them\n text.classed('adjust-upwards', true);\n } else {\n line.push('...');\n tspan.text(line.join(' '));\n break;\n }\n }\n }\n });\n };\n\n /**\n * Figures out an approximate of the text width by using a canvas element\n * This avoids having to actually render the text to measure it from the DOM itself\n * @param {String} text Text to measure\n * @param {Number} fontSize Fontsize (or default)\n * @param {String} fontFace Font familty (or default)\n * @return {String} Approximate font size of the text\n */\n const getTextWidth = function(text, fontSize = defaultTextSize, fontFace = defaultFontFace) {\n let a = document.createElement('canvas'),\n b = a.getContext('2d');\n\n b.font = fontSize + 'px ' + fontFace;\n\n return b.measureText(text).width;\n }\n\n return {\n getTextWidth,\n wrapText,\n wrapTextWithEllipses\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/helpers/text.js","define(function(require) {\n 'use strict';\n\n const {colorSchemas} = require('./colors.js');\n const constants = require('./constants.js');\n const serializeWithStyles = require('./serializeWithStyles.js');\n\n let encoder = window.btoa;\n\n if (!encoder) {\n encoder = require('base-64').encode;\n }\n\n // Base64 doesn't work really well with Unicode strings, so we need to use this function\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding\n const b64EncodeUnicode = (str) => {\n return encoder(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {\n return String.fromCharCode('0x' + p1);\n }));\n };\n\n const config = {\n styleClass : 'britechartStyle',\n defaultFilename: 'britechart.png',\n chartBackground: 'white',\n imageSourceBase: 'data:image/svg+xml;base64,',\n titleFontSize: '15px',\n titleFontFamily: '\\'Benton Sans\\', sans-serif',\n titleTopOffset: 30,\n get styleBackgroundString () {\n return ``;\n }\n };\n\n /**\n * Main function to be used as a method by chart instances to export charts to png\n * @param {array} svgs (or an svg element) pass in both chart & legend as array or just chart as svg or in array\n * @param {string} filename [download to be called .png]\n * @param {string} title Title for the image\n */\n function exportChart(d3svg, filename, title) {\n let img = createImage(convertSvgToHtml.call(this, d3svg, title));\n\n img.onload = handleImageLoad.bind(\n img,\n createCanvas(this.width(), this.height()),\n filename\n );\n }\n\n /**\n * adds background styles to raw html\n * @param {string} html raw html\n */\n function addBackground(html) {\n return html.replace('>',`>${config.styleBackgroundString}`);\n }\n\n /**\n * takes d3 svg el, adds proper svg tags, adds inline styles\n * from stylesheets, adds white background and returns string\n * @param {object} d3svg TYPE d3 svg element\n * @return {string} string of passed d3\n */\n function convertSvgToHtml (d3svg, title) {\n if (!d3svg) {\n return;\n }\n\n d3svg.attr('version', 1.1)\n .attr('xmlns', 'http://www.w3.org/2000/svg');\n let serializer = serializeWithStyles.initializeSerializer();\n let html = serializer(d3svg.node());\n\n html = formatHtmlByBrowser(html);\n html = prependTitle.call(this, html, title, parseInt(d3svg.attr('width'), 10));\n html = addBackground(html);\n\n return html;\n }\n\n /**\n * Create Canvas\n * @param {number} width\n * @param {number} height\n * @return {object} TYPE canvas element\n */\n function createCanvas(width, height) {\n let canvas = document.createElement('canvas');\n\n canvas.height = height;\n canvas.width = width;\n\n return canvas;\n }\n\n /**\n * Create Image\n * @param {string} svgHtml string representation of svg el\n * @return {object} TYPE element , src points at svg\n */\n function createImage(svgHtml) {\n let img = new Image();\n\n img.src = `${config.imageSourceBase}${ b64EncodeUnicode(svgHtml) }`;\n\n return img;\n };\n\n /**\n * Draws image on canvas\n * @param {object} image TYPE:el , to be drawn\n * @param {object} canvas TYPE: el , to draw on\n */\n function drawImageOnCanvas(image, canvas) {\n canvas.getContext('2d').drawImage(image, 0, 0);\n\n return canvas;\n }\n\n /**\n * Triggers browser to download image, convert canvas to url,\n * we need to append the link el to the dom before clicking it for Firefox to register\n * point at it and trigger click\n * @param {object} canvas TYPE: el \n * @param {string} filename\n * @param {string} extensionType\n */\n function downloadCanvas(canvas, filename=config.defaultFilename, extensionType='image/png') {\n let url = canvas.toDataURL(extensionType);\n let link = document.createElement('a');\n\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\n * Some browsers need special formatting, we handle that here\n * @param {string} html string of svg html\n * @return {string} string of svg html\n */\n function formatHtmlByBrowser(html) {\n if (navigator.userAgent.search('FireFox') > -1) {\n return html.replace(/url.*"\\)/, `url("#${constants.lineGradientId}");`);\n }\n\n return html;\n }\n\n /**\n * Handles on load event fired by img.onload, this=img\n * @param {object} canvas TYPE: el \n * @param {string} filename\n * @param {object} e\n */\n function handleImageLoad(canvas, filename, e) {\n e.preventDefault();\n\n downloadCanvas(drawImageOnCanvas(this, canvas), filename);\n }\n\n /**\n * if passed, append title to the raw html to appear on graph\n * @param {string} html raw html string\n * @param {string} title title of the graph\n * @param {number} svgWidth width of graph container\n * @return {string} raw html with title prepended\n */\n function prependTitle(html, title, svgWidth) {\n if (!title || !svgWidth) {\n return html;\n }\n let {grey} = colorSchemas;\n \n html = html.replace(/ ${title} {\n if (!noStyleTags[name]) {\n defaultStylesByTagName[name] = computeDefaultStyleByTagName(name);\n }\n });\n\n function computeDefaultStyleByTagName(tagName) {\n let defaultStyle = {},\n element = document.body.appendChild(document.createElement(tagName)),\n computedStyle = window.getComputedStyle(element);\n\n [].forEach.call(computedStyle, (style) => {\n defaultStyle[style] = computedStyle[style];\n });\n document.body.removeChild(element);\n return defaultStyle;\n }\n\n function getDefaultStyleByTagName (tagName) {\n tagName = tagName.toUpperCase();\n if (!defaultStylesByTagName[tagName]) {\n defaultStylesByTagName[tagName] = computeDefaultStyleByTagName(tagName);\n }\n return defaultStylesByTagName[tagName];\n };\n\n function serializeWithStyles(elem) {\n\n let cssTexts = [],\n elements,\n computedStyle,\n defaultStyle,\n result;\n\n if (!elem || elem.nodeType !== Node.ELEMENT_NODE) {\n // 'Error: Object passed in to serializeWithSyles not of nodeType Node.ELEMENT_NODE'\n \n return;\n }\n\n cssTexts = [];\n elements = elem.querySelectorAll('*');\n\n [].forEach.call(elements, (el, i) => {\n if (!noStyleTags[el.tagName]) {\n computedStyle = window.getComputedStyle(el);\n defaultStyle = getDefaultStyleByTagName(el.tagName);\n cssTexts[i] = el.style.cssText;\n [].forEach.call(computedStyle, (cssPropName) => {\n if (computedStyle[cssPropName] !== defaultStyle[cssPropName]) {\n el.style[cssPropName] = computedStyle[cssPropName];\n }\n });\n }\n });\n\n result = elem.outerHTML;\n elements = [].map.call(elements, (el, i) => {\n el.style.cssText = cssTexts[i];\n return el;\n });\n\n return result;\n\n };\n\n return serializeWithStyles;\n }\n }\n})();\n\n\n// WEBPACK FOOTER //\n// ./src/charts/helpers/serializeWithStyles.js","/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code, and use\n\t// it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar InvalidCharacterError = function(message) {\n\t\tthis.message = message;\n\t};\n\tInvalidCharacterError.prototype = new Error;\n\tInvalidCharacterError.prototype.name = 'InvalidCharacterError';\n\n\tvar error = function(message) {\n\t\t// Note: the error messages used throughout this file match those used by\n\t\t// the native `atob`/`btoa` implementation in Chromium.\n\t\tthrow new InvalidCharacterError(message);\n\t};\n\n\tvar TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t// http://whatwg.org/html/common-microsyntaxes.html#space-character\n\tvar REGEX_SPACE_CHARACTERS = /[\\t\\n\\f\\r ]/g;\n\n\t// `decode` is designed to be fully compatible with `atob` as described in the\n\t// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob\n\t// The optimized base64-decoding algorithm used is based on @atk’s excellent\n\t// implementation. https://gist.github.com/atk/1020396\n\tvar decode = function(input) {\n\t\tinput = String(input)\n\t\t\t.replace(REGEX_SPACE_CHARACTERS, '');\n\t\tvar length = input.length;\n\t\tif (length % 4 == 0) {\n\t\t\tinput = input.replace(/==?$/, '');\n\t\t\tlength = input.length;\n\t\t}\n\t\tif (\n\t\t\tlength % 4 == 1 ||\n\t\t\t// http://whatwg.org/C#alphanumeric-ascii-characters\n\t\t\t/[^+a-zA-Z0-9/]/.test(input)\n\t\t) {\n\t\t\terror(\n\t\t\t\t'Invalid character: the string to be decoded is not correctly encoded.'\n\t\t\t);\n\t\t}\n\t\tvar bitCounter = 0;\n\t\tvar bitStorage;\n\t\tvar buffer;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\twhile (++position < length) {\n\t\t\tbuffer = TABLE.indexOf(input.charAt(position));\n\t\t\tbitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;\n\t\t\t// Unless this is the first of a group of 4 characters…\n\t\t\tif (bitCounter++ % 4) {\n\t\t\t\t// …convert the first 8 bits to a single ASCII character.\n\t\t\t\toutput += String.fromCharCode(\n\t\t\t\t\t0xFF & bitStorage >> (-2 * bitCounter & 6)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// `encode` is designed to be fully compatible with `btoa` as described in the\n\t// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa\n\tvar encode = function(input) {\n\t\tinput = String(input);\n\t\tif (/[^\\0-\\xFF]/.test(input)) {\n\t\t\t// Note: no need to special-case astral symbols here, as surrogates are\n\t\t\t// matched, and the input is supposed to only contain ASCII anyway.\n\t\t\terror(\n\t\t\t\t'The string to be encoded contains characters outside of the ' +\n\t\t\t\t'Latin1 range.'\n\t\t\t);\n\t\t}\n\t\tvar padding = input.length % 3;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\tvar a;\n\t\tvar b;\n\t\tvar c;\n\t\tvar d;\n\t\tvar buffer;\n\t\t// Make sure any padding is handled outside of the loop.\n\t\tvar length = input.length - padding;\n\n\t\twhile (++position < length) {\n\t\t\t// Read three bytes, i.e. 24 bits.\n\t\t\ta = input.charCodeAt(position) << 16;\n\t\t\tb = input.charCodeAt(++position) << 8;\n\t\t\tc = input.charCodeAt(++position);\n\t\t\tbuffer = a + b + c;\n\t\t\t// Turn the 24 bits into four chunks of 6 bits each, and append the\n\t\t\t// matching character for each of them to the output.\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 18 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 12 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 6 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer & 0x3F)\n\t\t\t);\n\t\t}\n\n\t\tif (padding == 2) {\n\t\t\ta = input.charCodeAt(position) << 8;\n\t\t\tb = input.charCodeAt(++position);\n\t\t\tbuffer = a + b;\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 10) +\n\t\t\t\tTABLE.charAt((buffer >> 4) & 0x3F) +\n\t\t\t\tTABLE.charAt((buffer << 2) & 0x3F) +\n\t\t\t\t'='\n\t\t\t);\n\t\t} else if (padding == 1) {\n\t\t\tbuffer = input.charCodeAt(position);\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 2) +\n\t\t\t\tTABLE.charAt((buffer << 4) & 0x3F) +\n\t\t\t\t'=='\n\t\t\t);\n\t\t}\n\n\t\treturn output;\n\t};\n\n\tvar base64 = {\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'version': '0.1.0'\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn base64;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = base64;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in base64) {\n\t\t\t\tbase64.hasOwnProperty(key) && (freeExports[key] = base64[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.base64 = base64;\n\t}\n\n}(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/base-64/base64.js\n// module id = 21\n// module chunks = 0","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 22\n// module chunks = 0","define(function(require) {\n 'use strict';\n\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Interpolate = require('d3-interpolate');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n const {exportChart} = require('./helpers/exportChart');\n const textHelper = require('./helpers/text');\n const colorHelper = require('./helpers/colors');\n const {calculatePercent} = require('./helpers/common');\n\n\n /**\n * @typedef DonutChartData\n * @type {Object[]}\n * @property {Number} quantity Quantity of the group (required)\n * @property {Number} percentage Percentage of the total (optional)\n * @property {String} name Name of the group (required)\n * @property {Number} id Identifier for the group required for legend feature (optional)\n *\n * @example\n * [\n * {\n * quantity: 1,\n * percentage: 50,\n * name: 'glittering',\n * id: 1\n * },\n * {\n * quantity: 1,\n * percentage: 50,\n * name: 'luminous',\n * id: 2\n * }\n * ]\n */\n\n /**\n * Reusable Donut Chart API class that renders a\n * simple and configurable donut chart.\n *\n * @module Donut\n * @tutorial donut\n * @requires d3-dispatch, d3-ease, d3-interpolate, d3-scale, d3-shape, d3-selection\n *\n * @example\n * var donutChart = donut();\n *\n * donutChart\n * .externalRadius(500)\n * .internalRadius(200);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(donutChart);\n *\n */\n return function module() {\n let margin = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n width = 300,\n height = 300,\n ease = d3Ease.easeCubicInOut,\n arcTransitionDuration = 750,\n pieDrawingTransitionDuration = 1200,\n pieHoverTransitionDuration = 150,\n radiusHoverOffset = 12,\n paddingAngle = 0,\n data,\n chartWidth, chartHeight,\n externalRadius = 140,\n internalRadius = 45.5,\n legendWidth = externalRadius + internalRadius,\n layout,\n shape,\n slices,\n svg,\n\n isAnimated = false,\n\n highlightedSliceId,\n highlightedSlice,\n hasFixedHighlightedSlice = false,\n\n quantityLabel = 'quantity',\n nameLabel = 'name',\n percentageLabel = 'percentage',\n\n percentageFormat = '.1f',\n\n // colors\n colorScale,\n colorSchema = colorHelper.colorSchemas.britecharts,\n\n // utils\n storeAngle = function(d) {\n this._current = d;\n },\n reduceOuterRadius = d => {\n d.outerRadius = externalRadius - radiusHoverOffset;\n },\n sortComparator = (a, b) => b.quantity - a.quantity,\n sumValues = (data) => data.reduce((total, d) => d.quantity + total, 0),\n\n // extractors\n getQuantity = ({quantity}) => quantity,\n getSliceFill = ({data}) => colorScale(data.name),\n\n // events\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\n /**\n * This function creates the graph using the selection as container\n *\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {DonutChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data) {\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n\n buildLayout();\n buildColorScale();\n buildShape();\n buildSVG(this);\n drawSlices();\n initTooltip();\n\n if (highlightedSliceId) {\n initHighlightSlice();\n }\n });\n }\n\n /**\n * Builds color scale for chart, if any colorSchema was defined\n * @private\n */\n function buildColorScale() {\n if (colorSchema) {\n colorScale = d3Scale.scaleOrdinal().range(colorSchema);\n }\n }\n\n /**\n * Builds containers for the chart, the legend and a wrapper for all of them\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('container-group', true);\n\n container.append('g').classed('chart-group', true);\n container.append('g').classed('legend-group', true);\n }\n\n /**\n * Builds the pie layout that will produce data ready to draw\n * @private\n */\n function buildLayout() {\n layout = d3Shape.pie()\n .padAngle(paddingAngle)\n .value(getQuantity)\n .sort(sortComparator);\n }\n\n /**\n * Builds the shape function\n * @private\n */\n function buildShape() {\n shape = d3Shape.arc()\n .innerRadius(internalRadius)\n .padRadius(externalRadius);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n *\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart donut-chart', true);\n\n buildContainerGroups();\n }\n\n // Updates Container Group position\n svg\n .select('.container-group')\n .attr('transform', `translate(${width / 2}, ${height / 2})`);\n \n // Updates SVG size\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Cleaning data adding the proper format\n * @param {DonutChartData} data Data\n * @private\n */\n function cleanData(data) {\n let cleanData = data.reduce((acc, d) => {\n // Skip data without quantity\n if (!d[quantityLabel]) {\n return acc;\n }\n\n d.quantity = +d[quantityLabel];\n d.name = String(d[nameLabel]);\n d.percentage = d[percentageLabel] || null;\n\n return [...acc, d];\n }, []);\n let totalQuantity = sumValues(cleanData);\n let dataWithPercentages = cleanData.map((d) => {\n d.percentage = String(d.percentage || calculatePercent(d[quantityLabel], totalQuantity, percentageFormat));\n\n return d;\n });\n\n return dataWithPercentages;\n }\n\n /**\n * Cleans any value that could be on the legend text element\n * @private\n */\n function cleanLegend() {\n svg.select('.donut-text').text('');\n }\n\n /**\n * Draws the values on the donut slice inside the text element\n *\n * @param {Object} obj Data object\n * @private\n */\n function drawLegend(obj) {\n if (obj.data) {\n svg.select('.donut-text')\n .text(() => `${obj.data.percentage}% ${ obj.data.name}`)\n .attr('dy', '.2em')\n .attr('text-anchor', 'middle');\n\n svg.select('.donut-text').call(wrapText, legendWidth);\n }\n }\n\n /**\n * Draws the slices of the donut\n * @private\n */\n function drawSlices() {\n // We clean all the previous arcs\n if (slices) {\n svg.selectAll('g.arc').remove();\n }\n\n slices = svg.select('.chart-group')\n .selectAll('g.arc')\n .data(layout(data));\n\n let newSlices = slices.enter()\n .append('g')\n .each(storeAngle)\n .each(reduceOuterRadius)\n .classed('arc', true)\n .append('path');\n \n if (isAnimated) {\n newSlices.merge(slices)\n .attr('fill', getSliceFill)\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n .transition()\n .ease(ease)\n .duration(pieDrawingTransitionDuration)\n .attrTween('d', tweenLoading);\n } else {\n newSlices.merge(slices)\n .attr('fill', getSliceFill)\n .attr('d', shape)\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n }\n \n slices.exit().remove();\n }\n\n /**\n * Checks if the given element id is the same as the highlightedSliceId and returns the\n * element if that's the case\n * @param {DOMElement} options.data Dom element to check\n * @return {DOMElement} Dom element if it has the same id\n */\n function filterHighlightedSlice({data}) {\n if (data.id === highlightedSliceId) {\n return this;\n }\n }\n\n /**\n * Handles a path mouse over\n * @return {void}\n * @private\n */\n function handleMouseOver(el, d, chartWidth, chartHeight) {\n drawLegend(d);\n dispatcher.call('customMouseOver', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n\n if (highlightedSlice && el !== highlightedSlice) {\n tweenGrowth(highlightedSlice, externalRadius - radiusHoverOffset);\n }\n tweenGrowth(el, externalRadius);\n }\n\n /**\n * Handles a path mouse move\n * @return {void}\n * @private\n */\n function handleMouseMove(el, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseMove', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n }\n\n /**\n * Handles a path mouse out\n * @return {void}\n * @private\n */\n function handleMouseOut(el, d, chartWidth, chartHeight) {\n if (highlightedSlice && hasFixedHighlightedSlice) {\n drawLegend(highlightedSlice.__data__);\n } else {\n cleanLegend();\n }\n dispatcher.call('customMouseOut', el, d, d3Selection.mouse(el), [chartWidth, chartHeight]);\n\n if (highlightedSlice && hasFixedHighlightedSlice && el !== highlightedSlice) {\n tweenGrowth(highlightedSlice, externalRadius);\n }\n tweenGrowth(el, externalRadius - radiusHoverOffset, pieHoverTransitionDuration);\n }\n\n /**\n * Find the slice by id and growth it if needed\n * @private\n */\n function initHighlightSlice() {\n highlightedSlice = svg.selectAll('.chart-group .arc path')\n .select(filterHighlightedSlice).node();\n\n if (highlightedSlice) {\n drawLegend(highlightedSlice.__data__);\n tweenGrowth(highlightedSlice, externalRadius, pieDrawingTransitionDuration);\n }\n }\n\n /**\n * Creates the text element that will hold the legend of the chart\n */\n function initTooltip() {\n svg.select('.legend-group')\n .append('text')\n .attr('class', 'donut-text');\n }\n\n /**\n * Stores current angles and interpolates with new angles\n * Check out {@link http://bl.ocks.org/mbostock/1346410| this example}\n *\n * @param {Object} a New data for slice\n * @return {Function} Tweening function for the donut shape\n * @private\n */\n function tweenArc(a) {\n let i = d3Interpolate.interpolate(this._current, a);\n\n this._current = i(0);\n\n return function(t) {\n return shape(i(t));\n };\n }\n\n /**\n * Animate slice with tweens depending on the attributes given\n *\n * @param {DOMElement} slice Slice to growth\n * @param {Number} outerRadius Final outer radius value\n * @param {Number} delay Delay of animation\n * @private\n */\n function tweenGrowth(slice, outerRadius, delay = 0) {\n d3Selection.select(slice)\n .transition()\n .delay(delay)\n .attrTween('d', function(d) {\n let i = d3Interpolate.interpolate(d.outerRadius, outerRadius);\n\n return (t) => {\n d.outerRadius = i(t);\n\n return shape(d);\n };\n });\n }\n\n /**\n * Animation for chart loading\n * Check out {@link http://bl.ocks.org/mbostock/4341574| this example}\n *\n * @param {Object} b Data point\n * @return {Function} Tween function\n * @private\n */\n function tweenLoading(b) {\n let i;\n\n b.innerRadius = 0;\n i = d3Interpolate.interpolate({ startAngle: 0, endAngle: 0}, b);\n\n return function(t) { return shape(i(t)); };\n }\n\n /**\n * Utility function that wraps a text into the given width\n *\n * @param {D3Selection} text Text to write\n * @param {Number} legendWidth Width of the container\n * @private\n */\n function wrapText(text, legendWidth) {\n let fontSize = externalRadius / 5;\n\n textHelper.wrapText.call(null, 0, fontSize, legendWidth, text.node());\n }\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the externalRadius of the chart\n * @param {Number} _x ExternalRadius number to get/set\n * @return { (Number | Module) } Current externalRadius or Donut Chart module to chain calls\n * @public\n */\n exports.externalRadius = function(_x) {\n if (!arguments.length) {\n return externalRadius;\n }\n externalRadius = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the hasFixedHighlightedSlice property of the chart, making it to\n * highlight the selected slice id set with `highlightSliceById` all the time.\n *\n * @param {Boolean} _x If we want to make the highlighted slice permanently highlighted\n * @return { hasFixedHighlightedSlice | module} Current hasFixedHighlightedSlice flag or Chart module\n * @public\n */\n exports.hasFixedHighlightedSlice = function(_x) {\n if (!arguments.length) {\n return hasFixedHighlightedSlice;\n }\n hasFixedHighlightedSlice = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { (Number | Module) } Current height or Donut Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the internalRadius of the chart\n * @param {Number} _x InternalRadius number to get/set\n * @return { (Number | Module) } Current internalRadius or Donut Chart module to chain calls\n * @public\n */\n exports.internalRadius = function(_x) {\n if (!arguments.length) {\n return internalRadius;\n }\n internalRadius = _x;\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { (Number | Module) } Current margin or Donut Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return { (Number | Module) } Current width or Donut Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n\n /**\n * Gets or Sets the id of the slice to highlight\n * @param {Number} _x Slice id\n * @return { (Number | Module) } Current highlighted slice id or Donut Chart module to chain calls\n * @public\n */\n exports.highlightSliceById = function(_x) {\n if (!arguments.length) {\n return highlightedSliceId;\n }\n highlightedSliceId = _x;\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n return exports;\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/donut.js","// https://d3js.org/d3-shape/ Version 1.2.0. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3));\n}(this, (function (exports,d3Path) { 'use strict';\n\nvar constant = function(x) {\n return function constant() {\n return x;\n };\n};\n\nvar abs = Math.abs;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar max = Math.max;\nvar min = Math.min;\nvar sin = Math.sin;\nvar sqrt = Math.sqrt;\n\nvar epsilon = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar tau = 2 * pi;\n\nfunction acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nfunction asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nvar arc = function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = d3Path.path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00);\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi) {\n var oc = da0 > epsilon ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],\n ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n};\n\nfunction Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nvar curveLinear = function(context) {\n return new Linear(context);\n};\n\nfunction x(p) {\n return p[0];\n}\n\nfunction y(p) {\n return p[1];\n}\n\nvar line = function() {\n var x$$1 = x,\n y$$1 = y,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function line(data) {\n var i,\n n = data.length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = d3Path.path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x$$1 = typeof _ === \"function\" ? _ : constant(+_), line) : x$$1;\n };\n\n line.y = function(_) {\n return arguments.length ? (y$$1 = typeof _ === \"function\" ? _ : constant(+_), line) : y$$1;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n};\n\nvar area = function() {\n var x0 = x,\n x1 = null,\n y0 = constant(0),\n y1 = y,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function area(data) {\n var i,\n j,\n k,\n n = data.length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = d3Path.path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n};\n\nvar descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n};\n\nvar identity = function(d) {\n return d;\n};\n\nvar pie = function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = data.length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n};\n\nvar curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nfunction curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n\nfunction lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nvar lineRadial$1 = function() {\n return lineRadial(line().curve(curveRadialLinear));\n};\n\nvar areaRadial = function() {\n var a = area().curve(curveRadialLinear),\n c = a.curve,\n x0 = a.lineX0,\n x1 = a.lineX1,\n y0 = a.lineY0,\n y1 = a.lineY1;\n\n a.angle = a.x, delete a.x;\n a.startAngle = a.x0, delete a.x0;\n a.endAngle = a.x1, delete a.x1;\n a.radius = a.y, delete a.y;\n a.innerRadius = a.y0, delete a.y0;\n a.outerRadius = a.y1, delete a.y1;\n a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n\n a.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return a;\n};\n\nvar pointRadial = function(x, y) {\n return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n};\n\nvar slice = Array.prototype.slice;\n\nfunction linkSource(d) {\n return d.source;\n}\n\nfunction linkTarget(d) {\n return d.target;\n}\n\nfunction link(curve) {\n var source = linkSource,\n target = linkTarget,\n x$$1 = x,\n y$$1 = y,\n context = null;\n\n function link() {\n var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n if (!context) context = buffer = d3Path.path();\n curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n link.source = function(_) {\n return arguments.length ? (source = _, link) : source;\n };\n\n link.target = function(_) {\n return arguments.length ? (target = _, link) : target;\n };\n\n link.x = function(_) {\n return arguments.length ? (x$$1 = typeof _ === \"function\" ? _ : constant(+_), link) : x$$1;\n };\n\n link.y = function(_) {\n return arguments.length ? (y$$1 = typeof _ === \"function\" ? _ : constant(+_), link) : y$$1;\n };\n\n link.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\n };\n\n return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction curveRadial$1(context, x0, y0, x1, y1) {\n var p0 = pointRadial(x0, y0),\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n p2 = pointRadial(x1, y0),\n p3 = pointRadial(x1, y1);\n context.moveTo(p0[0], p0[1]);\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nfunction linkHorizontal() {\n return link(curveHorizontal);\n}\n\nfunction linkVertical() {\n return link(curveVertical);\n}\n\nfunction linkRadial() {\n var l = link(curveRadial$1);\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n return l;\n}\n\nvar circle = {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n\nvar cross = {\n draw: function(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n};\n\nvar tan30 = Math.sqrt(1 / 3);\nvar tan30_2 = tan30 * 2;\n\nvar diamond = {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n\nvar ka = 0.89081309152928522810;\nvar kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10);\nvar kx = Math.sin(tau / 10) * kr;\nvar ky = -Math.cos(tau / 10) * kr;\n\nvar star = {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n\nvar square = {\n draw: function(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n};\n\nvar sqrt3 = Math.sqrt(3);\n\nvar triangle = {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n\nvar c = -0.5;\nvar s = Math.sqrt(3) / 2;\nvar k = 1 / Math.sqrt(12);\nvar a = (k / 2 + 1) * 3;\n\nvar wye = {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n\nvar symbols = [\n circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\nvar symbol = function() {\n var type = constant(circle),\n size = constant(64),\n context = null;\n\n function symbol() {\n var buffer;\n if (!context) context = buffer = d3Path.path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n};\n\nvar noop = function() {};\n\nfunction point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nfunction Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nvar basis = function(context) {\n return new Basis(context);\n};\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nvar basisClosed = function(context) {\n return new BasisClosed(context);\n};\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nvar basisOpen = function(context) {\n return new BasisOpen(context);\n};\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nvar bundle = ((function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n}))(0.85);\n\nfunction point$1(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nfunction Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point$1(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point$1(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar cardinal = ((function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n}))(0);\n\nfunction CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point$1(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar cardinalClosed = ((function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n}))(0);\n\nfunction CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point$1(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar cardinalOpen = ((function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n}))(0);\n\nfunction point$2(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point$2(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar catmullRom = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n}))(0.5);\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point$2(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar catmullRomClosed = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n}))(0.5);\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point$2(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nvar catmullRomOpen = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n}))(0.5);\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nvar linearClosed = function(context) {\n return new LinearClosed(context);\n};\n\nfunction sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point$3(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point$3(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point$3(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n};\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nfunction monotoneX(context) {\n return new MonotoneX(context);\n}\n\nfunction monotoneY(context) {\n return new MonotoneY(context);\n}\n\nfunction Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nvar natural = function(context) {\n return new Natural(context);\n};\n\nfunction Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nvar step = function(context) {\n return new Step(context, 0.5);\n};\n\nfunction stepBefore(context) {\n return new Step(context, 0);\n}\n\nfunction stepAfter(context) {\n return new Step(context, 1);\n}\n\nvar none = function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n};\n\nvar none$1 = function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n};\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nvar stack = function() {\n var keys = constant([]),\n order = none$1,\n offset = none,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? none$1 : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? none : _, stack) : offset;\n };\n\n return stack;\n};\n\nvar expand = function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n }\n none(series, order);\n};\n\nvar diverging = function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = yp;\n }\n }\n }\n};\n\nvar silhouette = function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n};\n\nvar wiggle = function(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n};\n\nvar ascending = function(series) {\n var sums = series.map(sum);\n return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; });\n};\n\nfunction sum(series) {\n var s = 0, i = -1, n = series.length, v;\n while (++i < n) if (v = +series[i][1]) s += v;\n return s;\n}\n\nvar descending$1 = function(series) {\n return ascending(series).reverse();\n};\n\nvar insideOut = function(series) {\n var n = series.length,\n i,\n j,\n sums = series.map(sum),\n order = none$1(series).sort(function(a, b) { return sums[b] - sums[a]; }),\n top = 0,\n bottom = 0,\n tops = [],\n bottoms = [];\n\n for (i = 0; i < n; ++i) {\n j = order[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n\n return bottoms.reverse().concat(tops);\n};\n\nvar reverse = function(series) {\n return none$1(series).reverse();\n};\n\nexports.arc = arc;\nexports.area = area;\nexports.line = line;\nexports.pie = pie;\nexports.areaRadial = areaRadial;\nexports.radialArea = areaRadial;\nexports.lineRadial = lineRadial$1;\nexports.radialLine = lineRadial$1;\nexports.pointRadial = pointRadial;\nexports.linkHorizontal = linkHorizontal;\nexports.linkVertical = linkVertical;\nexports.linkRadial = linkRadial;\nexports.symbol = symbol;\nexports.symbols = symbols;\nexports.symbolCircle = circle;\nexports.symbolCross = cross;\nexports.symbolDiamond = diamond;\nexports.symbolSquare = square;\nexports.symbolStar = star;\nexports.symbolTriangle = triangle;\nexports.symbolWye = wye;\nexports.curveBasisClosed = basisClosed;\nexports.curveBasisOpen = basisOpen;\nexports.curveBasis = basis;\nexports.curveBundle = bundle;\nexports.curveCardinalClosed = cardinalClosed;\nexports.curveCardinalOpen = cardinalOpen;\nexports.curveCardinal = cardinal;\nexports.curveCatmullRomClosed = catmullRomClosed;\nexports.curveCatmullRomOpen = catmullRomOpen;\nexports.curveCatmullRom = catmullRom;\nexports.curveLinearClosed = linearClosed;\nexports.curveLinear = curveLinear;\nexports.curveMonotoneX = monotoneX;\nexports.curveMonotoneY = monotoneY;\nexports.curveNatural = natural;\nexports.curveStep = step;\nexports.curveStepAfter = stepAfter;\nexports.curveStepBefore = stepBefore;\nexports.stack = stack;\nexports.stackOffsetExpand = expand;\nexports.stackOffsetDiverging = diverging;\nexports.stackOffsetNone = none;\nexports.stackOffsetSilhouette = silhouette;\nexports.stackOffsetWiggle = wiggle;\nexports.stackOrderAscending = ascending;\nexports.stackOrderDescending = descending$1;\nexports.stackOrderInsideOut = insideOut;\nexports.stackOrderNone = none$1;\nexports.stackOrderReverse = reverse;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-shape/build/d3-shape.js\n// module id = 24\n// module chunks = 0","// https://d3js.org/d3-path/ Version 1.0.5. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.d3 = global.d3 || {})));\n}(this, (function (exports) { 'use strict';\n\nvar pi = Math.PI;\nvar tau = 2 * pi;\nvar epsilon = 1e-6;\nvar tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon)) {}\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexports.path = path;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-path/build/d3-path.js\n// module id = 25\n// module chunks = 0","define(function(require) {\n 'use strict';\n\n const d3Format = require('d3-format');\n\n /**\n * Calculates percentage of value from total\n * @param {Number} value Value to check\n * @param {Number} total Sum of values\n * @param {String} decimals Specifies number of decimals https://github.com/d3/d3-format\n * @return {String} Percentage\n */\n function calculatePercent(value, total, decimals) {\n return d3Format.format(decimals)(value / total * 100);\n }\n\n /**\n * Checks if a number is an integer of has decimal values\n * @param {Number} value Value to check\n * @return {Boolean} If it is an iteger\n */\n function isInteger(value) {\n return value % 1 === 0;\n }\n\n return {\n calculatePercent,\n isInteger\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/helpers/common.js","define(function(require){\n 'use strict';\n\n const d3Format = require('d3-format');\n const d3Scale = require('d3-scale');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n const textHelper = require('./helpers/text');\n const colorHelper = require('./helpers/colors');\n\n /**\n * @typedef LegendChartData\n * @type {Object[]}\n * @property {Number} id Id of the group (required)\n * @property {Number} quantity Quantity of the group (required)\n * @property {String} name Name of the group (required)\n *\n * @example\n * [\n * {\n * id: 1,\n * quantity: 2,\n * name: 'glittering'\n * },\n * {\n * id: 2,\n * quantity: 3,\n * name: 'luminous'\n * }\n */\n\n\n /**\n * @fileOverview Legend Component reusable API class that renders a\n * simple and configurable legend element.\n *\n * @example\n * var donutChart = donut(),\n * legendBox = legend();\n *\n * donutChart\n * .externalRadius(500)\n * .internalRadius(200)\n * .on('customMouseOver', function(data) {\n * legendBox.highlight(data.data.id);\n * })\n * .on('customMouseOut', function() {\n * legendBox.clearHighlight();\n * });\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(donutChart);\n *\n * d3Selection.select('.other-css-selector')\n * .datum(dataset)\n * .call(legendBox);\n *\n * @module Legend\n * @tutorial legend\n * @exports charts/legend\n * @requires d3\n */\n return function module() {\n\n let margin = {\n top: 5,\n right: 5,\n bottom: 5,\n left: 5\n },\n width = 320,\n height = 180,\n\n textSize = 12,\n textLetterSpacing = 0.5,\n\n markerSize = 16,\n markerYOffset = - (textSize - 2) / 2,\n marginRatio = 1.5,\n\n valueReservedSpace = 40,\n numberLetterSpacing = 0.8,\n numberFormat = 's',\n\n isFadedClassName = 'is-faded',\n isHorizontal = false,\n\n // colors\n colorScale,\n colorSchema = colorHelper.colorSchemas.britecharts,\n\n getId = ({id}) => id,\n getName = ({name}) => name,\n getFormattedQuantity = ({quantity}) => d3Format.format(numberFormat)(quantity),\n getCircleFill = ({name}) => colorScale(name),\n\n entries,\n chartWidth, chartHeight,\n data,\n svg;\n\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {object} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = _data;\n\n buildColorScale();\n buildSVG(this);\n if (isHorizontal) {\n drawHorizontalLegend();\n } else {\n drawVerticalLegend();\n }\n });\n }\n\n /**\n * Depending on the size of the horizontal legend, we are going to either\n * center the legend or add a new line with the last entry of the legend\n * @return {void}\n */\n function adjustLines() {\n let lineWidth = svg.select('.legend-line').node().getBoundingClientRect().width;\n let lineWidthSpace = chartWidth - lineWidth;\n\n if (lineWidthSpace > 0) {\n centerLegendOnSVG();\n } else {\n splitInLines();\n }\n }\n\n /**\n * Builds containers for the legend\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('legend-container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g')\n .classed('legend-group', true);\n }\n\n /**\n * Builds color scale for chart, if any colorSchema was defined\n * @private\n */\n function buildColorScale() {\n if (colorSchema) {\n colorScale = d3Scale.scaleOrdinal().range(colorSchema);\n }\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart britechart-legend', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Centers the legend on the chart given that is a single line of labels\n * @return {void}\n */\n function centerLegendOnSVG() {\n let legendGroupSize = svg.select('g.legend-container-group').node().getBoundingClientRect().width;\n let emptySpace = width - legendGroupSize;\n\n if (emptySpace > 0) {\n svg.select('g.legend-container-group')\n .attr('transform', `translate(${emptySpace/2},0)`)\n }\n }\n\n /**\n * Removes the faded class from all the entry lines\n */\n function cleanFadedLines() {\n svg.select('.legend-group')\n .selectAll('g.legend-entry')\n .classed(isFadedClassName, false);\n }\n\n /**\n * Draws the entries of the legend within a single line\n * @private\n */\n function drawHorizontalLegend() {\n let xOffset = markerSize;\n\n // We want a single line\n svg.select('.legend-group')\n .append('g')\n .classed('legend-line', true);\n\n // And one entry per data item\n entries = svg.select('.legend-line')\n .selectAll('g.legend-entry')\n .data(data);\n\n // Enter\n entries.enter()\n .append('g')\n .classed('legend-entry', true)\n .attr('data-item', getId)\n .attr('transform', function({name}) {\n let horizontalOffset = xOffset,\n lineHeight = chartHeight / 2,\n verticalOffset = lineHeight,\n labelWidth = textHelper.getTextWidth(name, textSize);\n\n xOffset += markerSize + 2 * getLineElementMargin() + labelWidth;\n\n return `translate(${horizontalOffset},${verticalOffset})`;\n })\n .merge(entries)\n .append('circle')\n .classed('legend-circle', true)\n .attr('cx', markerSize/2)\n .attr('cy', markerYOffset)\n .attr('r', markerSize / 2)\n .style('fill', getCircleFill)\n .style('stroke-width', 1);\n\n svg.select('.legend-group')\n .selectAll('g.legend-entry')\n .append('text')\n .classed('legend-entry-name', true)\n .text(getName)\n .attr('x', getLineElementMargin())\n .style('font-size', `${textSize}px`)\n .style('letter-spacing', `${textLetterSpacing}px`);\n\n // Exit\n svg.select('.legend-group')\n .selectAll('g.legend-entry')\n .exit()\n .transition()\n .style('opacity', 0)\n .remove();\n\n adjustLines();\n }\n\n /**\n * Draws the entries of the legend\n * @private\n */\n function drawVerticalLegend() {\n entries = svg.select('.legend-group')\n .selectAll('g.legend-line')\n .data(data);\n\n // Enter\n entries.enter()\n .append('g')\n .classed('legend-line', true)\n .append('g')\n .classed('legend-entry', true)\n .attr('data-item', getId)\n .attr('transform', function(d, i) {\n let horizontalOffset = markerSize + getLineElementMargin(),\n lineHeight = chartHeight/ (data.length + 1),\n verticalOffset = (i + 1) * lineHeight;\n\n return `translate(${horizontalOffset},${verticalOffset})`;\n })\n .merge(entries)\n .append('circle')\n .classed('legend-circle', true)\n .attr('cx', markerSize/2)\n .attr('cy', markerYOffset)\n .attr('r', markerSize/2 )\n .style('fill', getCircleFill)\n .style('stroke-width', 1);\n\n svg.select('.legend-group')\n .selectAll('g.legend-line')\n .selectAll('g.legend-entry')\n .append('text')\n .classed('legend-entry-name', true)\n .text(getName)\n .attr('x', getLineElementMargin())\n .style('font-size', `${textSize}px`)\n .style('letter-spacing', `${textLetterSpacing}px`);\n\n svg.select('.legend-group')\n .selectAll('g.legend-line')\n .selectAll('g.legend-entry')\n .append('text')\n .classed('legend-entry-value', true)\n .text(getFormattedQuantity)\n .attr('x', chartWidth - valueReservedSpace)\n .style('font-size', `${textSize}px`)\n .style('letter-spacing', `${numberLetterSpacing}px`)\n .style('text-anchor', 'end')\n .style('startOffset', '100%');\n\n // Exit\n svg.select('.legend-group')\n .selectAll('g.legend-line')\n .exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Applies the faded class to all lines but the one that has the given id\n * @param {number} exceptionItemId Id of the line that needs to stay the same\n */\n function fadeLinesBut(exceptionItemId) {\n let classToFade = 'g.legend-entry';\n\n svg.select('.legend-group')\n .selectAll(classToFade)\n .classed(isFadedClassName, true);\n\n svg.select(`[data-item=\"${exceptionItemId}\"]`)\n .classed(isFadedClassName, false);\n }\n\n /**\n * Calculates the margin between elements of the legend\n * @return {Number} Margin to apply between elements\n */\n function getLineElementMargin() {\n return marginRatio * markerSize;\n }\n\n /**\n * Simple method to move the last item of an overflowing legend into the next line\n * @return {void}\n * @private\n */\n function splitInLines() {\n let legendEntries = svg.selectAll('.legend-entry');\n let numberOfEntries = legendEntries.size();\n let lineHeight = (chartHeight / 2) * 1.7;\n let newLine = svg.select('.legend-group')\n .append('g')\n .classed('legend-line', true)\n .attr('transform', `translate(0, ${lineHeight})`);\n let lastEntry = legendEntries.filter(`:nth-child(${numberOfEntries})`);\n\n lastEntry.attr('transform', `translate(${markerSize},0)`);\n newLine.append(() => lastEntry.node());\n }\n\n /**\n * Clears the highlighted line entry\n */\n exports.clearHighlight = function() {\n cleanFadedLines();\n };\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {array} _x Color scheme array to get/set\n * @return {number | module} Current colorSchema or Donut Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the legend chart\n * @param {number} _x Desired width for the chart\n * @return {height | module} Current height or Legend module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Highlights a line entry by fading the rest of lines\n * @param {number} entryId ID of the entry line\n */\n exports.highlight = function(entryId) {\n cleanFadedLines();\n fadeLinesBut(entryId);\n };\n\n /**\n * Gets or Sets the horizontal mode on the legend\n * @param {boolean} _x Desired horizontal mode for the graph\n * @return {ishorizontal | module} If it is horizontal or Legend module to chain calls\n * @public\n */\n exports.isHorizontal = function(_x) {\n if (!arguments.length) {\n return isHorizontal;\n }\n isHorizontal = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the legend chart\n * @param {object} _x Margin object to get/set\n * @return {margin | module} Current margin or Legend module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the markerSize of the legend chart.\n * This markerSize will determine the horizontal and vertical size of the colored marks\n * added as color identifiers for the chart's categories.\n *\n * @param {object} _x Margin object to get/set\n * @return {markerSize | module} Current markerSize or Legend module to chain calls\n * @public\n */\n exports.markerSize = function(_x) {\n if (!arguments.length) {\n return markerSize;\n }\n markerSize = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the legend chart\n * @param {number} _x Desired width for the graph\n * @return {width | module} Current width or Legend module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number format of the legend chart\n * @param {string} _x Desired number format for the legend chart\n * @return {numberFormat | module} Current number format or Legend module to chain calls\n * @public\n */\n exports.numberFormat = function(_x) {\n if (!arguments.length) {\n return numberFormat;\n }\n numberFormat = _x;\n\n return this;\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/legend.js","define(function(require){\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Collection = require('d3-collection');\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n const d3TimeFormat = require('d3-time-format');\n\n const {exportChart} = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n const {isInteger} = require('./helpers/common');\n const {\n getXAxisSettings,\n getLocaleDateFormatter\n } = require('./helpers/timeAxis');\n\n const {\n axisTimeCombinations,\n lineGradientId\n } = require('./helpers/constants');\n\n const {\n formatIntegerValue,\n formatDecimalValue,\n } = require('./helpers/formatHelpers');\n /**\n * @typedef D3Selection\n * @type {Array[]}\n * @property {Number} length Size of the selection\n * @property {DOMElement} parentNode Parent of the selection\n */\n\n /**\n * @typedef lineChartDataByTopic\n * @type {Object}\n * @property {String} topicName Topic name (required)\n * @property {Number} topic Topic identifier (required)\n * @property {Object[]} dates All date entries with values for that topic (required)\n *\n * @example\n * {\n * topicName: 'San Francisco',\n * topic: 123,\n * dates: [\n * {\n * date: '2017-01-16T16:00:00-08:00',\n * value: 1\n * },\n * {\n * date: '2017-01-16T17:00:00-08:00',\n * value: 2\n * }\n * ]\n * }\n */\n\n /**\n * @typedef LineChartData\n * @type {Object[]}\n * @property {lineChartDataByTopic[]} dataByTopic Data values to chart (required)\n *\n * @example\n * {\n * dataByTopic: [\n * {\n * topicName: 'San Francisco',\n * topic: 123,\n * dates: [\n * {\n * date: '2017-01-16T16:00:00-08:00',\n * value: 1\n * },\n * {\n * date: '2017-01-16T17:00:00-08:00',\n * value: 2\n * }\n * ]\n * },\n * {\n * topicName: 'Other',\n * topic: 345,\n * dates: [\n * {...},\n * {...}\n * ]\n * }\n * ]\n * }\n */\n\n /**\n * Line Chart reusable API module that allows us\n * rendering a multi line and configurable chart.\n *\n * @module Line\n * @tutorial line\n * @requires d3-array, d3-axis, d3-brush, d3-ease, d3-format, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n *\n * @example\n * let lineChart = line();\n *\n * lineChart\n * .aspectRatio(0.5)\n * .width(500);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(lineChart);\n *\n */\n return function line() {\n\n let margin = {\n top: 60,\n right: 30,\n bottom: 40,\n left: 70\n },\n width = 960,\n height = 500,\n aspectRatio = null,\n tooltipThreshold = 480,\n svg,\n paths,\n chartWidth, chartHeight,\n xScale, yScale, colorScale,\n xAxis, xMonthAxis, yAxis,\n xAxisPadding = {\n top: 0,\n left: 15,\n bottom: 0,\n right: 0\n },\n monthAxisPadding = 28,\n tickPadding = 5,\n colorSchema = colorHelper.colorSchemas.britecharts,\n singleLineGradientColors = colorHelper.colorGradients.greenBlue,\n topicColorMap,\n\n xAxisFormat = null,\n xTicks = null,\n xAxisCustomFormat = null,\n locale,\n\n isAnimated = false,\n ease = d3Ease.easeQuadInOut,\n animationDuration = 1500,\n maskingRectangle,\n\n lineCurve = 'linear',\n curveMap = {\n linear: d3Shape.curveLinear,\n basis: d3Shape.curveBasis,\n cardinal: d3Shape.curveCardinal,\n catmullRom: d3Shape.curveCatmullRom,\n monotoneX: d3Shape.curveMonotoneX,\n monotoneY: d3Shape.curveMonotoneY,\n natural: d3Shape.curveNatural,\n step: d3Shape.curveStep,\n stepAfter: d3Shape.curveStepAfter,\n stepBefore: d3Shape.curveStepBefore\n },\n\n dataByTopic,\n dataByDate,\n\n dateLabel = 'date',\n valueLabel = 'value',\n topicLabel = 'topic',\n topicNameLabel = 'topicName',\n\n yTicks = 5,\n\n overlay,\n overlayColor = 'rgba(0, 0, 0, 0)',\n verticalMarkerContainer,\n verticalMarkerLine,\n\n verticalGridLines,\n horizontalGridLines,\n grid = null,\n\n baseLine,\n\n pathYCache = {},\n\n // extractors\n getDate = ({date}) => date,\n getValue = ({value}) => value,\n getTopic = ({topic}) => topic,\n getLineColor = ({topic}) => colorScale(topic),\n\n // events\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\n /**\n * This function creates the graph using the selection and data provided\n *\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {LineChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data) {\n ({\n dataByTopic,\n dataByDate\n } = cleanData(_data));\n\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n\n buildScales();\n buildSVG(this);\n buildAxis();\n drawAxis();\n buildGradient();\n drawLines();\n createMaskingClip();\n\n if (shouldShowTooltip()) {\n drawVerticalMarker();\n drawHoverOverlay();\n addMouseEvents();\n }\n });\n }\n\n /**\n * Adds events to the container group if the environment is not mobile\n * Adding: mouseover, mouseout and mousemove\n */\n function addMouseEvents() {\n svg\n .on('mouseover', function(d) {\n handleMouseOver(this, d);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d);\n });\n }\n\n /**\n * Adjusts the position of the y axis' ticks\n * @param {D3Selection} selection Y axis group\n * @return void\n */\n function adjustYTickLabels(selection) {\n selection.selectAll('.tick text')\n .attr('transform', 'translate(0, -7)');\n }\n\n /**\n * Formats the value depending on its characteristics\n * @param {Number} value Value to format\n * @return {Number} Formatted value\n */\n function getFormattedValue(value) {\n let format;\n\n if (isInteger(value)) {\n format = formatIntegerValue;\n } else {\n format = formatDecimalValue;\n }\n\n return format(value);\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis() {\n let dataTimeSpan = yScale.domain()[1] - yScale.domain()[0];\n let yTickNumber = dataTimeSpan < yTicks - 1 ? dataTimeSpan : yTicks;\n let minor, major;\n\n if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n minor = {\n tick: xTicks,\n format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n };\n major = null;\n } else {\n ({minor, major} = getXAxisSettings(dataByDate, width, xAxisFormat, locale));\n\n xMonthAxis = d3Axis.axisBottom(xScale)\n .ticks(major.tick)\n .tickSize(0, 0)\n .tickFormat(major.format);\n }\n\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(minor.tick)\n .tickSize(10, 0)\n .tickPadding(tickPadding)\n .tickFormat(minor.format);\n\n yAxis = d3Axis.axisLeft(yScale)\n .ticks(yTickNumber)\n .tickSize([0])\n .tickPadding(tickPadding)\n .tickFormat(getFormattedValue);\n\n drawGridLines(minor.tick, yTickNumber);\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * NOTE: The order of drawing of this group elements is really important,\n * as everything else will be drawn on top of them\n * @private\n */\n function buildContainerGroups(){\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g').classed('x-axis-group', true)\n .append('g').classed('axis x', true);\n container.selectAll('.x-axis-group')\n .append('g').classed('month-axis', true);\n container\n .append('g').classed('y-axis-group axis y', true);\n container\n .append('g').classed('grid-lines-group', true);\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Builds the gradient element to be used later\n * @return {void}\n */\n function buildGradient() {\n svg.select('.metadata-group')\n .append('linearGradient')\n .attr('id', lineGradientId)\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n .selectAll('stop')\n .data([\n {offset:'0%', color: singleLineGradientColors[0]},\n {offset:'100%', color: singleLineGradientColors[1]}\n ])\n .enter()\n .append('stop')\n .attr('offset', ({offset}) => offset)\n .attr('stop-color', ({color}) => color)\n }\n\n /**\n * Creates the x and y scales of the graph\n * @private\n */\n function buildScales(){\n let minX = d3Array.min(dataByTopic, ({dates}) => d3Array.min(dates, getDate)),\n maxX = d3Array.max(dataByTopic, ({dates}) => d3Array.max(dates, getDate)),\n maxY = d3Array.max(dataByTopic, ({dates}) => d3Array.max(dates, getValue)),\n minY = d3Array.min(dataByTopic, ({dates}) => d3Array.min(dates, getValue));\n let yScaleBottomValue = Math.abs(minY) < 0 ? Math.abs(minY) : 0;\n\n xScale = d3Scale.scaleTime()\n .domain([minX, maxX])\n .rangeRound([0, chartWidth]);\n\n yScale = d3Scale.scaleLinear()\n .domain([yScaleBottomValue, Math.abs(maxY)])\n .rangeRound([chartHeight, 0])\n .nice();\n\n colorScale = d3Scale.scaleOrdinal()\n .range(colorSchema)\n .domain(dataByTopic.map(getTopic));\n\n let range = colorScale.range();\n\n topicColorMap = colorScale.domain().reduce((memo, item, i) => {\n memo[item] = range[i];\n\n return memo;\n }, {});\n }\n\n /**\n * Builds the SVG element that will contain the chart\n *\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container){\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart line-chart', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Parses dates and values into JS Date objects and numbers\n * @param {obj} dataByTopic Raw data grouped by topic\n * @return {obj} Parsed data with dataByTopic and dataByDate\n */\n function cleanData({dataByTopic, dataByDate}) {\n\n if (dataByTopic) {\n let flatData = [];\n\n dataByTopic.forEach((topic) => {\n topic.dates.forEach((date) => {\n flatData.push({\n topicName: topic[topicNameLabel],\n name: topic[topicLabel],\n date: date[dateLabel],\n value: date[valueLabel]\n });\n });\n });\n\n // Nest data by date and format\n dataByDate = d3Collection.nest()\n .key( getDate )\n .entries(flatData)\n .map((d) => {\n return {\n date: new Date(d.key),\n topics: d.values\n }\n });\n\n // Normalize dates in keys\n dataByDate = dataByDate.map((d) => {\n d.date = new Date(d.date);\n\n return d;\n });\n\n // Normalize dataByTopic\n dataByTopic.forEach(function(kv) {\n kv.dates.forEach(function(d) {\n d.date = new Date(d[dateLabel]);\n d.value = +d[valueLabel];\n });\n });\n\n }\n\n return {dataByTopic, dataByDate};\n }\n\n /**\n * Removes all the datapoints highlighter circles added to the marker container\n * @return void\n */\n function cleanDataPointHighlights(){\n verticalMarkerContainer.selectAll('.circle-container').remove();\n }\n\n /**\n * Creates a masking clip that would help us fake an animation if the\n * proper flag is true\n *\n * @return {void}\n */\n function createMaskingClip() {\n if (isAnimated) {\n // We use a white rectangle to simulate the line drawing animation\n maskingRectangle = svg.append('rect')\n .attr('class', 'masking-rectangle')\n .attr('width', width)\n .attr('height', height)\n .attr('x', 0)\n .attr('y', 0);\n\n maskingRectangle.transition()\n .duration(animationDuration)\n .ease(ease)\n .attr('x', width)\n .on('end', () => maskingRectangle.remove());\n }\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis(){\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate(0, ${chartHeight})`)\n .call(xAxis);\n\n if (xAxisFormat !== 'custom') {\n svg.select('.x-axis-group .month-axis')\n .attr('transform', `translate(0, ${(chartHeight + monthAxisPadding)})`)\n .call(xMonthAxis);\n }\n\n svg.select('.y-axis-group.axis.y')\n .transition()\n .ease(ease)\n .attr('transform', `translate(${-xAxisPadding.left}, 0)`)\n .call(yAxis)\n .call(adjustYTickLabels);\n }\n\n /**\n * Draws the line elements within the chart group\n * @private\n */\n function drawLines(){\n let lines,\n topicLine;\n\n topicLine = d3Shape.line()\n .curve(curveMap[lineCurve])\n .x(({date}) => xScale(date))\n .y(({value}) => yScale(value));\n\n lines = svg.select('.chart-group').selectAll('.line')\n .data(dataByTopic);\n\n paths = lines.enter()\n .append('g')\n .attr('class', 'topic')\n .append('path')\n .attr('class', 'line')\n .attr('id', ({topic}) => topic)\n .attr('d', ({dates}) => topicLine(dates))\n .style('stroke', (d) => (\n dataByTopic.length === 1 ? `url(#${lineGradientId})` : getLineColor(d)\n ));\n\n lines\n .exit()\n .remove();\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines(xTicks, yTicks){\n if (grid === 'horizontal' || grid === 'full') {\n horizontalGridLines = svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(yScale.ticks(yTicks))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (-xAxisPadding.left - 30))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d));\n }\n\n if (grid === 'vertical' || grid === 'full') {\n verticalGridLines = svg.select('.grid-lines-group')\n .selectAll('line.vertical-grid-line')\n .data(xScale.ticks(xTicks))\n .enter()\n .append('line')\n .attr('class', 'vertical-grid-line')\n .attr('y1', 0)\n .attr('y2', chartHeight)\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d));\n }\n\n //draw a horizontal line to extend x-axis till the edges\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (-xAxisPadding.left - 30))\n .attr('x2', chartWidth)\n .attr('y1', height - margin.bottom - margin.top)\n .attr('y2', height - margin.bottom - margin.top);\n }\n\n /**\n * Draws an overlay element over the graph\n * @inner\n * @return void\n */\n function drawHoverOverlay(){\n overlay = svg.select('.metadata-group')\n .append('rect')\n .attr('class','overlay')\n .attr('y1', 0)\n .attr('y2', height)\n .attr('height', chartHeight)\n .attr('width', chartWidth)\n .attr('fill', overlayColor)\n .style('display', 'none');\n }\n\n /**\n * Creates the vertical marker\n * @return void\n */\n function drawVerticalMarker(){\n verticalMarkerContainer = svg.select('.metadata-group')\n .append('g')\n .attr('class', 'hover-marker vertical-marker-container')\n .attr('transform', 'translate(9999, 0)');\n\n verticalMarkerLine = verticalMarkerContainer.selectAll('path')\n .data([{\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0\n }])\n .enter()\n .append('line')\n .classed('vertical-marker', true)\n .attr('x1', 0)\n .attr('y1', chartHeight)\n .attr('x2', 0)\n .attr('y2', 0);\n }\n\n /**\n * Finds out which datapoint is closer to the given x position\n * @param {Number} x0 Date value for data point\n * @param {Object} d0 Previous datapoint\n * @param {Object} d1 Next datapoint\n * @return {Object} d0 or d1, the datapoint with closest date to x0\n */\n function findOutNearestDate(x0, d0, d1){\n return (new Date(x0).getTime() - new Date(d0.date).getTime()) > (new Date(d1.date).getTime() - new Date(x0).getTime()) ? d0 : d1;\n }\n\n /**\n * Extract X position on the graph from a given mouse event\n * @param {Object} event D3 mouse event\n * @return {Number} Position on the x axis of the mouse\n */\n function getMouseXPosition(event) {\n return d3Selection.mouse(event)[0];\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseX X position of the mouse\n * @return {Object} Data entry that is closer to that x axis position\n */\n function getNearestDataPoint(mouseX) {\n let dateFromInvertedX = xScale.invert(mouseX);\n let bisectDate = d3Array.bisector(getDate).left;\n let dataEntryIndex = bisectDate(dataByDate, dateFromInvertedX, 1);\n let dataEntryForXPosition = dataByDate[dataEntryIndex];\n let previousDataEntryForXPosition = dataByDate[dataEntryIndex - 1];\n let nearestDataPoint;\n\n if (previousDataEntryForXPosition && dataEntryForXPosition) {\n nearestDataPoint = findOutNearestDate(dateFromInvertedX, dataEntryForXPosition, previousDataEntryForXPosition);\n } else {\n nearestDataPoint = dataEntryForXPosition;\n }\n\n return nearestDataPoint;\n }\n\n /**\n * MouseMove handler, calculates the nearest dataPoint to the cursor\n * and updates metadata related to it\n * @private\n */\n function handleMouseMove(e){\n let xPositionOffset = -margin.left, //Arbitrary number, will love to know how to assess it\n dataPoint = getNearestDataPoint(getMouseXPosition(e) + xPositionOffset),\n dataPointXPosition;\n\n if (dataPoint) {\n dataPointXPosition = xScale(new Date(dataPoint.date));\n // More verticalMarker to that datapoint\n moveVerticalMarker(dataPointXPosition);\n // Add data points highlighting\n highlightDataPoints(dataPoint);\n // Emit event with xPosition for tooltip or similar feature\n dispatcher.call('customMouseMove', e, dataPoint, topicColorMap, dataPointXPosition);\n }\n }\n\n /**\n * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n * It also resets the container of the vertical marker\n * @private\n */\n function handleMouseOut(e, d){\n overlay.style('display', 'none');\n verticalMarkerLine.classed('bc-is-active', false);\n verticalMarkerContainer.attr('transform', 'translate(9999, 0)');\n\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n * @private\n */\n function handleMouseOver(e, d){\n overlay.style('display', 'block');\n verticalMarkerLine.classed('bc-is-active', true);\n\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Creates coloured circles marking where the exact data y value is for a given data point\n * @param {Object} dataPoint Data point to extract info from\n * @private\n */\n function highlightDataPoints(dataPoint) {\n cleanDataPointHighlights();\n\n const nodes = paths.nodes()\n const nodesById = nodes.reduce((acc, node) => {\n acc[node.id] = node\n\n return acc;\n }, {});\n\n // Group corresponding path node with its topic, and\n // sorting the topics based on the order of the colors,\n // so that the order always stays constant\n const topicsWithNode = dataPoint.topics\n .map(topic => ({\n topic,\n node: nodesById[topic.name]\n }))\n .filter(({topic}) => !!topic)\n .sort((a, b) => topicColorMap[a.topic.name] < topicColorMap[b.topic.name])\n\n dataPoint.topics = topicsWithNode.map(({topic}) => topic);\n\n dataPoint.topics.forEach(({name}, index) => {\n let marker = verticalMarkerContainer\n .append('g')\n .classed('circle-container', true),\n circleSize = 12;\n\n marker.append('circle')\n .classed('data-point-highlighter', true)\n .attr('cx', circleSize)\n .attr('cy', 0)\n .attr('r', 5)\n .style('stroke', topicColorMap[name]);\n\n const path = topicsWithNode[index].node;\n const x = xScale(new Date(dataPoint.topics[index].date));\n const y = getPathYFromX(x, path, name);\n\n marker.attr('transform', `translate( ${(-circleSize)}, ${y} )` );\n });\n }\n\n /**\n * Finds the y coordinate of a path given an x coordinate and the line's path node.\n * @param {number} x The x coordinate\n * @param {node} path The path node element\n * @param {*} name - The name identifier of the topic\n * @param {number} error The margin of error from the actual x coordinate. Default 0.01\n * @private\n */\n function getPathYFromX(x, path, name, error) {\n const key = `${name}-${x}`;\n\n if (key in pathYCache) {\n return pathYCache[key];\n }\n\n error = error || 0.01;\n\n const maxIterations = 100;\n\n let lengthStart = 0;\n let lengthEnd = path.getTotalLength();\n let point = path.getPointAtLength((lengthEnd + lengthStart) / 2);\n let iterations = 0;\n\n while (x < point.x - error || x > point.x + error) {\n const midpoint = (lengthStart + lengthEnd) / 2;\n\n point = path.getPointAtLength(midpoint);\n\n if (x < point.x) {\n lengthEnd = midpoint;\n } else {\n lengthStart = midpoint;\n }\n\n iterations += 1;\n if (maxIterations < iterations) {\n break;\n }\n }\n\n pathYCache[key] = point.y\n\n return pathYCache[key]\n }\n\n /**\n * Helper method to update the x position of the vertical marker\n * @param {Object} dataPoint Data entry to extract info\n * @return void\n */\n function moveVerticalMarker(verticalMarkerXPosition){\n verticalMarkerContainer.attr('transform', `translate(${verticalMarkerXPosition},0)`);\n }\n\n /**\n * Determines if we should add the tooltip related logic depending on the\n * size of the chart and the tooltipThreshold variable value\n * @return {Boolean} Should we build the tooltip?\n */\n function shouldShowTooltip() {\n return width > tooltipThreshold;\n }\n\n // API Methods\n\n /**\n * Gets or Sets the aspect ratio of the chart\n * @param {Number} _x Desired aspect ratio for the graph\n * @return { (Number | Module) } Current aspect ratio or Line Chart module to chain calls\n * @public\n */\n exports.aspectRatio = function(_x) {\n if (!arguments.length) {\n return aspectRatio;\n }\n aspectRatio = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the dateLabel of the chart\n * @param {Number} _x Desired dateLabel for the graph\n * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n * @public\n */\n exports.dateLabel = function(_x) {\n if (!arguments.length) {\n return dateLabel;\n }\n dateLabel = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x axis grouping\n * @param {String} _x Desired format\n * @return { (String|Module) } Current format or module to chain calls\n * @example\n * line.xAxisFormat(line.axisTimeCombinations.HOUR_DAY)\n */\n exports.xAxisFormat = function(_x) {\n if (!arguments.length) {\n return xAxisFormat;\n }\n xAxisFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x format\n * It requires a `xAxisFormat` of 'custom' in order to work.\n * NOTE: localization not supported\n * @param {String} _x Desired format for x axis\n * @return { (String|Module) } Current format or module to chain calls\n */\n exports.xAxisCustomFormat = function(_x) {\n if (!arguments.length) {\n return xAxisCustomFormat;\n }\n xAxisCustomFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisFormat` of 'custom' in order to work.\n * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n * how many and where the ticks will appear.\n *\n * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n * @return { (Number|Module) } Current number or ticks or module to chain calls\n */\n exports.xTicks = function(_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the grid mode.\n *\n * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n * @return { String | module} Current mode of the grid or Line Chart module to chain calls\n * @public\n */\n exports.grid = function(_x) {\n if (!arguments.length) {\n return grid;\n }\n grid = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { (Number | Module) } Current height or Line Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n if (aspectRatio) {\n width = Math.ceil(_x / aspectRatio);\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { (Number | Module) } Current margin or Line Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the curve of the line chart\n * @param {curve} _x Desired curve for the lines, default 'linear'. Other options are:\n * basis, natural, monotoneX, monotoneY, step, stepAfter, stepBefore, cardinal, and\n * catmullRom. Visit https://github.com/d3/d3-shape#curves for more information.\n * @return { (curve | Module) } Current line curve or Line Chart module to chain calls\n * @public\n */\n exports.lineCurve = function(_x) {\n if (!arguments.length) {\n return lineCurve;\n }\n lineCurve = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the gradient colors of the line chart when there is only one line\n * @param {String[]} _x Desired color gradient for the line (array of two hexadecimal numbers)\n * @return { (Number | Module) } Current color gradient or Line Chart module to chain calls\n * @public\n */\n exports.lineGradient = function(_x) {\n if (!arguments.length) {\n return singleLineGradientColors;\n }\n singleLineGradientColors = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the minimum width of the graph in order to show the tooltip\n * NOTE: This could also depend on the aspect ratio\n * @param {Number} _x Desired tooltip threshold for the graph\n * @return { (Number | Module) } Current tooltip threshold or Line Chart module to chain calls\n * @public\n */\n exports.tooltipThreshold = function(_x) {\n if (!arguments.length) {\n return tooltipThreshold;\n }\n tooltipThreshold = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the topicLabel of the chart\n * @param {Number} _x Desired topicLabel for the graph\n * @return { topicLabel | module} Current topicLabel or Chart module to chain calls\n * @public\n */\n exports.topicLabel = function(_x) {\n if (!arguments.length) {\n return topicLabel;\n }\n topicLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the y axis on the chart\n * (Default is 5)\n * @param {Number} _x Desired yTicks\n * @return {Number | module} Current yTicks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function(_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return {Number | Module} Current width or Line Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n if (aspectRatio) {\n height = Math.ceil(_x * aspectRatio);\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Pass language tag for the tooltip to localize the date.\n * Feature uses Intl.DateTimeFormat, for compatability and support, refer to\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {String} _x must be a language tag (BCP 47) like 'en-US' or 'fr-FR'\n * @return { (String|Module) } Current locale or module to chain calls\n */\n exports.locale = function(_x) {\n if (!arguments.length) {\n return locale;\n }\n locale = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseHover, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Exposes the constants to be used to force the x axis to respect a certain granularity\n * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n * @example\n * line.xAxisCustomFormat(line.axisTimeCombinations.HOUR_DAY)\n */\n exports.axisTimeCombinations = axisTimeCombinations;\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/line.js","define(function(require) {\n 'use strict';\n\n const d3Time = require('d3-time');\n const d3TimeFormat = require('d3-time-format');\n\n const {\n axisTimeCombinations,\n timeBenchmarks\n } = require('./constants');\n\n\n const singleTickWidth = 20;\n const horizontalTickSpacing = 50;\n const minEntryNumForDayFormat = 5;\n\n const formatMap = {\n minute: d3TimeFormat.timeFormat('%M m'),\n hour: d3TimeFormat.timeFormat('%H %p'),\n day: d3TimeFormat.timeFormat('%e'),\n daymonth: d3TimeFormat.timeFormat('%d %b'),\n month: d3TimeFormat.timeFormat('%b'),\n year: d3TimeFormat.timeFormat('%Y')\n };\n const localeTimeMap = {\n minute: {minute:'numeric'},\n hour: {hour:'numeric'},\n day: {day: 'numeric'},\n daymonth: {day: 'numeric', month:'short'},\n month: {month: 'short'},\n year: {year: 'numeric'}\n };\n const settingsToMajorTickMap = {\n [axisTimeCombinations.MINUTE_HOUR]: d3Time.timeHour.every(1),\n [axisTimeCombinations.HOUR_DAY]: d3Time.timeDay.every(1),\n [axisTimeCombinations.DAY_MONTH]: d3Time.timeMonth.every(1),\n [axisTimeCombinations.MONTH_YEAR]: d3Time.timeYear.every(1)\n };\n\n /**\n * Figures out the proper settings from the current time span\n * @param {Number} timeSpan Span of time charted by the graph in milliseconds\n * @return {String} Type of settings for the given timeSpan\n */\n const getAxisSettingsFromTimeSpan = (timeSpan) => {\n let {\n ONE_YEAR,\n ONE_DAY\n } = timeBenchmarks;\n let settings;\n\n if (timeSpan < ONE_DAY) {\n settings = axisTimeCombinations.HOUR_DAY;\n } else if (timeSpan < ONE_YEAR) {\n settings = axisTimeCombinations.DAY_MONTH;\n } else {\n settings = axisTimeCombinations.MONTH_YEAR;\n }\n\n return settings;\n }\n\n /**\n * Calculates the maximum number of ticks for the x axis\n * @param {Number} width Chart width\n * @param {Number} dataPointNumber Number of entries on the data\n * @return {Number} Number of ticks to render\n */\n const getMaxNumOfHorizontalTicks = (width, dataPointNumber) => {\n let ticksForWidth = Math.ceil(width / (singleTickWidth + horizontalTickSpacing));\n\n return dataPointNumber < minEntryNumForDayFormat ? d3Time.timeDay : Math.min(dataPointNumber, ticksForWidth);\n }\n\n /**\n * Takes a locale (string) and the format to return and returns a function to format dates\n * @param {String} locale locale tag eg. en-US, fr-FR, ru-RU\n * @param {string} timeUnit minute, hour, day, dayMonth, month, year\n * @return {function} function that formats dates in the proper locale\n */\n const getLocaleDateFormatter = (locale, timeUnit='day') => {\n let options = localeTimeMap[timeUnit];\n let formatter = new Intl.DateTimeFormat(locale, options);\n\n return (date) => formatter.format(date);\n }\n\n /**\n * Returns tick object to be used when building the x axis\n * @param {dataByDate} dataByDate Chart data ordered by Date\n * @param {Number} width Chart width\n * @param {String} settings Optional forced settings for axis\n * @return {object} tick settings for major and minr axis\n */\n const getXAxisSettings = (dataByDate, width, settings = null, locale=null) => {\n let firstDate = new Date(dataByDate[0].date);\n let lastDate = new Date(dataByDate[dataByDate.length - 1].date);\n let dateTimeSpan = lastDate - firstDate;\n\n if (locale && ((typeof Intl === 'undefined') || (typeof Intl === 'object' && !Intl.DateTimeFormat))) {\n locale = null;\n }\n\n if (!settings) {\n settings = getAxisSettingsFromTimeSpan(dateTimeSpan);\n }\n\n let [minor, major] = settings.split('-');\n\n let majorTickValue = settingsToMajorTickMap[settings];\n let minorTickValue = getMaxNumOfHorizontalTicks(width, dataByDate.length);\n\n return {\n minor: {\n format: locale ? getLocaleDateFormatter(locale, minor) : formatMap[minor],\n tick: minorTickValue\n },\n major: {\n format: locale ? getLocaleDateFormatter(locale, major) : formatMap[major],\n tick: majorTickValue\n }\n };\n };\n\n return {\n getXAxisSettings,\n getLocaleDateFormatter\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/helpers/timeAxis.js","define(function(require) {\n 'use strict';\n\n const d3Format = require('d3-format');\n\n const integerValueFormats = {\n small: {\n limit: 10,\n format: d3Format.format('')\n },\n medium: {\n limit: 1000,\n format: d3Format.format('')\n },\n large: {\n limit: null,\n format: d3Format.format('.2s')\n }\n };\n const decimalValueFormats = {\n small: {\n limit: 10,\n format: d3Format.format('.3f')\n },\n medium: {\n limit: 100,\n format: d3Format.format('.1f')\n },\n large: {\n limit: null,\n format: d3Format.format('.2s')\n }\n };\n\n function getValueSize(value, limits) {\n let size = 'large';\n\n if (value < limits.small.limit) {\n size = 'small';\n } else if (value < limits.medium.limit) {\n size = 'medium';\n }\n return size;\n }\n\n /**\n * Formats an integer value depending on its value range\n * @param {Number} value Decimal point value to format\n * @return {Number} Formatted value to show\n */\n function formatIntegerValue(value) {\n let size = getValueSize(value, integerValueFormats);\n let format = integerValueFormats[size].format;\n\n return format(value);\n }\n\n /**\n * Formats a floating point value depending on its value range\n * @param {Number} value Decimal point value to format\n * @return {Number} Formatted value to show\n */\n function formatDecimalValue(value) {\n let size = getValueSize(value, decimalValueFormats);\n let format = decimalValueFormats[size].format;\n\n return format(value);\n }\n\n return {\n formatDecimalValue,\n formatIntegerValue,\n }\n\n});\n\n\n// WEBPACK FOOTER //\n// ./src/charts/helpers/formatHelpers.js","define(function(require){\n 'use strict';\n\n const d3Ease = require('d3-ease');\n const d3Format = require('d3-format');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n const d3TimeFormat = require('d3-time-format');\n\n const {\n axisTimeCombinations\n } = require('./helpers/constants');\n\n const {\n formatIntegerValue,\n formatDecimalValue\n } = require('./helpers/formatHelpers');\n\n const {\n isInteger\n } = require('./helpers/common');\n\n /**\n * Tooltip Component reusable API class that renders a\n * simple and configurable tooltip element for Britechart's\n * line chart or stacked area chart.\n *\n * @module Tooltip\n * @tutorial tooltip\n * @requires d3-array, d3-axis, d3-dispatch, d3-format, d3-scale, d3-selection, d3-transition\n *\n * @example\n * var lineChart = line(),\n * tooltip = tooltip();\n *\n * tooltip\n * .title('Tooltip title');\n *\n * lineChart\n * .width(500)\n * .on('customMouseOver', function() {\n * tooltip.show();\n * })\n * .on('customMouseMove', function(dataPoint, topicColorMap, dataPointXPosition) {\n * tooltip.update(dataPoint, topicColorMap, dataPointXPosition);\n * })\n * .on('customMouseOut', function() {\n * tooltip.hide();\n * });\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(lineChart);\n *\n * d3Selection.select('.metadata-group .hover-marker')\n * .datum([])\n * .call(tooltip);\n *\n */\n return function module() {\n\n let margin = {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2\n },\n width = 250,\n height = 45,\n\n title = 'Tooltip title',\n shouldShowDateInTitle = true,\n valueFormat = null,\n\n // tooltip\n tooltip,\n tooltipOffset = {\n y: -55,\n x: 0\n },\n tooltipMaxTopicLength = 170,\n tooltipTextContainer,\n tooltipDivider,\n tooltipBody,\n tooltipTitle,\n tooltipWidth = 250,\n tooltipHeight = 48,\n tooltipBorderRadius = 3,\n ttTextX = 0,\n ttTextY = 37,\n textSize,\n entryLineLimit = 3,\n\n // Animations\n mouseChaseDuration = 100,\n ease = d3Ease.easeQuadInOut,\n\n circleYOffset = 8,\n\n colorMap,\n bodyFillColor = '#FFFFFF',\n borderStrokeColor = '#D2D6DF',\n titleFillColor = '#6D717A',\n textFillColor = '#282C35',\n tooltipTextColor = '#000000',\n\n dateLabel = 'date',\n valueLabel = 'value',\n nameLabel = 'name',\n topicLabel = 'topics',\n\n defaultAxisSettings = axisTimeCombinations.DAY_MONTH,\n dateFormat = null,\n topicsOrder = [],\n\n // formats\n monthDayYearFormat = d3TimeFormat.timeFormat('%b %d, %Y'),\n monthDayHourFormat = d3TimeFormat.timeFormat('%b %d, %I %p'),\n locale,\n\n chartWidth, chartHeight,\n data,\n svg;\n\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {Object} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = _data;\n\n buildSVG(this);\n });\n }\n\n /**\n * Builds containers for the tooltip\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups() {\n var container = svg.append('g')\n .classed('tooltip-container-group', true)\n .attr('transform', `translate( ${margin.left}, ${margin.top})`);\n\n container.append('g').classed('tooltip-group', true);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('g')\n .classed('britechart britechart-tooltip', true);\n\n buildContainerGroups();\n drawTooltip();\n }\n svg\n .transition()\n .attr('width', width)\n .attr('height', height);\n\n // Hidden by default\n exports.hide();\n }\n\n /**\n * Resets the tooltipBody content\n * @return void\n */\n function cleanContent(){\n tooltipBody.selectAll('text').remove();\n tooltipBody.selectAll('circle').remove();\n }\n\n /**\n * Draws the different elements of the Tooltip box\n * @return void\n */\n function drawTooltip(){\n tooltipTextContainer = svg.selectAll('.tooltip-group')\n .append('g')\n .classed('tooltip-text', true);\n\n tooltip = tooltipTextContainer\n .append('rect')\n .classed('tooltip-text-container', true)\n .attr('x', -tooltipWidth / 4 + 8)\n .attr('y', 0)\n .attr('width', tooltipWidth)\n .attr('height', tooltipHeight)\n .attr('rx', tooltipBorderRadius)\n .attr('ry', tooltipBorderRadius)\n .style('fill', bodyFillColor)\n .style('stroke', borderStrokeColor)\n .style('stroke-width', 1);\n\n tooltipTitle = tooltipTextContainer\n .append('text')\n .classed('tooltip-title', true)\n .attr('x', -tooltipWidth / 4 + 17)\n .attr('dy', '.35em')\n .attr('y', 16)\n .style('fill', titleFillColor);\n\n tooltipDivider = tooltipTextContainer\n .append('line')\n .classed('tooltip-divider', true)\n .attr('x1', -tooltipWidth / 4 + 15)\n .attr('x2', 265)\n .attr('y1', 31)\n .attr('y2', 31)\n .style('stroke', borderStrokeColor);\n\n tooltipBody = tooltipTextContainer\n .append('g')\n .classed('tooltip-body', true)\n .style('transform', 'translateY(8px)')\n .style('fill', textFillColor);\n }\n\n /**\n * Formats the value depending on its characteristics\n * @param {Number} value Value to format\n * @return {Number} Formatted value\n */\n function getFormattedValue(value) {\n let valueFormatter = formatDecimalValue;\n\n if (!value) {\n return 0;\n }\n if (valueFormat) {\n valueFormatter = d3Format.format(valueFormat);\n } else if (isInteger(value)) {\n valueFormatter = formatIntegerValue;\n }\n\n return valueFormatter(value);\n }\n\n /**\n * Calculates the desired position for the tooltip\n * @param {Number} mouseX Current horizontal mouse position\n * @param {Number} mouseY Current vertical mouse position\n * @return {Number[]} X and Y position\n */\n function getTooltipPosition([mouseX, mouseY]) {\n let tooltipX, tooltipY;\n\n // show tooltip to the right\n if ((mouseX - tooltipWidth) < 0) {\n // Tooltip on the right\n tooltipX = tooltipWidth - 185;\n } else {\n // Tooltip on the left\n tooltipX = -205\n }\n\n if (mouseY) {\n tooltipY = tooltipOffset.y;\n // tooltipY = mouseY + tooltipOffset.y;\n } else {\n tooltipY = tooltipOffset.y;\n }\n\n return [tooltipX, tooltipY];\n }\n\n /**\n * Extracts the value from the data object\n * @param {Object} data Data value containing the info\n * @return {String} Value to show\n */\n function getValueText(data) {\n let value = data[valueLabel];\n let valueText;\n\n if (data.missingValue) {\n valueText = '-';\n } else {\n valueText = getFormattedValue(value).toString();\n }\n\n return valueText;\n }\n\n /**\n * Resets the height of the tooltip and the pointer for the text\n * position\n */\n function resetSizeAndPositionPointers() {\n tooltipHeight = 48;\n ttTextY = 37;\n ttTextX = 0;\n }\n\n /**\n * Draws the data entries inside the tooltip for a given topic\n * @param {Object} topic Topic to extract data from\n * @return void\n */\n function updateTopicContent(topic){\n let name = topic[nameLabel],\n tooltipRight,\n tooltipLeftText,\n tooltipRightText,\n elementText;\n\n tooltipLeftText = topic.topicName || name;\n tooltipRightText = getValueText(topic);\n\n elementText = tooltipBody\n .append('text')\n .classed('tooltip-left-text', true)\n .attr('dy', '1em')\n .attr('x', ttTextX - 20)\n .attr('y', ttTextY)\n .style('fill', tooltipTextColor)\n .text(tooltipLeftText)\n .call(textWrap, tooltipMaxTopicLength, -25);\n\n tooltipRight = tooltipBody\n .append('text')\n .classed('tooltip-right-text', true)\n .attr('dy', '1em')\n .attr('x', ttTextX + 8)\n .attr('y', ttTextY)\n .style('fill', tooltipTextColor)\n .text(tooltipRightText);\n\n textSize = elementText.node().getBBox();\n tooltipHeight += textSize.height + 5;\n\n // Not sure if necessary\n tooltipRight.attr('x', tooltipWidth - tooltipRight.node().getBBox().width - 10 - tooltipWidth / 4)\n\n tooltipBody\n .append('circle')\n .classed('tooltip-circle', true)\n .attr('cx', 23 - tooltipWidth / 4)\n .attr('cy', (ttTextY + circleYOffset))\n .attr('r', 5)\n .style('fill', colorMap[name])\n .style('stroke-width', 1);\n\n ttTextY += textSize.height + 7;\n }\n\n /**\n * Updates size and position of tooltip depending on the side of the chart we are in\n * TODO: This needs a refactor, following the mini-tooltip code.\n *\n * @param {Object} dataPoint DataPoint of the tooltip\n * @param {Number} xPosition DataPoint's x position in the chart\n * @param {Number} xPosition DataPoint's y position in the chart\n * @return void\n */\n function updatePositionAndSize(dataPoint, xPosition, yPosition){\n let [tooltipX, tooltipY] = getTooltipPosition([xPosition, yPosition])\n\n tooltip\n .attr('width', tooltipWidth)\n .attr('height', tooltipHeight + 10);\n\n tooltipTextContainer.transition()\n .duration(mouseChaseDuration)\n .ease(ease)\n .attr('transform', `translate(${tooltipX}, ${tooltipY})`);\n\n tooltipDivider\n .attr('x2', tooltipWidth - 60);\n }\n\n /**\n * Updates value of tooltipTitle with the data meaning and the date\n * @param {Object} dataPoint Point of data to use as source\n * @return void\n */\n function updateTitle(dataPoint) {\n let tTitle = title;\n\n if (shouldShowDateInTitle) {\n tTitle = `${tTitle} - ${formatDate(new Date(dataPoint[dateLabel]))}`;\n }\n\n tooltipTitle.text(tTitle);\n }\n\n /**\n * Figures out which date format to use when showing the date of the current data entry\n * @return {Function} The proper date formatting function\n */\n function formatDate(date) {\n let settings = dateFormat || defaultAxisSettings;\n let format = null;\n let localeOptions = {month:'short', day:'numeric'};\n\n if (settings === axisTimeCombinations.DAY_MONTH || settings === axisTimeCombinations.MONTH_YEAR) {\n format = monthDayYearFormat;\n localeOptions.year = 'numeric';\n } else if (settings === axisTimeCombinations.HOUR_DAY || settings === axisTimeCombinations.MINUTE_HOUR) {\n format = monthDayHourFormat;\n localeOptions.hour = 'numeric';\n }\n\n if (locale && ((typeof Intl !== 'undefined') && (typeof Intl === 'object' && Intl.DateTimeFormat))) {\n let f = Intl.DateTimeFormat(locale, localeOptions);\n\n return f.format(date);\n }\n\n return format(date);\n }\n\n /**\n * Helper method to sort the passed topics array by the names passed int he order arary\n * @param {Object[]} topics Topics data, retrieved from datapoint passed by line chart\n * @param {Object[]} order Array of names in the order to sort topics by\n * @return {Object[]} sorted topics object\n */\n function _sortByTopicsOrder(topics, order=topicsOrder) {\n return order.map((orderName) => topics.filter(({name}) => name === orderName)[0]);\n }\n\n /**\n * Sorts topic by alphabetical order for arrays of objects with a name proeprty\n * @param {Array} topics List of topic objects\n * @return {Array} List of topic name strings\n */\n function _sortByAlpha(topics) {\n return topics\n .map(d => d)\n .sort((a, b) => {\n if (a.name > b.name) return 1;\n if (a.name === b.name) return 0;\n return -1;\n });\n\n let otherIndex = topics.map(({name}) => name).indexOf('Other');\n\n if (otherIndex >= 0) {\n let other = topics.splice(otherIndex, 1);\n\n topics = topics.concat(other);\n }\n }\n\n /**\n * Wraps a text given the text, width, x position and textFormatter function\n * @param {D3Selection} text Selection with the text to wrap inside\n * @param {Number} width Desired max width for that line\n * @param {Number} xpos Initial x position of the text\n *\n * REF: http://bl.ocks.org/mbostock/7555321\n * More discussions on https://github.com/mbostock/d3/issues/1642\n */\n function textWrap(text, width, xpos) {\n xpos = xpos || 0;\n\n text.each(function() {\n var words,\n word,\n line,\n lineNumber,\n lineHeight,\n y,\n dy,\n tspan;\n\n text = d3Selection.select(this);\n\n words = text.text().split(/\\s+/).reverse();\n line = [];\n lineNumber = 0;\n lineHeight = 1.2;\n y = text.attr('y');\n dy = parseFloat(text.attr('dy'));\n tspan = text\n .text(null)\n .append('tspan')\n .attr('x', xpos)\n .attr('y', y)\n .attr('dy', dy + 'em');\n\n while ((word = words.pop())) {\n line.push(word);\n tspan.text(line.join(' '));\n\n if (tspan.node().getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(' '));\n\n if (lineNumber < entryLineLimit - 1) {\n line = [word];\n tspan = text.append('tspan')\n .attr('x', xpos)\n .attr('y', y)\n .attr('dy', ++lineNumber * lineHeight + dy + 'em')\n .text(word);\n }\n }\n }\n });\n }\n\n /**\n * Draws the data entries inside the tooltip\n * @param {Object} dataPoint Data entry from to take the info\n * @return void\n */\n function updateContent(dataPoint){\n var topics = dataPoint[topicLabel];\n\n // sort order by topicsOrder array if passed\n if (topicsOrder.length) {\n topics = _sortByTopicsOrder(topics);\n } else if (topics.length && topics[0].name) {\n topics = _sortByAlpha(topics);\n }\n\n cleanContent();\n updateTitle(dataPoint);\n resetSizeAndPositionPointers();\n topics.forEach(updateTopicContent);\n }\n\n /**\n * Updates tooltip title, content, size and position\n * sorts by alphatical name order if not forced order given\n *\n * @param {lineChartPointByDate} dataPoint Current datapoint to show info about\n * @param {Number} xPosition Position of the mouse on the X axis\n * @return void\n */\n function updateTooltip(dataPoint, xPosition, yPosition) {\n updateContent(dataPoint);\n updatePositionAndSize(dataPoint, xPosition, yPosition);\n }\n\n\n // API\n\n /**\n * constants to be used to force the x axis to respect a certain granularity\n * current options: HOUR_DAY, DAY_MONTH, MONTH_YEAR\n * @example tooltip.dateFormat(tooltip.axisTimeCombinations.HOUR_DAY)\n */\n exports.axisTimeCombinations = axisTimeCombinations;\n\n /**\n * Gets or Sets the dateLabel of the data\n * @param {Number} _x Desired dateLabel\n * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n * @public\n */\n exports.dateLabel = function(_x) {\n if (!arguments.length) {\n return dateLabel;\n }\n dateLabel = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the tooltip to use a certain date format\n * @param {String} _x Desired format\n * @return { (String|Module) } Current format or module to chain calls\n */\n exports.dateFormat = function(_x) {\n if (!arguments.length) {\n return dateFormat || defaultAxisSettings;\n }\n dateFormat = _x;\n\n return this;\n };\n\n /**\n * Hides the tooltip\n * @return {Module} Tooltip module to chain calls\n * @public\n */\n exports.hide = function() {\n svg.style('display', 'none');\n\n return this;\n };\n\n /**\n * Pass locale for the tooltip to render the date in\n * @param {String} _x must be a locale tag like 'en-US' or 'fr-FR'\n * @return { (String|Module) } Current locale or module to chain calls\n */\n exports.locale = function(_x) {\n if (!arguments.length) {\n return locale;\n }\n locale = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the nameLabel of the data\n * @param {Number} _x Desired nameLabel\n * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n * @public\n */\n exports.nameLabel = function(_x) {\n if (!arguments.length) {\n return nameLabel;\n }\n nameLabel = _x;\n\n return this;\n };\n\n /**\n * Shows the tooltip\n * @return {Module} Tooltip module to chain calls\n * @public\n */\n exports.show = function() {\n svg.style('display', 'block');\n\n return this;\n };\n\n /**\n * Pass an override for the ordering of your tooltip\n * @param {Object[]} _x Array of the names of your tooltip items\n * @return { overrideOrder | module} Current overrideOrder or Chart module to chain calls\n * @public\n */\n exports.topicsOrder = function(_x) {\n if (!arguments.length) {\n return topicsOrder;\n }\n topicsOrder = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the title of the tooltip\n * @param {string} _x Desired title\n * @return { string | module} Current title or module to chain calls\n * @public\n */\n exports.title = function(_x) {\n if (!arguments.length) {\n return title;\n }\n title = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the topicLabel of the data\n * @param {Number} _x Desired topicLabel\n * @return { topicLabel | module} Current topicLabel or Chart module to chain calls\n * @public\n */\n exports.topicLabel = function(_x) {\n if (!arguments.length) {\n return topicLabel;\n }\n topicLabel = _x;\n\n return this;\n };\n\n /**\n * Updates the position and content of the tooltip\n * @param {Object} dataPoint Datapoint to represent\n * @param {Object} colorMapping Color scheme of the topics\n * @param {Number} position X-scale position in pixels\n * @return {Module} Tooltip module to chain calls\n * @public\n */\n exports.update = function(dataPoint, colorMapping, xPosition, yPosition = null) {\n colorMap = colorMapping;\n updateTooltip(dataPoint, xPosition, yPosition);\n\n return this;\n };\n\n /**\n * Gets or Sets the valueFormat of the tooltip\n * @param {String} _x Desired valueFormat\n * @return { String | module} Current valueFormat or module to chain calls\n * @public\n */\n exports.valueFormat = function(_x) {\n if (!arguments.length) {\n return valueFormat;\n }\n valueFormat = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the data\n * @param {Number} _x Desired valueLabel\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets shouldShowDateInTitle\n * @param {Boolean} _x Desired value\n * @return { shouldShowDateInTitle | module} Current shouldShowDateInTitle or Chart module to chain calls\n * @public\n */\n exports.shouldShowDateInTitle = function(_x) {\n if (!arguments.length) {\n return shouldShowDateInTitle;\n }\n shouldShowDateInTitle = _x;\n\n return this;\n };\n return exports;\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/tooltip.js","define(function(require){\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Ease = require('d3-ease');\n const d3Format = require('d3-format');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n\n /**\n * Mini Tooltip Component reusable API class that renders a\n * simple and configurable tooltip element for Britechart's\n * bar and step chart.\n *\n * @module Mini-tooltip\n * @tutorial bar\n * @requires d3\n *\n * @example\n * var barChart = line(),\n * miniTooltip = miniTooltip();\n *\n * barChart\n * .width(500)\n * .height(300)\n * .on('customMouseHover', miniTooltip.show)\n * .on('customMouseMove', miniTooltip.update)\n * .on('customMouseOut', miniTooltip.hide);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(barChart);\n *\n * d3Selection.select('.metadata-group .mini-tooltip-container')\n * .datum([])\n * .call(miniTooltip);\n *\n */\n return function module() {\n\n let margin = {\n top: 12,\n right: 12,\n bottom: 12,\n left: 12\n },\n width = 100,\n height = 100,\n\n // Optional Title\n title = '',\n\n // Data Format\n valueLabel = 'value',\n nameLabel = 'name',\n\n // Animations\n mouseChaseDuration = 100,\n ease = d3Ease.easeQuadInOut,\n\n // tooltip\n tooltipBackground,\n backgroundBorderRadius = 1,\n tooltipTextContainer,\n tooltipOffset = {\n y: 0,\n x: 20\n },\n\n // Fonts\n textSize = 14,\n textLineHeight = 1.5,\n valueTextSize = 27,\n valueTextLineHeight = 1.18,\n\n // Colors\n bodyFillColor = '#FFFFFF',\n borderStrokeColor = '#D2D6DF',\n titleFillColor = '#666a73',\n nameTextFillColor = '#666a73',\n valueTextFillColor = '#45494E',\n valueTextWeight = 200,\n\n // formats\n tooltipValueFormat = d3Format.format('.2f'),\n\n chartWidth,\n chartHeight,\n svg;\n\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n */\n function exports(_selection) {\n _selection.each(function(){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n\n buildSVG(this);\n drawTooltip();\n });\n }\n\n /**\n * Builds containers for the tooltip\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('tooltip-container-group', true)\n .attr('transform', `translate( ${margin.left}, ${margin.top})`);\n\n container.append('g').classed('tooltip-group', true);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('g')\n .classed('britechart britechart-mini-tooltip', true);\n\n buildContainerGroups();\n }\n svg\n .transition()\n .attr('width', width)\n .attr('height', height);\n\n // Hidden by default\n exports.hide();\n }\n\n /**\n * Draws the different elements of the Tooltip box\n * @return void\n */\n function drawTooltip(){\n tooltipTextContainer = svg.selectAll('.tooltip-group')\n .append('g')\n .classed('tooltip-text', true);\n\n tooltipBackground = tooltipTextContainer\n .append('rect')\n .classed('tooltip-background', true)\n .attr('width', width)\n .attr('height', height)\n .attr('rx', backgroundBorderRadius)\n .attr('ry', backgroundBorderRadius)\n .attr('y', - margin.top)\n .attr('x', - margin.left)\n .style('fill', bodyFillColor)\n .style('stroke', borderStrokeColor)\n .style('stroke-width', 1)\n .style('pointer-events', 'none')\n .style('opacity', 0.9);\n }\n\n /**\n * Figures out the max length of the tooltip lines\n * @param {D3Selection[]} texts List of svg elements of each line\n * @return {Number} Max size of the lines\n */\n function getMaxLengthLine(...texts) {\n let textSizes = texts.filter(x => !!x)\n .map(x => x.node().getBBox().width);\n\n return d3Array.max(textSizes);\n }\n\n /**\n * Calculates the desired position for the tooltip\n * @param {Number} mouseX Current horizontal mouse position\n * @param {Number} mouseY Current vertical mouse position\n * @param {Number} parentChartWidth Parent's chart width\n * @param {Number} parentChartHeight Parent's chart height\n * @return {Number[]} X and Y position\n * @private\n */\n function getTooltipPosition([mouseX, mouseY], [parentChartWidth, parentChartHeight]) {\n let tooltipX, tooltipY;\n\n if (hasEnoughHorizontalRoom(parentChartWidth, mouseX)) {\n tooltipX = mouseX + tooltipOffset.x;\n } else {\n tooltipX = mouseX - chartWidth - tooltipOffset.x - margin.right;\n }\n\n if (hasEnoughVerticalRoom(parentChartHeight, mouseY)) {\n tooltipY = mouseY + tooltipOffset.y;\n } else {\n tooltipY = mouseY - chartHeight - tooltipOffset.y - margin.bottom;\n }\n\n return [tooltipX, tooltipY];\n }\n\n /**\n * Checks if the mouse is over the bounds of the parent chart\n * @param {Number} chartWidth Parent's chart\n * @param {Number} positionX Mouse position\n * @return {Boolean} If the mouse position allows space for the tooltip\n */\n function hasEnoughHorizontalRoom(parentChartWidth, positionX) {\n return (parentChartWidth - margin.left - margin.right - chartWidth) - positionX > 0;\n }\n\n /**\n * Checks if the mouse is over the bounds of the parent chart\n * @param {Number} chartWidth Parent's chart\n * @param {Number} positionX Mouse position\n * @return {Boolean} If the mouse position allows space for the tooltip\n */\n function hasEnoughVerticalRoom(parentChartHeight, positionY) {\n return (parentChartHeight - margin.top - margin.bottom - chartHeight) - positionY > 0;\n }\n\n /**\n * Hides the tooltip\n * @return {void}\n */\n function hideTooltip() {\n svg.style('display', 'none');\n }\n\n /**\n * Shows the tooltip updating it's content\n * @param {Object} dataPoint Data point from the chart\n * @return {void}\n */\n function showTooltip(dataPoint) {\n updateContent(dataPoint);\n svg.style('display', 'block');\n }\n\n /**\n * Draws the data entries inside the tooltip for a given topic\n * @param {Object} topic Topic to extract data from\n * @return void\n */\n function updateContent(dataPoint = {}){\n let value = dataPoint[valueLabel] || '',\n name = dataPoint[nameLabel] || '',\n lineHeight = textSize * textLineHeight,\n valueLineHeight = valueTextSize * valueTextLineHeight,\n defaultDy = '1em',\n temporalHeight = 0,\n tooltipValue,\n tooltipName,\n tooltipTitle;\n\n tooltipTextContainer.selectAll('text')\n .remove();\n\n if (title) {\n tooltipTitle = tooltipTextContainer\n .append('text')\n .classed('mini-tooltip-title', true)\n .attr('dy', defaultDy)\n .attr('y', 0)\n .style('fill', titleFillColor)\n .style('font-size', textSize)\n .text(title);\n\n temporalHeight = lineHeight + temporalHeight;\n }\n\n if (name) {\n tooltipName = tooltipTextContainer\n .append('text')\n .classed('mini-tooltip-name', true)\n .attr('dy', defaultDy)\n .attr('y', temporalHeight || 0)\n .style('fill', nameTextFillColor)\n .style('font-size', textSize)\n .text(name);\n\n temporalHeight = lineHeight + temporalHeight;\n }\n\n if (value) {\n tooltipValue = tooltipTextContainer\n .append('text')\n .classed('mini-tooltip-value', true)\n .attr('dy', defaultDy)\n .attr('y', temporalHeight || 0)\n .style('fill', valueTextFillColor)\n .style('font-size', valueTextSize)\n .style('font-weight', valueTextWeight)\n .text(tooltipValueFormat(value));\n\n temporalHeight = valueLineHeight + temporalHeight;\n }\n\n chartWidth = getMaxLengthLine(tooltipName, tooltipTitle, tooltipValue);\n chartHeight = temporalHeight;\n }\n\n /**\n * Updates size and position of tooltip depending on the side of the chart we are in\n * @param {Object} dataPoint DataPoint of the tooltip\n * @return void\n */\n function updatePositionAndSize(mousePosition, parentChartSize) {\n let [tooltipX, tooltipY] = getTooltipPosition(mousePosition, parentChartSize);\n\n svg.transition()\n .duration(mouseChaseDuration)\n .ease(ease)\n .attr('height', chartHeight + margin.top + margin.bottom)\n .attr('width', chartWidth + margin.left + margin.right)\n .attr('transform', `translate(${tooltipX},${tooltipY})`);\n\n tooltipBackground\n .attr('height', chartHeight + margin.top + margin.bottom)\n .attr('width', chartWidth + margin.left + margin.right);\n }\n\n /**\n * Updates tooltip content, size and position\n *\n * @param {Object} dataPoint Current datapoint to show info about\n * @return void\n */\n function updateTooltip(dataPoint, position, chartSize) {\n updateContent(dataPoint);\n updatePositionAndSize(position, chartSize);\n }\n\n /**\n * Hides the tooltip\n * @return {Module} Tooltip module to chain calls\n * @public\n */\n exports.hide = function() {\n hideTooltip();\n\n return this;\n };\n\n /**\n * Gets or Sets data's nameLabel\n * @param {text} _x Desired nameLabel\n * @return { text | module} nameLabel or Step Chart module to chain calls\n * @public\n */\n exports.nameLabel = function(_x) {\n if (!arguments.length) {\n return nameLabel;\n }\n nameLabel = _x;\n return this;\n };\n\n /**\n * Shows the tooltip\n * @return {Module} Tooltip module to chain calls\n * @public\n */\n exports.show = function() {\n showTooltip();\n\n return this;\n };\n\n /**\n * Gets or Sets the title of the tooltip\n * @param {string} _x Desired title\n * @return { string | module} Current title or module to chain calls\n * @public\n */\n exports.title = function(_x) {\n if (!arguments.length) {\n return title;\n }\n title = _x;\n return this;\n };\n\n /**\n * Updates the position and content of the tooltip\n * @param {Object} dataPoint Datapoint of the hovered element\n * @param {Array} mousePosition Mouse position relative to the parent chart [x, y]\n * @param {Array} chartSize Parent chart size [x, y]\n * @return {module} Current component\n */\n exports.update = function(dataPoint, mousePosition, chartSize) {\n updateTooltip(dataPoint, mousePosition, chartSize);\n\n return this;\n };\n\n return exports;\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/mini-tooltip.js","define(function(require){\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Ease = require('d3-ease');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n const {exportChart} = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n\n /**\n * @typedef SparklineChartData\n * @type {Object[]}\n * @property {Number} value Value of the group (required)\n * @property {String} name Name of the group (required)\n *\n * @example\n * [\n * {\n * value: 1,\n * date: '2011-01-06T00:00:00Z'\n * },\n * {\n * value: 2,\n * date: '2011-01-07T00:00:00Z'\n * }\n */\n\n /**\n * Sparkline Chart reusable API module that allows us\n * rendering a sparkline configurable chart.\n *\n * @module Sparkline\n * @tutorial sparkline\n * @requires d3\n *\n * @example\n * var sparkLineChart = sparkline();\n *\n * sparkLineChart\n * .width(200)\n * .height(100);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(sparkLineChart);\n *\n */\n return function module(){\n\n let margin = {\n left: 5,\n right: 5,\n top: 5,\n bottom: 5\n },\n width = 100,\n height = 30,\n\n xScale,\n yScale,\n\n areaGradient = ['#F5FDFF', '#F6FEFC'],\n lineGradient = colorHelper.colorGradients.greenBlue,\n\n svg,\n chartWidth, chartHeight,\n data,\n\n hasArea = true,\n isAnimated = false,\n clipDuration = 3000,\n ease = d3Ease.easeQuadInOut,\n\n line,\n\n markerSize = 1.5,\n\n valueLabel = 'value',\n dateLabel = 'date',\n\n // getters\n getDate = ({date}) => date,\n getValue = ({value}) => value;\n\n /**\n * This function creates the graph using the selection and data provided\n *\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {SparklineChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n\n buildScales();\n buildSVG(this);\n createGradients();\n createMaskingClip();\n drawLine();\n drawArea();\n drawEndMarker();\n });\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * NOTE: The order of drawing of this group elements is really important,\n * as everything else will be drawn on top of them\n * @private\n */\n function buildContainerGroups(){\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Creates the x, y and color scales of the chart\n * @private\n */\n function buildScales(){\n xScale = d3Scale.scaleLinear()\n .domain(d3Array.extent(data, getDate))\n .range([0, chartWidth]);\n\n yScale = d3Scale.scaleLinear()\n .domain(d3Array.extent(data, getValue))\n .range([chartHeight, 0]);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container){\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart sparkline', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Cleaning data adding the proper format\n * @param {array} data Data\n * @private\n */\n function cleanData(data) {\n return data.map((d) => {\n d.date = new Date(d[dateLabel]);\n d.value = +d[valueLabel];\n\n return d;\n });\n }\n\n /**\n * Creates the gradient on the area below the line\n * @return {void}\n */\n function createGradients() {\n let metadataGroup = svg.select('.metadata-group');\n\n metadataGroup.append('linearGradient')\n .attr('id', 'sparkline-area-gradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', 0)\n .attr('x2', xScale(data[data.length - 1].date))\n .attr('y1', 0)\n .attr('y2', 0)\n .selectAll('stop')\n .data([\n {offset: '0%', color: areaGradient[0]},\n {offset: '100%', color: areaGradient[1]}\n ])\n .enter().append('stop')\n .attr('offset', ({offset}) => offset)\n .attr('stop-color', ({color}) => color);\n\n metadataGroup.append('linearGradient')\n .attr('id', 'sparkline-line-gradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', 0)\n .attr('x2', xScale(data[data.length - 1].date))\n .attr('y1', 0)\n .attr('y2', 0)\n .selectAll('stop')\n .data([\n {offset: '0%', color: lineGradient[0]},\n {offset: '100%', color: lineGradient[1]}\n ])\n .enter().append('stop')\n .attr('offset', ({offset}) => offset)\n .attr('stop-color', ({color}) => color);\n }\n\n /**\n * Creates a masking clip that would help us fake an animation if the\n * proper flag is true\n *\n * @return {void}\n */\n function createMaskingClip() {\n if (isAnimated) {\n svg.select('.metadata-group')\n .append('clipPath')\n .attr('id', 'maskingClip')\n .append('rect')\n .attr('width', 0)\n .attr('height', height);\n\n d3Selection.select('#maskingClip rect')\n .transition()\n .ease(ease)\n .duration(clipDuration)\n .attr('width', width);\n }\n }\n\n /**\n * Draws the area that will be placed below the line\n * @private\n */\n function drawArea(){\n let area = d3Shape.area()\n .x(({date}) => xScale(date))\n .y0(() => yScale(0))\n .y1(({value}) => yScale(value))\n .curve(d3Shape.curveBasis);\n\n svg.select('.chart-group')\n .append('path')\n .datum(data)\n .attr('class', 'sparkline-area')\n .attr('d', area)\n .attr('clip-path', 'url(#maskingClip)');\n }\n\n /**\n * Draws the line element within the chart group\n * @private\n */\n function drawLine(){\n line = d3Shape.line()\n .curve(d3Shape.curveBasis)\n .x(({date}) => xScale(date))\n .y(({value}) => yScale(value));\n\n svg.select('.chart-group')\n .append('path')\n .datum(data)\n .attr('class', 'line')\n .attr('d', line)\n .attr('clip-path', 'url(#maskingClip)');\n }\n\n /**\n * Draws a marker at the end of the sparkline\n */\n function drawEndMarker(){\n svg.selectAll('.chart-group')\n .append('circle')\n .attr('class', 'sparkline-circle')\n .attr('cx', xScale(data[data.length - 1].date))\n .attr('cy', yScale(data[data.length - 1].value))\n .attr('r', markerSize);\n }\n\n // Accessors\n /**\n * Gets or Sets the dateLabel of the chart\n * @param {Number} _x Desired dateLabel for the graph\n * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n * @public\n */\n exports.dateLabel = function(_x) {\n if (!arguments.length) {\n return dateLabel;\n }\n dateLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the duration of the animation\n * @param {Number} _x Desired animation duration for the graph\n * @return { dateLabel | module} Current animation duration or Chart module to chain calls\n * @public\n */\n exports.duration = function(_x) {\n if (!arguments.length) {\n return clipDuration;\n }\n clipDuration = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the areaGradient of the chart\n * @param {String[]} _x Desired areaGradient for the graph\n * @return { areaGradient | module} Current areaGradient or Chart module to chain calls\n * @public\n */\n exports.areaGradient = function(_x) {\n if (!arguments.length) {\n return areaGradient;\n }\n areaGradient = _x;\n return this;\n };\n\n /**\n * Gets or Sets the lineGradient of the chart\n * @param {String[]} _x Desired lineGradient for the graph\n * @return { lineGradient | module} Current lineGradient or Chart module to chain calls\n * @public\n */\n exports.lineGradient = function(_x) {\n if (!arguments.length) {\n return lineGradient;\n }\n lineGradient = _x;\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { height | module} Current height or Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { margin | module} Current margin or Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return { width | module} Current width or Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/sparkline.js","define(function(require){\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Collection = require('d3-collection');\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n const d3TimeFormat = require('d3-time-format');\n\n const assign = require('lodash.assign');\n const {exportChart} = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n const {\n getXAxisSettings,\n getLocaleDateFormatter\n } = require('./helpers/timeAxis');\n const {isInteger} = require('./helpers/common');\n const {axisTimeCombinations} = require('./helpers/constants');\n\n const {\n formatIntegerValue,\n formatDecimalValue\n } = require('./helpers/formatHelpers');\n\n const uniq = (arrArg) => arrArg.filter((elem, pos, arr) => arr.indexOf(elem) === pos);\n\n\n /**\n * @typdef D3Layout\n * @type function\n */\n\n /**\n * @typedef areaChartData\n * @type {Object}\n * @property {Object[]} data All data entries\n * @property {String} date Date of the entry\n * @property {String} name Name of the entry\n * @property {Number} value Value of the entry\n *\n * @example\n * {\n * 'data': [\n * {\n * \"date\": \"2011-01-05T00:00:00Z\",\n * \"name\": \"Direct\",\n * \"value\": 0\n * }\n * ]\n * }\n */\n\n /**\n * Stacked Area Chart reusable API module that allows us\n * rendering a multi area and configurable chart.\n *\n * @module Stacked-area\n * @tutorial stacked-area\n * @requires d3-array, d3-axis, d3-collection, d3-ease, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n *\n * @example\n * let stackedArea = stackedArea();\n *\n * stackedArea\n * .width(containerWidth);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset.data)\n * .call(stackedArea);\n *\n */\n\n return function module() {\n\n let margin = {\n top: 70,\n right: 30,\n bottom: 60,\n left: 70\n },\n width = 960,\n height = 500,\n\n xScale, xAxis, xMonthAxis,\n yScale, yAxis,\n\n aspectRatio = null,\n\n monthAxisPadding = 30,\n yTicks = 5,\n yTickTextYOffset = -8,\n yTickTextXOffset = -20,\n tickPadding = 5,\n\n colorSchema = colorHelper.colorSchemas.britecharts,\n\n areaOpacity = 0.64,\n categoryColorMap,\n order,\n\n xAxisFormat = null,\n xTicks = null,\n xAxisCustomFormat = null,\n locale,\n\n baseLine,\n\n layers,\n layersInitial,\n area,\n\n // Area Animation\n maxAreaNumber = 8,\n areaAnimationDelayStep = 20,\n areaAnimationDelays = d3Array.range(areaAnimationDelayStep, maxAreaNumber* areaAnimationDelayStep, areaAnimationDelayStep),\n\n overlay,\n\n verticalMarkerContainer,\n verticalMarker,\n epsilon,\n\n dataPoints = {},\n pointsSize = 1.5,\n pointsColor = '#c0c6cc',\n pointsBorderColor = '#ffffff',\n\n isAnimated = false,\n ease = d3Ease.easeQuadInOut,\n areaAnimationDuration = 1000,\n\n svg,\n chartWidth, chartHeight,\n data,\n dataByDate,\n dataByDateFormatted,\n dataByDateZeroed,\n\n verticalGridLines,\n horizontalGridLines,\n grid = null,\n\n tooltipThreshold = 480,\n\n xAxisPadding = {\n top: 0,\n left: 15,\n bottom: 0,\n right: 0\n },\n\n dateLabel = 'date',\n valueLabel = 'value',\n keyLabel = 'name',\n\n // getters\n getName = ({name}) => name,\n getDate = ({date}) => date,\n\n // events\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\n /**\n * This function creates the graph using the selection and data provided\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {areaChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data) {\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n dataByDate = getDataByDate(data);\n\n buildLayers();\n buildScales();\n buildSVG(this);\n buildAxis();\n drawAxis();\n drawStackedAreas();\n\n if (shouldShowTooltip()) {\n drawHoverOverlay();\n drawVerticalMarker();\n addMouseEvents();\n }\n });\n }\n\n /**\n * Adds events to the container group if the environment is not mobile\n * Adding: mouseover, mouseout and mousemove\n */\n function addMouseEvents() {\n svg\n .on('mouseover', function(d) {\n handleMouseOver(this, d);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d);\n });\n }\n\n /**\n * Formats the value depending on its characteristics\n * @param {Number} value Value to format\n * @return {Number} Formatted value\n */\n function getFormattedValue(value) {\n let format;\n\n if (isInteger(value)) {\n format = formatIntegerValue;\n } else {\n format = formatDecimalValue;\n }\n\n return format(value);\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis() {\n let dataSpan = yScale.domain()[1] - yScale.domain()[0];\n let yTickNumber = dataSpan < yTicks - 1 ? dataSpan : yTicks;\n let minor, major;\n\n if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n minor = {\n tick: xTicks,\n format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n };\n major = null;\n } else {\n ({minor, major} = getXAxisSettings(dataByDate, width, xAxisFormat, locale));\n\n xMonthAxis = d3Axis.axisBottom(xScale)\n .ticks(major.tick)\n .tickSize(0, 0)\n .tickFormat(major.format);\n }\n\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(minor.tick)\n .tickSize(10, 0)\n .tickPadding(tickPadding)\n .tickFormat(minor.format);\n\n\n yAxis = d3Axis.axisRight(yScale)\n .ticks(yTickNumber)\n .tickSize([0])\n .tickPadding(tickPadding)\n .tickFormat(getFormattedValue);\n\n drawGridLines(minor.tick, yTickNumber);\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * NOTE: The order of drawing of this group elements is really important,\n * as everything else will be drawn on top of them\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g').classed('x-axis-group', true)\n .append('g').classed('x axis', true);\n container.selectAll('.x-axis-group')\n .append('g').classed('month-axis', true);\n container\n .append('g').classed('y-axis-group axis', true);\n container\n .append('g').classed('grid-lines-group', true);\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Builds the stacked layers layout\n * @return {D3Layout} Layout for drawing the chart\n * @private\n */\n function buildLayers() {\n dataByDateFormatted = dataByDate\n .map(d => assign({}, d, d.values))\n .map(d => {\n Object.keys(d).forEach(k => {\n const entry = d[k];\n\n if (entry && entry.name) {\n d[entry.name] = entry.value;\n }\n });\n\n return assign({}, d, {\n date: new Date(d['key'])\n });\n });\n\n dataByDateZeroed = dataByDate\n .map(d => assign({}, d, d.values))\n .map(d => {\n Object.keys(d).forEach(k => {\n const entry = d[k];\n\n if (entry && entry.name) {\n d[entry.name] = 0;\n }\n });\n\n return assign({}, d, {\n date: new Date(d['key'])\n });\n });\n\n let initialTotalsObject = uniq(data.map(({name}) => name))\n .reduce((memo, key) => (\n assign({}, memo, {[key]: 0})\n ), {});\n\n let totals = data.reduce((memo, item) => (\n assign({}, memo, {[item.name]: memo[item.name] += item.value})\n ), initialTotalsObject);\n\n order = formatOrder(totals);\n\n let stack3 = d3Shape.stack()\n .keys(order)\n .order(d3Shape.stackOrderNone)\n .offset(d3Shape.stackOffsetNone);\n\n layersInitial = stack3(dataByDateZeroed);\n layers = stack3(dataByDateFormatted);\n }\n\n /**\n * Takes an object with all topics as keys and their aggregate totals as values,\n * sorts them into a list by descending total value and\n * moves \"Other\" to the end\n * @param {Object} totals Keys of all the topics and their corresponding totals\n * @return {Array} List of topic names in aggregate order\n */\n function formatOrder(totals) {\n let order = Object.keys(totals)\n .sort((a, b) => {\n if (totals[a] > totals[b]) return -1;\n if (totals[a] === totals[b]) return 0;\n return 1;\n });\n\n let otherIndex = order.indexOf('Other');\n\n if (otherIndex >= 0) {\n let other = order.splice(otherIndex, 1);\n\n order = order.concat(other);\n }\n\n return order;\n }\n\n /**\n * Creates the x, y and color scales of the chart\n * @private\n */\n function buildScales() {\n xScale = d3Scale.scaleTime()\n .domain(d3Array.extent(dataByDate, ({date}) => date))\n .rangeRound([0, chartWidth]);\n\n yScale = d3Scale.scaleLinear()\n .domain([0, getMaxValueByDate()])\n .rangeRound([chartHeight, 0])\n .nice();\n\n categoryColorMap = order.reduce((memo, topic, index) => (\n assign({}, memo, {[topic]: colorSchema[index]})\n ), {});\n }\n\n /**\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart stacked-area', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Parses dates and values into JS Date objects and numbers\n * @param {obj} data Raw data from JSON file\n * @return {obj} Parsed data with values and dates\n */\n function cleanData(data) {\n return data.map((d) => {\n d.date = new Date(d[dateLabel]),\n d.value = +d[valueLabel]\n\n return d;\n });\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis() {\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate( 0, ${chartHeight} )`)\n .call(xAxis);\n\n if (xAxisFormat !== 'custom') {\n svg.select('.x-axis-group .month-axis')\n .attr('transform', `translate(0, ${(chartHeight + monthAxisPadding)})`)\n .call(xMonthAxis);\n }\n\n svg.select('.y-axis-group.axis')\n .attr('transform', `translate( ${-xAxisPadding.left}, 0)`)\n .call(yAxis)\n .call(adjustYTickLabels);\n\n // Moving the YAxis tick labels to the right side\n // d3Selection.selectAll('.y-axis-group .tick text')\n // .attr('transform', `translate( ${-chartWidth - yTickTextXOffset}, ${yTickTextYOffset})` );\n }\n\n /**\n * Adjusts the position of the y axis' ticks\n * @param {D3Selection} selection Y axis group\n * @return void\n */\n function adjustYTickLabels(selection) {\n selection.selectAll('.tick text')\n .attr('transform', `translate(${yTickTextXOffset}, ${yTickTextYOffset})`);\n }\n\n /**\n * Creates SVG dot elements for each data entry and draws them\n * TODO: Plug\n */\n function drawDataReferencePoints() {\n // Creates Dots on Data points\n var points = svg.select('.chart-group').selectAll('.dots')\n .data(layers)\n .enter().append('g')\n .attr('class', 'dots')\n .attr('d', ({values}) => area(values))\n .attr('clip-path', 'url(#clip)');\n\n // Processes the points\n // TODO: Optimize this code\n points.selectAll('.dot')\n .data(({values}, index) => values.map((point) => ({index, point})))\n .enter()\n .append('circle')\n .attr('class','dot')\n .attr('r', () => pointsSize)\n .attr('fill', () => pointsColor)\n .attr('stroke-width', '0')\n .attr('stroke', pointsBorderColor)\n .attr('transform', function(d) {\n let {point} = d;\n let key = xScale(point.date);\n\n dataPoints[key] = dataPoints[key] || [];\n dataPoints[key].push(d);\n\n let {date, y, y0} = point;\n\n return `translate( ${xScale(date)}, ${yScale(y + y0)} )`;\n });\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines(xTicks, yTicks) {\n if (grid === 'horizontal' || grid === 'full') {\n horizontalGridLines = svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(yScale.ticks(yTicks))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (-xAxisPadding.left - 30))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d));\n }\n\n if (grid === 'vertical' || grid === 'full') {\n verticalGridLines = svg.select('.grid-lines-group')\n .selectAll('line.vertical-grid-line')\n .data(xScale.ticks(xTicks))\n .enter()\n .append('line')\n .attr('class', 'vertical-grid-line')\n .attr('y1', 0)\n .attr('y2', chartHeight)\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d));\n }\n\n //draw a horizontal line to extend x-axis till the edges\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (-xAxisPadding.left - 30))\n .attr('x2', chartWidth)\n .attr('y1', height - margin.bottom - margin.top)\n .attr('y2', height - margin.bottom - margin.top);\n }\n\n /**\n * Draws an overlay element over the graph\n * @private\n */\n function drawHoverOverlay() {\n overlay = svg.select('.metadata-group')\n .append('rect')\n .attr('class', 'overlay')\n .attr('y1', 0)\n .attr('y2', chartHeight)\n .attr('height', chartHeight)\n .attr('width', chartWidth)\n .attr('fill', 'rgba(0,0,0,0)')\n .style('display', 'none');\n }\n\n /**\n * Draws the different areas into the chart-group element\n * @private\n */\n function drawStackedAreas() {\n let series;\n\n area = d3Shape.area()\n .curve(d3Shape.curveMonotoneX)\n .x( ({data}) => xScale(data.date) )\n .y0( (d) => yScale(d[0]) )\n .y1( (d) => yScale(d[1]) );\n\n if (isAnimated) {\n series = svg.select('.chart-group').selectAll('.layer')\n .data(layersInitial)\n .enter()\n .append('g')\n .classed('layer-container', true);\n\n series\n .append('path')\n .attr('class', 'layer')\n .attr('d', area)\n .style('fill', ({key}) => categoryColorMap[key]);\n\n // Update\n svg.select('.chart-group').selectAll('.layer')\n .data(layers)\n .transition()\n .delay( (_, i) => areaAnimationDelays[i])\n .duration(areaAnimationDuration)\n .ease(ease)\n .attr('d', area)\n .style('opacity', areaOpacity)\n .style('fill', ({key}) => categoryColorMap[key]);\n } else {\n series = svg.select('.chart-group').selectAll('.layer')\n .data(layers)\n .enter()\n .append('g')\n .classed('layer-container', true);\n\n series\n .append('path')\n .attr('class', 'layer')\n .attr('d', area)\n .style('fill', ({key}) => categoryColorMap[key]);\n\n // Update\n series\n .attr('d', area)\n .style('opacity', areaOpacity)\n .style('fill', ({key}) => categoryColorMap[key]);\n }\n\n // Exit\n series.exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Creates the vertical marker\n * @return void\n */\n function drawVerticalMarker() {\n verticalMarkerContainer = svg.select('.metadata-group')\n .append('g')\n .attr('class', 'vertical-marker-container')\n .attr('transform', 'translate(9999, 0)');\n\n verticalMarker = verticalMarkerContainer.selectAll('path')\n .data([{\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0\n }])\n .enter()\n .append('line')\n .classed('vertical-marker', true)\n .attr('x1', 0)\n .attr('y1', chartHeight)\n .attr('x2', 0)\n .attr('y2', 0);\n }\n\n /**\n * Removes all the datapoints highlighter circles added to the marker container\n * @return void\n */\n function eraseDataPointHighlights() {\n verticalMarkerContainer.selectAll('.circle-container').remove();\n }\n\n /**\n * Orders the data by date for consumption on the chart tooltip\n * @param {areaChartData} data Chart data\n * @return {Object[]} Chart data ordered by date\n * @private\n */\n function getDataByDate(data) {\n return d3Collection.nest()\n .key(getDate)\n .entries(\n data.sort((a, b) => a.date - b.date)\n )\n .map(d => {\n return assign({}, d, {\n date: new Date(d.key)\n });\n });\n\n // let b = d3Collection.nest()\n // .key(getDate).sortKeys(d3Array.ascending)\n // .entries(data);\n }\n\n /**\n * Computes the maximum sum of values for any date\n *\n * @return {Number} Max value\n */\n function getMaxValueByDate() {\n let keys = uniq(data.map(o => o.name));\n let maxValueByDate = d3Array.max(dataByDateFormatted, function(d){\n let vals = keys.map((key) => d[key]);\n\n return d3Array.sum(vals);\n });\n\n return maxValueByDate;\n }\n\n /**\n * Extract X position on the chart from a given mouse event\n * @param {obj} event D3 mouse event\n * @return {Number} Position on the x axis of the mouse\n * @private\n */\n function getMouseXPosition(event) {\n return d3Selection.mouse(event)[0];\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseX X position of the mouse\n * @return {obj} Data entry that is closer to that x axis position\n */\n function getNearestDataPoint(mouseX) {\n let points = dataByDate.filter(({date}) => Math.abs(xScale(date) - mouseX) <= epsilon);\n\n if (points.length) {\n return points[0];\n }\n }\n\n /**\n * Epsilon is the value given to the number representing half of the distance in\n * pixels between two date data points\n * @return {Number} half distance between any two points\n */\n function setEpsilon() {\n let dates = dataByDate.map(({date}) => date);\n\n epsilon = (xScale(dates[1]) - xScale(dates[0])) / 2;\n }\n\n /**\n * MouseMove handler, calculates the nearest dataPoint to the cursor\n * and updates metadata related to it\n * @private\n */\n function handleMouseMove(e) {\n epsilon || setEpsilon();\n\n let dataPoint = getNearestDataPoint(getMouseXPosition(e) - margin.left),\n dataPointXPosition;\n\n if (dataPoint) {\n dataPointXPosition = xScale(new Date( dataPoint.key ));\n // Move verticalMarker to that datapoint\n moveVerticalMarker(dataPointXPosition);\n // Add data points highlighting\n highlightDataPoints(dataPoint);\n // Emit event with xPosition for tooltip or similar feature\n dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, dataPointXPosition);\n }\n }\n\n /**\n * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n * It also resets the container of the vertical marker\n * @private\n */\n function handleMouseOut(e, d) {\n overlay.style('display', 'none');\n verticalMarker.classed('bc-is-active', false);\n verticalMarkerContainer.attr('transform', 'translate(9999, 0)');\n\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n * @private\n */\n function handleMouseOver(e, d) {\n overlay.style('display', 'block');\n verticalMarker.classed('bc-is-active', true);\n\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Creates coloured circles marking where the exact data y value is for a given data point\n * @param {obj} dataPoint Data point to extract info from\n * @private\n */\n function highlightDataPoints({values}) {\n let accumulator = 0;\n\n eraseDataPointHighlights();\n\n // ensure order stays constant\n values = values\n .filter(v => !!v)\n .sort((a,b) => order.indexOf(a.name) > order.indexOf(b.name))\n\n values.forEach(({name}, index) => {\n let marker = verticalMarkerContainer\n .append('g')\n .classed('circle-container', true),\n circleSize = 12;\n\n accumulator = accumulator + values[index][valueLabel];\n\n marker.append('circle')\n .classed('data-point-highlighter', true)\n .attr('cx', circleSize)\n .attr('cy', 0)\n .attr('r', 5)\n .style('stroke-width', 2)\n .style('stroke', categoryColorMap[name]);\n\n marker.attr('transform', `translate( ${(- circleSize)}, ${(yScale(accumulator))} )` );\n });\n }\n\n /**\n * Helper method to update the x position of the vertical marker\n * @param {obj} dataPoint Data entry to extract info\n * @return void\n */\n function moveVerticalMarker(verticalMarkerXPosition) {\n verticalMarkerContainer.attr('transform', `translate(${verticalMarkerXPosition},0)`);\n }\n\n /**\n * Determines if we should add the tooltip related logic depending on the\n * size of the chart and the tooltipThreshold variable value\n * @return {boolean} Should we build the tooltip?\n * @private\n */\n function shouldShowTooltip() {\n return width > tooltipThreshold;\n }\n\n\n // API\n\n /**\n * Gets or Sets the opacity of the stacked areas in the chart (all of them will have the same opacity)\n * @param {Object} _x Opacity to get/set\n * @return { opacity | module} Current opacity or Area Chart module to chain calls\n * @public\n */\n exports.areaOpacity = function(_x) {\n if (!arguments.length) {\n return areaOpacity;\n }\n areaOpacity = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the aspect ratio of the chart\n * @param {Number} _x Desired aspect ratio for the graph\n * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n * @public\n */\n exports.aspectRatio = function(_x) {\n if (!arguments.length) {\n return aspectRatio;\n }\n aspectRatio = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the dateLabel of the chart\n * @param {Number} _x Desired dateLabel for the graph\n * @return { dateLabel | module} Current dateLabel or Chart module to chain calls\n * @public\n */\n exports.dateLabel = function(_x) {\n if (!arguments.length) {\n return dateLabel;\n }\n dateLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the grid mode.\n *\n * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n * @public\n */\n exports.grid = function(_x) {\n if (!arguments.length) {\n return grid;\n }\n grid = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { height | module} Current height or Area Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n if (aspectRatio) {\n width = Math.ceil(_x / aspectRatio);\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the keyLabel of the chart\n * @param {Number} _x Desired keyLabel for the graph\n * @return { keyLabel | module} Current keyLabel or Chart module to chain calls\n * @public\n */\n exports.keyLabel = function(_x) {\n if (!arguments.length) {\n return keyLabel;\n }\n keyLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { margin | module} Current margin or Area Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the minimum width of the graph in order to show the tooltip\n * NOTE: This could also depend on the aspect ratio\n *\n * @param {Object} _x Margin object to get/set\n * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n * @public\n */\n exports.tooltipThreshold = function(_x) {\n if (!arguments.length) {\n return tooltipThreshold;\n }\n tooltipThreshold = _x;\n\n return this;\n };\n\n /**\n * Pass language tag for the tooltip to localize the date.\n * Feature uses Intl.DateTimeFormat, for compatability and support, refer to\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {String} _x must be a language tag (BCP 47) like 'en-US' or 'fr-FR'\n * @return { (String|Module) } Current locale or module to chain calls\n */\n exports.locale = function(_x) {\n if (!arguments.length) {\n return locale;\n }\n locale = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Exposes the constants to be used to force the x axis to respect a certain granularity\n * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n * @example\n * area.xAxisFormat(area.axisTimeCombinations.HOUR_DAY)\n */\n exports.axisTimeCombinations = axisTimeCombinations;\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return {Number | module} Current width or Area Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n if (aspectRatio) {\n height = Math.ceil(_x * aspectRatio);\n }\n width = _x;\n\n return this;\n }; \n\n /**\n * Exposes the ability to force the chart to show a certain x format\n * It requires a `xAxisFormat` of 'custom' in order to work.\n * NOTE: localization not supported\n * @param {String} _x Desired format for x axis\n * @return {String | Module} Current format or module to chain calls\n */\n exports.xAxisCustomFormat = function(_x) {\n if (!arguments.length) {\n return xAxisCustomFormat;\n }\n xAxisCustomFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x axis grouping\n * @param {String} _x Desired format\n * @return {String | Module} Current format or module to chain calls\n * @example\n * area.xAxisFormat(area.axisTimeCombinations.HOUR_DAY)\n */\n exports.xAxisFormat = function(_x) {\n if (!arguments.length) {\n return xAxisFormat;\n }\n xAxisFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisFormat` of 'custom' in order to work.\n * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n * how many and where the ticks will appear.\n *\n * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n * @return {Number | Module} Current number or ticks or module to chain calls\n */\n exports.xTicks = function(_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the y axis on the chart\n * (Default is 5)\n * @param {Number} _x Desired vertical ticks\n * @return {Number | module} Current vertical ticks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function(_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n\n return this;\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/stacked-area.js","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max;\n\n/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */\nvar nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = assign;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash.assign/index.js\n// module id = 35\n// module chunks = 0","define(function (require) {\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Color = require('d3-color');\n const d3Collection = require('d3-collection');\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Interpolate = require('d3-interpolate');\n const d3Scale = require('d3-scale');\n const d3Selection = require('d3-selection');\n const assign = require('lodash.assign');\n const d3Transition = require('d3-transition');\n\n const { exportChart } = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n const NUMBER_FORMAT = ',f';\n const uniq = (arrArg) => arrArg.filter((elem, pos, arr) => arr.indexOf(elem) == pos);\n\n\n /**\n * @typdef D3Layout\n * @type function\n */\n\n /**\n * @typedef GroupedBarChartData\n * @type {Object}\n * @property {Object[]} data All data entries\n * @property {String} name Name of the entry\n * @property {String} group group of the entry\n * @property {Number} value Value of the entry\n *\n * @example\n * {\n * 'data': [\n * {\n * \"name\": \"2011-01\",\n * \"group\": \"Direct\",\n * \"value\": 0\n * }\n * ]\n * }\n */\n\n /**\n * Grouped Bar Chart reusable API module that allows us\n * rendering a multi grouped bar and configurable chart.\n *\n * @module Grouped-bar\n * @tutorial grouped-bar\n * @requires d3-array, d3-axis, d3-color, d3-collection, d3-dispatch, d3-ease,\n * d3-interpolate, d3-scale, d3-selection, lodash assign\n *\n * @example\n * let groupedBar = GroupedBar();\n *\n * groupedBar\n * .width(containerWidth);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset.data)\n * .call(groupedBar);\n *\n */\n return function module() {\n\n let margin = {\n top: 40,\n right: 30,\n bottom: 60,\n left: 70\n },\n width = 960,\n height = 500,\n\n xScale,\n xScale2,\n xAxis,\n yScale,\n yScale2,\n yAxis,\n\n aspectRatio = null,\n\n yTickTextYOffset = -8,\n yTickTextXOffset = -20,\n\n yTicks = 5,\n xTicks = 5,\n baseLine,\n\n colorSchema = colorHelper.colorSchemas.britecharts,\n\n colorScale,\n categoryColorMap,\n\n layers,\n\n ease = d3Ease.easeQuadInOut,\n isHorizontal = false,\n\n svg,\n chartWidth, chartHeight,\n data,\n groups,\n\n transformedData,\n\n tooltipThreshold = 480,\n\n xAxisPadding = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n },\n maxBarNumber = 8,\n barOpacity = 0.24,\n\n animationDelayStep = 20,\n animationDelays = d3Array.range(animationDelayStep, maxBarNumber * animationDelayStep, animationDelayStep),\n animationDuration = 1000,\n\n grid = null,\n\n nameLabel = 'name',\n valueLabel = 'value',\n groupLabel = 'group',\n valueLabelFormat = NUMBER_FORMAT,\n\n // getters\n getName = ({name}) => name,\n getValue = ({value}) => value,\n getGroup = ({group}) => group,\n isAnimated = false,\n\n // events\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\n /**\n * This function creates the graph using the selection and data provided\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {GroupedBarChartData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function (_data) {\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n\n prepareData(data);\n buildScales();\n buildLayers();\n buildSVG(this);\n drawGridLines();\n buildAxis();\n drawAxis();\n drawGroupedBar();\n addMouseEvents();\n });\n }\n\n /**\n * Adds events to the container group if the environment is not mobile\n * Adding: mouseover, mouseout and mousemove\n */\n function addMouseEvents() {\n if (shouldShowTooltip()) {\n svg\n .on('mouseover', function(d) {\n handleMouseOver(this, d);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d);\n });\n }\n\n svg.selectAll('.bar')\n .on('mouseover', function(d) {\n handleBarsMouseOver(this, d);\n })\n .on('mouseout', function(d) {\n handleBarsMouseOut(this, d);\n });\n }\n\n /**\n * Adjusts the position of the y axis' ticks\n * @param {D3Selection} selection Y axis group\n * @return void\n */\n function adjustYTickLabels(selection) {\n selection.selectAll('.tick text')\n .attr('transform', `translate(${yTickTextXOffset}, ${yTickTextYOffset})`);\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis() {\n if (isHorizontal) {\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(xTicks, valueLabelFormat);\n yAxis = d3Axis.axisLeft(yScale)\n } else {\n xAxis = d3Axis.axisBottom(xScale)\n yAxis = d3Axis.axisLeft(yScale)\n .ticks(yTicks, valueLabelFormat)\n }\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * NOTE: The order of drawing of this group elements is really important,\n * as everything else will be drawn on top of them\n * @private\n */\n function buildContainerGroups() {\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g').classed('x-axis-group', true)\n .append('g').classed('x axis', true);\n container.selectAll('.x-axis-group')\n .append('g').classed('month-axis', true);\n container\n .append('g').classed('y-axis-group axis', true);\n container\n .append('g').classed('grid-lines-group', true);\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Builds the grouped layers layout\n * @return {D3Layout} Layout for drawing the chart\n * @private\n */\n function buildLayers() {\n layers = transformedData.map((item) => {\n let ret = {};\n\n groups.forEach((key) => {\n ret[key] = item[key];\n });\n\n return assign({}, item, ret);\n });\n }\n\n /**\n * Creates the x, y and color scales of the chart\n * @private\n */\n function buildScales() {\n let yMax = d3Array.max(data.map(getValue));\n\n if (isHorizontal) {\n xScale = d3Scale.scaleLinear()\n .domain([0, yMax])\n .rangeRound([0, chartWidth - 1]);\n // 1 pix for edge tick\n\n yScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([chartHeight, 0])\n .padding(0.1);\n\n yScale2 = d3Scale.scaleBand()\n .domain(data.map(getGroup))\n .rangeRound([yScale.bandwidth(), 0])\n .padding(0.1);\n } else {\n xScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([0, chartWidth])\n .padding(0.1);\n xScale2 = d3Scale.scaleBand()\n .domain(data.map(getGroup))\n .rangeRound([0, xScale.bandwidth()])\n .padding(0.1);\n\n yScale = d3Scale.scaleLinear()\n .domain([0, yMax])\n .rangeRound([chartHeight, 0])\n .nice();\n }\n\n colorScale = d3Scale.scaleOrdinal()\n .range(colorSchema)\n .domain(data.map(getGroup));\n\n categoryColorMap = colorScale\n .domain(data.map(getName)).domain()\n .reduce((memo, item) => {\n data.forEach(function (v) {\n if (getName(v) == item) {\n memo[v.name] = colorScale(v.group)\n memo[v.group] = colorScale(v.group)\n memo[v.group + item] = colorScale(v.group)\n }\n })\n return memo;\n }, {});\n }\n\n /**\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart grouped-bar', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Parses dates and values into JS Date objects and numbers\n * @param {obj} data Raw data from JSON file\n * @return {obj} Parsed data with values and dates\n */\n function cleanData(data) {\n return data.map((d) => {\n d.value = +d[valueLabel];\n d.group = d[groupLabel];\n // for tooltip\n d.topicName = getGroup(d);\n d.name = d[nameLabel];\n\n return d;\n });\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis() {\n if (isHorizontal) {\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate( 0, ${chartHeight} )`)\n .call(xAxis);\n\n svg.select('.y-axis-group.axis')\n .attr('transform', `translate( ${-xAxisPadding.left}, 0)`)\n .call(yAxis);\n } else {\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate( 0, ${chartHeight} )`)\n .call(xAxis);\n\n svg.select('.y-axis-group.axis')\n .attr('transform', `translate( ${-xAxisPadding.left}, 0)`)\n .call(yAxis)\n .call(adjustYTickLabels);\n }\n }\n\n /**\n * Draws a vertical line to extend x-axis till the edges\n * @return {void}\n */\n function drawHorizontalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', chartHeight)\n .attr('y2', chartHeight);\n }\n\n /**\n * Draws a vertical line to extend y-axis till the edges\n * @return {void}\n */\n function drawVerticalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-y-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-y-line')\n .attr('y1', (xAxisPadding.bottom))\n .attr('y2', chartHeight)\n .attr('x1', 0)\n .attr('x2', 0);\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines() {\n let scale = isHorizontal ? xScale : yScale;\n\n if (grid === 'horizontal' || grid === 'full') {\n svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(scale.ticks(yTicks).slice(1))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (-xAxisPadding.left + 1))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d));\n }\n\n if (grid === 'vertical' || grid === 'full') {\n svg.select('.grid-lines-group')\n .selectAll('line.vertical-grid-line')\n .data(scale.ticks(xTicks).slice(1))\n .enter()\n .append('line')\n .attr('class', 'vertical-grid-line')\n .attr('y1', 0)\n .attr('y2', chartHeight)\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d));\n }\n\n if (isHorizontal) {\n drawVerticalExtendedLine();\n } else {\n drawHorizontalExtendedLine();\n }\n }\n\n /**\n * Draws the bars along the x axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawHorizontalBars(series) {\n // Enter + Update\n let bars = series\n .data(layers)\n .enter()\n .append('g')\n .attr('transform', function ({key}) { return `translate(0,${yScale(key)})`; })\n .classed('layer', true)\n .selectAll('.bar')\n .data(({values}) => values)\n .enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', 1)\n .attr('y', (d) => yScale2(getGroup(d)))\n .attr('height', yScale2.bandwidth())\n .attr('fill', ((data) => categoryColorMap[data.group]));\n\n if (isAnimated) {\n bars.style('opacity', barOpacity)\n .transition()\n .delay((_, i) => animationDelays[i])\n .duration(animationDuration)\n .ease(ease)\n .tween('attr.width', horizontalBarsTween);\n } else {\n bars.attr('width', (d) => xScale(getValue(d)))\n }\n }\n\n /**\n * Draws the bars along the y axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawVerticalBars(series) {\n // Enter + Update\n let bars = series\n .data(layers)\n .enter()\n .append('g')\n .attr('transform', function (d) { return 'translate(' + xScale(d.key) + ',0)'; })\n .classed('layer', true)\n .selectAll('.bar')\n .data((d) => d.values)\n .enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', (d) => xScale2(getGroup(d)))\n .attr('y', (d) => yScale(d.value))\n .attr('width', xScale2.bandwidth)\n .attr('fill', ((data) => categoryColorMap[data.group]));\n\n if (isAnimated) {\n bars.style('opacity', barOpacity)\n .transition()\n .delay((_, i) => animationDelays[i])\n .duration(animationDuration)\n .ease(ease)\n .tween('attr.height', verticalBarsTween);\n } else {\n bars.attr('height', (d) => chartHeight - yScale(getValue(d)));\n }\n }\n\n /**\n * Draws the different areas into the chart-group element\n * @private\n */\n function drawGroupedBar() {\n let series = svg.select('.chart-group').selectAll('.layer');\n\n if (isHorizontal) {\n drawHorizontalBars(series);\n } else {\n drawVerticalBars(series);\n }\n // Exit\n series.exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Extract X position on the chart from a given mouse event\n * @param {obj} event D3 mouse event\n * @return {Number} Position on the x axis of the mouse\n * @private\n */\n function getMousePosition(event) {\n return d3Selection.mouse(event);\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseX X position of the mouse\n * @return {obj} Data entry that is closer to that x axis position\n */\n function getNearestDataPoint(mouseX) {\n let adjustedMouseX = mouseX - margin.left,\n epsilon = xScale2.bandwidth(),\n nearest = [];\n\n layers.forEach(function (data) {\n let found = data.values.find((d2) => Math.abs(adjustedMouseX >= xScale(d2[nameLabel]) + xScale2(d2[groupLabel])) && Math.abs(adjustedMouseX - xScale2(d2[groupLabel]) - xScale(d2[nameLabel]) <= epsilon));\n\n if (found) {\n found.values = data.values;\n found.key = found.name;\n nearest.push(found);\n }\n\n });\n\n return nearest.length ? nearest[0] : undefined;\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseX X position of the mouse\n * @return {obj} Data entry that is closer to that x axis position\n */\n function getNearestDataPoint2(mouseY) {\n let adjustedMouseY = mouseY - margin.bottom,\n epsilon = yScale.bandwidth(),\n nearest = [];\n\n layers.map(function (data) {\n let found = data.values.find((d2) => Math.abs(adjustedMouseY >= yScale(d2[nameLabel])) && Math.abs(adjustedMouseY - yScale(d2[nameLabel]) <= epsilon * 2));\n\n if (found) {\n found.values = data.values;\n found.key = found.name;\n nearest.push(found)\n }\n });\n\n return nearest.length ? nearest[0] : undefined;\n }\n\n /**\n * Handles a mouseover event on top of a bar\n * @param {obj} e the fired event\n * @param {obj} d data of bar\n * @return {void}\n */\n function handleBarsMouseOver(e, d) {\n d3Selection.select(e)\n .attr('fill', () => d3Color.color(categoryColorMap[d.group]).darker());\n }\n\n /**\n * Handles a mouseout event out of a bar\n * @param {obj} e the fired event\n * @param {obj} d data of bar\n * @return {void}\n */\n function handleBarsMouseOut(e, d) {\n d3Selection.select(e)\n .attr('fill', () => categoryColorMap[d.group])\n }\n\n /**\n * MouseMove handler, calculates the nearest dataPoint to the cursor\n * and updates metadata related to it\n * @param {obj} e the fired event\n * @private\n */\n function handleMouseMove(e) {\n let [mouseX, mouseY] = getMousePosition(e),\n dataPoint = isHorizontal ? getNearestDataPoint2(mouseY) : getNearestDataPoint(mouseX),\n x,\n y;\n\n if (dataPoint) {\n // Move verticalMarker to that datapoint\n if (isHorizontal) {\n x = mouseX - margin.left;\n y = yScale(dataPoint.key) + yScale.bandwidth() / 2;\n } else {\n x = xScale(dataPoint.key) + xScale2(dataPoint[groupLabel]);\n y = mouseY - margin.bottom;\n }\n moveTooltipOriginXY(x, y);\n\n // Emit event with xPosition for tooltip or similar feature\n dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, x, y);\n }\n }\n\n /**\n * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n * It also resets the container of the vertical marker\n * @private\n */\n function handleMouseOut(e, d) {\n svg.select('.metadata-group').attr('transform', 'translate(9999, 0)');\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n * @private\n */\n function handleMouseOver(e, d) {\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Animation tween of horizontal bars\n * @param {obj} d data of bar\n * @return {void}\n */\n function horizontalBarsTween(d) {\n let node = d3Selection.select(this),\n i = d3Interpolate.interpolateRound(0, xScale(getValue(d))),\n j = d3Interpolate.interpolateNumber(0, 1);\n\n return function (t) {\n node.attr('width', i(t)).style('opacity', j(t));\n }\n }\n\n /**\n * Helper method to update the x position of the vertical marker\n * @param {obj} dataPoint Data entry to extract info\n * @return void\n */\n function moveTooltipOriginXY(originXPosition, originYPosition) {\n svg.select('.metadata-group')\n .attr('transform', `translate(${originXPosition},${originYPosition})`);\n }\n\n /**\n * Prepare data for create chart.\n * @private\n */\n function prepareData(data) {\n groups = uniq(data.map((d) => getGroup(d)));\n transformedData = d3Collection.nest()\n .key(getName)\n .rollup(function (values) {\n let ret = {};\n\n values.forEach((entry) => {\n if (entry && entry[groupLabel]) {\n ret[entry[groupLabel]] = getValue(entry);\n }\n });\n //for tooltip\n ret.values = values;\n return ret;\n })\n .entries(data)\n .map(function (data) {\n return assign({}, {\n total: d3Array.sum(d3Array.permute(data.value, groups)),\n key: data.key\n }, data.value);\n });\n }\n\n /**\n * Determines if we should add the tooltip related logic depending on the\n * size of the chart and the tooltipThreshold variable value\n * @return {boolean} Should we build the tooltip?\n * @private\n */\n function shouldShowTooltip() {\n return width > tooltipThreshold;\n }\n\n /**\n * Animation tween of vertical bars\n * @param {obj} d data of bar\n * @return {void}\n */\n function verticalBarsTween(d) {\n let node = d3Selection.select(this),\n i = d3Interpolate.interpolateRound(0, chartHeight - yScale(getValue(d))),\n y = d3Interpolate.interpolateRound(chartHeight, yScale(getValue(d))),\n j = d3Interpolate.interpolateNumber(0, 1);\n\n return function (t) {\n node.attr('y', y(t))\n .attr('height', i(t)).style('opacity', j(t));\n }\n }\n\n // API\n\n /**\n * Gets or Sets the aspect ratio of the chart\n * @param {Number} _x Desired aspect ratio for the graph\n * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n * @public\n */\n exports.aspectRatio = function (_x) {\n if (!arguments.length) {\n return aspectRatio;\n }\n aspectRatio = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function (_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function (filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n /**\n * Gets or Sets the groupLabel of the chart\n * @param {String} _x Desired groupLabel for the graph\n * @return { groupLabel | module} Current groupLabel or Chart module to chain calls\n * @public\n */\n exports.groupLabel = function (_x) {\n if (!arguments.length) {\n return groupLabel;\n }\n groupLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the grid mode.\n *\n * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n * @public\n */\n exports.grid = function (_x) {\n if (!arguments.length) {\n return grid;\n }\n grid = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { height | module} Current height or Area Chart module to chain calls\n * @public\n */\n exports.height = function (_x) {\n if (!arguments.length) {\n return height;\n }\n if (aspectRatio) {\n width = Math.ceil(_x / aspectRatio);\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the horizontal direction of the chart\n * @param {number} _x Desired horizontal direction for the graph\n * @return { isHorizontal | module} If it is horizontal or Bar Chart module to chain calls\n * @public\n */\n exports.isHorizontal = function (_x) {\n if (!arguments.length) {\n return isHorizontal;\n }\n isHorizontal = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function (_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { margin | module} Current margin or Area Chart module to chain calls\n * @public\n */\n exports.margin = function (_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the nameLabel of the chart\n * @param {Number} _x Desired dateLabel for the graph\n * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n * @public\n */\n exports.nameLabel = function (_x) {\n if (!arguments.length) {\n return nameLabel;\n }\n nameLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the y axis on the chart\n * @param {Number} _x Desired vertical ticks\n * @return {Number | module} Current yTicks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function (_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function () {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Gets or Sets the minimum width of the graph in order to show the tooltip\n * NOTE: This could also depend on the aspect ratio\n *\n * @param {Object} _x Margin object to get/set\n * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n * @public\n */\n exports.tooltipThreshold = function (_x) {\n if (!arguments.length) {\n return tooltipThreshold;\n }\n tooltipThreshold = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function (_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabelFormat of the chart\n * @param {String[]} _x Desired valueLabelFormat for the graph\n * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n * @public\n */\n exports.valueLabelFormat = function (_x) {\n if (!arguments.length) {\n return valueLabelFormat;\n }\n valueLabelFormat = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return { width | module} Current width or Area Chart module to chain calls\n * @public\n */\n exports.width = function (_x) {\n if (!arguments.length) {\n return width;\n }\n if (aspectRatio) {\n height = Math.ceil(_x * aspectRatio);\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the x axis on the chart\n * @param {Number} _x Desired xTicks\n * @return {Number | module} Current xTicks or Chart module to chain calls\n * @public\n */\n exports.xTicks = function (_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n return exports;\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/grouped-bar.js","define(function(require){\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Color = require('d3-color');\n const d3Collection = require('d3-collection');\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Interpolate = require('d3-interpolate');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Selection = require('d3-selection');\n const assign = require('lodash.assign');\n const d3Transition = require('d3-transition');\n\n const {exportChart} = require('./helpers/exportChart');\n const colorHelper = require('./helpers/colors');\n const NUMBER_FORMAT = ',f';\n const uniq = (arrArg) => arrArg.filter((elem, pos, arr) => arr.indexOf(elem) == pos);\n\n\n /**\n * @typdef D3Layout\n * @type function\n */\n\n /**\n * @typedef stackedBarData\n * @type {Object}\n * @property {Object[]} data All data entries\n * @property {String} name Name of the entry\n * @property {String} stack Stack of the entry\n * @property {Number} value Value of the entry\n *\n * @example\n * {\n * 'data': [\n * {\n * \"name\": \"2011-01\",\n * \"stack\": \"Direct\",\n * \"value\": 0\n * }\n * ]\n * }\n */\n\n /**\n * Stacked Area Chart reusable API module that allows us\n * rendering a multi area and configurable chart.\n *\n * @module Stacked-bar\n * @tutorial stacked-bar\n * @requires d3-array, d3-axis, d3-color, d3-collection, d3-dispatch, d3-ease,\n * d3-interpolate, d3-scale, d3-shape, d3-selection, lodash assign\n *\n * @example\n * let stackedBar = stackedBar();\n *\n * stackedBar\n * .width(containerWidth);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset.data)\n * .call(stackedBar);\n *\n */\n return function module() {\n\n let margin = {\n top: 40,\n right: 30,\n bottom: 60,\n left: 70\n },\n width = 960,\n height = 500,\n\n xScale,\n xAxis,\n yScale,\n yAxis,\n\n aspectRatio = null,\n\n yTickTextYOffset = -8,\n yTickTextXOffset = -20,\n\n yTicks = 5,\n xTicks = 5,\n percentageAxisToMaxRatio = 1,\n\n colorSchema = colorHelper.colorSchemas.britecharts,\n\n colorScale,\n categoryColorMap,\n\n layers,\n\n ease = d3Ease.easeQuadInOut,\n isHorizontal = false,\n\n svg,\n chartWidth, chartHeight,\n data,\n transformedData,\n stacks,\n\n tooltipThreshold = 480,\n\n baseLine,\n xAxisPadding = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n },\n maxBarNumber = 8,\n\n animationDelayStep = 20,\n animationDelays = d3Array.range(animationDelayStep, maxBarNumber* animationDelayStep, animationDelayStep),\n animationDuration = 1000,\n\n grid = null,\n\n nameLabel = 'name',\n valueLabel = 'value',\n stackLabel = 'stack',\n nameLabelFormat,\n valueLabelFormat = NUMBER_FORMAT,\n\n // getters\n getName = (data) => data[nameLabel],\n getValue = (data) => data[valueLabel],\n getStack = (data) => data[stackLabel],\n isAnimated = false,\n\n // events\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove');\n\n /**\n * This function creates the graph using the selection and data provided\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {stackedBarData} _data The data to attach and generate the chart\n */\n function exports(_selection) {\n _selection.each(function(_data){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n\n prepareData(data);\n buildScales();\n buildLayers();\n buildSVG(this);\n drawGridLines();\n buildAxis();\n drawAxis();\n drawStackedBar();\n addMouseEvents();\n });\n }\n\n /**\n * Adds events to the container group if the environment is not mobile\n * Adding: mouseover, mouseout and mousemove\n */\n function addMouseEvents() {\n if (shouldShowTooltip()){\n svg\n .on('mouseover', function(d) {\n handleMouseOver(this, d);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d);\n });\n }\n\n svg.selectAll('.bar')\n .on('mouseover', handleBarsMouseOver)\n .on('mouseout', handleBarsMouseOut);\n }\n\n /**\n * Adjusts the position of the y axis' ticks\n * @param {D3Selection} selection Y axis group\n * @return void\n */\n function adjustYTickLabels(selection) {\n selection.selectAll('.tick text')\n .attr('transform', `translate(${yTickTextXOffset}, ${yTickTextYOffset})`);\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis() {\n if (isHorizontal) {\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(xTicks, valueLabelFormat);\n yAxis = d3Axis.axisLeft(yScale)\n } else {\n xAxis = d3Axis.axisBottom(xScale)\n yAxis = d3Axis.axisLeft(yScale)\n .ticks(yTicks, valueLabelFormat)\n }\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * NOTE: The order of drawing of this group elements is really important,\n * as everything else will be drawn on top of them\n * @private\n */\n function buildContainerGroups(){\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n container\n .append('g').classed('x-axis-group', true)\n .append('g').classed('x axis', true);\n container.selectAll('.x-axis-group')\n .append('g').classed('month-axis', true);\n container\n .append('g').classed('y-axis-group axis', true);\n container\n .append('g').classed('grid-lines-group', true);\n container\n .append('g').classed('chart-group', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Builds the stacked layers layout\n * @return {D3Layout} Layout for drawing the chart\n * @private\n */\n function buildLayers(){\n let stack3 = d3Shape.stack().keys(stacks),\n dataInitial = transformedData.map((item) => {\n let ret = {};\n\n stacks.forEach((key) => {\n ret[key] = item[key];\n });\n\n return assign({}, item, ret);\n });\n\n layers = stack3(dataInitial);\n }\n\n /**\n * Creates the x, y and color scales of the chart\n * @private\n */\n function buildScales() {\n let yMax = d3Array.max(transformedData.map(function(d){\n return d.total;\n }));\n\n if (isHorizontal) {\n xScale = d3Scale.scaleLinear()\n .domain([0, yMax])\n .rangeRound([0, chartWidth - 1]);\n // 1 pix for edge tick\n\n yScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([chartHeight, 0])\n .padding(0.1);\n } else {\n xScale = d3Scale.scaleBand()\n .domain(data.map(getName))\n .rangeRound([0, chartWidth ])\n .padding(0.1);\n\n yScale = d3Scale.scaleLinear()\n .domain([0,yMax])\n .rangeRound([chartHeight, 0])\n .nice();\n }\n\n colorScale = d3Scale.scaleOrdinal()\n .range(colorSchema)\n .domain(data.map(getStack));\n\n categoryColorMap = colorScale\n .domain(data.map(getName)).domain()\n .reduce((memo, item) => {\n data.forEach(function(v){\n if (getName(v) === item){\n memo[v.name] = colorScale(v.stack)\n memo[v.stack] = colorScale(v.stack)\n memo[v.stack + item] = colorScale(v.stack)\n }\n })\n return memo;\n }, {});\n }\n\n /**\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container) {\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart stacked-bar', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Parses dates and values into JS Date objects and numbers\n * @param {obj} data Raw data from JSON file\n * @return {obj} Parsed data with values and dates\n */\n function cleanData(data) {\n return data.map((d) => {\n d.value = +d[valueLabel];\n d.stack = d[stackLabel];\n d.topicName = getStack(d); // for tooltip\n d.name = d[nameLabel];\n\n return d;\n });\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis(){\n if (isHorizontal) {\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate( 0, ${chartHeight} )`)\n .call(xAxis);\n\n svg.select('.y-axis-group.axis')\n .attr('transform', `translate( ${-xAxisPadding.left}, 0)`)\n .call(yAxis);\n } else {\n svg.select('.x-axis-group .axis.x')\n .attr('transform', `translate( 0, ${chartHeight} )`)\n .call(xAxis);\n\n svg.select('.y-axis-group.axis')\n .attr('transform', `translate( ${-xAxisPadding.left}, 0)`)\n .call(yAxis)\n .call(adjustYTickLabels);\n }\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines() {\n let scale = isHorizontal ? xScale : yScale;\n\n if (grid === 'horizontal' || grid === 'full') {\n svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(scale.ticks(yTicks).slice(1))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (-xAxisPadding.left + 1 ))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d));\n }\n\n if (grid === 'vertical' || grid === 'full') {\n svg.select('.grid-lines-group')\n .selectAll('line.vertical-grid-line')\n .data(scale.ticks(xTicks).slice(1))\n .enter()\n .append('line')\n .attr('class', 'vertical-grid-line')\n .attr('y1', 0)\n .attr('y2', chartHeight)\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d));\n }\n\n if (isHorizontal) {\n drawVerticalExtendedLine();\n } else {\n drawHorizontalExtendedLine();\n }\n }\n\n /**\n * Draws the bars along the x axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawHorizontalBars(series) {\n // Enter + Update\n let context,\n bars = series\n .data(layers)\n .enter()\n .append('g')\n .classed('layer', true)\n .attr('fill', (({key}) => categoryColorMap[key]))\n .selectAll('.bar')\n .data( (d)=> d)\n .enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', (d) => xScale(d[0]) )\n .attr('y', (d) => yScale(d.data.key) )\n .attr('height', yScale.bandwidth())\n .attr('fill', (({data}) => categoryColorMap[data.stack+data.key]));\n\n if (isAnimated) {\n bars.style('opacity', 0.24)\n .transition()\n .delay((_, i) => animationDelays[i])\n .duration(animationDuration)\n .ease(ease)\n .tween('attr.width', function(d) {\n let node = d3Selection.select(this),\n i = d3Interpolate.interpolateRound(0, xScale(d[1] - d[0])),\n j = d3Interpolate.interpolateNumber(0,1);\n\n return function(t) {\n node.attr('width', i(t) );\n node.style('opacity', j(t) );\n };\n });\n } else {\n bars.attr('width', (d) => xScale(d[1] - d[0] ) )\n }\n }\n\n /**\n * Draws a vertical line to extend x-axis till the edges\n * @return {void}\n */\n function drawHorizontalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', chartHeight)\n .attr('y2', chartHeight);\n }\n\n /**\n * Draws the bars along the y axis\n * @param {D3Selection} bars Selection of bars\n * @return {void}\n */\n function drawVerticalBars(series) {\n // Enter + Update\n let bars = series\n .data(layers)\n .enter()\n .append('g')\n .classed('layer', true)\n .attr('fill', (({key}) => categoryColorMap[key]))\n .selectAll('.bar')\n .data((d) => d)\n .enter()\n .append('rect')\n .classed('bar', true)\n .attr('x', (d) => xScale(d.data.key))\n .attr('y', (d) => yScale(d[1]))\n .attr('width', xScale.bandwidth )\n .attr('fill', (({data}) => categoryColorMap[data.stack+data.key])),context;\n\n if (isAnimated) {\n bars.style('opacity', 0.24).transition()\n .delay( (_, i) => animationDelays[i])\n .duration(animationDuration)\n .ease(ease)\n .tween('attr.height', function(d) {\n let node = d3Selection.select(this),\n i = d3Interpolate.interpolateRound(0, yScale(d[0]) - yScale(d[1])),\n j = d3Interpolate.interpolateNumber(0,1);\n\n return function(t) {\n node.attr('height', i(t) );\n node.style('opacity', j(t) );\n };\n });\n } else {\n bars.attr('height', (d) => yScale(d[0]) - yScale(d[1]) );\n }\n }\n\n /**\n * Draws a vertical line to extend y-axis till the edges\n * @return {void}\n */\n function drawVerticalExtendedLine() {\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-y-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-y-line')\n .attr('y1', (xAxisPadding.bottom))\n .attr('y2', chartHeight)\n .attr('x1', 0)\n .attr('x2', 0);\n }\n\n /**\n * Draws the different areas into the chart-group element\n * @private\n */\n function drawStackedBar(){\n let series = svg.select('.chart-group').selectAll('.layer')\n\n if (isHorizontal) {\n drawHorizontalBars(series)\n } else {\n drawVerticalBars(series)\n }\n // Exit\n series.exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Extract X position on the chart from a given mouse event\n * @param {obj} event D3 mouse event\n * @return {Number} Position on the x axis of the mouse\n * @private\n */\n function getMousePosition(event) {\n return d3Selection.mouse(event);\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseX X position of the mouse\n * @return {obj} Data entry that is closer to that x axis position\n */\n function getNearestDataPoint(mouseX) {\n let adjustedMouseX = mouseX - margin.left,\n dataByValueParsed = transformedData.map((item) => {\n item.key = item.key\n return item;\n }),\n epsilon,\n nearest;\n\n epsilon = (xScale(dataByValueParsed[1].key) - xScale(dataByValueParsed[0].key));\n nearest = dataByValueParsed.find(({key}) => Math.abs(xScale(key) - adjustedMouseX) <= epsilon);\n\n return nearest;\n }\n\n /**\n * Finds out the data entry that is closer to the given position on pixels\n * @param {Number} mouseY Y position of the mouse\n * @return {obj} Data entry that is closer to that y axis position\n */\n\n function getNearestDataPoint2(mouseY) {\n let adjustedMouseY = mouseY - margin.bottom,\n epsilon = yScale.bandwidth(),\n nearest;\n\n nearest = layers.map(function(stackedArray){\n return stackedArray.map(function(d1){\n let found = d1.data.values.find((d2) => Math.abs(adjustedMouseY >= yScale(d2[nameLabel])) && Math.abs(adjustedMouseY - yScale(d2[nameLabel]) <= epsilon*2) );\n\n return found ? d1.data :undefined;\n })\n });\n nearest = d3Array.merge( nearest).filter(function(e){return e});\n\n return nearest.length ? nearest[0] :undefined;\n }\n\n /**\n * Handles a mouseover event on top of a bar\n * @return {void}\n */\n function handleBarsMouseOver() {\n d3Selection.select(this)\n .attr('fill', () => d3Color.color(d3Selection.select(this.parentNode).attr('fill')).darker())\n }\n\n /**\n * Handles a mouseout event out of a bar\n * @return {void}\n */\n function handleBarsMouseOut() {\n d3Selection\n .select(this).attr('fill', () => d3Selection.select(this.parentNode).attr('fill'))\n }\n\n /**\n * MouseMove handler, calculates the nearest dataPoint to the cursor\n * and updates metadata related to it\n * @private\n */\n function handleMouseMove(e){\n let [mouseX, mouseY] = getMousePosition(e),\n dataPoint = isHorizontal ? getNearestDataPoint2(mouseY) : getNearestDataPoint(mouseX),\n x,\n y;\n\n if (dataPoint) {\n // Move verticalMarker to that datapoint\n if (isHorizontal) {\n x = mouseX - margin.left;\n y = yScale(dataPoint.key) + yScale.bandwidth()/2;\n } else {\n x = xScale(dataPoint.key) + margin.left;\n y = mouseY - margin.bottom;\n }\n moveTooltipOriginXY(x,y);\n\n // Emit event with xPosition for tooltip or similar feature\n dispatcher.call('customMouseMove', e, dataPoint, categoryColorMap, x, y);\n }\n }\n\n /**\n * MouseOut handler, hides overlay and removes active class on verticalMarkerLine\n * It also resets the container of the vertical marker\n * @private\n */\n function handleMouseOut(e, d) {\n svg.select('.metadata-group').attr('transform', 'translate(9999, 0)');\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Mouseover handler, shows overlay and adds active class to verticalMarkerLine\n * @private\n */\n function handleMouseOver(e, d) {\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e));\n }\n\n /**\n * Helper method to update the x position of the vertical marker\n * @param {obj} dataPoint Data entry to extract info\n * @return void\n */\n function moveTooltipOriginXY(originXPosition, originYPosition){\n svg.select('.metadata-group')\n .attr('transform', `translate(${originXPosition},${originYPosition})`);\n }\n\n /**\n * Prepare data for create chart.\n * @private\n */\n function prepareData(data) {\n stacks = uniq(data.map(({stack}) => stack));\n transformedData = d3Collection.nest()\n .key(getName)\n .rollup(function(values) {\n let ret = {};\n\n values.forEach((entry) => {\n if (entry && entry[stackLabel]) {\n ret[entry[stackLabel]] = getValue(entry);\n }\n });\n ret.values = values; //for tooltip\n\n return ret;\n })\n .entries(data)\n .map(function(data){\n return assign({}, {\n total:d3Array.sum( d3Array.permute(data.value, stacks) ),\n key:data.key\n }, data.value);\n });\n }\n\n /**\n * Determines if we should add the tooltip related logic depending on the\n * size of the chart and the tooltipThreshold variable value\n * @return {boolean} Should we build the tooltip?\n * @private\n */\n function shouldShowTooltip() {\n return width > tooltipThreshold;\n }\n\n // API\n /**\n * Gets or Sets the aspect ratio of the chart\n * @param {Number} _x Desired aspect ratio for the graph\n * @return { (Number | Module) } Current aspect ratio or Area Chart module to chain calls\n * @public\n */\n exports.aspectRatio = function(_x) {\n if (!arguments.length) {\n return aspectRatio;\n }\n aspectRatio = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the colorSchema of the chart\n * @param {String[]} _x Desired colorSchema for the graph\n * @return { colorSchema | module} Current colorSchema or Chart module to chain calls\n * @public\n */\n exports.colorSchema = function(_x) {\n if (!arguments.length) {\n return colorSchema;\n }\n colorSchema = _x;\n\n return this;\n };\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename, title) {\n exportChart.call(exports, svg, filename, title);\n };\n\n /**\n * Gets or Sets the grid mode.\n *\n * @param {String} _x Desired mode for the grid ('vertical'|'horizontal'|'full')\n * @return { String | module} Current mode of the grid or Area Chart module to chain calls\n * @public\n */\n exports.grid = function(_x) {\n if (!arguments.length) {\n return grid;\n }\n grid = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return { height | module} Current height or Area Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n if (aspectRatio) {\n width = Math.ceil(_x / aspectRatio);\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the horizontal direction of the chart\n * @param {number} _x Desired horizontal direction for the graph\n * @return { isHorizontal | module} If it is horizontal or Bar Chart module to chain calls\n * @public\n */\n exports.isHorizontal = function(_x) {\n if (!arguments.length) {\n return isHorizontal;\n }\n isHorizontal = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the isAnimated property of the chart, making it to animate when render.\n * By default this is 'false'\n *\n * @param {Boolean} _x Desired animation flag\n * @return { isAnimated | module} Current isAnimated flag or Chart module\n * @public\n */\n exports.isAnimated = function(_x) {\n if (!arguments.length) {\n return isAnimated;\n }\n isAnimated = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return { margin | module} Current margin or Area Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the nameLabel of the chart\n * @param {Number} _x Desired dateLabel for the graph\n * @return { nameLabel | module} Current nameLabel or Chart module to chain calls\n * @public\n */\n exports.nameLabel = function(_x) {\n if (!arguments.length) {\n return nameLabel;\n }\n nameLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabelFormat of the chart\n * @param {String[]} _x Desired valueLabelFormat for the graph\n * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n * @public\n */\n exports.nameLabelFormat = function(_x) {\n if (!arguments.length) {\n return nameLabelFormat;\n }\n nameLabelFormat = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of ticks of the x axis on the chart\n * (Default is 5)\n * @param {Number} _x Desired horizontal ticks\n * @return {Number | module} Current xTicks or Chart module to chain calls\n * @public\n */\n exports.xTicks = function (_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the number of vertical ticks of the axis on the chart\n * @param {Number} _x Desired vertical ticks\n * @return {Number | module} Current yTicks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function (_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Configurable extension of the x axis\n * if your max point was 50% you might want to show x axis to 60%, pass 1.2\n * @param {number} _x ratio to max data point to add to the x axis\n * @return { ratio | module} Current ratio or Bar Chart module to chain calls\n * @public\n */\n exports.percentageAxisToMaxRatio = function(_x) {\n if (!arguments.length) {\n return percentageAxisToMaxRatio;\n }\n percentageAxisToMaxRatio = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the stackLabel of the chart\n * @param {String} _x Desired stackLabel for the graph\n * @return { stackLabel | module} Current stackLabel or Chart module to chain calls\n * @public\n */\n exports.stackLabel = function(_x) {\n if (!arguments.length) {\n return stackLabel;\n }\n stackLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the minimum width of the graph in order to show the tooltip\n * NOTE: This could also depend on the aspect ratio\n *\n * @param {Object} _x Margin object to get/set\n * @return { tooltipThreshold | module} Current tooltipThreshold or Area Chart module to chain calls\n * @public\n */\n exports.tooltipThreshold = function(_x) {\n if (!arguments.length) {\n return tooltipThreshold;\n }\n tooltipThreshold = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabel of the chart\n * @param {Number} _x Desired valueLabel for the graph\n * @return { valueLabel | module} Current valueLabel or Chart module to chain calls\n * @public\n */\n exports.valueLabel = function(_x) {\n if (!arguments.length) {\n return valueLabel;\n }\n valueLabel = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the valueLabelFormat of the chart\n * @param {String[]} _x Desired valueLabelFormat for the graph\n * @return { valueLabelFormat | module} Current valueLabelFormat or Chart module to chain calls\n * @public\n */\n exports.valueLabelFormat = function(_x) {\n if (!arguments.length) {\n return valueLabelFormat;\n }\n valueLabelFormat = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return { width | module} Current width or Area Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n if (aspectRatio) {\n height = Math.ceil(_x * aspectRatio);\n }\n width = _x;\n\n return this;\n };\n\n return exports;\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/stacked-bar.js","define(function(require) {\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Dispatch = require('d3-dispatch');\n const d3Ease = require('d3-ease');\n const d3Format = require('d3-format');\n const d3Scale = require('d3-scale');\n const d3Selection = require('d3-selection');\n const d3Transition = require('d3-transition');\n\n const {exportChart} = require('./helpers/exportChart');\n\n\n /**\n * @typedef StepChartData\n * @type Object[]\n *\n * @property {String} key Key we measure (required)\n * @property {Number} value value of the key (required)\n *\n * @example\n * [\n * {\n * value: 1,\n * key: 'glittering'\n * },\n * {\n * value: 1,\n * key: 'luminous'\n * }\n * ]\n */\n\n /**\n * Step Chart reusable API class that renders a\n * simple and configurable step chart.\n *\n * @module Step\n * @tutorial step\n * @requires d3-array, d3-axis, d3-dispatch, d3-format, d3-scale, d3-selection, d3-transition\n *\n * @example\n * var stepChart= step();\n *\n * stepChart\n * .height(500)\n * .width(800);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(stepChart);\n *\n */\n\n return function module() {\n\n let margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 40\n },\n width = 960,\n height = 500,\n ease = d3Ease.easeQuadInOut,\n data,\n chartWidth, chartHeight,\n xScale, yScale,\n yTicks = 6,\n xAxis, xAxisLabel,\n yAxis, yAxisLabel,\n xAxisLabelOffset = 45,\n yAxisLabelOffset = -20,\n xAxisPadding = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n },\n yTickPadding = 8,\n svg,\n\n valueLabel = 'value',\n nameLabel = 'key',\n\n maskGridLines,\n baseLine,\n\n // Dispatcher object to broadcast the mouse events\n // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n dispatcher = d3Dispatch.dispatch('customMouseOver', 'customMouseOut', 'customMouseMove'),\n\n // Formats\n yAxisTickFormat = d3Format.format('.3'),\n\n // extractors\n getKey = ({key}) => key,\n getValue = ({value}) => value;\n\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {StepChartData} _data The data to attach and generate the chart\n */\n function exports(_selection){\n _selection.each(function(_data){\n // Make space on the left of the graph for the y axis label\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(_data);\n\n buildScales();\n buildAxis();\n buildSVG(this);\n drawGridLines();\n drawSteps();\n drawAxis();\n });\n }\n\n /**\n * Creates the d3 x and y axis, setting orientations\n * @private\n */\n function buildAxis(){\n xAxis = d3Axis.axisBottom(xScale);\n\n yAxis = d3Axis.axisLeft(yScale)\n .ticks(yTicks)\n .tickPadding(yTickPadding)\n .tickFormat(yAxisTickFormat);\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups(){\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n container\n .append('g')\n .classed('grid-lines-group', true);\n container\n .append('g')\n .classed('chart-group', true);\n container\n .append('g')\n .classed('x-axis-group axis', true)\n .append('g')\n .classed('x-axis-label', true);\n container\n .append('g')\n .classed('y-axis-group axis', true)\n .append('g')\n .classed('y-axis-label', true);\n container\n .append('g').classed('metadata-group', true);\n }\n\n /**\n * Creates the x and y scales of the graph\n * @private\n */\n function buildScales(){\n xScale = d3Scale.scaleBand()\n .domain(data.map(getKey))\n .rangeRound([0, chartWidth])\n .paddingInner(0);\n\n yScale = d3Scale.scaleLinear()\n .domain([0, d3Array.max(data, getValue)])\n .rangeRound([chartHeight, 0]);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container){\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart step-chart', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Cleaning data adding the proper format\n * @param {StepChartData} data Data\n * @private\n */\n function cleanData(data) {\n return data.map((d) => {\n d.value = +d[valueLabel];\n d.key = String(d[nameLabel]);\n\n return d;\n });\n }\n\n /**\n * Draws the x and y axis on the svg object within their\n * respective groups\n * @private\n */\n function drawAxis(){\n svg.select('.x-axis-group.axis')\n .attr('transform', `translate(0, ${chartHeight})`)\n .call(xAxis);\n\n if (xAxisLabel) {\n svg.select('.x-axis-label')\n .append('text')\n .attr('text-anchor', 'middle')\n .attr('x', chartWidth / 2)\n .attr('y', xAxisLabelOffset)\n .text(xAxisLabel);\n }\n\n svg.select('.y-axis-group.axis')\n .call(yAxis);\n\n if (yAxisLabel) {\n svg.select('.y-axis-label')\n .append('text')\n .attr('x', -chartHeight / 2)\n .attr('y', yAxisLabelOffset)\n .attr('text-anchor', 'middle')\n .attr('transform', 'rotate(270 0 0)')\n .text(yAxisLabel);\n }\n }\n\n /**\n * Draws the step elements within the chart group\n * @private\n */\n function drawSteps(){\n let steps = svg.select('.chart-group').selectAll('.step').data(data);\n\n // Enter\n steps.enter()\n .append('rect')\n .classed('step', true)\n .attr('x', chartWidth) // Initially drawing the steps at the end of Y axis\n .attr('y', ({value}) => yScale(value))\n .attr('width', xScale.bandwidth())\n .attr('height', (d) => (chartHeight - yScale(d.value)))\n .on('mouseover', function(d) {\n handleMouseOver(this, d, chartWidth, chartHeight);\n })\n .on('mousemove', function(d) {\n handleMouseMove(this, d, chartWidth, chartHeight);\n })\n .on('mouseout', function(d) {\n handleMouseOut(this, d, chartWidth, chartHeight);\n })\n .merge(steps)\n .transition()\n .ease(ease)\n .attr('x', ({key}) => xScale(key))\n .attr('y', function(d) {\n return yScale(d.value);\n })\n .attr('width', xScale.bandwidth())\n .attr('height', function(d) {\n return chartHeight - yScale(d.value);\n });\n\n // Exit\n steps.exit()\n .transition()\n .style('opacity', 0)\n .remove();\n }\n\n /**\n * Draws grid lines on the background of the chart\n * @return void\n */\n function drawGridLines(){\n maskGridLines = svg.select('.grid-lines-group')\n .selectAll('line.horizontal-grid-line')\n .data(yScale.ticks(yTicks))\n .enter()\n .append('line')\n .attr('class', 'horizontal-grid-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d));\n\n //draw a horizontal line to extend x-axis till the edges\n baseLine = svg.select('.grid-lines-group')\n .selectAll('line.extended-x-line')\n .data([0])\n .enter()\n .append('line')\n .attr('class', 'extended-x-line')\n .attr('x1', (xAxisPadding.left))\n .attr('x2', chartWidth)\n .attr('y1', height - margin.bottom - margin.top)\n .attr('y2', height - margin.bottom - margin.top);\n }\n\n // API\n\n /**\n * Custom OnMouseOver event handler\n * @return {void}\n * @private\n */\n function handleMouseOver(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseOver', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n }\n\n /**\n * Custom OnMouseMove event handler\n * @return {void}\n * @private\n */\n function handleMouseMove(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseMove', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n }\n\n /**\n * Custom OnMouseOver event handler\n * @return {void}\n * @private\n */\n function handleMouseOut(e, d, chartWidth, chartHeight) {\n dispatcher.call('customMouseOut', e, d, d3Selection.mouse(e), [chartWidth, chartHeight]);\n }\n\n /**\n * Chart exported to png and a download action is fired\n * @public\n */\n exports.exportChart = function(filename) {\n exportChart.call(exports, svg, filename);\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {object} _x Margin object to get/set\n * @return { margin | module} Current margin or Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n return this;\n };\n\n /**\n * Gets or Sets the number of vertical ticks on the chart\n * (Default is 6)\n * @param {Number} _x Desired number of vertical ticks for the graph\n * @return {Number | module} Current yTicks or Chart module to chain calls\n * @public\n */\n exports.yTicks = function(_x) {\n if (!arguments.length) {\n return yTicks;\n }\n yTicks = _x;\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {number} _x Desired width for the graph\n * @return { height | module} Current height or Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function(...args) {\n let value = dispatcher.on(...args);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {number} _x Desired width for the graph\n * @return { width | module} Current width or Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n return this;\n };\n\n /**\n * Gets or Sets the text of the xAxisLabel on the chart\n * @param {text} _x Desired text for the label\n * @return { text | module} label or Chart module to chain calls\n * @public\n */\n exports.xAxisLabel = function(_x) {\n if (!arguments.length) {\n return xAxisLabel;\n }\n xAxisLabel = _x;\n return this;\n };\n\n /**\n * Gets or Sets the offset of the xAxisLabel on the chart\n * @param {integer} _x Desired offset for the label\n * @return { integer | module} label or Chart module to chain calls\n * @public\n */\n exports.xAxisLabelOffset = function(_x) {\n if (!arguments.length) {\n return xAxisLabelOffset;\n }\n xAxisLabelOffset = _x;\n return this;\n };\n\n /**\n * Gets or Sets the text of the yAxisLabel on the chart\n * @param {text} _x Desired text for the label\n * @return { text | module} label or Chart module to chain calls\n * @public\n */\n exports.yAxisLabel = function(_x) {\n if (!arguments.length) {\n return yAxisLabel;\n }\n yAxisLabel = _x;\n return this;\n };\n\n /**\n * Gets or Sets the offset of the yAxisLabel on the chart\n * @param {integer} _x Desired offset for the label\n * @return { integer | module} label or Chart module to chain calls\n * @public\n */\n exports.yAxisLabelOffset = function(_x) {\n if (!arguments.length) {\n return yAxisLabelOffset;\n }\n yAxisLabelOffset = _x;\n return this;\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/step.js","define(function(require) {\n 'use strict';\n\n const d3Array = require('d3-array');\n const d3Axis = require('d3-axis');\n const d3Brush = require('d3-brush');\n const d3Ease = require('d3-ease');\n const d3Scale = require('d3-scale');\n const d3Shape = require('d3-shape');\n const d3Dispatch = require('d3-dispatch');\n const d3Selection = require('d3-selection');\n const d3Time = require('d3-time');\n const d3Transition = require('d3-transition');\n const d3TimeFormat = require('d3-time-format');\n\n const colorHelper = require('./helpers/colors');\n const timeAxisHelper = require('./helpers/timeAxis');\n\n const {axisTimeCombinations} = require('./helpers/constants');\n\n\n /**\n * @typedef BrushChartData\n * @type {Object[]}\n * @property {Number} value Value to chart (required)\n * @property {Date} date Date of the value (required)\n *\n * @example\n * [\n * {\n * value: 1,\n * date: '2011-01-06T00:00:00Z'\n * },\n * {\n * value: 2,\n * date: '2011-01-07T00:00:00Z'\n * }\n * ]\n */\n\n /**\n * Brush Chart reusable API class that renders a\n * simple and configurable brush chart.\n *\n * @module Brush\n * @tutorial brush\n * @requires d3-array, d3-axis, d3-brush, d3-ease, d3-scale, d3-shape, d3-selection, d3-time, d3-time-format\n *\n * @example\n * let brushChart = brush();\n *\n * brushChart\n * .height(500)\n * .width(800);\n *\n * d3Selection.select('.css-selector')\n * .datum(dataset)\n * .call(brushChart);\n *\n */\n\n return function module() {\n\n let margin = {\n top: 20,\n right: 20,\n bottom: 30,\n left: 20\n },\n width = 960,\n height = 500,\n data,\n svg,\n\n ease = d3Ease.easeQuadOut,\n\n dateLabel = 'date',\n valueLabel = 'value',\n\n dateRange = [null, null],\n\n chartWidth, chartHeight,\n xScale, yScale,\n xAxis,\n\n xAxisFormat = null,\n xTicks = null,\n xAxisCustomFormat = null,\n\n brush,\n chartBrush,\n handle,\n\n tickPadding = 5,\n\n gradient = colorHelper.colorGradients.greenBlue,\n\n // Dispatcher object to broadcast the mouse events\n // Ref: https://github.com/mbostock/d3/wiki/Internals#d3_dispatch\n dispatcher = d3Dispatch.dispatch('customBrushStart', 'customBrushEnd'),\n\n // extractors\n getValue = ({value}) => value,\n getDate = ({date}) => date;\n\n\n /**\n * This function creates the graph using the selection as container\n * @param {D3Selection} _selection A d3 selection that represents\n * the container(s) where the chart(s) will be rendered\n * @param {BrushChartData} _data The data to attach and generate the chart\n */\n function exports(_selection){\n _selection.each(function(_data){\n chartWidth = width - margin.left - margin.right;\n chartHeight = height - margin.top - margin.bottom;\n data = cleanData(cloneData(_data));\n\n buildScales();\n buildAxis();\n buildSVG(this);\n buildGradient();\n buildBrush();\n drawArea();\n drawAxis();\n drawBrush();\n drawHandles();\n });\n }\n\n /**\n * Creates the d3 x axis, setting orientation\n * @private\n */\n function buildAxis(){\n let minor, major;\n\n if (xAxisFormat === 'custom' && typeof xAxisCustomFormat === 'string') {\n minor = {\n tick: xTicks,\n format: d3TimeFormat.timeFormat(xAxisCustomFormat)\n };\n } else {\n ({minor, major} = timeAxisHelper.getXAxisSettings(data, width, xAxisFormat));\n }\n\n xAxis = d3Axis.axisBottom(xScale)\n .ticks(minor.tick)\n .tickSize(10, 0)\n .tickPadding([tickPadding])\n .tickFormat(minor.format);\n }\n\n /**\n * Creates the brush element and attaches a listener\n * @return {void}\n */\n function buildBrush() {\n brush = d3Brush.brushX()\n .extent([[0, 0], [chartWidth, chartHeight]])\n .on('brush', handleBrushStart)\n .on('end', handleBrushEnd);\n }\n\n /**\n * Builds containers for the chart, the axis and a wrapper for all of them\n * Also applies the Margin convention\n * @private\n */\n function buildContainerGroups(){\n let container = svg\n .append('g')\n .classed('container-group', true)\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n container\n .append('g')\n .classed('chart-group', true);\n container\n .append('g')\n .classed('metadata-group', true);\n container\n .append('g')\n .classed('x-axis-group', true);\n container\n .append('g')\n .classed('brush-group', true);\n }\n\n /**\n * Creates the gradient on the area\n * @return {void}\n */\n function buildGradient() {\n let metadataGroup = svg.select('.metadata-group');\n\n metadataGroup.append('linearGradient')\n .attr('id', 'brush-area-gradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', 0)\n .attr('x2', xScale(data[data.length - 1].date))\n .attr('y1', 0)\n .attr('y2', 0)\n .selectAll('stop')\n .data([\n {offset: '0%', color: gradient[0]},\n {offset: '100%', color: gradient[1]}\n ])\n .enter().append('stop')\n .attr('offset', ({offset}) => offset)\n .attr('stop-color', ({color}) => color);\n }\n\n /**\n * Creates the x and y scales of the graph\n * @private\n */\n function buildScales(){\n xScale = d3Scale.scaleTime()\n .domain(d3Array.extent(data, getDate ))\n .range([0, chartWidth]);\n\n yScale = d3Scale.scaleLinear()\n .domain([0, d3Array.max(data, getValue)])\n .range([chartHeight, 0]);\n }\n\n /**\n * Builds the SVG element that will contain the chart\n * @param {HTMLElement} container DOM element that will work as the container of the graph\n * @private\n */\n function buildSVG(container){\n if (!svg) {\n svg = d3Selection.select(container)\n .append('svg')\n .classed('britechart brush-chart', true);\n\n buildContainerGroups();\n }\n\n svg\n .attr('width', width)\n .attr('height', height);\n }\n\n /**\n * Cleaning data adding the proper format\n *\n * @param {BrushChartData} data Data\n */\n function cleanData(data) {\n return data.map(function (d) {\n d.date = new Date(d[dateLabel]);\n d.value = +d[valueLabel];\n\n return d;\n });\n }\n\n /**\n * Clones the passed array of data\n * @param {Object[]} dataToClone Data to clone\n * @return {Object[]} Cloned data\n */\n function cloneData(dataToClone) {\n return JSON.parse(JSON.stringify(dataToClone));\n }\n\n /**\n * Draws the x axis on the svg object within its group\n *\n * @private\n */\n function drawAxis(){\n svg.select('.x-axis-group')\n .append('g')\n .attr('class', 'x axis')\n .attr('transform', `translate(0, ${chartHeight})`)\n .call(xAxis);\n }\n\n /**\n * Draws the area that is going to represent the data\n *\n * @return {void}\n */\n function drawArea() {\n // Create and configure the area generator\n let area = d3Shape.area()\n .x(({date}) => xScale(date))\n .y0(chartHeight)\n .y1(({value}) => yScale(value))\n .curve(d3Shape.curveBasis);\n\n // Create the area path\n svg.select('.chart-group')\n .append('path')\n .datum(data)\n .attr('class', 'brush-area')\n .attr('d', area);\n }\n\n /**\n * Draws the Brush components on its group\n * @return {void}\n */\n function drawBrush() {\n chartBrush = svg.select('.brush-group')\n .call(brush);\n\n // Update the height of the brushing rectangle\n chartBrush.selectAll('rect')\n .classed('brush-rect', true)\n .attr('height', chartHeight);\n }\n\n /**\n * Draws a handle for the Brush section\n * @return {void}\n */\n function drawHandles() {\n let handleFillColor = colorHelper.colorSchemasHuman.grey[1];\n\n // Styling\n handle = chartBrush\n .selectAll('.handle.brush-rect')\n .style('fill', handleFillColor);\n }\n\n /**\n * When a brush event starts, we can extract info from the extension\n * of the brush.\n *\n * @return {void}\n */\n function handleBrushStart() {\n let s = d3Selection.event.selection,\n dateExtent = s.map(xScale.invert);\n\n dispatcher.call('customBrushStart', this, dateExtent);\n // updateHandlers(dateExtent);\n }\n\n /**\n * Processes the end brush event, snapping the boundaries to days\n * as showed on the example on https://bl.ocks.org/mbostock/6232537\n * @return {void}\n * @private\n */\n function handleBrushEnd() {\n if (!d3Selection.event.sourceEvent) return; // Only transition after input.\n if (!d3Selection.event.selection) return; // Ignore empty selections.\n\n let s = d3Selection.event.selection,\n dateExtent = s.map(xScale.invert),\n dateExtentRounded = dateExtent.map(d3Time.timeDay.round);\n\n // If empty when rounded, use floor & ceil instead.\n if (dateExtentRounded[0] >= dateExtentRounded[1]) {\n dateExtentRounded[0] = d3Time.timeDay.floor(dateExtent[0]);\n dateExtentRounded[1] = d3Time.timeDay.offset(dateExtentRounded[0]);\n }\n\n d3Selection.select(this)\n .transition()\n .call(d3Selection.event.target.move, dateExtentRounded.map(xScale));\n\n dispatcher.call('customBrushEnd', this, dateExtentRounded);\n }\n\n /**\n * Sets a new brush extent within the passed percentage positions\n * @param {Number} a Percentage of data that the brush start with\n * @param {Number} b Percentage of data that the brush ends with\n * @example\n * setBrushByPercentages(0.25, 0.5)\n */\n function setBrushByPercentages(a, b) {\n let x0 = a * chartWidth,\n x1 = b * chartWidth;\n\n brush\n .move(chartBrush, [x0, x1]);\n }\n\n /**\n * Sets a new brush extent within the passed dates\n * @param {String | Date} dateA Initial Date\n * @param {String | Date} dateB End Date\n */\n function setBrushByDates(dateA, dateB) {\n let x0 = xScale(new Date(dateA)),\n x1 = xScale(new Date(dateB));\n\n brush\n .move(chartBrush, [x0, x1]);\n }\n\n /**\n * Updates visibility and position of the brush handlers\n * @param {Number[]} dateExtent Date range\n * @return {void}\n */\n function updateHandlers(dateExtent) {\n if (dateExtent === null) {\n handle.attr('display', 'none');\n } else {\n handle\n .attr('display', null)\n .attr('transform', function(d, i) {\n return `translate(${dateExtent[i]},${chartHeight / 2})`;\n });\n }\n }\n\n // API\n\n /**\n * Exposes the constants to be used to force the x axis to respect a certain granularity\n * current options: MINUTE_HOUR, HOUR_DAY, DAY_MONTH, MONTH_YEAR\n * @example\n * brush.xAxisCustomFormat(brush.axisTimeCombinations.HOUR_DAY)\n */\n exports.axisTimeCombinations = axisTimeCombinations;\n\n /**\n * Gets or Sets the dateRange for the selected part of the brush\n * @param {String[]} _x Desired dateRange for the graph\n * @return { dateRange | module} Current dateRange or Chart module to chain calls\n * @public\n */\n exports.dateRange = function(_x) {\n if (!arguments.length) {\n return dateRange;\n }\n dateRange = _x;\n\n if (Array.isArray(dateRange)) {\n setBrushByDates(...dateRange);\n }\n\n return this;\n };\n\n /**\n * Gets or Sets the gradient of the chart\n * @param {String[]} _x Desired gradient for the graph\n * @return {String | Module} Current gradient or Chart module to chain calls\n * @public\n */\n exports.gradient = function(_x) {\n if (!arguments.length) {\n return gradient;\n }\n gradient = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the height of the chart\n * @param {Number} _x Desired width for the graph\n * @return {Number | Module} Current height or Chart module to chain calls\n * @public\n */\n exports.height = function(_x) {\n if (!arguments.length) {\n return height;\n }\n height = _x;\n\n return this;\n };\n\n /**\n * Gets or Sets the margin of the chart\n * @param {Object} _x Margin object to get/set\n * @return {Object | Module} Current margin or Chart module to chain calls\n * @public\n */\n exports.margin = function(_x) {\n if (!arguments.length) {\n return margin;\n }\n margin = _x;\n\n return this;\n };\n\n /**\n * Exposes an 'on' method that acts as a bridge with the event dispatcher\n * We are going to expose this events:\n * customMouseOver, customMouseMove and customMouseOut\n *\n * @return {module} Bar Chart\n * @public\n */\n exports.on = function() {\n let value = dispatcher.on.apply(dispatcher, arguments);\n\n return value === dispatcher ? exports : value;\n };\n\n /**\n * Gets or Sets the width of the chart\n * @param {Number} _x Desired width for the graph\n * @return {Number | Module} Current width or Chart module to chain calls\n * @public\n */\n exports.width = function(_x) {\n if (!arguments.length) {\n return width;\n }\n width = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x format\n * It requires a `xAxisFormat` of 'custom' in order to work.\n * @param {String} _x Desired format for x axis\n * @return {String | Module} Current format or module to chain calls\n */\n exports.xAxisCustomFormat = function(_x) {\n if (!arguments.length) {\n return xAxisCustomFormat;\n }\n xAxisCustomFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x axis grouping\n * @param {String} _x Desired format\n * @return {String | Module} Current format or module to chain calls\n * @example\n * brush.xAxisFormat(brush.axisTimeCombinations.HOUR_DAY)\n */\n exports.xAxisFormat = function(_x) {\n if (!arguments.length) {\n return xAxisFormat;\n }\n xAxisFormat = _x;\n\n return this;\n };\n\n /**\n * Exposes the ability to force the chart to show a certain x ticks. It requires a `xAxisCustomFormat` of 'custom' in order to work.\n * NOTE: This value needs to be a multiple of 2, 5 or 10. They won't always work as expected, as D3 decides at the end\n * how many and where the ticks will appear.\n *\n * @param {Number} _x Desired number of x axis ticks (multiple of 2, 5 or 10)\n * @return {Number | Module} Current number or ticks or module to chain calls\n */\n exports.xTicks = function(_x) {\n if (!arguments.length) {\n return xTicks;\n }\n xTicks = _x;\n\n return this;\n };\n\n return exports;\n };\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/charts/brush.js","// https://d3js.org/d3-brush/ Version 1.0.4. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3));\n}(this, (function (exports,d3Dispatch,d3Drag,d3Interpolate,d3Selection,d3Transition) { 'use strict';\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nvar BrushEvent = function(target, type, selection) {\n this.target = target;\n this.type = type;\n this.selection = selection;\n};\n\nfunction nopropagation() {\n d3Selection.event.stopImmediatePropagation();\n}\n\nvar noevent = function() {\n d3Selection.event.preventDefault();\n d3Selection.event.stopImmediatePropagation();\n};\n\nvar MODE_DRAG = {name: \"drag\"};\nvar MODE_SPACE = {name: \"space\"};\nvar MODE_HANDLE = {name: \"handle\"};\nvar MODE_CENTER = {name: \"center\"};\n\nvar X = {\n name: \"x\",\n handles: [\"e\", \"w\"].map(type),\n input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\"].map(type),\n input: function(xy) { return xy; },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !d3Selection.event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nfunction brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nfunction brushX() {\n return brush$1(X);\n}\n\nfunction brushY() {\n return brush$1(Y);\n}\n\nvar brush = function() {\n return brush$1(XY);\n};\n\nfunction brush$1(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n listeners = d3Dispatch.dispatch(brush, \"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n d3Selection.select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\")\n .on(\"mousedown.brush touchstart.brush\", started);\n }\n\n brush.move = function(group, selection) {\n if (group.selection) {\n group\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = d3Interpolate.interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && empty(selection1) ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 && selection1 ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n d3Transition.interrupt(that);\n state.selection = selection1 == null || empty(selection1) ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n function redraw() {\n var group = d3Selection.select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args) {\n return that.__brush.emitter || new Emitter(that, args);\n }\n\n function Emitter(that, args) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function() {\n if (this.starting) this.starting = false, this.emit(\"start\");\n return this;\n },\n brush: function() {\n this.emit(\"brush\");\n return this;\n },\n end: function() {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n return this;\n },\n emit: function(type) {\n d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function started() {\n if (d3Selection.event.touches) { if (d3Selection.event.changedTouches.length < d3Selection.event.touches.length) return noevent(); }\n else if (touchending) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = d3Selection.event.target.__data__.type,\n mode = (d3Selection.event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx,\n dy,\n moving,\n shifting = signX && signY && d3Selection.event.shiftKey,\n lockX,\n lockY,\n point0 = d3Selection.mouse(that),\n point = point0,\n emit = emitter(that, arguments).beforestart();\n\n if (type === \"overlay\") {\n state.selection = selection = [\n [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n ];\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = d3Selection.select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (d3Selection.event.touches) {\n group\n .on(\"touchmove.brush\", moved, true)\n .on(\"touchend.brush touchcancel.brush\", ended, true);\n } else {\n var view = d3Selection.select(d3Selection.event.view)\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n\n d3Drag.dragDisable(d3Selection.event.view);\n }\n\n nopropagation();\n d3Transition.interrupt(that);\n redraw.call(that);\n emit.start();\n\n function moved() {\n var point1 = d3Selection.mouse(that);\n if (shifting && !lockX && !lockY) {\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n else lockX = true;\n }\n point = point1;\n moving = true;\n noevent();\n move();\n }\n\n function move() {\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush();\n }\n }\n\n function ended() {\n nopropagation();\n if (d3Selection.event.touches) {\n if (d3Selection.event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n group.on(\"touchmove.brush touchend.brush touchcancel.brush\", null);\n } else {\n d3Drag.dragEnable(d3Selection.event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end();\n }\n\n function keydowned() {\n switch (d3Selection.event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n\n function keyupped() {\n switch (d3Selection.event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (d3Selection.event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = extent.apply(this, arguments);\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n\nexports.brush = brush;\nexports.brushX = brushX;\nexports.brushY = brushY;\nexports.brushSelection = brushSelection;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-brush/build/d3-brush.js\n// module id = 40\n// module chunks = 0","// https://d3js.org/d3-drag/ Version 1.1.1. Copyright 2017 Mike Bostock.\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) :\n\t(factory((global.d3 = global.d3 || {}),global.d3,global.d3));\n}(this, (function (exports,d3Dispatch,d3Selection) { 'use strict';\n\nfunction nopropagation() {\n d3Selection.event.stopImmediatePropagation();\n}\n\nvar noevent = function() {\n d3Selection.event.preventDefault();\n d3Selection.event.stopImmediatePropagation();\n};\n\nvar nodrag = function(view) {\n var root = view.document.documentElement,\n selection = d3Selection.select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n};\n\nfunction yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = d3Selection.select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n\nvar constant = function(x) {\n return function() {\n return x;\n };\n};\n\nfunction DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch$$1) {\n this.target = target;\n this.type = type;\n this.subject = subject;\n this.identifier = id;\n this.active = active;\n this.x = x;\n this.y = y;\n this.dx = dx;\n this.dy = dy;\n this._ = dispatch$$1;\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !d3Selection.event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(d) {\n return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d;\n}\n\nfunction touchable() {\n return \"ontouchstart\" in this;\n}\n\nvar drag = function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n gestures = {},\n listeners = d3Dispatch.dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), d3Selection.mouse, this, arguments);\n if (!gesture) return;\n d3Selection.select(d3Selection.event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n nodrag(d3Selection.event.view);\n nopropagation();\n mousemoving = false;\n mousedownx = d3Selection.event.clientX;\n mousedowny = d3Selection.event.clientY;\n gesture(\"start\");\n }\n\n function mousemoved() {\n noevent();\n if (!mousemoving) {\n var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\");\n }\n\n function mouseupped() {\n d3Selection.select(d3Selection.event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(d3Selection.event.view, mousemoving);\n noevent();\n gestures.mouse(\"end\");\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = d3Selection.event.changedTouches,\n c = container.apply(this, arguments),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) {\n nopropagation();\n gesture(\"start\");\n }\n }\n }\n\n function touchmoved() {\n var touches = d3Selection.event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent();\n gesture(\"drag\");\n }\n }\n }\n\n function touchended() {\n var touches = d3Selection.event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation();\n gesture(\"end\");\n }\n }\n }\n\n function beforestart(id, container, point, that, args) {\n var p = point(container, id), s, dx, dy,\n sublisteners = listeners.copy();\n\n if (!d3Selection.customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false;\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n return true;\n })) return;\n\n return function gesture(type) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[id] = gesture, n = active++; break;\n case \"end\": delete gestures[id], --active; // nobreak\n case \"drag\": p = point(container, id), n = active; break;\n }\n d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n};\n\nexports.drag = drag;\nexports.dragDisable = nodrag;\nexports.dragEnable = yesdrag;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/d3-drag/build/d3-drag.js\n// module id = 41\n// module chunks = 0"],"sourceRoot":""}