{"version":3,"file":"kendo.dataviz.core.min.js","names":["factory","define","amd","$","dataviz","services","draw","window","kendo","drawing","util","Path","Group","Class","support","geometry","Rect","Circle","geometryTransform","transform","Segment","deepExtend","isFunction","__common_getter_js","getter","ARC","AXIS_LABEL_CLICK","BLACK","BOTTOM","CENTER","CIRCLE","CROSS","DATE","DEFAULT_FONT","DEFAULT_PRECISION","FORMAT_REGEX","HEIGHT","INSIDE","LEFT","MAX_VALUE","Number","MIN_VALUE","NONE","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","OBJECT","OUTSIDE","RIGHT","ROUNDED_RECT","STRING","TOP","TRIANGLE","WHITE","WIDTH","X","Y","constants","COORD_PRECISION","DEFAULT_HEIGHT","DEFAULT_WIDTH","END","HIGHLIGHT_ZINDEX","START","VALUE","DEFAULT_SERIES_OPACITY","isArray","value","Array","SPACE_REGEX","alignPathToPixel","path","offset","options","stroke","defined","width","i","segments","length","anchor","round","translate","clockwise","angle1","angle2","x","y","isNumber","isNaN","isString","isObject","styleValue","SIZE_STYLES_REGEX","isSizeField","field","test","getSpacing","defaultSpacing","spacing","top","right","bottom","left","current","compile","template","TemplateService","extend","getTemplate","content","grep","array","callback","result","idx","push","register","userImplementation","HashMap","this","_map","inArray","indexOf","prototype","get","name","_key","set","Date","getTime","TRIGGER","InstanceObserver","init","observer","handlers","handlerMap","trigger","args","isDefaultPrevented","callObserver","fnName","arguments$1","arguments","len","apply","requiresHandlers","names","map","browser","ref","append","bindEvents","deg","elementOffset","elementSize","eventCoordinates","eventElement","hashKey","last","limitValue","objectKey","rad","unbindEvents","valueOrDefault","FontLoader","setDefaultOptions","type","proto","sparseArrayLimits","arr","min","max","isFinite","Math","undefined","fetchFonts","fonts","state","depth","document","Object","keys","forEach","key","loadFonts","promises","font","load","e","logToConsole","Promise","all","then","preloadFonts","Matrix","matrixRegexp","transformMatrix","element","getComputedStyle","unit","matrixString","match","members","split","parseFloat","Function","bind","concat","parseMatrix","DELETED","LegacySet","values","_index","_values","slice","filter","item","has","add","delete","index","clear","defineProperties","fn","size","SetWrapper","_set","Set","from","autoMajorUnit","diff","abs","scale","pow","floor","log","relativeValue","Point","clone","equals","point","rotate","center","degrees","theta","cosT","cos","sinT","sin","cx","cy","multiply","a","distanceTo","dx","dy","sqrt","onCircle","angle","radius","radians","Box","x1","y1","x2","y2","box","height","move","wrap","targetBox","wrapPoint","arrayPoint","snapTo","axis","alignTo","targetCenter","shrink","dw","dh","expand","pad","padding","unpad","containsPoint","points","getHash","join","overlaps","rotation","r1","rotatePoint","r2","r3","r4","toRect","hasSize","align","alignment","c1","c2","sizeFunc","Ring","innerRadius","startAngle","middle","setRadius","newRadius","radianAngle","ax","ay","adjacentBox","distance","sector","midAndle","midPoint","hw","hh","sa","ca","p","endAngle","vector","startPoint","startVector","endPoint","endVector","dist","getBBox","angles","allAngles","sort","numericComparer","startAngleIndex","endAngleIndex","b","Sector","call","ShapeBuilder","createRing","arc","Arc","radiusX","radiusY","fromArc","close","innerEnd","pointAt","lineTo","ChartElement","children","initUserOptions","reflow","currentChild","destroy","animation","getRoot","parent","getSender","service","getService","sender","chartService","translateChildren","childrenCount","this$1$1","renderVisual","visible","createVisual","addVisual","renderChildren","createAnimation","renderComplete","visual","chartElement","appendVisual","zIndex","Animation","create","childVisual","noclip","clipRoot","stackRoot","stackVisual","isStackRoot","pos","visuals","sibling","insert","traverse","child","closest","matched","hasHighlight","highlight","createHighlight","toggleHighlight","show","opacity","customVisual","_highlight","highlightOptions","fill","color","highlightVisualArgs","series","dataItem","category","percentage","runningTotal","total","createGradientOverlay","gradientOptions","overlay","createGradient","closed","elements","supportsPointInactiveOpacity","BoxElement","margin","shrinkToFit","hasSetSize","borderWidth","border","reflowPaddingBox","vAlign","paddingBox","contentBox","hasBox","background","fromRect","visualStyle","dashType","cursor","ShapeElement","pointData","getElement","halfWidth","halfHeight","style","fromPoints","MultiPath","moveTo","rect","borderRadius","setCornerRadius","createElement","visualOptions","RADIAL","GRADIENTS","glass","stops","sharpBevel","roundedBevel","roundedGlass","supportVML","sharpGlass","bubbleShadow","boxDiff","r","s","c","d","f","g","h","boxes","RootElement","rootOptions","parseInt","gradients","currentBox","createBackground","drawingGradient","hashCode","gradient","LinearGradient","usedSpace","currentStops","currentStop","innerRadialStops","RadialGradient","cleanGradients","_observers","FloatElement","_initDirection","vertical","groupAxis","elementAxis","groupSizeField","elementSizeField","groupSpacing","elementSpacing","vSpacing","reflowChildren","ref$1","groupOptions","groups","groupsSize","maxGroupElementsSize","groupsCount","groupsStart","alignStart","groupStart","groupIdx","group","groupElements","elementStart","groupElementsCount","elementSize$$1","groupElementStart","groupSize","elementBox","maxSize","start","groupElementsSize","DrawingText","Text","measureText","baseline","topLeft","rectToBox","origin","bottomRight","ROWS_SPLIT_REGEX","TextBox","data","_initContainer","_autoReflow","rows","String","floatElement","textOptions","container","rowIdx","text","trim","visualFn","_boxReflow","visualBox","visualContext","clippedBBox","normalBox","rotatedBox","rotationTransform","context","getDefaultVisual","boxCenter","Title","_textBox","position","collapseVerticalMargins","items","prevBox","buildTitle","defaultOptions","title","titleOptions","orderTitles","titles","reverse","AxisLabel","format","culture","click","widget","alignRotation","bbox","matrix","rotationMatrix","rotationOrigin","alignAxis","distanceAxis","axisAnchor","transformCopy","topRight","bottomLeft","alignEnd","distanceLeft","distanceRight","alignCenter","Note","fields","render","hide","label","icon","childAlias","noteTemplate","auto","aliasFor","marker","wrapperBox","lineStart","line","linePoints","createLine","defaultVisual","eventArgs","preventDefault","over","out","current$1","toString","parseDate","firstDay","IntlService","implementation","FORMAT_REPLACE_REGEX","FormatService","intlService","_intlService","formatString","intl","localeAuto","locale","replace","placeholderFormat","substring","current$2","ChartService","chart","rtl","Boolean","notify","isPannable","pannable","lock","DomEventsBuilder","events","createAxisTick","tickOptions","tickX","tickY","tick","createAxisGridLine","gridLine","lineEnd","Axis","labels","majorTickSize","minorTickSize","minorTicks","minorTickType","majorTicks","majorTickType","initFields","_deferLabels","createLabels","createTitle","createNotes","labelsRange","skip","labelsCount","normalizeLabelRotation","labelOptions","step","clearLabels","autoRotateLabels","range","labelContext","count","createAxisLabel","clearTitle","lineBox","mirror","axisX","axisY","lineWidth","visualSize","notes","parseNoteValue","note","createPlotBands","gridLinesVisual","gridLines","_gridLines","createTicks","lineGroup","majorUnit","tickLineOptions","tickPositions","skipUnit","getMajorTickPositions","getMinorTickPositions","minorUnit","_alignLines","_lineGroup","getActualTickSize","tickSize","_backgroundPath","plotBands","plotArea","_plotbandGroup","altAxis","pane","axes","slotX","slotY","getSlot","to","createPlotBandLabel","bandRect","textbox","labelTemplate","createGridLines","minorGridLines","majorGridLines","axisLineVisible","linePos","lineOptions","sizeFn","titleSize","space","boxSize","maxLabelSize","labelSize","arrangeTitle","arrangeLabels","arrangeNotes","getLabelsTickPositions","labelTickIndex","labelsBetweenTicks","tickIx","firstTickPosition","nextTickPosition","positionStart","positionEnd","positionLabel","labelBox","labelOffset","labelX","labelY","autoRotateLabelAngle","slotWidth","limit","labelAngle","idx$1","slot","shouldRenderNote","noteSlot","secondAxis","axisLabelText","tmpl","defaultText","maxLabelOffset","end","lastLabel","offsetField","startPosition","endPosition","maxStartOffset","maxEndOffset","startTick","endTick","limitRange","rangeSize","minValue","maxValue","valueRange","seriesMin","seriesMax","lineDir","lineInfo","lineSize","axisDir","axisOrigin","pointOffset","scaleToDelta","rawScale","justified","prepareUserOptions","axisCrossingValue","MILLISECONDS","SECONDS","MINUTES","HOURS","DAYS","WEEKS","MONTHS","YEARS","TIME_PER_SECOND","TIME_PER_MINUTE","TIME_PER_HOUR","TIME_PER_DAY","TIME_PER_WEEK","TIME_PER_MONTH","TIME_PER_YEAR","TIME_PER_UNIT","years","months","weeks","days","hours","minutes","seconds","milliseconds","absoluteDateDiff","getTimezoneOffset","addTicks","date","ticks","toDate","startOfWeek","weekStartDay","daysToSubtract","day","getDay","adjustDST","getHours","setHours","addDuration","dateValue","getFullYear","getMonth","getDate","roundedDate","setMinutes","tzDiff","addHours","getSeconds","setSeconds","getMilliseconds","setMilliseconds","floorDate","ceilDate","dateComparer","dateDiff","toTime","dateEquals","timeIndex","baseUnit","dateIndex","baseUnitStep","startDate","duration","parseDates","dates","CategoryAxis","_ticks","categoriesHash","copy","categories","srcCategories","definedMin","definedMax","ceil","rangeIndices","totalRange","totalRangeIndices","roundedRange","_seriesMax","scaleOptions","hideOutOfRangeLabels","valueAxis","firstLabel","getTicks","labelTicks","tickIndices","stepSize","indices","getTickPositions","positions","cache","hash","_hash","hasMinor","filterOutOfRangePositions","inRange","startIndex","endIndex","slotBox","singleSlot","p1","p2","limitSlot","limittedSlot","categoryIndex","pointCategoryIndex","startValue","getCategory","totalIndex","categoryAt","categoriesCount","translateRange","delta","scaleRange","minDelta","maxDelta","zoomRange","totalMin","totalMax","dataItems","hideOutOfRangeNotes","pan","pointsRange","diffStart","diffEnd","rangeMin","rangeMax","_categoriesMap","currentRangeIndices","totalCount","mapCategories","map$$1","COORDINATE_LIMIT","DateLabelFormats","BASE_UNITS","FIT","categoryRange","_range","EmptyDateRange","displayIndices","displayRange","valueIndex","valuesCount","dateAt","DateRange","roundToBaseUnit","lowerEnd","roundToTotalStep","expandEnd","justifyEnd","valueStart","displayStart","next","valueEnd","displayEnd","_indices","minIdx","maxIdx","upper","roundedStep","autoBaseUnit","startUnit","startStep","unitSteps","nextStep","categoryLimits","span","autoBaseUnitSteps","maxDateGroups","autoUnit","autoUnitIx","units","totalUnits","shift","initUnit","toLowerCase","lastCategory","minDiff","categoryIx","defaultBaseUnit","DateCategoryAxis","dataRange","_parsed","panning","userSetBaseUnit","userSetBaseUnitStep","maxDivisions","divisionOptions","dataRangeOptions","divisionRange","rangeLabels","last$$1","splice","isEmpty","totalLimits","panRange","datesRange","indicesRange","fit","autoBaseUnitStep","maxDiff","rangeDiff","baseUnitIndex","stepIndex","createRangeLabels","arrangeRangeLabels","position$1","autoRotateRangeLabels","hideOverlappingLabels","firstRangeLabel","clip","lastRangeLabel","i$1","rangeLabel","unitFormat","dateFormats","createLabel","rotateLabel","dateRange","limitCoordinate","MIN_VALUE_RANGE$1","NumericAxis","autoOptions","narrowRange","autoMin","narrow","axisMin","autoAxisMin","autoMax","axisMax","autoAxisMax","roundToMajorUnit","remainderClose","autoAxisOptions","totalOptions","totalAxisOptions","userOptions","userSetMin","userSetMax","clearNullValues","userSetLimits","axisOptions","totalMajorUnit","getDivisions","stepValue","divisions","skipStep","getValue","endValue","isValidRange","divisor","ratio","remainder","DateValueAxis","timeUnits","baseUnitTime","actualUnits","unitsToAdd","head","tail","applyDefaults","axisCrossingValues","dir","limittedRange","MIN_VALUE_RANGE$2","LogarithmicAxis","base","logMaxRemainder","autoAxisMax$1","autoAxisMin$1","throwNegativeValuesError","initRange","logMin","logMax","floorMax","traverseMajorTicksPositions","tickPosition","traverseMinorTicksPositions","power","minorOptions","_minorIntervalOptions","minorStep","info","Error","GridLinesMixin","majorAngles","minorAngles","skipMajor","majorGridLineAngles","renderMajorGridLines","minorGridLineAngles","renderMinorGridLines","renderGridLines","radiusCallback","circle","gridLineAngles","skipAngles","divs","intervals","altAxisVisible","alpha","intervalAngle","RadarCategoryAxis","reflowLabels","measureBox","skipOption","stepOption","divCount","divAngle","majorIntervals","minorIntervals","interval","minorAngle","minorRadius","band","plotBandSlot","ring","totalDivs","slotAngle","fromValue","slotStart","PolarAxis","instanceOptions","tmp","atan2","PI","RadarNumericAxisMixin","polarAxis","bandStyle","shape","plotBandPoints","innerPoints","outerPoints","innerCircle","outerCircle","radarMajorGridLinePositions","radarMinorGridLinePositions","tickRadius","angleIx","angularDistance","gamma","beta","axisType","RadarNumericAxis","minorSkipStep","RadarLogarithmicAxis","CurveProcessor","process","dataPoints","removeDuplicates","initialControlPoint","lastControlPoint","p0","pop","tangent","controlOut","firstControlPoint","secondControlPoint","controlPoints","tangent$1","cp0","controlPoints$1","cp1","controlPoints$2","tangent$2","invertAxis","lineFunction","calculateFunction","isLine","xField","yField","restrict","switchOrientation","monotonic","isMonotonicByField","numberSign","oldXField","restrictControlPoint","cp","p3","t1","t2","xValue","yValue","controlPoint","Gradients","addClass","classes","classArray","className","removeClass","convertableToNumber","elementStyles","styles","stylesArray","field$1","hasClasses","classNames","interpolateValue","progress","mousewheelDelta","wheelDelta","webkit","devicePixelRatio","detail","find","predicate","elementScale","parentElement","parentMatrix","multiplyCopy","autoTextColor","Color","isDark","createHashSet","supported","defaultErrorHandler","error","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","UP","DOWN","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","lteDateIndex","sortedDates","low","high","currentDate","jQuery","SASS_THEMES","ExportMixin","skipLegacy","exportVisual","exportSVG","exportImage","exportPDF","svg","imageDataURL","Surface","exportGroup","canvas","css","display","appendTo","body","surface","image","_rootElement","toDataURL","remove","calendars","standard","Point2D","Box2D","mwDelta","originalEvent"],"sources":["kendo.dataviz.core.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.drawing'], factory) :\n factory();\n})((function () {\n /***********************************************************************\n * WARNING: this file is auto-generated. If you change it directly,\n * your modifications will eventually be lost. The source code is in\n * `kendo-charts` repository, you should make your changes there and\n * run `src-modules/sync.sh` in this repository.\n */\n\n (function($) {\n /* eslint-disable space-before-blocks, space-before-function-paren, curly */\n\n window.kendo.dataviz = window.kendo.dataviz || {};\n var drawing = kendo.drawing;\n var util = drawing.util;\n var Path = drawing.Path;\n var Group = drawing.Group;\n var Class = kendo.Class;\n var support = kendo.support;\n var geometry = kendo.geometry;\n var Rect = geometry.Rect;\n var Circle = geometry.Circle;\n var geometryTransform = geometry.transform;\n var Segment = geometry.Segment;\n var dataviz = kendo.dataviz;\n\n var deepExtend = kendo.deepExtend;\n var isFunction = kendo.isFunction;\n var __common_getter_js = kendo.getter;\n\n var ARC = \"arc\";\n var AXIS_LABEL_CLICK = \"axisLabelClick\";\n var BLACK = \"#000\";\n var BOTTOM = \"bottom\";\n var CENTER = \"center\";\n var CIRCLE = \"circle\";\n var COORD_PRECISION = 3;\n var CROSS = \"cross\";\n var DATE = \"date\";\n var DEFAULT_FONT = \"12px sans-serif\";\n var DEFAULT_HEIGHT = 400;\n var DEFAULT_PRECISION = 10;\n var DEFAULT_WIDTH = 600;\n var END = \"end\";\n var FORMAT_REGEX = /\\{\\d+:?/;\n var HEIGHT = \"height\";\n var HIGHLIGHT_ZINDEX = 100;\n var INSIDE = \"inside\";\n var LEFT = \"left\";\n var MAX_VALUE = Number.MAX_VALUE;\n var MIN_VALUE = -Number.MAX_VALUE;\n var NONE = \"none\";\n var NOTE_CLICK = \"noteClick\";\n var NOTE_HOVER = \"noteHover\";\n var NOTE_LEAVE = \"noteLeave\";\n var OBJECT = \"object\";\n var OUTSIDE = \"outside\";\n var RIGHT = \"right\";\n var ROUNDED_RECT = \"roundedRect\";\n var START = \"start\";\n var STRING = \"string\";\n var TOP = \"top\";\n var TRIANGLE = \"triangle\";\n var VALUE = \"value\";\n var WHITE = \"#fff\";\n var WIDTH = \"width\";\n var X = \"x\";\n var Y = \"y\";\n var DEFAULT_SERIES_OPACITY = 1;\n\n var constants = {\n \tARC: ARC,\n \tAXIS_LABEL_CLICK: AXIS_LABEL_CLICK,\n \tBLACK: BLACK,\n \tBOTTOM: BOTTOM,\n \tCENTER: CENTER,\n \tCIRCLE: CIRCLE,\n \tCOORD_PRECISION: COORD_PRECISION,\n \tCROSS: CROSS,\n \tDATE: DATE,\n \tDEFAULT_FONT: DEFAULT_FONT,\n \tDEFAULT_HEIGHT: DEFAULT_HEIGHT,\n \tDEFAULT_PRECISION: DEFAULT_PRECISION,\n \tDEFAULT_WIDTH: DEFAULT_WIDTH,\n \tEND: END,\n \tFORMAT_REGEX: FORMAT_REGEX,\n \tHEIGHT: HEIGHT,\n \tHIGHLIGHT_ZINDEX: HIGHLIGHT_ZINDEX,\n \tINSIDE: INSIDE,\n \tLEFT: LEFT,\n \tMAX_VALUE: MAX_VALUE,\n \tMIN_VALUE: MIN_VALUE,\n \tNONE: NONE,\n \tNOTE_CLICK: NOTE_CLICK,\n \tNOTE_HOVER: NOTE_HOVER,\n \tNOTE_LEAVE: NOTE_LEAVE,\n \tOBJECT: OBJECT,\n \tOUTSIDE: OUTSIDE,\n \tRIGHT: RIGHT,\n \tROUNDED_RECT: ROUNDED_RECT,\n \tSTART: START,\n \tSTRING: STRING,\n \tTOP: TOP,\n \tTRIANGLE: TRIANGLE,\n \tVALUE: VALUE,\n \tWHITE: WHITE,\n \tWIDTH: WIDTH,\n \tX: X,\n \tY: Y,\n \tDEFAULT_SERIES_OPACITY: DEFAULT_SERIES_OPACITY\n };\n\n function isArray(value) {\n return Array.isArray(value);\n }\n\n function addClass(element, classes) {\n var classArray = isArray(classes) ? classes : [ classes ];\n\n for (var idx = 0; idx < classArray.length; idx++) {\n var className = classArray[idx];\n if (element.className.indexOf(className) === -1) {\n element.className += \" \" + className;\n }\n }\n }\n\n var SPACE_REGEX = /\\s+/g;\n\n function removeClass(element, className) {\n if (element && element.className) {\n element.className = element.className.replace(className, \"\").replace(SPACE_REGEX, \" \");\n }\n }\n\n function alignPathToPixel(path) {\n var offset = 0.5;\n if (path.options.stroke && kendo.drawing.util.defined(path.options.stroke.width)) {\n if (path.options.stroke.width % 2 === 0) {\n offset = 0;\n }\n }\n\n for (var i = 0; i < path.segments.length; i++) {\n path.segments[i].anchor().round(0).translate(offset, offset);\n }\n\n return path;\n }\n\n function clockwise(angle1, angle2) {\n // True if angle2 is clockwise of angle1\n // assuming angles grow in clock-wise direction\n // (as in the pie and radar charts)\n return -angle1.x * angle2.y + angle1.y * angle2.x < 0;\n }\n\n function isNumber(value) {\n return typeof value === \"number\" && !isNaN(value);\n }\n\n function isString(value) {\n return typeof value === STRING;\n }\n\n function convertableToNumber(value) {\n return isNumber(value) || (isString(value) && isFinite(value));\n }\n\n function isObject(value) {\n return typeof value === \"object\";\n }\n\n function styleValue(value) {\n if (isNumber(value)) {\n return value + \"px\";\n }\n return value;\n }\n\n var SIZE_STYLES_REGEX = /width|height|top|left|bottom|right/i;\n\n function isSizeField(field) {\n return SIZE_STYLES_REGEX.test(field);\n }\n\n function elementStyles(element, styles) {\n var stylesArray = isString(styles) ? [ styles ] : styles;\n\n if (isArray(stylesArray)) {\n var result = {};\n var style = window.getComputedStyle(element);\n\n for (var idx = 0; idx < stylesArray.length; idx++) {\n var field = stylesArray[idx];\n result[field] = isSizeField(field) ? parseFloat(style[field]) : style[field];\n }\n\n return result;\n } else if (isObject(styles)) {\n for (var field$1 in styles) {\n element.style[field$1] = styleValue(styles[field$1]);\n }\n }\n }\n\n function getSpacing(value, defaultSpacing) {\n if (defaultSpacing === void 0) { defaultSpacing = 0; }\n\n var spacing = { top: 0, right: 0, bottom: 0, left: 0 };\n\n if (typeof(value) === \"number\") {\n spacing[TOP] = spacing[RIGHT] = spacing[BOTTOM] = spacing[LEFT] = value;\n } else {\n spacing[TOP] = value[TOP] || defaultSpacing;\n spacing[RIGHT] = value[RIGHT] || defaultSpacing;\n spacing[BOTTOM] = value[BOTTOM] || defaultSpacing;\n spacing[LEFT] = value[LEFT] || defaultSpacing;\n }\n\n return spacing;\n }\n\n var current = {\n compile: function(template) {\n return template;\n }\n };\n\n var TemplateService = Class.extend({\n\n });\n\n TemplateService.register = function(userImplementation) {\n current = userImplementation;\n };\n\n TemplateService.compile = function(template) {\n return current.compile(template);\n };\n\n function getTemplate(options) {\n if (options === void 0) { options = {}; }\n\n var template;\n if (options.template) {\n options.template = template = TemplateService.compile(options.template);\n } else if (isFunction(options.content)) {\n template = options.content;\n }\n\n return template;\n }\n\n function grep(array, callback) {\n var length = array.length;\n var result = [];\n for (var idx = 0; idx < length; idx++) {\n if (callback(array[idx])) {\n result .push(array[idx]);\n }\n }\n\n return result;\n }\n\n function hasClasses(element, classNames) {\n if (element.className) {\n var names = classNames.split(\" \");\n for (var idx = 0; idx < names.length; idx++) {\n if (element.className.indexOf(names[idx]) !== -1) {\n return true;\n }\n }\n }\n }\n\n var HashMap = function HashMap() {\n this._map = {};\n };\n\n HashMap.prototype.get = function get (name) {\n return this._map[this._key(name)];\n };\n\n HashMap.prototype.set = function set (name, value) {\n this._map[this._key(name)] = value;\n };\n\n HashMap.prototype._key = function _key (name) {\n return name instanceof Date ? name.getTime() : name;\n };\n\n function inArray(value, array) {\n if (array) {\n return array.indexOf(value) !== -1;\n }\n }\n\n function interpolateValue(start, end, progress) {\n return kendo.drawing.util.round(start + (end - start) * progress, COORD_PRECISION);\n }\n\n var TRIGGER = 'trigger';\n\n var InstanceObserver = Class.extend({\n init: function(observer, handlers) {\n this.observer = observer;\n this.handlerMap = deepExtend({}, this.handlerMap, handlers);\n },\n\n trigger: function(name, args) {\n var ref = this;\n var observer = ref.observer;\n var handlerMap = ref.handlerMap;\n var isDefaultPrevented;\n if (handlerMap[name]) {\n isDefaultPrevented = this.callObserver(handlerMap[name], args);\n } else if (observer[TRIGGER]) {\n isDefaultPrevented = this.callObserver(TRIGGER, name, args);\n }\n\n return isDefaultPrevented;\n },\n\n callObserver: function(fnName) {\n var arguments$1 = arguments;\n\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) { args[ len ] = arguments$1[ len + 1 ]; }\n\n return this.observer[fnName].apply(this.observer, args);\n },\n\n requiresHandlers: function(names) {\n var this$1$1 = this;\n\n if (this.observer.requiresHandlers) {\n return this.observer.requiresHandlers(names);\n }\n\n for (var idx = 0; idx < names.length; idx++) {\n if (this$1$1.handlerMap[names[idx]]) {\n return true;\n }\n }\n }\n });\n\n function map(array, callback) {\n var length = array.length;\n var result = [];\n for (var idx = 0; idx < length; idx++) {\n var value = callback(array[idx]);\n if (kendo.drawing.util.defined(value)) {\n result.push(value);\n }\n }\n return result;\n }\n\n var browser = support.browser || {};\n\n function mousewheelDelta(e) {\n var delta = 0;\n\n if (e.wheelDelta) {\n delta = -e.wheelDelta / 120;\n\n if (browser.webkit) {\n // Webkit browsers scale the delta by twice the device resolution.\n // Possibly related to https://bugs.webkit.org/show_bug.cgi?id=196339\n //\n // Low device resolutions (e.g. zoom-out to 30%) also behave strangely.\n delta = delta / (2 * Math.max(window.devicePixelRatio, 0.625));\n }\n } else if (e.detail) {\n delta = e.detail / 3;\n }\n\n delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\n return delta;\n }\n\n var ref = kendo.drawing.util;\n var append = ref.append;\n var bindEvents = ref.bindEvents;\n var defined = ref.defined;\n var deg = ref.deg;\n var elementOffset = ref.elementOffset;\n var elementSize = ref.elementSize;\n var eventCoordinates = ref.eventCoordinates;\n var eventElement = ref.eventElement;\n var hashKey = ref.hashKey;\n var last = ref.last;\n var limitValue = ref.limitValue;\n var objectKey = ref.objectKey;\n var rad = ref.rad;\n var round = ref.round;\n var unbindEvents = ref.unbindEvents;\n var valueOrDefault = ref.valueOrDefault;\n\n var FontLoader = Class.extend({\n\n });\n\n FontLoader.fetchFonts = function(options, fonts, state) {\n if (state === void 0) { state = { depth: 0 }; }\n\n var MAX_DEPTH = 5;\n\n if (!options || state.depth > MAX_DEPTH || !document.fonts) {\n return;\n }\n\n Object.keys(options).forEach(function(key) {\n var value = options[key];\n if (key === \"dataSource\" || key[0] === \"$\" || !value) {\n return;\n }\n\n if (key === \"font\") {\n fonts.push(value);\n } else if (typeof value === \"object\") {\n state.depth++;\n FontLoader.fetchFonts(value, fonts, state);\n state.depth--;\n }\n });\n };\n\n FontLoader.loadFonts = function(fonts, callback) {\n var promises = [];\n\n if (fonts.length > 0 && document.fonts) {\n try {\n promises = fonts.map(function(font) {\n return document.fonts.load(font);\n });\n } catch (e) {\n // Silence font-loading errors\n kendo.logToConsole(e);\n }\n\n Promise.all(promises).then(callback, callback);\n } else {\n callback();\n }\n };\n\n FontLoader.preloadFonts = function(options, callback) {\n var fonts = [];\n FontLoader.fetchFonts(options, fonts);\n\n FontLoader.loadFonts(fonts, callback);\n };\n\n function setDefaultOptions(type, options) {\n var proto = type.prototype;\n if (proto.options) {\n proto.options = deepExtend({}, proto.options, options);\n } else {\n proto.options = options;\n }\n }\n\n function sparseArrayLimits(arr) {\n var min = MAX_VALUE;\n var max = MIN_VALUE;\n\n for (var idx = 0, length = arr.length; idx < length; idx++) {\n var value = arr[idx];\n if (value !== null && isFinite(value)) {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n }\n\n return {\n min: min === MAX_VALUE ? undefined : min,\n max: max === MIN_VALUE ? undefined : max\n };\n }\n\n function find(array, predicate) {\n for (var i = 0; i < array.length; i++) {\n var item = array[i];\n if (predicate(item, i, array)) {\n return item;\n }\n }\n }\n\n var Matrix = geometry.Matrix;\n var matrixRegexp = /matrix\\((.*)\\)/;\n\n function parseMatrix(matrixString) {\n var match = matrixString.match(matrixRegexp);\n if (match === null || match.length !== 2) {\n return Matrix.unit();\n }\n\n var members = match[1].split(',').map(function (x) { return parseFloat(x); });\n return new (Function.prototype.bind.apply( Matrix, [ null ].concat( members) ));\n }\n\n function transformMatrix(element) {\n var transform = getComputedStyle(element).transform;\n\n if (transform === 'none') {\n return Matrix.unit();\n }\n\n return parseMatrix(transform);\n }\n\n function elementScale(element) {\n if (!element) {\n return Matrix.unit();\n }\n\n var matrix = transformMatrix(element);\n var parent = element.parentElement;\n while (parent) {\n var parentMatrix = transformMatrix(parent);\n matrix = matrix.multiplyCopy(parentMatrix);\n parent = parent.parentElement;\n }\n\n matrix.b = matrix.c = matrix.e = matrix.f = 0;\n return matrix;\n }\n\n function autoTextColor(color) {\n var isDark = new kendo.Color(color).isDark();\n if (isDark) {\n return WHITE;\n }\n\n return BLACK;\n }\n\n var DELETED = {};\n\n var LegacySet = Class.extend({\n init: function(values) {\n var this$1$1 = this;\n\n this._index = {};\n this._values = values ? values.slice(0) : [];\n\n for (var i = 0; i < this._values.length; i++) {\n this$1$1._index[this$1$1._values[i]] = i;\n }\n },\n\n values: function() {\n return this._values.filter(function (item) { return item !== DELETED; });\n },\n\n has: function(value) {\n return this._index[value] !== undefined;\n },\n\n add: function(value) {\n if (!this.has(value)) {\n this._index[value] = this._values.length;\n this._values.push(value);\n }\n },\n\n delete: function(value) {\n var index = this._index[value];\n if (index !== undefined) {\n this._values[index] = DELETED;\n delete this._index[value];\n }\n },\n\n clear: function() {\n this._index = {};\n this._values = [];\n }\n });\n\n if (Object.defineProperties) {\n Object.defineProperties(LegacySet.fn, {\n size: {\n get: function() {\n return this._values.length;\n }\n }\n });\n }\n\n var SetWrapper = Class.extend({\n init: function(values) {\n this._set = new Set(values);\n },\n\n values: function() {\n return Array.from(this._set);\n },\n\n has: function(value) {\n return this._set.has(value);\n },\n\n add: function(value) {\n this._set.add(value);\n },\n\n delete: function(value) {\n this._set.delete(value);\n },\n\n clear: function() {\n this._set.clear();\n }\n });\n\n if (Object.defineProperties) {\n Object.defineProperties(SetWrapper.fn, {\n size: {\n get: function() {\n return this._set.size;\n }\n }\n });\n }\n\n // TODO: Drop LegacySet when removing support for IE10\n var supportsSet = function () {\n var supported = false;\n\n if (typeof Set === 'function') {\n var set = new Set([1]);\n supported = set.has(1);\n }\n\n return supported;\n };\n\n function createHashSet(values) {\n if (supportsSet()) {\n return new SetWrapper(values);\n }\n\n return new LegacySet(values);\n }\n\n function defaultErrorHandler(error) {\n throw error;\n }\n\n var keys = {\n INSERT: 45,\n DELETE: 46,\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n END: 35,\n HOME: 36,\n SPACEBAR: 32,\n PAGEUP: 33,\n PAGEDOWN: 34,\n F2: 113,\n F10: 121,\n F12: 123,\n NUMPAD_PLUS: 107,\n NUMPAD_MINUS: 109,\n NUMPAD_DOT: 110\n };\n\n function autoMajorUnit(min, max) {\n var diff = round(max - min, DEFAULT_PRECISION - 1);\n\n if (diff === 0) {\n if (max === 0) {\n return 0.1;\n }\n\n diff = Math.abs(max);\n }\n\n var scale = Math.pow(10, Math.floor(Math.log(diff) / Math.log(10)));\n var relativeValue = round((diff / scale), DEFAULT_PRECISION);\n var scaleMultiplier = 1;\n\n if (relativeValue < 1.904762) {\n scaleMultiplier = 0.2;\n } else if (relativeValue < 4.761904) {\n scaleMultiplier = 0.5;\n } else if (relativeValue < 9.523809) {\n scaleMultiplier = 1;\n } else {\n scaleMultiplier = 2;\n }\n\n return round(scale * scaleMultiplier, DEFAULT_PRECISION);\n }\n\n var Point = Class.extend({\n init: function(x, y) {\n\n this.x = x || 0;\n this.y = y || 0;\n },\n\n clone: function() {\n return new Point(this.x, this.y);\n },\n\n equals: function(point) {\n return point && this.x === point.x && this.y === point.y;\n },\n\n rotate: function(center, degrees) {\n var theta = rad(degrees);\n var cosT = Math.cos(theta);\n var sinT = Math.sin(theta);\n var cx = center.x;\n var cy = center.y;\n var ref = this;\n var x = ref.x;\n var y = ref.y;\n\n this.x = round(\n cx + (x - cx) * cosT + (y - cy) * sinT,\n COORD_PRECISION\n );\n\n this.y = round(\n cy + (y - cy) * cosT - (x - cx) * sinT,\n COORD_PRECISION\n );\n\n return this;\n },\n\n multiply: function(a) {\n\n this.x *= a;\n this.y *= a;\n\n return this;\n },\n\n distanceTo: function(point) {\n var dx = this.x - point.x;\n var dy = this.y - point.y;\n\n return Math.sqrt(dx * dx + dy * dy);\n }\n });\n\n Point.onCircle = function(center, angle, radius) {\n var radians = rad(angle);\n\n return new Point(\n center.x - radius * Math.cos(radians),\n center.y - radius * Math.sin(radians)\n );\n };\n\n var Box = Class.extend({\n init: function(x1, y1, x2, y2) {\n\n this.x1 = x1 || 0;\n this.y1 = y1 || 0;\n this.x2 = x2 || 0;\n this.y2 = y2 || 0;\n },\n\n equals: function(box) {\n return this.x1 === box.x1 && this.x2 === box.x2 &&\n this.y1 === box.y1 && this.y2 === box.y2;\n },\n\n width: function() {\n return this.x2 - this.x1;\n },\n\n height: function() {\n return this.y2 - this.y1;\n },\n\n translate: function(dx, dy) {\n this.x1 += dx;\n this.x2 += dx;\n this.y1 += dy;\n this.y2 += dy;\n\n return this;\n },\n\n move: function(x, y) {\n var height = this.height();\n var width = this.width();\n\n if (defined(x)) {\n this.x1 = x;\n this.x2 = this.x1 + width;\n }\n\n if (defined(y)) {\n this.y1 = y;\n this.y2 = this.y1 + height;\n }\n\n return this;\n },\n\n wrap: function(targetBox) {\n this.x1 = Math.min(this.x1, targetBox.x1);\n this.y1 = Math.min(this.y1, targetBox.y1);\n this.x2 = Math.max(this.x2, targetBox.x2);\n this.y2 = Math.max(this.y2, targetBox.y2);\n\n return this;\n },\n\n wrapPoint: function(point) {\n var arrayPoint = isArray(point);\n var x = arrayPoint ? point[0] : point.x;\n var y = arrayPoint ? point[1] : point.y;\n this.wrap(new Box(x, y, x, y));\n\n return this;\n },\n\n snapTo: function(targetBox, axis) {\n\n if (axis === X || !axis) {\n this.x1 = targetBox.x1;\n this.x2 = targetBox.x2;\n }\n\n if (axis === Y || !axis) {\n this.y1 = targetBox.y1;\n this.y2 = targetBox.y2;\n }\n\n return this;\n },\n\n alignTo: function(targetBox, anchor) {\n var height = this.height();\n var width = this.width();\n var axis = anchor === TOP || anchor === BOTTOM ? Y : X;\n var offset = axis === Y ? height : width;\n\n if (anchor === CENTER) {\n var targetCenter = targetBox.center();\n var center = this.center();\n\n this.x1 += targetCenter.x - center.x;\n this.y1 += targetCenter.y - center.y;\n } else if (anchor === TOP || anchor === LEFT) {\n this[axis + 1] = targetBox[axis + 1] - offset;\n } else {\n this[axis + 1] = targetBox[axis + 2];\n }\n\n this.x2 = this.x1 + width;\n this.y2 = this.y1 + height;\n\n return this;\n },\n\n shrink: function(dw, dh) {\n\n this.x2 -= dw;\n this.y2 -= dh;\n\n return this;\n },\n\n expand: function(dw, dh) {\n this.shrink(-dw, -dh);\n return this;\n },\n\n pad: function(padding) {\n var spacing = getSpacing(padding);\n\n this.x1 -= spacing.left;\n this.x2 += spacing.right;\n this.y1 -= spacing.top;\n this.y2 += spacing.bottom;\n\n return this;\n },\n\n unpad: function(padding) {\n var spacing = getSpacing(padding);\n\n spacing.left = -spacing.left;\n spacing.top = -spacing.top;\n spacing.right = -spacing.right;\n spacing.bottom = -spacing.bottom;\n\n return this.pad(spacing);\n },\n\n clone: function() {\n return new Box(this.x1, this.y1, this.x2, this.y2);\n },\n\n center: function() {\n return new Point(\n this.x1 + this.width() / 2,\n this.y1 + this.height() / 2\n );\n },\n\n containsPoint: function(point) {\n\n return point.x >= this.x1 && point.x <= this.x2 &&\n point.y >= this.y1 && point.y <= this.y2;\n },\n\n points: function() {\n return [\n new Point(this.x1, this.y1),\n new Point(this.x2, this.y1),\n new Point(this.x2, this.y2),\n new Point(this.x1, this.y2)\n ];\n },\n\n getHash: function() {\n return [ this.x1, this.y1, this.x2, this.y2 ].join(\",\");\n },\n\n overlaps: function(box) {\n return !(box.y2 < this.y1 || this.y2 < box.y1 || box.x2 < this.x1 || this.x2 < box.x1);\n },\n\n rotate: function(rotation) {\n var width = this.width();\n var height = this.height();\n var ref = this.center();\n var cx = ref.x;\n var cy = ref.y;\n\n var r1 = rotatePoint(0, 0, cx, cy, rotation);\n var r2 = rotatePoint(width, 0, cx, cy, rotation);\n var r3 = rotatePoint(width, height, cx, cy, rotation);\n var r4 = rotatePoint(0, height, cx, cy, rotation);\n\n width = Math.max(r1.x, r2.x, r3.x, r4.x) - Math.min(r1.x, r2.x, r3.x, r4.x);\n height = Math.max(r1.y, r2.y, r3.y, r4.y) - Math.min(r1.y, r2.y, r3.y, r4.y);\n\n this.x2 = this.x1 + width;\n this.y2 = this.y1 + height;\n\n return this;\n },\n\n toRect: function() {\n return new Rect([ this.x1, this.y1 ], [ this.width(), this.height() ]);\n },\n\n hasSize: function() {\n return this.width() !== 0 && this.height() !== 0;\n },\n\n align: function(targetBox, axis, alignment) {\n var c1 = axis + 1;\n var c2 = axis + 2;\n var sizeFunc = axis === X ? WIDTH : HEIGHT;\n var size = this[sizeFunc]();\n\n if (inArray(alignment, [ LEFT, TOP ])) {\n this[c1] = targetBox[c1];\n this[c2] = this[c1] + size;\n } else if (inArray(alignment, [ RIGHT, BOTTOM ])) {\n this[c2] = targetBox[c2];\n this[c1] = this[c2] - size;\n } else if (alignment === CENTER) {\n this[c1] = targetBox[c1] + (targetBox[sizeFunc]() - size) / 2;\n this[c2] = this[c1] + size;\n }\n }\n });\n\n function rotatePoint(x, y, cx, cy, angle) {\n var theta = rad(angle);\n\n return new Point(\n cx + (x - cx) * Math.cos(theta) + (y - cy) * Math.sin(theta),\n cy - (x - cx) * Math.sin(theta) + (y - cy) * Math.cos(theta)\n );\n }\n\n var Ring = Class.extend({\n init: function(center, innerRadius, radius, startAngle, angle) {\n\n this.center = center;\n this.innerRadius = innerRadius;\n this.radius = radius;\n this.startAngle = startAngle;\n this.angle = angle;\n },\n\n clone: function() {\n return new Ring(this.center, this.innerRadius, this.radius, this.startAngle, this.angle);\n },\n\n middle: function() {\n return this.startAngle + this.angle / 2;\n },\n\n setRadius: function(newRadius, innerRadius) {\n if (innerRadius) {\n this.innerRadius = newRadius;\n } else {\n this.radius = newRadius;\n }\n\n return this;\n },\n\n point: function(angle, innerRadius) {\n var radianAngle = rad(angle);\n var ax = Math.cos(radianAngle);\n var ay = Math.sin(radianAngle);\n var radius = innerRadius ? this.innerRadius : this.radius;\n var x = round(this.center.x - (ax * radius), COORD_PRECISION);\n var y = round(this.center.y - (ay * radius), COORD_PRECISION);\n\n return new Point(x, y);\n },\n\n adjacentBox: function(distance, width, height) {\n var sector = this.clone().expand(distance);\n var midAndle = sector.middle();\n var midPoint = sector.point(midAndle);\n var hw = width / 2;\n var hh = height / 2;\n var sa = Math.sin(rad(midAndle));\n var ca = Math.cos(rad(midAndle));\n var x = midPoint.x - hw;\n var y = midPoint.y - hh;\n\n if (Math.abs(sa) < 0.9) {\n x += hw * -ca / Math.abs(ca);\n }\n\n if (Math.abs(ca) < 0.9) {\n y += hh * -sa / Math.abs(sa);\n }\n\n return new Box(x, y, x + width, y + height);\n },\n\n containsPoint: function(p) {\n var center = this.center;\n var innerRadius = this.innerRadius;\n var radius = this.radius;\n var startAngle = this.startAngle;\n var endAngle = this.startAngle + this.angle;\n var dx = p.x - center.x;\n var dy = p.y - center.y;\n var vector = new Point(dx, dy);\n var startPoint = this.point(startAngle);\n var startVector = new Point(startPoint.x - center.x, startPoint.y - center.y);\n var endPoint = this.point(endAngle);\n var endVector = new Point(endPoint.x - center.x, endPoint.y - center.y);\n var dist = round(dx * dx + dy * dy, COORD_PRECISION);\n\n return (startVector.equals(vector) || clockwise(startVector, vector)) &&\n !clockwise(endVector, vector) &&\n dist >= innerRadius * innerRadius && dist <= radius * radius;\n },\n\n getBBox: function() {\n var this$1$1 = this;\n\n var box = new Box(MAX_VALUE, MAX_VALUE, MIN_VALUE, MIN_VALUE);\n var startAngle = round(this.startAngle % 360);\n var endAngle = round((startAngle + this.angle) % 360);\n var innerRadius = this.innerRadius;\n var allAngles = [ 0, 90, 180, 270, startAngle, endAngle ].sort(numericComparer);\n var startAngleIndex = allAngles.indexOf(startAngle);\n var endAngleIndex = allAngles.indexOf(endAngle);\n var angles;\n\n if (startAngle === endAngle) {\n angles = allAngles;\n } else {\n if (startAngleIndex < endAngleIndex) {\n angles = allAngles.slice(startAngleIndex, endAngleIndex + 1);\n } else {\n angles = [].concat(\n allAngles.slice(0, endAngleIndex + 1),\n allAngles.slice(startAngleIndex, allAngles.length)\n );\n }\n }\n\n for (var i = 0; i < angles.length; i++) {\n var point = this$1$1.point(angles[i]);\n box.wrapPoint(point);\n box.wrapPoint(point, innerRadius);\n }\n\n if (!innerRadius) {\n box.wrapPoint(this.center);\n }\n\n return box;\n },\n\n expand: function(value) {\n this.radius += value;\n return this;\n }\n });\n\n function numericComparer(a, b) {\n return a - b;\n }\n\n var Sector = Ring.extend({\n init: function(center, radius, startAngle, angle) {\n Ring.fn.init.call(this, center, 0, radius, startAngle, angle);\n },\n\n expand: function(value) {\n return Ring.fn.expand.call(this, value);\n },\n\n clone: function() {\n return new Sector(this.center, this.radius, this.startAngle, this.angle);\n },\n\n setRadius: function(newRadius) {\n this.radius = newRadius;\n\n return this;\n }\n });\n\n var DIRECTION_ANGLE = 0.001; //any value that will make the endAngle bigger than the start angle will work here.\n\n var ShapeBuilder = Class.extend({\n createRing: function(sector, options) {\n var startAngle = sector.startAngle + 180;\n var endAngle = sector.angle + startAngle;\n\n //required in order to avoid reversing the arc direction in cases like 0.000000000000001 + 100 === 100\n if (sector.angle > 0 && startAngle === endAngle) {\n endAngle += DIRECTION_ANGLE;\n }\n\n var center = new geometry.Point(sector.center.x, sector.center.y);\n var radius = Math.max(sector.radius, 0);\n var innerRadius = Math.max(sector.innerRadius, 0);\n var arc = new geometry.Arc(center, {\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: radius,\n radiusY: radius\n });\n var path = Path.fromArc(arc, options).close();\n\n if (innerRadius) {\n arc.radiusX = arc.radiusY = innerRadius;\n var innerEnd = arc.pointAt(endAngle);\n path.lineTo(innerEnd.x, innerEnd.y);\n path.arc(endAngle, startAngle, innerRadius, innerRadius, true);\n } else {\n path.lineTo(center.x, center.y);\n }\n\n return path;\n }\n });\n\n ShapeBuilder.current = new ShapeBuilder();\n\n var ChartElement = Class.extend({\n init: function(options) {\n\n this.children = [];\n\n this.options = deepExtend({}, this.options, this.initUserOptions(options));\n },\n\n initUserOptions: function(options) {\n return options;\n },\n\n reflow: function(targetBox) {\n var children = this.children;\n var box;\n\n for (var i = 0; i < children.length; i++) {\n var currentChild = children[i];\n currentChild.reflow(targetBox);\n\n box = box ? box.wrap(currentChild.box) : currentChild.box.clone();\n }\n\n this.box = box || targetBox;\n },\n\n destroy: function() {\n var children = this.children;\n\n if (this.animation) {\n this.animation.destroy();\n }\n\n for (var i = 0; i < children.length; i++) {\n children[i].destroy();\n }\n },\n\n getRoot: function() {\n var parent = this.parent;\n\n return parent ? parent.getRoot() : null;\n },\n\n getSender: function() {\n var service = this.getService();\n if (service) {\n return service.sender;\n }\n },\n\n getService: function() {\n var element = this;\n while (element) {\n if (element.chartService) {\n return element.chartService;\n }\n element = element.parent;\n }\n },\n\n translateChildren: function(dx, dy) {\n var children = this.children;\n var childrenCount = children.length;\n\n for (var i = 0; i < childrenCount; i++) {\n children[i].box.translate(dx, dy);\n }\n },\n\n append: function() {\n var arguments$1 = arguments;\n var this$1$1 = this;\n\n for (var i = 0; i < arguments.length; i++) {\n var item = arguments$1[i];\n this$1$1.children.push(item);\n item.parent = this$1$1;\n }\n },\n\n renderVisual: function() {\n if (this.options.visible === false) {\n return;\n }\n\n this.createVisual();\n\n this.addVisual();\n\n this.renderChildren();\n\n this.createAnimation();\n this.renderComplete();\n },\n\n addVisual: function() {\n if (this.visual) {\n this.visual.chartElement = this;\n\n if (this.parent) {\n this.parent.appendVisual(this.visual);\n }\n }\n },\n\n renderChildren: function() {\n var children = this.children;\n var length = children.length;\n for (var i = 0; i < length; i++) {\n children[i].renderVisual();\n }\n },\n\n createVisual: function() {\n this.visual = new Group({\n zIndex: this.options.zIndex,\n visible: valueOrDefault(this.options.visible, true)\n });\n },\n\n createAnimation: function() {\n if (this.visual && this.options.animation) {\n this.animation = drawing.Animation.create(\n this.visual, this.options.animation\n );\n }\n },\n\n appendVisual: function(childVisual) {\n if (!childVisual.chartElement) {\n childVisual.chartElement = this;\n }\n\n if (childVisual.options.noclip) {\n this.clipRoot().visual.append(childVisual);\n } else if (defined(childVisual.options.zIndex)) {\n this.stackRoot().stackVisual(childVisual);\n } else if (this.isStackRoot) {\n this.stackVisual(childVisual);\n } else if (this.visual) {\n this.visual.append(childVisual);\n } else {\n // Allow chart elements without visuals to\n // pass through child visuals\n this.parent.appendVisual(childVisual);\n }\n },\n\n clipRoot: function() {\n if (this.parent) {\n return this.parent.clipRoot();\n }\n\n return this;\n },\n\n stackRoot: function() {\n if (this.parent) {\n return this.parent.stackRoot();\n }\n\n return this;\n },\n\n stackVisual: function(childVisual) {\n var zIndex = childVisual.options.zIndex || 0;\n var visuals = this.visual.children;\n var length = visuals.length;\n var pos;\n\n for (pos = 0; pos < length; pos++) {\n var sibling = visuals[pos];\n var here = valueOrDefault(sibling.options.zIndex, 0);\n if (here > zIndex) {\n break;\n }\n }\n\n this.visual.insert(pos, childVisual);\n },\n\n traverse: function(callback) {\n var children = this.children;\n var length = children.length;\n\n for (var i = 0; i < length; i++) {\n var child = children[i];\n\n callback(child);\n if (child.traverse) {\n child.traverse(callback);\n }\n }\n },\n\n closest: function(match) {\n var element = this;\n var matched = false;\n\n while (element && !matched) {\n matched = match(element);\n\n if (!matched) {\n element = element.parent;\n }\n }\n\n if (matched) {\n return element;\n }\n },\n\n renderComplete: function() {},\n\n hasHighlight: function() {\n var options = (this.options || {}).highlight;\n return !(!this.createHighlight || (options && options.visible === false));\n },\n\n toggleHighlight: function(show, opacity) {\n var this$1$1 = this;\n\n var options = (this.options || {}).highlight || {};\n var customVisual = options.visual;\n var highlight = this._highlight;\n\n if (!highlight) {\n var highlightOptions = {\n fill: {\n color: WHITE,\n opacity: opacity || 0.2\n },\n stroke: {\n color: WHITE,\n width: 1,\n opacity: opacity || 0.2\n }\n };\n\n if (customVisual) {\n highlight = this._highlight = customVisual(\n $.extend(this.highlightVisualArgs(), {\n createVisual: function () { return this$1$1.createHighlight(highlightOptions); },\n sender: this.getSender(),\n series: this.series,\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n percentage: this.percentage,\n runningTotal: this.runningTotal,\n total: this.total\n }\n ));\n\n if (!highlight) {\n return;\n }\n } else {\n highlight = this._highlight = this.createHighlight(highlightOptions);\n }\n\n if (!defined(highlight.options.zIndex)) {\n highlight.options.zIndex = valueOrDefault(options.zIndex, this.options.zIndex);\n }\n\n this.appendVisual(highlight);\n }\n\n highlight.visible(show);\n },\n\n createGradientOverlay: function(element, options, gradientOptions) {\n var overlay = new Path($.extend({\n stroke: {\n color: \"none\"\n },\n fill: this.createGradient(gradientOptions),\n closed: element.options.closed\n }, options));\n\n overlay.segments.elements(element.segments.elements());\n\n return overlay;\n },\n\n createGradient: function(options) {\n if (this.parent) {\n return this.parent.createGradient(options);\n }\n },\n\n supportsPointInactiveOpacity: function() {\n return true;\n }\n });\n\n ChartElement.prototype.options = { };\n\n var BoxElement = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n\n this.options.margin = getSpacing(this.options.margin);\n this.options.padding = getSpacing(this.options.padding);\n },\n\n reflow: function(targetBox) {\n var this$1$1 = this;\n\n var options = this.options;\n var width = options.width;\n var height = options.height;\n var shrinkToFit = options.shrinkToFit;\n var hasSetSize = width && height;\n var margin = options.margin;\n var padding = options.padding;\n var borderWidth = options.border.width;\n var box;\n\n var reflowPaddingBox = function () {\n this$1$1.align(targetBox, X, options.align);\n this$1$1.align(targetBox, Y, options.vAlign);\n this$1$1.paddingBox = box.clone().unpad(margin).unpad(borderWidth);\n };\n\n var contentBox = targetBox.clone();\n if (hasSetSize) {\n contentBox.x2 = contentBox.x1 + width;\n contentBox.y2 = contentBox.y1 + height;\n }\n\n if (shrinkToFit) {\n contentBox.unpad(margin).unpad(borderWidth).unpad(padding);\n }\n\n ChartElement.fn.reflow.call(this, contentBox);\n\n if (hasSetSize) {\n box = this.box = new Box(0, 0, width, height);\n } else {\n box = this.box;\n }\n\n if (shrinkToFit && hasSetSize) {\n reflowPaddingBox();\n contentBox = this.contentBox = this.paddingBox.clone().unpad(padding);\n } else {\n contentBox = this.contentBox = box.clone();\n box.pad(padding).pad(borderWidth).pad(margin);\n reflowPaddingBox();\n }\n\n this.translateChildren(\n box.x1 - contentBox.x1 + margin.left + borderWidth + padding.left,\n box.y1 - contentBox.y1 + margin.top + borderWidth + padding.top\n );\n\n var children = this.children;\n for (var i = 0; i < children.length; i++) {\n var item = children[i];\n item.reflow(item.box);\n }\n },\n\n align: function(targetBox, axis, alignment) {\n this.box.align(targetBox, axis, alignment);\n },\n\n hasBox: function() {\n var options = this.options;\n return options.border.width || options.background;\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n var options = this.options;\n if (options.visible && this.hasBox()) {\n this.visual.append(Path.fromRect(\n this.paddingBox.toRect(),\n this.visualStyle()\n ));\n }\n },\n\n visualStyle: function() {\n var options = this.options;\n var border = options.border || {};\n\n return {\n stroke: {\n width: border.width,\n color: border.color,\n opacity: valueOrDefault(border.opacity, options.opacity),\n dashType: border.dashType\n },\n fill: {\n color: options.background,\n opacity: options.opacity\n },\n cursor: options.cursor\n };\n }\n });\n\n setDefaultOptions(BoxElement, {\n align: LEFT,\n vAlign: TOP,\n margin: {},\n padding: {},\n border: {\n color: BLACK,\n width: 0\n },\n background: \"\",\n shrinkToFit: false,\n width: 0,\n height: 0,\n visible: true\n });\n\n var ShapeElement = BoxElement.extend({\n init: function(options, pointData) {\n BoxElement.fn.init.call(this, options);\n\n this.pointData = pointData;\n },\n\n getElement: function() {\n var ref = this;\n var options = ref.options;\n var box = ref.paddingBox;\n var type = options.type;\n var rotation = options.rotation;\n var center = box.center();\n var halfWidth = box.width() / 2;\n var halfHeight = box.height() / 2;\n\n if (!options.visible || !this.hasBox()) {\n return null;\n }\n\n var style = this.visualStyle();\n var element;\n\n if (type === CIRCLE) {\n element = new drawing.Circle(\n new Circle([\n round(box.x1 + halfWidth, COORD_PRECISION),\n round(box.y1 + halfHeight, COORD_PRECISION)\n ], Math.min(halfWidth, halfHeight)),\n style\n );\n } else if (type === TRIANGLE) {\n element = Path.fromPoints([\n [ box.x1 + halfWidth, box.y1 ],\n [ box.x1, box.y2 ],\n [ box.x2, box.y2 ]\n ], style).close();\n } else if (type === CROSS) {\n element = new drawing.MultiPath(style);\n\n element.moveTo(box.x1, box.y1).lineTo(box.x2, box.y2);\n element.moveTo(box.x1, box.y2).lineTo(box.x2, box.y1);\n } else {\n var rect = box.toRect();\n if (type === ROUNDED_RECT) {\n var borderRadius = valueOrDefault(options.borderRadius, rect.width() / 5);\n rect.setCornerRadius(borderRadius);\n }\n\n element = Path.fromRect(rect, style);\n }\n\n if (rotation) {\n element.transform(geometryTransform()\n .rotate(-rotation, [ center.x, center.y ])\n );\n }\n\n element.options.zIndex = options.zIndex;\n\n return element;\n },\n\n createElement: function() {\n var this$1$1 = this;\n\n var customVisual = this.options.visual;\n var pointData = this.pointData || {};\n var visual;\n\n if (customVisual) {\n visual = customVisual({\n value: pointData.value,\n dataItem: pointData.dataItem,\n sender: this.getSender(),\n series: pointData.series,\n category: pointData.category,\n rect: this.paddingBox.toRect(),\n options: this.visualOptions(),\n createVisual: function () { return this$1$1.getElement(); }\n });\n } else {\n visual = this.getElement();\n }\n\n return visual;\n },\n\n visualOptions: function() {\n var options = this.options;\n return {\n background: options.background,\n border: options.border,\n margin: options.margin,\n padding: options.padding,\n type: options.type,\n size: options.width,\n visible: options.visible\n };\n },\n\n createVisual: function() {\n this.visual = this.createElement();\n }\n });\n\n setDefaultOptions(ShapeElement, {\n type: CIRCLE,\n align: CENTER,\n vAlign: CENTER\n });\n\n var LINEAR = \"linear\";\n var RADIAL = \"radial\";\n\n var GRADIENTS = {\n glass: {\n type: LINEAR,\n rotation: 0,\n stops: [ {\n offset: 0,\n color: WHITE,\n opacity: 0\n }, {\n offset: 0.25,\n color: WHITE,\n opacity: 0.3\n }, {\n offset: 1,\n color: WHITE,\n opacity: 0\n } ]\n },\n sharpBevel: {\n type: RADIAL,\n stops: [ {\n offset: 0,\n color: WHITE,\n opacity: 0.55\n }, {\n offset: 0.65,\n color: WHITE,\n opacity: 0\n }, {\n offset: 0.95,\n color: WHITE,\n opacity: 0.25\n } ]\n },\n roundedBevel: {\n type: RADIAL,\n stops: [ {\n offset: 0.33,\n color: WHITE,\n opacity: 0.06\n }, {\n offset: 0.83,\n color: WHITE,\n opacity: 0.2\n }, {\n offset: 0.95,\n color: WHITE,\n opacity: 0\n } ]\n },\n roundedGlass: {\n type: RADIAL,\n supportVML: false,\n stops: [ {\n offset: 0,\n color: WHITE,\n opacity: 0\n }, {\n offset: 0.5,\n color: WHITE,\n opacity: 0.3\n }, {\n offset: 0.99,\n color: WHITE,\n opacity: 0\n } ]\n },\n sharpGlass: {\n type: RADIAL,\n supportVML: false,\n stops: [ {\n offset: 0,\n color: WHITE,\n opacity: 0.2\n }, {\n offset: 0.15,\n color: WHITE,\n opacity: 0.15\n }, {\n offset: 0.17,\n color: WHITE,\n opacity: 0.35\n }, {\n offset: 0.85,\n color: WHITE,\n opacity: 0.05\n }, {\n offset: 0.87,\n color: WHITE,\n opacity: 0.15\n }, {\n offset: 0.99,\n color: WHITE,\n opacity: 0\n } ]\n },\n bubbleShadow: {\n type: RADIAL,\n center: [ 0.5, 0.5 ],\n radius: 0.5\n }\n };\n\n function boxDiff(r, s) {\n if (r.x1 === s.x1 && r.y1 === s.y1 && r.x2 === s.x2 && r.y2 === s.y2) {\n return s;\n }\n\n var a = Math.min(r.x1, s.x1);\n var b = Math.max(r.x1, s.x1);\n var c = Math.min(r.x2, s.x2);\n var d = Math.max(r.x2, s.x2);\n var e = Math.min(r.y1, s.y1);\n var f = Math.max(r.y1, s.y1);\n var g = Math.min(r.y2, s.y2);\n var h = Math.max(r.y2, s.y2);\n var boxes = [];\n\n // X = intersection, 0-7 = possible difference areas\n // h +-+-+-+\n // . |5|6|7|\n // g +-+-+-+\n // . |3|X|4|\n // f +-+-+-+\n // . |0|1|2|\n // e +-+-+-+\n // . a b c d\n\n // we'll always have rectangles 1, 3, 4 and 6\n boxes[0] = new Box(b, e, c, f);\n boxes[1] = new Box(a, f, b, g);\n boxes[2] = new Box(c, f, d, g);\n boxes[3] = new Box(b, g, c, h);\n\n // decide which corners\n if (r.x1 === a && r.y1 === e || s.x1 === a && s.y1 === e) { // corners 0 and 7\n boxes[4] = new Box(a, e, b, f);\n boxes[5] = new Box(c, g, d, h);\n } else { // corners 2 and 5\n boxes[4] = new Box(c, e, d, f);\n boxes[5] = new Box(a, g, b, h);\n }\n\n return grep(boxes, function(box) {\n return box.height() > 0 && box.width() > 0;\n })[0];\n }\n\n var RootElement = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n\n var rootOptions = this.options;\n rootOptions.width = parseInt(rootOptions.width, 10);\n rootOptions.height = parseInt(rootOptions.height, 10);\n\n this.gradients = {};\n },\n\n reflow: function() {\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var currentBox = new Box(0, 0, options.width, options.height);\n\n this.box = currentBox.unpad(options.margin);\n\n for (var i = 0; i < children.length; i++) {\n children[i].reflow(currentBox);\n currentBox = boxDiff(currentBox, children[i].box) || new Box();\n }\n },\n\n createVisual: function() {\n this.visual = new Group();\n this.createBackground();\n },\n\n createBackground: function() {\n var options = this.options;\n var border = options.border || {};\n var box = this.box.clone().pad(options.margin).unpad(border.width);\n\n var background = Path.fromRect(box.toRect(), {\n stroke: {\n color: border.width ? border.color : \"\",\n width: border.width,\n dashType: border.dashType\n },\n fill: {\n color: options.background,\n opacity: options.opacity\n },\n zIndex: -10\n });\n\n this.visual.append(background);\n },\n\n getRoot: function() {\n return this;\n },\n\n createGradient: function(options) {\n var gradients = this.gradients;\n var hashCode = objectKey(options);\n var gradient = GRADIENTS[options.gradient];\n var drawingGradient;\n\n if (gradients[hashCode]) {\n drawingGradient = gradients[hashCode];\n } else {\n var gradientOptions = $.extend({}, gradient, options);\n if (gradient.type === \"linear\") {\n drawingGradient = new drawing.LinearGradient(gradientOptions);\n } else {\n if (options.innerRadius) {\n gradientOptions.stops = innerRadialStops(gradientOptions);\n }\n drawingGradient = new drawing.RadialGradient(gradientOptions);\n drawingGradient.supportVML = gradient.supportVML !== false;\n }\n gradients[hashCode] = drawingGradient;\n }\n\n return drawingGradient;\n },\n\n cleanGradients: function() {\n var gradients = this.gradients;\n for (var hashCode in gradients) {\n gradients[hashCode]._observers = [];//add clear observers method in drawing ObserversMixin\n }\n },\n\n size: function() {\n var options = this.options;\n return new Box(0, 0, options.width, options.height);\n }\n });\n\n setDefaultOptions(RootElement, {\n width: DEFAULT_WIDTH,\n height: DEFAULT_HEIGHT,\n background: WHITE,\n border: {\n color: BLACK,\n width: 0\n },\n margin: getSpacing(5),\n zIndex: -2\n });\n\n function innerRadialStops(options) {\n var stops = options.stops;\n var usedSpace = ((options.innerRadius / options.radius) * 100);\n var length = stops.length;\n var currentStops = [];\n\n for (var i = 0; i < length; i++) {\n var currentStop = $.extend({}, stops[i]);\n currentStop.offset = (currentStop.offset * (100 - usedSpace) + usedSpace) / 100;\n currentStops.push(currentStop);\n }\n\n return currentStops;\n }\n\n var FloatElement = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n this._initDirection();\n },\n\n _initDirection: function() {\n var options = this.options;\n if (options.vertical) {\n this.groupAxis = X;\n this.elementAxis = Y;\n this.groupSizeField = WIDTH;\n this.elementSizeField = HEIGHT;\n this.groupSpacing = options.spacing;\n this.elementSpacing = options.vSpacing;\n } else {\n this.groupAxis = Y;\n this.elementAxis = X;\n this.groupSizeField = HEIGHT;\n this.elementSizeField = WIDTH;\n this.groupSpacing = options.vSpacing;\n this.elementSpacing = options.spacing;\n }\n },\n\n reflow: function(targetBox) {\n this.box = targetBox.clone();\n this.reflowChildren();\n },\n\n reflowChildren: function() {\n var this$1$1 = this;\n\n var ref = this;\n var box = ref.box;\n var elementAxis = ref.elementAxis;\n var groupAxis = ref.groupAxis;\n var elementSizeField = ref.elementSizeField;\n var groupSizeField = ref.groupSizeField;\n var ref$1 = this.groupOptions();\n var groups = ref$1.groups;\n var groupsSize = ref$1.groupsSize;\n var maxGroupElementsSize = ref$1.maxGroupElementsSize;\n var groupsCount = groups.length;\n var groupsStart = box[groupAxis + 1] + this.alignStart(groupsSize, box[groupSizeField]());\n\n if (groupsCount) {\n var groupStart = groupsStart;\n\n for (var groupIdx = 0; groupIdx < groupsCount; groupIdx++) {\n var group = groups[groupIdx];\n var groupElements = group.groupElements;\n var elementStart = box[elementAxis + 1];\n var groupElementsCount = groupElements.length;\n\n for (var idx = 0; idx < groupElementsCount; idx++) {\n var element = groupElements[idx];\n var elementSize$$1 = this$1$1.elementSize(element);\n var groupElementStart = groupStart + this$1$1.alignStart(elementSize$$1[groupSizeField], group.groupSize);\n\n var elementBox = new Box();\n elementBox[groupAxis + 1] = groupElementStart;\n elementBox[groupAxis + 2] = groupElementStart + elementSize$$1[groupSizeField];\n elementBox[elementAxis + 1] = elementStart;\n elementBox[elementAxis + 2] = elementStart + elementSize$$1[elementSizeField];\n\n element.reflow(elementBox);\n\n elementStart += elementSize$$1[elementSizeField] + this$1$1.elementSpacing;\n }\n groupStart += group.groupSize + this$1$1.groupSpacing;\n }\n box[groupAxis + 1] = groupsStart;\n box[groupAxis + 2] = groupsStart + groupsSize;\n box[elementAxis + 2] = box[elementAxis + 1] + maxGroupElementsSize;\n }\n },\n\n alignStart: function(size, maxSize) {\n var start = 0;\n var align = this.options.align;\n if (align === RIGHT || align === BOTTOM) {\n start = maxSize - size;\n } else if (align === CENTER) {\n start = (maxSize - size) / 2;\n }\n return start;\n },\n\n groupOptions: function() {\n var this$1$1 = this;\n\n var ref = this;\n var box = ref.box;\n var children = ref.children;\n var elementSizeField = ref.elementSizeField;\n var groupSizeField = ref.groupSizeField;\n var elementSpacing = ref.elementSpacing;\n var groupSpacing = ref.groupSpacing;\n var maxSize = round(box[elementSizeField]());\n var childrenCount = children.length;\n var groups = [];\n\n var groupSize = 0;\n var groupElementsSize = 0;\n var groupsSize = 0;\n var maxGroupElementsSize = 0;\n var groupElements = [];\n\n for (var idx = 0; idx < childrenCount; idx++) {\n var element = children[idx];\n if (!element.box) {\n element.reflow(box);\n }\n\n var elementSize$$1 = this$1$1.elementSize(element);\n if (this$1$1.options.wrap && round(groupElementsSize + elementSpacing + elementSize$$1[elementSizeField]) > maxSize) {\n groups.push({\n groupElements: groupElements,\n groupSize: groupSize,\n groupElementsSize: groupElementsSize\n });\n maxGroupElementsSize = Math.max(maxGroupElementsSize, groupElementsSize);\n groupsSize += groupSpacing + groupSize;\n groupSize = 0;\n groupElementsSize = 0;\n groupElements = [];\n }\n groupSize = Math.max(groupSize, elementSize$$1[groupSizeField]);\n if (groupElementsSize > 0) {\n groupElementsSize += elementSpacing;\n }\n groupElementsSize += elementSize$$1[elementSizeField];\n groupElements.push(element);\n }\n\n groups.push({\n groupElements: groupElements,\n groupSize: groupSize,\n groupElementsSize: groupElementsSize\n });\n maxGroupElementsSize = Math.max(maxGroupElementsSize, groupElementsSize);\n groupsSize += groupSize;\n\n return {\n groups: groups,\n groupsSize: groupsSize,\n maxGroupElementsSize: maxGroupElementsSize\n };\n },\n\n elementSize: function(element) {\n return {\n width: element.box.width(),\n height: element.box.height()\n };\n },\n\n createVisual: function() {}\n });\n\n setDefaultOptions(FloatElement, {\n vertical: true,\n wrap: true,\n vSpacing: 0,\n spacing: 0\n });\n\n var DrawingText = drawing.Text;\n\n var Text = ChartElement.extend({\n init: function(content, options) {\n ChartElement.fn.init.call(this, options);\n\n this.content = content;\n\n // Calculate size\n this.reflow(new Box());\n },\n\n reflow: function(targetBox) {\n var options = this.options;\n var size = options.size = util.measureText(this.content, { font: options.font });\n\n this.baseline = size.baseline;\n\n this.box = new Box(targetBox.x1, targetBox.y1,\n targetBox.x1 + size.width, targetBox.y1 + size.height);\n },\n\n createVisual: function() {\n var ref = this.options;\n var font = ref.font;\n var color = ref.color;\n var opacity = ref.opacity;\n var cursor = ref.cursor;\n\n this.visual = new DrawingText(this.content, this.box.toRect().topLeft(), {\n font: font,\n fill: { color: color, opacity: opacity },\n cursor: cursor\n });\n }\n });\n\n setDefaultOptions(Text, {\n font: DEFAULT_FONT,\n color: BLACK\n });\n\n function rectToBox(rect) {\n var origin = rect.origin;\n var bottomRight = rect.bottomRight();\n\n return new Box(origin.x, origin.y, bottomRight.x, bottomRight.y);\n }\n\n var ROWS_SPLIT_REGEX = /\\n/m;\n\n var TextBox = BoxElement.extend({\n init: function(content, options, data) {\n BoxElement.fn.init.call(this, options);\n this.content = content;\n this.data = data;\n\n this._initContainer();\n if (this.options._autoReflow !== false) {\n this.reflow(new Box());\n }\n },\n\n _initContainer: function() {\n var options = this.options;\n var rows = String(this.content).split(ROWS_SPLIT_REGEX);\n var floatElement = new FloatElement({ vertical: true, align: options.align, wrap: false });\n var textOptions = deepExtend({ }, options, { opacity: 1, animation: null });\n\n this.container = floatElement;\n this.append(floatElement);\n\n for (var rowIdx = 0; rowIdx < rows.length; rowIdx++) {\n var text = new Text(rows[rowIdx].trim(), textOptions);\n floatElement.append(text);\n }\n },\n\n reflow: function(targetBox) {\n var options = this.options;\n var visualFn = options.visual;\n this.container.options.align = options.align;\n\n if (visualFn && !this._boxReflow) {\n var visualBox = targetBox;\n if (!visualBox.hasSize()) {\n this._boxReflow = true;\n this.reflow(visualBox);\n this._boxReflow = false;\n visualBox = this.box;\n }\n var visual = this.visual = visualFn(this.visualContext(visualBox));\n\n if (visual) {\n visualBox = rectToBox(visual.clippedBBox() || new Rect());\n\n visual.options.zIndex = options.zIndex;\n }\n\n this.box = this.contentBox = this.paddingBox = visualBox;\n } else {\n BoxElement.fn.reflow.call(this, targetBox);\n\n if (options.rotation) {\n var margin = getSpacing(options.margin);\n var box = this.box.unpad(margin);\n\n this.targetBox = targetBox;\n this.normalBox = box.clone();\n\n box = this.rotate();\n box.translate(margin.left - margin.right, margin.top - margin.bottom);\n\n this.rotatedBox = box.clone();\n\n box.pad(margin);\n }\n }\n },\n\n createVisual: function() {\n var options = this.options;\n\n this.visual = new Group({\n transform: this.rotationTransform(),\n zIndex: options.zIndex,\n noclip: options.noclip\n });\n\n if (this.hasBox()) {\n var box = Path.fromRect(this.paddingBox.toRect(), this.visualStyle());\n this.visual.append(box);\n }\n },\n\n renderVisual: function() {\n if (!this.options.visible) {\n return;\n }\n\n if (this.options.visual) {\n var visual = this.visual;\n if (visual && !defined(visual.options.noclip)) {\n visual.options.noclip = this.options.noclip;\n }\n this.addVisual();\n this.createAnimation();\n } else {\n BoxElement.fn.renderVisual.call(this);\n }\n },\n\n visualContext: function(targetBox) {\n var this$1$1 = this;\n\n var context = {\n text: this.content,\n rect: targetBox.toRect(),\n sender: this.getSender(),\n options: this.options,\n createVisual: function () {\n this$1$1._boxReflow = true;\n this$1$1.reflow(targetBox);\n this$1$1._boxReflow = false;\n return this$1$1.getDefaultVisual();\n }\n };\n if (this.data) {\n $.extend(context, this.data);\n }\n\n return context;\n },\n\n getDefaultVisual: function() {\n this.createVisual();\n this.renderChildren();\n var visual = this.visual;\n delete this.visual;\n return visual;\n },\n\n rotate: function() {\n var options = this.options;\n this.box.rotate(options.rotation);\n this.align(this.targetBox, X, options.align);\n this.align(this.targetBox, Y, options.vAlign);\n return this.box;\n },\n\n rotationTransform: function() {\n var rotation = this.options.rotation;\n if (!rotation) {\n return null;\n }\n\n var ref = this.normalBox.center();\n var cx = ref.x;\n var cy = ref.y;\n var boxCenter = this.rotatedBox.center();\n\n return geometryTransform()\n .translate(boxCenter.x - cx, boxCenter.y - cy)\n .rotate(rotation, [ cx, cy ]);\n }\n });\n\n var Title = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n\n this._textBox = new TextBox(this.options.text, $.extend({}, this.options, {\n vAlign: this.options.position\n }));\n\n this.append(this._textBox);\n },\n\n reflow: function(targetBox) {\n ChartElement.fn.reflow.call(this, targetBox);\n this.box.snapTo(targetBox, X);\n }\n });\n\n Title.buildTitle = function(options, defaultOptions) {\n var titleOptions = options;\n\n if (typeof options === \"string\") {\n titleOptions = { text: options };\n }\n\n titleOptions = $.extend({ visible: true }, defaultOptions, titleOptions);\n\n var title;\n if (titleOptions && titleOptions.visible && titleOptions.text) {\n title = new Title(titleOptions);\n }\n\n return title;\n };\n\n Title.orderTitles = function(titles) {\n var items = [].concat(titles);\n var top = items.filter(function (item) { return item && item.options.position !== BOTTOM; });\n var bottom = items.filter(function (item) { return item && item.options.position === BOTTOM; });\n\n collapseVerticalMargins(top);\n collapseVerticalMargins(bottom);\n\n bottom.reverse();\n return top.concat(bottom);\n };\n\n function collapseVerticalMargins(items) {\n for (var i = 1; i < items.length; i++) {\n var box = items[i]._textBox;\n var prevBox = items[i - 1]._textBox;\n prevBox.options.margin = $.extend(getSpacing(prevBox.options.margin), { bottom: 0 });\n box.options.margin = $.extend(getSpacing(box.options.margin), { top: 0 });\n }\n }\n\n setDefaultOptions(Title, {\n color: BLACK,\n position: TOP,\n align: CENTER,\n margin: getSpacing(5),\n padding: getSpacing(5)\n });\n\n var AxisLabel = TextBox.extend({\n init: function(value, text, index, dataItem, options) {\n TextBox.fn.init.call(this, text, options);\n\n this.text = text;\n this.value = value;\n this.index = index;\n this.dataItem = dataItem;\n this.reflow(new Box());\n },\n\n visualContext: function(targetBox) {\n var context = TextBox.fn.visualContext.call(this, targetBox);\n\n context.value = this.value;\n context.dataItem = this.dataItem;\n context.format = this.options.format;\n context.culture = this.options.culture;\n\n return context;\n },\n\n click: function(widget, e) {\n\n widget.trigger(AXIS_LABEL_CLICK, {\n element: eventElement(e),\n value: this.value,\n text: this.text,\n index: this.index,\n dataItem: this.dataItem,\n axis: this.parent.options\n });\n },\n\n rotate: function() {\n if (this.options.alignRotation !== CENTER) {\n var box = this.normalBox.toRect();\n var transform = this.rotationTransform();\n\n this.box = rectToBox(box.bbox(transform.matrix()));\n } else {\n TextBox.fn.rotate.call(this);\n }\n\n return this.box;\n },\n\n rotationTransform: function() {\n var options = this.options;\n var rotation = options.rotation;\n if (!rotation) {\n return null;\n }\n\n if (options.alignRotation === CENTER) {\n return TextBox.fn.rotationTransform.call(this);\n }\n\n var rotationMatrix = geometryTransform().rotate(rotation).matrix();\n var box = this.normalBox.toRect();\n var rect = this.targetBox.toRect();\n\n var rotationOrigin = options.rotationOrigin || TOP;\n var alignAxis = rotationOrigin === TOP || rotationOrigin === BOTTOM ? X : Y;\n var distanceAxis = rotationOrigin === TOP || rotationOrigin === BOTTOM ? Y : X;\n var axisAnchor = rotationOrigin === TOP || rotationOrigin === LEFT ? rect.origin : rect.bottomRight();\n\n var topLeft = box.topLeft().transformCopy(rotationMatrix);\n var topRight = box.topRight().transformCopy(rotationMatrix);\n var bottomRight = box.bottomRight().transformCopy(rotationMatrix);\n var bottomLeft = box.bottomLeft().transformCopy(rotationMatrix);\n var rotatedBox = Rect.fromPoints(topLeft, topRight, bottomRight, bottomLeft);\n\n var translate = {};\n translate[distanceAxis] = rect.origin[distanceAxis] - rotatedBox.origin[distanceAxis];\n\n var distanceLeft = Math.abs(topLeft[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n var distanceRight = Math.abs(topRight[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n\n var alignStart, alignEnd;\n\n if (round(distanceLeft, DEFAULT_PRECISION) === round(distanceRight, DEFAULT_PRECISION)) {\n alignStart = topLeft;\n alignEnd = topRight;\n } else if (distanceRight < distanceLeft) {\n alignStart = topRight;\n alignEnd = bottomRight;\n } else {\n alignStart = topLeft;\n alignEnd = bottomLeft;\n }\n\n var alignCenter = alignStart[alignAxis] + (alignEnd[alignAxis] - alignStart[alignAxis]) / 2;\n translate[alignAxis] = rect.center()[alignAxis] - alignCenter;\n\n return geometryTransform()\n .translate(translate.x, translate.y)\n .rotate(rotation);\n }\n });\n\n setDefaultOptions(AxisLabel, {\n _autoReflow: false\n });\n\n var DEFAULT_ICON_SIZE = 7;\n var DEFAULT_LABEL_COLOR = \"#fff\";\n\n var Note = BoxElement.extend({\n init: function(fields, options, chartService) {\n BoxElement.fn.init.call(this, options);\n\n this.fields = fields;\n this.chartService = chartService;\n\n this.render();\n },\n\n hide: function() {\n this.options.visible = false;\n },\n\n show: function() {\n this.options.visible = true;\n },\n\n render: function() {\n var this$1$1 = this;\n\n var options = this.options;\n\n if (options.visible) {\n var label = options.label;\n var icon = options.icon;\n var box = new Box();\n var childAlias = function () { return this$1$1; };\n var size = icon.size;\n var text = this.fields.text;\n var width, height;\n\n if (defined(label) && label.visible) {\n var noteTemplate = getTemplate(label);\n if (noteTemplate) {\n text = noteTemplate(this.fields);\n } else if (label.format) {\n text = this.chartService.format.auto(label.format, text);\n }\n\n if (!label.color) {\n label.color = label.position === INSIDE ? DEFAULT_LABEL_COLOR : icon.background;\n }\n\n this.label = new TextBox(text, deepExtend({}, label));\n this.label.aliasFor = childAlias;\n\n if (label.position === INSIDE && !defined(size)) {\n if (icon.type === CIRCLE) {\n size = Math.max(this.label.box.width(), this.label.box.height());\n } else {\n width = this.label.box.width();\n height = this.label.box.height();\n }\n box.wrap(this.label.box);\n }\n }\n\n icon.width = width || size || DEFAULT_ICON_SIZE;\n icon.height = height || size || DEFAULT_ICON_SIZE;\n\n var marker = new ShapeElement(deepExtend({}, icon));\n marker.aliasFor = childAlias;\n\n this.marker = marker;\n this.append(marker);\n\n if (this.label) {\n this.append(this.label);\n }\n\n marker.reflow(new Box());\n this.wrapperBox = box.wrap(marker.box);\n }\n },\n\n reflow: function(targetBox) {\n var ref = this;\n var options = ref.options;\n var label = ref.label;\n var marker = ref.marker;\n var wrapperBox = ref.wrapperBox;\n var center = targetBox.center();\n var length = options.line.length;\n var position = options.position;\n\n // TODO: Review\n if (options.visible) {\n var lineStart, box, contentBox;\n\n if (inArray(position, [ LEFT, RIGHT ])) {\n if (position === LEFT) {\n contentBox = wrapperBox.alignTo(targetBox, position).translate(-length, targetBox.center().y - wrapperBox.center().y);\n\n if (options.line.visible) {\n lineStart = [ targetBox.x1, center.y ];\n this.linePoints = [\n lineStart,\n [ contentBox.x2, center.y ]\n ];\n box = contentBox.clone().wrapPoint(lineStart);\n }\n } else {\n contentBox = wrapperBox.alignTo(targetBox, position).translate(length, targetBox.center().y - wrapperBox.center().y);\n\n if (options.line.visible) {\n lineStart = [ targetBox.x2, center.y ];\n this.linePoints = [\n lineStart,\n [ contentBox.x1, center.y ]\n ];\n box = contentBox.clone().wrapPoint(lineStart);\n }\n }\n } else {\n if (position === BOTTOM) {\n contentBox = wrapperBox.alignTo(targetBox, position).translate(targetBox.center().x - wrapperBox.center().x, length);\n\n if (options.line.visible) {\n lineStart = [ center.x, targetBox.y2 ];\n this.linePoints = [\n lineStart,\n [ center.x, contentBox.y1 ]\n ];\n box = contentBox.clone().wrapPoint(lineStart);\n }\n } else {\n contentBox = wrapperBox.alignTo(targetBox, position).translate(targetBox.center().x - wrapperBox.center().x, -length);\n\n if (options.line.visible) {\n lineStart = [ center.x, targetBox.y1 ];\n this.linePoints = [\n lineStart,\n [ center.x, contentBox.y2 ]\n ];\n box = contentBox.clone().wrapPoint(lineStart);\n }\n }\n }\n\n if (marker) {\n marker.reflow(contentBox);\n }\n\n if (label) {\n label.reflow(contentBox);\n if (marker) {\n if (options.label.position === OUTSIDE) {\n label.box.alignTo(marker.box, position);\n }\n label.reflow(label.box);\n }\n }\n\n this.contentBox = contentBox;\n this.targetBox = targetBox;\n this.box = box || contentBox;\n }\n },\n\n createVisual: function() {\n BoxElement.fn.createVisual.call(this);\n this.visual.options.noclip = this.options.noclip;\n\n if (this.options.visible) {\n this.createLine();\n }\n },\n\n renderVisual: function() {\n var this$1$1 = this;\n\n var options = this.options;\n var customVisual = options.visual;\n if (options.visible && customVisual) {\n this.visual = customVisual($.extend(this.fields, {\n sender: this.getSender(),\n rect: this.targetBox.toRect(),\n options: {\n background: options.background,\n border: options.background,\n icon: options.icon,\n label: options.label,\n line: options.line,\n position: options.position,\n visible: options.visible\n },\n createVisual: function () {\n this$1$1.createVisual();\n this$1$1.renderChildren();\n var defaultVisual = this$1$1.visual;\n delete this$1$1.visual;\n return defaultVisual;\n }\n }));\n this.addVisual();\n } else {\n BoxElement.fn.renderVisual.call(this);\n }\n },\n\n createLine: function() {\n var options = this.options.line;\n\n if (this.linePoints) {\n var path = Path.fromPoints(this.linePoints, {\n stroke: {\n color: options.color,\n width: options.width,\n dashType: options.dashType\n }\n });\n\n alignPathToPixel(path);\n this.visual.append(path);\n }\n },\n\n click: function(widget, e) {\n var args = this.eventArgs(e);\n\n if (!widget.trigger(NOTE_CLICK, args)) {\n e.preventDefault();\n }\n },\n\n over: function(widget, e) {\n var args = this.eventArgs(e);\n\n if (!widget.trigger(NOTE_HOVER, args)) {\n e.preventDefault();\n }\n },\n\n out: function(widget, e) {\n var args = this.eventArgs(e);\n\n widget.trigger(NOTE_LEAVE, args);\n },\n\n eventArgs: function(e) {\n var options = this.options;\n\n return $.extend(this.fields, {\n element: eventElement(e),\n text: defined(options.label) ? options.label.text : \"\",\n visual: this.visual\n });\n }\n });\n\n setDefaultOptions(Note, {\n icon: {\n visible: true,\n type: CIRCLE\n },\n label: {\n position: INSIDE,\n visible: true,\n align: CENTER,\n vAlign: CENTER\n },\n line: {\n visible: true\n },\n visible: true,\n position: TOP,\n zIndex: 2\n });\n\n var defaultImplementation = {\n format: function (format, value) { return value; },\n\n toString: function (value) { return value; },\n\n parseDate: function (value) { return new Date(value); },\n\n firstDay: function () { return 0; }\n };\n\n var current$1 = defaultImplementation;\n\n var IntlService = Class.extend({\n\n });\n\n IntlService.register = function(userImplementation) {\n current$1 = userImplementation;\n };\n\n if (Object.defineProperties) {\n Object.defineProperties(IntlService, {\n implementation: {\n get: function() {\n return current$1;\n }\n }\n });\n }\n\n var FORMAT_REPLACE_REGEX = /\\{(\\d+)(:[^\\}]+)?\\}/g;\n\n var FormatService = Class.extend({\n init: function(intlService) {\n this._intlService = intlService;\n },\n\n auto: function(formatString) {\n var arguments$1 = arguments;\n\n var values = [], len = arguments.length - 1;\n while ( len-- > 0 ) { values[ len ] = arguments$1[ len + 1 ]; }\n\n var intl = this.intl;\n\n if (isString(formatString) && formatString.match(FORMAT_REGEX)) {\n return intl.format.apply(intl, [ formatString ].concat( values ));\n }\n\n return intl.toString(values[0], formatString);\n },\n\n localeAuto: function(formatString, values, locale) {\n var intl = this.intl;\n var result;\n\n if (isString(formatString) && formatString.match(FORMAT_REGEX)) {\n result = formatString.replace(FORMAT_REPLACE_REGEX, function(match, index, placeholderFormat) {\n var value = values[parseInt(index, 10)];\n\n return intl.toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\", locale);\n });\n } else {\n result = intl.toString(values[0], formatString, locale);\n }\n\n return result;\n }\n });\n\n if (Object.defineProperties) {\n Object.defineProperties(FormatService.fn, {\n intl: {\n get: function() {\n return this._intlService || IntlService.implementation;\n },\n set: function(value) {\n this._intlService = value;\n }\n }\n });\n }\n\n var ChartService = Class.extend({\n init: function(chart, context) {\n if (context === void 0) { context = {}; }\n\n this._intlService = context.intlService;\n this.sender = context.sender || chart;\n this.format = new FormatService(context.intlService);\n this.chart = chart;\n this.rtl = Boolean(context.rtl);\n },\n\n notify: function(name, args) {\n if (this.chart) {\n this.chart.trigger(name, args);\n }\n },\n\n isPannable: function(axis) {\n var pannable = ((this.chart || {}).options || {}).pannable;\n return pannable && pannable.lock !== axis;\n }\n });\n\n if (Object.defineProperties) {\n Object.defineProperties(ChartService.fn, {\n intl: {\n get: function() {\n return this._intlService || IntlService.implementation;\n },\n set: function(value) {\n this._intlService = value;\n this.format.intl = value;\n }\n }\n });\n }\n\n var current$2;\n\n var DomEventsBuilder = Class.extend({\n\n });\n\n DomEventsBuilder.register = function(userImplementation) {\n current$2 = userImplementation;\n };\n\n DomEventsBuilder.create = function(element, events) {\n if (current$2) {\n return current$2.create(element, events);\n }\n };\n\n var services = {\n \tChartService: ChartService,\n \tDomEventsBuilder: DomEventsBuilder,\n \tFormatService: FormatService,\n \tIntlService: IntlService,\n \tTemplateService: TemplateService\n };\n\n function createAxisTick(options, tickOptions) {\n var tickX = options.tickX;\n var tickY = options.tickY;\n var position = options.position;\n\n var tick = new Path({\n stroke: {\n width: tickOptions.width,\n color: tickOptions.color\n }\n });\n\n if (options.vertical) {\n tick.moveTo(tickX, position)\n .lineTo(tickX + tickOptions.size, position);\n } else {\n tick.moveTo(position, tickY)\n .lineTo(position, tickY + tickOptions.size);\n }\n\n alignPathToPixel(tick);\n\n return tick;\n }\n\n function createAxisGridLine(options, gridLine) {\n var lineStart = options.lineStart;\n var lineEnd = options.lineEnd;\n var position = options.position;\n\n var line = new Path({\n stroke: {\n width: gridLine.width,\n color: gridLine.color,\n dashType: gridLine.dashType\n }\n });\n\n if (options.vertical) {\n line.moveTo(lineStart, position)\n .lineTo(lineEnd, position);\n } else {\n line.moveTo(position, lineStart)\n .lineTo(position, lineEnd);\n }\n\n alignPathToPixel(line);\n\n return line;\n }\n\n var Axis = ChartElement.extend({\n init: function(options, chartService) {\n if (chartService === void 0) { chartService = new ChartService(); }\n\n ChartElement.fn.init.call(this, options);\n\n this.chartService = chartService;\n\n if (!this.options.visible) {\n this.options = deepExtend({}, this.options, {\n labels: {\n visible: false\n },\n line: {\n visible: false\n },\n margin: 0,\n majorTickSize: 0,\n minorTickSize: 0\n });\n }\n\n this.options.minorTicks = deepExtend({}, {\n color: this.options.line.color,\n width: this.options.line.width,\n visible: this.options.minorTickType !== NONE\n }, this.options.minorTicks, {\n size: this.options.minorTickSize,\n align: this.options.minorTickType\n });\n\n this.options.majorTicks = deepExtend({}, {\n color: this.options.line.color,\n width: this.options.line.width,\n visible: this.options.majorTickType !== NONE\n }, this.options.majorTicks, {\n size: this.options.majorTickSize,\n align: this.options.majorTickType\n });\n\n this.initFields();\n\n if (!this.options._deferLabels) {\n this.createLabels();\n }\n\n this.createTitle();\n this.createNotes();\n },\n\n initFields: function() {\n },\n\n labelsRange: function() {\n return {\n min: this.options.labels.skip,\n max: this.labelsCount()\n };\n },\n\n normalizeLabelRotation: function(labelOptions) {\n var rotation = labelOptions.rotation;\n\n if (isObject(rotation)) {\n labelOptions.alignRotation = rotation.align;\n labelOptions.rotation = rotation.angle;\n }\n },\n\n createLabels: function() {\n var this$1$1 = this;\n\n var options = this.options;\n var align = options.vertical ? RIGHT : CENTER;\n var labelOptions = deepExtend({ }, options.labels, {\n align: align,\n zIndex: options.zIndex\n });\n var step = Math.max(1, labelOptions.step);\n\n this.clearLabels();\n\n if (labelOptions.visible) {\n this.normalizeLabelRotation(labelOptions);\n if (labelOptions.rotation === \"auto\") {\n labelOptions.rotation = 0;\n options.autoRotateLabels = true;\n }\n\n var range = this.labelsRange();\n for (var idx = range.min; idx < range.max; idx += step) {\n var labelContext = { index: idx, count: range.max };\n var label = this$1$1.createAxisLabel(idx, labelOptions, labelContext);\n if (label) {\n this$1$1.append(label);\n this$1$1.labels.push(label);\n }\n }\n }\n },\n\n clearLabels: function() {\n this.children = grep(this.children, function (child) { return !(child instanceof AxisLabel); });\n this.labels = [];\n },\n\n clearTitle: function() {\n var this$1$1 = this;\n\n if (this.title) {\n this.children = grep(this.children, function (child) { return child !== this$1$1.title; });\n this.title = undefined;\n }\n },\n\n clear: function() {\n this.clearLabels();\n this.clearTitle();\n },\n\n lineBox: function() {\n var ref = this;\n var options = ref.options;\n var box = ref.box;\n var vertical = options.vertical;\n var mirror = options.labels.mirror;\n var axisX = mirror ? box.x1 : box.x2;\n var axisY = mirror ? box.y2 : box.y1;\n var lineWidth = options.line.width || 0;\n\n return vertical ?\n new Box(axisX, box.y1, axisX, box.y2 - lineWidth) :\n new Box(box.x1, axisY, box.x2 - lineWidth, axisY);\n },\n\n createTitle: function() {\n var options = this.options;\n var titleOptions = deepExtend({\n rotation: options.vertical ? -90 : 0,\n text: \"\",\n zIndex: 1,\n visualSize: true\n }, options.title);\n\n if (titleOptions.visible && titleOptions.text) {\n var title = new TextBox(titleOptions.text, titleOptions);\n this.append(title);\n this.title = title;\n }\n },\n\n createNotes: function() {\n var this$1$1 = this;\n\n var options = this.options;\n var notes = options.notes;\n var items = notes.data || [];\n\n this.notes = [];\n\n for (var i = 0; i < items.length; i++) {\n var item = deepExtend({}, notes, items[i]);\n item.value = this$1$1.parseNoteValue(item.value);\n\n var note = new Note({\n value: item.value,\n text: item.label.text,\n dataItem: item\n }, item, this$1$1.chartService);\n\n if (note.options.visible) {\n if (defined(note.options.position)) {\n if (options.vertical && !inArray(note.options.position, [ LEFT, RIGHT ])) {\n note.options.position = options.reverse ? LEFT : RIGHT;\n } else if (!options.vertical && !inArray(note.options.position, [ TOP, BOTTOM ])) {\n note.options.position = options.reverse ? BOTTOM : TOP;\n }\n } else {\n if (options.vertical) {\n note.options.position = options.reverse ? LEFT : RIGHT;\n } else {\n note.options.position = options.reverse ? BOTTOM : TOP;\n }\n }\n this$1$1.append(note);\n this$1$1.notes.push(note);\n }\n }\n },\n\n parseNoteValue: function(value) {\n return value;\n },\n\n renderVisual: function() {\n ChartElement.fn.renderVisual.call(this);\n\n this.createPlotBands();\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n this.createBackground();\n this.createLine();\n },\n\n gridLinesVisual: function() {\n var gridLines = this._gridLines;\n if (!gridLines) {\n gridLines = this._gridLines = new Group({\n zIndex: -2\n });\n this.appendVisual(this._gridLines);\n }\n\n return gridLines;\n },\n\n createTicks: function(lineGroup) {\n var options = this.options;\n var lineBox = this.lineBox();\n var mirror = options.labels.mirror;\n var majorUnit = options.majorTicks.visible ? options.majorUnit : 0;\n var tickLineOptions = {\n // TODO\n // _alignLines: options._alignLines,\n vertical: options.vertical\n };\n\n function render(tickPositions, tickOptions, skipUnit) {\n var count = tickPositions.length;\n var step = Math.max(1, tickOptions.step);\n\n if (tickOptions.visible) {\n for (var i = tickOptions.skip; i < count; i += step) {\n if (defined(skipUnit) && (i % skipUnit === 0)) {\n continue;\n }\n\n tickLineOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;\n tickLineOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;\n tickLineOptions.position = tickPositions[i];\n\n lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n }\n }\n }\n\n render(this.getMajorTickPositions(), options.majorTicks);\n render(this.getMinorTickPositions(), options.minorTicks, majorUnit / options.minorUnit);\n },\n\n createLine: function() {\n var options = this.options;\n var line = options.line;\n var lineBox = this.lineBox();\n\n if (line.width > 0 && line.visible) {\n var path = new Path({\n stroke: {\n width: line.width,\n color: line.color,\n dashType: line.dashType\n }\n\n /* TODO\n zIndex: line.zIndex,\n */\n });\n\n path.moveTo(lineBox.x1, lineBox.y1)\n .lineTo(lineBox.x2, lineBox.y2);\n\n if (options._alignLines) {\n alignPathToPixel(path);\n }\n\n var group = this._lineGroup = new Group();\n group.append(path);\n\n this.visual.append(group);\n this.createTicks(group);\n }\n },\n\n getActualTickSize: function() {\n var options = this.options;\n var tickSize = 0;\n\n if (options.majorTicks.visible && options.minorTicks.visible) {\n tickSize = Math.max(options.majorTicks.size, options.minorTicks.size);\n } else if (options.majorTicks.visible) {\n tickSize = options.majorTicks.size;\n } else if (options.minorTicks.visible) {\n tickSize = options.minorTicks.size;\n }\n\n return tickSize;\n },\n\n createBackground: function() {\n var ref = this;\n var options = ref.options;\n var box = ref.box;\n var background = options.background;\n\n if (background) {\n this._backgroundPath = Path.fromRect(box.toRect(), {\n fill: {\n color: background\n },\n stroke: null\n });\n\n this.visual.append(this._backgroundPath);\n }\n },\n\n createPlotBands: function() {\n var this$1$1 = this;\n\n var options = this.options;\n var plotBands = options.plotBands || [];\n var vertical = options.vertical;\n var plotArea = this.plotArea;\n\n if (plotBands.length === 0) {\n return;\n }\n\n var group = this._plotbandGroup = new Group({\n zIndex: -1\n });\n\n var altAxis = grep(this.pane.axes, function (axis) { return axis.options.vertical !== this$1$1.options.vertical; })[0];\n\n for (var idx = 0; idx < plotBands.length; idx++) {\n var item = plotBands[idx];\n var slotX = (void 0), slotY = (void 0);\n var labelOptions = item.label;\n var label = (void 0);\n\n if (vertical) {\n slotX = (altAxis || plotArea.axisX).lineBox();\n slotY = this$1$1.getSlot(item.from, item.to, true);\n } else {\n slotX = this$1$1.getSlot(item.from, item.to, true);\n slotY = (altAxis || plotArea.axisY).lineBox();\n }\n\n if (labelOptions) {\n labelOptions.vAlign = labelOptions.position || LEFT;\n label = this$1$1.createPlotBandLabel(\n labelOptions,\n item,\n new Box(\n slotX.x1,\n slotY.y1,\n slotX.x2,\n slotY.y2\n )\n\n );\n }\n\n if (slotX.width() !== 0 && slotY.height() !== 0) {\n var bandRect = new Rect(\n [ slotX.x1, slotY.y1 ],\n [ slotX.width(), slotY.height() ]\n );\n\n var path = Path.fromRect(bandRect, {\n fill: {\n color: item.color,\n opacity: item.opacity\n },\n stroke: null\n });\n\n group.append(path);\n if (label) {\n group.append(label);\n }\n }\n }\n\n this.appendVisual(group);\n },\n\n createPlotBandLabel: function(label, item, box) {\n\n if (label.visible === false) {\n return null;\n }\n\n var text = label.text;\n var textbox;\n\n if (defined(label) && label.visible) {\n var labelTemplate = getTemplate(label);\n if (labelTemplate) {\n text = labelTemplate({ text: text, item: item });\n } else if (label.format) {\n text = this.chartService.format.auto(label.format, text);\n }\n\n if (!label.color) {\n label.color = this.options.labels.color;\n }\n }\n\n textbox = new TextBox(text, label);\n textbox.reflow(box);\n textbox.renderVisual();\n\n return textbox.visual;\n },\n\n createGridLines: function(altAxis) {\n var options = this.options;\n var minorGridLines = options.minorGridLines;\n var majorGridLines = options.majorGridLines;\n var minorUnit = options.minorUnit;\n var vertical = options.vertical;\n var axisLineVisible = altAxis.options.line.visible;\n var majorUnit = majorGridLines.visible ? options.majorUnit : 0;\n var lineBox = altAxis.lineBox();\n var linePos = lineBox[vertical ? \"y1\" : \"x1\"];\n var lineOptions = {\n lineStart: lineBox[vertical ? \"x1\" : \"y1\"],\n lineEnd: lineBox[vertical ? \"x2\" : \"y2\"],\n vertical: vertical\n };\n var majorTicks = [];\n\n var container = this.gridLinesVisual();\n\n function render(tickPositions, gridLine, skipUnit) {\n var count = tickPositions.length;\n var step = Math.max(1, gridLine.step);\n\n if (gridLine.visible) {\n for (var i = gridLine.skip; i < count; i += step) {\n var pos = round(tickPositions[i]);\n if (!inArray(pos, majorTicks)) {\n if (i % skipUnit !== 0 && (!axisLineVisible || linePos !== pos)) {\n lineOptions.position = pos;\n container.append(createAxisGridLine(lineOptions, gridLine));\n\n majorTicks.push(pos);\n }\n }\n }\n }\n }\n\n render(this.getMajorTickPositions(), majorGridLines);\n render(this.getMinorTickPositions(), minorGridLines, majorUnit / minorUnit);\n\n return container.children;\n },\n\n reflow: function(box) {\n var ref = this;\n var options = ref.options;\n var labels = ref.labels;\n var title = ref.title;\n var vertical = options.vertical;\n var count = labels.length;\n var sizeFn = vertical ? WIDTH : HEIGHT;\n var titleSize = title ? title.box[sizeFn]() : 0;\n var space = this.getActualTickSize() + options.margin + titleSize;\n var rootBox = (this.getRoot() || {}).box || box;\n var boxSize = rootBox[sizeFn]();\n var maxLabelSize = 0;\n\n for (var i = 0; i < count; i++) {\n var labelSize = labels[i].box[sizeFn]();\n if (labelSize + space <= boxSize) {\n maxLabelSize = Math.max(maxLabelSize, labelSize);\n }\n }\n\n if (vertical) {\n this.box = new Box(\n box.x1, box.y1,\n box.x1 + maxLabelSize + space, box.y2\n );\n } else {\n this.box = new Box(\n box.x1, box.y1,\n box.x2, box.y1 + maxLabelSize + space\n );\n }\n\n this.arrangeTitle();\n this.arrangeLabels();\n this.arrangeNotes();\n },\n\n getLabelsTickPositions: function() {\n return this.getMajorTickPositions();\n },\n\n labelTickIndex: function(label) {\n return label.index;\n },\n\n arrangeLabels: function() {\n var this$1$1 = this;\n\n var ref = this;\n var options = ref.options;\n var labels = ref.labels;\n var labelsBetweenTicks = this.labelsBetweenTicks();\n var vertical = options.vertical;\n var mirror = options.labels.mirror;\n var tickPositions = this.getLabelsTickPositions();\n\n for (var idx = 0; idx < labels.length; idx++) {\n var label = labels[idx];\n var tickIx = this$1$1.labelTickIndex(label);\n var labelSize = vertical ? label.box.height() : label.box.width();\n var firstTickPosition = tickPositions[tickIx];\n var nextTickPosition = tickPositions[tickIx + 1];\n var positionStart = (void 0), positionEnd = (void 0);\n\n if (vertical) {\n if (labelsBetweenTicks) {\n var middle = firstTickPosition + (nextTickPosition - firstTickPosition) / 2;\n positionStart = middle - (labelSize / 2);\n } else {\n positionStart = firstTickPosition - (labelSize / 2);\n }\n\n positionEnd = positionStart;\n } else {\n if (labelsBetweenTicks) {\n positionStart = firstTickPosition;\n positionEnd = nextTickPosition;\n } else {\n positionStart = firstTickPosition - (labelSize / 2);\n positionEnd = positionStart + labelSize;\n }\n }\n\n this$1$1.positionLabel(label, mirror, positionStart, positionEnd);\n }\n },\n\n positionLabel: function(label, mirror, positionStart, positionEnd) {\n if (positionEnd === void 0) { positionEnd = positionStart; }\n\n var options = this.options;\n var vertical = options.vertical;\n var lineBox = this.lineBox();\n var labelOffset = this.getActualTickSize() + options.margin;\n var labelBox;\n\n if (vertical) {\n var labelX = lineBox.x2;\n\n if (mirror) {\n labelX += labelOffset;\n label.options.rotationOrigin = LEFT;\n } else {\n labelX -= labelOffset + label.box.width();\n label.options.rotationOrigin = RIGHT;\n }\n\n labelBox = label.box.move(labelX, positionStart);\n } else {\n var labelY = lineBox.y1;\n\n if (mirror) {\n labelY -= labelOffset + label.box.height();\n label.options.rotationOrigin = BOTTOM;\n } else {\n labelY += labelOffset;\n label.options.rotationOrigin = TOP;\n }\n\n labelBox = new Box(\n positionStart, labelY,\n positionEnd, labelY + label.box.height()\n );\n }\n\n label.reflow(labelBox);\n },\n\n autoRotateLabelAngle: function(labelBox, slotWidth) {\n if (labelBox.width() < slotWidth) {\n return 0;\n }\n\n if (labelBox.height() > slotWidth) {\n return -90;\n }\n\n return -45;\n },\n\n autoRotateLabels: function() {\n var this$1$1 = this;\n\n if (!this.options.autoRotateLabels || this.options.vertical) {\n return false;\n }\n\n var tickPositions = this.getMajorTickPositions();\n var labels = this.labels;\n var limit = Math.min(labels.length, tickPositions.length - 1);\n var angle = 0;\n\n for (var idx = 0; idx < limit; idx++) {\n var width = Math.abs(tickPositions[idx + 1] - tickPositions[idx]);\n var labelBox = labels[idx].box;\n var labelAngle = this$1$1.autoRotateLabelAngle(labelBox, width);\n\n if (labelAngle !== 0) {\n angle = labelAngle;\n }\n\n if (angle === -90) {\n break;\n }\n }\n\n if (angle !== 0) {\n for (var idx$1 = 0; idx$1 < labels.length; idx$1++) {\n labels[idx$1].options.rotation = angle;\n labels[idx$1].reflow(new Box());\n }\n\n return true;\n }\n },\n\n arrangeTitle: function() {\n var ref = this;\n var options = ref.options;\n var title = ref.title;\n var mirror = options.labels.mirror;\n var vertical = options.vertical;\n\n if (title) {\n if (vertical) {\n title.options.align = mirror ? RIGHT : LEFT;\n title.options.vAlign = title.options.position;\n } else {\n title.options.align = title.options.position;\n title.options.vAlign = mirror ? TOP : BOTTOM;\n }\n\n title.reflow(this.box);\n }\n },\n\n arrangeNotes: function() {\n var this$1$1 = this;\n\n for (var idx = 0; idx < this.notes.length; idx++) {\n var item = this$1$1.notes[idx];\n var value = item.options.value;\n var slot = (void 0);\n\n if (defined(value)) {\n if (this$1$1.shouldRenderNote(value)) {\n item.show();\n } else {\n item.hide();\n }\n\n slot = this$1$1.noteSlot(value);\n } else {\n item.hide();\n }\n\n item.reflow(slot || this$1$1.lineBox());\n }\n },\n\n noteSlot: function(value) {\n return this.getSlot(value);\n },\n\n alignTo: function(secondAxis) {\n var lineBox = secondAxis.lineBox();\n var vertical = this.options.vertical;\n var pos = vertical ? Y : X;\n\n this.box.snapTo(lineBox, pos);\n if (vertical) {\n this.box.shrink(0, this.lineBox().height() - lineBox.height());\n } else {\n this.box.shrink(this.lineBox().width() - lineBox.width(), 0);\n }\n this.box[pos + 1] -= this.lineBox()[pos + 1] - lineBox[pos + 1];\n this.box[pos + 2] -= this.lineBox()[pos + 2] - lineBox[pos + 2];\n },\n\n axisLabelText: function(value, options, context) {\n var this$1$1 = this;\n\n var text;\n var tmpl = getTemplate(options);\n var defaultText = function () {\n if (!options.format) {\n return value;\n }\n\n return this$1$1.chartService.format.localeAuto(\n options.format, [ value ], options.culture\n );\n };\n\n if (tmpl) {\n var templateContext = $.extend({}, context, {\n get text() { return defaultText(); },\n value: value,\n format: options.format,\n culture: options.culture\n });\n\n text = tmpl(templateContext);\n } else {\n text = defaultText();\n }\n\n return text;\n },\n\n slot: function(from , to, limit) {\n var slot = this.getSlot(from, to, limit);\n if (slot) {\n return slot.toRect();\n }\n },\n\n contentBox: function() {\n var box = this.box.clone();\n var labels = this.labels;\n if (labels.length) {\n var axis = this.options.vertical ? Y : X;\n if (this.chartService.isPannable(axis)) {\n var offset = this.maxLabelOffset();\n box[axis + 1] -= offset.start;\n box[axis + 2] += offset.end;\n } else {\n if (labels[0].options.visible) {\n box.wrap(labels[0].box);\n }\n var lastLabel = labels[labels.length - 1];\n if (lastLabel.options.visible) {\n box.wrap(lastLabel.box);\n }\n }\n }\n\n return box;\n },\n\n maxLabelOffset: function() {\n var this$1$1 = this;\n\n var ref = this.options;\n var vertical = ref.vertical;\n var reverse = ref.reverse;\n var labelsBetweenTicks = this.labelsBetweenTicks();\n var tickPositions = this.getLabelsTickPositions();\n var offsetField = vertical ? Y : X;\n var labels = this.labels;\n var startPosition = reverse ? 1 : 0;\n var endPosition = reverse ? 0 : 1;\n var maxStartOffset = 0;\n var maxEndOffset = 0;\n\n for (var idx = 0; idx < labels.length; idx++) {\n var label = labels[idx];\n var tickIx = this$1$1.labelTickIndex(label);\n var startTick = (void 0), endTick = (void 0);\n\n if (labelsBetweenTicks) {\n startTick = tickPositions[tickIx + startPosition];\n endTick = tickPositions[tickIx + endPosition];\n } else {\n startTick = endTick = tickPositions[tickIx];\n }\n\n maxStartOffset = Math.max(maxStartOffset, startTick - label.box[offsetField + 1]);\n maxEndOffset = Math.max(maxEndOffset, label.box[offsetField + 2] - endTick);\n }\n\n return {\n start: maxStartOffset,\n end: maxEndOffset\n };\n },\n\n limitRange: function(from, to, min, max, offset) {\n var options = this.options;\n\n if ((from < min && offset < 0 && (!defined(options.min) || options.min <= min)) || (max < to && offset > 0 && (!defined(options.max) || max <= options.max))) {\n return null;\n }\n\n if ((to < min && offset > 0) || (max < from && offset < 0)) {\n return {\n min: from,\n max: to\n };\n }\n\n var rangeSize = to - from;\n var minValue = from;\n var maxValue = to;\n\n if (from < min && offset < 0) {\n minValue = limitValue(from, min, max);\n maxValue = limitValue(from + rangeSize, min + rangeSize, max);\n } else if (to > max && offset > 0) {\n maxValue = limitValue(to, min, max);\n minValue = limitValue(to - rangeSize, min, max - rangeSize);\n }\n\n return {\n min: minValue,\n max: maxValue\n };\n },\n\n valueRange: function() {\n return {\n min: this.seriesMin,\n max: this.seriesMax\n };\n },\n\n lineDir: function() {\n /*\n * Axis line direction:\n * * Vertical: up.\n * * Horizontal: right.\n */\n\n var ref = this.options;\n var vertical = ref.vertical;\n var reverse = ref.reverse;\n return (vertical ? -1 : 1) * (reverse ? -1 : 1);\n },\n\n lineInfo: function() {\n var ref = this.options;\n var vertical = ref.vertical;\n var lineBox = this.lineBox();\n var lineSize = vertical ? lineBox.height() : lineBox.width();\n var axis = vertical ? Y : X;\n var axisDir = this.lineDir();\n var startEdge = axisDir === 1 ? 1 : 2;\n var axisOrigin = axis + startEdge.toString();\n var lineStart = lineBox[axisOrigin];\n\n return {\n axis: axis,\n axisOrigin: axisOrigin,\n axisDir: axisDir,\n lineBox: lineBox,\n lineSize: lineSize,\n lineStart: lineStart\n };\n },\n\n pointOffset: function(point) {\n var ref = this.lineInfo();\n var axis = ref.axis;\n var axisDir = ref.axisDir;\n var axisOrigin = ref.axisOrigin;\n var lineBox = ref.lineBox;\n var lineSize = ref.lineSize;\n var relative = axisDir > 0 ? point[axis] - lineBox[axisOrigin] : lineBox[axisOrigin] - point[axis];\n var offset = relative / lineSize;\n\n return offset;\n },\n\n scaleToDelta: function(rawScale, range) {\n // Scale >= 1 would result in axis range of 0.\n // Scale <= -1 would reverse the scale direction.\n var MAX_SCALE = 0.999;\n var scale = limitValue(rawScale, -MAX_SCALE, MAX_SCALE);\n\n var delta;\n if (scale > 0) {\n delta = range * Math.min(1, scale);\n } else {\n delta = range - (range / (1 + scale));\n }\n\n return delta;\n },\n\n labelsBetweenTicks: function() {\n return !this.options.justified;\n },\n\n prepareUserOptions: function() {\n }\n });\n\n setDefaultOptions(Axis, {\n labels: {\n visible: true,\n rotation: 0,\n mirror: false,\n step: 1,\n skip: 0\n },\n line: {\n width: 1,\n color: BLACK,\n visible: true\n },\n title: {\n visible: true,\n position: CENTER\n },\n majorTicks: {\n align: OUTSIDE,\n size: 4,\n skip: 0,\n step: 1\n },\n minorTicks: {\n align: OUTSIDE,\n size: 3,\n skip: 0,\n step: 1\n },\n axisCrossingValue: 0,\n majorTickType: OUTSIDE,\n minorTickType: NONE,\n majorGridLines: {\n skip: 0,\n step: 1\n },\n minorGridLines: {\n visible: false,\n width: 1,\n color: BLACK,\n skip: 0,\n step: 1\n },\n // TODO: Move to line or labels options\n margin: 5,\n visible: true,\n reverse: false,\n justified: true,\n notes: {\n label: {\n text: \"\"\n }\n },\n\n _alignLines: true,\n _deferLabels: false\n });\n\n var MILLISECONDS = \"milliseconds\";\n var SECONDS = \"seconds\";\n var MINUTES = \"minutes\";\n var HOURS = \"hours\";\n var DAYS = \"days\";\n var WEEKS = \"weeks\";\n var MONTHS = \"months\";\n var YEARS = \"years\";\n\n var TIME_PER_MILLISECOND = 1;\n var TIME_PER_SECOND = 1000;\n var TIME_PER_MINUTE = 60 * TIME_PER_SECOND;\n var TIME_PER_HOUR = 60 * TIME_PER_MINUTE;\n var TIME_PER_DAY = 24 * TIME_PER_HOUR;\n var TIME_PER_WEEK = 7 * TIME_PER_DAY;\n var TIME_PER_MONTH = 31 * TIME_PER_DAY;\n var TIME_PER_YEAR = 365 * TIME_PER_DAY;\n var TIME_PER_UNIT = {\n \"years\": TIME_PER_YEAR,\n \"months\": TIME_PER_MONTH,\n \"weeks\": TIME_PER_WEEK,\n \"days\": TIME_PER_DAY,\n \"hours\": TIME_PER_HOUR,\n \"minutes\": TIME_PER_MINUTE,\n \"seconds\": TIME_PER_SECOND,\n \"milliseconds\": TIME_PER_MILLISECOND\n };\n\n function absoluteDateDiff(a, b) {\n var diff = a.getTime() - b;\n var offsetDiff = a.getTimezoneOffset() - b.getTimezoneOffset();\n\n return diff - (offsetDiff * TIME_PER_MINUTE);\n }\n\n function addTicks(date, ticks) {\n return new Date(date.getTime() + ticks);\n }\n\n function toDate(value) {\n var result;\n\n if (value instanceof Date) {\n result = value;\n } else if (value) {\n result = new Date(value);\n }\n\n return result;\n }\n\n function startOfWeek(date, weekStartDay) {\n if (weekStartDay === void 0) { weekStartDay = 0; }\n\n var daysToSubtract = 0;\n var day = date.getDay();\n\n if (!isNaN(day)) {\n while (day !== weekStartDay) {\n if (day === 0) {\n day = 6;\n } else {\n day--;\n }\n\n daysToSubtract++;\n }\n }\n\n return addTicks(date, -daysToSubtract * TIME_PER_DAY);\n }\n\n function adjustDST(date, hours) {\n if (hours === 0 && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n return true;\n }\n\n return false;\n }\n\n function addHours(date, hours) {\n var roundedDate = new Date(date);\n\n roundedDate.setMinutes(0, 0, 0);\n\n var tzDiff = (date.getTimezoneOffset() - roundedDate.getTimezoneOffset()) * TIME_PER_MINUTE;\n\n return addTicks(roundedDate, tzDiff + hours * TIME_PER_HOUR);\n }\n\n function addDuration(dateValue, value, unit, weekStartDay) {\n var result = dateValue;\n\n if (dateValue) {\n var date = toDate(dateValue);\n var hours = date.getHours();\n\n if (unit === YEARS) {\n result = new Date(date.getFullYear() + value, 0, 1);\n adjustDST(result, 0);\n } else if (unit === MONTHS) {\n result = new Date(date.getFullYear(), date.getMonth() + value, 1);\n adjustDST(result, hours);\n } else if (unit === WEEKS) {\n result = addDuration(startOfWeek(date, weekStartDay), value * 7, DAYS);\n adjustDST(result, hours);\n } else if (unit === DAYS) {\n result = new Date(date.getFullYear(), date.getMonth(), date.getDate() + value);\n adjustDST(result, hours);\n } else if (unit === HOURS) {\n result = addHours(date, value);\n } else if (unit === MINUTES) {\n result = addTicks(date, value * TIME_PER_MINUTE);\n\n if (result.getSeconds() > 0) {\n result.setSeconds(0);\n }\n } else if (unit === SECONDS) {\n result = addTicks(date, value * TIME_PER_SECOND);\n } else if (unit === MILLISECONDS) {\n result = addTicks(date, value);\n }\n\n if (unit !== MILLISECONDS && result.getMilliseconds() > 0) {\n result.setMilliseconds(0);\n }\n }\n\n return result;\n }\n\n function floorDate(date, unit, weekStartDay) {\n return addDuration(toDate(date), 0, unit, weekStartDay);\n }\n\n function ceilDate(dateValue, unit, weekStartDay) {\n var date = toDate(dateValue);\n\n if (date && floorDate(date, unit, weekStartDay).getTime() === date.getTime()) {\n return date;\n }\n\n return addDuration(date, 1, unit, weekStartDay);\n }\n\n function dateComparer(a, b) {\n if (a && b) {\n return a.getTime() - b.getTime();\n }\n\n return -1;\n }\n\n function dateDiff(a, b) {\n return a.getTime() - b;\n }\n\n function toTime(value) {\n if (isArray(value)) {\n var result = [];\n for (var idx = 0; idx < value.length; idx++) {\n result.push(toTime(value[idx]));\n }\n\n return result;\n } else if (value) {\n return toDate(value).getTime();\n }\n }\n\n function dateEquals(a, b) {\n if (a && b) {\n return toTime(a) === toTime(b);\n }\n\n return a === b;\n }\n\n function timeIndex(date, start, baseUnit) {\n return absoluteDateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n }\n\n function dateIndex(value, start, baseUnit, baseUnitStep) {\n var date = toDate(value);\n var startDate = toDate(start);\n var index;\n\n if (baseUnit === MONTHS) {\n index = (date.getMonth() - startDate.getMonth() + (date.getFullYear() - startDate.getFullYear()) * 12) +\n timeIndex(date, new Date(date.getFullYear(), date.getMonth()), DAYS) / new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n } else if (baseUnit === YEARS) {\n index = date.getFullYear() - startDate.getFullYear() + dateIndex(date, new Date(date.getFullYear(), 0), MONTHS, 1) / 12;\n } else if (baseUnit === DAYS || baseUnit === WEEKS) {\n index = timeIndex(date, startDate, baseUnit);\n } else {\n index = dateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n }\n\n return index / baseUnitStep;\n }\n\n function duration(a, b, unit) {\n var diff;\n\n if (unit === YEARS) {\n diff = b.getFullYear() - a.getFullYear();\n } else if (unit === MONTHS) {\n diff = duration(a, b, YEARS) * 12 + b.getMonth() - a.getMonth();\n } else if (unit === DAYS) {\n diff = Math.floor(dateDiff(b, a) / TIME_PER_DAY);\n } else {\n diff = Math.floor(dateDiff(b, a) / TIME_PER_UNIT[unit]);\n }\n\n return diff;\n }\n\n function lteDateIndex(date, sortedDates) {\n var low = 0;\n var high = sortedDates.length - 1;\n var index;\n\n while (low <= high) {\n index = Math.floor((low + high) / 2);\n var currentDate = sortedDates[index];\n\n if (currentDate < date) {\n low = index + 1;\n continue;\n }\n\n if (currentDate > date) {\n high = index - 1;\n continue;\n }\n\n while (dateEquals(sortedDates[index - 1], date)) {\n index--;\n }\n\n return index;\n }\n\n if (sortedDates[index] <= date) {\n return index;\n }\n\n return index - 1;\n }\n\n function parseDate(intlService, date) {\n var result;\n if (isString(date)) {\n result = intlService.parseDate(date) || toDate(date);\n } else {\n result = toDate(date);\n }\n return result;\n }\n\n function parseDates(intlService, dates) {\n if (isArray(dates)) {\n var result = [];\n for (var idx = 0; idx < dates.length; idx++) {\n result.push(parseDate(intlService, dates[idx]));\n }\n\n return result;\n }\n\n return parseDate(intlService, dates);\n }\n\n function firstDay(options, intlService) {\n if (isNumber(options.weekStartDay)) {\n return options.weekStartDay;\n }\n\n if (intlService && intlService.firstDay) {\n return intlService.firstDay();\n }\n\n return 0;\n }\n\n var MIN_CATEGORY_POINTS_RANGE = 0.01;\n var MIN_CATEGORY_RANGE = 0.1;\n\n function indexOf(value, arr) {\n if (value instanceof Date) {\n var length = arr.length;\n for (var idx = 0; idx < length; idx++) {\n if (dateEquals(arr[idx], value)) {\n return idx;\n }\n }\n\n return -1;\n }\n\n return arr.indexOf(value);\n }\n\n var CategoryAxis = Axis.extend({\n initFields: function() {\n this._ticks = {};\n },\n\n categoriesHash: function() {\n return \"\";\n },\n\n clone: function() {\n var copy = new CategoryAxis($.extend({}, this.options, {\n categories: this.options.srcCategories\n }), this.chartService);\n copy.createLabels();\n\n return copy;\n },\n\n initUserOptions: function(options) {\n var categories = options.categories || [];\n var definedMin = defined(options.min);\n var definedMax = defined(options.max);\n options.srcCategories = options.categories = categories;\n\n if ((definedMin || definedMax) && categories.length) {\n var min = definedMin ? Math.floor(options.min) : 0;\n var max;\n\n if (definedMax) {\n max = options.justified ? Math.floor(options.max) + 1 : Math.ceil(options.max);\n } else {\n max = categories.length;\n }\n\n options.categories = options.categories.slice(min, max);\n }\n\n return options;\n },\n\n rangeIndices: function() {\n var options = this.options;\n var length = options.categories.length || 1;\n var min = isNumber(options.min) ? options.min % 1 : 0;\n var max;\n\n if (isNumber(options.max) && options.max % 1 !== 0 && options.max < this.totalRange().max) {\n max = length - (1 - options.max % 1);\n } else {\n max = length - (options.justified ? 1 : 0);\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n totalRangeIndices: function(limit) {\n var options = this.options;\n var min = isNumber(options.min) ? options.min : 0;\n var max;\n\n if (isNumber(options.max)) {\n max = options.max;\n } else if (isNumber(options.min)) {\n max = min + options.categories.length;\n } else {\n max = this.totalRange().max || 1;\n }\n\n if (limit) {\n var totalRange = this.totalRange();\n min = limitValue(min, 0, totalRange.max);\n max = limitValue(max, 0, totalRange.max);\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n range: function() {\n var options = this.options;\n var min = isNumber(options.min) ? options.min : 0;\n var max = isNumber(options.max) ? options.max : this.totalRange().max;\n\n return {\n min: min,\n max: max\n };\n },\n\n roundedRange: function() {\n return this.range();\n },\n\n totalRange: function() {\n var options = this.options;\n return { min: 0, max: Math.max(this._seriesMax || 0, options.srcCategories.length) - (options.justified ? 1 : 0) };\n },\n\n scaleOptions: function() {\n var ref = this.rangeIndices();\n var min = ref.min;\n var max = ref.max;\n var lineBox = this.lineBox();\n var size = this.options.vertical ? lineBox.height() : lineBox.width();\n var scale = size / ((max - min) || 1);\n\n return {\n scale: scale * (this.options.reverse ? -1 : 1),\n box: lineBox,\n min: min,\n max: max\n };\n },\n\n arrangeLabels: function() {\n Axis.fn.arrangeLabels.call(this);\n this.hideOutOfRangeLabels();\n },\n\n hideOutOfRangeLabels: function() {\n var ref = this;\n var box = ref.box;\n var labels = ref.labels;\n\n if (labels.length > 0) {\n var valueAxis = this.options.vertical ? Y : X;\n var start = box[valueAxis + 1];\n var end = box[valueAxis + 2];\n var firstLabel = labels[0];\n var lastLabel = last(labels);\n\n if (firstLabel.box[valueAxis + 1] > end || firstLabel.box[valueAxis + 2] < start) {\n firstLabel.options.visible = false;\n }\n if (lastLabel.box[valueAxis + 1] > end || lastLabel.box[valueAxis + 2] < start) {\n lastLabel.options.visible = false;\n }\n }\n },\n\n getMajorTickPositions: function() {\n return this.getTicks().majorTicks;\n },\n\n getMinorTickPositions: function() {\n return this.getTicks().minorTicks;\n },\n\n getLabelsTickPositions: function() {\n return this.getTicks().labelTicks;\n },\n\n tickIndices: function(stepSize) {\n var ref = this.rangeIndices();\n var min = ref.min;\n var max = ref.max;\n var limit = Math.ceil(max);\n var current = Math.floor(min);\n var indices = [];\n\n while (current <= limit) {\n indices.push(current);\n current += stepSize;\n }\n\n return indices;\n },\n\n getTickPositions: function(stepSize) {\n var ref = this.options;\n var vertical = ref.vertical;\n var reverse = ref.reverse;\n var ref$1 = this.scaleOptions();\n var scale = ref$1.scale;\n var box = ref$1.box;\n var min = ref$1.min;\n var pos = box[(vertical ? Y : X) + (reverse ? 2 : 1)];\n var indices = this.tickIndices(stepSize);\n var positions = [];\n\n for (var idx = 0; idx < indices.length; idx++) {\n positions.push(pos + round(scale * (indices[idx] - min), COORD_PRECISION));\n }\n\n return positions;\n },\n\n getTicks: function() {\n var options = this.options;\n var cache = this._ticks;\n var range = this.rangeIndices();\n var lineBox = this.lineBox();\n var hash = lineBox.getHash() + range.min + \",\" + range.max + options.reverse + options.justified;\n\n if (cache._hash !== hash) {\n var hasMinor = options.minorTicks.visible || options.minorGridLines.visible;\n cache._hash = hash;\n cache.labelTicks = this.getTickPositions(1);\n cache.majorTicks = this.filterOutOfRangePositions(cache.labelTicks, lineBox);\n cache.minorTicks = hasMinor ? this.filterOutOfRangePositions(this.getTickPositions(0.5), lineBox) : [];\n }\n\n return cache;\n },\n\n filterOutOfRangePositions: function(positions, lineBox) {\n if (!positions.length) {\n return positions;\n }\n\n var axis = this.options.vertical ? Y : X;\n var inRange = function (position) { return lineBox[axis + 1] <= position && position <= lineBox[axis + 2]; };\n\n var end = positions.length - 1;\n var startIndex = 0;\n while (!inRange(positions[startIndex]) && startIndex <= end) {\n startIndex++;\n }\n\n var endIndex = end;\n\n while (!inRange(positions[endIndex]) && endIndex >= 0) {\n endIndex--;\n }\n\n return positions.slice(startIndex, endIndex + 1);\n },\n\n lineInfo: function() {\n var ref = this.options;\n var vertical = ref.vertical;\n var reverse = ref.reverse;\n var lineBox = this.lineBox();\n var lineSize = vertical ? lineBox.height() : lineBox.width();\n var axis = vertical ? Y : X;\n var axisDir = reverse ? -1 : 1;\n var startEdge = axisDir === 1 ? 1 : 2;\n var axisOrigin = axis + startEdge.toString();\n var lineStart = lineBox[axisOrigin];\n\n return {\n axis: axis,\n axisOrigin: axisOrigin,\n axisDir: axisDir,\n lineBox: lineBox,\n lineSize: lineSize,\n lineStart: lineStart\n };\n },\n\n lineDir: function() {\n /*\n * Category axis line direction:\n * * Vertical: down.\n * * Horizontal: right.\n */\n\n var ref = this.options;\n var reverse = ref.reverse;\n return reverse ? -1 : 1;\n },\n\n getSlot: function(from, to, limit) {\n var options = this.options;\n var reverse = options.reverse;\n var justified = options.justified;\n var ref = this.scaleOptions();\n var scale = ref.scale;\n var box = ref.box;\n var min = ref.min;\n var ref$1 = this.lineInfo();\n var valueAxis = ref$1.axis;\n var lineStart = ref$1.lineStart;\n\n var slotBox = box.clone();\n var singleSlot = !defined(to);\n\n var start = valueOrDefault(from, 0);\n var end = valueOrDefault(to, start);\n end = Math.max(end - 1, start);\n\n // Fixes transient bug caused by iOS 6.0 JIT\n // (one can never be too sure)\n end = Math.max(start, end);\n\n var p1 = lineStart + (start - min) * scale;\n var p2 = lineStart + (end + 1 - min) * scale;\n\n if (singleSlot && justified) {\n p2 = p1;\n }\n\n if (limit) {\n p1 = limitValue(p1, box[valueAxis + 1], box[valueAxis + 2]);\n p2 = limitValue(p2, box[valueAxis + 1], box[valueAxis + 2]);\n }\n\n slotBox[valueAxis + 1] = reverse ? p2 : p1;\n slotBox[valueAxis + 2] = reverse ? p1 : p2;\n\n return slotBox;\n },\n\n limitSlot: function(slot) {\n var vertical = this.options.vertical;\n var valueAxis = vertical ? Y : X;\n var lineBox = this.lineBox();\n var limittedSlot = slot.clone();\n\n limittedSlot[valueAxis + 1] = limitValue(slot[valueAxis + 1], lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n limittedSlot[valueAxis + 2] = limitValue(slot[valueAxis + 2], lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n\n return limittedSlot;\n },\n\n slot: function(from, to, limit) {\n var min = Math.floor(this.options.min || 0);\n var start = from;\n var end = to;\n\n if (typeof start === \"string\") {\n start = this.categoryIndex(start);\n } else if (isNumber(start)) {\n start -= min;\n }\n\n if (typeof end === \"string\") {\n end = this.categoryIndex(end);\n } else if (isNumber(end)) {\n end -= min;\n }\n\n return Axis.fn.slot.call(this, start, end, limit);\n },\n\n pointCategoryIndex: function(point) {\n var ref = this.options;\n var reverse = ref.reverse;\n var justified = ref.justified;\n var vertical = ref.vertical;\n var valueAxis = vertical ? Y : X;\n var ref$1 = this.scaleOptions();\n var scale = ref$1.scale;\n var box = ref$1.box;\n var min = ref$1.min;\n var max = ref$1.max;\n var startValue = reverse ? max : min;\n var lineStart = box[valueAxis + 1];\n var lineEnd = box[valueAxis + 2];\n var pos = point[valueAxis];\n\n if (pos < lineStart || pos > lineEnd) {\n return null;\n }\n\n var value = startValue + (pos - lineStart) / scale;\n var diff = value % 1;\n\n if (justified) {\n value = Math.round(value);\n } else if (diff === 0 && value > 0) {\n value--;\n }\n\n return Math.floor(value);\n },\n\n getCategory: function(point) {\n var index = this.pointCategoryIndex(point);\n\n if (index === null) {\n return null;\n }\n\n return this.options.categories[index];\n },\n\n categoryIndex: function(value) {\n return this.totalIndex(value) - Math.floor(this.options.min || 0);\n },\n\n categoryAt: function(index, total) {\n var options = this.options;\n\n return (total ? options.srcCategories : options.categories)[index];\n },\n\n categoriesCount: function() {\n return (this.options.categories || []).length;\n },\n\n translateRange: function(delta) {\n var options = this.options;\n var lineBox = this.lineBox();\n var size = options.vertical ? lineBox.height() : lineBox.width();\n var range = options.categories.length;\n var scale = size / range;\n var offset = round(delta / scale, DEFAULT_PRECISION);\n\n return {\n min: offset,\n max: range + offset\n };\n },\n\n scaleRange: function(scale, cursor) {\n var position = Math.abs(this.pointOffset(cursor));\n var rangeIndices = this.totalRangeIndices();\n var range = rangeIndices.max - rangeIndices.min;\n var delta = this.scaleToDelta(scale, range);\n var minDelta = position * delta;\n var maxDelta = (1 - position) * delta;\n var min = rangeIndices.min + minDelta;\n var max = rangeIndices.max - maxDelta;\n\n if (max - min < MIN_CATEGORY_RANGE) {\n max = min + MIN_CATEGORY_RANGE;\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n zoomRange: function(scale, cursor) {\n var ref = this.totalRange();\n var totalMin = ref.min;\n var totalMax = ref.max;\n var range = this.scaleRange(scale, cursor);\n\n return {\n min: limitValue(range.min, totalMin, totalMax),\n max: limitValue(range.max, totalMin, totalMax)\n };\n },\n\n labelsCount: function() {\n var labelsRange = this.labelsRange();\n\n return labelsRange.max - labelsRange.min;\n },\n\n labelsRange: function() {\n var options = this.options;\n var justified = options.justified;\n var labelOptions = options.labels;\n var ref = this.totalRangeIndices(true);\n var min = ref.min;\n var max = ref.max;\n var start = Math.floor(min);\n\n if (!justified) {\n min = Math.floor(min);\n max = Math.ceil(max);\n } else {\n min = Math.ceil(min);\n max = Math.floor(max);\n }\n\n var skip;\n\n if (min > labelOptions.skip) {\n skip = labelOptions.skip + labelOptions.step * Math.ceil((min - labelOptions.skip) / labelOptions.step);\n } else {\n skip = labelOptions.skip;\n }\n\n return {\n min: skip - start,\n max: (options.categories.length ? max + (justified ? 1 : 0) : 0) - start\n };\n },\n\n createAxisLabel: function(index, labelOptions, labelContext) {\n var options = this.options;\n var dataItem = options.dataItems ? options.dataItems[index] : null;\n var category = valueOrDefault(options.categories[index], \"\");\n\n labelContext.dataItem = dataItem;\n var text = this.axisLabelText(category, labelOptions, labelContext);\n\n return new AxisLabel(category, text, index, dataItem, labelOptions);\n },\n\n shouldRenderNote: function(value) {\n var range = this.totalRangeIndices();\n\n return Math.floor(range.min) <= value && value <= Math.ceil(range.max);\n },\n\n noteSlot: function(value) {\n var options = this.options;\n var index = value - Math.floor(options.min || 0);\n return this.getSlot(index);\n },\n\n arrangeNotes: function() {\n Axis.fn.arrangeNotes.call(this);\n this.hideOutOfRangeNotes();\n },\n\n hideOutOfRangeNotes: function() {\n var ref = this;\n var notes = ref.notes;\n var box = ref.box;\n if (notes && notes.length) {\n var valueAxis = this.options.vertical ? Y : X;\n var start = box[valueAxis + 1];\n var end = box[valueAxis + 2];\n\n for (var idx = 0; idx < notes.length; idx++) {\n var note = notes[idx];\n if (note.box && (end < note.box[valueAxis + 1] || note.box[valueAxis + 2] < start)) {\n note.hide();\n }\n }\n }\n },\n\n pan: function(delta) {\n var range = this.totalRangeIndices(true);\n var ref = this.scaleOptions();\n var scale = ref.scale;\n var offset = round(delta / scale, DEFAULT_PRECISION);\n var totalRange = this.totalRange();\n var min = range.min + offset;\n var max = range.max + offset;\n\n return this.limitRange(min, max, 0, totalRange.max, offset);\n },\n\n pointsRange: function(start, end) {\n var ref = this.options;\n var reverse = ref.reverse;\n var vertical = ref.vertical;\n var valueAxis = vertical ? Y : X;\n var range = this.totalRangeIndices(true);\n var ref$1 = this.scaleOptions();\n var scale = ref$1.scale;\n var box = ref$1.box;\n var lineStart = box[valueAxis + (reverse ? 2 : 1)];\n\n var diffStart = start[valueAxis] - lineStart;\n var diffEnd = end[valueAxis] - lineStart;\n\n var min = range.min + diffStart / scale;\n var max = range.min + diffEnd / scale;\n var rangeMin = Math.min(min, max);\n var rangeMax = Math.max(min, max);\n\n if (rangeMax - rangeMin >= MIN_CATEGORY_POINTS_RANGE) {\n return {\n min: rangeMin,\n max: rangeMax\n };\n }\n },\n\n valueRange: function() {\n return this.range();\n },\n\n totalIndex: function(value) {\n var options = this.options;\n var index = this._categoriesMap ?\n this._categoriesMap.get(value) : indexOf(value, options.srcCategories);\n\n return index;\n },\n\n currentRangeIndices: function() {\n var options = this.options;\n var min = 0;\n\n if (isNumber(options.min)) {\n min = Math.floor(options.min);\n }\n\n var max;\n if (isNumber(options.max)) {\n max = options.justified ? Math.floor(options.max) : Math.ceil(options.max) - 1;\n } else {\n max = this.totalCount() - 1;\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n mapCategories: function() {\n if (!this._categoriesMap) {\n var map$$1 = this._categoriesMap = new HashMap();\n var srcCategories = this.options.srcCategories;\n for (var idx = 0; idx < srcCategories.length; idx++) {\n map$$1.set(srcCategories[idx], idx);\n }\n }\n },\n\n totalCount: function() {\n return Math.max(this.options.srcCategories.length, this._seriesMax || 0);\n }\n });\n\n setDefaultOptions(CategoryAxis, {\n type: \"category\",\n vertical: false,\n majorGridLines: {\n visible: false,\n width: 1,\n color: BLACK\n },\n labels: {\n zIndex: 1\n },\n justified: false,\n _deferLabels: true\n });\n\n var COORDINATE_LIMIT = 300000;\n\n var DateLabelFormats = {\n milliseconds: \"HH:mm:ss.fff\",\n seconds: \"HH:mm:ss\",\n minutes: \"HH:mm\",\n hours: \"HH:mm\",\n days: \"M/d\",\n weeks: \"M/d\",\n months: \"MMM 'yy\",\n years: \"yyyy\"\n };\n\n var ZERO_THRESHOLD = 0.2;\n\n var AUTO = \"auto\";\n var BASE_UNITS = [\n MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS, WEEKS, MONTHS, YEARS\n ];\n var FIT = \"fit\";\n\n function categoryRange(categories) {\n var range = categories._range;\n if (!range) {\n range = categories._range = sparseArrayLimits(categories);\n range.min = toDate(range.min);\n range.max = toDate(range.max);\n }\n\n return range;\n }\n\n var EmptyDateRange = Class.extend({\n init: function(options) {\n this.options = options;\n },\n\n displayIndices: function() {\n return {\n min: 0,\n max: 1\n };\n },\n\n displayRange: function() {\n return {};\n },\n\n total: function() {\n return {};\n },\n\n valueRange: function() {\n return {};\n },\n\n valueIndex: function() {\n return -1;\n },\n\n values: function() {\n return [];\n },\n\n totalIndex: function() {\n return -1;\n },\n\n valuesCount: function() {\n return 0;\n },\n\n totalCount: function() {\n return 0;\n },\n\n dateAt: function() {\n return null;\n }\n });\n\n var DateRange = Class.extend({\n init: function(start, end, options) {\n this.options = options;\n options.baseUnitStep = options.baseUnitStep || 1;\n\n var roundToBaseUnit = options.roundToBaseUnit;\n var justified = options.justified;\n\n this.start = addDuration(start, 0, options.baseUnit, options.weekStartDay);\n var lowerEnd = this.roundToTotalStep(end);\n var expandEnd = !justified && dateEquals(end, lowerEnd) && !options.justifyEnd;\n\n this.end = this.roundToTotalStep(end, !justified, expandEnd ? 1 : 0);\n\n var min = options.min || start;\n this.valueStart = this.roundToTotalStep(min);\n this.displayStart = roundToBaseUnit ? this.valueStart : min;\n\n var max = options.max;\n if (!max) {\n this.valueEnd = lowerEnd;\n this.displayEnd = roundToBaseUnit || expandEnd ? this.end : end;\n } else {\n var next = !justified && dateEquals(max, this.roundToTotalStep(max)) ? -1 : 0;\n this.valueEnd = this.roundToTotalStep(max, false, next);\n this.displayEnd = roundToBaseUnit ? this.roundToTotalStep(max, !justified) : options.max;\n }\n\n if (this.valueEnd < this.valueStart) {\n this.valueEnd = this.valueStart;\n }\n if (this.displayEnd <= this.displayStart) {\n this.displayEnd = this.roundToTotalStep(this.displayStart, false, 1);\n }\n },\n\n displayRange: function() {\n return {\n min: this.displayStart,\n max: this.displayEnd\n };\n },\n\n displayIndices: function() {\n if (!this._indices) {\n var options = this.options;\n\n var baseUnit = options.baseUnit;\n var baseUnitStep = options.baseUnitStep;\n\n var minIdx = dateIndex(this.displayStart, this.valueStart, baseUnit, baseUnitStep);\n var maxIdx = dateIndex(this.displayEnd, this.valueStart, baseUnit, baseUnitStep);\n\n this._indices = { min: minIdx, max: maxIdx };\n }\n\n return this._indices;\n },\n\n total: function() {\n return {\n min: this.start,\n max: this.end\n };\n },\n\n totalCount: function() {\n var last$$1 = this.totalIndex(this.end);\n\n return last$$1 + (this.options.justified ? 1 : 0);\n },\n\n valueRange: function() {\n return {\n min: this.valueStart,\n max: this.valueEnd\n };\n },\n\n valueIndex: function(value) {\n var options = this.options;\n return Math.floor(dateIndex(value, this.valueStart, options.baseUnit, options.baseUnitStep));\n },\n\n totalIndex: function(value) {\n var options = this.options;\n return Math.floor(dateIndex(value, this.start, options.baseUnit, options.baseUnitStep));\n },\n\n dateIndex: function(value) {\n var options = this.options;\n return dateIndex(value, this.valueStart, options.baseUnit, options.baseUnitStep);\n },\n\n valuesCount: function() {\n var maxIdx = this.valueIndex(this.valueEnd);\n\n return maxIdx + 1;\n },\n\n values: function() {\n var values = this._values;\n if (!values) {\n var options = this.options;\n var range = this.valueRange();\n this._values = values = [];\n\n for (var date = range.min; date <= range.max;) {\n values.push(date);\n date = addDuration(date, options.baseUnitStep, options.baseUnit, options.weekStartDay);\n }\n }\n\n return values;\n },\n\n dateAt: function(index, total) {\n var options = this.options;\n\n return addDuration(total ? this.start : this.valueStart, options.baseUnitStep * index, options.baseUnit, options.weekStartDay);\n },\n\n roundToTotalStep: function(value, upper, next) {\n var ref = this.options;\n var baseUnit = ref.baseUnit;\n var baseUnitStep = ref.baseUnitStep;\n var weekStartDay = ref.weekStartDay;\n var start = this.start;\n\n var step = dateIndex(value, start, baseUnit, baseUnitStep);\n var roundedStep = upper ? Math.ceil(step) : Math.floor(step);\n\n if (next) {\n roundedStep += next;\n }\n\n return addDuration(start, roundedStep * baseUnitStep, baseUnit, weekStartDay);\n }\n });\n\n function autoBaseUnit(options, startUnit, startStep) {\n var categoryLimits = categoryRange(options.categories);\n var span = (options.max || categoryLimits.max) - (options.min || categoryLimits.min);\n var autoBaseUnitSteps = options.autoBaseUnitSteps;\n var maxDateGroups = options.maxDateGroups;\n var autoUnit = options.baseUnit === FIT;\n var autoUnitIx = startUnit ? BASE_UNITS.indexOf(startUnit) : 0;\n var baseUnit = autoUnit ? BASE_UNITS[autoUnitIx++] : options.baseUnit;\n var units = span / TIME_PER_UNIT[baseUnit];\n var totalUnits = units;\n var unitSteps, step, nextStep;\n\n while (!step || units >= maxDateGroups) {\n unitSteps = unitSteps || autoBaseUnitSteps[baseUnit].slice(0);\n\n do {\n nextStep = unitSteps.shift();\n } while (nextStep && startUnit === baseUnit && nextStep < startStep);\n\n if (nextStep) {\n step = nextStep;\n units = totalUnits / step;\n } else if (baseUnit === last(BASE_UNITS)) {\n step = Math.ceil(totalUnits / maxDateGroups);\n break;\n } else if (autoUnit) {\n baseUnit = BASE_UNITS[autoUnitIx++] || last(BASE_UNITS);\n totalUnits = span / TIME_PER_UNIT[baseUnit];\n unitSteps = null;\n } else {\n if (units > maxDateGroups) {\n step = Math.ceil(totalUnits / maxDateGroups);\n }\n break;\n }\n }\n\n options.baseUnitStep = step;\n options.baseUnit = baseUnit;\n }\n\n function defaultBaseUnit(options) {\n var categories = options.categories;\n var count = defined(categories) ? categories.length : 0;\n var minDiff = MAX_VALUE;\n var lastCategory, unit;\n\n for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n var category = categories[categoryIx];\n\n if (category && lastCategory) {\n var diff = absoluteDateDiff(category, lastCategory);\n if (diff > 0) {\n minDiff = Math.min(minDiff, diff);\n\n if (minDiff >= TIME_PER_YEAR) {\n unit = YEARS;\n } else if (minDiff >= TIME_PER_MONTH - TIME_PER_DAY * 3) {\n unit = MONTHS;\n } else if (minDiff >= TIME_PER_WEEK) {\n unit = WEEKS;\n } else if (minDiff >= TIME_PER_DAY) {\n unit = DAYS;\n } else if (minDiff >= TIME_PER_HOUR) {\n unit = HOURS;\n } else if (minDiff >= TIME_PER_MINUTE) {\n unit = MINUTES;\n } else {\n unit = SECONDS;\n }\n }\n }\n\n lastCategory = category;\n }\n\n options.baseUnit = unit || DAYS;\n }\n\n function initUnit(options) {\n var baseUnit = (options.baseUnit || \"\").toLowerCase();\n var useDefault = baseUnit !== FIT && !inArray(baseUnit, BASE_UNITS);\n\n if (useDefault) {\n defaultBaseUnit(options);\n }\n\n if (baseUnit === FIT || options.baseUnitStep === AUTO) {\n autoBaseUnit(options);\n }\n\n return options;\n }\n\n var DateCategoryAxis = CategoryAxis.extend({\n clone: function() {\n var copy = new DateCategoryAxis($.extend({}, this.options), this.chartService);\n copy.createLabels();\n\n return copy;\n },\n\n categoriesHash: function() {\n var start = this.dataRange.total().min;\n return this.options.baseUnit + this.options.baseUnitStep + start;\n },\n\n initUserOptions: function(options) {\n return options;\n },\n\n initFields: function() {\n CategoryAxis.fn.initFields.call(this);\n\n var chartService = this.chartService;\n var intlService = chartService.intl;\n var options = this.options;\n\n var categories = options.categories || [];\n if (!categories._parsed) {\n categories = parseDates(intlService, categories);\n categories._parsed = true;\n }\n\n options = deepExtend({\n roundToBaseUnit: true\n }, options, {\n categories: categories,\n min: parseDate(intlService, options.min),\n max: parseDate(intlService, options.max),\n weekStartDay: firstDay(options, intlService)\n });\n\n if (chartService.panning && chartService.isPannable(options.vertical ? Y : X)) {\n options.roundToBaseUnit = false;\n }\n\n options.userSetBaseUnit = options.userSetBaseUnit || options.baseUnit;\n options.userSetBaseUnitStep = options.userSetBaseUnitStep || options.baseUnitStep;\n\n this.options = options;\n options.srcCategories = categories;\n\n if (categories.length > 0) {\n var range = categoryRange(categories);\n var maxDivisions = options.maxDivisions;\n\n this.dataRange = new DateRange(range.min, range.max, initUnit(options));\n\n if (maxDivisions) {\n var dataRange = this.dataRange.displayRange();\n\n var divisionOptions = $.extend({}, options, {\n justified: true,\n roundToBaseUnit: false,\n baseUnit: 'fit',\n min: dataRange.min,\n max: dataRange.max,\n maxDateGroups: maxDivisions\n });\n\n var dataRangeOptions = this.dataRange.options;\n\n autoBaseUnit(divisionOptions, dataRangeOptions.baseUnit, dataRangeOptions.baseUnitStep);\n\n this.divisionRange = new DateRange(range.min, range.max, divisionOptions);\n } else {\n this.divisionRange = this.dataRange;\n }\n\n } else {\n options.baseUnit = options.baseUnit || DAYS;\n this.dataRange = this.divisionRange = new EmptyDateRange(options);\n }\n\n this.rangeLabels = [];\n },\n\n tickIndices: function(stepSize) {\n var ref = this;\n var dataRange = ref.dataRange;\n var divisionRange = ref.divisionRange;\n var valuesCount = divisionRange.valuesCount();\n\n if (!this.options.maxDivisions || !valuesCount) {\n return CategoryAxis.fn.tickIndices.call(this, stepSize);\n }\n\n var indices = [];\n var values = divisionRange.values();\n var offset = 0;\n\n if (!this.options.justified) {\n values = values.concat(divisionRange.dateAt(valuesCount));\n offset = 0.5;//align ticks to the center of not justified categories\n }\n\n for (var idx = 0; idx < values.length; idx++) {\n indices.push(dataRange.dateIndex(values[idx]) + offset);\n if (stepSize !== 1 && idx >= 1) {\n var last$$1 = indices.length - 1;\n indices.splice(idx, 0, indices[last$$1 - 1] + (indices[last$$1] - indices[last$$1 - 1]) * stepSize);\n }\n }\n\n return indices;\n },\n\n shouldRenderNote: function(value) {\n var range = this.range();\n var categories = this.options.categories || [];\n\n return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0 && categories.length;\n },\n\n parseNoteValue: function(value) {\n return parseDate(this.chartService.intl, value);\n },\n\n noteSlot: function(value) {\n return this.getSlot(value);\n },\n\n translateRange: function(delta) {\n var options = this.options;\n var baseUnit = options.baseUnit;\n var weekStartDay = options.weekStartDay;\n var vertical = options.vertical;\n var lineBox = this.lineBox();\n var size = vertical ? lineBox.height() : lineBox.width();\n var range = this.range();\n var scale = size / (range.max - range.min);\n var offset = round(delta / scale, DEFAULT_PRECISION);\n\n if (range.min && range.max) {\n var from = addTicks(options.min || range.min, offset);\n var to = addTicks(options.max || range.max, offset);\n\n range = {\n min: addDuration(from, 0, baseUnit, weekStartDay),\n max: addDuration(to, 0, baseUnit, weekStartDay)\n };\n }\n\n return range;\n },\n\n labelsRange: function() {\n return {\n min: this.options.labels.skip,\n max: this.divisionRange.valuesCount()\n };\n },\n\n pan: function(delta) {\n if (this.isEmpty()) {\n return null;\n }\n\n var options = this.options;\n var lineBox = this.lineBox();\n var size = options.vertical ? lineBox.height() : lineBox.width();\n var ref = this.dataRange.displayRange();\n var min = ref.min;\n var max = ref.max;\n var totalLimits = this.dataRange.total();\n var scale = size / (max - min);\n var offset = round(delta / scale, DEFAULT_PRECISION) * (options.reverse ? -1 : 1);\n var from = addTicks(min, offset);\n var to = addTicks(max, offset);\n\n var panRange = this.limitRange(toTime(from), toTime(to), toTime(totalLimits.min), toTime(totalLimits.max), offset);\n\n if (panRange) {\n panRange.min = toDate(panRange.min);\n panRange.max = toDate(panRange.max);\n panRange.baseUnit = options.baseUnit;\n panRange.baseUnitStep = options.baseUnitStep || 1;\n panRange.userSetBaseUnit = options.userSetBaseUnit;\n panRange.userSetBaseUnitStep = options.userSetBaseUnitStep;\n\n return panRange;\n }\n },\n\n pointsRange: function(start, end) {\n if (this.isEmpty()) {\n return null;\n }\n\n var pointsRange = CategoryAxis.fn.pointsRange.call(this, start, end);\n var datesRange = this.dataRange.displayRange();\n var indicesRange = this.dataRange.displayIndices();\n var scale = dateDiff(datesRange.max, datesRange.min) / (indicesRange.max - indicesRange.min);\n var options = this.options;\n\n var min = addTicks(datesRange.min, pointsRange.min * scale);\n var max = addTicks(datesRange.min, pointsRange.max * scale);\n\n return {\n min: min,\n max: max,\n baseUnit: options.userSetBaseUnit || options.baseUnit,\n baseUnitStep: options.userSetBaseUnitStep || options.baseUnitStep\n };\n },\n\n scaleRange: function(scale, cursor) {\n if (this.isEmpty()) {\n return {};\n }\n\n var options = this.options;\n var fit = options.userSetBaseUnit === FIT;\n var totalLimits = this.dataRange.total();\n var ref = this.dataRange.displayRange();\n var rangeMin = ref.min;\n var rangeMax = ref.max;\n\n var position = Math.abs(this.pointOffset(cursor));\n var range = rangeMax - rangeMin;\n var delta = this.scaleToDelta(scale, range);\n var minDelta = Math.round(position * delta);\n var maxDelta = Math.round((1 - position) * delta);\n\n var ref$1 = this.dataRange.options;\n var baseUnit = ref$1.baseUnit;\n var min = new Date(rangeMin.getTime() + minDelta);\n var max = new Date(rangeMax.getTime() - maxDelta);\n\n if (fit) {\n var autoBaseUnitSteps = options.autoBaseUnitSteps;\n var maxDateGroups = options.maxDateGroups;\n\n var maxDiff = last(autoBaseUnitSteps[baseUnit]) * maxDateGroups * TIME_PER_UNIT[baseUnit];\n var rangeDiff = dateDiff(rangeMax, rangeMin);\n var diff = dateDiff(max, min);\n var baseUnitIndex = BASE_UNITS.indexOf(baseUnit);\n var autoBaseUnitStep, ticks;\n\n if (diff < TIME_PER_UNIT[baseUnit] && baseUnit !== MILLISECONDS) {\n baseUnit = BASE_UNITS[baseUnitIndex - 1];\n autoBaseUnitStep = last(autoBaseUnitSteps[baseUnit]);\n ticks = (rangeDiff - (maxDateGroups - 1) * autoBaseUnitStep * TIME_PER_UNIT[baseUnit]) / 2;\n min = addTicks(rangeMin, ticks);\n max = addTicks(rangeMax, -ticks);\n\n } else if (diff > maxDiff && baseUnit !== YEARS) {\n var stepIndex = 0;\n\n do {\n baseUnitIndex++;\n baseUnit = BASE_UNITS[baseUnitIndex];\n stepIndex = 0;\n ticks = 2 * TIME_PER_UNIT[baseUnit];\n do {\n autoBaseUnitStep = autoBaseUnitSteps[baseUnit][stepIndex];\n stepIndex++;\n } while (stepIndex < autoBaseUnitSteps[baseUnit].length && ticks * autoBaseUnitStep < rangeDiff);\n } while (baseUnit !== YEARS && ticks * autoBaseUnitStep < rangeDiff);\n\n ticks = (ticks * autoBaseUnitStep - rangeDiff) / 2;\n if (ticks > 0) {\n min = addTicks(rangeMin, -ticks);\n max = addTicks(rangeMax, ticks);\n min = addTicks(min, limitValue(max, totalLimits.min, totalLimits.max) - max);\n max = addTicks(max, limitValue(min, totalLimits.min, totalLimits.max) - min);\n }\n }\n }\n\n if (min && max && dateDiff(max, min) > 0) {\n return {\n min: min,\n max: max,\n baseUnit: options.userSetBaseUnit || options.baseUnit,\n baseUnitStep: options.userSetBaseUnitStep || options.baseUnitStep\n };\n }\n },\n\n zoomRange: function(scale, cursor) {\n var totalLimits = this.dataRange.total();\n var range = this.scaleRange(scale, cursor);\n\n if (range) {\n if (range.min < totalLimits.min) {\n range.min = totalLimits.min;\n }\n if (range.max > totalLimits.max) {\n range.max = totalLimits.max;\n }\n }\n\n return range;\n },\n\n range: function() {\n return this.dataRange.displayRange();\n },\n\n createLabels: function() {\n CategoryAxis.fn.createLabels.call(this);\n this.createRangeLabels();\n },\n\n clearLabels: function() {\n CategoryAxis.fn.clearLabels.call(this);\n this.rangeLabels = [];\n },\n\n arrangeLabels: function() {\n this.arrangeRangeLabels();\n CategoryAxis.fn.arrangeLabels.call(this);\n },\n\n arrangeRangeLabels: function() {\n var ref = this;\n var options = ref.options;\n var rangeLabels = ref.rangeLabels;\n if (rangeLabels.length === 0) {\n return;\n }\n\n var lineBox = this.lineBox();\n var vertical = options.vertical;\n var mirror = options.rangeLabels.mirror || options.labels.mirror;\n\n var firstLabel = rangeLabels[0];\n if (firstLabel) {\n var position = vertical ? lineBox.y1 - (firstLabel.box.height() / 2) : lineBox.x1;\n this.positionLabel(firstLabel, mirror, position);\n }\n\n var lastLabel = rangeLabels[1];\n if (lastLabel) {\n var position$1 = vertical ? lineBox.y2 - (lastLabel.box.height() / 2) : lineBox.x2;\n this.positionLabel(lastLabel, mirror, position$1);\n }\n },\n\n autoRotateLabels: function() {\n CategoryAxis.fn.autoRotateLabels.call(this);\n this.autoRotateRangeLabels();\n },\n\n hideOutOfRangeLabels: function() {\n CategoryAxis.fn.hideOutOfRangeLabels.call(this);\n this.hideOverlappingLabels();\n },\n\n hideOverlappingLabels: function() {\n var ref = this;\n var rangeLabels = ref.rangeLabels;\n var labels = ref.labels;\n if (rangeLabels.length === 0) {\n return;\n }\n\n function clip(rangeLabel, label) {\n if (!label.options.visible || label.box.overlaps(rangeLabel.box)) {\n label.options.visible = false;\n return true;\n }\n\n return false;\n }\n\n var firstRangeLabel = rangeLabels[0];\n if (firstRangeLabel && firstRangeLabel.options.visible) {\n for (var i = 0; i < labels.length; i++) {\n var overlaps = clip(firstRangeLabel, labels[i]);\n if (!overlaps) {\n break;\n }\n }\n }\n\n var lastRangeLabel = rangeLabels[1];\n if (lastRangeLabel && lastRangeLabel.options.visible) {\n for (var i$1 = labels.length - 1; i$1 > 0; --i$1) {\n var overlaps$1 = clip(lastRangeLabel, labels[i$1]);\n if (!overlaps$1) {\n break;\n }\n }\n }\n },\n\n contentBox: function() {\n var box = CategoryAxis.fn.contentBox.call(this);\n var rangeLabels = this.rangeLabels;\n\n for (var i = 0; i < rangeLabels.length; i++) {\n var label = rangeLabels[i];\n if (label.options.visible) {\n box.wrap(label.box);\n }\n }\n\n return box;\n },\n\n createAxisLabel: function(index, labelOptions, labelContext) {\n if (labelContext === void 0) { labelContext = {}; }\n\n var options = this.options;\n var dataItem = options.dataItems && !options.maxDivisions ? options.dataItems[index] : null;\n var date = this.divisionRange.dateAt(index);\n var unitFormat = labelOptions.dateFormats[this.divisionRange.options.baseUnit];\n\n labelOptions.format = labelOptions.format || unitFormat;\n labelContext.dataItem = dataItem;\n\n var text = this.axisLabelText(date, labelOptions, labelContext);\n if (text) {\n return new AxisLabel(date, text, index, dataItem, labelOptions);\n }\n },\n\n createRangeLabels: function() {\n var this$1$1 = this;\n\n var ref = this.divisionRange;\n var displayStart = ref.displayStart;\n var displayEnd = ref.displayEnd;\n var options = this.options;\n var labelOptions = $.extend({}, options.labels, options.rangeLabels, {\n align: CENTER,\n zIndex: options.zIndex\n });\n\n if (labelOptions.visible !== true) {\n return;\n }\n\n this.normalizeLabelRotation(labelOptions);\n labelOptions.alignRotation = CENTER;\n\n if (labelOptions.rotation === \"auto\") {\n labelOptions.rotation = 0;\n options.autoRotateRangeLabels = true;\n }\n\n var unitFormat = labelOptions.dateFormats[this.divisionRange.options.baseUnit];\n labelOptions.format = labelOptions.format || unitFormat;\n\n var createLabel = function (index, date, text) {\n if (text) {\n var label = new AxisLabel(date, text, index, null, labelOptions);\n this$1$1.append(label);\n this$1$1.rangeLabels.push(label);\n }\n };\n\n var startText = this.axisLabelText(displayStart, labelOptions, { index: 0, count: 2 });\n createLabel(0, displayStart, startText);\n\n var endText = this.axisLabelText(displayEnd, labelOptions, { index: 1, count: 2 });\n createLabel(1, displayEnd, endText);\n },\n\n autoRotateRangeLabels: function() {\n var this$1$1 = this;\n\n var labels = this.rangeLabels;\n if (!this.options.autoRotateRangeLabels || this.options.vertical || labels.length !== 2) {\n return;\n }\n\n var rotateLabel = function (label, tickPositions, index) {\n var width = Math.abs(tickPositions[index + 1] - tickPositions[index]) * 2;\n var angle = this$1$1.autoRotateLabelAngle(label.box, width);\n if (angle !== 0) {\n label.options.rotation = angle;\n label.reflow(new Box());\n }\n };\n\n var tickPositions = this.getMajorTickPositions();\n rotateLabel(labels[0], tickPositions, 0);\n rotateLabel(labels[1], tickPositions, tickPositions.length - 2);\n },\n\n categoryIndex: function(value) {\n return this.dataRange.valueIndex(value);\n },\n\n slot: function(from, to, limit) {\n var dateRange = this.dataRange;\n var start = from;\n var end = to;\n\n if (start instanceof Date) {\n start = dateRange.dateIndex(start);\n }\n\n if (end instanceof Date) {\n end = dateRange.dateIndex(end);\n }\n\n var slot = this.getSlot(start, end, limit);\n if (slot) {\n return slot.toRect();\n }\n },\n\n getSlot: function(a, b, limit) {\n var start = a;\n var end = b;\n\n if (typeof start === OBJECT) {\n start = this.categoryIndex(start);\n }\n\n if (typeof end === OBJECT) {\n end = this.categoryIndex(end);\n }\n\n return CategoryAxis.fn.getSlot.call(this, start, end, limit);\n },\n\n valueRange: function() {\n var options = this.options;\n var range = categoryRange(options.srcCategories);\n\n return {\n min: toDate(range.min),\n max: toDate(range.max)\n };\n },\n\n categoryAt: function(index, total) {\n return this.dataRange.dateAt(index, total);\n },\n\n categoriesCount: function() {\n return this.dataRange.valuesCount();\n },\n\n rangeIndices: function() {\n return this.dataRange.displayIndices();\n },\n\n labelsBetweenTicks: function() {\n return !this.divisionRange.options.justified;\n },\n\n prepareUserOptions: function() {\n if (this.isEmpty()) {\n return;\n }\n\n this.options.categories = this.dataRange.values();\n },\n\n getCategory: function(point) {\n var index = this.pointCategoryIndex(point);\n\n if (index === null) {\n return null;\n }\n\n return this.dataRange.dateAt(index);\n },\n\n totalIndex: function(value) {\n return this.dataRange.totalIndex(value);\n },\n\n currentRangeIndices: function() {\n var range = this.dataRange.valueRange();\n return {\n min: this.dataRange.totalIndex(range.min),\n max: this.dataRange.totalIndex(range.max)\n };\n },\n\n totalRange: function() {\n return this.dataRange.total();\n },\n\n totalCount: function() {\n return this.dataRange.totalCount();\n },\n\n isEmpty: function() {\n return !this.options.srcCategories.length;\n },\n\n roundedRange: function() {\n if (this.options.roundToBaseUnit !== false || this.isEmpty()) {\n return this.range();\n }\n\n var options = this.options;\n var datesRange = categoryRange(options.srcCategories);\n\n var dateRange = new DateRange(datesRange.min, datesRange.max, $.extend({}, options, {\n justified: false,\n roundToBaseUnit: true,\n justifyEnd: options.justified\n }));\n\n return dateRange.displayRange();\n }\n });\n\n setDefaultOptions(DateCategoryAxis, {\n type: DATE,\n labels: {\n dateFormats: DateLabelFormats\n },\n rangeLabels: {\n visible: false\n },\n autoBaseUnitSteps: {\n milliseconds: [ 1, 10, 100 ],\n seconds: [ 1, 2, 5, 15, 30 ],\n minutes: [ 1, 2, 5, 15, 30 ],\n hours: [ 1, 2, 3 ],\n days: [ 1, 2, 3 ],\n weeks: [ 1, 2 ],\n months: [ 1, 2, 3, 6 ],\n years: [ 1, 2, 3, 5, 10, 25, 50 ]\n },\n maxDateGroups: 10\n });\n\n function autoAxisMin(min, max, narrow) {\n if (!min && !max) {\n return 0;\n }\n\n var axisMin;\n\n if (min >= 0 && max >= 0) {\n var minValue = min === max ? 0 : min;\n\n var diff = (max - minValue) / max;\n if (narrow === false || (!narrow && diff > ZERO_THRESHOLD)) {\n return 0;\n }\n\n axisMin = Math.max(0, minValue - ((max - minValue) / 2));\n } else {\n axisMin = min;\n }\n\n return axisMin;\n }\n\n function autoAxisMax(min, max, narrow) {\n if (!min && !max) {\n return 1;\n }\n\n var axisMax;\n\n if (min <= 0 && max <= 0) {\n var maxValue = min === max ? 0 : max;\n\n var diff = Math.abs((maxValue - min) / maxValue);\n if (narrow === false || (!narrow && diff > ZERO_THRESHOLD)) {\n return 0;\n }\n\n axisMax = Math.min(0, maxValue - ((min - maxValue) / 2));\n } else {\n axisMax = max;\n }\n\n return axisMax;\n }\n\n function floor(value, step) {\n return round(Math.floor(value / step) * step, DEFAULT_PRECISION);\n }\n\n function ceil(value, step) {\n return round(Math.ceil(value / step) * step, DEFAULT_PRECISION);\n }\n\n function limitCoordinate(value) {\n return Math.max(Math.min(value, COORDINATE_LIMIT), -COORDINATE_LIMIT);\n }\n\n var MIN_VALUE_RANGE$1 = Math.pow(10, -DEFAULT_PRECISION + 1);\n\n var NumericAxis = Axis.extend({\n init: function(seriesMin, seriesMax, options, chartService) {\n Axis.fn.init.call(this, $.extend({}, options, {\n seriesMin: seriesMin,\n seriesMax: seriesMax\n }), chartService);\n },\n\n initUserOptions: function(options) {\n var autoOptions = autoAxisOptions(options.seriesMin, options.seriesMax, options);\n this.totalOptions = totalAxisOptions(autoOptions, options);\n\n return axisOptions(autoOptions, options);\n },\n\n initFields: function() {\n this.totalMin = this.totalOptions.min;\n this.totalMax = this.totalOptions.max;\n this.totalMajorUnit = this.totalOptions.majorUnit;\n this.seriesMin = this.options.seriesMin;\n this.seriesMax = this.options.seriesMax;\n },\n\n clone: function() {\n return new NumericAxis(\n this.seriesMin,\n this.seriesMax,\n $.extend({}, this.options),\n this.chartService\n );\n },\n\n startValue: function() {\n return 0;\n },\n\n range: function() {\n var options = this.options;\n return { min: options.min, max: options.max };\n },\n\n getDivisions: function(stepValue) {\n if (stepValue === 0) {\n return 1;\n }\n\n var options = this.options;\n var range = options.max - options.min;\n\n return Math.floor(round(range / stepValue, COORD_PRECISION)) + 1;\n },\n\n getTickPositions: function(unit, skipUnit) {\n var options = this.options;\n var ref = this.lineInfo();\n var axisDir = ref.axisDir;\n var axisOrigin = ref.axisOrigin;\n var lineBox = ref.lineBox;\n var lineSize = ref.lineSize;\n var range = options.max - options.min;\n var scale = lineSize / range;\n var step = unit * scale;\n var divisions = this.getDivisions(unit);\n var positions = [];\n var pos = lineBox[axisOrigin];\n var skipStep = 0;\n\n if (skipUnit) {\n skipStep = skipUnit / unit;\n }\n\n for (var idx = 0; idx < divisions; idx++) {\n if (idx % skipStep !== 0) {\n positions.push(round(pos, COORD_PRECISION));\n }\n\n pos = pos + step * axisDir;\n }\n\n return positions;\n },\n\n getMajorTickPositions: function() {\n return this.getTickPositions(this.options.majorUnit);\n },\n\n getMinorTickPositions: function() {\n return this.getTickPositions(this.options.minorUnit);\n },\n\n getSlot: function(a, b, limit) {\n if (limit === void 0) { limit = false; }\n\n var options = this.options;\n var ref = this.lineInfo();\n var axis = ref.axis;\n var axisDir = ref.axisDir;\n var lineBox = ref.lineBox;\n var lineSize = ref.lineSize;\n var lineStart = ref.lineStart;\n var step = axisDir * (lineSize / (options.max - options.min));\n\n var start = valueOrDefault(a, b || 0);\n var end = valueOrDefault(b, a || 0);\n\n if (limit) {\n start = limitValue(start, options.min, options.max);\n end = limitValue(end, options.min, options.max);\n }\n\n var p1 = Math.min(start, end) - options.min;\n var p2 = Math.max(start, end) - options.min;\n\n var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n slotBox[axis + 1] = limitCoordinate(lineStart + step * (axisDir > 0 ? p1 : p2));\n slotBox[axis + 2] = limitCoordinate(lineStart + step * (axisDir > 0 ? p2 : p1));\n\n return slotBox;\n },\n\n getValue: function(point) {\n var options = this.options;\n var max = Number(options.max);\n var min = Number(options.min);\n var offset = this.pointOffset(point);\n var valueOffset = offset * (max - min);\n\n if (offset < 0 || offset > 1) {\n return null;\n }\n\n var value = min + valueOffset;\n return round(value, DEFAULT_PRECISION);\n },\n\n translateRange: function(delta) {\n var options = this.options;\n var vertical = options.vertical;\n var reverse = options.reverse;\n var max = options.max;\n var min = options.min;\n var ref = this.lineInfo();\n var lineSize = ref.lineSize;\n var range = max - min;\n var scale = lineSize / range;\n var offset = round(delta / scale, DEFAULT_PRECISION);\n\n if ((vertical || reverse) && !(vertical && reverse )) {\n offset = -offset;\n }\n\n return {\n min: min + offset,\n max: max + offset,\n offset: offset\n };\n },\n\n labelsCount: function() {\n return this.getDivisions(this.options.majorUnit);\n },\n\n createAxisLabel: function(index, labelOptions, labelContext) {\n var options = this.options;\n var value = round(options.min + (index * options.majorUnit), DEFAULT_PRECISION);\n var text = this.axisLabelText(value, labelOptions, labelContext);\n\n return new AxisLabel(value, text, index, null, labelOptions);\n },\n\n shouldRenderNote: function(value) {\n var range = this.range();\n return range.min <= value && value <= range.max;\n },\n\n pan: function(delta) {\n var range = this.translateRange(delta);\n return this.limitRange(range.min, range.max, this.totalMin, this.totalMax, range.offset);\n },\n\n pointsRange: function(start, end) {\n var startValue = this.getValue(start);\n var endValue = this.getValue(end);\n var min = Math.min(startValue, endValue);\n var max = Math.max(startValue, endValue);\n\n if (this.isValidRange(min, max)) {\n return {\n min: min,\n max: max\n };\n }\n },\n\n scaleRange: function(scale, cursor) {\n var position = Math.abs(this.pointOffset(cursor));\n var range = this.options.max - this.options.min;\n var delta = this.scaleToDelta(scale, range);\n var minDelta = position * delta;\n var maxDelta = (1 - position) * delta;\n var min = round(this.options.min + minDelta, DEFAULT_PRECISION);\n var max = round(this.options.max - maxDelta, DEFAULT_PRECISION);\n\n if (max - min < MIN_VALUE_RANGE$1) {\n max = min + MIN_VALUE_RANGE$1;\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n zoomRange: function(scale, cursor) {\n var ref = this;\n var totalMin = ref.totalMin;\n var totalMax = ref.totalMax;\n var range = this.scaleRange(scale, cursor);\n\n return {\n min: limitValue(range.min, totalMin, totalMax),\n max: limitValue(range.max, totalMin, totalMax),\n narrowRange: false\n };\n },\n\n isValidRange: function(min, max) {\n return max - min > MIN_VALUE_RANGE$1;\n }\n });\n\n function autoAxisOptions(seriesMin, seriesMax, options) {\n var narrowRange = options.narrowRange;\n\n var autoMin = autoAxisMin(seriesMin, seriesMax, narrowRange);\n var autoMax = autoAxisMax(seriesMin, seriesMax, narrowRange);\n\n var majorUnit = autoMajorUnit(autoMin, autoMax);\n var autoOptions = {\n majorUnit: majorUnit\n };\n\n if (options.roundToMajorUnit !== false) {\n if (autoMin < 0 && remainderClose(autoMin, majorUnit, 1 / 3)) {\n autoMin -= majorUnit;\n }\n\n if (autoMax > 0 && remainderClose(autoMax, majorUnit, 1 / 3)) {\n autoMax += majorUnit;\n }\n }\n\n autoOptions.min = floor(autoMin, majorUnit);\n autoOptions.max = ceil(autoMax, majorUnit);\n\n return autoOptions;\n }\n\n function totalAxisOptions(autoOptions, options) {\n return {\n min: defined(options.min) ? Math.min(autoOptions.min, options.min) : autoOptions.min,\n max: defined(options.max) ? Math.max(autoOptions.max, options.max) : autoOptions.max,\n majorUnit: autoOptions.majorUnit\n };\n }\n\n function clearNullValues(options, fields) {\n for (var idx = 0; idx < fields.length; idx++) {\n var field = fields[idx];\n if (options[field] === null) {\n options[field] = undefined;\n }\n }\n }\n\n function axisOptions(autoOptions, userOptions) {\n var options = userOptions;\n var userSetMin, userSetMax;\n\n if (userOptions) {\n clearNullValues(userOptions, [ 'min', 'max' ]);\n\n userSetMin = defined(userOptions.min);\n userSetMax = defined(userOptions.max);\n\n var userSetLimits = userSetMin || userSetMax;\n\n if (userSetLimits) {\n if (userOptions.min === userOptions.max) {\n if (userOptions.min > 0) {\n userOptions.min = 0;\n } else {\n userOptions.max = 1;\n }\n }\n }\n\n if (userOptions.majorUnit) {\n autoOptions.min = floor(autoOptions.min, userOptions.majorUnit);\n autoOptions.max = ceil(autoOptions.max, userOptions.majorUnit);\n } else if (userSetLimits) {\n options = deepExtend(autoOptions, userOptions);\n\n // Determine an auto major unit after min/max have been set\n autoOptions.majorUnit = autoMajorUnit(options.min, options.max);\n }\n }\n\n autoOptions.minorUnit = (options.majorUnit || autoOptions.majorUnit) / 5;\n\n var result = deepExtend(autoOptions, options);\n if (result.min >= result.max) {\n if (userSetMin && !userSetMax) {\n result.max = result.min + result.majorUnit;\n } else if (!userSetMin && userSetMax) {\n result.min = result.max - result.majorUnit;\n }\n }\n\n return result;\n }\n\n function remainderClose(value, divisor, ratio) {\n var remainder = round(Math.abs(value % divisor), DEFAULT_PRECISION);\n var threshold = divisor * (1 - ratio);\n\n return remainder === 0 || remainder > threshold;\n }\n\n setDefaultOptions(NumericAxis, {\n type: \"numeric\",\n min: 0,\n max: 1,\n vertical: true,\n majorGridLines: {\n visible: true,\n width: 1,\n color: BLACK\n },\n labels: {\n format: \"#.####################\"\n },\n zIndex: 1\n });\n\n var MIN_VALUE_RANGE = 1000;\n\n var DateValueAxis = Axis.extend({\n init: function(seriesMin, seriesMax, axisOptions, chartService) {\n var min = toDate(seriesMin);\n var max = toDate(seriesMax);\n\n var intlService = chartService.intl;\n var options = axisOptions || {};\n options = deepExtend(options || {}, {\n min: parseDate(intlService, options.min),\n max: parseDate(intlService, options.max),\n axisCrossingValue: parseDates(intlService, options.axisCrossingValues || options.axisCrossingValue),\n weekStartDay: firstDay(options, intlService)\n });\n options = applyDefaults(min, max, options);\n\n Axis.fn.init.call(this, options, chartService);\n\n this.intlService = intlService;\n this.seriesMin = min;\n this.seriesMax = max;\n\n var weekStartDay = options.weekStartDay || 0;\n this.totalMin = toTime(floorDate(toTime(min) - 1, options.baseUnit, weekStartDay));\n this.totalMax = toTime(ceilDate(toTime(max) + 1, options.baseUnit, weekStartDay));\n },\n\n clone: function() {\n return new DateValueAxis(this.seriesMin, this.seriesMax, $.extend({}, this.options), this.chartService);\n },\n\n range: function() {\n var options = this.options;\n return { min: options.min, max: options.max };\n },\n\n getDivisions: function(stepValue) {\n var options = this.options;\n\n return Math.floor(\n duration(options.min, options.max, options.baseUnit) / stepValue + 1\n );\n },\n\n getTickPositions: function(step) {\n var options = this.options;\n var ref = this.lineInfo();\n var dir = ref.axisDir;\n var lineSize = ref.lineSize;\n var start = ref.lineStart;\n var divisions = this.getDivisions(step);\n var timeRange = dateDiff(options.max, options.min);\n var scale = lineSize / timeRange;\n var weekStartDay = options.weekStartDay || 0;\n\n var positions = [ start ];\n for (var i = 1; i < divisions; i++) {\n var date = addDuration(options.min, i * step, options.baseUnit, weekStartDay);\n var pos = start + dateDiff(date, options.min) * scale * dir;\n\n positions.push(round(pos, COORD_PRECISION));\n }\n\n return positions;\n },\n\n getMajorTickPositions: function() {\n return this.getTickPositions(this.options.majorUnit);\n },\n\n getMinorTickPositions: function() {\n return this.getTickPositions(this.options.minorUnit);\n },\n\n getSlot: function(a, b, limit) {\n return NumericAxis.prototype.getSlot.call(\n this, parseDate(this.intlService, a), parseDate(this.intlService, b), limit\n );\n },\n\n getValue: function(point) {\n var value = NumericAxis.prototype.getValue.call(this, point);\n\n return value !== null ? toDate(value) : null;\n },\n\n labelsCount: function() {\n return this.getDivisions(this.options.majorUnit);\n },\n\n createAxisLabel: function(index, labelOptions, labelContext) {\n var options = this.options;\n var offset = index * options.majorUnit;\n var weekStartDay = options.weekStartDay || 0;\n var date = options.min;\n\n if (offset > 0) {\n date = addDuration(date, offset, options.baseUnit, weekStartDay);\n }\n\n var unitFormat = labelOptions.dateFormats[options.baseUnit];\n labelOptions.format = labelOptions.format || unitFormat;\n\n var text = this.axisLabelText(date, labelOptions, labelContext);\n return new AxisLabel(date, text, index, null, labelOptions);\n },\n\n translateRange: function(delta) {\n var options = this.options;\n var lineBox = this.lineBox();\n var vertical = options.vertical;\n var reverse = options.reverse;\n var size = vertical ? lineBox.height() : lineBox.width();\n var range = this.range();\n var scale = size / dateDiff(range.max, range.min);\n\n var offset = round(delta / scale, DEFAULT_PRECISION);\n if ((vertical || reverse) && !(vertical && reverse )) {\n offset = -offset;\n }\n\n var from = addTicks(options.min, offset);\n var to = addTicks(options.max, offset);\n\n return {\n min: from,\n max: to,\n offset: offset\n };\n },\n\n shouldRenderNote: function(value) {\n var range = this.range();\n\n return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0;\n },\n\n pan: function(delta) {\n var range = this.translateRange(delta, true);\n var limittedRange = this.limitRange(toTime(range.min), toTime(range.max), this.totalMin, this.totalMax, range.offset);\n\n if (limittedRange) {\n return {\n min: toDate(limittedRange.min),\n max: toDate(limittedRange.max)\n };\n }\n },\n\n pointsRange: function(start, end) {\n var startValue = this.getValue(start);\n var endValue = this.getValue(end);\n var min = Math.min(startValue, endValue);\n var max = Math.max(startValue, endValue);\n\n return {\n min: toDate(min),\n max: toDate(max)\n };\n },\n\n scaleRange: function(scale, cursor) {\n var position = Math.abs(this.pointOffset(cursor));\n var range = this.options.max - this.options.min;\n var delta = this.scaleToDelta(scale, range);\n var minDelta = position * delta;\n var maxDelta = (1 - position) * delta;\n var min = toDate(toTime(this.options.min) + minDelta);\n var max = toDate(toTime(this.options.max) - maxDelta);\n\n if (max - min < MIN_VALUE_RANGE) {\n max = toDate(toTime(min) + MIN_VALUE_RANGE);\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n zoomRange: function(scale, cursor) {\n var range = this.scaleRange(scale, cursor);\n var min = toDate(limitValue(toTime(range.min), this.totalMin, this.totalMax));\n var max = toDate(limitValue(toTime(range.max), this.totalMin, this.totalMax));\n\n return {\n min: min,\n max: max\n };\n }\n });\n\n function timeUnits(delta) {\n var unit = HOURS;\n\n if (delta >= TIME_PER_YEAR) {\n unit = YEARS;\n } else if (delta >= TIME_PER_MONTH) {\n unit = MONTHS;\n } else if (delta >= TIME_PER_WEEK) {\n unit = WEEKS;\n } else if (delta >= TIME_PER_DAY) {\n unit = DAYS;\n }\n\n return unit;\n }\n\n function applyDefaults(seriesMin, seriesMax, options) {\n var min = options.min || seriesMin;\n var max = options.max || seriesMax;\n var baseUnit = options.baseUnit || (max && min ? timeUnits(absoluteDateDiff(max, min)) : HOURS);\n var baseUnitTime = TIME_PER_UNIT[baseUnit];\n var weekStartDay = options.weekStartDay || 0;\n var autoMin = floorDate(toTime(min) - 1, baseUnit, weekStartDay) || toDate(max);\n var autoMax = ceilDate(toTime(max) + 1, baseUnit, weekStartDay);\n var userMajorUnit = options.majorUnit ? options.majorUnit : undefined;\n var majorUnit = userMajorUnit || ceil(\n autoMajorUnit(autoMin.getTime(), autoMax.getTime()),\n baseUnitTime\n ) / baseUnitTime;\n var actualUnits = duration(autoMin, autoMax, baseUnit);\n var totalUnits = ceil(actualUnits, majorUnit);\n var unitsToAdd = totalUnits - actualUnits;\n var head = Math.floor(unitsToAdd / 2);\n var tail = unitsToAdd - head;\n\n if (!options.baseUnit) {\n delete options.baseUnit;\n }\n\n options.baseUnit = options.baseUnit || baseUnit;\n options.min = options.min || addDuration(autoMin, -head, baseUnit, weekStartDay);\n options.max = options.max || addDuration(autoMax, tail, baseUnit, weekStartDay);\n options.minorUnit = options.minorUnit || majorUnit / 5;\n options.majorUnit = majorUnit;\n\n return options;\n }\n\n setDefaultOptions(DateValueAxis, {\n type: DATE,\n majorGridLines: {\n visible: true,\n width: 1,\n color: BLACK\n },\n labels: {\n dateFormats: DateLabelFormats\n }\n });\n\n var DEFAULT_MAJOR_UNIT = 10;\n var MIN_VALUE_RANGE$2 = 1e-6;\n\n var LogarithmicAxis = Axis.extend({\n init: function(seriesMin, seriesMax, options, chartService) {\n\n var axisOptions = deepExtend({ majorUnit: DEFAULT_MAJOR_UNIT, min: seriesMin, max: seriesMax }, options);\n var base = axisOptions.majorUnit;\n var autoMax = autoAxisMax$1(seriesMax, base);\n var autoMin = autoAxisMin$1(seriesMin, seriesMax, axisOptions);\n var range = initRange(autoMin, autoMax, axisOptions, options);\n\n axisOptions.max = range.max;\n axisOptions.min = range.min;\n axisOptions.minorUnit = options.minorUnit || round(base - 1, DEFAULT_PRECISION);\n\n Axis.fn.init.call(this, axisOptions, chartService);\n\n this.totalMin = defined(options.min) ? Math.min(autoMin, options.min) : autoMin;\n this.totalMax = defined(options.max) ? Math.max(autoMax, options.max) : autoMax;\n this.logMin = round(log(range.min, base), DEFAULT_PRECISION);\n this.logMax = round(log(range.max, base), DEFAULT_PRECISION);\n this.seriesMin = seriesMin;\n this.seriesMax = seriesMax;\n\n this.createLabels();\n },\n\n clone: function() {\n return new LogarithmicAxis(\n this.seriesMin,\n this.seriesMax,\n $.extend({}, this.options),\n this.chartService\n );\n },\n\n startValue: function() {\n return this.options.min;\n },\n\n getSlot: function(a, b, limit) {\n var ref = this;\n var options = ref.options;\n var logMin = ref.logMin;\n var logMax = ref.logMax;\n var base = options.majorUnit;\n var min = options.min;\n var max = options.max;\n var ref$1 = this.lineInfo();\n var axis = ref$1.axis;\n var axisDir = ref$1.axisDir;\n var lineBox = ref$1.lineBox;\n var lineSize = ref$1.lineSize;\n var lineStart = ref$1.lineStart;\n var step = axisDir * (lineSize / (logMax - logMin));\n var start = valueOrDefault(a, b || 1);\n var end = valueOrDefault(b, a || 1);\n\n if (start <= 0 || end <= 0) {\n return null;\n }\n\n if (limit) {\n start = limitValue(start, min, max);\n end = limitValue(end, min, max);\n }\n\n start = log(start, base);\n end = log(end, base);\n\n var p1 = Math.min(start, end) - logMin;\n var p2 = Math.max(start, end) - logMin;\n\n var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n slotBox[axis + 1] = limitCoordinate(lineStart + step * (axisDir > 0 ? p1 : p2));\n slotBox[axis + 2] = limitCoordinate(lineStart + step * (axisDir > 0 ? p2 : p1));\n\n return slotBox;\n },\n\n getValue: function(point) {\n var ref = this;\n var options = ref.options;\n var logMin = ref.logMin;\n var logMax = ref.logMax;\n var base = options.majorUnit;\n var ref$1 = this.lineInfo();\n var axis = ref$1.axis;\n var axisDir = ref$1.axisDir;\n var lineStart = ref$1.lineStart;\n var lineSize = ref$1.lineSize;\n var step = ((logMax - logMin) / lineSize);\n var offset = axisDir * (point[axis] - lineStart);\n var valueOffset = offset * step;\n\n if (offset < 0 || offset > lineSize) {\n return null;\n }\n\n var value = logMin + valueOffset;\n\n return round(Math.pow(base, value), DEFAULT_PRECISION);\n },\n\n range: function() {\n var options = this.options;\n return { min: options.min, max: options.max };\n },\n\n translateRange: function(delta) {\n var ref = this;\n var options = ref.options;\n var logMin = ref.logMin;\n var logMax = ref.logMax;\n var reverse = options.reverse;\n var vertical = options.vertical;\n var base = options.majorUnit;\n var lineBox = this.lineBox();\n var size = vertical ? lineBox.height() : lineBox.width();\n var scale = size / (logMax - logMin);\n var offset = round(delta / scale, DEFAULT_PRECISION);\n\n if ((vertical || reverse) && !(vertical && reverse )) {\n offset = -offset;\n }\n\n return {\n min: Math.pow(base, logMin + offset),\n max: Math.pow(base, logMax + offset),\n offset: offset\n };\n },\n\n labelsCount: function() {\n var floorMax = Math.floor(this.logMax);\n var count = Math.floor(floorMax - this.logMin) + 1;\n\n return count;\n },\n\n getMajorTickPositions: function() {\n var ticks = [];\n\n this.traverseMajorTicksPositions(function (position) {\n ticks.push(position);\n }, { step: 1, skip: 0 });\n\n return ticks;\n },\n\n createTicks: function(lineGroup) {\n var options = this.options;\n var majorTicks = options.majorTicks;\n var minorTicks = options.minorTicks;\n var vertical = options.vertical;\n var mirror = options.labels.mirror;\n var lineBox = this.lineBox();\n var ticks = [];\n var tickLineOptions = {\n // TODO\n // _alignLines: options._alignLines,\n vertical: vertical\n };\n\n function render(tickPosition, tickOptions) {\n tickLineOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;\n tickLineOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;\n tickLineOptions.position = tickPosition;\n\n lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n }\n\n if (majorTicks.visible) {\n this.traverseMajorTicksPositions(render, majorTicks);\n }\n\n if (minorTicks.visible) {\n this.traverseMinorTicksPositions(render, minorTicks);\n }\n\n return ticks;\n },\n\n createGridLines: function(altAxis) {\n var options = this.options;\n var minorGridLines = options.minorGridLines;\n var majorGridLines = options.majorGridLines;\n var vertical = options.vertical;\n var lineBox = altAxis.lineBox();\n var lineOptions = {\n lineStart: lineBox[vertical ? \"x1\" : \"y1\"],\n lineEnd: lineBox[vertical ? \"x2\" : \"y2\"],\n vertical: vertical\n };\n var majorTicks = [];\n\n var container = this.gridLinesVisual();\n function render(tickPosition, gridLine) {\n if (!inArray(tickPosition, majorTicks)) {\n lineOptions.position = tickPosition;\n container.append(createAxisGridLine(lineOptions, gridLine));\n\n majorTicks.push(tickPosition);\n }\n }\n\n if (majorGridLines.visible) {\n this.traverseMajorTicksPositions(render, majorGridLines);\n }\n\n if (minorGridLines.visible) {\n this.traverseMinorTicksPositions(render, minorGridLines);\n }\n\n return container.children;\n },\n\n traverseMajorTicksPositions: function(callback, tickOptions) {\n var ref = this.lineInfo();\n var lineStart = ref.lineStart;\n var step = ref.step;\n var ref$1 = this;\n var logMin = ref$1.logMin;\n var logMax = ref$1.logMax;\n\n for (var power = Math.ceil(logMin) + tickOptions.skip; power <= logMax; power += tickOptions.step) {\n var position = round(lineStart + step * (power - logMin), DEFAULT_PRECISION);\n callback(position, tickOptions);\n }\n },\n\n traverseMinorTicksPositions: function(callback, tickOptions) {\n var this$1$1 = this;\n\n var ref = this.options;\n var min = ref.min;\n var max = ref.max;\n var minorUnit = ref.minorUnit;\n var base = ref.majorUnit;\n var ref$1 = this.lineInfo();\n var lineStart = ref$1.lineStart;\n var step = ref$1.step;\n var ref$2 = this;\n var logMin = ref$2.logMin;\n var logMax = ref$2.logMax;\n var start = Math.floor(logMin);\n\n for (var power = start; power < logMax; power++) {\n var minorOptions = this$1$1._minorIntervalOptions(power);\n for (var idx = tickOptions.skip; idx < minorUnit; idx += tickOptions.step) {\n var value = minorOptions.value + idx * minorOptions.minorStep;\n if (value > max) {\n break;\n }\n if (value >= min) {\n var position = round(lineStart + step * (log(value, base) - logMin), DEFAULT_PRECISION);\n callback(position, tickOptions);\n }\n }\n }\n },\n\n createAxisLabel: function(index, labelOptions, labelContext) {\n var power = Math.ceil(this.logMin + index);\n var value = Math.pow(this.options.majorUnit, power);\n var text = this.axisLabelText(value, labelOptions, labelContext);\n\n return new AxisLabel(value, text, index, null, labelOptions);\n },\n\n shouldRenderNote: function(value) {\n var range = this.range();\n return range.min <= value && value <= range.max;\n },\n\n pan: function(delta) {\n var range = this.translateRange(delta);\n return this.limitRange(range.min, range.max, this.totalMin, this.totalMax, range.offset);\n },\n\n pointsRange: function(start, end) {\n var startValue = this.getValue(start);\n var endValue = this.getValue(end);\n var min = Math.min(startValue, endValue);\n var max = Math.max(startValue, endValue);\n\n return {\n min: min,\n max: max\n };\n },\n\n scaleRange: function(scale, cursor) {\n var ref = this.options;\n var base = ref.majorUnit;\n var logMin = log(this.options.min, base);\n var logMax = log(this.options.max, base);\n var position = Math.abs(this.pointOffset(cursor));\n var range = logMax - logMin;\n var delta = this.scaleToDelta(scale, range);\n var min = Math.pow(base, logMin + position * delta);\n var max = Math.pow(base, logMax - (1 - position) * delta);\n\n if (max - min < MIN_VALUE_RANGE$2) {\n max = min + MIN_VALUE_RANGE$2;\n }\n\n return {\n min: min,\n max: max\n };\n },\n\n zoomRange: function(scale, cursor) {\n var range = this.scaleRange(scale, cursor);\n var ref = this;\n var totalMin = ref.totalMin;\n var totalMax = ref.totalMax;\n\n return {\n min: limitValue(range.min, totalMin, totalMax),\n max: limitValue(range.max, totalMin, totalMax)\n };\n },\n\n _minorIntervalOptions: function(power) {\n var ref = this.options;\n var minorUnit = ref.minorUnit;\n var base = ref.majorUnit;\n var value = Math.pow(base, power);\n var nextValue = Math.pow(base, power + 1);\n var difference = nextValue - value;\n var minorStep = difference / minorUnit;\n\n return {\n value: value,\n minorStep: minorStep\n };\n },\n\n lineInfo: function() {\n var info = Axis.fn.lineInfo.call(this);\n info.step = info.axisDir * (info.lineSize / (this.logMax - this.logMin));\n\n return info;\n }\n });\n\n function initRange(autoMin, autoMax, axisOptions, options) {\n var min = axisOptions.min;\n var max = axisOptions.max;\n\n if (defined(axisOptions.axisCrossingValue) && axisOptions.axisCrossingValue <= 0) {\n throwNegativeValuesError();\n }\n\n if (!defined(options.max)) {\n max = autoMax;\n } else if (options.max <= 0) {\n throwNegativeValuesError();\n }\n\n if (!defined(options.min)) {\n min = autoMin;\n } else if (options.min <= 0) {\n throwNegativeValuesError();\n }\n\n return {\n min: min,\n max: max\n };\n }\n\n function autoAxisMin$1(min, max, options) {\n var base = options.majorUnit;\n var autoMin = min;\n if (min <= 0) {\n autoMin = max <= 1 ? Math.pow(base, -2) : 1;\n } else if (!options.narrowRange) {\n autoMin = Math.pow(base, Math.floor(log(min, base)));\n }\n return autoMin;\n }\n\n function autoAxisMax$1(max, base) {\n var logMaxRemainder = round(log(max, base), DEFAULT_PRECISION) % 1;\n var autoMax;\n if (max <= 0) {\n autoMax = base;\n } else if (logMaxRemainder !== 0 && (logMaxRemainder < 0.3 || logMaxRemainder > 0.9)) {\n autoMax = Math.pow(base, log(max, base) + 0.2);\n } else {\n autoMax = Math.pow(base, Math.ceil(log(max, base)));\n }\n\n return autoMax;\n }\n\n function throwNegativeValuesError() {\n throw new Error(\"Non positive values cannot be used for a logarithmic axis\");\n }\n\n function log(x, base) {\n return Math.log(x) / Math.log(base);\n }\n\n setDefaultOptions(LogarithmicAxis, {\n type: \"log\",\n majorUnit: DEFAULT_MAJOR_UNIT,\n minorUnit: 1,\n axisCrossingValue: 1,\n vertical: true,\n majorGridLines: {\n visible: true,\n width: 1,\n color: BLACK\n },\n zIndex: 1,\n _deferLabels: true\n });\n\n var GridLinesMixin = {\n createGridLines: function(altAxis) {\n var options = this.options;\n var radius = Math.abs(this.box.center().y - altAxis.lineBox().y1);\n var gridLines = [];\n var skipMajor = false;\n var majorAngles, minorAngles;\n\n if (options.majorGridLines.visible) {\n majorAngles = this.majorGridLineAngles(altAxis);\n skipMajor = true;\n\n gridLines = this.renderMajorGridLines(\n majorAngles, radius, options.majorGridLines\n );\n }\n\n if (options.minorGridLines.visible) {\n minorAngles = this.minorGridLineAngles(altAxis, skipMajor);\n\n append(gridLines, this.renderMinorGridLines(\n minorAngles, radius, options.minorGridLines, altAxis, skipMajor\n ));\n }\n\n return gridLines;\n },\n\n renderMajorGridLines: function(angles, radius, options) {\n return this.renderGridLines(angles, radius, options);\n },\n\n renderMinorGridLines: function(angles, radius, options, altAxis, skipMajor) {\n var radiusCallback = this.radiusCallback && this.radiusCallback(radius, altAxis, skipMajor);\n return this.renderGridLines(angles, radius, options, radiusCallback);\n },\n\n renderGridLines: function(angles, radius, options, radiusCallback) {\n var style = {\n stroke: {\n width: options.width,\n color: options.color,\n dashType: options.dashType\n }\n };\n\n var center = this.box.center();\n var circle = new Circle([ center.x, center.y ], radius);\n var container = this.gridLinesVisual();\n\n for (var i = 0; i < angles.length; i++) {\n var line = new Path(style);\n if (radiusCallback) {\n circle.radius = radiusCallback(angles[i]);\n }\n\n line.moveTo(circle.center)\n .lineTo(circle.pointAt(angles[i] + 180));\n\n container.append(line);\n }\n\n return container.children;\n },\n\n gridLineAngles: function(altAxis, size, skip, step, skipAngles) {\n var this$1$1 = this;\n\n var divs = this.intervals(size, skip, step, skipAngles);\n var options = altAxis.options;\n var altAxisVisible = options.visible && (options.line || {}).visible !== false;\n\n return map(divs, function (d) {\n var alpha = this$1$1.intervalAngle(d);\n\n if (!altAxisVisible || alpha !== 90) {\n return alpha;\n }\n });\n }\n };\n\n var RadarCategoryAxis = CategoryAxis.extend({\n range: function() {\n return { min: 0, max: this.options.categories.length };\n },\n\n reflow: function(box) {\n this.box = box;\n this.reflowLabels();\n },\n\n lineBox: function() {\n return this.box;\n },\n\n reflowLabels: function() {\n var this$1$1 = this;\n\n var ref = this;\n var labels = ref.labels;\n var labelOptions = ref.options.labels;\n var skip = labelOptions.skip || 0;\n var step = labelOptions.step || 1;\n var measureBox = new Box();\n\n for (var i = 0; i < labels.length; i++) {\n labels[i].reflow(measureBox);\n var labelBox = labels[i].box;\n\n labels[i].reflow(this$1$1.getSlot(skip + i * step).adjacentBox(\n 0, labelBox.width(), labelBox.height()\n ));\n }\n },\n\n intervals: function(size, skipOption, stepOption, skipAngles) {\n if (skipAngles === void 0) { skipAngles = false; }\n\n var options = this.options;\n var categories = options.categories.length;\n var divCount = categories / size || 1;\n var divAngle = 360 / divCount;\n var skip = skipOption || 0;\n var step = stepOption || 1;\n var divs = [];\n var angle = 0;\n\n for (var i = skip; i < divCount; i += step) {\n if (options.reverse) {\n angle = 360 - i * divAngle;\n } else {\n angle = i * divAngle;\n }\n\n angle = round(angle, COORD_PRECISION) % 360;\n\n if (!(skipAngles && inArray(angle, skipAngles))) {\n divs.push(angle);\n }\n }\n\n return divs;\n },\n\n majorIntervals: function() {\n return this.intervals(1);\n },\n\n minorIntervals: function() {\n return this.intervals(0.5);\n },\n\n intervalAngle: function(interval) {\n return (360 + interval + this.options.startAngle) % 360;\n },\n\n majorAngles: function() {\n var this$1$1 = this;\n\n return map(this.majorIntervals(), function (interval) { return this$1$1.intervalAngle(interval); });\n },\n\n createLine: function() {\n return [];\n },\n\n majorGridLineAngles: function(altAxis) {\n var majorGridLines = this.options.majorGridLines;\n return this.gridLineAngles(altAxis, 1, majorGridLines.skip, majorGridLines.step);\n },\n\n minorGridLineAngles: function(altAxis, skipMajor) {\n var ref = this.options;\n var minorGridLines = ref.minorGridLines;\n var majorGridLines = ref.majorGridLines;\n var majorGridLineAngles = skipMajor ? this.intervals(1, majorGridLines.skip, majorGridLines.step) : null;\n\n return this.gridLineAngles(altAxis, 0.5, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\n },\n\n radiusCallback: function(radius, altAxis, skipMajor) {\n if (altAxis.options.type !== ARC) {\n var minorAngle = rad(360 / (this.options.categories.length * 2));\n var minorRadius = Math.cos(minorAngle) * radius;\n var majorAngles = this.majorAngles();\n\n var radiusCallback = function(angle) {\n if (!skipMajor && inArray(angle, majorAngles)) {\n return radius;\n }\n\n return minorRadius;\n };\n return radiusCallback;\n }\n },\n\n createPlotBands: function() {\n var this$1$1 = this;\n\n var plotBands = this.options.plotBands || [];\n\n var group = this._plotbandGroup = new Group({\n zIndex: -1\n });\n\n for (var i = 0; i < plotBands.length; i++) {\n var band = plotBands[i];\n var slot = this$1$1.plotBandSlot(band);\n var singleSlot = this$1$1.getSlot(band.from);\n\n var head = band.from - Math.floor(band.from);\n slot.startAngle += head * singleSlot.angle;\n\n var tail = Math.ceil(band.to) - band.to;\n slot.angle -= (tail + head) * singleSlot.angle;\n\n var ring = ShapeBuilder.current.createRing(slot, {\n fill: {\n color: band.color,\n opacity: band.opacity\n },\n stroke: {\n opacity: band.opacity\n }\n });\n group.append(ring);\n }\n\n this.appendVisual(group);\n },\n\n plotBandSlot: function(band) {\n return this.getSlot(band.from, band.to - 1);\n },\n\n getSlot: function(from, to) {\n var options = this.options;\n var justified = options.justified;\n var box = this.box;\n var divs = this.majorAngles();\n var totalDivs = divs.length;\n var slotAngle = 360 / totalDivs;\n var fromValue = from;\n\n if (options.reverse && !justified) {\n fromValue = (fromValue + 1) % totalDivs;\n }\n\n fromValue = limitValue(Math.floor(fromValue), 0, totalDivs - 1);\n var slotStart = divs[fromValue];\n\n if (justified) {\n slotStart = slotStart - slotAngle / 2;\n\n if (slotStart < 0) {\n slotStart += 360;\n }\n }\n\n var toValue = limitValue(Math.ceil(to || fromValue), fromValue, totalDivs - 1);\n var slots = toValue - fromValue + 1;\n var angle = slotAngle * slots;\n\n return new Ring(box.center(), 0, box.height() / 2, slotStart, angle);\n },\n\n slot: function(from, to) {\n var slot = this.getSlot(from, to);\n var startAngle = slot.startAngle + 180;\n var endAngle = startAngle + slot.angle;\n\n return new geometry.Arc([ slot.center.x, slot.center.y ], {\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: slot.radius,\n radiusY: slot.radius\n });\n },\n\n pointCategoryIndex: function(point) {\n var this$1$1 = this;\n\n var length = this.options.categories.length;\n var index = null;\n\n for (var i = 0; i < length; i++) {\n var slot = this$1$1.getSlot(i);\n if (slot.containsPoint(point)) {\n index = i;\n break;\n }\n }\n\n return index;\n }\n });\n\n setDefaultOptions(RadarCategoryAxis, {\n startAngle: 90,\n labels: {\n margin: getSpacing(10)\n },\n majorGridLines: {\n visible: true\n },\n justified: true\n });\n deepExtend(RadarCategoryAxis.prototype, GridLinesMixin);\n\n var PolarAxis = Axis.extend({\n init: function(options, chartService) {\n Axis.fn.init.call(this, options, chartService);\n\n var instanceOptions = this.options;\n\n instanceOptions.minorUnit = instanceOptions.minorUnit || instanceOptions.majorUnit / 2;\n },\n\n getDivisions: function(stepValue) {\n return NumericAxis.prototype.getDivisions.call(this, stepValue) - 1;\n },\n\n reflow: function(box) {\n this.box = box;\n this.reflowLabels();\n },\n\n reflowLabels: function() {\n var this$1$1 = this;\n\n var ref = this;\n var options = ref.options;\n var labels = ref.labels;\n var labelOptions = ref.options.labels;\n var skip = labelOptions.skip || 0;\n var step = labelOptions.step || 1;\n\n var measureBox = new Box();\n var divs = this.intervals(options.majorUnit, skip, step);\n\n for (var i = 0; i < labels.length; i++) {\n labels[i].reflow(measureBox);\n var labelBox = labels[i].box;\n\n labels[i].reflow(this$1$1.getSlot(divs[i]).adjacentBox(0, labelBox.width(), labelBox.height()));\n }\n },\n\n lineBox: function() {\n return this.box;\n },\n\n intervals: function(size, skipOption, stepOption, skipAngles) {\n if (skipAngles === void 0) { skipAngles = false; }\n\n var min = this.options.min;\n var divisions = this.getDivisions(size);\n var divs = [];\n var skip = skipOption || 0;\n var step = stepOption || 1;\n\n for (var i = skip; i < divisions; i += step) {\n var current = (360 + min + i * size) % 360;\n if (!(skipAngles && inArray(current, skipAngles))) {\n divs.push(current);\n }\n }\n\n return divs;\n },\n\n majorIntervals: function() {\n return this.intervals(this.options.majorUnit);\n },\n\n minorIntervals: function() {\n return this.intervals(this.options.minorUnit);\n },\n\n intervalAngle: function(i) {\n return (540 - i - this.options.startAngle) % 360;\n },\n\n createLine: function() {\n return [];\n },\n\n majorGridLineAngles: function(altAxis) {\n var majorGridLines = this.options.majorGridLines;\n return this.gridLineAngles(altAxis, this.options.majorUnit, majorGridLines.skip, majorGridLines.step);\n },\n\n minorGridLineAngles: function(altAxis, skipMajor) {\n var options = this.options;\n var minorGridLines = options.minorGridLines;\n var majorGridLines = options.majorGridLines;\n var majorGridLineAngles = skipMajor ? this.intervals(options.majorUnit, majorGridLines.skip, majorGridLines.step) : null;\n\n return this.gridLineAngles(altAxis, options.minorUnit, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\n },\n\n plotBandSlot: function(band) {\n return this.getSlot(band.from, band.to);\n },\n\n getSlot: function(a, b) {\n var ref = this;\n var options = ref.options;\n var box = ref.box;\n var startAngle = options.startAngle;\n var start = limitValue(a, options.min, options.max);\n var end = limitValue(b || start, start, options.max);\n\n if (options.reverse) {\n start *= -1;\n end *= -1;\n }\n\n start = (540 - start - startAngle) % 360;\n end = (540 - end - startAngle) % 360;\n\n if (end < start) {\n var tmp = start;\n start = end;\n end = tmp;\n }\n\n return new Ring(box.center(), 0, box.height() / 2, start, end - start);\n },\n\n slot: function(from, to) {\n if (to === void 0) { to = from; }\n\n var options = this.options;\n var start = 360 - options.startAngle;\n var slot = this.getSlot(from, to);\n var min = Math.min(from, to);\n var max = Math.max(from, to);\n var startAngle, endAngle;\n\n if (options.reverse) {\n startAngle = min;\n endAngle = max;\n } else {\n startAngle = 360 - max;\n endAngle = 360 - min;\n }\n\n startAngle = (startAngle + start) % 360;\n endAngle = (endAngle + start) % 360;\n\n return new geometry.Arc([ slot.center.x, slot.center.y ], {\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: slot.radius,\n radiusY: slot.radius\n });\n },\n\n getValue: function(point) {\n var options = this.options;\n var center = this.box.center();\n var dx = point.x - center.x;\n var dy = point.y - center.y;\n var theta = Math.round(deg(Math.atan2(dy, dx)));\n var start = options.startAngle;\n\n if (!options.reverse) {\n theta *= -1;\n start *= -1;\n }\n\n return (theta + start + 360) % 360;\n },\n\n valueRange: function() {\n return {\n min: 0,\n max: Math.PI * 2\n };\n }\n });\n\n setDefaultOptions(PolarAxis, {\n type: \"polar\",\n startAngle: 0,\n reverse: false,\n majorUnit: 60,\n min: 0,\n max: 360,\n labels: {\n margin: getSpacing(10)\n },\n majorGridLines: {\n color: BLACK,\n visible: true,\n width: 1\n },\n minorGridLines: {\n color: \"#aaa\"\n }\n });\n\n deepExtend(PolarAxis.prototype, GridLinesMixin, {\n createPlotBands: RadarCategoryAxis.prototype.createPlotBands,\n majorAngles: RadarCategoryAxis.prototype.majorAngles,\n range: NumericAxis.prototype.range,\n labelsCount: NumericAxis.prototype.labelsCount,\n createAxisLabel: NumericAxis.prototype.createAxisLabel\n });\n\n var RadarNumericAxisMixin = {\n options: {\n majorGridLines: {\n visible: true\n }\n },\n\n createPlotBands: function() {\n var this$1$1 = this;\n\n var ref = this.options;\n var type = ref.majorGridLines.type;\n var plotBands = ref.plotBands; if (plotBands === void 0) { plotBands = []; }\n var altAxis = this.plotArea.polarAxis;\n var majorAngles = altAxis.majorAngles();\n var center = altAxis.box.center();\n var group = this._plotbandGroup = new Group({\n zIndex: -1\n });\n\n for (var i = 0; i < plotBands.length; i++) {\n var band = plotBands[i];\n var bandStyle = {\n fill: {\n color: band.color,\n opacity: band.opacity\n },\n stroke: {\n opacity: band.opacity\n }\n };\n\n var slot = this$1$1.getSlot(band.from, band.to, true);\n var ring = new Ring(center, center.y - slot.y2, center.y - slot.y1, 0, 360);\n\n var shape = (void 0);\n if (type === ARC) {\n shape = ShapeBuilder.current.createRing(ring, bandStyle);\n } else {\n shape = Path.fromPoints(this$1$1.plotBandPoints(ring, majorAngles), bandStyle).close();\n }\n\n group.append(shape);\n }\n\n this.appendVisual(group);\n },\n\n plotBandPoints: function(ring, angles) {\n var innerPoints = [];\n var outerPoints = [];\n var center = [ ring.center.x, ring.center.y ];\n var innerCircle = new Circle(center, ring.innerRadius);\n var outerCircle = new Circle(center, ring.radius);\n\n for (var i = 0; i < angles.length; i++) {\n innerPoints.push(innerCircle.pointAt(angles[i] + 180));\n outerPoints.push(outerCircle.pointAt(angles[i] + 180));\n }\n\n innerPoints.reverse();\n innerPoints.push(innerPoints[0]);\n outerPoints.push(outerPoints[0]);\n\n return outerPoints.concat(innerPoints);\n },\n\n createGridLines: function(altAxis) {\n var options = this.options;\n var majorTicks = this.radarMajorGridLinePositions();\n var majorAngles = altAxis.majorAngles();\n var center = altAxis.box.center();\n var gridLines = [];\n\n if (options.majorGridLines.visible) {\n gridLines = this.renderGridLines(\n center, majorTicks, majorAngles, options.majorGridLines\n );\n }\n\n if (options.minorGridLines.visible) {\n var minorTicks = this.radarMinorGridLinePositions();\n append(gridLines, this.renderGridLines(\n center, minorTicks, majorAngles, options.minorGridLines\n ));\n }\n\n return gridLines;\n },\n\n renderGridLines: function(center, ticks, angles, options) {\n var style = {\n stroke: {\n width: options.width,\n color: options.color,\n dashType: options.dashType\n }\n };\n var skip = options.skip; if (skip === void 0) { skip = 0; }\n var step = options.step; if (step === void 0) { step = 0; }\n var container = this.gridLinesVisual();\n\n for (var tickIx = skip; tickIx < ticks.length; tickIx += step) {\n var tickRadius = center.y - ticks[tickIx];\n if (tickRadius > 0) {\n var circle = new Circle([ center.x, center.y ], tickRadius);\n if (options.type === ARC) {\n container.append(new drawing.Circle(circle, style));\n } else {\n var line = new Path(style);\n for (var angleIx = 0; angleIx < angles.length; angleIx++) {\n line.lineTo(circle.pointAt(angles[angleIx] + 180));\n }\n\n line.close();\n container.append(line);\n }\n }\n }\n\n return container.children;\n },\n\n getValue: function(point) {\n var lineBox = this.lineBox();\n var altAxis = this.plotArea.polarAxis;\n var majorAngles = altAxis.majorAngles();\n var center = altAxis.box.center();\n var radius = point.distanceTo(center);\n var distance = radius;\n\n if (this.options.majorGridLines.type !== ARC && majorAngles.length > 1) {\n var dx = point.x - center.x;\n var dy = point.y - center.y;\n var theta = (deg(Math.atan2(dy, dx)) + 540) % 360;\n\n majorAngles.sort(function(a, b) {\n return angularDistance(a, theta) - angularDistance(b, theta);\n });\n\n // Solve triangle (center, point, axis X) using one side (radius) and two angles.\n // Angles are derived from triangle (center, point, gridline X)\n var midAngle = angularDistance(majorAngles[0], majorAngles[1]) / 2;\n var alpha = angularDistance(theta, majorAngles[0]);\n var gamma = 90 - midAngle;\n var beta = 180 - alpha - gamma;\n\n distance = radius * (Math.sin(rad(beta)) / Math.sin(rad(gamma)));\n }\n\n return this.axisType().prototype.getValue.call(\n this, new Point(lineBox.x1, lineBox.y2 - distance)\n );\n }\n };\n\n function angularDistance(a, b) {\n return 180 - Math.abs(Math.abs(a - b) - 180);\n }\n\n var RadarNumericAxis = NumericAxis.extend({\n radarMajorGridLinePositions: function() {\n return this.getTickPositions(this.options.majorUnit);\n },\n\n radarMinorGridLinePositions: function() {\n var options = this.options;\n var minorSkipStep = 0;\n\n if (options.majorGridLines.visible) {\n minorSkipStep = options.majorUnit;\n }\n return this.getTickPositions(options.minorUnit, minorSkipStep);\n },\n\n axisType: function() {\n return NumericAxis;\n }\n });\n\n deepExtend(RadarNumericAxis.prototype, RadarNumericAxisMixin);\n\n var RadarLogarithmicAxis = LogarithmicAxis.extend({\n radarMajorGridLinePositions: function() {\n var positions = [];\n\n this.traverseMajorTicksPositions(function(position) {\n positions.push(position);\n }, this.options.majorGridLines);\n\n return positions;\n },\n\n radarMinorGridLinePositions: function() {\n var positions = [];\n\n this.traverseMinorTicksPositions(function(position) {\n positions.push(position);\n }, this.options.minorGridLines);\n\n return positions;\n },\n\n axisType: function() {\n return LogarithmicAxis;\n }\n });\n\n deepExtend(RadarLogarithmicAxis.prototype, RadarNumericAxisMixin);\n\n var WEIGHT = 0.333;\n var EXTREMUM_ALLOWED_DEVIATION = 0.01;\n\n var CurveProcessor = Class.extend({\n init: function(closed) {\n\n this.closed = closed;\n },\n\n process: function(dataPoints) {\n var this$1$1 = this;\n\n var points = dataPoints.slice(0);\n var segments = [];\n var closed = this.closed;\n var length = points.length;\n\n if (length > 2) {\n this.removeDuplicates(0, points);\n length = points.length;\n }\n\n if (length < 2 || (length === 2 && points[0].equals(points[1]))) {\n return segments;\n }\n\n var p0 = points[0];\n var p1 = points[1];\n var p2 = points[2];\n\n segments.push(new Segment(p0));\n\n while (p0.equals(points[length - 1])) {\n closed = true;\n points.pop();\n length--;\n }\n\n if (length === 2) {\n var tangent = this.tangent(p0,p1, X, Y);\n\n last(segments).controlOut(\n this.firstControlPoint(tangent, p0, p1, X, Y)\n );\n\n segments.push(new Segment(\n p1,\n this.secondControlPoint(tangent, p0, p1, X, Y)\n ));\n\n return segments;\n }\n\n var initialControlPoint, lastControlPoint;\n\n if (closed) {\n p0 = points[length - 1]; p1 = points[0]; p2 = points[1];\n var controlPoints = this.controlPoints(p0, p1, p2);\n initialControlPoint = controlPoints[1];\n lastControlPoint = controlPoints[0];\n } else {\n var tangent$1 = this.tangent(p0, p1, X,Y);\n initialControlPoint = this.firstControlPoint(tangent$1, p0, p1, X, Y);\n }\n\n var cp0 = initialControlPoint;\n for (var idx = 0; idx <= length - 3; idx++) {\n this$1$1.removeDuplicates(idx, points);\n length = points.length;\n if (idx + 3 <= length) {\n p0 = points[idx]; p1 = points[idx + 1]; p2 = points[idx + 2];\n var controlPoints$1 = this$1$1.controlPoints(p0,p1,p2);\n\n last(segments).controlOut(cp0);\n cp0 = controlPoints$1[1];\n\n var cp1 = controlPoints$1[0];\n segments.push(new Segment(p1, cp1));\n }\n }\n\n if (closed) {\n p0 = points[length - 2]; p1 = points[length - 1]; p2 = points[0];\n var controlPoints$2 = this.controlPoints(p0, p1, p2);\n\n last(segments).controlOut(cp0);\n segments.push(new Segment(\n p1,\n controlPoints$2[0]\n ));\n\n last(segments).controlOut(controlPoints$2[1]);\n segments.push(new Segment(\n p2,\n lastControlPoint\n ));\n } else {\n var tangent$2 = this.tangent(p1, p2, X, Y);\n\n last(segments).controlOut(cp0);\n segments.push(new Segment(\n p2,\n this.secondControlPoint(tangent$2, p1, p2, X, Y)\n ));\n }\n\n return segments;\n },\n\n removeDuplicates: function(idx, points) {\n while (points[idx + 1] && (points[idx].equals(points[idx + 1]) || points[idx + 1].equals(points[idx + 2]))) {\n points.splice(idx + 1, 1);\n }\n },\n\n invertAxis: function(p0, p1, p2) {\n var invertAxis = false;\n\n if (p0.x === p1.x) {\n invertAxis = true;\n } else if (p1.x === p2.x) {\n if ((p1.y < p2.y && p0.y <= p1.y) || (p2.y < p1.y && p1.y <= p0.y)) {\n invertAxis = true;\n }\n } else {\n var fn = this.lineFunction(p0,p1);\n var y2 = this.calculateFunction(fn, p2.x);\n if (!(p0.y <= p1.y && p2.y <= y2) &&\n !(p1.y <= p0.y && p2.y >= y2)) {\n invertAxis = true;\n }\n }\n\n return invertAxis;\n },\n\n isLine: function(p0, p1, p2) {\n var fn = this.lineFunction(p0, p1);\n var y2 = this.calculateFunction(fn, p2.x);\n\n return (p0.x === p1.x && p1.x === p2.x) || round(y2, 1) === round(p2.y, 1);\n },\n\n lineFunction: function(p1, p2) {\n var a = (p2.y - p1.y) / (p2.x - p1.x);\n var b = p1.y - a * p1.x;\n\n return [ b, a ];\n },\n\n controlPoints: function(p0, p1, p2) {\n var xField = X;\n var yField = Y;\n var restrict = false;\n var switchOrientation = false;\n var tangent;\n\n if (this.isLine(p0, p1, p2)) {\n tangent = this.tangent(p0, p1, X, Y);\n } else {\n var monotonic = {\n x: this.isMonotonicByField(p0, p1, p2, X),\n y: this.isMonotonicByField(p0, p1, p2, Y)\n };\n\n if (monotonic.x && monotonic.y) {\n tangent = this.tangent(p0, p2, X, Y);\n restrict = true;\n } else {\n if (this.invertAxis(p0, p1, p2)) {\n xField = Y;\n yField = X;\n }\n\n if (monotonic[xField]) {\n tangent = 0;\n } else {\n var sign;\n if ((p2[yField] < p0[yField] && p0[yField] <= p1[yField]) ||\n (p0[yField] < p2[yField] && p1[yField] <= p0[yField])) {\n sign = numberSign((p2[yField] - p0[yField]) * (p1[xField] - p0[xField]));\n } else {\n sign = -numberSign((p2[xField] - p0[xField]) * (p1[yField] - p0[yField]));\n }\n\n tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\n switchOrientation = true;\n }\n }\n }\n\n var secondControlPoint = this.secondControlPoint(tangent, p0, p1, xField, yField);\n\n if (switchOrientation) {\n var oldXField = xField;\n xField = yField;\n yField = oldXField;\n }\n\n var firstControlPoint = this.firstControlPoint(tangent, p1, p2, xField, yField);\n\n if (restrict) {\n this.restrictControlPoint(p0, p1, secondControlPoint, tangent);\n this.restrictControlPoint(p1, p2, firstControlPoint, tangent);\n }\n\n return [ secondControlPoint, firstControlPoint ];\n },\n\n restrictControlPoint: function(p1, p2, cp, tangent) {\n if (p1.y < p2.y) {\n if (p2.y < cp.y) {\n cp.x = p1.x + (p2.y - p1.y) / tangent;\n cp.y = p2.y;\n } else if (cp.y < p1.y) {\n cp.x = p2.x - (p2.y - p1.y) / tangent;\n cp.y = p1.y;\n }\n } else {\n if (cp.y < p2.y) {\n cp.x = p1.x - (p1.y - p2.y) / tangent;\n cp.y = p2.y;\n } else if (p1.y < cp.y) {\n cp.x = p2.x + (p1.y - p2.y) / tangent;\n cp.y = p1.y;\n }\n }\n },\n\n tangent: function(p0, p1, xField, yField) {\n var x = p1[xField] - p0[xField];\n var y = p1[yField] - p0[yField];\n var tangent;\n\n if (x === 0) {\n tangent = 0;\n } else {\n tangent = y / x;\n }\n\n return tangent;\n },\n\n isMonotonicByField: function(p0, p1, p2, field) {\n return (p2[field] > p1[field] && p1[field] > p0[field]) ||\n (p2[field] < p1[field] && p1[field] < p0[field]);\n },\n\n firstControlPoint: function(tangent, p0, p3, xField, yField) {\n var t1 = p0[xField];\n var t2 = p3[xField];\n var distance = (t2 - t1) * WEIGHT;\n\n return this.point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\n },\n\n secondControlPoint: function(tangent, p0, p3, xField, yField) {\n var t1 = p0[xField];\n var t2 = p3[xField];\n var distance = (t2 - t1) * WEIGHT;\n\n return this.point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\n },\n\n point: function(xValue, yValue, xField, yField) {\n var controlPoint = new geometry.Point();\n controlPoint[xField] = xValue;\n controlPoint[yField] = yValue;\n\n return controlPoint;\n },\n\n calculateFunction: function(fn, x) {\n var length = fn.length;\n var result = 0;\n\n for (var i = 0; i < length; i++) {\n result += Math.pow(x,i) * fn[i];\n }\n return result;\n }\n });\n\n function numberSign(value) {\n return value <= 0 ? -1 : 1;\n }\n\n dataviz.Gradients = GRADIENTS;\n\n kendo.deepExtend(kendo.dataviz, {\n constants: constants,\n services: services,\n autoMajorUnit: autoMajorUnit,\n Point: Point,\n Box: Box,\n Ring: Ring,\n Sector: Sector,\n ShapeBuilder: ShapeBuilder,\n ShapeElement: ShapeElement,\n ChartElement: ChartElement,\n BoxElement: BoxElement,\n RootElement: RootElement,\n FloatElement: FloatElement,\n Text: Text,\n TextBox: TextBox,\n Title: Title,\n AxisLabel: AxisLabel,\n Axis: Axis,\n Note: Note,\n CategoryAxis: CategoryAxis,\n DateCategoryAxis: DateCategoryAxis,\n DateValueAxis: DateValueAxis,\n NumericAxis: NumericAxis,\n LogarithmicAxis: LogarithmicAxis,\n PolarAxis: PolarAxis,\n RadarCategoryAxis: RadarCategoryAxis,\n RadarNumericAxis: RadarNumericAxis,\n RadarLogarithmicAxis: RadarLogarithmicAxis,\n CurveProcessor: CurveProcessor,\n rectToBox: rectToBox,\n addClass: addClass,\n removeClass: removeClass,\n alignPathToPixel: alignPathToPixel,\n clockwise: clockwise,\n convertableToNumber: convertableToNumber,\n deepExtend: deepExtend,\n elementStyles: elementStyles,\n getSpacing: getSpacing,\n getTemplate: getTemplate,\n getter: __common_getter_js,\n grep: grep,\n hasClasses: hasClasses,\n HashMap: HashMap,\n inArray: inArray,\n interpolateValue: interpolateValue,\n InstanceObserver: InstanceObserver,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n isObject: isObject,\n isString: isString,\n map: map,\n mousewheelDelta: mousewheelDelta,\n FontLoader: FontLoader,\n setDefaultOptions: setDefaultOptions,\n sparseArrayLimits: sparseArrayLimits,\n styleValue: styleValue,\n find: find,\n elementScale: elementScale,\n autoTextColor: autoTextColor,\n createHashSet: createHashSet,\n defaultErrorHandler: defaultErrorHandler,\n keys: keys,\n append: append,\n bindEvents: bindEvents,\n Class: Class,\n defined: defined,\n deg: deg,\n elementOffset: elementOffset,\n elementSize: elementSize,\n eventCoordinates: eventCoordinates,\n eventElement: eventElement,\n hashKey: hashKey,\n last: last,\n limitValue: limitValue,\n logToConsole: kendo.logToConsole,\n objectKey: objectKey,\n rad: rad,\n round: round,\n unbindEvents: unbindEvents,\n valueOrDefault: valueOrDefault,\n absoluteDateDiff: absoluteDateDiff,\n addDuration: addDuration,\n addTicks: addTicks,\n ceilDate: ceilDate,\n dateComparer: dateComparer,\n dateDiff: dateDiff,\n dateEquals: dateEquals,\n dateIndex: dateIndex,\n duration: duration,\n floorDate: floorDate,\n lteDateIndex: lteDateIndex,\n startOfWeek: startOfWeek,\n toDate: toDate,\n parseDate: parseDate,\n parseDates: parseDates,\n toTime: toTime,\n firstDay: firstDay\n });\n\n })(window.kendo.jQuery);\n\n (function($) {\n\n var dataviz = kendo.dataviz;\n var services = dataviz.services;\n var draw = kendo.drawing;\n\n dataviz.SASS_THEMES = [\"sass\", \"default-v2\", \"bootstrap-v4\", \"material-v2\"];\n\n dataviz.ExportMixin = {\n extend: function(proto, skipLegacy) {\n if (!proto.exportVisual) {\n throw new Error(\"Mixin target has no exportVisual method defined.\");\n }\n\n proto.exportSVG = this.exportSVG;\n proto.exportImage = this.exportImage;\n proto.exportPDF = this.exportPDF;\n\n if (!skipLegacy) {\n proto.svg = this.svg;\n proto.imageDataURL = this.imageDataURL;\n }\n },\n\n exportSVG: function(options) {\n return draw.exportSVG(this.exportVisual(), options);\n },\n\n exportImage: function(options) {\n return draw.exportImage(this.exportVisual(options), options);\n },\n\n exportPDF: function(options) {\n return draw.exportPDF(this.exportVisual(), options);\n },\n\n svg: function() {\n if (draw.svg.Surface) {\n return draw.svg.exportGroup(this.exportVisual());\n } else {\n throw new Error(\"SVG Export failed. Unable to export instantiate kendo.drawing.svg.Surface\");\n }\n },\n\n imageDataURL: function() {\n if (!kendo.support.canvas) {\n return null;\n }\n\n if (draw.canvas.Surface) {\n var container = $(\"
\").css({\n display: \"none\",\n width: this.element.width(),\n height: this.element.height()\n }).appendTo(document.body);\n\n var surface = new draw.canvas.Surface(container[0]);\n surface.draw(this.exportVisual());\n var image = surface._rootElement.toDataURL();\n\n surface.destroy();\n container.remove();\n\n return image;\n } else {\n throw new Error(\"Image Export failed. Unable to export instantiate kendo.drawing.canvas.Surface\");\n }\n }\n };\n\n services.IntlService.register({\n format: function(format) {\n return kendo.format.apply(null, [format].concat(Array.prototype.slice.call(arguments, 1)));\n },\n toString: kendo.toString,\n parseDate: kendo.parseDate,\n firstDay: function() {\n return kendo.culture().calendars.standard.firstDay;\n }\n });\n\n services.TemplateService.register({\n compile: kendo.template\n });\n\n dataviz.Point2D = dataviz.Point;\n dataviz.Box2D = dataviz.Box;\n dataviz.mwDelta = function(e) {\n return dataviz.mousewheelDelta(e.originalEvent);\n };\n\n })(window.kendo.jQuery);\n\n var __meta__ = {\n id: \"dataviz.core\",\n name: \"Core\",\n description: \"The DataViz core functions\",\n category: \"dataviz\",\n depends: [ \"core\", \"drawing\" ],\n hidden: true\n };\n\n}));\n"]}