{"version":3,"file":"kendo.dataviz.core.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendodataviz","core","js","this","$","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","ARROW_UP","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","TAB","ARIA_ACTIVE_DESCENDANT","COORD_PRECISION","DEFAULT_HEIGHT","DEFAULT_WIDTH","END","ENTER","ESCAPE","HIGHLIGHT_ZINDEX","INHERIT","START","SQUARE","RECT","VALUE","DEFAULT_SERIES_OPACITY","POINTER","HORIZONTAL","VERTICAL","isArray","value","Array","addClass","element","classes","classArray","idx","length","className","indexOf","SPACE_REGEX","removeClass","replace","alignPathToPixel","path","offset","options","stroke","defined","width","i","segments","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","push","register","userImplementation","HashMap","_map","Map","inArray","prototype","get","key","set","TRIGGER","InstanceObserver","init","observer","handlers","handlerMap","trigger","name","args","isDefaultPrevented","callObserver","fnName","len","arguments","apply","requiresHandlers","names","isPlainObject","Object","toString","call","map","browser","ref","append","bindEvents","deg","elementOffset","elementSize","eventCoordinates","eventElement","hashKey","last","limitValue","objectKey","rad","unbindEvents","valueOrDefault","FontLoader","setDefaultOptions","type","proto","fetchFonts","fonts","state","depth","document","keys","forEach","loadFonts","promises","font","load","e","logToConsole","Promise","all","then","preloadFonts","KI_PREFFIX","KSVG_PREFFIX","HTMLBaseIcon","wrapper","addClasses","html","outerHTML","size","themeColor","flip","iconClass","stylingOptions","HTMLFontIcon","fn","currentIconClass","split","find","startsWith","icon","_className","HTMLSvgIcon","innerHTML","iconNameMatch","match","toUpperCase","svgIcons","setAttribute","svgElement","createElementNS","viewBox","appendChild","ICON_TYPES","svg","sparseArrayLimits","arr","min","max","isFinite","Math","undefined","Matrix","matrixRegexp","transformMatrix","getComputedStyle","unit","matrixString","members","parseFloat","Function","bind","concat","parseMatrix","autoTextColor","color","Color","isDark","DELETED","LegacySet","values","_index","_values","slice","filter","item","has","add","delete","index","clear","defineProperties","SetWrapper","_set","Set","from","Matrix$1","height","data","clone","m","row","col","line","each","f","includeEmpty","val","el","transpose","n","a","j","multiply","b","s","va","vb","inverse","augment","loop","k","imax","start","end","pos","v","argmax","tmp","returned","i$1","j$1","k$1","i$2","j$2","ret","STRING$1","FUNCTION","preventDefault","_defaultPrevented","Observable$$1","Class$$1","_events","__proto__","create","constructor","destroy","unbind","event","one","original","handler","that","eventNames","handlersIsFunction","eventName","first","eventName$1","unshift","eventArgs","events","sender","splice","_setEvents","this$1$1","autoMajorUnit","diff","abs","scale","pow","floor","log","relativeValue","Point","equals","point","rotate","center","degrees","theta","cosT","cos","sinT","sin","cx","cy","distanceTo","dx","dy","sqrt","onCircle","angle","radius","radians","Box","x1","y1","x2","y2","box","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","Sector","ShapeBuilder","createRing","arc","Arc","radiusX","radiusY","fromArc","close","innerEnd","pointAt","lineTo","ChartElement","children","initUserOptions","reflow","currentChild","animation","getRoot","parent","getSender","service","getService","chartService","translateChildren","childrenCount","arguments$1","renderVisual","visible","createVisual","addVisual","renderChildren","createAnimation","renderComplete","visual","chartElement","appendVisual","zIndex","Animation","childVisual","noclip","clipRoot","stackRoot","stackVisual","isStackRoot","visuals","sibling","insert","traverse","child","closest","matched","hasHighlight","highlight","createHighlight","toggleHighlight","show","opacity","customVisual","_highlight","highlightOptions","fill","highlightVisualArgs","series","dataItem","category","percentage","runningTotal","total","toggleFocusHighlight","accessibility","focusHighlight","_focusHighlight","highlightColor","background","focusHighlightOptions","border","createFocusHighlight","createGradientOverlay","gradientOptions","overlay","createGradient","closed","elements","supportsPointInactiveOpacity","BoxElement","margin","shrinkToFit","hasSetSize","borderWidth","reflowPaddingBox","vAlign","paddingBox","contentBox","hasBox","fromRect","visualStyle","dashType","cursor","ShapeElement","pointData","getElement","halfWidth","halfHeight","style","fromPoints","MultiPath","moveTo","rect","borderRadius","setCornerRadius","createElement","visualOptions","accessibilityOptions","role","ariaLabel","ariaRoleDescription","ariaChecked","RADIAL","GRADIENTS","glass","stops","sharpBevel","roundedBevel","roundedGlass","supportVML","sharpGlass","bubbleShadow","boxDiff","r","c","d","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","groupElementsSize","DrawingText","Text","measureText","baseline","paintOrder","topLeft","rectToBox","origin","bottomRight","ROWS_SPLIT_REGEX","TextBox","_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","childAlias","noteTemplate","auto","aliasFor","marker","wrapperBox","lineStart","linePoints","createLine","defaultVisual","over","out","current$1","parseDate","Date","firstDay","IntlService","implementation","FORMAT_REPLACE_REGEX","FormatService","intlService","_intlService","formatString","intl","localeAuto","locale","placeholderFormat","substring","current$2","ChartService","chart","rtl","Boolean","notify","isPannable","pannable","lock","DomEventsBuilder","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","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","getTime","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","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","limitedRangeIndices","minDelta","maxDelta","zoomRange","totalMin","totalMax","dataItems","hideOutOfRangeNotes","pan","pointsRange","diffStart","diffEnd","rangeMin","rangeMax","_categoriesMap","currentRangeIndices","totalCount","totalLimit","totalRangeIndices","indexCategories","map$$1","COORDINATE_LIMIT","DateLabelFormats","ZERO_THRESHOLD","BASE_UNITS","FIT","categoryRange","clearCache","_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","safeOptions","forecast","_forecast","before","after","divisionOptions","dataRangeOptions","divisionRange","rangeLabels","last$$1","isEmpty","totalLimits","panRange","datesRange","indicesRange","fit","autoBaseUnitStep","maxDiff","rangeDiff","baseUnitIndex","stepIndex","createRangeLabels","arrangeRangeLabels","position$1","autoRotateRangeLabels","hideOverlappingLabels","firstRangeLabel","clip","lastRangeLabel","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","userMajorUnit","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","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","convertableToNumber","cycleUp","cycleDown","cycleIndex","elementStyles","styles","stylesArray","field$1","getAriaTemplate","ariaTemplate","ariaContent","hasClasses","classNames","interpolateValue","progress","mousewheelDelta","wheelDelta","webkit","devicePixelRatio","detail","renderIcon","iconElement","iconOptions","HTMLElement","predicate","elementScale","parentElement","parentMatrix","multiplyCopy","createHashSet","supported","defaultErrorHandler","error","INSERT","DELETE","BACKSPACE","ESC","UP","DOWN","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","hasOwnProperty","obj","property","Observable","lteDateIndex","sortedDates","low","high","currentDate","jQuery","SASS_THEMES","ExportMixin","skipLegacy","exportVisual","exportSVG","exportImage","exportPDF","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 (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.core.js'), require('kendo.drawing.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.drawing'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendodataviz = global.kendodataviz || {}, global.kendodataviz.core = global.kendodataviz.core || {}, global.kendodataviz.core.js = factory()));\n})(this, (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, object-curly-spacing */\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 ARROW_UP = \"ArrowUp\";\n var ARROW_DOWN = \"ArrowDown\";\n var ARROW_LEFT = \"ArrowLeft\";\n var ARROW_RIGHT = \"ArrowRight\";\n var TAB = \"Tab\";\n var ARIA_ACTIVE_DESCENDANT = \"aria-activedescendant\";\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 ENTER = \"Enter\";\n var ESCAPE = \"Escape\";\n var FORMAT_REGEX = /\\{\\d+:?/;\n var HEIGHT = \"height\";\n var HIGHLIGHT_ZINDEX = 100;\n var INSIDE = \"inside\";\n var INHERIT = \"inherit\";\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 SQUARE = \"square\";\n var RECT = \"rect\";\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 var POINTER = \"pointer\";\n var HORIZONTAL = \"horizontal\";\n var VERTICAL = \"vertical\";\n\n var constants = {\n \tARC: ARC,\n \tARROW_UP: ARROW_UP,\n \tARROW_DOWN: ARROW_DOWN,\n \tARROW_LEFT: ARROW_LEFT,\n \tARROW_RIGHT: ARROW_RIGHT,\n \tTAB: TAB,\n \tARIA_ACTIVE_DESCENDANT: ARIA_ACTIVE_DESCENDANT,\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 \tENTER: ENTER,\n \tESCAPE: ESCAPE,\n \tFORMAT_REGEX: FORMAT_REGEX,\n \tHEIGHT: HEIGHT,\n \tHIGHLIGHT_ZINDEX: HIGHLIGHT_ZINDEX,\n \tINSIDE: INSIDE,\n \tINHERIT: INHERIT,\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 \tSQUARE: SQUARE,\n \tRECT: RECT,\n \tVALUE: VALUE,\n \tWHITE: WHITE,\n \tWIDTH: WIDTH,\n \tX: X,\n \tY: Y,\n \tDEFAULT_SERIES_OPACITY: DEFAULT_SERIES_OPACITY,\n \tPOINTER: POINTER,\n \tHORIZONTAL: HORIZONTAL,\n \tVERTICAL: VERTICAL\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 cycleUp(index, count) {\n return (index + 1) % count;\n }\n\n function cycleDown(index, count) {\n var result = index - 1;\n\n return result < 0 ? count - 1 : result;\n }\n\n function cycleIndex(index, length) {\n if (length === 1 || (index % length) === 0) {\n return 0;\n }\n\n if (index < 0) {\n return length + (index % length);\n } else if (index >= length) {\n return index % length;\n }\n\n return index;\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, options) {\n return current.compile(template, options);\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 getTemplate$1(options) {\n if (options === void 0) { options = {}; }\n\n var ariaTemplate;\n if (options.ariaTemplate) {\n options.ariaTemplate = ariaTemplate = TemplateService.compile(options.ariaTemplate);\n } else if (isFunction(options.ariaContent)) {\n ariaTemplate = options.ariaContent;\n }\n\n return ariaTemplate;\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 && element.className.indexOf(names[idx]) !== -1) {\n return true;\n }\n }\n }\n }\n\n // TODO: Remove and replace with Map/WeakMap.\n var HashMap = function HashMap() {\n this._map = new Map();\n };\n\n HashMap.prototype.get = function get (key) {\n return this._map.get(key);\n };\n\n HashMap.prototype.set = function set (key, value) {\n this._map.set(key, value);\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 args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ 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 isPlainObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\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 var KICON = 'k-icon';\n var KI_PREFFIX = 'k-i-';\n var KFONTICON = 'k-font-icon';\n var KSVGICON = 'k-svg-icon';\n var KSVG_PREFFIX = 'k-svg-i-';\n\n var HTMLBaseIcon = Class.extend({\n init: function(element, options) {\n this.element = element;\n this.options = deepExtend({}, this.options, options);\n\n this.wrapper();\n },\n\n wrapper: function() {\n this.addClasses();\n },\n\n addClasses: function() {\n },\n\n html: function() {\n return this.element.outerHTML;\n }\n });\n\n setDefaultOptions(HTMLBaseIcon, {\n name: '',\n size: 'none',\n themeColor: 'none',\n flip: 'default',\n iconClass: '',\n stylingOptions: [ 'size', 'themeColor', 'fill' ]\n });\n\n var HTMLFontIcon = HTMLBaseIcon.extend({\n init: function(element, options) {\n HTMLBaseIcon.fn.init.call(this, element, options);\n },\n\n wrapper: function() {\n // Find if there is an existing k-i- class appended to the element.\n var currentIconClass = this.element.className.split(\" \").find(function (x) { return x.startsWith(KI_PREFFIX); });\n var className = this.options.icon ? (\"\" + (this.options.icon.startsWith(KI_PREFFIX) ? \"\" : KI_PREFFIX) + (this.options.icon)) : \"\";\n\n this._className = className;\n\n addClass(this.element, KICON);\n addClass(this.element, KFONTICON);\n removeClass(this.element, currentIconClass); // Remove any existing icons.\n addClass(this.element, className);\n addClass(this.element, this.options.iconClass || '');\n\n HTMLBaseIcon.fn.wrapper.call(this);\n }\n });\n\n setDefaultOptions(HTMLFontIcon, {\n name: 'HTMLFontIcon',\n icon: null\n });\n\n var HTMLSvgIcon = HTMLBaseIcon.extend({\n init: function(element, options) {\n // Ensure that the inner contents of the wrapping span element are always removed for re-rendering purposes.\n element.innerHTML = \"\";\n\n HTMLBaseIcon.fn.init.call(this, element, options);\n },\n\n wrapper: function() {\n var icon = this.options.icon;\n var iconClass = this.options.iconClass;\n var currentIconClass = this.element.className.split(\" \").find(function (x) { return x.startsWith(KSVG_PREFFIX); });\n\n if (!icon && iconClass) {\n // match k-i-(some-icon-name)\n var regex = /k-i-(\\w+(?:-\\w+)*)/;\n var iconNameMatch = iconClass.match(regex);\n if (iconNameMatch) {\n icon = iconNameMatch[1];\n iconClass = iconClass.replace(iconNameMatch[0], \"\");\n }\n }\n\n if (isString(icon)) {\n icon = icon.replace(\"k-i-\", \"\").replace(/-./g, function (x) { return x[1].toUpperCase(); });\n icon = this.options.svgIcons[icon] || this.options.svgIcons[(icon + \"Icon\")];\n }\n\n var className = icon && icon.name ? (\"\" + KSVG_PREFFIX + (icon.name)) : \"\";\n this._className = className;\n\n addClass(this.element, KSVGICON);\n removeClass(this.element, currentIconClass);\n addClass(this.element, className);\n addClass(this.element, iconClass || \"\");\n this.element.setAttribute(\"aria-hidden\", \"true\");\n\n if (icon && isPlainObject(icon)) {\n var svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svgElement.setAttribute(\"viewBox\", icon.viewBox || \"\");\n svgElement.setAttribute(\"focusable\", \"false\");\n svgElement.innerHTML = icon.content || \"\";\n\n this.element.appendChild(svgElement);\n }\n\n HTMLBaseIcon.fn.wrapper.call(this);\n }\n });\n\n setDefaultOptions(HTMLSvgIcon, {\n name: 'HTMLSvgIcon',\n icon: null,\n svgIcons: {}\n });\n\n var ICON_TYPES = {\n 'svg': HTMLSvgIcon,\n 'font': HTMLFontIcon\n };\n\n function renderIcon(iconElement, iconOptions) {\n var element = iconElement;\n var options = iconOptions;\n\n if (!element\n || (isObject(element) && !(element instanceof HTMLElement))\n || isString(element)) {\n options = element;\n element = document.createElement(\"span\");\n }\n\n if (isString(options)) {\n options = {\n icon: options\n };\n }\n\n if (!options.type) {\n options.type = 'svg';\n }\n\n if (!ICON_TYPES[options.type]) {\n return null;\n }\n\n return (new ICON_TYPES[options.type](element, options).html());\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 hasOwnProperty(obj, property) {\n return Object.prototype.hasOwnProperty.call(obj, property);\n }\n\n // Based on the implementation from kendo-spreadsheet-common/src/calc.js\n var Matrix$1 = Class.extend({\n init: function() {\n this.height = 0;\n this.width = 0;\n this.data = [];\n },\n\n clone: function() {\n var m = new Matrix$1();\n m.height = this.height;\n m.width = this.width;\n m.data = this.data.map(function (row) { return row.slice(); });\n return m;\n },\n\n get: function(row, col) {\n var line = this.data[row];\n var val = line ? line[col] : null;\n return val;\n },\n\n set: function(row, col, data) {\n var line = this.data[row];\n if (line == null) {\n line = this.data[row] = [];\n }\n line[col] = data;\n if (row >= this.height) {\n this.height = row + 1;\n }\n if (col >= this.width) {\n this.width = col + 1;\n }\n },\n\n each: function(f, includeEmpty) {\n var this$1$1 = this;\n\n for (var row = 0; row < this.height; ++row) {\n for (var col = 0; col < this.width; ++col) {\n var val = this$1$1.get(row, col);\n if (includeEmpty || val != null) {\n val = f(val, row, col);\n if (val !== undefined) {\n return val;\n }\n }\n }\n }\n },\n\n map: function(f, includeEmpty) {\n var m = new Matrix$1();\n this.each(function(el, row, col) {\n m.set(row, col, f(el, row, col));\n }, includeEmpty);\n return m;\n },\n\n transpose: function() {\n var m = new Matrix$1();\n this.each(function(el, row, col) {\n m.set(col, row, el);\n });\n return m;\n },\n\n unit: function(n) {\n this.width = this.height = n;\n var a = this.data = new Array(n);\n for (var i = n; --i >= 0;) {\n var row = a[i] = new Array(n);\n for (var j = n; --j >= 0;) {\n row[j] = i === j ? 1 : 0;\n }\n }\n return this;\n },\n\n multiply: function(b) {\n var a = this;\n var m = new Matrix$1();\n for (var row = 0; row < a.height; ++row) {\n for (var col = 0; col < b.width; ++col) {\n var s = 0;\n for (var i = 0; i < a.width; ++i) {\n var va = a.get(row, i);\n var vb = b.get(i, col);\n if (typeof va === \"number\" && typeof vb === \"number\") {\n s += va * vb;\n }\n }\n m.set(row, col, s);\n }\n }\n return m;\n },\n\n inverse: function() {\n var n = this.width;\n var m = this.augment(new Matrix$1().unit(n));\n var a = m.data;\n\n // Gaussian elimination\n // https://en.wikipedia.org/wiki/Gaussian_elimination#Finding_the_inverse_of_a_matrix\n\n // 1. Get zeros below main diagonal\n var loop = function ( k ) {\n var imax = argmax(k, n, function(i) { return a[i][k]; });\n if (!a[imax][k]) {\n return { v: null }; // singular matrix\n }\n if (k !== imax) {\n var tmp = a[k];\n a[k] = a[imax];\n a[imax] = tmp;\n }\n for (var i = k + 1; i < n; ++i) {\n for (var j = k + 1; j < 2 * n; ++j) {\n a[i][j] -= a[k][j] * a[i][k] / a[k][k];\n }\n a[i][k] = 0;\n }\n };\n\n for (var k = 0; k < n; ++k) {\n var returned = loop( k );\n\n if ( returned ) return returned.v;\n }\n\n // 2. Get 1-s on main diagonal, dividing by pivot\n for (var i$1 = 0; i$1 < n; ++i$1) {\n for (var f = a[i$1][i$1], j$1 = 0; j$1 < 2 * n; ++j$1) {\n a[i$1][j$1] /= f;\n }\n }\n\n // 3. Get zeros above main diagonal. Actually, we only care to compute the right side\n // here (that will be the inverse), so in the inner loop below we go while j >= n,\n // instead of j >= k.\n for (var k$1 = n; --k$1 >= 0;) {\n for (var i$2 = k$1; --i$2 >= 0;) {\n if (a[i$2][k$1]) {\n for (var j$2 = 2 * n; --j$2 >= n;) {\n a[i$2][j$2] -= a[k$1][j$2] * a[i$2][k$1];\n }\n }\n }\n }\n\n return m.slice(0, n, n, n);\n },\n\n augment: function(m) {\n var ret = this.clone();\n var n = ret.width;\n m.each(function(val, row, col) {\n ret.set(row, col + n, val);\n });\n return ret;\n },\n\n slice: function(row, col, height, width) {\n var this$1$1 = this;\n\n var m = new Matrix$1();\n for (var i = 0; i < height; ++i) {\n for (var j = 0; j < width; ++j) {\n m.set(i, j, this$1$1.get(row + i, col + j));\n }\n }\n return m;\n }\n });\n\n function argmax(start, end, f) {\n var max = f(start), pos = start;\n for (var i = start + 1; i < end; i++) {\n var v = f(start);\n if (v > max) {\n max = v;\n pos = start;\n }\n }\n return pos;\n }\n\n var STRING$1 = \"string\";\n var FUNCTION = \"function\";\n\n var preventDefault = function() {\n this._defaultPrevented = true;\n };\n\n var isDefaultPrevented = function() {\n return this._defaultPrevented === true;\n };\n\n var Observable$$1 = (function (Class$$1) {\n function Observable$$1() {\n Class$$1.call(this);\n this._events = {};\n }\n\n if ( Class$$1 ) Observable$$1.__proto__ = Class$$1;\n Observable$$1.prototype = Object.create( Class$$1 && Class$$1.prototype );\n Observable$$1.prototype.constructor = Observable$$1;\n\n Observable$$1.prototype.destroy = function destroy () {\n this.unbind();\n };\n\n Observable$$1.prototype.bind = function bind (event, handlers, one) {\n var that = this,\n idx,\n eventNames = typeof event === STRING$1 ? [event] : event || [],\n length,\n original,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n if (handlers === undefined) {\n for (idx in event) {\n that.bind(idx, event[idx]);\n }\n\n return that;\n }\n\n /* eslint-disable no-loop-func */\n var loop = function ( ) {\n var eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n if (one) {\n original = handler;\n handler = function() {\n that.unbind(eventName, handler);\n original.apply(that, arguments);\n };\n\n handler.original = original;\n }\n\n events = that._events[eventName] = that._events[eventName] || [];\n events.push(handler);\n }\n };\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) loop( );\n /* eslint-enable no-loop-func */\n\n return that;\n };\n\n Observable$$1.prototype.one = function one (eventNames, handlers) {\n return this.bind(eventNames, handlers, true);\n };\n\n Observable$$1.prototype.first = function first (eventName, handlers) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING$1 ? [eventName] : eventName,\n length,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n var eventName$1 = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName$1];\n\n if (handler) {\n events = that._events[eventName$1] = that._events[eventName$1] || [];\n events.unshift(handler);\n }\n }\n\n return that;\n };\n\n Observable$$1.prototype.trigger = function trigger (eventName, eventArgs) {\n var that = this,\n events = that._events[eventName],\n idx,\n length;\n\n if (events) {\n var e = eventArgs || {};\n\n e.sender = that;\n\n e._defaultPrevented = false;\n\n e.preventDefault = preventDefault;\n\n e.isDefaultPrevented = isDefaultPrevented;\n\n events = events.slice();\n\n for (idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(that, e);\n }\n\n return e._defaultPrevented === true;\n }\n\n return false;\n };\n\n Observable$$1.prototype.unbind = function unbind (eventName, handler) {\n var that = this,\n events = that._events[eventName],\n idx;\n\n if (eventName === undefined) {\n that._events = {};\n } else if (events) {\n if (handler) {\n for (idx = events.length - 1; idx >= 0; idx--) {\n if (events[idx] === handler || events[idx].original === handler) {\n events.splice(idx, 1);\n }\n }\n } else {\n that._events[eventName] = [];\n }\n }\n\n return that;\n };\n\n Observable$$1.prototype._setEvents = function _setEvents (options) {\n var this$1$1 = this;\n\n var length = (this.events || []).length;\n\n for (var idx = 0; idx < length; idx ++) {\n var e = this$1$1.events[idx];\n\n if (this$1$1.options[e] && options[e]) {\n this$1$1.unbind(e, this$1$1.options[e]);\n\n if (this$1$1._events && this$1$1._events[e]) {\n delete this$1$1._events[e];\n }\n }\n }\n\n this.bind(this.events, options);\n };\n\n return Observable$$1;\n }(Class));\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 || 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) || this.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 toggleFocusHighlight: function(show) {\n var options = ((this.options || {}).accessibility || {}).highlight || {};\n var focusHighlight = this._focusHighlight;\n\n if (!show && !focusHighlight) {\n return;\n }\n\n if (!focusHighlight) {\n var rootBackground = this.getRoot().options.background;\n var highlightColor = autoTextColor(rootBackground);\n var focusHighlightOptions = {\n fill: {\n opacity: options.opacity,\n color: options.color\n },\n stroke: $.extend({}, {color: highlightColor}, options.border),\n zIndex: options.zIndex\n };\n\n focusHighlight = this._focusHighlight = this.createFocusHighlight(focusHighlightOptions);\n\n this.appendVisual(focusHighlight);\n }\n\n focusHighlight.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 function addAccessibilityAttributesToVisual(visual, accessibilityOptions) {\n if (accessibilityOptions) {\n visual.options.className = accessibilityOptions.className;\n visual.options.role = accessibilityOptions.role;\n visual.options.ariaLabel = accessibilityOptions.ariaLabel;\n visual.options.ariaRoleDescription = accessibilityOptions.ariaRoleDescription;\n visual.options.ariaChecked = accessibilityOptions.ariaChecked;\n }\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 addAccessibilityAttributesToVisual(this.visual, this.options.accessibilityOptions);\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 var stroke = ref.stroke;\n var paintOrder = ref.paintOrder;\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 stroke: stroke,\n paintOrder: paintOrder\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 // eslint-disable-next-line no-useless-escape\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 values = [], len = arguments.length - 1;\n while ( len-- > 0 ) values[ len ] = arguments[ 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 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.limitedRangeIndices();\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.limitedRangeIndices(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.limitedRangeIndices();\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.limitedRangeIndices(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.limitedRangeIndices(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 limitedRangeIndices: function(totalLimit) {\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 (totalLimit) {\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 totalRangeIndices: function() {\n return {\n min: 0,\n max: this.totalRange().max || 1\n };\n },\n\n indexCategories: 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, clearCache) {\n if (clearCache) {\n categories._range = undefined;\n }\n\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 = Math.abs(absoluteDateDiff(category, lastCategory));\n\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, true);\n var maxDivisions = options.maxDivisions;\n var safeOptions = initUnit(options);\n\n var forecast = options._forecast;\n if (forecast) {\n if (forecast.before > 0) {\n range.min = addDuration(range.min, -forecast.before, safeOptions.baseUnit, safeOptions.weekStartDay);\n }\n\n if (forecast.after > 0) {\n range.max = addDuration(range.max, forecast.after, safeOptions.baseUnit, safeOptions.weekStartDay);\n }\n }\n\n this.dataRange = new DateRange(range.min, range.max, safeOptions);\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 totalRangeIndices: function() {\n var range = this.dataRange.total();\n return {\n min: this.dataRange.totalIndex(range.min),\n max: this.dataRange.totalIndex(range.max)\n };\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: false\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 cycleUp: cycleUp,\n cycleDown: cycleDown,\n cycleIndex: cycleIndex,\n deepExtend: deepExtend,\n elementStyles: elementStyles,\n getSpacing: getSpacing,\n getTemplate: getTemplate,\n getAriaTemplate: getTemplate$1,\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 isPlainObject: isPlainObject,\n isString: isString,\n map: map,\n mousewheelDelta: mousewheelDelta,\n FontLoader: FontLoader,\n renderIcon: renderIcon,\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 hasOwnProperty: hasOwnProperty,\n Matrix: Matrix$1,\n Observable: Observable$$1,\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 var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}